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), "月台扫码")] class 月台扫码:DeviceWork> { protected override bool SelectDevice(WCS.Entity.WCS_DEVICE dev) { return dev.Is(DF.扫码) && dev.CODE == "2265"; } protected override void Do(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var bcrDev = Device.Find("BCR" + dev.Entity.CODE); var bcr = bcrDev.PROTOCOLS.First().Data(); var barcode = bcr.CONTENT.Trim('\r'); if (Ltc.Do(barcode, barcode => string.IsNullOrEmpty(barcode))) {//扫码失败,退回 dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = -1; dev.Data2.CONFIRM = true; return; } var rgv = dev.Entity.ROUTES.Select(v => v.NEXT).Where(v => v.IsRGV()).FirstOrDefault(); var arr = rgv.ROUTES.Select(v => v.NEXT).Where(v => v.ROUTES.Any(d => d.NEXT.IsTunnel())).ToArray(); var endStations = arr.Select(v => v.Device()).ToArray(); endStations = Ltc.Do(endStations, arr => arr.Where(v => v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false).ToArray()); endStations = endStations.Where(v => v.Data.TASKNUM == 0 && !v.Data.PH_STATUS).ToArray(); if (endStations.Length == 0) { return; } //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(10000, "月台扫码"))) // return; var resp = WMS.InBound(barcode, dev.Entity.CODE, true); var target = resp.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.TunnelNum().ToString() == v)) .Where(v => v != null) .Select(v => new { Conv = v, SC = v.Entity.ROUTES.First().NEXT.ROUTES.Where(v => v.NEXT.IsSC()).First().NEXT.Device() }) .OrderBy(v => v.Conv.Entity.TunnelNum() == 2 ? 0 : 1) .ThenBy(v=> { try { return v.SC.Data.Tunnel == v.Conv.Entity.TunnelNum() ? 0 : 1; } catch { return 99; } }) .Select(v => v.Conv) .FirstOrDefault(); if (target == null) { throw new Exception("路径计算失败"); } DB.Do(db => { var task = new WCS_TASK { TYPE = TaskType.入库, STATUS = WCS.Entity.TaskStatus.执行中, BARCODE = barcode, TUNNEL = target.Entity.Tunnel(), ADDRFROM = dev.Entity.CODE, WMSTASK = int.Parse(resp.WMSTaskNum), UPDATETIME = DateTime.Now, UPDATEUSER = "WCS", ADDRTO = target.Entity.CODE, FLOOR = 1, //ADDRCURRENT = dev.Entity.CODE }; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.GOODSEND = target.Entity.Code(); dev.Data2.TASKNUM = task.ID; dev.Data2.CONFIRM = true; }); } } }