| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 | using DBHelper;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using WCS.Core;using WCS.Entity;using WCS.Entity.Protocol;using WCS.Service.Extensions;using WCS.Service.Helpers;using WCS.Service.Log;namespace WCS.Service.Works.Station{    [WorkTitle(typeof(ProductHandler), "一楼出库堆垛机放货完成后分配下一个地址")]    public class 一楼出库 : Work<StationDeviceGroup>    {        protected override void Do(StationDeviceGroup obj)        {            var timer = new Stopwatch();            timer.Start();            obj.EX(obj =>            {                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");                //成功处理的任务                var finishTaskList = new List<FinishTaskList<int>>();                DB.Do(db =>                {                    var devs = new List<FinishTaskList<string>>();                    foreach (var dev in obj.Items)                    {                        //没有请求                        if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)                        {                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");                            continue;                        }                        //没有光电                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))                        {                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);                            continue;                        }                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));                    }                    if (!devs.Any()) return;                    foreach (var dev in devs)                    {                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");                        var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);                        if (tasks.Count() != devs.Count) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");                        if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");                        task.STATUS = TaskStatus.执行中;                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));                    }                    db.Default.SaveChanges();                });                DB.Do(db =>                {                    foreach (var finish in finishTaskList)                    {                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);                        if (task == null) continue;                        finish.Station.Data.Tasknum = task.ID;                        finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort();                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();                        finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();                        finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;                        finish.Station.Data.VoucherNo++;                    }                    timer.Stop();                    InfoLog.INFO_TIMING($"{obj.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}");                });            });        }        protected override bool SelectDevice(WCS_DEVICE dev)        {            return devCodes.Contains(dev.CODE);        }        //月台堆垛机放货设备组        private List<string> devCodes = new List<string>() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };    }    [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]    public class 月台完成任务 : Work<StationDeviceGroup>    {        protected override void Do(StationDeviceGroup obj)        {            obj.EX(obj =>            {                //当前组有一个运行的设备就停止执行                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");                if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电"); //此处逻辑为货物离开后报完成                                                                                                                           //成功处理的任务                var finishTaskList = new List<FinishTaskList<int>>();                DB.Do(db =>                {                    var devs = new List<FinishTaskList<string>>();                    foreach (var dev in obj.Items)                    {                        if (dev.Data2.Request != IstationRequest.月台出库口任务完成)                        {                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3");                            continue;                        }                        if (dev.Data2.Tasknum < 10000)                        {                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);                            continue;                        };                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));                    }                    foreach (var dev in devs)                    {                        var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Station.Data2.Tasknum).FirstOrDefault();                        if (task.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");                        task.STATUS = TaskStatus.已完成;                        task.ENDTIME = System.DateTime.Now;                        task.UPDATEUSER = "WCS";                        task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType());                        finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));                    }                    db.Default.SaveChanges();                });                DB.Do(db =>                {                    foreach (var finish in finishTaskList)                    {                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);                        finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;                        finish.Station.Data.VoucherNo++;                    }                });            });        }        protected override bool SelectDevice(WCS_DEVICE dev)        {            return devCodes.Contains(dev.CODE);        }        private List<string> devCodes = new List<string>() { "G1469", "G1561", "G1538", "G1574", "G1509" };    }    [WorkTitle(typeof(ProductHandler), "转圈交互点分配目标地址")]    public class 转圈交互点分配目标地址 : Work<StationDeviceGroup>    {        protected override void Do(StationDeviceGroup obj)        {            obj.EX(obj =>            {                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");                DB.Do(db =>                {                    var devs = new List<FinishTaskList<string>>();                    foreach (var dev in obj.Items)                    {                        //没有请求                        if (dev.Data2.Request != IstationRequest.请求分配目标地址)                        {                            InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2");                            continue;                        }                        //没有光电                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))                        {                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);                            continue;                        };                        if (dev.Data2.Tasknum < 10000)                        {                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);                            continue;                        }                        devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));                    }                    foreach (var dev in devs)                    {                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException("无任务");                        var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);                        if (devs.Count != tasks.Count()) throw new WarnException($"可执行任务数{devs.Count},实际任务数{tasks.Count()}");                        dev.Station.Data.Tasknum = task.ID;                        dev.Station.Data.Goodsstart = dev.Station.Entity.CODE.ToShort();                        dev.Station.Data.Goodsend = task.ADDRNEXT.ToShort();                        dev.Station.Data.Goodsnum = devs.Count.ToShort();                        dev.Station.Data.CmdType = IstationCmdType.分配目标地址;                        dev.Station.Data.VoucherNo++;                    }                });            });        }        protected override bool SelectDevice(WCS_DEVICE dev)        {            return dev.CODE == "G1589";        }    }}
 |