using DBHelper; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Service.Entity; using WCS.Service.Extensions; namespace WCS.Service.WebApi { [ApiController] [Route("[controller]/[action]")] public class WCSApi : ControllerBase { [HttpPost] public WcsContractApiResponse I_WMS_CreateTasks(List list) { var res = new WcsContractApiResponse(); try { DB.Do(db => { foreach (var obj in list) { if (obj.TaskType == "3")//移库任务 { var wmstaskid = int.Parse(obj.WMSTaskNo); if (db.Default.Set().Any(v => v.WMSTASK == wmstaskid)) throw new Exception("任务号" + wmstaskid + "重复下发"); var scid = int.Parse(obj.SRMNo.Last().ToString()); var tunnel = "TY" + obj.StartTunnel; var task = new WCS_TASK { TYPE = TaskType.移库, STATUS = WCS.Entity.TaskStatus.新建, DEVICE = "SRM" + obj.SRMNo.Last(), BARCODE = obj.PalletCode, ADDRFROM = obj.StartLocation, ADDRTO = obj.EndLocation, UPDATETIME = DateTime.Now, UPDATEUSER = "WMS", TUNNEL = tunnel, WMSTASK = int.Parse(obj.WMSTaskNo), TaskGroupKey = obj.TaskGroupKey }; db.Default.Add(task); db.Default.SaveChanges(); //task.CreateStatusLog(db); } else if (obj.TaskType == "2") { //出库任务 var wmstaskid = int.Parse(obj.WMSTaskNo); if (db.Default.Set().Any(v => v.WMSTASK == wmstaskid)) throw new Exception("任务号" + wmstaskid + "重复下发"); var tunnel = "TY" + obj.SRMNo.Last(); var task = new WCS_TASK { TYPE = TaskType.出库, STATUS = WCS.Entity.TaskStatus.新建, DEVICE = "SRM" + obj.SRMNo.Last(), BARCODE = obj.PalletCode, ADDRFROM = string.Format("{0}-{1}-{2}", obj.StartRow, obj.StartCol, obj.StartLayer), ADDRTO = obj.EndLocation, UPDATETIME = DateTime.Now, UPDATEUSER = "WMS", TUNNEL = tunnel, WMSTASK = int.Parse(obj.WMSTaskNo), ADDRNEXT = obj.EndLocation }; //当前货物可以使用的放货点 var deliveryPoints = Device.Find(task.DEVICE).Create().GetDeliveryPoint(); //确定放货站台 通过设备组关联 此时一定是一组设备组 //结果为堆垛机放货设备组 var group = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == task.ADDRTO)).SelectMany(v => v.DEVICEGROUP).Select(v => v.MEMBER); //结果为当前堆垛机可用设备 此时会是两个单独的设备 deliveryPoints = deliveryPoints.Where(v => group.Contains(v.Entity)).OrderByDescending(v => v.Entity.CODE).ToList(); var addrTo = Device.Find(task.ADDRTO).Create().Items.ToArray(); //判断是否可以到达 //确定当前工位的货物是一工位还是二工位 if (obj.StartCol.ToShort().OddNumberOrEven()) { //一工位 也是设备在堆垛机放货后的第一个地点 task.SRMSTATION = deliveryPoints[0].Entity.CODE; if (deliveryPoints[0].Entity.PATHS.Any(v => v.END == addrTo[0].Entity)) task.ADDRTO = addrTo[0].Entity.CODE; else task.ADDRNEXT = addrTo[0].Entity.CODE; } else { //二工位 task.SRMSTATION = deliveryPoints[1].Entity.CODE; if (deliveryPoints[1].Entity.PATHS.Any(v => v.END == addrTo[0].Entity)) task.ADDRTO = addrTo[0].Entity.CODE; else task.ADDRNEXT = addrTo[1].Entity.CODE; } db.Default.Add(task); db.Default.SaveChanges(); //task.CreateStatusLog(db); } else if (obj.TaskType == "1") {//入库任务 var wmstaskid = int.Parse(obj.WMSTaskNo); if (db.Default.Set().Any(v => v.WMSTASK == wmstaskid)) throw new Exception("任务号" + wmstaskid + "重复下发"); if (obj.StartLocation.Contains("_Back_")) {//生成AGV入库任务 var ws = int.Parse(obj.StartLocation.Split('_')[1]); var agvtask = new WCS_AGVTask { AGVStatus = AGVTaskStatus.新建, Status = AGVTaskStatus.新建, Position = obj.StartLocation, TaskType = AGVTaskType.入库, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, Workshop = ws, }; if (ws == 13 || ws == 14) { agvtask.Station = "2088"; agvtask.Workshop = 1314; } else if (ws == 1) { agvtask.Station = "2122"; } else if (ws == 2) agvtask.Station = "2131"; else if (ws == 3) agvtask.Station = "2143"; db.Default.Set().Add(agvtask); db.Default.SaveChanges(); } else { var task = new WCS_TASK { TYPE = TaskType.入库, STATUS = WCS.Entity.TaskStatus.新建, BARCODE = obj.PalletCode, ADDRFROM = obj.StartLocation, ADDRTO = obj.EndLocation, UPDATETIME = DateTime.Now, UPDATEUSER = "WMS", WMSTASK = int.Parse(obj.WMSTaskNo) }; db.Default.Add(task); db.Default.SaveChanges(); //task.CreateStatusLog(db); } } } }); res.ResType = true; } catch (Exception ex) { res.ResMessage = ex.GetBaseException().Message; } return res; } [HttpPost] public WcsContractApiResponse I_WMS_CreateAGVTask(PushCreateAGVTaskRequest obj) { var res = new WcsContractApiResponse(); try { DB.Do(db => { if (obj.Type == 1) { var ws = int.Parse(obj.StartPos.Split('_')[1]); var agvtask = new WCS_AGVTask { AGVStatus = AGVTaskStatus.新建, Status = AGVTaskStatus.新建, Position = obj.StartPos, TaskType = AGVTaskType.入库, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, Workshop = ws, }; if (ws == 13 || ws == 14) { agvtask.Station = "2088"; agvtask.Workshop = 1314; } else if (ws == 1) { agvtask.Station = "2122"; } else if (ws == 2) agvtask.Station = "2131"; else if (ws == 3) agvtask.Station = "2143"; db.Default.Set().Add(agvtask); db.Default.SaveChanges(); } else throw new Exception($"类型{obj.Type}不支持"); }); res.ResType = true; } catch (Exception ex) { res.ResMessage = ex.GetBaseException().Message; } return res; } [HttpPost] public WcsContractApiResponse I_CancelWCSTaskByCode(string code) { var res = new WcsContractApiResponse(); try { DB.Do(db => { var task = db.Default.Set().Where(v => v.BARCODE == code && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.组盘).FirstOrDefault(); if (task == null) throw new Exception("WCS任务不存在"); task.STATUS = WCS.Entity.TaskStatus.已取消; task.UPDATETIME = DateTime.Now; task.UPDATEUSER = "RF"; db.Default.SaveChanges(); }); res.ResType = true; } catch (Exception ex) { res.ResMessage = ex.GetBaseException().Message; } return res; } [HttpPost] public WcsContractApiResponse I_CancelWCSTaskByID(int wmstaskId) { var res = new WcsContractApiResponse(); try { DB.Do(db => { var task = db.Default.Set().Where(v => v.WMSTASK == wmstaskId).FirstOrDefault(); if (task == null) throw new Exception("WCS任务不存在"); if (task.STATUS != WCS.Entity.TaskStatus.新建) throw new Exception("WCS任务当前状态不允许取消"); task.STATUS = WCS.Entity.TaskStatus.已取消; task.UPDATETIME = DateTime.Now; task.UPDATEUSER = "WMS"; db.Default.SaveChanges(); if (task.TYPE == TaskType.出库 && task.AgvTask > 0) { var agvtask = db.Default.Set().Find(task.AgvTask); agvtask.Status = AGVTaskStatus.取消; agvtask.UpdateTime = DateTime.Now; db.Default.SaveChanges(); } }); res.ResType = true; } catch (Exception ex) { res.ResMessage = ex.GetBaseException().Message; } return res; } ///// ///// WMS 通过该接口获取码垛位当前各位置对应的托盘码 ///// ///// //[HttpGet] //public List> I_WMS_GetPalletCode() //{ // //找出所有组盘站台信息 // var station = Device.Where(v => v.Is(DF.组盘)).ToList(); // //找出所有有光电信号站台中的任务号 // var taskNumbers = station.Select(v => v.Device()) // .Where(p => p.Data.G_TaskId != 0 && p.Data.G_PhStatus) // .Select(p => p.Data.G_TaskId); // var result = new List>(); // DB.Do(db => // { // //找到有光电的位置对应的任务 // var tasks = db.Default.Set().AsNoTracking().Where(task => taskNumbers.Any(x => task.ID == x)).ToList(); // station.ForEach(p => // { // var value = tasks.FirstOrDefault(task => task.ADDRTO == p.CODE); // result.Add(new KeyValueViewModel() // { // Key = p.CODE, // Value = value == null ? null : value.BARCODE, // }); // }); // }); // return result; //} ///// ///// 通过该接口获取指定条件设备信息 ///// ///// 筛选条件 ///// //[HttpGet] //public List GetDeviceStatus([FromQuery] DeviceStatusViewModel model) //{ // var result = new List(); // //找到所有设备的读取协议 // var rgv = Device.Where(v => v.IsRGV()).Select(v => v.Device()); // //var sc = Device.Where(v => v.IsSC()).Select(v => v.Device()); // var conv = Device.Where(v => v.IsConv()).Select(v => v.Device()); // //var robot = Device.Where(v => v.IsRobot()).Select(v => v.Device()); // #region 检索分两部分,设备、任务(数据库) // #region 设备信息 // if (!string.IsNullOrEmpty(model.CODE)) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Entity.CODE == model.CODE)); // //result.AddRange(GetDeviceStatusWhere(sc, v => v.Entity.CODE == model.CODE)); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Entity.CODE == model.CODE)); // //result.AddRange(GetDeviceStatusWhere(robot, v => v.Entity.CODE == model.CODE)); // } // if (model.TASKNUM > 10000) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM)); // //result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID == model.TASKNUM)); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.G_TaskId == model.TASKNUM)); // //result.AddRange(GetDeviceStatusWhere(robot, v => v.Data.TaskID == model.TASKNUM)); // } // if (model.REQUEST != null) // { // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.G_Request == model.REQUEST)); // } // if (model.PH_STATUS != null) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM)); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.G_Request == model.REQUEST)); // } // if (!string.IsNullOrEmpty(model.ADDRFROM)) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.StartPosition_1 == short.Parse(model.ADDRFROM))); // //result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRFROM.Contains(v.Data.SLine.ToString()) // // || model.ADDRFROM.Contains(v.Data.SCol.ToString()) // // || model.ADDRFROM.Contains(v.Data.SLayer.ToString()))); // } // if (!string.IsNullOrEmpty(model.ADDRTO)) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.DestPosition_1 == short.Parse(model.ADDRTO))); // //result.AddRange(GetDeviceStatusWhere(sc, v => model.ADDRTO.Contains(v.Data.ELine.ToString()) // // || model.ADDRTO.Contains(v.Data.ECol.ToString()) // // || model.ADDRTO.Contains(v.Data.ELayer.ToString()))); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.G_GoodsEnd == short.Parse(model.ADDRTO))); // //result.AddRange(GetDeviceStatusWhere(robot, v => v.Data.Target == short.Parse(model.ADDRTO))); // } // #endregion 设备信息 // #region 任务信息 // //获取所有设备上的任务信息 // if (model.TYPE != null || !string.IsNullOrEmpty(model.BARCODE)) // { // var info = new List(); // var ids = result.Select(v => v.TASKNUM); // info.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 > 10000)); // //info.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID > 10000)); // info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.G_TaskId > 10000)); // //info.AddRange(GetDeviceStatusWhere(robot, v => v.Data.TaskID > 10000)); // result.AddRange(info.Where(v => !ids.Any(b => b == v.TASKNUM))); // } // DB.Do(db => // { // var ids = result.Select(v => v.TASKNUM); // var tasks = db.Default.Set().AsNoTracking().Where(v => ids.Any(b => b == v.ID)).ToList(); // tasks.ForEach(task => // { // var info = result.Find(v => v.TASKNUM == task.ID); // info.TYPE = task.TYPE; // info.BARCODE = task.BARCODE; // }); // }); // if (model.TYPE != null) // { // result = result.Where(v => v.TYPE == model.TYPE).ToList(); // } // if (!string.IsNullOrEmpty(model.BARCODE)) // { // result = result.Where(v => v.BARCODE != null && v.BARCODE.Contains(model.BARCODE)).ToList(); // } // #endregion 任务信息 // #endregion 检索分两部分,设备、任务(数据库) // return result; //} #region 静态方法 ///// ///// 获取RGV设备信息 ///// ///// ///// ///// //public static List GetDeviceStatusWhere(IEnumerable> soue, Func, bool> func) //{ // var result = new List(); // result.AddRange(soue.Where(func).Select(device => // { // return new DeviceStatusViewModel // { // CODE = device.Entity.CODE, // TASKNUM = device.Data.TaskID_1, // PH_STATUS = device.Data.PH_Status_1, // ADDRFROM = device.Data.StartPosition_1.ToString(), // ADDRTO = device.Data.DestPosition_1.ToString(), // }; // })); // return result; //} ///// ///// 获取堆垛机设备信息 ///// ///// ///// ///// //public static List GetDeviceStatusWhere(IEnumerable> soue, Func, bool> func) //{ // var result = new List(); // result.AddRange(soue.Where(func).Select(device => // { // var info = new DeviceStatusViewModel // { // CODE = device.Entity.CODE, // TASKNUM = device.Data.TaskID, // ADDRFROM = $"{device.Data.SLine}-{device.Data.SCol}-{device.Data.SLayer}", // ADDRTO = device.Data.ELine.ToString(), // }; // if (device.Data.ECol != 0 && device.Data.ELayer != 0) // info.ADDRTO = $"{device.Data.ELine}-{device.Data.ECol}-{device.Data.ELayer}"; // return info; // })); // return result; //} ///// ///// 获取输送机设备信息 ///// ///// ///// ///// //public static List GetDeviceStatusWhere(IEnumerable> soue, Func, bool> func) //{ // var result = new List(); // result.AddRange(soue.Where(func).Select(device => // { // return new DeviceStatusViewModel // { // CODE = device.Entity.CODE, // TASKNUM = device.Data.G_TaskId, // REQUEST = device.Data.G_Request, // PH_STATUS = device.Data.G_PhStatus, // ADDRTO = device.Data.G_GoodsEnd.ToString(), // }; // })); // return result; //} ///// ///// 获取机械臂设备信息 ///// ///// ///// ///// //public static List GetDeviceStatusWhere(IEnumerable> soue, Func, bool> func) //{ // var result = new List(); // result.AddRange(soue.Where(func).Select(device => // { // return new DeviceStatusViewModel // { // CODE = device.Entity.CODE, // TASKNUM = device.Data.TaskID, // ADDRTO = device.Data.Trigger.ToString(), // }; // })); // return result; //} #endregion 静态方法 } }