using DBHelper; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; 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); } 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 = TaskStatus.新建, DEVICE = "SRM" + obj.SRMNo.Last(), BARCODE = obj.PalletCode, ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}", ADDRTO = obj.EndLocation, UPDATETIME = DateTime.Now, UPDATEUSER = "WMS", TUNNEL = tunnel, WMSTASK = int.Parse(obj.WMSTaskNo), ADDRNEXT = obj.EndLocation, Length = obj.Length, MaterialCode = obj.MaterialCode, FLOOR = obj.EndLocation == "G1340" ? 1 : 2 }; task.TaskGetSrmStation(); //task.GetSrmStationAndaddNext(SrmFork.货叉1); //task.SRMSTATION = Device.Where(v => v.IsDevGroup()).FirstOrDefault(v => v.DEVICEGROUP.Any(b => b.MEMBER.CODE == task.SRMSTATION))?.CODE; //task.ADDRNEXT = string.Empty; db.Default.Add(task); } 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(); }); 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; } /// /// 通过该接口获取指定条件设备信息 /// /// 筛选条件 /// //[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()); // #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)); // } // if (model.TASKNUM > 10000) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM)); // result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID_1 == model.TASKNUM)); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum == model.TASKNUM)); // } // if (model.PH_STATUS != null) // { // result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM)); // } // 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_1.ToString()) // || model.ADDRFROM.Contains(v.Data.SCol_1.ToString()) // || model.ADDRFROM.Contains(v.Data.SLayer_1.ToString()))); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsstart ==short.Parse(model.ADDRFROM))); // } // 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_1.ToString()) // || model.ADDRTO.Contains(v.Data.ECol_1.ToString()) // || model.ADDRTO.Contains(v.Data.ELayer_1.ToString()))); // result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Goodsend == 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_1 > 10000)); // info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum > 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.SystemStatus.HasFlag(RGVStatus.光电), // 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_1, // ADDRFROM = $"{device.Data.SLine_1}-{device.Data.SCol_1}-{device.Data.SLayer_1}", // ADDRTO = device.Data.ELine_1.ToString(), // }; // if (device.Data.ECol_1 != 0 && device.Data.ELayer_1 != 0) // info.ADDRTO = $"{device.Data.ELine_1}-{device.Data.ECol_1}-{device.Data.ELayer_1}"; // 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.Tasknum, // ADDRFROM =device.Data.Goodsstart.ToString(), // ADDRTO = device.Data.Goodsend.ToString(), // }; // })); // return result; //} #endregion 静态方法 } }