123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633 |
- 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<PushCreateWcsTaskRequest> 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<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
- throw new Exception("任务号" + wmstaskid + "重复下发");
- var scid = int.Parse(obj.SRMNo.Last().ToString());
- //var tunnel = ((scid > 3 && scid < 6) ? "TM" : "TY") + obj.StartTunnel;
- var tunnel = "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<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
- throw new Exception("任务号" + wmstaskid + "重复下发");
- var scid = int.Parse(obj.SRMNo.Last().ToString());
- //var tunnel = ((scid > 3 && scid < 6) ? "TM" : "TY") + obj.StartTunnel;
- var tunnel = "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";
- else if (task.ADDRTO == "3001")
- task.ADDRNEXT = "3045";
- if (task.ADDRTO == "3001")
- {
- var next = Device.Find(tunnel).GetNext(task.ADDRNEXT);
- if (next == null)
- throw new Exception("创建失败");
- task.SCSTATION = next.CODE;
- db.Default.Add(task);
- db.Default.SaveChanges();
- }
- else
- {
- 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<WCS_TASK>().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";
- else if (ws == 22)
- agvtask.Station = "3001";
- db.Default.Set<WCS_AGVTask>().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<WCS_AGVTask>().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<WCS_TASK>().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<WCS_TASK>().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<WCS_AGVTask>().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;
- }
- /// <summary>
- /// WMS 通过该接口获取码垛位当前各位置对应的托盘码
- /// </summary>
- /// <returns></returns>
- [HttpGet]
- public List<KeyValueViewModel<string, string>> I_WMS_GetPalletCode()
- {
- //找出所有组盘站台信息
- var station = Device.Where(v => v.Is(DF.组盘)).ToList();
- //找出所有有光电信号站台中的任务号
- var taskNumbers = station.Select(v => v.Device<IStation521, IStation520>())
- .Where(p => p.Data.TASKNUM != 0 && p.Data.PH_STATUS)
- .Select(p => p.Data.TASKNUM);
- var result = new List<KeyValueViewModel<string, string>>();
- DB.Do(db =>
- {
- //找到有光电的位置对应的任务
- var tasks = db.Default.Set<WCS_TASK>().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<string, string>()
- {
- Key = p.CODE,
- Value = value == null ? null : value.BARCODE,
- });
- });
- });
- return result;
- }
- /// <summary>
- /// 通过该接口获取指定条件设备信息
- /// </summary>
- /// <param name="model">筛选条件</param>
- /// <returns></returns>
- [HttpPost]
- public List<DeviceStatusViewModel> GetDeviceStatus([FromQuery] DeviceStatusViewModel model)
- {
- var result = new List<DeviceStatusViewModel>();
- //找到所有设备的读取协议
- var rgv = Device.Where(v => v.IsRGV()).Select(v => v.Device<IRGV521>());
- var sc = Device.Where(v => v.IsSC()).Select(v => v.Device<ISC521>());
- var conv = Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>());
- var robot = Device.Where(v => v.IsRobot()).Select(v => v.Device<IRobot>());
- #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<DeviceStatusViewModel>();
- 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<WCS_TASK>().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;
- }
- /// <summary>
- /// 通过该接口获取wcs报警信息
- /// </summary>
- /// <param name="query"></param>
- /// <returns></returns>
- [HttpPost]
- public List<V_WCSALARM> GetWcsAlarms(ALARMQUERY query)
- {
- var wcsAlarms = new List<V_WCSALARM>();
- 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<WCS_SC537>()
- .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<WCS_STATION523>()
- .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<WCS_RGV523>()
- .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<WCS_EXCEPTION>()
- .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 静态方法
- /// <summary>
- /// 获取RGV设备信息
- /// </summary>
- /// <param name="soue"></param>
- /// <param name="func"></param>
- /// <returns></returns>
- public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRGV521>> soue, Func<Device<IRGV521>, bool> func)
- {
- var result = new List<DeviceStatusViewModel>();
- 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;
- }
- /// <summary>
- /// 获取堆垛机设备信息
- /// </summary>
- /// <param name="soue"></param>
- /// <param name="func"></param>
- /// <returns></returns>
- public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<ISC521>> soue, Func<Device<ISC521>, bool> func)
- {
- var result = new List<DeviceStatusViewModel>();
- 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;
- }
- /// <summary>
- /// 获取输送机设备信息
- /// </summary>
- /// <param name="soue"></param>
- /// <param name="func"></param>
- /// <returns></returns>
- public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IStation521>> soue, Func<Device<IStation521>, bool> func)
- {
- var result = new List<DeviceStatusViewModel>();
- 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;
- }
- /// <summary>
- /// 获取机械臂设备信息
- /// </summary>
- /// <param name="soue"></param>
- /// <param name="func"></param>
- /// <returns></returns>
- public static List<DeviceStatusViewModel> GetDeviceStatusWhere(IEnumerable<Device<IRobot>> soue, Func<Device<IRobot>, bool> func)
- {
- var result = new List<DeviceStatusViewModel>();
- 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 静态方法
- }
- }
|