/// <summary> /// 没有任何作业时,如果缓存位被占用,则强制回挪, /// TV分配,挪移车位分配 /// </summary> /// <param name="frlct"></param> /// <param name="tolct"></param> /// <returns></returns> public Device PPYAllocateTvOfTransfer(Location frlct, out Location tolct) { tolct = null; CWLocation cwlctn = new CWLocation(); CWICCard cwiccd = new CWICCard(); List <Location> allLocLst = cwlctn.FindLocList(); var query = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && loc.Region == frlct.Region && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null && loc.NeedBackup == 0 && compareSize(loc.LocSize, frlct.LocSize) >= 0 orderby Math.Abs(frlct.LocColumn - loc.LocColumn) select loc; List <Location> lctnLst = query.ToList(); if (lctnLst.Count > 0) { tolct = lctnLst.FirstOrDefault(); Device tv = new CWDevice().Find(d => d.Region == frlct.Region); return(tv); } return(null); }
public void AddFaultRecord(List <Alarm> alarmLst) { for (int i = 0; i < alarmLst.Count; i++) { Alarm ar = alarmLst[i]; Device smg = new CWDevice().Find(d => d.Warehouse == ar.Warehouse && d.DeviceCode == ar.DeviceCode); if (smg != null) { FaultLog log = new FaultLog { Warehouse = smg.Warehouse, DeviceCode = smg.DeviceCode, RunStep = smg.RunStep, InStep = smg.InStep, OutStep = smg.OutStep, Description = ar.Description, CreateDate = DateTime.Now }; manager.Add(log); } } }
/// <summary> /// 挪移时车位选择 /// </summary> /// <param name="frlct"></param> /// <param name="tolct"></param> /// <returns></returns> public Device TransportToAllocateTV(Location frlct, Location tolct) { CWDevice cwdevice = new CWDevice(); List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); if (nEtvList.Count > 0) { List <Device> orderbyLst = nEtvList.OrderBy(d => Math.Abs(d.Region - frlct.Region)).ToList(); foreach (Device dev in orderbyLst) { CScope scope = workscope.GetEtvScope(dev); if (scope.LeftCol <= frlct.LocColumn && frlct.LocColumn <= scope.RightCol) { if (scope.LeftCol <= tolct.LocColumn && tolct.LocColumn <= scope.RightCol) { return(dev); } } } } return(null); }
/// <summary> /// 分配车位: /// 1、优先分配中间区域的车位 /// 2、判断ETV可达,车厅可达 /// </summary> /// <param name="checkcode"></param> /// <returns></returns> public Location AllocateLoc(string checkcode) { //优先分配中间区域的车位 int middlecolmn = 9; CWLocation cwlctn = new CWLocation(); CWDevice cwdevice = new CWDevice(); CWTask cwtask = new CWTask(); CWICCard cwiccd = new CWICCard(); #region 依距车厅的远近找出所有车位的集合 List <Location> allLocLst = cwlctn.FindLocList(); List <Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP); //排除固定车位 List <Location> suitLocsLst = allLocLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false); List <Location> sameLctnLst = new List <Location>(); var locList_small = from loc in suitLocsLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && string.Compare(loc.LocSize, checkcode) == 0 orderby loc.LocSide ascending, Math.Abs(loc.LocColumn - middlecolmn) ascending select loc; var locList_big = from loc in suitLocsLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && string.Compare(loc.LocSize, checkcode) > 0 orderby loc.LocSide ascending, Math.Abs(loc.LocColumn - middlecolmn) ascending select loc; sameLctnLst.AddRange(locList_small); sameLctnLst.AddRange(locList_big); List <Location> lctnLst = new List <Location>(); #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的 List <Location> spaceLctnLst = new List <Location>(); List <Location> occupyLctnLst = new List <Location>(); List <Location> otherLctnLst = new List <Location>(); foreach (Location loc in sameLctnLst) { if (loc.LocSide == 4) { #region 判断前面车位状态 string fwdAddrs = "2" + loc.Address.Substring(1); Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs); if (forward != null) { if (forward.Type == EnmLocationType.Normal) { if (forward.Status == EnmLocationStatus.Space) { spaceLctnLst.Add(loc); } else if (forward.Status == EnmLocationStatus.Occupy) { occupyLctnLst.Add(loc); } else { otherLctnLst.Add(loc); } } } #endregion } else if (loc.LocSide == 2) { #region 判断后面车位状态 string bckAddrs = "4" + loc.Address.Substring(1); Location back = cwlctn.FindLocation(l => l.Address == bckAddrs); if (back != null) { if (back.Type == EnmLocationType.Normal) { if (back.Status == EnmLocationStatus.Space) { spaceLctnLst.Add(loc); } else if (back.Status == EnmLocationStatus.Occupy) { occupyLctnLst.Add(loc); } else { otherLctnLst.Add(loc); } } else //禁用的 { spaceLctnLst.Add(loc); } } #endregion } else { spaceLctnLst.Add(loc); } } lctnLst.AddRange(spaceLctnLst); lctnLst.AddRange(occupyLctnLst); lctnLst.AddRange(otherLctnLst); #endregion if (lctnLst.Count == 0) { return(null); } List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); List <Device> availHallLst = cwdevice.FindList(d => d.Type == EnmSMGType.Hall && d.Mode == EnmModel.Automatic); List <Device> availEtvLst = nEtvList.FindAll(d => d.Mode == EnmModel.Automatic); if (availEtvLst.Count == 0 || availHallLst.Count == 0) { return(null); } if (availEtvLst.Count == 2 && availHallLst.Count == 2) { return(lctnLst.FirstOrDefault()); } if (availEtvLst.Count == 1) { CScope scope = workscope.GetEtvScope(availEtvLst[0]); if (availHallLst.Count == 2) { foreach (Location loc in lctnLst) { if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol) { return(loc); } } } else { Device hall = availHallLst[0]; int hallcolmn = Convert.ToInt32(hall.Address.Substring(1, 2)); if (hallcolmn >= scope.LeftCol && hallcolmn <= scope.RightCol) { foreach (Location loc in lctnLst) { if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol) { return(loc); } } } } } #endregion return(null); }
/// <summary> /// 查询临时用户费用 /// </summary> public Response GetTempUserInfo(string iccode, bool isPlate) { Log log = LogFactory.GetLogger("CWTariff.GetTempUserInfo"); Response resp = new Response(); CWICCard cwiccd = new CWICCard(); CWLocation cwlctn = new CWLocation(); try { Location loc = null; TempUserInfo info = new TempUserInfo(); #region 暂不用 //if (!isPlate) //{ // #region // ICCard iccd = cwiccd.Find(ic=>ic.UserCode==iccode); // if (iccd == null) // { // resp.Message = "不是本系统卡!"; // return resp; // } // if (iccd.CustID != 0) // { // Customer cust = cwiccd.FindCust(iccd.CustID); // if (cust != null) // { // if (cust.Type != EnmICCardType.Temp) // { // resp.Message = "该用户不是临时用户!"; // return resp; // } // } // } // loc = cwlctn.FindLocation(lc=>lc.ICCode==iccode); // if (loc == null) // { // resp.Message = "当前卡号没有存车!"; // return resp; // } // #endregion //} //else //{ // #region // loc = cwlctn.FindLocation(l=>l.PlateNum==iccode); // if (loc == null) // { // resp.Message = "当前输入车牌没有存车!"; // return resp; // } // string proof = loc.ICCode; // Customer cust = null; // #region // if (Convert.ToInt32(proof) >= 10000) //是指纹激活的 // { // int sno = Convert.ToInt32(proof); // FingerPrint print = new CWFingerPrint().Find(p => p.SN_Number == sno); // if (print == null) // { // //上位控制系统故障 // resp.Message = "找不到注册指纹,系统异常!"; // return resp; // } // cust = new CWICCard().FindCust(print.CustID); // if (cust == null) // { // //上位控制系统故障 // resp.Message = "指纹没有绑定用户,系统异常!"; // return resp; // } // } // else // { // ICCard iccd = new CWICCard().Find(ic => ic.UserCode == proof); // if (iccd == null) // { // //上位控制系统故障 // resp.Message = "上位控制系统异常,找不到卡号!"; // return resp; // } // if (iccd.CustID != 0) // { // cust = new CWICCard().FindCust(iccd.CustID); // } // } // #endregion // if (cust != null) // { // if (cust.Type != EnmICCardType.Temp) // { // resp.Message = "该用户不是临时用户!"; // return resp; // } // } // #endregion //} #endregion if (isPlate) { //是车牌 loc = cwlctn.FindLocation(l => l.PlateNum == iccode); } else { loc = cwlctn.FindLocation(l => l.ICCode == iccode); } if (loc == null) { resp.Message = "当前车牌没有存车!Proof - " + iccode; return(resp); } int sno = Convert.ToInt32(loc.ICCode); SaveCertificate scert = new CWSaveProof().Find(s => s.SNO == sno); if (scert != null) { Customer cust = new CWICCard().FindCust(scert.CustID); if (cust != null) { if (cust.Type != EnmICCardType.Temp) { resp.Message = "该用户不是临时用户!"; return(resp); } } } CWTask cwtask = new CWTask(); ImplementTask itask = cwtask.FindITask(tk => tk.ICCardCode == loc.ICCode && tk.IsComplete == 0); if (itask != null) { resp.Message = "正在作业,无法查询!"; return(resp); } WorkTask queue = cwtask.FindQueue(q => q.ICCardCode == loc.ICCode); if (queue != null) { resp.Message = "已经加入取车队列,无法查询!"; return(resp); } info.CCode = iccode; info.InDate = loc.InDate.ToString(); info.OutDate = DateTime.Now.ToString(); TimeSpan span = DateTime.Now - loc.InDate; info.SpanTime = (span.Days > 0 ? span.Days + "天" : " ") + (span.Hours > 0 ? span.Hours + "小时" : " ") + (span.Minutes >= 0 ? span.Minutes + "分" : " ") + (span.Seconds >= 0 ? span.Seconds + "秒" : " "); float fee = 0; resp = this.CalculateTempFee(loc.InDate, DateTime.Now, out fee); if (resp.Code == 0) { return(resp); } info.NeedFee = fee.ToString(); info.Warehouse = loc.Warehouse; int hallID = new CWDevice().AllocateHall(loc, false); info.HallID = hallID; resp.Code = 1; resp.Message = "查询成功"; resp.Data = info; } catch (Exception ex) { log.Error(ex.ToString()); } return(resp); }
/// <summary> /// 依ETV作业范围,找出符合尺寸的车位 /// 如果是重列车位,则前面的车位,一定是空闲的 /// </summary> /// <param name="etv"></param> /// <returns></returns> public Location AllocateLocOfEtvScope(Device etv, string checkcode) { CWLocation cwlctn = new CWLocation(); CWDevice cwdevice = new CWDevice(); CWTask cwtask = new CWTask(); CWICCard cwiccd = new CWICCard(); List<Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); CScope scope = workscope.GetEtvScope(etv); int etvColmn = Convert.ToInt32(etv.Address.Substring(1, 2)); List<Location> allLocsLst = cwlctn.FindLocList(); List<Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP); //排除固定车位 List<Location> suitLocsLst = allLocsLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false); var queryLstsmall = from loc in suitLocsLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkcode) == 1 && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null orderby Math.Abs(loc.LocColumn - etvColmn) ascending, loc.LocSide ascending select loc; List<Location> priorLocsLst = new List<Location>(); List<Location> nextLocsLst = new List<Location>(); foreach (Location loc in queryLstsmall) { if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol) { #region if (loc.LocSide == 2) { #region 如果后边的车位在作业,则最后分配 string bckAddrs = "4" + loc.Address.Substring(1); Location back = cwlctn.FindLocation(l => l.Address == bckAddrs); if (back != null) { if (back.Type == EnmLocationType.Normal) { if (back.Status == EnmLocationStatus.Space) { priorLocsLst.Add(loc); } else { nextLocsLst.Add(loc); } } else if (back.Type == EnmLocationType.Disable) { priorLocsLst.Add(loc); } } #endregion } else if (loc.LocSide == 4) { #region 如果是重列,则前面的车位一定是空闲的 string fwdAddrs = "2" + loc.Address.Substring(1); Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs); if (forward != null) { if (forward.Type == EnmLocationType.Normal && forward.Status == EnmLocationStatus.Space) { priorLocsLst.Add(loc); } } #endregion } else if (loc.LocSide == 1) { priorLocsLst.Add(loc); } #endregion } } if (priorLocsLst.Count > 0) { return priorLocsLst[0]; } if (nextLocsLst.Count > 0) { return nextLocsLst[0]; } var queryLstbig = from loc in suitLocsLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkcode) > 1 && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null orderby Math.Abs(loc.LocColumn - etvColmn) ascending, loc.LocSide ascending select loc; List<Location> priorLocsLstbig = new List<Location>(); List<Location> nextLocsLstbig = new List<Location>(); foreach (Location loc in queryLstbig) { if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol) { #region if (loc.LocSide == 2) { #region 如果后边的车位在作业,则最后分配 string bckAddrs = "4" + loc.Address.Substring(1); Location back = cwlctn.FindLocation(l => l.Address == bckAddrs); if (back != null) { if (back.Type == EnmLocationType.Normal) { if (back.Status == EnmLocationStatus.Space) { priorLocsLstbig.Add(loc); } else { nextLocsLstbig.Add(loc); } } else if (back.Type == EnmLocationType.Disable) { priorLocsLstbig.Add(loc); } } #endregion } else if (loc.LocSide == 4) { #region 如果是重列,则前面的车位一定是空闲的 string fwdAddrs = "2" + loc.Address.Substring(1); Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs); if (forward != null) { if (forward.Type == EnmLocationType.Normal && forward.Status == EnmLocationStatus.Space) { priorLocsLstbig.Add(loc); } } #endregion } else if (loc.LocSide == 1) { priorLocsLstbig.Add(loc); } #endregion } } if (priorLocsLstbig.Count > 0) { return priorLocsLstbig[0]; } if (nextLocsLstbig.Count > 0) { return nextLocsLstbig[0]; } return null; }
/// <summary> /// 固定车位时,ETV分配 /// </summary> /// <param name="hall">存车车厅</param> /// <param name="loc">目的车位</param> /// <returns></returns> public Device PXDAllocateEtvOfFixLoc(Device hall, Location loc) { CWDevice cwdevice = new CWDevice(); CWTask cwtask = new CWTask(); List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); int hallColmn = Convert.ToInt32(hall.Address.Substring(1, 2)); int locColmn = loc.LocColumn; List <Device> availableLst = new List <Device>(); #region 可达车厅、可达车位、可用的ETV集合 foreach (Device dev in nEtvList) { if (dev.IsAble == 1) { CScope scope = workscope.GetEtvScope(dev); if (scope.LeftCol <= hallColmn && hallColmn <= scope.RightCol) { if (scope.LeftCol <= locColmn && locColmn <= scope.RightCol) { availableLst.Add(dev); } } } } #endregion if (availableLst.Count == 1) { return(availableLst[0]); } else if (availableLst.Count == 2) { List <Device> freeLst = availableLst.FindAll(d => d.TaskID == 0); if (freeLst.Count == 1) { Device dev = freeLst[0]; if (dev.Region == hall.Region) { return(dev); } Device other = availableLst.FirstOrDefault(d => d.TaskID != 0); if (other != null) { #region 另一ETV在忙,判断当前闲的ETV,是否可达车厅来装载,如果可以,则允许下发 ImplementTask task = cwtask.Find(other.TaskID); if (task != null) { string toAddrs = ""; if (task.Status == EnmTaskStatus.TWaitforLoad || task.Status == EnmTaskStatus.TWaitforMove) { toAddrs = task.FromLctAddress; } else { toAddrs = task.ToLctAddress; } int toCol = Convert.ToInt32(toAddrs.Substring(1, 2)); //正在作业TV int currCol = Convert.ToInt32(other.Address.Substring(1, 2)); //空闲TV int freeCol = Convert.ToInt32(dev.Address.Substring(1, 2)); //空闲TV在右侧,即2号ETV空闲 if (currCol < freeCol) { #region TV2 空闲 if (hallColmn >= toCol + 3) { //1#车厅不在范围内,则允许2#ETV动作 return(dev); } #endregion } else { #region 1#TV 空闲 if (hallColmn <= toCol - 3) { //2#车厅不在范围内,则允许1#ETV动作 return(dev); } #endregion } } #endregion } } //有两个空闲或,两个忙时,都优先分配车厅所在区域的ETV List <Device> orderbyLst = availableLst.OrderBy(d => Math.Abs(d.Region - hall.Region)).ToList(); return(orderbyLst[0]); } return(null); }
/// <summary> /// 巷道堆垛临时卡车位分配 /// </summary> /// <returns></returns> private Location PXDAllocate(Device hall, string checkCode, out int smg) { smg = 0; #region CWLocation cwlctn = new CWLocation(); CWDevice cwdevice = new CWDevice(); CWTask cwtask = new CWTask(); CWICCard cwiccd = new CWICCard(); List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); int hallColmn = Convert.ToInt32(hall.Address.Substring(1, 2)); List <Device> reachHall = new List <Device>(); #region 找出可达车厅、可用的ETV集合 foreach (Device dev in nEtvList) { CScope scope = workscope.GetEtvScope(dev); if (scope.LeftCol <= hallColmn && hallColmn <= scope.RightCol) { if (dev.IsAble == 1) { reachHall.Add(dev); } } } #endregion List <Location> lctnLst = new List <Location>(); #region 依距车厅的远近找出所有车位的集合 List <Location> allLocLst = cwlctn.FindLocList(); List <Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP); //排除固定车位 allLocLst = allLocLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false); #region 车位尺寸一致 List <Location> sameLctnLst = new List <Location>(); #region #region 首先 分配与车厅同一个区域的,车位尺寸一致的, 4-2-1依次排列, var L42_locList_small = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 1 && loc.LocSide != 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_small = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 1 && loc.LocSide == 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion sameLctnLst.AddRange(L42_locList_small); sameLctnLst.AddRange(L1_locList_small); #region 再次分配与车厅同一个区域,车位尺寸(仅宽度)偏大点的 var L42_locList_width = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 2 && loc.LocSide != 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_width = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 2 && loc.LocSide == 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion sameLctnLst.AddRange(L42_locList_width); sameLctnLst.AddRange(L1_locList_width); #region 再分配与车厅不是同一个区域的 //4边2边 var L42_locList_small_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 1 && loc.LocSide != 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_small_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 1 && loc.LocSide == 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion sameLctnLst.AddRange(L42_locList_small_dif); sameLctnLst.AddRange(L1_locList_small_dif); #region 再次分配与车厅不同区域,车位尺寸(仅宽度)偏大点的 var L42_locList_width_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 2 && loc.LocSide != 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_width_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 2 && loc.LocSide == 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion sameLctnLst.AddRange(L42_locList_width_dif); sameLctnLst.AddRange(L1_locList_width_dif); #endregion #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的 List <Location> spaceLctnLst = new List <Location>(); List <Location> occupyLctnLst = new List <Location>(); List <Location> otherLctnLst = new List <Location>(); foreach (Location loc in sameLctnLst) { if (loc.LocSide == 4) { #region 判断前面车位状态 string fwdAddrs = "2" + loc.Address.Substring(1); Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs); if (forward != null) { if (forward.Type == EnmLocationType.Normal) { if (forward.Status == EnmLocationStatus.Space) { spaceLctnLst.Add(loc); } else if (forward.Status == EnmLocationStatus.Occupy) { occupyLctnLst.Add(loc); } else { otherLctnLst.Add(loc); } } } #endregion } else if (loc.LocSide == 2) { #region 判断后面车位状态 string bckAddrs = "4" + loc.Address.Substring(1); Location back = cwlctn.FindLocation(l => l.Address == bckAddrs); if (back != null) { if (back.Type == EnmLocationType.Normal) { if (back.Status == EnmLocationStatus.Space) { spaceLctnLst.Add(loc); } else if (back.Status == EnmLocationStatus.Occupy) { occupyLctnLst.Add(loc); } else { otherLctnLst.Add(loc); } } else //禁用的 { spaceLctnLst.Add(loc); } } #endregion } else { spaceLctnLst.Add(loc); } } lctnLst.AddRange(spaceLctnLst); lctnLst.AddRange(occupyLctnLst); lctnLst.AddRange(otherLctnLst); #endregion #endregion #region 车位尺寸是大的 List <Location> bigLctnLst = new List <Location>(); #region #region 首先 分配与车厅同一个区域的,车位尺寸一致的, 4-2-1依次排列, var L42_locList_big = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 3 && loc.LocSide != 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_big = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 3 && loc.LocSide == 1 && loc.Region == hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion bigLctnLst.AddRange(L42_locList_big); bigLctnLst.AddRange(L1_locList_big); #region 再分配与车厅不是同一个区域的 var L42_locList_big_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 3 && loc.LocSide != 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending, loc.LocSide descending select loc; //1边 var L1_locList_big_dif = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, checkCode) == 3 && loc.LocSide == 1 && loc.Region != hall.Region orderby Math.Abs(loc.LocColumn - hallColmn) ascending select loc; #endregion bigLctnLst.AddRange(L42_locList_big_dif); bigLctnLst.AddRange(L1_locList_big_dif); #endregion #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的 List <Location> spaceLctnLst_big = new List <Location>(); List <Location> occupyLctnLst_big = new List <Location>(); List <Location> otherLctnLst_big = new List <Location>(); foreach (Location loc in bigLctnLst) { if (loc.LocSide == 4) { #region 判断前面车位状态 string fwdAddrs = "2" + loc.Address.Substring(1); Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs); if (forward != null) { if (forward.Type == EnmLocationType.Normal) { if (forward.Status == EnmLocationStatus.Space) { spaceLctnLst_big.Add(loc); } else if (forward.Status == EnmLocationStatus.Occupy) { occupyLctnLst_big.Add(loc); } else { otherLctnLst_big.Add(loc); } } } #endregion } else if (loc.LocSide == 2) { #region 判断后面车位状态 string bckAddrs = "4" + loc.Address.Substring(1); Location back = cwlctn.FindLocation(l => l.Address == bckAddrs); if (back != null) { if (back.Type == EnmLocationType.Normal) { if (back.Status == EnmLocationStatus.Space) { spaceLctnLst_big.Add(loc); } else if (back.Status == EnmLocationStatus.Occupy) { occupyLctnLst_big.Add(loc); } else { otherLctnLst_big.Add(loc); } } else //禁用的 { spaceLctnLst_big.Add(loc); } } #endregion } else { spaceLctnLst_big.Add(loc); } } lctnLst.AddRange(spaceLctnLst_big); lctnLst.AddRange(occupyLctnLst_big); lctnLst.AddRange(otherLctnLst_big); #endregion #endregion #endregion if (reachHall.Count == 1) { CScope scope = workscope.GetEtvScope(reachHall[0]); //只要一个ETV可达车厅, //依作业范围,找出在TV范围内的车位 foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { smg = reachHall[0].DeviceCode; return(loc); } } } else if (reachHall.Count == 2) { //如果有两个空闲的 List <Device> freeEtvs = reachHall.FindAll(ch => ch.TaskID == 0); if (freeEtvs.Count == 2) { #region freeEtvs = reachHall.OrderBy(h => Math.Abs(h.Region - hall.Region)).ToList(); foreach (Device dev in freeEtvs) { CScope scope = workscope.GetEtvScope(dev); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { smg = dev.DeviceCode; return(loc); } } } #endregion } else if (freeEtvs.Count == 1) { #region Device dev = freeEtvs[0]; if (dev.Region == hall.Region) { #region smg = dev.DeviceCode; CScope scope = workscope.GetEtvScope(dev); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { return(loc); } } #endregion } else { #region //如果不是同一区域的 //判断另一个ETV在执行什么样的动作, //另一台ETV要不要跨区作业 Device other = reachHall.Find(h => h.DeviceCode != dev.DeviceCode); if (other.TaskID != 0) { ImplementTask task = cwtask.Find(other.TaskID); if (task != null) { string toAddrs = ""; if (task.Status == EnmTaskStatus.TWaitforLoad || task.Status == EnmTaskStatus.TWaitforMove) { toAddrs = task.FromLctAddress; } else { toAddrs = task.ToLctAddress; } int toCol = Convert.ToInt32(toAddrs.Substring(1, 2)); //正在作业TV int currCol = Convert.ToInt32(other.Address.Substring(1, 2)); //空闲TV int freeCol = Convert.ToInt32(dev.Address.Substring(1, 2)); //空闲TV在右侧,即2号ETV空闲 if (currCol < freeCol) { #region TV2空闲 if (hallColmn >= toCol + 3) { //1#车厅不在范围内,则允许2#ETV动作 smg = dev.DeviceCode; CScope scope = workscope.GetEtvScope(dev); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { return(loc); } } } #endregion } else { #region 1#TV空闲 if (hallColmn <= toCol - 3) { //2#车厅不在范围内,则允许1#ETV动作 smg = dev.DeviceCode; CScope scope = workscope.GetEtvScope(dev); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { return(loc); } } } #endregion } } } #endregion } #endregion } List <Device> orderbyEtvs = reachHall.OrderBy(dr => Math.Abs(dr.Region - hall.Region)).ToList(); #region 两个都在忙或上述找不到时,则依车厅区域内的ETV优先,分配ETV foreach (Device devc in orderbyEtvs) { CScope scope = workscope.GetEtvScope(devc); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { smg = devc.DeviceCode; return(loc); } } } #endregion } #endregion return(null); }
/// <summary> /// 巷道堆垛式---要生成挪移作业时,挪移车位的查找 /// </summary> /// <param name="nEtv"></param> /// <param name="frLct"></param> /// <returns></returns> public Location AllocateTvNeedTransfer(Device nEtv, Location frLct) { CWDevice cwdevice = new CWDevice(); CWLocation cwlctn = new CWLocation(); CWICCard cwiccd = new CWICCard(); int warehouse = nEtv.Warehouse; List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); CScope scope = workscope.GetEtvScope(nEtv); List <Location> availLst = new List <Location>(); List <Location> backOccupyLst = new List <Location>(); List <Location> lctnLst = cwlctn.FindLocList(); //先找出相同区域的,尺寸一致的,如果是2边车位,则后面的车位不能是作业的车位 var query_same = from loc in lctnLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && loc.Region == frLct.Region && loc.LocSide != 4 && (compareSize(loc.LocSize, frLct.LocSize) == 1 || compareSize(loc.LocSize, frLct.LocSize) == 2) && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null orderby Math.Abs(frLct.LocColumn - loc.LocColumn), loc.LocSide ascending select loc; foreach (Location loc in query_same) { if (loc.LocSide == 2) { string backAddrs = string.Format((loc.LocSide + 2).ToString() + loc.Address.Substring(1)); Location back = cwlctn.FindLocation(lc => lc.Address == backAddrs); if (back != null) { if (back.Status == EnmLocationStatus.Space) { availLst.Add(loc); } else if (back.Status == EnmLocationStatus.Occupy) { backOccupyLst.Add(loc); } } } else { availLst.Add(loc); } } availLst.AddRange(backOccupyLst); //再找缓存车位 var query_temp = from loc in lctnLst where loc.Type == EnmLocationType.Temporary && loc.Status == EnmLocationStatus.Space && compareSize(loc.LocSize, frLct.LocSize) > 0 orderby Math.Abs(loc.Region - frLct.Region) select loc; availLst.AddRange(query_temp); //最后找不同区域的,尺寸一致的,如果是2边车位,则后面的车位不能是作业的车位 var query_diff = from loc in lctnLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && loc.Region != frLct.Region && loc.LocSide != 4 && (compareSize(loc.LocSize, frLct.LocSize) == 1 || compareSize(loc.LocSize, frLct.LocSize) == 2) && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null orderby Math.Abs(frLct.LocColumn - loc.LocColumn), loc.LocSide ascending select loc; List <Location> backOccupyLst_Big = new List <Location>(); foreach (Location loc in query_diff) { if (loc.LocSide == 2) { string backAddrs = string.Format((loc.LocSide + 2).ToString() + loc.Address.Substring(1)); Location back = cwlctn.FindLocation(lc => lc.Address == backAddrs); if (back != null) { if (back.Status == EnmLocationStatus.Space) { availLst.Add(loc); } else if (back.Status == EnmLocationStatus.Occupy) { backOccupyLst_Big.Add(loc); } } } else { availLst.Add(loc); } } availLst.AddRange(backOccupyLst_Big); foreach (Location loc in availLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { return(loc); } } return(null); }
/// <summary> /// 没有任何作业时,如果缓存位被占用,则强制回挪, /// TV分配,挪移车位分配 /// </summary> /// <param name="frlct"></param> /// <param name="tolct"></param> /// <returns></returns> public Device AllocateTvOfTransport(Location frlct, out Location toLct) { toLct = null; CWDevice cwdevice = new CWDevice(); CWLocation cwlctn = new CWLocation(); CWICCard cwiccd = new CWICCard(); List <Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV); WorkScope workscope = new WorkScope(nEtvList); int locColmn = frlct.LocColumn; List <Device> availableLst = new List <Device>(); #region 可达车位、可用的ETV集合 foreach (Device dev in nEtvList) { if (dev.IsAble == 1) { CScope scope = workscope.GetEtvScope(dev); if (scope.LeftCol <= locColmn && locColmn <= scope.RightCol) { availableLst.Add(dev); } } } #endregion List <Location> allLocLst = cwlctn.FindLocList(); var query = from loc in allLocLst where loc.Type == EnmLocationType.Normal && loc.Status == EnmLocationStatus.Space && cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null && (loc.LocSide == 1 || loc.LocSide == 2) && compareSize(loc.LocSize, frlct.LocSize) > 0 orderby Math.Abs(frlct.LocColumn - loc.LocColumn), loc.LocSide ascending select loc; List <Location> lctnLst = query.ToList(); if (availableLst.Count == 0) { return(null); } if (availableLst.Count == 1) { CScope scope = workscope.GetEtvScope(availableLst[0]); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { toLct = loc; return(availableLst[0]); } } } else { List <Device> orderbyLst = availableLst.OrderBy(d => Math.Abs(d.Region - frlct.Region)).ToList(); foreach (Device dev in orderbyLst) { CScope scope = workscope.GetEtvScope(dev); foreach (Location loc in lctnLst) { if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol) { toLct = loc; return(availableLst[0]); } } } } return(null); }