| | |
| | | |
| | | namespace WIDESEA_StorageOutTaskServices; |
| | | |
| | | public class Dt_TaskService : ServiceBase<Dt_Task, IDt_TaskRepository>, IDt_TaskService |
| | | public partial class Dt_TaskService : ServiceBase<Dt_Task, IDt_TaskRepository>, IDt_TaskService |
| | | { |
| | | private readonly LogFactory LogFactory = new LogFactory(); |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | |
| | | { |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) |
| | | { |
| | | var process = await SqlSugarHelper.Db.Queryable<Dt_EquipmentProcess>() |
| | | .FirstAsync(x => x.EquipmentName == task.Roadway); |
| | | var info = JsonConvert.DeserializeObject<ResponseEqptRunDto>(process.ProcessValue); |
| | | //var process = await SqlSugarHelper.Db.Queryable<Dt_EquipmentProcess>() |
| | | // .FirstAsync(x => x.EquipmentName == task.Roadway); |
| | | //var info = JsonConvert.DeserializeObject<ResponseEqptRunDto>(process.ProcessValue); |
| | | |
| | | var agingOutputDto = MapToAgingOutputDto(stock, info); |
| | | var agingOutputDto = MapToAgingOutputDto(stock); |
| | | content = await _agingInOrOutInputService.GetOCVOutputAsync(agingOutputDto); |
| | | ValidateResponse(content); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | private AgingOutputDto MapToAgingOutputDto(DtStockInfo stock, ResponseEqptRunDto info) |
| | | private AgingOutputDto MapToAgingOutputDto(DtStockInfo stock, ResponseEqptRunDto info = null) |
| | | { |
| | | // TODO Value值根据MOM下发的静置时间到当前时间的分钟数 |
| | | var area = _areaInfoRepository.QueryFirst(x => x.AreaCode == stock.AreaCode); |
| | | if (area == null) |
| | | { |
| | | throw new Exception("未找到对应的库区信息"); |
| | | } |
| | | return new AgingOutputDto |
| | | { |
| | | OpFlag = 1, |
| | | Software = "WMS", |
| | | EquipmentCode = "24MEJQ08-1091", |
| | | Software = area.Spare3, |
| | | EquipmentCode = area.Spare2, |
| | | TrayBarcode = stock.PalletCode, |
| | | SerialNos = stock.StockInfoDetails.Select(x => new SerialNoOutDto |
| | | { |
| | | SlotNo = x.OrderNo.ToInt32(), |
| | | SerialNo = x.SerialNumber, |
| | | SerialNoResult = true, |
| | | ParameterInfo = info.ParameterInfo.Select(y => new ParameterInfo() |
| | | { |
| | | LowerLomit = y.LowerControlLimit, |
| | | UpperLimit = y.UpperControlLimit, |
| | | ParameterResult = y.EquipmentAvailabilityFlag, |
| | | ParameterCode = y.ParameterCode, |
| | | ParameterDesc = y.Description, |
| | | TargetValue = y.TargetValue, |
| | | Value = (DateTime.Parse(stock.LinedProcessFeedbackTime, null, System.Globalization.DateTimeStyles.RoundtripKind).ToLocalTime() - stock.CreateDate).TotalMinutes.ToString(), |
| | | DefectCode = y.UOMCode |
| | | }).ToList() |
| | | ParameterInfo = new List<ParameterInfo> { new ParameterInfo() { Value = (DateTime.Now - stock.CreateDate).TotalMinutes.ToString() } } |
| | | //ParameterInfo = info.ParameterInfo.Select(y => new ParameterInfo() |
| | | //{ |
| | | // LowerLomit = y.LowerControlLimit, |
| | | // UpperLimit = y.UpperControlLimit, |
| | | // ParameterResult = y.EquipmentAvailabilityFlag, |
| | | // ParameterCode = y.ParameterCode, |
| | | // ParameterDesc = y.Description, |
| | | // TargetValue = y.TargetValue, |
| | | // Value = (DateTime.Parse(stock.LinedProcessFeedbackTime, null, System.Globalization.DateTimeStyles.RoundtripKind).ToLocalTime() - stock.CreateDate).TotalMinutes.ToString(), |
| | | // DefectCode = y.UOMCode |
| | | //}).ToList() |
| | | }).ToList() |
| | | }; |
| | | } |
| | |
| | | private (DtLocationInfo, Dt_Task) UpdateStockAndTaskStatus(DtStockInfo stock, Dt_Task task) |
| | | { |
| | | var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress); |
| | | var details = _stockInfoDetailRepository.QueryData(x => x.StockId == stock.Id); |
| | | //var details = _stockInfoDetailRepository.QueryData(x => x.StockId == stock.Id); |
| | | |
| | | location.LocationStatus = (int)LocationEnum.Free; |
| | | task.TaskState = (int)TaskOutStatusEnum.OutFinish; |
| | |
| | | // 记录异常信息到控制台和日志 |
| | | Console.WriteLine(err.Message.ToString()); |
| | | LogFactory.GetLog("任务完成").Error(true, err); |
| | | content.Error(err.Message); |
| | | } |
| | | return content; |
| | | } |
| | |
| | | private DtStockInfo CreateFullPalletStock(Dt_Task task, DtLocationInfo locationInf, DtBoxingInfo boxing) |
| | | { |
| | | var loation = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress); |
| | | if (loation == null) |
| | | throw new Exception("未找到对应位置信息"); |
| | | var area = _areaInfoRepository.QueryFirst(x => x.AreaID == loation.AreaId); |
| | | if (area == null) |
| | | throw new Exception("未找到对应区域信息"); |
| | | var boxDetail = boxing.BoxingInfoDetails.Adapt<List<DtStockInfoDetail>>(); |
| | | boxDetail.ForEach(x => { x.Status = (int)StockStateEmun.已入库; }); |
| | | var stock = new DtStockInfo() |
| | |
| | | .ToList(), |
| | | TrayBarcode = task.PalletCode, |
| | | OpFlag = 1, |
| | | EquipmentCode = "24MEJQ08-1091", |
| | | Software = "WMS" |
| | | EquipmentCode = area.Spare2, |
| | | Software = area.Spare3 |
| | | }; |
| | | var result = _agingInOrOutInputService.GetOCVInputAsync(agingInputDto).Result; |
| | | var respone = JsonConvert.DeserializeObject<ResponeAgingInputDto>(result.Data.ToString()); |
| | |
| | | } |
| | | } |
| | | |
| | | var area = await _areaInfoRepository.QueryFirstAsync(x => x.Spare1.Contains(input.Position)); |
| | | if (area == null) |
| | | return content.Error("改点位不在区域列表中存在"); |
| | | |
| | | // 创建一个TrayCellsStatusDto对象,并赋值 |
| | | TrayCellsStatusDto trayCells = new TrayCellsStatusDto() |
| | | { |
| | | Software = "WMS", |
| | | Software = area.Spare3, |
| | | TrayBarcode = input.PalletCode, |
| | | //EquipmentCode = "EQ_CWJZ01" |
| | | EquipmentCode = "24MEJQ08-1091" |
| | | EquipmentCode = area.Spare2 |
| | | }; |
| | | |
| | | // 调用GetTrayCellStatusAsync方法,获取整盘电芯 |
| | |
| | | |
| | | // 如果process为null,则返回content |
| | | if (process == null) return content; |
| | | |
| | | // 并赋值上位软件名称和设备编码 |
| | | process.Software = area.Spare3; |
| | | process.EquipmentCode = area.Spare2; |
| | | |
| | | // 调用GetProcessApplyAsync方法,获取工艺申请 |
| | | |
| | | // 调用_processApplyService.GetProcessApplyAsync方法,获取工艺申请 |
| | | content = await _processApplyService.GetProcessApplyAsync(process); |
| | |
| | | // 创建一个ProcessApplyDto对象,并赋值 |
| | | return new ProcessApplyDto() |
| | | { |
| | | EquipmentCode = "24MEJQ08-1091", |
| | | Software = "WMS", |
| | | //WipOrderNo = result.BindCode, |
| | | SerialNos = content.SerialNos.Select(item => new SerialNos |
| | | { |
| | |
| | | if (task == null) |
| | | return content.Error("未找到任务"); |
| | | |
| | | if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskOutStatusEnum.SC_OutFinish) |
| | | if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskInStatusEnum.SC_InFinish) |
| | | { |
| | | var taskHty = CreateHistoricalTask(task); |
| | | await _unitOfWorkManage.UseTranAsync(async () => |
| | |
| | | /// <param name="taskHty">历史任务对象</param> |
| | | /// <param name="taskId">任务ID</param> |
| | | /// <returns></returns> |
| | | private async Task<bool> ExecuteTransaction(DtStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId) |
| | | private async Task<bool> ExecuteTransaction(DtStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo locationInfo, int taskId, DtBoxingInfo boxingInfo = null) |
| | | { |
| | | _unitOfWorkManage.BeginTran(); |
| | | try |
| | | { |
| | | var isUpdateStock = true; |
| | | var isDeleteBoxing = true; |
| | | if (taskHty.TaskType == (int)TaskTypeEnum.Outbound) |
| | | { |
| | | // 更新库存 |
| | |
| | | { |
| | | // 添加库存 |
| | | isUpdateStock = await _stockInfoRepository.AddDataNavAsync(stock); |
| | | isDeleteBoxing = await _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxingInfo.Id) |
| | | .Include(x => x.BoxingInfoDetails) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | |
| | | |
| | |
| | | var isTaskDelete = await Delete(taskId); |
| | | |
| | | // 提交或回滚事务 |
| | | if (isUpdateStock && isTaskHtyAdd && isTaskDelete && isUpdateLoc) |
| | | if (isUpdateStock && isTaskHtyAdd && isTaskDelete && isUpdateLoc && isDeleteBoxing) |
| | | { |
| | | LogFactory.GetLog("任务完成").InfoFormat(true, "任务完成", $"事务处理完成,提交事务。添加历史任务:{isTaskHtyAdd},删除任务数据:{isTaskDelete},更新或添加库存:{isUpdateStock},修改移库前货位状态:{isUpdateLoc}"); |
| | | _unitOfWorkManage.CommitTran(); |
| | |
| | | } |
| | | catch (Exception err) |
| | | { |
| | | LogFactory.GetLog("任务完成").InfoFormat(true, $"移库任务完成,系统异常,异常信息:{err.Message}", "无参数"); |
| | | LogFactory.GetLog("任务完成").InfoFormat(true, $"任务完成,系统异常,异常信息:{err.Message}", "无参数"); |
| | | _unitOfWorkManage.RollbackTran(); |
| | | throw; // 抛出异常以便外部捕获 |
| | | } |
| | |
| | | /// <param name="task">任务实例</param> |
| | | /// <param name="content">响应内容</param> |
| | | /// <returns></returns> |
| | | //private async Task<WebResponseContent> UpdateExistingTask(RequestTaskDto input, Dt_Task task) |
| | | //{ |
| | | // // 创建WebResponseContent对象 |
| | | // WebResponseContent content = new WebResponseContent(); |
| | | // // 定义变量 |
| | | // string toAddress; |
| | | // int taskState; |
| | | // string original = task.CurrentAddress; |
| | | // DtLocationInfo location = new DtLocationInfo(); |
| | | // int beforeStatus = 0; |
| | | |
| | | // // 处理入库任务 |
| | | // location = await GetLocationDistributeAsync(task.Roadway); |
| | | // toAddress = location.LocationCode; |
| | | // taskState = (int)TaskInStatusEnum.Line_InFinish; |
| | | // beforeStatus = location.LocationStatus; |
| | | |
| | | // // 更新货位信息 |
| | | // location.LocationStatus = (int)LocationEnum.Lock; |
| | | |
| | | // // 更新任务信息 |
| | | // task.CurrentAddress = input.Position; |
| | | // task.TargetAddress = toAddress; |
| | | // task.NextAddress = toAddress; |
| | | // task.TaskState = taskState; |
| | | |
| | | // // 开始事务 |
| | | // _unitOfWorkManage.BeginTran(); |
| | | // // 定义变量 |
| | | // bool isUpdateLo = true; |
| | | // bool isUpdateChange = true; |
| | | |
| | | // // 尝试更新任务 |
| | | // bool isResult = await BaseDal.UpdateDataAsync(task); |
| | | // bool isTaskDetail = await _taskExecuteDetailRepository.AddDetailAsync(task, false, TaskDescription.GetTaskUpdateDescription(task.PalletCode, original, input.Position, TaskInStatusEnum.Line_InFinish.GetIntegralRuleTypeEnumDesc())); |
| | | |
| | | // // 创建LocationChangeRecordDto对象 |
| | | // LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto() |
| | | // { |
| | | // // 设置变量 |
| | | // AfterStatus = location.LocationStatus, |
| | | // BeforeStatus = beforeStatus, |
| | | // TaskNum = task.TaskNum.Value, |
| | | // LocationId = location.Id, |
| | | // LocationCode = location.LocationCode, |
| | | // ChangeType = (int)StatusChangeTypeEnum.AutomaticStorage, |
| | | // }; |
| | | // // 更新位置状态 |
| | | // isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto); |
| | | // isUpdateLo = await _locationRepository.UpdateDataAsync(location); |
| | | |
| | | // if (isResult && isUpdateLo && isTaskDetail) |
| | | // { |
| | | // // 提交事务 |
| | | // _unitOfWorkManage.CommitTran(); |
| | | // content.OK(data: task); |
| | | // } |
| | | // else |
| | | // { |
| | | // // 回滚事务 |
| | | // _unitOfWorkManage.RollbackTran(); |
| | | // content.Error("更新任务失败"); |
| | | // } |
| | | // return content; |
| | | //} |
| | | |
| | | // 更新任务货位 |
| | | |
| | | private async Task<WebResponseContent> UpdateExistingTask(RequestTaskDto input, Dt_Task task) |
| | | { |
| | | // 创建WebResponseContent对象 |
| | | WebResponseContent content = new WebResponseContent(); |
| | | // 定义变量 |
| | | string toAddress; |
| | | int taskState; |
| | | string original = task.CurrentAddress; |
| | | DtLocationInfo location = new DtLocationInfo(); |
| | | int beforeStatus = 0; |
| | | if (task == null) |
| | | { |
| | | return new WebResponseContent().Error("任务对象为空"); |
| | | } |
| | | |
| | | // 处理入库任务 |
| | | location = await GetLocationDistributeAsync(task.Roadway); |
| | | toAddress = location.LocationCode; |
| | | taskState = (int)TaskInStatusEnum.Line_InFinish; |
| | | beforeStatus = location.LocationStatus; |
| | | try |
| | | { |
| | | // 创建WebResponseContent对象 |
| | | var content = new WebResponseContent(); |
| | | |
| | | // 更新货位信息 |
| | | location.LocationStatus = (int)LocationEnum.Lock; |
| | | // 获取目标地址和更新任务状态 |
| | | var location = await GetLocationDistributeAsync(task.Roadway); |
| | | if (location == null) |
| | | { |
| | | return content.Error("无法获取货位信息"); |
| | | } |
| | | |
| | | // 更新任务信息 |
| | | string toAddress = location.LocationCode; |
| | | int taskState = (int)TaskInStatusEnum.Line_InFinish; |
| | | int beforeStatus = location.LocationStatus; |
| | | |
| | | // 更新货位信息 |
| | | location.LocationStatus = (int)LocationEnum.Lock; |
| | | |
| | | // 更新任务信息 |
| | | MapTaskProperties(task, input, toAddress, taskState); |
| | | |
| | | // 开始事务 |
| | | var isResult = await UpdateTaskAsync(task, location, beforeStatus); |
| | | if (!isResult) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return content.Error("更新任务失败"); |
| | | } |
| | | |
| | | // 提交事务 |
| | | _unitOfWorkManage.CommitTran(); |
| | | return content.OK(data: task); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 回滚事务 |
| | | _unitOfWorkManage.RollbackTran(); |
| | | // 这里可以添加日志记录 |
| | | return new WebResponseContent().Error($"更新任务时发生错误: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | private void MapTaskProperties(Dt_Task task, RequestTaskDto input, string toAddress, int taskState) |
| | | { |
| | | task.CurrentAddress = input.Position; |
| | | task.TargetAddress = toAddress; |
| | | task.NextAddress = toAddress; |
| | | task.TaskState = taskState; |
| | | } |
| | | |
| | | // 开始事务 |
| | | _unitOfWorkManage.BeginTran(); |
| | | // 定义变量 |
| | | bool isUpdateLo = true; |
| | | bool isUpdateChange = true; |
| | | |
| | | // 尝试更新任务 |
| | | // 修改任务 |
| | | private async Task<bool> UpdateTaskAsync(Dt_Task task, DtLocationInfo location, int beforeStatus) |
| | | { |
| | | bool isResult = await BaseDal.UpdateDataAsync(task); |
| | | bool isTaskDetail = await _taskExecuteDetailRepository.AddDetailAsync(task, false, TaskDescription.GetTaskUpdateDescription(task.PalletCode, original, input.Position, TaskInStatusEnum.Line_InFinish.GetIntegralRuleTypeEnumDesc())); |
| | | bool isTaskDetail = await _taskExecuteDetailRepository.AddDetailAsync(task, false, TaskDescription.GetTaskUpdateDescription(task.PalletCode, task.CurrentAddress, task.TargetAddress, TaskInStatusEnum.Line_InFinish.GetIntegralRuleTypeEnumDesc())); |
| | | |
| | | // 创建LocationChangeRecordDto对象 |
| | | LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto() |
| | | { |
| | | // 设置变量 |
| | | AfterStatus = location.LocationStatus, |
| | | BeforeStatus = beforeStatus, |
| | | TaskNum = task.TaskNum.Value, |
| | |
| | | LocationCode = location.LocationCode, |
| | | ChangeType = (int)StatusChangeTypeEnum.AutomaticStorage, |
| | | }; |
| | | // 更新位置状态 |
| | | isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto); |
| | | isUpdateLo = await _locationRepository.UpdateDataAsync(location); |
| | | |
| | | if (isResult && isUpdateLo && isTaskDetail) |
| | | { |
| | | // 提交事务 |
| | | _unitOfWorkManage.CommitTran(); |
| | | content.OK(data: task); |
| | | } |
| | | else |
| | | { |
| | | // 回滚事务 |
| | | _unitOfWorkManage.RollbackTran(); |
| | | content.Error("更新任务失败"); |
| | | } |
| | | return content; |
| | | bool isUpdateChange = _locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto); |
| | | bool isUpdateLo = await _locationRepository.UpdateDataAsync(location); |
| | | |
| | | return isResult && isUpdateLo && isTaskDetail; |
| | | } |
| | | |
| | | /// <summary> |