diff --git a/WcsMain/ApiServe/Controllers/Dto/WMSEntity/ElTag/GetElTagTaskRequest.cs b/WcsMain/ApiServe/Controllers/Dto/WMSEntity/ElTag/GetElTagTaskRequest.cs index c577a3b..03c7de4 100644 --- a/WcsMain/ApiServe/Controllers/Dto/WMSEntity/ElTag/GetElTagTaskRequest.cs +++ b/WcsMain/ApiServe/Controllers/Dto/WMSEntity/ElTag/GetElTagTaskRequest.cs @@ -45,6 +45,12 @@ public class ElTagTaskdata /// /// 任务号 /// + [JsonPropertyName("eTaskId")] + public string? ETaskId { get; set; } + + /// + /// WMS任务号 + /// [JsonPropertyName("taskId")] public string? TaskId { get; set; } diff --git a/WcsMain/ApiServe/Service/WmsService/ElTagService.cs b/WcsMain/ApiServe/Service/WmsService/ElTagService.cs index 75ace3d..d8272b4 100644 --- a/WcsMain/ApiServe/Service/WmsService/ElTagService.cs +++ b/WcsMain/ApiServe/Service/WmsService/ElTagService.cs @@ -43,7 +43,8 @@ public class ElTagService(DataBaseData dataBaseData, AppElTagTaskDao elTagTaskDa { elTagTasks.Add(new AppElTagTask() { - TaskId = string.IsNullOrEmpty(elTagTask.TaskId) ? dataBaseData.GetNewUUID() : elTagTask.TaskId, + TaskId = string.IsNullOrEmpty(elTagTask.ETaskId) ? dataBaseData.GetNewUUID() : elTagTask.ETaskId, + WmsTaskId = elTagTask.TaskId, TaskGroup = request.TaskGroup, TaskType = request.TaskType, Location = elTagTask.Location, diff --git a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs index 04ea1a1..5e2317e 100644 --- a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs +++ b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs @@ -14,7 +14,7 @@ public class DataClear(ClearData clearData) /// 定时清理无用数据, ---- 每隔10分钟清理一次 /// /// - [CirculationTime(["14:34"], "数据清理")] + [CirculationTime(["03:00"], "数据清理")] public void ClearDataCirculate() { try diff --git a/WcsMain/Business/CirculationTask/Convey/UploadBoxArrive.cs b/WcsMain/Business/CirculationTask/Convey/UploadBoxArrive.cs index 3bb7c98..300786e 100644 --- a/WcsMain/Business/CirculationTask/Convey/UploadBoxArrive.cs +++ b/WcsMain/Business/CirculationTask/Convey/UploadBoxArrive.cs @@ -14,7 +14,7 @@ namespace WcsMain.Business.CirculationTask.Convey; [Circulation] -public class UploadBoxArrive(AppConveyStandDao conveyStandDao, ConveyOperation conveyOperation, WmsWebApiPost wmsWebApiPost, AppConveyTaskDao conveyTaskDao) +public class UploadBoxArrive(AppConveyStandDao conveyStandDao, ConveyOperation conveyOperation, WmsWebApiPost wmsWebApiPost, AppConveyTaskDao conveyTaskDao, AppElTagTaskDao elTagTaskDao) { private static List? _pickStands; // 拣选站台 @@ -42,10 +42,8 @@ public class UploadBoxArrive(AppConveyStandDao conveyStandDao, ConveyOperation c { string code = conveyOperation.ReadStandCode(stand.StandId!); code = Regex.Replace(code, "\\W", ""); - if (string.IsNullOrEmpty(code)) - { - return; - } + if (string.IsNullOrEmpty(code)) return; + elTagTaskDao.ClearNotCompleteTaskWithStand(stand.StandId); // 清理之前未完成的电子标签任务 ConsoleLog.Info($"【提示】料箱:{code} 已经到达拣选站台:{stand.StandId}"); conveyOperation.ClearStandCodeStatus(stand.StandId!); @@ -55,42 +53,42 @@ public class UploadBoxArrive(AppConveyStandDao conveyStandDao, ConveyOperation c VehicleNo = code, TaskType = (int)ConveyTaskTypeEnum.pick, Location = stand.StandId, - //TaskStatus = (int)ConveyTaskStatusEnum.moved + TaskStatus = (int)ConveyTaskStatusEnum.create }); if (pickTasks == default || pickTasks.Count < 1) { ConsoleLog.Error($"【异常】拣选站台{stand.StandId} 料箱:{code} 找不到对应任务"); - return; } - var pickTask = pickTasks[0]; // 拣选任务 - // 更新表内拣选时间和状态 - conveyTaskDao.Update(new AppConveyTask() + else { - TaskId = pickTask.TaskId, - TaskStatus = (int)ConveyTaskStatusEnum.arrive, - ArriveLocation = stand.StandId, - CompleteTime = DateTime.Now, - Remark = "PLC上报料箱到达" - }); - //return; // 测试 - + var pickTask = pickTasks[0]; // 拣选任务 + conveyTaskDao.Update(new AppConveyTask() + { + TaskId = pickTask.TaskId, + TaskStatus = (int)ConveyTaskStatusEnum.arrive, + ArriveLocation = stand.StandId, + CompleteTime = DateTime.Now, + Remark = "PLC上报料箱到达" + }); // 更新表内拣选时间和状态 + } // 发送wms料箱到达 UploadPickStandRequest request = new() { Location = stand.StandId, - VehicleNo = pickTask.VehicleNo, - Remark = "" + VehicleNo = code, + Remark = $"料箱:{code} 已经到达站台:{stand.StandId}" }; - - var responseEntity = wmsWebApiPost.HttpPost(request, - CommonData.AppApiBaseInfos.GetAddress("UploadBoxArrive") ?? "", 2000); + var responseEntity = wmsWebApiPost.HttpPost(request, CommonData.AppApiBaseInfos.GetAddress("UploadBoxArrive") ?? "", 2000); if (responseEntity.IsSend) // 发送失败不处理,下一次循环在发送 { // 只要发送成功则不再发送 - ConsoleLog.Info( - $"拣选站台{stand.Area} 获得对应料箱:{pickTask.VehicleNo} 上报成功,WMS返回:{responseEntity.ResponseMsg}"); - var result = responseEntity.ResponseEntity; + ConsoleLog.Info($"拣选站台{stand.Area} 获得对应料箱:{code} 上报成功,WMS返回:{responseEntity.ResponseMsg}"); conveyOperation.ClearStandCodeStatus(stand.Area!); + //var result = responseEntity.ResponseEntity; + //if (result != null && result.Code == 0) // 上报成功 + //{ + // conveyOperation.ClearStandCodeStatus(stand.Area!); + //} } }); task.Start(); diff --git a/WcsMain/Business/CirculationTask/Stacker/RecordErr.cs b/WcsMain/Business/CirculationTask/Stacker/RecordErr.cs new file mode 100644 index 0000000..1538d6c --- /dev/null +++ b/WcsMain/Business/CirculationTask/Stacker/RecordErr.cs @@ -0,0 +1,71 @@ +using CirculateTool.Attribute; +using WcsMain.ApiServe.Controllers.Dto.WcsDto.Stacker; +using WcsMain.ApiServe.Factory; +using WcsMain.Common; +using WcsMain.DataBase.Dao; +using WcsMain.DataBase.TableEntity; +using WcsMain.DataService; +using WcsMain.EquipOperation.Stacker; +using WcsMain.ExtendMethod; + +namespace WcsMain.Business.CirculationTask.Stacker; + +/// +/// 本类主要用于采集堆垛机报警信息 +/// +[Circulation] +public class RecordErr(StackerOperation stackerOperation, AppErrRecorDao errRecorDao, DataBaseData dataBaseData) +{ + + Dictionary errData = []; // 用于存储故障 + + /// + /// 采集堆垛机报警信息 + /// + /// + [Circulation("采集堆垛机报警信息", 1000)] + public bool RecordErrMethod() + { + List stackers = CommonData.AppStackers.Open(); + if (stackers.Count < 1) return true; + foreach (AppStacker stacker in stackers) + { + /* 获取堆垛机状态 */ + var (errMsg, stackerInfo) = stackerOperation.GetStackerInfo((int)stacker.StackerId!); + if (string.IsNullOrEmpty(errMsg) && stackerInfo != default) + { + short errCode = stackerInfo.ErrCode; + if (errCode != 0) // 有故障 + { + bool isGet = errData.TryGetValue((int)stacker.StackerId, out short oldErrCode); + if(!isGet || oldErrCode != errCode) // 发生了一个新故障 + { + AddStackerErr($"Stacker{stacker.StackerId}", errCode); // 添加故障 + } + } + errData[(int)stacker.StackerId] = errCode; // 添加或者更新值 + } + } + return true; + } + + /// + /// 记录新故障 + /// + /// + /// + private void AddStackerErr(string equipmentId, short errNo) + { + ConsoleLog.Error($"【报警】堆垛机设备:{equipmentId},发生新报警:{errNo}"); + errRecorDao.Insert(new AppErrRecord + { + RecordId = dataBaseData.GetNewUUID2(), + Area = "S", + ErrNo = errNo, + EquipmentId = equipmentId, + CreateTime = DateTime.Now, + Remark = "" + }); + } + +} diff --git a/WcsMain/Business/CommonAction/ClearData.cs b/WcsMain/Business/CommonAction/ClearData.cs index 47b2c30..4d146ae 100644 --- a/WcsMain/Business/CommonAction/ClearData.cs +++ b/WcsMain/Business/CommonAction/ClearData.cs @@ -34,7 +34,7 @@ public class ClearData(AppWmsTaskDao wmsTaskDao, AppWcsTaskDao wcsTaskDao, AppAp var saveDays = clearTableAttribute.SaveDays; // 需要保存的天数 try { - int deleteCount = CommonTool.DbServe.Deleteable().AS($"{tableName}").Where($"{timeColumn} < '{DateTime.Now.AddDays(-saveDays)}'").ExecuteCommand(); // 删除超过一定天数的记录 + int deleteCount = CommonTool.DbServe.Deleteable().AS($"{tableName}").Where($"{timeColumn} < '{DateTime.Now.AddDays(-saveDays):yyyy-MM-dd HH:mm:ss}'").ExecuteCommand(); // 删除超过一定天数的记录 ConsoleLog.Info(deleteCount > 0, $"清除表:{tableName},保留:{saveDays} 天,清除记录数目:{deleteCount}"); } catch(Exception e) diff --git a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/PickStandGetData.cs b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/PickStandGetData.cs index fb3f50a..df108c3 100644 --- a/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/PickStandGetData.cs +++ b/WcsMain/Business/Convey/HistoryDataHandler/HisGetData/PickStandGetData.cs @@ -101,4 +101,6 @@ public class PickStandGetData(ConveyOperation conveyOperation, DataBaseData data ConsoleLog.Warning($"【警告】拣选站台:{area} 箱码:{msg},写入PLC失败,{plcTaskOk},信息:{errTextOk}"); return; } + + } diff --git a/WcsMain/DataBase/Dao/AppBaseErrDao.cs b/WcsMain/DataBase/Dao/AppBaseErrDao.cs index de98315..d70d54b 100644 --- a/WcsMain/DataBase/Dao/AppBaseErrDao.cs +++ b/WcsMain/DataBase/Dao/AppBaseErrDao.cs @@ -21,6 +21,7 @@ public class AppBaseErrDao .WhereIF(appBaseErr.Area != default, w => w.Area == appBaseErr.Area) .WhereIF(appBaseErr.ErrNo != default, w => w.ErrNo == appBaseErr.ErrNo) .WhereIF(appBaseErr.ErrType != default, w => w.ErrType == appBaseErr.ErrType) + .WhereIF(appBaseErr.ErrLevel != default, w => w.ErrLevel == appBaseErr.ErrLevel) .WhereIF(appBaseErr.ErrMsg != default, w => w.ErrMsg == appBaseErr.ErrMsg) .WhereIF(appBaseErr.Suggest != default, w => w.Suggest == appBaseErr.Suggest) .WhereIF(appBaseErr.Remark != default, w => w.Remark == appBaseErr.Remark) diff --git a/WcsMain/DataBase/Dao/AppElTagTaskDao.cs b/WcsMain/DataBase/Dao/AppElTagTaskDao.cs index eb7f8cf..4655171 100644 --- a/WcsMain/DataBase/Dao/AppElTagTaskDao.cs +++ b/WcsMain/DataBase/Dao/AppElTagTaskDao.cs @@ -21,6 +21,7 @@ public class AppElTagTaskDao { var sqlFuc = CommonTool.DbServe.Queryable() .WhereIF(queryData.TaskId != default, w => w.TaskId == queryData.TaskId) + .WhereIF(queryData.WmsTaskId != default, w => w.WmsTaskId == queryData.WmsTaskId) .WhereIF(queryData.TaskGroup != default, w => w.TaskGroup == queryData.TaskGroup) .WhereIF(queryData.Location != default, w => w.Location == queryData.Location) .WhereIF(queryData.OrderId != default, w => w.OrderId == queryData.OrderId) @@ -104,6 +105,7 @@ public class AppElTagTaskDao .WhereIF(!string.IsNullOrEmpty(request.SearchStr), w => w.TaskId!.Contains(request.SearchStr!) || w.TaskGroup!.Contains(request.SearchStr!) + || w.WmsTaskId!.Contains(request.SearchStr!) || w.Location!.Contains(request.SearchStr!) || w.VehicleNo!.Contains(request.SearchStr!) || w.GoodsId!.Contains(request.SearchStr!) @@ -156,6 +158,44 @@ public class AppElTagTaskDao } } + /// + /// 清除该载具没有完成的任务 + /// + /// + /// + public int ClearNotCompleteTaskWithVehicleNo(string? vehicleNo) + { + if(string.IsNullOrEmpty(vehicleNo)) return 0; + try + { + var sqlFuc = CommonTool.DbServe.Updateable() + .SetColumns(s => s.TaskStatus == (int)ElTagTaskStatusEnum.Error) + .SetColumns(s => s.Remark == "未执行") + .Where(w => w.VehicleNo == vehicleNo && (w.TaskStatus == (int)ElTagTaskStatusEnum.Lighting || w.TaskStatus == (int)ElTagTaskStatusEnum.NeedLight)); + return sqlFuc.ExecuteCommand(); + } + catch(Exception ex) { _ = ex; return 0; } + } + + /// + /// 清除这个站台之前未完成的电子标签任务 + /// + /// + /// + public int ClearNotCompleteTaskWithStand(string? standId) + { + if (string.IsNullOrEmpty(standId) || standId.Length < 1) return 0; + try + { + var sqlFuc = CommonTool.DbServe.Updateable() + .SetColumns(s => s.TaskStatus == (int)ElTagTaskStatusEnum.Error) + .SetColumns(s => s.Remark == "新箱子到,自动结束") + .Where(w => w.Location!.StartsWith(standId.Substring(standId.Length - 1)) && (w.TaskStatus == (int)ElTagTaskStatusEnum.Lighting || w.TaskStatus == (int)ElTagTaskStatusEnum.NeedLight)); + return sqlFuc.ExecuteCommand(); + } + catch (Exception ex) { _ = ex; return 0; } + } + /// /// 清理多少天之前的数据 diff --git a/WcsMain/DataBase/Dao/AppErrRecorDao.cs b/WcsMain/DataBase/Dao/AppErrRecorDao.cs new file mode 100644 index 0000000..6b30911 --- /dev/null +++ b/WcsMain/DataBase/Dao/AppErrRecorDao.cs @@ -0,0 +1,31 @@ +using WcsMain.Common; +using WcsMain.DataBase.TableEntity; +using WcsMain.WcsAttribute.AutoFacAttribute; + +namespace WcsMain.DataBase.Dao; + +[Component] +public class AppErrRecorDao +{ + + /// + /// 插入数据 + /// + /// + /// + public int Insert(params AppErrRecord[] records) + { + try + { + var sqlFuc = CommonTool.DbServe.Insertable(records); + return sqlFuc.ExecuteCommand(); + } + catch (Exception ex) + { + _ = ex; + return 0; + } + } + + +} diff --git a/WcsMain/DataBase/TableEntity/AppBaseErr.cs b/WcsMain/DataBase/TableEntity/AppBaseErr.cs index 9294f5f..9f19b4b 100644 --- a/WcsMain/DataBase/TableEntity/AppBaseErr.cs +++ b/WcsMain/DataBase/TableEntity/AppBaseErr.cs @@ -28,7 +28,15 @@ public class AppBaseErr /// [SugarColumn(ColumnName = "err_type")] [JsonPropertyName("errType")] - public int? ErrType { get; set; } + public string? ErrType { get; set; } + + + /// + /// 报警级别 + /// + [SugarColumn(ColumnName = "err_level")] + [JsonPropertyName("errLevel")] + public int? ErrLevel { get; set; } /// /// 报警信息 diff --git a/WcsMain/DataBase/TableEntity/AppElTagTask.cs b/WcsMain/DataBase/TableEntity/AppElTagTask.cs index f5a0573..b499a6c 100644 --- a/WcsMain/DataBase/TableEntity/AppElTagTask.cs +++ b/WcsMain/DataBase/TableEntity/AppElTagTask.cs @@ -15,6 +15,13 @@ public class AppElTagTask [JsonPropertyName("taskId")] public string? TaskId { get; set; } + /// + /// 任务号 + /// + [SugarColumn(ColumnName = "wms_task_id")] + [JsonPropertyName("wmsTaskId")] + public string? WmsTaskId { get; set; } + /// /// 任务组 /// diff --git a/WcsMain/DataBase/TableEntity/AppErrRecord.cs b/WcsMain/DataBase/TableEntity/AppErrRecord.cs new file mode 100644 index 0000000..7f65fa0 --- /dev/null +++ b/WcsMain/DataBase/TableEntity/AppErrRecord.cs @@ -0,0 +1,56 @@ +using SqlSugar; +using System.Text.Json.Serialization; +using WcsMain.WcsAttribute.Clear; + +namespace WcsMain.DataBase.TableEntity; + +/// +/// 报警记录表 +/// +[SugarTable("tbl_app_err_record")] +[ClearTable("create_time", 180)] +public class AppErrRecord +{ + /// + /// 记录号 + /// + [SugarColumn(ColumnName = "record_id", IsPrimaryKey = true)] + [JsonPropertyName("recordId")] + public string? RecordId { get; set; } + + /// + /// 区域 + /// + [SugarColumn(ColumnName = "area")] + [JsonPropertyName("area")] + public string? Area { get; set; } + + /// + /// 报警编号 + /// + [SugarColumn(ColumnName = "err_no")] + [JsonPropertyName("errNo")] + public int? ErrNo { get; set; } + + /// + /// 设备号 + /// + [SugarColumn(ColumnName = "equipment_id")] + [JsonPropertyName("equipmentId")] + public string? EquipmentId { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "create_time")] + [JsonPropertyName("createTime")] + public DateTime? CreateTime { get; set; } + + /// + /// 备注 + /// + [SugarColumn(ColumnName = "remark")] + [JsonPropertyName("remark")] + public string? Remark { get; set; } + +} diff --git a/WcsMain/ElTag/Atop/BaseOprDataHandler.cs b/WcsMain/ElTag/Atop/BaseOprDataHandler.cs index e3c9eb8..f4a12ff 100644 --- a/WcsMain/ElTag/Atop/BaseOprDataHandler.cs +++ b/WcsMain/ElTag/Atop/BaseOprDataHandler.cs @@ -74,7 +74,7 @@ public class BaseOprDataHandler(AppElTagLocationDao tagBaseDao, AppElTagTaskDao eltags = [.. eltags.OrderByDescending(el => el.LastLightTime)]; var eltag = eltags[0]; string? taskId = eltag.TaskId; // 获取任务号 - if(string.IsNullOrEmpty(taskId) ) + if(string.IsNullOrEmpty(taskId)) { ConsoleLog.Warning($"【异常】电子标签确认按钮按下,该标签没有绑定的显示任务,控制器:{tcpServe.ControllerDisplayName},标签号:{tcpServe.TagId},数据:{tcpServe.Data}"); return; @@ -106,7 +106,7 @@ public class BaseOprDataHandler(AppElTagLocationDao tagBaseDao, AppElTagTaskDao TaskType = tagTask.TaskType, VehicleNo = tagTask.VehicleNo, OrderId = tagTask.OrderId, - TaskId = tagTask.TaskId, + TaskId = tagTask.WmsTaskId, Location = tagTask.Location, GoodsId = tagTask.GoodsId, GoodsName = tagTask.GoodsName, diff --git a/WcsMain/EquipOperation/ElTag/AtopOperation.cs b/WcsMain/EquipOperation/ElTag/AtopOperation.cs index 202ced0..2653bde 100644 --- a/WcsMain/EquipOperation/ElTag/AtopOperation.cs +++ b/WcsMain/EquipOperation/ElTag/AtopOperation.cs @@ -26,6 +26,7 @@ public class AtopOperation { col++; if (col >= 5) col = 0; + CommonTool.OprTcpClient.Send(TagSendInfo.SetTagModel(Convert.ToByte(tagInfo.TagId), TagMode.Picking), tagInfo.ControllerDisplayName!); CommonTool.OprTcpClient.Send(TagSendInfo.ShowTagId(Convert.ToByte(tagInfo.TagId)), tagInfo.ControllerDisplayName!); CommonTool.OprTcpClient.Send(TagSendInfo.LedColor(Convert.ToByte(tagInfo.TagId), (LedColor)col), tagInfo.ControllerDisplayName!); // 显示颜色 CommonTool.OprTcpClient.Send(TagSendInfo.LedStatus(Convert.ToByte(tagInfo.TagId), LedStatus._0_25secblinking), tagInfo.ControllerDisplayName!); // 显示闪烁频率 diff --git a/WcsMain/Properties/PublishProfiles/FolderProfile.pubxml.user b/WcsMain/Properties/PublishProfiles/FolderProfile.pubxml.user index f559023..4f0082f 100644 --- a/WcsMain/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/WcsMain/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>F:\A开发项目\A菲达宝开项目\2024-05_苏州卡特\应用程序\WcsService\WcsMain\bin\Release\net8.0\publish\ - True|2024-08-07T02:16:37.1827604Z||;True|2024-03-29T15:42:25.2332590+08:00||;False|2024-03-29T15:41:29.1754215+08:00||;True|2024-03-29T15:21:55.1373612+08:00||;True|2024-03-28T09:54:32.8968372+08:00||;True|2024-01-28T15:05:36.1055501+08:00||;True|2024-01-28T15:02:06.6945727+08:00||;True|2024-01-28T14:56:23.0500171+08:00||;True|2024-01-20T20:29:00.5459863+08:00||; + True|2024-08-15T03:33:38.2722633Z||;True|2024-08-15T10:25:38.1970709+08:00||;True|2024-08-15T09:10:35.3249477+08:00||;True|2024-08-15T08:54:49.3636124+08:00||;True|2024-08-14T10:23:19.0348163+08:00||;True|2024-08-07T10:16:37.1827604+08:00||;True|2024-03-29T15:42:25.2332590+08:00||;False|2024-03-29T15:41:29.1754215+08:00||;True|2024-03-29T15:21:55.1373612+08:00||;True|2024-03-28T09:54:32.8968372+08:00||;True|2024-01-28T15:05:36.1055501+08:00||;True|2024-01-28T15:02:06.6945727+08:00||;True|2024-01-28T14:56:23.0500171+08:00||;True|2024-01-20T20:29:00.5459863+08:00||; \ No newline at end of file