using AngleSharp.Dom; using Elastic.Clients.Elasticsearch.Tasks; using Furion.DatabaseAccessor; using Microsoft.AspNetCore.SignalR; using WCS.Application.Entity; 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) .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"; await _wcsTaskRep.InsertAsync(entity); #region 绑定垛机 //物料品种信息 var skuInfo = await _wcsMateialPzInfoRep.Context.Queryable().Where(w => w.SkuNo == input.SkuNo).FirstAsync(); if (skuInfo == null) { throw Oops.Oh("物料品种信息不存在"); } //分拣任务信息 var checkTaskInfo = await _wcsCheckTaskRep.Context.Queryable().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; } /// /// 删除任务表 /// /// /// [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; else modTask.IsSuccess = TaskSuccessEnum.Fail; modTask.FinishDate = DateTime.Now; modTask.Status = input.Status; await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, 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("任务状态异常"); } } }