| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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> |