123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- using DBHelper;
- using System;
- using System.Linq;
- using WCS.Core;
- using WCS.Entity;
- using WCS.Entity.Protocol;
- namespace WCS.Service.Works.Stations
- {
- [WorkTitle(typeof(ProductHandler), "拆子盘位", true)]
- internal class 拆子盘位 : DeviceWork<Device<IStation521, IStation520, IStation523>>
- {
- private Device<IRGV521> Rgv;
- public 拆子盘位()
- {
- Rgv = Device.Find("RGV3").Device<IRGV521>();
- }
- protected override bool SelectDevice(WCS_DEVICE obj)
- {
- return obj.Is(DF.拆盘) && obj.PalletType() != 4 && obj.CODE != "2198";
- }
- protected override void Do(Device<IStation521, IStation520, IStation523> dev)
- {
- if (!dev.Data3.Status.HasFlag(StationStatus.自动)) return;
- if (Ltc.Do(dev, v => v.Data2.RES == true))
- {
- return;
- }
- if (Ltc.Do(dev, v => v.Data.RES == true))//拆盘位RGV放货
- {
- DB.Do(db =>
- {
- var taskid = dev.Data.TASKNUM;
- var task = db.Default.Set<WCS_TASK>().Find(taskid);
- if (task != null)
- {
- if (task.STATUS < WCS.Entity.TaskStatus.已完成)
- {
- task.STATUS = WCS.Entity.TaskStatus.已完成;
- task.ENDTIME = DateTime.Now;
- //task.ADDRCURRENT = dev.Entity.CODE;
- db.Default.SaveChanges();
- }
- }
- dev.Data2.RES = true;
- });
- return;
- }
- if (Ltc.Do(dev, v => v.Data.PH_STATUS == false && v.Data.PH_STATUS2 == false && v.Data.REQUEST == false && v.Data.TASKNUM == 0))
- {//需要呼叫空托盘
- Ltc.Log("待呼叫托盘");
- if (Ltc.Do(Rgv, Rgv => Rgv.Data.WorkMode != RGVMode.自动))
- return;
- //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000,"拆盘")))
- // return;
- var palletType = dev.Entity.PalletType();
- if (palletType == 0)
- throw new Exception("托盘类型有误");
- var ret = DB.Do(db =>
- {
- var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库)
- .Where(v => v.ADDRTO == dev.Entity.CODE)
- .FirstOrDefault();
- if (task != null)
- return true;
- return false;
- });
- if (ret)
- return;
- var res = WMS.GetPalletOutTask(palletType, dev.Entity.CODE);
- DB.Do(db =>
- {
- //var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库)
- //.Where(v => v.ADDRTO == dev.Entity.CODE)
- //.FirstOrDefault();
- //if (task != null)
- // return;
- var sc = Device.Find(res.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
- var loc = string.Format("{0}-{1}-{2}", res.Row, res.Colomn, res.Layer);
- var task = new WCS_TASK
- {
- TYPE = TaskType.出库,
- STATUS = WCS.Entity.TaskStatus.新建,
- ADDRFROM = loc,
- ADDRTO = dev.Entity.CODE,
- BARCODE = res.ContainerBarCode,
- TUNNEL = res.TunnelNum,
- PALLETTYPE = palletType,
- WMSTASK = int.Parse(res.WMSTaskNum),
- FLOOR = 2,
- UPDATEUSER = "WCS",
- SCSTATION = res.Memo1,
- DEVICE = sc.CODE,
- //ADDRCURRENT = loc,
- ADDRNEXT = dev.Entity.CODE
- };
- db.Default.Set<WCS_TASK>().Add(task);
- db.Default.SaveChanges();
- dev.Data2.GOODSCODE = task.ID;//锁定
- });
- }
- else
- {
- Ltc.Log("已有托盘");
- if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
- {
- return;
- }
- if (Ltc.Do(dev, v => v.Data.REQUEST == true))
- {
- Ltc.Log("拆盘就绪");
- var arr = Device.Where(v => v.Is(DF.组盘)).Select(v => v.Device<IStation521, IStation520, IRobotStation>()).ToArray();
- arr = Ltc.Do(arr, arr => arr.Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).ToArray());
- if (arr.Length == 0)
- return;
- var palletType = dev.Entity.PalletType();
- var target = Ltc.Do(arr, arr => arr.Where(v => v.Data3.PalletType == palletType).FirstOrDefault());
- if (target == null)
- return;
- if (Ltc.Do(target, target => target.Data3.DocId == 0))
- return;
- if (Ltc.Do(dev, v => v.Data.TASKNUM == 0))
- return;
- var addrto = target.Entity.CODE;
- DB.Do(db =>
- {
- var hastask = db.Default.Set<WCS_TASK>().Where(v => v.ADDRTO == addrto && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.输送).Any();
- if (Ltc.Do(() => hastask == true))
- return;
- var task = db.Default.Set<WCS_TASK>().Find(dev.Data.TASKNUM);
- task = new WCS_TASK
- {
- TYPE = TaskType.输送,
- STATUS = WCS.Entity.TaskStatus.执行中,
- BARCODE = task.BARCODE,
- FLOOR = 2,
- PALLETTYPE = (short)palletType,
- FULLQTY = target.Data3.MaxQty,
- ADDRFROM = dev.Entity.CODE,
- ADDRTO = target.Entity.CODE,
- UPDATETIME = DateTime.Now,
- UPDATEUSER = "WCS",
- DOCID = target.Data3.DocId,
- //ADDRCURRENT = dev.Entity.CODE
- };
- db.Default.Set<WCS_TASK>().Add(task);
- db.Default.SaveChanges();
- dev.Data2.TASKNUM = task.ID;
- dev.Data2.GOODSEND = target.Entity.Code();
- dev.Data2.CONFIRM = true;
- });
- }
- }
- }
- }
- }
|