using System.ComponentModel; using System.Threading.Tasks; using ServiceCenter.Extensions; using ServiceCenter.SqlSugars; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.WebApi.Controllers; using WCS.WorkEngineering.WebApi.Models.WMS.Response; using WCS.WorkEngineering.Worlds; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems; /// /// UpLoadSystems /// [BelongTo(typeof(UpLoadWorld))] [Description("UpLoadSystems")] public class UpLoadSystems : DeviceSystem> { protected override bool ParallelDo => true; public override void Do(Device obj) { //更新出库放货完成状态 SqlSugarHelper.Do(_db => { var nowTime = DateTime.Now; var db = _db.Default; var taskList = db.Queryable().RowLock().Where(x => x.Uploaded != TaskStatus.ConveyorExecution && x.Status == TaskStatus.StackerCompleted && x.Type == TaskType.OutDepot).ToList(); WCS_TaskInfo taskNow = null; // 1. 遍历任务列表,处理任务完成状态 foreach (var task in taskList) { var res = WmsApi.SrmPickOutCompleted(task.ID); if (res.ResCode == ResponseStatusCodeEnum.Sucess) { taskNow = task; // 记录成功的任务 break; // 只需要成功处理一个任务,跳出循环 } World.Log($"出库放货完成状态同步失败: 任务ID {task.ID}, 错误信息: {res.ResMsg}"); } // 2. 更新任务状态并记录日志,仅当 taskOld 不为 null 时才执行 taskNow.Uploaded = TaskStatus.ConveyorExecution; taskNow.Status = TaskStatus.ConveyorExecution; taskNow.EditTime = nowTime; try { // 使用行锁和分表更新,防止锁表 db.Updateable(taskNow).UpdateColumns(x => new { x.Uploaded, x.EditTime, x.Status }).ExecuteCommand(); // 记录任务详细日志 taskNow.AddWCS_TASK_DTL(db, "", "同步出库任务放货完成状态同步至WMS"); } catch (Exception ex) { World.Log($"任务ID {taskNow.ID} 出库放货完成状态同步失败,错误信息: {ex.Message}"); } var isEnd = false; ////一次就同步一条数据即可 //foreach (var task in taskList) //{ // if (isEnd) continue; // var res = WmsApi.SrmPickOutCompleted(task.ID); // if (res.ResCode == ResponseStatusCodeEnum.Sucess) // { // taskIdList.Add(task); //更新成功 // isEnd = true; // } // World.Log($"出库放货完成状态同步失败:{task.ID}[{res.ResMsg}]"); //} ////拆分防止锁表 //foreach (var task in taskIdList) //{ // task.Uploaded = TaskStatus.ConveyorExecution; // task.Status = TaskStatus.ConveyorExecution; // task.EditTime = nowTime; // db.UpdateableRowLock(task).UpdateColumns(x => new { x.Uploaded, x.EditTime, x.Status }) // .ExecuteCommand(); // task.AddWCS_TASK_DTL(db, "", "同步出库任务放货完成状态同步至WMS"); //} }); //环形库组盘任务/立库入库任务/二楼立库出库//芯股叫料 更新完成 SqlSugarHelper.Do(_db => { var nowTime = DateTime.Now; var db = _db.Default; var taskList = db.Queryable().RowLock() .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R")) || ((x.Type == TaskType.EnterDepot || x.Type == TaskType.OutDepot) && !x.WarehouseCode.Contains("R")) || (x.Type == TaskType.EnterDepot && x.WarehouseCode.Contains("CRZP")) || (x.Type == TaskType.OutDepot && x.Device == "CR") || (x.Type == TaskType.OutDepot && x.AddrFrom.Contains("NSTJ") && x.AddrTo.Contains("NSTJ"))) && x.Status == TaskStatus.Finish && x.Uploaded != TaskStatus.Finish) .SplitTable(x => x.Take(2)).ToList(); WCS_TaskOld taskOld = null; // 1. 遍历任务列表,处理任务完成状态 foreach (var task in taskList) { var res = WmsApi.CompleteTask(task.Id); if (res.ResCode == ResponseStatusCodeEnum.Sucess) { taskOld = task; // 记录成功的任务 break; // 只需要成功处理一个任务,跳出循环 } World.Log($"入库完成状态同步失败: 任务ID {task.Id}, 错误信息: {res.ResMsg}"); } // 2. 更新任务状态并记录日志,仅当 taskOld 不为 null 时才执行 taskOld.Uploaded = TaskStatus.Finish; taskOld.EditTime = nowTime; try { // 使用行锁和分表更新,防止锁表 db.Updateable(taskOld).SplitTable(x => x.Take(2)).ExecuteCommand(); // 记录任务详细日志 taskOld.AddWCS_TASK_DTL(db, "", "同步入库完成状态同步至WMS"); } catch (Exception ex) { World.Log($"任务ID {taskOld.Id} 入库完成状态同步失败,错误信息: {ex.Message}"); } }); ////立库二楼出库更新完成 //SqlSugarHelper.Do(_db => //{ // var taskIdList = new List(); // var nowTime = DateTime.Now; // var db = _db.Default; // var taskList = db.Queryable().SplitTable(x => x.Take(2)) // .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R")) || (x.Type == TaskType.EnterDepot && !x.WarehouseCode.Contains("R"))) // && x.Status == TaskStatus.Finish // && x.Uploaded != TaskStatus.Finish).ToList(); // foreach (var task in taskList) // { // var res = WmsApi.CompleteTask(task.Id); // if (res.ResCode == ResponseStatusCodeEnum.Sucess) taskIdList.Add(task.Id); // else World.Log($"入库完成状态同步失败:{task.Id}[{res.ResMsg}]"); // } // //拆分防止锁表 // foreach (var taskId in taskIdList) // { // var task = db.Queryable().SplitTable(x => x.Take(2)).First(x => x.Id == taskId); // task.Uploaded = TaskStatus.Finish; // task.EditTime = nowTime; // db.Updateable(task).SplitTable(x => x.Take(2)).ExecuteCommand(); // task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS"); // } //}); } public override bool Select(Device dev) { return dev.Code == nameof(UpLoadSystems); } }