using DBHelper; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; 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.WebApi.ViewModels; 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 = (scid > 3 ? "TM" : "TY") + obj.StartTunnel; var task = new WCS_TASK { TYPE = TaskType.移库, STATUS = WCS.Entity.TaskStatus.新建, DEVICE = "SC" + obj.SRMNo.Last(), BARCODE = obj.PalletCode, ADDRFROM = obj.StartLocation, ADDRTO = obj.EndLocation, UPDATETIME = DateTime.Now, UPDATEUSER = "WMS", TUNNEL = tunnel, WMSTASK = int.Parse(obj.WMSTaskNo), }; 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 scid = int.Parse(obj.SRMNo.Last().ToString()); var tunnel = (scid > 3 ? "TM" : "TY") + obj.StartTunnel; var task = new WCS_TASK { TYPE = TaskType.出库, STATUS = WCS.Entity.TaskStatus.新建, DEVICE = "SC" + 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 }; if (task.ADDRTO == "2122") task.ADDRNEXT = "2108"; else if (task.ADDRTO == "2131") task.ADDRNEXT = "2366"; else if (task.ADDRTO == "2143") task.ADDRNEXT = "2385"; else if (task.ADDRTO == "2086") task.ADDRNEXT = "2325"; var next = Device.Find(tunnel).GetNext(task.ADDRTO); if (next == null) throw new Exception("创建失败"); task.SCSTATION = next.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.TASKNUM != 0 && p.Data.PH_STATUS) .Select(p => p.Data.TASKNUM); 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; } /// /// 通过该接口获取指定条件设备信息 /// /// 筛选条件 /// [HttpPost] 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 == model.TASKNUM)); result.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID == model.TASKNUM)); result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.TASKNUM == model.TASKNUM)); result.AddRange(GetDeviceStatusWhere(robot, v => v.Data.TaskID == model.TASKNUM)); } if (model.REQUEST != null) { result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.REQUEST == model.REQUEST)); } if (model.PH_STATUS != null) { result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID == model.TASKNUM)); result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.REQUEST == model.REQUEST)); } if (!string.IsNullOrEmpty(model.ADDRFROM)) { result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.StartPosition == 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 == 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.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 > 10000)); info.AddRange(GetDeviceStatusWhere(sc, v => v.Data.TaskID > 10000)); info.AddRange(GetDeviceStatusWhere(conv, v => v.Data.TASKNUM > 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; } /// /// 通过该接口获取wcs报警信息 /// /// /// [HttpPost] public List GetWcsAlarms(ALARMQUERY query) { var wcsAlarms = new List(); query.EQUNO = String.IsNullOrEmpty(query.EQUNO) ? "" : query.EQUNO; query.ALARMFUNC = String.IsNullOrEmpty(query.ALARMFUNC) ? "" : query.ALARMFUNC; query.ALARMS = String.IsNullOrEmpty(query.ALARMS) ? "" : query.ALARMS; query.ALARMTYPE = String.IsNullOrEmpty(query.ALARMTYPE) ? "" : query.ALARMTYPE; query.WCSTASKNO = String.IsNullOrEmpty(query.WCSTASKNO) ? "" : query.WCSTASKNO; try { DB.Do(db => { var scAlarms = db.Default.Set() .Where(v => "设备报警".Contains(query.ALARMTYPE)) .Where(v => v.SCAlarm > 0) .Where(v => v.DEVICECODE.Contains(query.EQUNO)) .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList() .Where(v => v.SCAlarm.ToString().Contains(query.ALARMS)); var stationAlarms = db.Default.Set() .Where(v => "设备报警".Contains(query.ALARMTYPE)) .Where(v => v.Fault > 0) .Where(v => v.DEVICECODE.Contains(query.EQUNO)) .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList() .Where(v => v.Fault.ToString().Contains(query.ALARMS)); var rgvAlarms = db.Default.Set() .Where(v => "设备报警".Contains(query.ALARMTYPE)) .Where(v => v.Fault > 0) .Where(v => v.DEVICECODE.Contains(query.EQUNO)) .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList() .Where(v => v.Fault.ToString().Contains(query.ALARMS)); var exception = db.Default.Set() .Where(v => "系统异常".Contains(query.ALARMTYPE)) .Where(v => query.STARTTIME <= v.UPDATETIME && query.ENTTIME >= v.UPDATETIME).ToList() .Where(v => v.MSG.Contains(query.ALARMS)); foreach (var a in scAlarms) { wcsAlarms.Add(new V_WCSALARM { EQUNO = a.DEVICECODE, ALARMS = a.SCAlarm.ToString(), WCSTASKNO = "", TIME = a.UPDATETIME, ALARMTYPE = "设备报警", ALARMFUNC = "" }); } foreach (var a in stationAlarms) { wcsAlarms.Add(new V_WCSALARM { EQUNO = a.DEVICECODE, ALARMS = a.Fault.ToString(), WCSTASKNO = "", TIME = a.UPDATETIME, ALARMTYPE = "设备报警", ALARMFUNC = "" }); } foreach (var a in rgvAlarms) { wcsAlarms.Add(new V_WCSALARM { EQUNO = a.DEVICECODE, ALARMS = a.Fault.ToString(), WCSTASKNO = "", TIME = a.UPDATETIME, ALARMTYPE = "设备报警", ALARMFUNC = "" }); } foreach (var a in exception) { wcsAlarms.Add(new V_WCSALARM { EQUNO = "", ALARMS = a.MSG.ToString(), WCSTASKNO = "", TIME = a.UPDATETIME, ALARMTYPE = "系统异常", ALARMFUNC = "" }); } }); } catch (Exception ex) { throw new Exception(ex.Message); } return wcsAlarms; } #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, PH_STATUS = device.Data.PH_Status, ADDRFROM = device.Data.StartPosition.ToString(), ADDRTO = device.Data.DestPosition.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.TASKNUM, REQUEST = device.Data.REQUEST, PH_STATUS = device.Data.PH_STATUS, ADDRTO = device.Data.GOODSEND.ToString(), WEIGTH = device.Data.GOODSCODE / 10 }; })); 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 静态方法 } }