/* *所有关于Dt_taskinfo类的业务代码应在此处编写 *可使用repository.调用常用方法,获取EF/Dapper等信息 *如果需要事务请使用repository.DbContextBeginTransaction *也可使用DBServerProvider.手动获取数据库相关信息 *用户信息、权限、角色等使用UserContext.Current操作 *Dt_taskinfoService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter */ using WIDESEA.Core.BaseProvider; using WIDESEA.Core.Extensions.AutofacManager; using WIDESEA.Entity.DomainModels; using System.Linq; using WIDESEA.Core.Utilities; using System.Linq.Expressions; using WIDESEA.Core.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Http; using WIDESEA.Services.IRepositories; using System; using WIDESEA.Common; using System.Collections.Generic; using WIDESEA.Services.Repositories; using WIDESEA.Common.CustomModels; using WIDESEA.Common.Modbus; using Newtonsoft.Json; using WIDESEA.Core.EFDbContext; using WIDESEA.Common.EquipEnum; using SqlSugar; using WIDESEA_Services; using WIDESEA.Core.ManageUser; using Microsoft.Extensions.Caching.Memory; using HttpContext = WIDESEA.Core.Utilities.HttpContext; using WIDESEA.Core.Services; namespace WIDESEA.Services.Services { public partial class Dt_taskinfoService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IDt_taskinfoRepository _repository;//访问数据库 [ActivatorUtilitiesConstructor] public Dt_taskinfoService( IDt_taskinfoRepository dbRepository, IHttpContextAccessor httpContextAccessor ) : base(dbRepository) { _httpContextAccessor = httpContextAccessor; _repository = dbRepository; //多租户会用到这init代码,其他情况可以不用 //base.Init(dbRepository); } /// /// 获取空托盘出库的任务列表,给前端的PDA展示 /// /// public static WebResponseContent GetEmptyPalletTaskList() { WebResponseContent content = new WebResponseContent(); try { List taskList = Dt_taskinfoRepository.Instance.Find(x => x.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()); List> data = new List>(); for (int i = 0; i < taskList.Count(); i++) { Dictionary dic = new Dictionary(); dic.Add("barcode", taskList[i].task_barcode); dic.Add("locationId", taskList[i].task_fromlocationid); if (taskList[i].task_state == TaskState.TaskState_Create.ToString()) dic.Add("state", "等待执行"); else dic.Add("state", "执行中"); data.Add(dic); } content.OK(data: data); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 取消某一条未开始的任务 /// public static WebResponseContent CancelATask(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { string barcode = saveModel.MainData["barcode"].ToString(); if (barcode == null) throw new Exception("取消任务的托盘号不能为空"); Dt_taskinfo taskinfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == barcode); if (taskinfo == null) throw new Exception($"没有找到托盘号:【{barcode}】对应的任务"); if (taskinfo.task_state != TaskState.TaskState_Create.ToString()) throw new Exception($"托盘号:【{barcode}】对应的任务已经开始执行,无法取消"); content = Dt_taskinfoRepository.Instance.DbContextBeginTransaction(() => { Dt_locationinfo locationinfo = null; if (taskinfo.task_type.Contains(TaskType.TaskType_Empty_Pallet_Inbound.ToString()) || taskinfo.task_type.Contains(TaskType.TaskType_Box_Pallet_Inbound.ToString())) { locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskinfo.task_tolocationid); locationinfo.location_state = LocationState.LocationState_Empty.ToString(); } else { locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskinfo.task_fromlocationid); if (locationinfo.location_state.Contains(LocationState.LocationState_ErrorCheckOutbound.ToString())) locationinfo.location_state = LocationState.LocationState_Error.ToString(); else locationinfo.location_state = LocationState.LocationState_Stored.ToString(); } Dt_locationinfoRepository.Instance.Update(locationinfo, x => x.location_state, true); if (taskinfo.task_type.Contains(TaskType.TaskType_Box_Pallet_Inbound.ToString())) { Dt_boxing_head boxHead = Dt_boxing_headRepository.Instance.FindFirst(r => r.boxhead_barcode == taskinfo.task_barcode); if (null != boxHead) { Dt_boxing_detail boxDetail = Dt_boxing_detailRepository.Instance.FindFirst(r => r.boxdtl_headid == boxHead.boxhead_id.ToString()); if (null != boxDetail) Dt_boxing_detailRepository.Instance.Delete(boxDetail, true); Dt_boxing_headRepository.Instance.Delete(boxHead, true); } } Dt_taskinfoRepository.Instance.Delete(taskinfo, true); if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()) { content.OK(); } else { SaveModel sm = new SaveModel(); sm.MainData = new Dictionary(); sm.MainData.Add("barcode", barcode); content = WCSApi.CancelTaskToWCS(sm); if (!content.Status) throw new Exception($"取消WCS中的任务出错,原因:{content.Message}"); } return content; }); } catch (Exception ex) { content.Error("取消任务失败:" + ex.Message); } finally { Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content); } return content; } /// /// 完成某一条任务 /// public static WebResponseContent CompletedTask(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); string barcode = string.Empty; try { barcode = saveModel.MainData["barcode"].ToString(); content = CommonFunction.TaskFinishedAction(saveModel); if (content.Status) content.OK($"手动完成任务成功,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode}"); else content.Error($"手动完成任务失败,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode},错误信息:{content.Message}"); } catch (Exception ex) { content.Error($"手动完成任务失败,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode},错误信息:{ex.Message}"); } Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content); return content; } /// /// 取消测量,直接回库 /// /// public static WebResponseContent CancelAMeasureTask(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { string barcode = saveModel.MainData["barcode"].ToString(); Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == barcode && x.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()); if (taskInfo == null) { throw new Exception($"::Error::=> 没有找到【{barcode}】对应的测量任务"); } taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == barcode && x.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() && (x.task_state == TaskState.TaskState_Measure_Out_Line_Finished.ToString() || x.task_state == TaskState.TaskState_Measureing.ToString())); if (taskInfo == null) { throw new Exception($"::Warning::=> 托盘号【{barcode}】对应的测量任务目前未到达机械手抓取工位,请等待"); } content = Dt_taskinfoRepository.Instance.DbContextBeginTransaction(() => { try { //更改WCS的任务状态和类型,变为测量回库 content = WCSApi.CancelAMeasureTask(saveModel); if (content.Status) { //更改WMS的任务状态和类型 taskInfo.task_state = TaskState.TaskState_Measure_Back_Line_Wait_Executing.ToString(); taskInfo.task_type = TaskType.TaskType_Box_Pallet_Measure_Back.ToString(); Dt_taskinfoRepository.Instance.Update(taskInfo, true); Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskInfo.task_fromlocationid); if (locationinfo != null) { locationinfo.location_state = LocationState.LocationState_Measureing.ToString(); Dt_locationinfoRepository.Instance.Update(locationinfo); } } else { content.Error(content.Message); return content; } content.OK(); } catch (Exception ex) { content.Error(ex.Message); } return content; }); } catch (Exception ex) { content.Error(ex.Message); } return content; } } }