using AngleSharp.Dom; using Elastic.Clients.Elasticsearch.Tasks; using Furion.DatabaseAccessor; using Microsoft.AspNetCore.SignalR; using WCS.Application.Entity; using WCS.Application.Service.WcsTask.Dto; namespace WCS.Application; /// /// 任务表服务 /// [ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)] public class WcsTaskService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _wcsTaskRep; private readonly IHubContext _taskLogHubContext; private readonly SqlSugarRepository _wcsCheckTaskRep; private readonly SqlSugarRepository _wcsMateialPzInfoRep; public WcsTaskService(SqlSugarRepository wcsTaskRep, IHubContext taskLogHubContext, SqlSugarRepository wcsCheckTaskRep, SqlSugarRepository wcsMateialPzInfoRep) { _wcsTaskRep = wcsTaskRep; _taskLogHubContext = taskLogHubContext; _wcsCheckTaskRep = wcsCheckTaskRep; _wcsMateialPzInfoRep = wcsMateialPzInfoRep; } /// /// 分页查询任务表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [DisplayName("分页查询任务表")] public async Task> Page(PageWcsTaskInput input) { input.SearchKey = input.SearchKey?.Trim(); var query = _wcsTaskRep.AsQueryable() .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => u.TaskNo.Contains(input.SearchKey) ) .WhereIF(!string.IsNullOrWhiteSpace(input.TaskNo), u => u.TaskNo.Contains(input.TaskNo.Trim())) .WhereIF(input.TaskType.HasValue, u => u.TaskType == input.TaskType) .WhereIF(input.Status.HasValue, u => u.Status == input.Status) .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(); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// /// 增加任务表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [DisplayName("增加任务表")] public async Task Add(AddWcsTaskInput input) { if(await _wcsTaskRep.AsQueryable().AnyAsync(s => s.TaskNo == input.TaskNo)) { throw Oops.Bah("任务号重复"); } if (input.UnstackingMode == UnstackingModeEnum.Machine) { if (string.IsNullOrEmpty(input.SkuNo) || string.IsNullOrEmpty(input.SkuName)) { throw Oops.Bah("机器人拣货,物料和批次信息不能为空"); } } var entity = input.Adapt(); entity.Origin = "WCS"; #region 分配拆垛工位 //分拣任务信息 List taskPortList = await _wcsCheckTaskRep.Context.Queryable().Where(w => w.RoboatType == PLCTypeEnum.StackingRobot).Select().ToListAsync(); if (taskPortList.Count<=0) { throw Oops.Bah("拆垛工位异常"); } var taskList = await _wcsTaskRep.Context.Queryable().Where(w => w.Status == 0 && w.IsBind == 0 && w.TaskType == TaskTypeEnum.Out).ToListAsync(); foreach (var item in taskPortList) { item.PortCount= taskList.Where(w=>w.StationNum==item.Port).Count(); } var portInfo = taskPortList.OrderBy(o => o.PortCount).ThenBy(o => o.LineNO).First(); //拆垛工位号 entity.StationNum = portInfo.Port; #endregion await _wcsTaskRep.InsertAsync(entity); return entity.Id; } /// /// 删除任务表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [DisplayName("删除任务表")] public async Task Delete(DeleteWcsTaskInput input) { var entity = await _wcsTaskRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); await _wcsTaskRep.FakeDeleteAsync(entity); //假删除 //await _wcsTaskRep.DeleteAsync(entity); //真删除 } /// /// 更新任务表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [DisplayName("更新任务表")] public async Task Update(UpdateWcsTaskInput input) { var entity = input.Adapt(); await _wcsTaskRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取任务表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [DisplayName("获取任务表")] public async Task Detail([FromQuery] QueryByIdWcsTaskInput input) { return await _wcsTaskRep.GetFirstAsync(u => u.Id == input.Id); } /// /// 获取任务表列表 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [DisplayName("获取任务表列表")] public async Task> List([FromQuery] PageWcsTaskInput input) { return await _wcsTaskRep.AsQueryable().Select().ToListAsync(); } /// /// 完成/取消任务表 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Finsh")] [DisplayName("完成/取消任务表")] [UnitOfWork] public async Task Finsh(UpdateWcsTaskInput input) { if (input.Status == TaskStatusEnum.Complete || input.Status == TaskStatusEnum.Cancell) { var modTask = await _wcsTaskRep.GetByIdAsync(input.Id); if (modTask.Status > TaskStatusEnum.Doing) throw Oops.Oh("任务状态异常"); if (input.Status == TaskStatusEnum.Complete) { modTask.IsSuccess = TaskSuccessEnum.Success; modTask.FinishDate = DateTime.Now;//完成时间 } else { modTask.IsSuccess = TaskSuccessEnum.Fail; modTask.CancelDate = DateTime.Now;//取消时间 } modTask.Status = input.Status; 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() { TaskNo = modTask.TaskNo, PlcId = 0, PlcName = "", Status = TaskStatusEnum.Complete, StartLocat = modTask.StartLocate, EndLocat = modTask.EndLocate, InteractiveMsg = input.Status == TaskStatusEnum.Complete ? "任务已手动完成" : "任务已手动取消", PalletNo = modTask.PalletNo }; await _wcsTaskRep.Context.Insertable(modTaskMonitor).ExecuteCommandAsync(); //await _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt()); //await _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt()); #region //分拣任务信息 var checkTaskList = _wcsCheckTaskRep.Context.Queryable().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 { throw Oops.Oh("任务状态异常"); } } }