Merge branch 'master' into liudl
| | |
| | | public class WcsCheckTask : EntityBaseData |
| | | { |
| | | /// <summary> |
| | | /// 任务号 |
| | | /// </summary> |
| | | [SugarColumn(ColumnName = "TaskNo", ColumnDescription = "任务号", Length = 20)] |
| | | public string? TaskNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// WMS下发单号 |
| | | /// </summary> |
| | | [SugarColumn(ColumnName = "OrderNo", ColumnDescription = "WMS下发单号", Length = 20)] |
| | | public string? OrderNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 机器人类型 |
| | | /// </summary> |
| | | [SugarColumn(ColumnName = "RoboatType", ColumnDescription = "机器人类型", Length = 5)] |
| | | public string? RoboatType { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 机器人编号 |
| | |
| | | /// <summary> |
| | | /// 分拣线编号 |
| | | /// </summary> |
| | | [SugarColumn(ColumnName = "LineNO", ColumnDescription = "分拣线编号", Length = 5)] |
| | | public string? LineNO { get; set; } |
| | | [SugarColumn(ColumnName = "LineNo", ColumnDescription = "分拣线编号", Length = 5)] |
| | | public string? LineNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 码盘工位号 |
| | |
| | | /// 拣货方式 |
| | | /// </summary> |
| | | [SugarColumn(ColumnName = "UnstackingMode", ColumnDescription = "拣货方式", Length = 10)] |
| | | public string? UnstackingMode { get; set; } |
| | | public UnstackingModeEnum? UnstackingMode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 取消时间 |
| | |
| | | [Description("回传失败")] |
| | | Fail = 1 |
| | | } |
| | | /// <summary> |
| | | /// 拣货方式 |
| | | /// </summary> |
| | | [Description("拣货方式")] |
| | | public enum UnstackingModeEnum |
| | | { |
| | | /// <summary> |
| | | /// 机器拆托出 |
| | | /// </summary> |
| | | [Description("机器拆托出")] |
| | | Machine = 0, |
| | | |
| | | /// <summary> |
| | | /// 人工拣货出 |
| | | /// </summary> |
| | | [Description("人工拣货出")] |
| | | Artificial = 1, |
| | | } |
| | |
| | | { |
| | | public string TaskNo { get; set; } // 任务号 |
| | | public string PalletNo { get; set; } // 托盘号 |
| | | public string TaskType { get; set; } // 任务类型 |
| | | public TaskTypeEnum TaskType { get; set; } // 任务类型 |
| | | public TaskStatusEnum TaskStatus { get; set; } // 任务状态 0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 任务取消 |
| | | } |
| | | public class ResponseTasks |
| | |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using Elastic.Clients.Elasticsearch.Tasks; |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using RazorEngine.Compilation.ImpromptuInterface.Dynamic; |
| | | using System; |
| | | using System.Collections.Generic; |
| | |
| | | /// </summary> |
| | | /// <param name="startStation"></param> |
| | | /// <returns></returns> |
| | | public static PlcTaskInfo GetPlcIp(string startStation) |
| | | public static PLCUtil GetPlcIp(string startStation) |
| | | { |
| | | PlcTaskInfo taskInfo = new PlcTaskInfo(); |
| | | |
| | | string strIp = ""; |
| | | var conveyList1 = new List<string>() { "147", "145", "139", "137", "129", "127", "121", "119", "111", "109", "103", "101", "093", "091", "085", "083", "075", "073", "067", "065" }; |
| | | var conveyList2 = new List<string>() { "252", "254", "260", "262", "272", "272", "278", "280", "288", "290", "294", "301", "307", "309", "315", "317", "325", "327", "331", "337" }; |
| | | var conveyList3 = new List<string>() { "401", "402", "405", "406", "409", "410", "413", "414", "417", "418", "421", "422", "425", "426", "429", "430", "433", "434", "437", "438" }; |
| | | if (conveyList1.Contains(startStation)) |
| | | { |
| | | taskInfo.Ip = "10.18.51.110"; |
| | | strIp = "10.18.51.110"; |
| | | } |
| | | else if (conveyList2.Contains(startStation)) |
| | | { |
| | | |
| | | taskInfo.Ip = "10.18.51.120"; |
| | | strIp = "10.18.51.120"; |
| | | } |
| | | else if (conveyList3.Contains(startStation)) |
| | | { |
| | | |
| | | taskInfo.Ip = "10.18.51.130"; |
| | | strIp = "10.18.51.130"; |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("工位未查询到"); |
| | | throw Oops.Bah("工位未查询到"); |
| | | } |
| | | |
| | | return taskInfo; |
| | | var plcConveyorConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == strIp); |
| | | return plcConveyorConn; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | using RazorEngine.Compilation.ImpromptuInterface.Dynamic; |
| | | using SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global.Models; |
| | | using System.Data; |
| | | using System.Reflection.Emit; |
| | | |
| | | namespace WCS.Application; |
| | | public static class PLCService |
| | |
| | | /// 跺机业务处理 |
| | | /// </summary> |
| | | /// <param name="modDevice"></param> |
| | | private static async void StackingMachine(WcsDeviceDto modDevice) |
| | | private static void StackingMachine(WcsDeviceDto modDevice) |
| | | { |
| | | var plcConn = modDevice.PLCUtil; |
| | | switch (modDevice.Value.ToString()) |
| | |
| | | if (startStationRes.IsSucceed) |
| | | { |
| | | // 根据工位号获取对应的输送线IP |
| | | PlcTaskInfo taskInfo = PLCCommon.GetPlcIp(startStationVal); |
| | | var plcConveyorConn = PLCTaskAction.listPlcConn.First(m => m.PlcIP == taskInfo.Ip); |
| | | var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal); |
| | | if (plcConveyorConn.Connected) |
| | | { |
| | | // 向取货工位写入流程字640 取货已完成 |
| | |
| | | modTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | InteractiveMsg = $"任务完成" |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | // 反馈WMS |
| | |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = "1", |
| | | TaskType = TaskTypeEnum.In, |
| | | TaskStatus = TaskStatusEnum.Complete |
| | | }; |
| | | |
| | | // 此处添加调用WMS接口 liudl |
| | | HttpService httpService = new HttpService(); |
| | | var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | if (modResponseTask.StatusCode == "0") |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成"; |
| | | } |
| | | } |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 此处添加不空跑业务 |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Out: // 出库任务 |
| | | { |
| | | string roadway = modTask.StartRoadway; |
| | | // 从出库任务获取放货工位 |
| | | string outCode = modTask.EndLocate; |
| | | // 根据工位号获取对应的输送线IP |
| | | var plcConveyorConn = PLCCommon.GetPlcIp(outCode); |
| | | if (plcConveyorConn.Connected) |
| | | { |
| | | // 根据目标地址和巷道获取放货工位对应的排列层 |
| | | PlcTaskInfo taskInfo = PLCCommon.GetCTaskInfo(modTask.EndLocate, modTask.TaskType.ToString(), |
| | | modTask.StartRoadway, modTask.EndRoadway); |
| | | // 根据工位号获取工位信息 |
| | | var wcsDevice = PLCTaskAction.plcDevices.First(s => s.PlcId == plcConveyorConn.PlcId && s.Level == DeviceLevelEnum.Station && s.StationNum == taskInfo.EndStation); |
| | | // 读取当前工位各偏移量值 |
| | | var listPos = PLCTaskAction.plcPositions.Where(s => s.DeviceId == wcsDevice.Id).ToList(); |
| | | |
| | | // 给PLC写入任务数据 |
| | | var listResult = new List<Result>(); |
| | | //任务号 |
| | | var modPosTask = listPos.FirstOrDefault(s => s.Text == "任务号"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo)); |
| | | //任务类型 |
| | | var modPosTaskType = listPos.FirstOrDefault(s => s.Text == "任务类型"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, ((int)modTask.TaskType).ToString())); |
| | | //托盘号 |
| | | var modPosPalletNo = listPos.FirstOrDefault(s => s.Text == "托盘码"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo)); |
| | | //起始工位 |
| | | var modPosLocatNo = listPos.FirstOrDefault(s => s.Text == "起始工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosLocatNo.PosType, modDevice.DbNumber, modPosLocatNo.PlcPos, taskInfo.EndStation)); |
| | | // 目标工位 |
| | | var modPosEndLocatNo = listPos.FirstOrDefault(s => s.Text == "目的工位"); |
| | | listResult.Add(plcConn.SetPlcDBValue(modPosEndLocatNo.PosType, modDevice.DbNumber, modPosEndLocatNo.PlcPos, outCode)); |
| | | |
| | | // 是否写入成功 |
| | | if (listResult.All(s => s.IsSucceed)) |
| | | { |
| | | var result = plcConveyorConn.SetPlcDBValue(wcsDevice.PosType, wcsDevice.DbNumber, wcsDevice.WcsPos, "740"); |
| | | |
| | | if (result.IsSucceed) |
| | | { |
| | | // 写入跺机wcs控制字 返回垛机执行完成 |
| | | result = modDevice.PLCUtil.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "870"); |
| | | if (result.IsSucceed) |
| | | { |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = wcsDevice.Id, |
| | | PlcName = wcsDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = taskInfo.EndStation, |
| | | EndLocat = outCode, |
| | | InteractiveMsg = $"写入指令:收到跺机放货完成;放货{taskInfo.EndStation}工位===》{outCode}出库口" |
| | | }; |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | //此处添加不空跑业务 |
| | | } |
| | | } |
| | | break; |
| | | case TaskTypeEnum.Move: // 移库任务 |
| | | { |
| | | var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "任务号"); |
| | | var result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosTask.PlcPos, modTask.TaskNo); |
| | | if (!result.IsSucceed) |
| | | { |
| | | Log.Error($"{modDevice.Text}写入任务号失败"); |
| | | break; |
| | | } |
| | | result = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "30"); |
| | | if (!result.IsSucceed) |
| | | { |
| | | Log.Error($"{modDevice.Text}控制字写入30失败"); |
| | | break; |
| | | } |
| | | // 改变任务状态 |
| | | modTask.Status = TaskStatusEnum.Complete; |
| | | modTask.FinishDate = DateTime.Now; |
| | | _db.Updateable(modTask).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | |
| | | var modcTaskMonitor = new WcsTaskMonitor() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PlcId = modDevice.Id, |
| | | PlcName = modDevice.Text, |
| | | PalletNo = modTask.PalletNo, |
| | | Status = TaskStatusEnum.Complete, |
| | | StartLocat = modTask.StartLocate, |
| | | EndLocat = modTask.EndLocate, |
| | | InteractiveMsg = $"任务完成" |
| | | }; |
| | | if (modTask.Origin == "WMS") |
| | | { |
| | | // 反馈WMS |
| | | var requestMode = new TaskRequest() |
| | | { |
| | | TaskNo = modTask.TaskNo, |
| | | PalletNo = modTask.PalletNo, |
| | | TaskType = TaskTypeEnum.Move, |
| | | TaskStatus = TaskStatusEnum.Complete |
| | | }; |
| | | HttpService httpService = new HttpService(); |
| | | var modResponseTask = httpService.RequestTask(requestMode).Result; |
| | | if (modResponseTask.StatusCode == "0") |
| | | { |
| | | modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成"; |
| | | //修改储位信息 任务类型 执行状态 起始位置 目标位置 |
| | | |
| | | } |
| | | } |
| | | // 插入交互日志 |
| | | _db.Insertable(modcTaskMonitor).ExecuteCommand(); |
| | | //下发任务日志 |
| | | _taskLogHubContext.Clients.All.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // 此处添加不空跑业务 |
| | | } |
| | | break; |
| | | default: break; |
| | |
| | | |
| | | private static List<WcsPlc> listPlc = new List<WcsPlc>(); |
| | | private static List<WcsDevice> listPlcDevice = new List<WcsDevice>(); |
| | | private static List<WcsPosition> listPlcStation = new List<WcsPosition>(); |
| | | private static List<WcsPosition> listPlcPosition = new List<WcsPosition>(); |
| | | private static List<WcsAlarmInfo> listAlarmInfo = new List<WcsAlarmInfo>(); |
| | | |
| | | private static List<PLCUtil> listPlcUtil = new List<PLCUtil>(); |
| | |
| | | { |
| | | get { return listPlcDevice; } |
| | | } |
| | | |
| | | public static List<WcsPosition> plcPositions |
| | | { |
| | | get { return listPlcPosition; } |
| | | } |
| | | public static event EventHandler DeviceValueChangeEvent; |
| | | static PLCTaskAction() |
| | | { |
| | |
| | | cts.Cancel(); |
| | | listPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine || s.Type == PLCTypeEnum.BoxConveyorLine).ToList(); |
| | | listPlcDevice = _db.Queryable<WcsDevice>().ToList(); |
| | | listPlcStation = _db.Queryable<WcsPosition>().ToList(); |
| | | listPlcPosition = _db.Queryable<WcsPosition>().ToList(); |
| | | listAlarmInfo = _db.Queryable<WcsAlarmInfo>().ToList(); |
| | | //等待几秒钟,把已有线程取消掉再连接 |
| | | //Thread.Sleep(5000); |
| | |
| | | dto.Value = value; |
| | | dto.Type = _modplc.Type; |
| | | dto.PLCUtil = modPlcUtil; |
| | | dto.listStation = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList(); |
| | | dto.listStation = listPlcPosition.Where(s => s.DeviceId == modDevice.Id).ToList(); |
| | | dto.listDevice = listDevice.Where(s => s.StationNum == modDevice.StationNum && s.Level == DeviceLevelEnum.Station).ToList(); |
| | | //这里触发值变更事件 |
| | | DeviceValueChangeEvent?.Invoke(dto, EventArgs.Empty); |
| | |
| | | /// <summary> |
| | | /// 分拣线编号 |
| | | /// </summary> |
| | | public string? LineNO { get; set; } |
| | | public string? LineNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 码盘工位号 |
| | |
| | | .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => |
| | | u.OrderNo.Contains(input.SearchKey) |
| | | || u.RoboatNo.Contains(input.SearchKey) |
| | | || u.LineNO.Contains(input.SearchKey) |
| | | || u.LineNo.Contains(input.SearchKey) |
| | | || u.Port.Contains(input.SearchKey) |
| | | || u.LotNo.Contains(input.SearchKey) |
| | | || u.SkuNo.Contains(input.SearchKey) |
| | |
| | | ) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.OrderNo), u => u.OrderNo.Contains(input.OrderNo.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.RoboatNo), u => u.RoboatNo.Contains(input.RoboatNo.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.LineNO), u => u.LineNO.Contains(input.LineNO.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.LineNo), u => u.LineNo.Contains(input.LineNo.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.Port), u => u.Port.Contains(input.Port.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.LotNo), u => u.LotNo.Contains(input.LotNo.Trim())) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(input.SkuNo), u => u.SkuNo.Contains(input.SkuNo.Trim())) |
| | |
| | | checkTaskInfo.PZNo = skuInfo.PZNo; |
| | | //更新分拣任务 |
| | | await _wcsCheckTaskRep.AsUpdateable(checkTaskInfo).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | |
| | | #region#给PLC写数据 |
| | | |
| | | #endregion |
| | | } |
| | | |
| | | [HttpPost] |
| | |
| | | [DisplayName("任务结批")] |
| | | public async Task CloseTaskForPLC(BindTaskPLCInput input) |
| | | { |
| | | #region 请求PLC接口 |
| | | #region 请求PLC接口(这个方法实际是预结批,给PLC发送预结批信息,然后PLC再给WCS发送结批信号再将分拣信息清空) |
| | | |
| | | #endregion |
| | | //分拣任务信息 |
| | | var checkTaskList = _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.LotNo == input.lotNo && w.Status == "1").ToList(); |
| | | foreach (var item in checkTaskList) |
| | | { |
| | | item.OrderNo = ""; |
| | | item.TaskNo = ""; |
| | | item.LotNo = ""; |
| | | item.SkuNo = ""; |
| | | item.SkuName = ""; |
| | | item.BoxType = ""; |
| | | item.Qty = 0; |
| | | item.PZNo = ""; |
| | | item.Status = "0";//未绑定 |
| | | } |
| | | //更新分拣任务 |
| | |
| | | { |
| | | public long Id { get; set; } |
| | | public string Text { get; set; } |
| | | public string? TaskNo { get; set; } |
| | | public string? OrderNo { get; set; } |
| | | public string? LotNo { get; set; } |
| | | public string? SkuNo { get; set; } |
| | |
| | | /// 总箱数/计划箱数/预估箱数 |
| | | /// </summary> |
| | | public int? Qty { get; set; } |
| | | public string? LineNO { get; set; } |
| | | public string? LineNo { get; set; } |
| | | public string? PZNo { get; set; } |
| | | } |
| | |
| | | { |
| | | Id=device.Id, |
| | | Text=device.Text, |
| | | TaskNo=task.TaskNo, |
| | | OrderNo=task.OrderNo, |
| | | LotNo=task.LotNo, |
| | | SkuNo=task.SkuNo, |
| | | SkuName=task.SkuName, |
| | | LineNO=task.LineNO, |
| | | LineNo=task.LineNo, |
| | | Status =task.Status, |
| | | PZNo=task.PZNo, |
| | | Qty=task.Qty |
| | |
| | | /// <summary> |
| | | /// 拣货方式 |
| | | /// </summary> |
| | | public virtual string? UnstackingMode { get; set; } |
| | | public virtual UnstackingModeEnum? UnstackingMode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 取消时间 |
| | |
| | | |
| | | using AngleSharp.Dom; |
| | | using Elastic.Clients.Elasticsearch.Tasks; |
| | | using Furion.DatabaseAccessor; |
| | | using Microsoft.AspNetCore.SignalR; |
| | | using WCS.Application.Entity; |
| | | |
| | | namespace WCS.Application; |
| | | |
| | |
| | | { |
| | | private readonly SqlSugarRepository<WcsTask> _wcsTaskRep; |
| | | private readonly IHubContext<TaskLogHub, ITaskLogHub> _taskLogHubContext; |
| | | private readonly SqlSugarRepository<WcsCheckTask> _wcsCheckTaskRep; |
| | | private readonly SqlSugarRepository<WcsMateialPzInfo> _wcsMateialPzInfoRep; |
| | | |
| | | public WcsTaskService(SqlSugarRepository<WcsTask> wcsTaskRep, IHubContext<TaskLogHub, ITaskLogHub> taskLogHubContext) |
| | | public WcsTaskService(SqlSugarRepository<WcsTask> wcsTaskRep, IHubContext<TaskLogHub, ITaskLogHub> taskLogHubContext, SqlSugarRepository<WcsCheckTask> wcsCheckTaskRep, SqlSugarRepository<WcsMateialPzInfo> wcsMateialPzInfoRep) |
| | | { |
| | | _wcsTaskRep = wcsTaskRep; |
| | | _taskLogHubContext = taskLogHubContext; |
| | | _wcsCheckTaskRep = wcsCheckTaskRep; |
| | | _wcsMateialPzInfoRep = wcsMateialPzInfoRep; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | throw Oops.Bah("任务号重复"); |
| | | } |
| | | if (input.UnstackingMode == UnstackingModeEnum.Machine) |
| | | { |
| | | if (string.IsNullOrEmpty(input.SkuNo) || string.IsNullOrEmpty(input.SkuName)) |
| | | { |
| | | throw Oops.Bah("机器人拣货,物料和批次信息不能为空"); |
| | | } |
| | | } |
| | | var entity = input.Adapt<WcsTask>(); |
| | | entity.Origin = "WCS"; |
| | | await _wcsTaskRep.InsertAsync(entity); |
| | | |
| | | #region 绑定垛机 |
| | | |
| | | //物料品种信息 |
| | | var skuInfo = await _wcsMateialPzInfoRep.Context.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == input.SkuNo).FirstAsync(); |
| | | if (skuInfo == null) |
| | | { |
| | | throw Oops.Oh("物料品种信息不存在"); |
| | | } |
| | | //分拣任务信息 |
| | | var checkTaskInfo = await _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.Status == "0" && w.RoboatType == "0").OrderBy(o => o.LineNo).FirstAsync(); |
| | | if (checkTaskInfo == null) |
| | | { |
| | | throw Oops.Oh("分拣任务信息不存在"); |
| | | } |
| | | if (checkTaskInfo.Status != "0") |
| | | { |
| | | throw Oops.Oh("该工位已绑定任务,请勿再次绑定"); |
| | | } |
| | | checkTaskInfo.OrderNo = ""; |
| | | checkTaskInfo.TaskNo = entity.TaskNo; |
| | | checkTaskInfo.LotNo = entity.LotNo; |
| | | checkTaskInfo.SkuNo = entity.SkuNo; |
| | | checkTaskInfo.SkuName = entity.SkuName; |
| | | checkTaskInfo.BoxType = ""; |
| | | checkTaskInfo.Qty = entity.Qty; |
| | | checkTaskInfo.Status = "1";//已绑定 |
| | | checkTaskInfo.PZNo = skuInfo.PZNo; |
| | | //更新分拣任务 |
| | | await _wcsCheckTaskRep.AsUpdateable(checkTaskInfo).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | #endregion |
| | | |
| | | return entity.Id; |
| | | } |
| | | |
| | |
| | | await _wcsTaskRep.Context.Insertable(modTaskMonitor).ExecuteCommandAsync(); |
| | | //await _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>()); |
| | | //await _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | #region |
| | | //分拣任务信息 |
| | | var checkTaskList = _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.TaskNo == modTask.TaskNo && w.Status == "1").ToList(); |
| | | foreach (var item in checkTaskList) |
| | | { |
| | | item.OrderNo = ""; |
| | | item.TaskNo = ""; |
| | | item.LotNo = ""; |
| | | item.SkuNo = ""; |
| | | item.SkuName = ""; |
| | | item.BoxType = ""; |
| | | item.Qty = 0; |
| | | item.PZNo = ""; |
| | | item.Status = "0";//未绑定 |
| | | } |
| | | //更新分拣任务 |
| | | await _wcsCheckTaskRep.AsUpdateable(checkTaskList).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); |
| | | #endregion |
| | | } |
| | | else |
| | | { |
| | |
| | | <el-form-item label="WMS明细单号"> |
| | | <el-input v-model="deviceInfo.orderNo" readonly></el-input> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="任务号"> |
| | | <el-input v-model=""></el-input> |
| | | </el-form-item> --> |
| | | <el-form-item label="任务号"> |
| | | <el-input v-model="deviceInfo.taskNo"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="批次号"> |
| | | <el-input v-model="deviceInfo.lotNo" readonly></el-input> |
| | | </el-form-item> |
| | |
| | | <el-input v-model="deviceInfo.skuName" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="分拣线编号"> |
| | | <el-input v-model="deviceInfo.lineNO" readonly></el-input> |
| | | <el-input v-model="deviceInfo.lineNo" readonly></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="绑定状态"> |
| | | <el-input :value="deviceInfo.status === '0' ? '未绑定' : '已绑定'" readonly></el-input> |
| | |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- 绑定任务弹框 --> |
| | | <!-- 选择物料弹框 --> |
| | | <el-dialog v-model="bindDialogVisible" title="选择数据"> |
| | | <el-table |
| | | :data="bindBoxData" |
| | |
| | | </el-form-item> |
| | | |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> |
| | | <el-form-item label="拣货方式" prop="unstackingMode"> |
| | | <el-select clearable v-model="ruleForm.unstackingMode" placeholder="请选择拣货方式"> |
| | | <el-option v-for="(item,index) in dl('UnstackingModeEnum')" :key="index" :value="Number(item.value)" :label="`${item.name} (${item.code}) [${item.value}]`"></el-option> |
| | | |
| | | </el-select> |
| | | |
| | | </el-form-item> |
| | | |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> |
| | | <el-form-item label="物料编码" prop="skuNo"> |
| | | <el-input v-model="ruleForm.skuNo" placeholder="请输入物料编码" maxlength="20" show-word-limit clearable /> |
| | | |
| | | </el-form-item> |
| | | |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> |
| | | <el-form-item label="物料名称" prop="skuName"> |
| | | <el-input v-model="ruleForm.skuName" placeholder="请输入物料名称" maxlength="50" show-word-limit clearable/> |
| | | |
| | | </el-form-item> |
| | | |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> |
| | | <el-form-item label="批次号" prop="lotNo"> |
| | | <el-input v-model="ruleForm.lotNo" placeholder="请输入批次号" maxlength="50" show-word-limit clearable /> |
| | | |
| | | </el-form-item> |
| | | |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |