123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- using NPOI.SS.Formula.Functions;
- using NPOI.SS.Formula.PTG;
- using ServiceCenter.SqlSugars;
- using SqlSugar;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using WCS.Core;
- using WCS.Entity;
- using WCS.Entity.Protocol.Station;
- using WCS.WorkEngineering.Extensions;
- using WCS.WorkEngineering.Worlds;
- namespace WCS.WorkEngineering.Systems
- {
- [Description("巷道口放行")]
- [BelongTo(typeof(LoopLineWorld))]
- public class 巷道口放行 : DeviceSystem<Device<IStation520, IStation521>>
- {
- protected override bool ParallelDo => false;
- protected override List<Device<IStation520, IStation521>> Sort(List<Device<IStation520, IStation521>> objs)
- {
- var tasks = SqlSugarHelper.Do(db => db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(v => v.Type == TaskType.OutDepot)).ToArray();
- var arr = objs.Select(v => new { Obj = v, ChangedTime = (v.Data2 as ProtocolProxyBase).ChangedTime, Task = tasks.Where(d => d.ID == v.Data2.TaskNumber).FirstOrDefault() })
- .Select(v => new { Obj = v.Obj, ChangedTime = v.ChangedTime, Type = v.Task == null ? 999 : (v.Task.BusType == "装箱码垛" ? 1 : 2), Pallet = v.Task == null ? 0 : v.Task.PalletizingID, LayerID = v.Task == null ? 0 : v.Task.AgvTaskID }).ToArray();
- arr = arr.OrderBy(v => v.Type)//成品码垛优先
- .ThenBy(v => v.Pallet)//按装箱ID排序
- .ThenBy(v => v.LayerID)//按层配排序
- .ThenBy(v => v.ChangedTime)//按等待时间排序
- .ToArray();
- var res = arr.Select(v => v.Obj).ToList();
- return res;
- }
- private Dictionary<string, List<Device<IStation521>>> DeviceOfFloor = new Dictionary<string, List<Device<IStation521>>>();
- public 巷道口放行()
- {
- for (int i = 1; i <= 3; i++)
- {
- var convs = Device.All.Where(v => v.HasProtocol<IStation521>() && v.HasFlag("Floor", i.ToString()))
- .Select(v => new Device<IStation521>(v, this.World)).ToList();
- DeviceOfFloor[i.ToString()] = convs;
- }
- }
- public override void Do(Device<IStation520, IStation521> obj)
- {
- if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
- return;
- if (obj.Data2.Request == 0)
- return;
- var code = short.Parse(obj.Entity.Code);
- string floor = obj.Entity.GetFlag("Floor");
- var devout = Device.All.Where(v => v.HasFlag("出库扫码") && v.HasFlag("Floor", floor)).First();
- var outdevCode = short.Parse(devout.Code);
- var convs = DeviceOfFloor[floor];
- if (obj.Data2.GoodsStart == 1)//成品码垛
- {
- var qty = convs.Where(v => v.Data.TaskNumber > 0 && v.Data.GoodsStart == 1 && v.Data.GoodsEnd >= outdevCode).Count();
- if (qty >= 15)
- {
- World.Log("环线成品码垛提升机缓存已满");
- return;
- }
- SqlSugarHelper.Do(db =>
- {
- var task = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(v => v.ID == obj.Data2.TaskNumber).First();
- if (task == null)
- {
- throw new Exception($"任务号{obj.Data2.TaskNumber}不存在");
- }
- // var sSql = @"select count(distinct DocID)
- //from WCS_TaskInfo a with(nolock)
- //where Type=2 and BusType='装箱码垛' and Status<50
- //and a.Robot='" + task.Robot + @"'
- //and (a.DocID<" + task.DocID + " or (a.DocID=" + task.DocID + " and a.AgvTaskID<" + task.AgvTaskID + " ))";
- // var rc = db.Default.Ado.SqlQuery<int>(sSql).First();
- // if (rc > 1)
- // {
- // World.Log($"{task.Robot}第三箱排队等待巷道放行{rc}");
- // return;
- // }
- // sSql = @"select count(*)
- //from WCS_TaskInfo a with(nolock)
- //where Type=2 and BusType='装箱码垛' and Status<50
- //and a.Robot='" + task.Robot + @"'
- //and (a.DocID<" + task.DocID + " or (a.DocID=" + task.DocID + " and a.AgvTaskID<" + task.AgvTaskID + " ))";
- // rc = db.Default.Ado.SqlQuery<int>(sSql).First();
- // if (rc > 10)
- // {
- // World.Log($"{task.Robot}排队等待巷道放行{rc}");
- // return;
- // }
-
- //var qty = db.Default.Queryable<WCS_TaskInfo>()
- //.Where(v => v.Type == TaskType.OutDepot && v.BusType == "装箱码垛" && v.AddrTo == task.AddrTo)
- //.Where(v => v.Status > Entity.TaskStatus.巷道口放行 && v.Status < Entity.TaskStatus.码垛抓取中).Count();
- //var max = 12;
- //if (qty >= max)
- //{
- // World.Log($"目的地为码垛位{task.AddrTo}的任务缓存数已达{max}");
- // return;
- //}
- db.Default.Updateable<WCS_TaskInfo>()
- .SetColumns(v => new WCS_TaskInfo { Status = Entity.TaskStatus.巷道口放行, EditTime = SqlFunc.GetDate() })
- .Where(v => v.ID == task.ID)
- .ExecuteCommand();
- obj.Data.GoodsStart = obj.Data2.GoodsStart;
- obj.Data.TaskNumber = obj.Data2.TaskNumber;
- obj.Data.GoodsEnd = short.Parse(devout.Code);
- obj.Data.VoucherNo++;
- });
- }
- else if (obj.Data2.GoodsStart == 2 || obj.Data2.GoodsStart == 3)//扭转检测
- {
- var qty = convs.Where(v => v.Data.TaskNumber > 0 && v.Data.GoodsEnd >= outdevCode)
- .Where(v => v.Data.GoodsStart == 2 || v.Data.GoodsStart == 3).Count();
- if (qty >= 11)
- {
- World.Log("环线扭转检车提升机缓存已满");
- return;
- }
- obj.Data.GoodsStart = obj.Data2.GoodsStart;
- obj.Data.TaskNumber = obj.Data2.TaskNumber;
- if (obj.Data2.GoodsStart == 2)
- {
- obj.Data.GoodsEnd = 4002;
- //if (floor == "1")
- // obj.Data.GoodsEnd = 3618;
- //else if (floor == "2")
- // obj.Data.GoodsEnd = 3318;
- //else if (floor == "3")
- // obj.Data.GoodsEnd = 3018;
- }
- else
- {
- obj.Data.GoodsEnd = 5186;
- }
- obj.Data.VoucherNo++;
- }
- else//
- {
- throw new Exception("GoodsStart值有误");
- }
- }
- public override bool Select(Device dev)
- {
- return dev.HasFlag("位置", "巷道口放行");
- }
- }
- }
|