123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- using DBHelper;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using WCS.Core;
- using WCS.Entity;
- using WCS.Entity.Protocol;
- namespace WCS.Service.Works.Stations
- {
- [WorkTitle(typeof(ProductHandler), "原膜巷道分配",true)]
- public class 原膜巷道分配 : DeviceWork<Device<IStation521, IStation520>>
- {
- Device<IStation521>[] DevArr;
- TunnelInfo[] TunnelArr;
- class TunnelInfo
- {
- public WCS_DEVICE Tunnel;
- public Device<IStation521> DockIn;
- public Device<IStation521> DockWating;
- public Device<ISC521> SC;
- }
- public 原膜巷道分配()
- {
- DevArr = Device.Where(v => new string[]{ "2017", "2029", "2044", "2058" }
- .Contains(v.CODE))
- .Select(v => v.Device<IStation521>())
- .OrderBy(v => v.Entity.CODE)
- .ToArray();
- TunnelArr = Device.Where(v => v.IsTunnel() && v.CODE.StartsWith("TY")).Select(t =>
- {
- var inbound = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == t.CODE)).Select(v => v.Device<IStation521>()).FirstOrDefault();
- return new TunnelInfo
- {
- Tunnel = t,
- DockIn = inbound,
- DockWating = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == inbound.Entity.CODE)).Select(v => v.Device<IStation521>()).FirstOrDefault(),
- SC = t.ROUTES.Where(d => d.NEXT.IsSC()).Select(d => d.NEXT.Device<ISC521>()).FirstOrDefault()
- };
- }).ToArray();
- }
- protected override bool SelectDevice(WCS_DEVICE dev)
- {
- return DevArr.Any(d=>d.Entity.CODE==dev.CODE);
- }
- protected override void Do(Device<IStation521, IStation520> obj)
- {
- if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
- return;
- if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
- return;
- if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
- return;
- if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
- return;
-
- DB.Do(db =>
- {
- var task = db.Default.Find<WCS_TASK>(obj.Data.TASKNUM);
- if (task.STATUS >= WCS.Entity.TaskStatus.已完成)
- {
- Ltc.Log($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!");
- throw new Exception($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!");
- }
- var res = WMS.GetTunnelList(task.WMSTASK, obj.Entity.CODE);
- try
- {
- if (!res.ResType)
- {
- throw new Exception($"分配巷道失败:{res.ResMessage}");
- }
- var tArr = TunnelArr;
- if (obj.Entity.CODE == "2029")
- tArr = TunnelArr.Skip(1).ToArray();
- else if (obj.Entity.CODE == "2044")
- tArr = TunnelArr.Skip(3).ToArray();
- else if (obj.Entity.CODE == "2058")
- tArr = TunnelArr.Skip(5).ToArray();
- var grp = tArr.GroupBy(v => v.DockWating.Entity).ToArray();
- var tsstr = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
- //grp = grp.Where(v => v.Any(d => tsstr.Contains(d.Tunnel.CODE))).ToArray();
- if (grp.Length == 0)
- throw new Exception($"入口分配无可用巷道{res.TunnelNum}");
- Ltc.Log($"入口分配,可用入口数{grp.Length}");
- //grp = grp.Where(v => v.Any(d =>
- //{
- // try
- // {
- // return d.SC.Data.Alarm == false && d.SC.Data.Mode == SCMode.远程;
- // }
- // catch
- // {
- // return false;
- // }
- //}
- //)).ToArray();
- if (grp.Length == 0)
- throw new Exception($"堆垛机全不可用");
- Ltc.Log($"堆垛机状态正常的入口数{grp.Length}");
- Device<IStation521> next = null;
- var g = grp.Where(v => v.Key.CODE == obj.Entity.CODE).FirstOrDefault();
- if (g != null)
- {
- if (g.Select(v => Locked(v.DockIn.Entity)).Sum() == 0)
- {
- next = g.Select(v => v)
- .Where(v =>
- {
- try
- {
- return v.SC.Data.Alarm == false && v.SC.Data.Mode == SCMode.远程;
- }
- catch
- {
- return false;
- }
- })
- .Where(v => tsstr.Contains(v.Tunnel.CODE))
- .OrderBy(v => v.SC.Data.Status == SCRunStatus.空闲 ? 0 : 1)
- .ThenBy(v => tsstr.IndexOf(v.Tunnel.CODE))
- .Select(v => v.DockIn)
- .FirstOrDefault();
- }
- }
- if (next == null)
- {
- var arr = grp.Where(v => v.Key.CODE != obj.Entity.CODE)
- //.Where(v => v.Sum(d => Locked(d.DockIn.Entity)) == 0)//干道不缓存
- .Select(v => v.Key.Device<IStation521>()).ToArray();
- if (arr.Length == 0)
- {
- throw new Exception($"无巷道可用{res.TunnelNum}");
- }
- next = arr.OrderBy(v => v.Entity.CODE).FirstOrDefault();
- if (next == null || Locked(next.Entity) > 0)
- throw new Exception($"排队中{res.TunnelNum}");
- }
- task.ADDRNEXT = next.Entity.CODE;
- task.UPDATETIME = DateTime.Now;
- task.ADDRTO = next.Entity.CODE;
- db.Default.SaveChanges();
- obj.Data2.TASKNUM = obj.Data.TASKNUM;
- obj.Data2.GOODSEND = next.Entity.Code();
- obj.Data2.CONFIRM = true;
- }
- catch(Exception ex)
- {
- var devs = Device.Where(v=>v.IsConv()).Where(v => v.Code() > 2017 && v.Code() < 2062).Select(v => v.Device<IStation521>()).ToArray();
- var arr = devs.Where(v => v.Entity.Code() < obj.Entity.Code() && v.Data.GOODSEND > obj.Entity.Code()).ToArray();
- if (arr.Length > 0)
- {
- if (obj.Entity.CODE == "2058")
- {
- var flag = Device.Find("2071", "2060").Select(v => v.Device<IStation521>()).All(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0);
- if (flag)
- {
- obj.Data2.TASKNUM = obj.Data.TASKNUM;
- obj.Data2.GOODSEND = 2017;
- obj.Data2.CONFIRM = true;
- }
- }
- else if (obj.Entity.CODE == "2044")
- {
- var emp = obj.Entity.GetPath("2058").Select(v => v.Device<IStation521>()).Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).Count();
- if (emp > 0)
- {
- obj.Data2.TASKNUM = obj.Data.TASKNUM;
- obj.Data2.GOODSEND = 2058;
- obj.Data2.CONFIRM = true;
- }
- }
- }
- //throw;
- Configs.UploadException(obj.Entity.CODE, ex.GetBaseException().Message);
- }
- });
- }
- int Locked(WCS_DEVICE dev)
- {
- return Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>()).Where(v => v.Data.TASKNUM > 0)
- .Where(v => v.Data.GOODSEND == dev.Code() || v.Entity.CODE == dev.CODE)
- .Count();
- }
- }
- }
|