Merge branch 'master' of http://47.95.120.53:8083/r/WCSNet6
| | |
| | | } |
| | | public class PlcPositionInfo |
| | | { |
| | | /// <summary> |
| | | /// 工位号 |
| | | /// </summary> |
| | | public string StationNum { get; set; } |
| | | /// <summary> |
| | | /// 是否有物品 |
| | | /// </summary> |
| | | public bool BoHaveItem { get; set; } |
| | | /// <summary> |
| | | /// Plc类型 |
| | | /// </summary> |
| | | public PLCTypeEnum Type { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 跺机位置 |
| | | /// </summary> |
| | | public int BoxHeight { get; set; } |
| | | public string EndLocat { get; set; } |
| | | } |
| | |
| | | BoOffline = PLCTaskAction.boOffline, |
| | | BoDemo = PLCTaskAction.boDemo, |
| | | BoDrumReversal = PLCTaskAction.boDrumReversal, |
| | | BoOutLock=PLCTaskAction.boOutLock, |
| | | BoEnterLock=PLCTaskAction.boEnterLock, |
| | | Error = "与PCL交互失败,操作失败!" |
| | | }); |
| | | return; |
| | |
| | | BoOffline = PLCTaskAction.boOffline, |
| | | BoDemo = PLCTaskAction.boDemo, |
| | | BoDrumReversal = PLCTaskAction.boDrumReversal, |
| | | BoOutLock = PLCTaskAction.boOutLock, |
| | | BoEnterLock = PLCTaskAction.boEnterLock, |
| | | Error = "PCL未连接,操作失败!" |
| | | }); |
| | | return; |
| | |
| | | BoOffline = PLCTaskAction.boOffline, |
| | | BoDemo = PLCTaskAction.boDemo, |
| | | BoDrumReversal = PLCTaskAction.boDrumReversal, |
| | | BoOutLock=PLCTaskAction.boOutLock, |
| | | BoEnterLock=PLCTaskAction.boEnterLock, |
| | | Error = "与PCL交互失败,操作失败!" |
| | | }); |
| | | return; |
| | |
| | | BoOffline = PLCTaskAction.boOffline, |
| | | BoDemo = PLCTaskAction.boDemo, |
| | | BoDrumReversal = PLCTaskAction.boDrumReversal, |
| | | BoOutLock = PLCTaskAction.boOutLock, |
| | | BoEnterLock = PLCTaskAction.boEnterLock, |
| | | Error = "PCL未连接,操作失败!" |
| | | }); |
| | | return; |
| | | } |
| | | } |
| | | await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal }); |
| | | //出库锁定 |
| | | if (context.BoOutLock.HasValue) |
| | | { |
| | | PLCTaskAction.boOutLock = context.BoOutLock.Value; |
| | | await _sysConfigService.UpdateConfigValue("sys_BoOutLock", context.BoOutLock.Value); |
| | | } |
| | | //入库锁定 |
| | | if (context.BoEnterLock.HasValue) |
| | | { |
| | | PLCTaskAction.boEnterLock = context.BoEnterLock.Value; |
| | | await _sysConfigService.UpdateConfigValue("sys_BoEnterLock", context.BoEnterLock.Value); |
| | | } |
| | | await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock }); |
| | | } |
| | | } |
| | | public class PLCServiceModel |
| | | { |
| | | public bool? BoRunningState { get; set; } |
| | | |
| | | |
| | | public bool? BoOffline { get; set; } |
| | | |
| | | |
| | | public bool? BoRefresh { get; set; } |
| | | |
| | | public bool? BoDemo { get; set; } |
| | | |
| | | public bool? BoDrumReversal { get; set; } |
| | | |
| | | public bool? BoOutLock { get; set; } |
| | | |
| | | public bool? BoEnterLock { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 错误信息 |
| | | /// </summary> |
New file |
| | |
| | | using IoTClient; |
| | | using IoTClient.Clients.Modbus; |
| | | using IoTClient.Common.Enums; |
| | | using IoTClient.Enums; |
| | | using IoTClient.Models; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WCS.Application; |
| | | /// <summary> |
| | | /// Modbus |
| | | /// </summary> |
| | | public class ModbusUtil |
| | | { |
| | | public readonly long PlcId; |
| | | public readonly string PlcIP; |
| | | private ModbusTcpClient _client; |
| | | private WcsPlc _modPlc; |
| | | private readonly object OLock = new object(); |
| | | public ModbusUtil(WcsPlc modPlc) |
| | | { |
| | | //测试代码 |
| | | //WCS.Application.ModbusUtil modUtil = new WCS.Application.ModbusUtil(new WCS.Application.WcsPlc() { IP = "127.0.0.1", Port = 502 }); |
| | | //var result = modUtil.GetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4"); |
| | | //Console.WriteLine(result.value); |
| | | //var result2 = modUtil.SetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4", "44"); |
| | | //Console.WriteLine(result2.IsSucceed); |
| | | |
| | | PlcId = modPlc.Id; |
| | | PlcIP = modPlc.IP; |
| | | _modPlc = modPlc; |
| | | _client = new ModbusTcpClient(modPlc.IP, modPlc.Port); |
| | | _client.Open(); |
| | | } |
| | | |
| | | public bool Connected |
| | | { |
| | | get { return _client.Connected; } |
| | | } |
| | | public IoTClient.Result Open() |
| | | { |
| | | return _client.Open(); |
| | | } |
| | | public IoTClient.Result Close() |
| | | { |
| | | return _client.Close(); |
| | | } |
| | | /// <summary> |
| | | /// 读取PLC值 |
| | | /// </summary> |
| | | /// <param name="PosType">字符类型</param> |
| | | /// <param name="Pos">偏移量/地址</param> |
| | | /// <param name="StationNumber">站号</param> |
| | | /// <returns></returns> |
| | | public (IoTClient.Result, dynamic value) GetDBValue(PLCDataTypeEnum PosType, string Pos, byte StationNumber = 1) |
| | | { |
| | | lock (OLock) |
| | | { |
| | | dynamic result = null; |
| | | switch (PosType) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | result = _client.ReadCoil(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Byte: |
| | | result = _client.ReadDiscrete(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Short: |
| | | result = _client.ReadInt16(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.UShort: |
| | | result = _client.ReadUInt16(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Int: |
| | | result = _client.ReadInt32(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.UInt: |
| | | result = _client.ReadUInt32(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Long: |
| | | result = _client.ReadInt64(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.ULong: |
| | | result = _client.ReadUInt64(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Float: |
| | | result = _client.ReadFloat(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.Double: |
| | | result = _client.ReadDouble(Pos, StationNumber); |
| | | break; |
| | | case PLCDataTypeEnum.String: |
| | | result = _client.ReadString(Pos, StationNumber); |
| | | break; |
| | | default: |
| | | result = new IoTClient.Result<object>(); |
| | | break; |
| | | } |
| | | return (result, result.Value); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 批量读取PLC值 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public Result<List<ModbusOutput>> GetBatchDBValue(Dictionary<string, PLCDataTypeEnum> listaddress) |
| | | { |
| | | lock (OLock) |
| | | { |
| | | var list = new List<ModbusInput>(); |
| | | foreach (var address in listaddress) |
| | | { |
| | | switch (address.Value) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Bool, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Byte: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Byte, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Short: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int16, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.UShort: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt16, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Int: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int32, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.UInt: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt32, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Long: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Int64, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.ULong: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.UInt64, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Float: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Float, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.Double: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.Double, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | case PLCDataTypeEnum.String: |
| | | list.Add(new ModbusInput() |
| | | { |
| | | Address = address.Key, |
| | | DataType = DataTypeEnum.String, |
| | | FunctionCode = 3, |
| | | StationNumber = 1 |
| | | }); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | return _client.BatchRead(list); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 写入PLC值 |
| | | /// </summary> |
| | | /// <param name="PosType">字符类型</param> |
| | | /// <param name="Pos">偏移量/地址</param> |
| | | /// <param name="Value">写入值</param> |
| | | /// <param name="StationNumber">站号</param> |
| | | /// <returns></returns> |
| | | public IoTClient.Result SetDBValue(PLCDataTypeEnum PosType, string Pos, string Value, byte StationNumber = 1) |
| | | { |
| | | switch (PosType) |
| | | { |
| | | case PLCDataTypeEnum.Bit: |
| | | if (!bool.TryParse(Value, out bool bit)) |
| | | { |
| | | if (Value == "0") |
| | | bit = false; |
| | | else if (Value == "1") |
| | | bit = true; |
| | | else |
| | | { |
| | | throw new Exception("写入值错误"); |
| | | } |
| | | } |
| | | return _client.Write(Pos, bit, StationNumber); |
| | | case PLCDataTypeEnum.Byte: |
| | | return _client.Write(Pos, byte.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Short: |
| | | return _client.Write(Pos, short.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.UShort: |
| | | return _client.Write(Pos, ushort.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Int: |
| | | return _client.Write(Pos, int.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.UInt: |
| | | return _client.Write(Pos, uint.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Long: |
| | | return _client.Write(Pos, long.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.ULong: |
| | | return _client.Write(Pos, ulong.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Float: |
| | | return _client.Write(Pos, float.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.Double: |
| | | return _client.Write(Pos, float.Parse(Value), StationNumber); |
| | | case PLCDataTypeEnum.String: |
| | | return _client.Write(Pos, Value, StationNumber); |
| | | default: |
| | | return new IoTClient.Result(); |
| | | } |
| | | } |
| | | } |
| | |
| | | // 跺机空闲,获取出库任务、移库任务 |
| | | { |
| | | // 获取任务信息 |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Desc) |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Asc) |
| | | .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move) |
| | | && s.StartRoadway == modDevice.StationNum); |
| | | if (modTask == null) |
| | | { |
| | | break; |
| | | } |
| | | //判断出库锁定是否打开 |
| | | if (PLCTaskAction.boOutLock) |
| | | { |
| | | break;//出库锁定打开则不执行出库任务 |
| | | } |
| | | |
| | | PlcTaskInfo taskInfo = new PlcTaskInfo(); |
| | |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | modTask.Levels = 999; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | //下发任务日志 |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | |
| | | break; |
| | | case "330": |
| | | { |
| | | |
| | | // 写入任务 托盘移动 340 |
| | | |
| | | // 获取工位托盘码信息 |
| | |
| | | { |
| | | // 此托盘没有对应的转移任务 led显示 |
| | | break; |
| | | } |
| | | //判断入库锁定是否打开 |
| | | if (PLCTaskAction.boEnterLock) |
| | | { |
| | | break;//入库锁定打开则不执行入库任务 |
| | | } |
| | | |
| | | // 获取巷道口入库工位 |
| | |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | modTask.Levels = 999; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | // 插入任务明细 |
| | |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | modTask.Levels = 999; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | |
| | | HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | |
| | | public static bool boDemo = false; |
| | | //滚筒反转 |
| | | public static bool boDrumReversal = false; |
| | | //出库锁定 |
| | | public static bool boOutLock = false; |
| | | //入库锁定 |
| | | public static bool boEnterLock = false; |
| | | |
| | | public static List<PlcPositionInfo> listPositionInfo = new List<PlcPositionInfo>(); |
| | | |
| | |
| | | boRefresh = _sysConfigService.GetConfigValue<bool>("sys_Refresh").Result; |
| | | boDemo = _sysConfigService.GetConfigValue<bool>("sys_demo").Result; |
| | | boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result; |
| | | boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result; |
| | | boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result; |
| | | } |
| | | /// <summary> |
| | | /// 初始化PLC连接 |
| | |
| | | } |
| | | } |
| | | //服务状态 |
| | | var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal }; |
| | | var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal, PLCTaskAction.boOutLock, PLCTaskAction.boEnterLock }; |
| | | return new { listPlc, modService }; |
| | | } |
| | | /// <summary> |
| | |
| | | using AngleSharp.Dom; |
| | | using COSXML.Network; |
| | | using DocumentFormat.OpenXml.Drawing.Charts; |
| | | using DocumentFormat.OpenXml.Math; |
| | | using Elastic.Clients.Elasticsearch.Tasks; |
| | | using Furion.DatabaseAccessor; |
| | | using Furion.Logging; |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using NewLife; |
| | | using WCS.Application.Entity; |
| | | using WCS.Application.Service.WcsTask.Dto; |
| | | |
| | |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.PalletNo), u => u.PalletNo.Contains(input.PalletNo.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.Origin), u => u.Origin.Contains(input.Origin.Trim())) |
| | | .Select<WcsTaskOutput>(); |
| | | return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); |
| | | return await query.OrderBy(o=>o.Levels).OrderByDescending(o=>o.CreateTime).ToPagedListAsync(input.Page, input.PageSize); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | modTask.CancelDate = DateTime.Now;//取消时间 |
| | | } |
| | | modTask.Status = input.Status; |
| | | modTask.Levels = 999; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync(); |
| | | //写入任务明细表 |
| | | WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor() |
| | |
| | | //下发任务日志 |
| | | HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | } |
| | | /// <summary> |
| | | /// 任务置顶 |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <returns></returns> |
| | | [HttpPost] |
| | | [ApiDescriptionSettings(Name = "TopUpTask")] |
| | | [DisplayName("任务置顶")] |
| | | public async Task TopUpTask(UpdateWcsTaskInput input) |
| | | { |
| | | var modTask = await _wcsTaskRep.GetByIdAsync(input.Id); |
| | | if (modTask.Status != TaskStatusEnum.Wait) |
| | | { |
| | | throw Oops.Oh("只有等待执行的任务才能置顶!"); |
| | | } |
| | | int editNum = 1; |
| | | List<string> _editTaskNoList = new List<string>(); |
| | | //储位深度 |
| | | string locatDepth = ""; |
| | | if (modTask.TaskType == TaskTypeEnum.Out || modTask.TaskType == TaskTypeEnum.Move)//出库任务或入库任务 |
| | | { |
| | | locatDepth = modTask.StartLocate.Substring(modTask.StartLocate.Length - 1, 1);//起始储位深度 |
| | | if (locatDepth == "2")//判断当前储位是否深度为2,内侧储位 |
| | | { |
| | | string locatString = modTask.StartLocate.Substring(0, modTask.StartLocate.Length - 1) + "1";//获取外侧储位地址 |
| | | //判断外侧储位是否有等待执行的任务,有就优先执行 |
| | | var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.StartLocate == locatString); |
| | | if (modTask2 != null) |
| | | { |
| | | modTask2.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask2.TaskNo); |
| | | |
| | | modTask.Levels = 2; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | |
| | | editNum = 2; |
| | | } |
| | | else |
| | | { |
| | | modTask.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | modTask.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | } |
| | | } |
| | | if (modTask.TaskType == TaskTypeEnum.In)//入库任务 |
| | | { |
| | | if (string.IsNullOrEmpty(modTask.EndLocate)) |
| | | { |
| | | throw Oops.Oh("该入库任务还未分配储位,置顶失败!"); |
| | | } |
| | | locatDepth = modTask.EndLocate.Substring(modTask.EndLocate.Length - 1, 1);//目标储位深度 |
| | | if (locatDepth == "1")//判断当前储位是否深度为1,外侧储位 |
| | | { |
| | | string locatString = modTask.EndLocate.Substring(0, modTask.EndLocate.Length - 1) + "2";//获取内侧储位地址 |
| | | //判断内侧储位是否有等待执行的任务,有就优先执行 |
| | | var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && (w.StartLocate == locatString || w.EndLocate == locatString)); |
| | | if (modTask2 != null) |
| | | { |
| | | modTask2.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask2.TaskNo); |
| | | |
| | | modTask.Levels = 2; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | |
| | | editNum = 2; |
| | | } |
| | | else |
| | | { |
| | | modTask.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | modTask.Levels = 1; |
| | | await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | _editTaskNoList.Add(modTask.TaskNo); |
| | | } |
| | | } |
| | | //顺延其他置顶任务 |
| | | var modTaskList = _db.Queryable<WcsTask>().Where(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.Levels != 999 && !_editTaskNoList.Contains(w.TaskNo)).ToList(); |
| | | foreach (var item in modTaskList) |
| | | { |
| | | item.Levels += editNum; |
| | | } |
| | | await _wcsTaskRep.Context.Updateable(modTaskList).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 自动生成任务号 |
| | |
| | | DetailWcsTask = '/api/wcsTask/detail', |
| | | FinshWcsTask = '/api/wcsTask/Finsh', |
| | | UploadWcsTask = '/api/wcsTask/UploadTask', |
| | | TopUpWcsTask = '/api/wcsTask/TopUpTask', |
| | | } |
| | | |
| | | // 增加任务表 |
| | |
| | | url: Api.UploadWcsTask, |
| | | method: 'post', |
| | | data: params, |
| | | }); |
| | | |
| | | // 置顶任务 |
| | | export const topUpWcsTask = (params?: any) => |
| | | request({ |
| | | url: Api.TopUpWcsTask, |
| | | method: 'post', |
| | | data: params, |
| | | }); |
| | |
| | | <template> |
| | | <div class="sys-user-container" style="overflow: hidden;"> |
| | | <div class="sys-user-container"> |
| | | <el-row> |
| | | <el-col :span="3"> |
| | | <el-collapse v-model="activeName"> |
| | |
| | | <el-switch v-model="state.boDrumReversal" active-text="" inactive-text="滚动反转" |
| | | @change="handleSwitchChange('boDrumReversal', $event)"></el-switch> |
| | | </el-card> |
| | | <el-card class="box-card" shadow="hover" style="margin-top: 3px;"> |
| | | <el-switch v-model="state.boOutLock" active-text="" inactive-text="出库锁定" |
| | | @change="handleSwitchChange('boOutLock', $event)"></el-switch> |
| | | </el-card> |
| | | <el-card class="box-card" shadow="hover" style="margin-top: 3px;"> |
| | | <el-switch v-model="state.boEnterLock" active-text="" inactive-text="入库锁定" |
| | | @change="handleSwitchChange('boEnterLock', $event)"></el-switch> |
| | | </el-card> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="堆垛机" name="2"> |
| | |
| | | @cell-click="handleClick" @sort-change="sortChange" border=""> |
| | | <el-table-column type="index" label="序号" width="55" align="center" /> |
| | | <el-table-column prop="taskNo" label="任务号" width="130" show-overflow-tooltip="" /> |
| | | <el-table-column prop="levels" label="优先级" width="55" show-overflow-tooltip="" /> |
| | | <el-table-column prop="taskType" width="85" label="任务类型" show-overflow-tooltip=""> |
| | | <template #default="scope"> |
| | | <el-tag :type="dv('TaskTypeEnum', scope.row.taskType)?.tagType"> {{ dv('TaskTypeEnum', |
| | |
| | | <ModifyRecord :data="scope.row" /> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column prop="操作" label="操作" width="150" align="center" fixed="right" show-overflow-tooltip="" |
| | | <el-table-column prop="操作" label="操作" width="200" align="center" fixed="right" show-overflow-tooltip="" |
| | | v-if="auth('wcsTask:complete') || auth('wcsTask:cancell')"> |
| | | <template #default="scope"> |
| | | <template v-if="scope.row.status <= 1"> |
| | |
| | | <template v-if="scope.row.status == 2 && scope.row.origin == 'WMS'"> |
| | | <el-button icon="ele-Upload" size="small" text="" type="primary" @click="uploadTask(scope.row)" |
| | | v-auth="'wcsTask:cancell'"> 上传 </el-button> |
| | | </template> |
| | | <template v-if="scope.row.status == 0"> |
| | | <el-button icon="ele-Top" size="small" text="" type="primary" @click="topUpTask(scope.row)" |
| | | v-auth="'wcsTask:cancell'"> 置顶 </el-button> |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-row> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> |
| | | <el-form-item label="任务号"> |
| | | <el-input v-model="queryParams2.taskNo" clearable="" placeholder="请输入任务号" /> |
| | | <el-input v-model="queryParams2.taskNo" clearable="" placeholder="请输入任务号"style="width: 130px;" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10"> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" style="margin-left: 20px;"> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="ele-Search" @click="handleQuery2"> 查询 |
| | | </el-button> |
| | |
| | | |
| | | import printDialog from '/@/views/system/print/component/hiprint/preview.vue' |
| | | import editDialog from '/@/views/wcs/wcsTask/component/editDialog.vue' |
| | | import { pageWcsTask, finshWcsTask, uploadWcsTask } from '/@/api/wcs/wcsTask'; |
| | | import { pageWcsTask, finshWcsTask, uploadWcsTask,topUpWcsTask } from '/@/api/wcs/wcsTask'; |
| | | import { pageWcsMonitorTask } from '/@/api/wcs/wcsTaskMonitor'; |
| | | import { signalR } from './signalR'; |
| | | |
| | |
| | | }) |
| | | .then(async () => { |
| | | var param = Object.assign(row); |
| | | await uploadWcsTask(param); |
| | | await topUpTask(param); |
| | | handleQuery(); |
| | | handleQuery2(); |
| | | ElMessage.success("上传任务成功"); |
| | | ElMessage.success("置顶任务成功"); |
| | | }) |
| | | .catch(() => { }); |
| | | |
| | | } |
| | | //置顶任务 |
| | | const topUpTask = async (row: any) => { |
| | | ElMessageBox.confirm(`确定要置顶任务吗?`, "提示", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(async () => { |
| | | var param = Object.assign(row); |
| | | await topUpWcsTask(param); |
| | | handleQuery(); |
| | | handleQuery2(); |
| | | ElMessage.success("置顶任务成功"); |
| | | }) |
| | | .catch(() => { }); |
| | | |