| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | using ServiceCenter.SqlSugars;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.BCR;using WCS.Entity.Protocol.Station;using WCS.WorkEngineering.Worlds;using WCS.WorkEngineering.Extensions;using ServiceCenter.Redis;using WCS.WorkEngineering.WebApi.Models.WCS.Request;using Newtonsoft.Json;using ServiceCenter.Extensions;using TaskStatus = WCS.Entity.TaskStatus;using Autofac.Core;using SqlSugar;namespace WCS.WorkEngineering.Systems{    [BelongTo(typeof(RobotBCRWorld))]    [Description("码垛缓存放行")]    public class 码垛缓存放行 : DeviceSystem<Device<IStation520, IStation521, IStation523>>    {        protected override bool ParallelDo => true;        public override void Do(Device<IStation520, IStation521, IStation523> obj)        {            if (obj.Data.VoucherNo != obj.Data2.VoucherNo)            {                World.Log("PLC正在处理");                return;            }            if (obj.Data2.Request == 0)            {                World.Log("无请求");                return;            }            World.Log($"码垛放行{obj.Entity.Code}交互开始时间:任务号 {obj.Data2.TaskNumber}  | " + DateTime.Now.ToString("yyyyMMddHHmmss"));            SqlSugarHelper.Do(db =>            {                var task1 = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskNumber).First();                var addrTo = obj.Entity.GetFlag("码垛工位");                addrTo = task1.AddrTo;                var addrScan = Device.All.Where(v => v.HasProtocol<IStation521>() && v.HasFlag("装箱码垛") && v.HasFlag("码垛工位", addrTo) && v.HasFlag("位置", "扫码")).First();                var pallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).Where(v => v.PalletizState == 0 && v.Equip == addrTo).First();                if (pallet.ID != task1.PalletizingID) //不是正在码垛的箱                {                    if (db.Default.Queryable<WCS_TaskInfo>().Any(x => pallet.ID == x.PalletizingID && x.Status < TaskStatus.码垛抓取扫码))                    {                        var error = new BaseErrorinfoWcs()                        {                            ContBarCode = task1.BarCode,                            Message = $"码垛缓存放行|{obj.Entity.Code},条码{task1.BarCode}拒绝放行,上一箱码垛未结束,{DateTime.Now:yyyyMMddHH}",                            Count = 1,                            Memo = "WCS"                        };                        error.UpdataErrorinfo();                        //上一箱的任务没有全部过扫码器                        throw new Exception($"上一箱正在码垛中!!!");                    }                }                var devCodeList = Device.All.Where(x => x.Code is "5100" or "5086" or "5070" or "5056" or "5310" or "5295" or "5280" or "5265").Select(x => new Device<IStation521>(x, World)).Where(x => x.Data.Request == 1).Select(x => x.Entity.Code).ToList();                //检查当前线体缓存是不是当前箱中最少的                var addrNextGroup = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(x =>                        x.PalletizingID == task1.PalletizingID && x.Status == TaskStatus.码垛缓存扫码)                    .ToList().GroupBy(x => x.AddrNext).Where(x => devCodeList.Contains(x.Key)).MinBy(x => x.Count());                if (addrNextGroup != null && obj.Entity.Code != addrNextGroup.Key)                {                    var error = new BaseErrorinfoWcs()                    {                        ContBarCode = task1.BarCode,                        Message = $"码垛缓存放行|{obj.Entity.Code},条码{task1.BarCode}拒绝放行,等待{addrNextGroup.Key}放行结束,{DateTime.Now:yyyyMMddHH}",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo();                    return;// 不是当前任务箱中最少的                }                var qty = db.Default.Queryable<WCS_TaskInfo>()                .Where(v => v.Type == TaskType.OutDepot && v.BusType == "装箱码垛")                .Where(v => v.Status == Entity.TaskStatus.码垛抓取扫码 || v.Status == TaskStatus.码垛缓存放行)                .Where(v => v.AddrTo == addrTo).Count();                //找到同组的设备号                var devCode = obj.Entity.Code.ToShort();                var devCodes = new List<string>() { obj.Entity.Code, (devCode - 1).ToString(), (devCode - 2).ToString() };                var devList = Device.All.Where(x => devCodes.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));                devList = devList.Where(x => x.Data2.TaskNumber > 0).OrderByDescending(x => x.Entity.Code.ToShort());                var maxQ = 9;                //if (addrTo == "8098") maxQ = 9;                if (qty + devList.Count() <= maxQ)                {                    if (qty + devList.Count() > maxQ)                    {                        var number = maxQ - qty;                        devList = devList.OrderByDescending(x => x.Entity.Code.ToShort()).Take(number).ToList();                    }                    var taskidlist = devList.Select(p => p.Data2.TaskNumber).ToList();                    if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.Status > TaskStatus.码垛缓存扫码).Any())                    {                        MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));                        World.Log("码垛缓存放行:任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));                        throw new Exception("任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));                    }                    if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.AddrTo != addrTo).Any())                    {                        MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));                        World.Log("码垛缓存放行:码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));                        throw new Exception("码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));                    }                    foreach (var device in devList)                    {                        var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == device.Data2.TaskNumber && v.Status == TaskStatus.码垛缓存扫码).First();                        if (task == null)                        {                            MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));                            throw new Exception("任务号错误");                        }                        if (task.AddrTo != addrTo)                        {                            MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}任务{task.ID}码垛工位错误", Time = DateTime.Now }));                            throw new Exception($"任务{task.ID}码垛工位错误");                        }                        if (device.Entity.Code == obj.Entity.Code)//默认不会出现一条缓存线种同时存在两层的任务,如果出现请检查缓存线分配部分的逻辑是否正确                        {                            //var flag = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.AgvTaskID < task.AgvTaskID).Where(v => v.PalletizingID == task.PalletizingID)                            //    .Where(v => v.AddrTo == addrTo)                            //    .Where(v => v.Status < Entity.TaskStatus.码垛抓取扫码).Any();                            //if (flag)                            //{                            //    World.Log("上一层码垛任务未全部抓取完成");                            //    MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = obj.Entity.Code + "上一层码垛任务未全部抓取完成", Time = DateTime.Now }));                            //    return;                            //}                        }                        task.Status = Entity.TaskStatus.码垛缓存放行;                        task.EditTime = DateTime.Now;                        db.Default.Updateable(task).ExecuteCommand();                        task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "码垛缓存放行");                        device.Data.TaskNumber = task.ID;                        device.Data.GoodsEnd = short.Parse(addrScan.Code);                        MainWorld.Redis.Decr($"stockOperateNum{task.AddrTo}");                        World.Log("码垛缓存放行:" + device.Data.TaskNumber + "," + device.Data.GoodsEnd+",之前凭证号:"+ obj.Data.VoucherNo);                    }                    obj.Data.VoucherNo++;                }            });            World.Log($"码垛放行{obj.Entity.Code}交互结束时间:任务号 {obj.Data2.TaskNumber} | " + DateTime.Now.ToString("yyyyMMddHHmmss"));        }        public override bool Select(Device dev)        {            return dev.HasFlag("装箱码垛") && dev.HasFlag("位置", "缓存");        }    }}
 |