using AngleSharp.Dom; using log4net.Core; using Magicodes.ExporterAndImporter.Excel.Utility.TemplateExport; using Mapster; using Masuit.Tools; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using NewLife; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using OfficeOpenXml.Table.PivotTable; using SixLabors.Fonts.Tables.AdvancedTypographic; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Metadata; using System.Security.Policy; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using WIDESEA_Cache; using WIDESEA_Common; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.Const; using WIDESEA_Core.Enums; using WIDESEA_DTO.Basic; using WIDESEA_DTO.Location; using WIDESEA_DTO.Stock; using WIDESEA_DTO.WMS; using WIDESEA_IServices; using WIDESEA_Model.Models; using WIDESEA_Model.Models.Basic; using WIDESEA_StorageTaskRepository; using WIDESEAWCS_BasicInfoRepository; using WIDESEAWCS_QuartzJob.Models; using static System.Collections.Specialized.BitVector32; namespace WIDESEA_StorageTaskServices; public partial class Dt_TaskService : ServiceBase, IDt_TaskService { private readonly LogFactory LogFactory = new LogFactory(); private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IStockInfoRepository _stockInfoRepository; private readonly IStockInfoDetailRepository _stockInfoDetailRepository; private readonly IDt_Task_HtyRepository _task_HtyRepository; private readonly IMapper _mapper; private readonly ILocationInfoRepository _locationRepository; private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository; private readonly IBoxingInfoRepository _boxingInfoRepository; //组盘 private readonly IDt_AreaInfoRepository _areaInfoRepository; //区域 private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly ISys_ConfigService _configService; private readonly IDt_WareAreaInfoRepository _wareAreaInfoRepository; public Dt_TaskService(IDt_TaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoRepository stockInfoRepository, IDt_Task_HtyRepository task_HtyRepository, IMapper mapper, ILocationInfoRepository locationRepository, ITaskExecuteDetailRepository taskExecuteDetailRepository, ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository, IBoxingInfoRepository boxingInfoRepository, IDt_AreaInfoRepository areaInfoRepository, IStockInfoDetailRepository stockInfoDetailRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, IDt_WareAreaInfoRepository wareAreaInfoRepository) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _stockInfoRepository = stockInfoRepository; _task_HtyRepository = task_HtyRepository; _mapper = mapper; _locationRepository = locationRepository; _taskExecuteDetailRepository = taskExecuteDetailRepository; _locationStatusChangeRecordRepository = locationStatusChangeRecordRepository; _boxingInfoRepository = boxingInfoRepository; _areaInfoRepository = areaInfoRepository; _stockInfoDetailRepository = stockInfoDetailRepository; _stationManagerRepository = stationManagerRepository; _configService = configService; _wareAreaInfoRepository = wareAreaInfoRepository; } #region 外部接口方法 #region 出库任务完成 public async Task CompleteOutboundTaskAsync(Dt_Task task, DtStockInfo stock) { WebResponseContent content = new WebResponseContent(); try { } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); task.ErrorMessage = ex.Message; await BaseDal.UpdateDataAsync(task); return content.Error(ex.Message); } return content; } #endregion 出库任务完成 #region 入库任务完成 /// /// 完成入库任务 /// /// 任务数据合集 /// 返回结果集 public async Task CompleteInboundTaskAsync(Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { var boxinfo = await _boxingInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); if (boxinfo == null) { return content.Error("未找到组盘数据"); } if (task.TaskState.GetTaskStateGroup() == TaskStateGroup.CarryGroup) { var result1 = UpdateLocationStatus(task.SourceAddress, LocationEnum.Free, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticInbound); await _locationStatusChangeRecordRepository.AddDataAsync(result1.Item1); await _locationRepository.UpdateDataAsync(result1.Item2); } var stock = CreateStock(boxinfo, task); task.TaskState = (int)TaskInStatusEnum.InFinish; var taskHty = task.Adapt(); taskHty.FinishTime = DateTime.Now; taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成; taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; var result2 = UpdateLocationStatus(task.TargetAddress, LocationEnum.InStock, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticInbound); _unitOfWorkManage.BeginTran(); await _stockInfoRepository.AddDataNavAsync(stock); await DeleteTaskAsync(task.TaskId); await AddTaskHtyAsync(taskHty); await _locationStatusChangeRecordRepository.AddDataAsync(result2.Item1); await _locationRepository.UpdateDataAsync(result2.Item2); _unitOfWorkManage.CommitTran(); content.OK("入库完成"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); task.ErrorMessage = ex.Message; await BaseDal.UpdateDataAsync(task); return content.Error(ex.Message); } return content; } public DtStockInfo CreateStock(DtBoxingInfo boxingInfo,Dt_Task task) { var boxDetail = boxingInfo.BoxingInfoDetails.Adapt>(); boxDetail.ForEach(x => { x.Status = (int)StockStateEmun.已入库; }); var mergedDetails = boxDetail .GroupBy(x => new { x.MaterielCode, x.MaterielName }) .Select(g => new DtStockInfoDetail { MaterielCode = g.Key.MaterielCode, MaterielName = g.Key.MaterielName, DemandClassification = g.FirstOrDefault().DemandClassification, Warehouse = "智能立库", WareHouseId = "107", OrderNo = g.FirstOrDefault().OrderNo, Unit = g.FirstOrDefault().Unit, Specs = g.FirstOrDefault().Specs, Weight = g.FirstOrDefault().Weight, OutboundQuantity = g.FirstOrDefault().OutboundQuantity, DrawingNumber = g.FirstOrDefault().DrawingNumber, Date = g.FirstOrDefault().Date, AllocateWarehouse = g.FirstOrDefault().AllocateWarehouse, Remark = g.FirstOrDefault().Remark, Quantity = g.Sum(item => item.Quantity), }) .ToList(); return new DtStockInfo() { PalletCode = task.PalletCode, LocationCode = task.TargetAddress, CreateDate = DateTime.Now, Creater = "system", IsFullExit = boxingInfo.IsFullExit, StockInfoDetails = mergedDetails, StockStatus = (int)StockStateEmun.已入库 }; } #endregion 入库任务完成 #region 任务完成 /// /// 完成任务 /// /// 任务编号 /// 返回结果集 public async Task CompleteAsync(int taskNum) { // 初始化响应内容 WebResponseContent content = new WebResponseContent(); // 提取任务数据 LogFactory.GetLog("任务完成").InfoFormat(true, "提取任务数据", $"任务号:{taskNum}"); // 验证任务是否存在0 var task = await GetByTaskNum(taskNum); if (task == null) { return content.Error("任务不存在"); } LogFactory.GetLog("任务完成").InfoFormat(true, "验证任务是否存在", JsonConvert.SerializeObject(task)); // 验证库存是否存在 var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) { return await CompleteOutboundTaskAsync(task, stock); } else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) { return await CompleteInboundTaskAsync(task); } else { return content.Error("未找到任务类型"); } } #endregion 任务完成 #region 取消任务 public WebResponseContent TaskCancel(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) { return content = WebResponseContent.Instance.Error("未找到任务信息"); } _unitOfWorkManage.BeginTran(); MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCancel"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task }); if (responseContent != null) { if (responseContent != null) { } } } return content = WebResponseContent.Instance.Error("未找到任务类型对应业务处理逻辑"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content = WebResponseContent.Instance.Error(ex.Message); } } #endregion #region 请求任务入库 public async Task RequestInboundTaskAsync(RequestTaskDto taskDto) { WebResponseContent content = new WebResponseContent(); try { return content; } catch (Exception err) { return content.Error(err.Message); } } #endregion 请求任务入库 #region 更新任务状态 /// /// 更新任务货位 /// /// /// public async Task UpdateTaskStatus(int taskNum, int taskState) { WebResponseContent content = new WebResponseContent(); try { var task = await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); if (task == null) return content.Error("未找到任务"); task.TaskState = taskState; var asb = await BaseDal.UpdateDataAsync(task); if (asb) content.OK(); else content.Error(); } catch (Exception ex) { content.Error(ex.Message); } return content; } #endregion #region 请求出库 /// /// 手动出库至缓存区域 /// /// /// public async Task RequestOutboundTaskAsync(RequestTaskDto taskDto) { WebResponseContent content = new WebResponseContent(); try { return content; } catch (Exception ex) { return content.Error(ex.Message); } } public (List,List) GetlcoationState(Dt_Task task, StatusChangeTypeEnum StatusChangeTypeEnum, DtLocationInfo location) { List locationStatusChangeRecords = new List(); List locations = new List(); var result = UpdateLocationStatus(task.SourceAddress, LocationEnum.InStockDisable, task.TaskNum.Value, (int)StatusChangeTypeEnum); locationStatusChangeRecords.AddRange(result.Item1); locations.AddRange(result.Item2); if(location.AreaId ==3|| location.AreaId == 7) { var result2 = UpdateLocationStatus(task.TargetAddress, LocationEnum.Lock, task.TaskNum.Value, (int)StatusChangeTypeEnum); locationStatusChangeRecords.AddRange(result2.Item1); locations.AddRange(result2.Item2); } return (locationStatusChangeRecords,locations); } #endregion 请求出库(实盘&空盘) #region 获取AGV任务号 private static readonly Random _random = new Random(); public static string GenerateUniqueId() { // 获取当前毫秒级时间戳 long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // 生成4位随机数(0000-9999) int randomNumber = _random.Next(0, 10000); string randomPart = randomNumber.ToString("D4"); // 补零到4位 return $"{timestamp}{randomPart}"; } #endregion #region 获取任务信息 public WebResponseContent GetTaskInfo() { WebResponseContent content = new WebResponseContent(); try { Expression> expression = x => true; if (!App.User.IsSuperAdmin) { expression = x => x.Creater == App.User.UserName; } var task = BaseDal.Db.Queryable().OrderByDescending(x => x.CreateDate).Take(100).Select(x => new Dt_Task { TaskNum = x.TaskNum, PalletCode = x.PalletCode, TaskType = x.TaskType, SourceAddress = x.SourceAddress, TargetAddress = x.TargetAddress }).ToList(); content = WebResponseContent.Instance.OK(data: task); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } #endregion #endregion 外部接口方法 #region 调用WCS接口 private string GetWCSIPAddress(string baseIp, string name) { var configz = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); var wcsBasez = configz.Where(x => x.ConfigKey == baseIp).FirstOrDefault()?.ConfigValue; var address = configz.Where(x => x.ConfigKey == name).FirstOrDefault()?.ConfigValue; if (wcsBasez == null || address == null) { throw new InvalidOperationException("WMS IP 未配置"); } return wcsBasez + address; } public async Task SendWCSTask(List taskDTO) { WebResponseContent content = new WebResponseContent(); var AgvSendTaskAddrss = GetWCSIPAddress(SysConfigConst.WCSIPAddress, SysConfigConst.ReceiveTask); // 发送请求并等待响应 var result = await HttpHelper.PostAsync(AgvSendTaskAddrss, taskDTO.ToJsonString()); content = JsonConvert.DeserializeObject(result.ToString()); return content; } #endregion #region 内部调用方法 public (List,List) UpdateLocationStatus(DtLocationInfo location, LocationEnum locationStatus, int taskNum, int StatusChangeType) { List locations = GetGroupLocations(location); List Beforelocation = locations.Select(x => new DtLocationInfo { Id = x.Id, LocationCode = x.LocationCode, LocationStatus = x.LocationStatus }).ToList(); foreach (var item in locations) { if (locationStatus == LocationEnum.Lock) { if (item.LocationCode == location.LocationCode) { item.LocationStatus = (int)LocationEnum.Lock; } else if (item.LocationStatus == (int)LocationEnum.Free) { item.LocationStatus = (int)LocationEnum.FreeDisable; } } else if (locationStatus == LocationEnum.InStock) { if (item.LocationCode == location.LocationCode) { item.LocationStatus = (int)LocationEnum.InStock; } else if (item.LocationStatus == (int)LocationEnum.FreeDisable) { item.LocationStatus = (int)LocationEnum.Free; } } else if (locationStatus == LocationEnum.InStockDisable) { if (item.LocationStatus == (int)LocationEnum.InStock) { item.LocationStatus = (int)LocationEnum.InStockDisable; } else if (item.LocationStatus == (int)LocationEnum.Free) { item.LocationStatus = (int)LocationEnum.FreeDisable; } } else if (locationStatus == LocationEnum.Free) { if (item.LocationCode == location.LocationCode) { item.LocationStatus = (int)LocationEnum.Free; } else if (item.LocationStatus == (int)LocationEnum.FreeDisable || item.LocationStatus == (int)LocationEnum.InStockDisable) { item.LocationStatus = (int)LocationEnum.Free; } } } List changeRecordDto = new List(); foreach (var item in Beforelocation) { var loc = locations.Where(x => x.LocationCode == item.LocationCode).FirstOrDefault(); if (loc != null) { DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord() { ChangeType = StatusChangeType, LocationCode = item.LocationCode, LocationId = loc.Id, Creater = "System", TaskNum = taskNum, AfterStatus = loc.LocationStatus, BeforeStatus = item.LocationStatus, }; changeRecordDto.Add(dtLocationStatusChangeRecord); } } return (changeRecordDto,locations); } public (List, List) UpdateLocationStatus(string locationCode, LocationEnum locationStatus, int taskNum, int StatusChangeType) { var location = _locationRepository.QueryFirst(x => x.LocationCode == locationCode); List locations = GetGroupLocations(location); List Beforelocation = locations.Select(x => new DtLocationInfo { Id = x.Id, LocationCode = x.LocationCode, LocationStatus = x.LocationStatus }).ToList(); foreach (var item in locations) { if (locationStatus == LocationEnum.Lock) { if (item.LocationCode == location.LocationCode) { item.LocationStatus = (int)LocationEnum.Lock; } } else if (locationStatus == LocationEnum.InStock) { if (item.LocationCode == location.LocationCode) { item.LocationStatus = (int)LocationEnum.InStock; } } else if (locationStatus == LocationEnum.InStockDisable) { if (item.LocationStatus == (int)LocationEnum.InStock) { item.LocationStatus = (int)LocationEnum.InStockDisable; } } else if (locationStatus == LocationEnum.Free) { item.LocationStatus = (int)LocationEnum.Free; } } List changeRecordDto = new List(); foreach (var item in Beforelocation) { var loc = locations.Where(x => x.LocationCode == item.LocationCode).FirstOrDefault(); if (loc != null) { DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord() { ChangeType = StatusChangeType, LocationCode = item.LocationCode, LocationId = loc.Id, Creater = "System", TaskNum = taskNum, AfterStatus = loc.LocationStatus, BeforeStatus = item.LocationStatus, }; changeRecordDto.Add(dtLocationStatusChangeRecord); } } return (changeRecordDto, locations); } public (DtLocationStatusChangeRecord, DtLocationInfo) UpdateEndLocationStatus(string locationCode, LocationEnum locationStatus, int taskNum, StatusChangeTypeEnum StatusChangeType) { var location = _locationRepository.QueryFirst(x => x.LocationCode == locationCode); if (location != null && (location.AreaId == 3 || location.AreaId == 7)) { int Beforelocation = location.LocationStatus; location.LocationStatus = (int)locationStatus; DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord() { ChangeType = (int)StatusChangeType, LocationCode = locationCode, LocationId = location.Id, Creater = "System", TaskNum = taskNum, AfterStatus = location.LocationStatus, BeforeStatus = Beforelocation, }; return (dtLocationStatusChangeRecord, location); } return (null, null); } public (DtLocationStatusChangeRecord, DtLocationInfo) UpdateLocationStatus(string locationCode, LocationEnum locationStatus, int taskNum, StatusChangeTypeEnum StatusChangeType) { var location = _locationRepository.QueryFirst(x => x.LocationCode == locationCode); int Beforelocation = location.LocationStatus; location.LocationStatus = (int)locationStatus; DtLocationStatusChangeRecord dtLocationStatusChangeRecord = new DtLocationStatusChangeRecord() { ChangeType = (int)StatusChangeType, LocationCode = locationCode, LocationId = location.Id, Creater = "System", TaskNum = taskNum, AfterStatus = location.LocationStatus, BeforeStatus = Beforelocation, }; return (dtLocationStatusChangeRecord, location); } public List GetGroupLocations(DtLocationInfo location) { List locationInfos = _locationRepository.QueryData(x => x.AreaId == location.AreaId); List locations = new List() { location }; if (location.AreaId == 1) { if (location.Depth == 2) { DtLocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == 1 && x.Column == location.Column && x.Layer == location.Layer && x.Row == 1); if (locationInfo != null) { locations.Add(locationInfo); } } } else if (location.AreaId == 2 || location.AreaId == 7) { var locationLateral = _locationRepository.QueryData(x => x.Row == location.Row && x.Column > location.Column && x.Remark == location.Remark); if (locationLateral.Count > 0) { locations.AddRange(locationLateral); } } else if (location.AreaId == 5 || location.AreaId == 6) { var locationLateral = _locationRepository.QueryData(x => x.Row == location.Row && x.Column < location.Column && x.Remark == location.Remark); if (locationLateral.Count > 0) { locations.AddRange(locationLateral); } } return locations; } /// /// 创建任务DTO /// private List CreateListTaskDTO(Dt_Task task) { return new List { new WMSTaskDTO { TaskNum = task.TaskNum.Value, Grade = task.Grade.Value, PalletCode = task.PalletCode, RoadWay = task.Roadway, SourceAddress = task.SourceAddress, TargetAddress = task.TargetAddress, TaskState = task.TaskState, Id = 0, TaskType = task.TaskType, } }; } private WMSTaskDTO CreateTaskDTO(Dt_Task task) { return new WMSTaskDTO { TaskNum = task.TaskNum.Value, Grade = task.Grade.Value, PalletCode = task.PalletCode, RoadWay = task.Roadway, SourceAddress = task.SourceAddress, TargetAddress = task.TargetAddress, TaskState = task.TaskState, Id = 0, TaskType = task.TaskType, }; } private List CreateTaskDTO(List task) { List taskNews = new List(); foreach (var item in task) { taskNews.Add(new WMSTaskDTO { TaskNum = item.TaskNum.Value, Grade = item.Grade.Value, PalletCode = item.PalletCode, RoadWay = item.Roadway, SourceAddress = item.SourceAddress, TargetAddress = item.TargetAddress, TaskState = item.TaskState, Id = 0, TaskType = item.TaskType, }); } return taskNews; } private async Task DeleteStockInfoAsync(int stockId) { var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(stockId); if (!isStockUpdated) { throw new Exception("库存信息更新失败"); } } private async Task AddStockInfoHtyAsync(DtStockInfo_Hty dtStock) { var isStockAdd = await SqlSugarHelper.DbWMS.InsertNav(dtStock).IncludesAllFirstLayer().ExecuteCommandAsync(); if (!isStockAdd) { throw new Exception("库存历史信息添加失败"); } } private async Task DeleteBoxingInfoAsync(int boxingId) { var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(boxingId); if (!isStockUpdated) { throw new Exception("库存信息更新失败"); } } private async Task AddBoxingHtyAsync(DtBoxingInfo_Hty boxingInfo) { var isStockAdd = await SqlSugarHelper.DbWMS.InsertNav(boxingInfo).IncludesAllFirstLayer().ExecuteCommandAsync(); if (!isStockAdd) { throw new Exception("组盘历史信息添加失败"); } } private async Task DeleteStockInfoDetailsAsync(IEnumerable details) { var ids = details.Select(x => (object)x.Id).ToArray(); var isStockDetailUpdated = await _stockInfoDetailRepository.DeleteDataByIdsAsync(ids); if (!isStockDetailUpdated) { throw new Exception("库存详情信息更新失败"); } } private async Task DeleteTaskAsync(int taskId) { var isTaskUpdated = await BaseDal.DeleteDataByIdAsync(taskId); if (!isTaskUpdated) { throw new Exception("任务信息更新失败"); } } private async Task AddTaskHtyAsync(Dt_Task_Hty taskHty) { var isTaskAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0; if (!isTaskAdd) { throw new Exception("历史任务信息添加失败"); } } public override WebResponseContent DeleteData(object[] key) { WebResponseContent content = new WebResponseContent(); // 创建历史任务实例模型 try { foreach (var item in key) { Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(key)); if (task == null) { return content.Error("未找到任务信息!"); } var taskHtyNG = CreateHistoricalTask(task, true); // 添加历史任务 var isTaskHtyAdd = _task_HtyRepository.AddData(taskHtyNG) > 0; // 删除任务数据 var isTaskDelete = BaseDal.Delete(task.TaskId); } return content.OK("删除成功!"); } catch (Exception ex) { return content.Error("删除任务异常:" + ex.Message); } } /// /// 根据任务号获取任务 /// /// /// public async Task GetByTaskNum(int taskNum) { return await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); } public async Task GetByTaskAddress(string SourceAddress, string TargetAddress) { return await BaseDal.QueryFirstAsync(x => x.SourceAddress == SourceAddress|| x.TargetAddress== TargetAddress); } #endregion 内部调用方法 #region private 内部方法 /// /// 创建历史任务记录 /// /// /// private Dt_Task_Hty CreateHistoricalTask(Dt_Task task, bool isHand = false) { // 更新任务状态 task.TaskState = task.TaskType > 199 ? (int)TaskInStatusEnum.InFinish : (int)TaskOutStatusEnum.OutFinish; task.CurrentAddress = task.NextAddress; // 创建历史任务 var taskHty = _mapper.Map(task); taskHty.FinishTime = DateTime.Now; taskHty.TaskId = 0; taskHty.OperateType = isHand ? (int)OperateTypeEnum.人工删除 : App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成; taskHty.SourceId = task.TaskId; if (isHand) { taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; } return taskHty; } #region 任务请求方法 private static readonly SemaphoreSlim _semaphoreUpdate = new SemaphoreSlim(1, 1); // 更新任务货位 // 修改任务 private async Task UpdateTaskAsync(Dt_Task task, DtLocationInfo location, int beforeStatus) { bool isResult = await BaseDal.UpdateDataAsync(task); LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto() { AfterStatus = location.LocationStatus, BeforeStatus = beforeStatus, TaskNum = task.TaskNum.Value, LocationId = location.Id, LocationCode = location.LocationCode, ChangeType = (int)StatusChangeTypeEnum.AutomaticInbound, }; bool isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto); bool isUpdateLo = await _locationRepository.UpdateDataAsync(location); return isResult && isUpdateLo; } private async Task AddTaskAsync(Dt_Task task, DtLocationInfo StartAddress, DtLocationInfo EndAddress) { bool isResult = await BaseDal.AddDataAsync(task) > 0; int SourcebeforeStatus = StartAddress.LocationStatus; int TargetbeforeStatus = EndAddress.LocationStatus; StartAddress.LocationStatus = (int)LocationEnum.InStockDisable; EndAddress.LocationStatus = (int)LocationEnum.Lock; List changeRecordDto = new List() { new LocationChangeRecordDto() { AfterStatus = StartAddress.LocationStatus, BeforeStatus = SourcebeforeStatus, TaskNum = task.TaskNum.Value, LocationId = StartAddress.Id, LocationCode = StartAddress.LocationCode, ChangeType = (int)StatusChangeTypeEnum.AutomaticRelocation, }, new LocationChangeRecordDto() { AfterStatus = EndAddress.LocationStatus, BeforeStatus = TargetbeforeStatus, TaskNum = task.TaskNum.Value, LocationId = EndAddress.Id, LocationCode = EndAddress.LocationCode, ChangeType = (int)StatusChangeTypeEnum.AutomaticRelocation, }, }; bool isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto); bool Source = await _locationRepository.UpdateDataAsync(StartAddress); bool Target = await _locationRepository.UpdateDataAsync(EndAddress); return isResult && Source && Target; } private (List,List) AddTaskAsync(List task) { List changeRecordDto = new List(); List locationos = new List(); foreach (var item in task) { var SourceAddress = _locationRepository.QueryFirst(x => x.LocationCode == item.SourceAddress); var TargetAddress = _locationRepository.QueryFirst(x => x.LocationCode == item.TargetAddress); int SourcebeforeStatus = SourceAddress.LocationStatus; int TargetbeforeStatus = TargetAddress.LocationStatus; SourceAddress.LocationStatus = (int)LocationEnum.InStockDisable; TargetAddress.LocationStatus = (int)LocationEnum.Lock; changeRecordDto.Add(new DtLocationStatusChangeRecord() { ChangeType = (int)StatusChangeTypeEnum.AutomaticRelocation, LocationCode = TargetAddress.LocationCode, LocationId = TargetAddress.Id, Creater = "System", TaskNum = item.TaskNum, AfterStatus = TargetAddress.LocationStatus, BeforeStatus = TargetbeforeStatus, }); changeRecordDto.Add(new DtLocationStatusChangeRecord { AfterStatus = TargetAddress.LocationStatus, BeforeStatus = TargetbeforeStatus, TaskNum = item.TaskNum.Value, Creater = "System", LocationId = TargetAddress.Id, LocationCode = TargetAddress.LocationCode, ChangeType = (int)StatusChangeTypeEnum.AutomaticRelocation, }); locationos.Add(TargetAddress); locationos.Add(SourceAddress); } return (locationos, changeRecordDto); } /// /// 获取货位号 /// /// public async Task GetEmptyLocation(string roadWay) { List locations = await _locationRepository.QueryDataAsync(x => x.RoadwayNo == "SC1" && x.LocationStatus == (int)LocationEnum.Free && x.EnalbeStatus == 1); if (locations.Count < 2) { return null; } List locationInfos = new List(); var locationInside = locations.Where(x => x.Row == 3).ToList(); if (locations.Where(x => x.Row == 2).OrderBy(x => x.Layer).ThenBy(x => x.Column).FirstOrDefault() != null) { return locations.Where(x => x.Row == 2).ToList().OrderBy(x => x.Layer).ThenBy(x => x.Column).FirstOrDefault(); } else if (locationInside.Count > 0) { foreach (var item in locationInside) { var locationLateral = _locationRepository.QueryFirst(x => x.Row == 1 && x.Layer == item.Layer && x.Column == item.Column); if (locationLateral.LocationStatus == (int)LocationEnum.Free && locationLateral.EnalbeStatus == 1) { locationInfos.Add(item); } } return locationInfos.Distinct().OrderBy(x => x.Layer).ThenBy(x => x.Column).FirstOrDefault(); } else if (locations.Where(x => x.Row == 1).OrderBy(x => x.Layer).ThenBy(x => x.Column).FirstOrDefault() != null) { return locations.Where(x => x.Row == 1).OrderBy(x => x.Layer).ThenBy(x => x.Column).FirstOrDefault(); } else { return null; } } #endregion 任务请求方法 #endregion private 内部方法 }