using FreeSql; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using NPP.SmartSchedue.Api.Contracts.Core.Enums; using NPP.SmartSchedue.Api.Contracts.Domain.Integration; using NPP.SmartSchedue.Api.Contracts.Domain.Work; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Input; using NPP.SmartSchedue.Api.Contracts.Services.Integration.Output; using NPP.SmartSchedue.Api.Repositories.Work; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using ZhonTai.Admin.Services; using ZhonTai.DynamicApi; using ZhonTai.DynamicApi.Attributes; namespace NPP.SmartSchedue.Api.Services.Integration { /// /// 任务分配修改服务 /// 专门处理任务人员分配的修改操作 /// 深度业务思考:实现分配结果的精确修改,确保数据一致性和业务完整性 /// [DynamicApi(Area = "app")] public class TaskAssignmentModificationService : BaseService, IDynamicApi { private readonly IIntegrationRecordRepository _integrationRecordRepository; private readonly WorkOrderRepository _workOrderRepository; private readonly ILogger _logger; public TaskAssignmentModificationService( IIntegrationRecordRepository integrationRecordRepository, WorkOrderRepository workOrderRepository, ILogger logger) { _integrationRecordRepository = integrationRecordRepository; _workOrderRepository = workOrderRepository; _logger = logger; } /// /// 修改任务人员分配 /// 深度业务思考:根据选中的人员精确修改任务分配,同时保持整合记录的一致性 /// 核心功能: /// 1. 根据选中的人员修改任务的指定人员ID和姓名 /// 2. 更新整合记录的修改状态和备注 /// 3. 记录修改历史和审计信息 /// [HttpPost] public async Task ModifyTaskAssignmentAsync(TaskAssignmentModificationInput input) { var result = new TaskAssignmentModificationResult { StartTime = DateTime.Now, IsSuccess = false }; try { _logger.LogInformation("开始修改任务人员分配: IntegrationRecordId={IntegrationRecordId}, TaskCount={TaskCount}", input.IntegrationRecordId, input.TaskAssignmentModifications.Count); // 第一步:验证整合记录存在性 var integrationRecord = await ValidateIntegrationRecordAsync(input.IntegrationRecordId); if (integrationRecord == null) { result.ErrorMessage = $"未找到ID为{input.IntegrationRecordId}的整合记录"; return result; } result.IntegrationBatchCode = integrationRecord.IntegrationBatchCode; // 第二步:获取和验证任务 var validationResult = await ValidateAndGetTasksAsync(input.TaskAssignmentModifications); if (!validationResult.IsValid) { result.ErrorMessage = validationResult.ErrorMessage; result.ValidationErrors = validationResult.ValidationErrors; return result; } var tasks = validationResult.Tasks; result.TotalTaskCount = tasks.Count; // 第三步:执行任务分配修改 var modificationResults = await ExecuteTaskAssignmentModificationsAsync( tasks, input.TaskAssignmentModifications, input.OperatorUserId, input.OperatorUserName); result.SuccessfulModifications = modificationResults.SuccessfulModifications; result.FailedModifications = modificationResults.FailedModifications; result.SuccessfulCount = modificationResults.SuccessfulModifications.Count; result.FailedCount = modificationResults.FailedModifications.Count; // 第四步:更新整合记录 await UpdateIntegrationRecordAsync(integrationRecord, input, result); // 第五步:生成修改摘要 result.ModificationSummary = GenerateModificationSummary(result); result.IsSuccess = result.FailedCount == 0; result.CompletedTime = DateTime.Now; result.ElapsedMilliseconds = (int)(result.CompletedTime - result.StartTime).TotalMilliseconds; _logger.LogInformation("任务人员分配修改完成: Success={IsSuccess}, SuccessCount={SuccessCount}, FailedCount={FailedCount}", result.IsSuccess, result.SuccessfulCount, result.FailedCount); return result; } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = $"修改任务人员分配时发生异常: {ex.Message}"; result.CompletedTime = DateTime.Now; result.ElapsedMilliseconds = (int)(result.CompletedTime - result.StartTime).TotalMilliseconds; _logger.LogError(ex, "修改任务人员分配失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", input.IntegrationRecordId, ex.Message); return result; } } /// /// 批量修改任务设备分配 /// 深度业务思考:支持批量设备分配修改,提高操作效率 /// [HttpPost] public async Task ModifyTaskEquipmentAssignmentAsync(TaskEquipmentAssignmentModificationInput input) { var result = new TaskAssignmentModificationResult { StartTime = DateTime.Now, IsSuccess = false }; try { _logger.LogInformation("开始修改任务设备分配: IntegrationRecordId={IntegrationRecordId}, TaskCount={TaskCount}", input.IntegrationRecordId, input.TaskEquipmentModifications.Count); // 验证整合记录 var integrationRecord = await ValidateIntegrationRecordAsync(input.IntegrationRecordId); if (integrationRecord == null) { result.ErrorMessage = $"未找到ID为{input.IntegrationRecordId}的整合记录"; return result; } result.IntegrationBatchCode = integrationRecord.IntegrationBatchCode; // 获取任务并执行设备分配修改 var taskIds = input.TaskEquipmentModifications.Select(m => m.TaskId).ToList(); var tasks = await GetTasksByIdsAsync(taskIds); result.TotalTaskCount = tasks.Count; var successfulModifications = new List(); var failedModifications = new List(); foreach (var modification in input.TaskEquipmentModifications) { var task = tasks.FirstOrDefault(t => t.Id == modification.TaskId); if (task == null) { failedModifications.Add(new TaskModificationFailure { TaskId = modification.TaskId, TaskCode = modification.TaskCode ?? "未知", FailureReason = "任务不存在", ErrorDetails = "未找到指定的任务" }); continue; } try { // 记录修改前的值 var previousEquipmentId = task.AssignedEquipmentId; var previousEquipmentName = task.AssignedEquipmentName; // 执行设备分配修改 task.AssignedEquipmentId = modification.NewEquipmentId; task.AssignedEquipmentName = modification.NewEquipmentName ?? string.Empty; // 添加修改备注 if (!string.IsNullOrWhiteSpace(modification.ModificationNote)) { task.Remarks = string.IsNullOrWhiteSpace(task.Remarks) ? $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modification.ModificationNote}" : $"{task.Remarks}\n[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modification.ModificationNote}"; } task.ModifiedTime = DateTime.Now; task.ModifiedUserId = input.OperatorUserId; task.ModifiedUserName = input.OperatorUserName; successfulModifications.Add(new TaskModificationDetail { TaskId = task.Id, TaskCode = task.WorkOrderCode ?? task.Code ?? $"TASK-{task.Id}", ModificationType = "设备分配修改", PreviousValue = $"设备ID:{previousEquipmentId}, 设备名:{previousEquipmentName}", NewValue = $"设备ID:{task.AssignedEquipmentId}, 设备名:{task.AssignedEquipmentName}", ModificationTime = DateTime.Now, ModificationNote = modification.ModificationNote ?? "" }); } catch (Exception ex) { failedModifications.Add(new TaskModificationFailure { TaskId = modification.TaskId, TaskCode = modification.TaskCode ?? "未知", FailureReason = "修改异常", ErrorDetails = ex.Message }); } } // 批量更新任务 if (successfulModifications.Any()) { var modifiedTasks = tasks.Where(t => successfulModifications.Any(s => s.TaskId == t.Id)).ToList(); await _workOrderRepository.UpdateAsync(modifiedTasks); } result.SuccessfulModifications = successfulModifications; result.FailedModifications = failedModifications; result.SuccessfulCount = successfulModifications.Count; result.FailedCount = failedModifications.Count; // 更新整合记录 await UpdateIntegrationRecordForEquipmentModificationAsync(integrationRecord, input, result); result.ModificationSummary = $"设备分配修改完成:成功{result.SuccessfulCount}个,失败{result.FailedCount}个"; result.IsSuccess = result.FailedCount == 0; result.CompletedTime = DateTime.Now; result.ElapsedMilliseconds = (int)(result.CompletedTime - result.StartTime).TotalMilliseconds; return result; } catch (Exception ex) { result.IsSuccess = false; result.ErrorMessage = $"修改任务设备分配时发生异常: {ex.Message}"; result.CompletedTime = DateTime.Now; result.ElapsedMilliseconds = (int)(result.CompletedTime - result.StartTime).TotalMilliseconds; _logger.LogError(ex, "修改任务设备分配失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", input.IntegrationRecordId, ex.Message); return result; } } /// /// 查询任务分配修改历史 /// 深度业务思考:提供完整的修改历史追踪,支持审计和分析 /// [HttpGet] public async Task> GetTaskAssignmentModificationHistoryAsync(long integrationRecordId) { try { // 查询整合记录 var integrationRecord = await _integrationRecordRepository.GetAsync(integrationRecordId); if (integrationRecord == null) { return new List(); } // 获取相关任务的修改历史 var taskIds = integrationRecord.GetTaskIds(); if (!taskIds.Any()) { return new List(); } var tasks = await _workOrderRepository.Select .Where(t => taskIds.Contains(t.Id)) .Where(t => !string.IsNullOrEmpty(t.Remarks) && t.Remarks.Contains("人员分配修改")) .OrderByDescending(t => t.ModifiedTime) .ToListAsync(); // 解析修改历史 var histories = new List(); foreach (var task in tasks) { var history = ParseModificationHistory(task); if (history != null) { histories.Add(history); } } return histories; } catch (Exception ex) { _logger.LogError(ex, "查询任务分配修改历史失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecordId, ex.Message); return new List(); } } #region 私有辅助方法 /// /// 验证整合记录存在性 /// private async Task ValidateIntegrationRecordAsync(long integrationRecordId) { return await _integrationRecordRepository.GetAsync(integrationRecordId); } /// /// 验证和获取任务 /// private async Task ValidateAndGetTasksAsync(List modifications) { var result = new TaskValidationResult { IsValid = true }; if (!modifications.Any()) { result.IsValid = false; result.ErrorMessage = "没有提供需要修改的任务"; return result; } var taskIds = modifications.Select(m => m.TaskId).ToList(); var tasks = await GetTasksByIdsAsync(taskIds); if (tasks.Count != taskIds.Count) { var foundTaskIds = tasks.Select(t => t.Id).ToList(); var missingTaskIds = taskIds.Except(foundTaskIds).ToList(); result.IsValid = false; result.ErrorMessage = $"未找到以下任务: {string.Join(", ", missingTaskIds)}"; result.ValidationErrors = missingTaskIds.Select(id => $"任务ID {id} 不存在").ToList(); return result; } result.Tasks = tasks; return result; } /// /// 根据任务ID列表获取任务 /// private async Task> GetTasksByIdsAsync(List taskIds) { return await _workOrderRepository.Select .Where(t => taskIds.Contains(t.Id)) .ToListAsync(); } /// /// 执行任务分配修改 /// private async Task ExecuteTaskAssignmentModificationsAsync( List tasks, List modifications, long operatorUserId, string operatorUserName) { var result = new TaskModificationExecutionResult(); foreach (var modification in modifications) { var task = tasks.FirstOrDefault(t => t.Id == modification.TaskId); if (task == null) continue; try { _logger.LogInformation("修改任务人员分配: TaskId={TaskId}, TaskCode={TaskCode}, NewPersonnelId={PersonnelId}", modification.TaskId, task.WorkOrderCode ?? task.Code, modification.NewPersonnelId); // 记录修改前的值 var previousPersonnelId = task.AssignedPersonnelId; var previousPersonnelName = task.AssignedPersonnelName; // 执行人员分配修改 task.AssignedPersonnelId = modification.NewPersonnelId; task.AssignedPersonnelName = modification.NewPersonnelName ?? string.Empty; // 如果同时修改设备分配 var previousEquipmentId = task.AssignedEquipmentId; var previousEquipmentName = task.AssignedEquipmentName; if (modification.NewEquipmentId.HasValue) { task.AssignedEquipmentId = modification.NewEquipmentId; task.AssignedEquipmentName = modification.NewEquipmentName ?? string.Empty; } // 更新任务备注 var modificationNote = $"人员分配修改:{previousPersonnelName}({previousPersonnelId}) → {task.AssignedPersonnelName}({task.AssignedPersonnelId})"; if (modification.NewEquipmentId.HasValue) { modificationNote += $";设备分配修改:{previousEquipmentName}({previousEquipmentId}) → {task.AssignedEquipmentName}({task.AssignedEquipmentId})"; } if (!string.IsNullOrWhiteSpace(modification.ModificationNote)) { modificationNote += $";备注:{modification.ModificationNote}"; } task.Remarks = string.IsNullOrWhiteSpace(task.Remarks) ? $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationNote}" : $"{task.Remarks}\n[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationNote}"; task.ModifiedTime = DateTime.Now; task.ModifiedUserId = operatorUserId; task.ModifiedUserName = operatorUserName; result.SuccessfulModifications.Add(new TaskModificationDetail { TaskId = task.Id, TaskCode = task.WorkOrderCode ?? task.Code ?? $"TASK-{task.Id}", ModificationType = "人员分配修改", PreviousValue = $"人员ID:{previousPersonnelId}, 人员名:{previousPersonnelName}", NewValue = $"人员ID:{task.AssignedPersonnelId}, 人员名:{task.AssignedPersonnelName}", ModificationTime = DateTime.Now, ModificationNote = modification.ModificationNote ?? "" }); } catch (Exception ex) { result.FailedModifications.Add(new TaskModificationFailure { TaskId = modification.TaskId, TaskCode = task.WorkOrderCode ?? task.Code ?? $"TASK-{task.Id}", FailureReason = "修改异常", ErrorDetails = ex.Message }); _logger.LogError(ex, "修改任务人员分配失败: TaskId={TaskId}, Error={Message}", modification.TaskId, ex.Message); } } // 批量更新成功修改的任务 if (result.SuccessfulModifications.Any()) { var modifiedTasks = tasks.Where(t => result.SuccessfulModifications.Any(s => s.TaskId == t.Id)).ToList(); await _workOrderRepository.UpdateAsync(modifiedTasks); } return result; } /// /// 更新整合记录 /// private async Task UpdateIntegrationRecordAsync( IntegrationRecordEntity integrationRecord, TaskAssignmentModificationInput input, TaskAssignmentModificationResult result) { try { // 更新整合记录的修改信息 var modificationSummary = $"任务人员分配修改:成功{result.SuccessfulCount}个,失败{result.FailedCount}个"; if (!string.IsNullOrWhiteSpace(input.ModificationReason)) { modificationSummary = $"{input.ModificationReason} - {modificationSummary}"; } integrationRecord.Remarks = string.IsNullOrWhiteSpace(integrationRecord.Remarks) ? $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationSummary}" : $"{integrationRecord.Remarks}\n[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationSummary}"; integrationRecord.ModifiedTime = DateTime.Now; integrationRecord.ModifiedUserId = input.OperatorUserId; integrationRecord.ModifiedUserName = input.OperatorUserName; // 更新人员分配结果中的successfulMatches if (result.SuccessfulModifications.Any()) { try { // 反序列化现有的人员分配结果 if (!string.IsNullOrEmpty(integrationRecord.PersonnelAllocationResultJson)) { var personnelAllocationResult = JsonSerializer.Deserialize( integrationRecord.PersonnelAllocationResultJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); if (personnelAllocationResult?.SuccessfulMatches != null) { // 更新successfulMatches中对应的匹配信息 foreach (var modification in result.SuccessfulModifications) { var existingMatch = personnelAllocationResult.SuccessfulMatches .FirstOrDefault(m => m.TaskId == modification.TaskId); if (existingMatch != null) { // 更新人员信息 existingMatch.PersonnelId = modification.NewValue.Contains("人员ID:") ? long.Parse(modification.NewValue.Split(',')[0].Split(':')[1]) : existingMatch.PersonnelId; existingMatch.PersonnelName = modification.NewValue.Contains("人员名:") ? modification.NewValue.Split(',')[1].Split(':')[1] : existingMatch.PersonnelName; } } // 重新序列化并更新 integrationRecord.PersonnelAllocationResultJson = JsonSerializer.Serialize( personnelAllocationResult, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true }); } } } catch (Exception ex) { _logger.LogWarning(ex, "更新人员分配结果失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecord.Id, ex.Message); } // 更新设备分配结果中的successfulMatches(如果同时修改了设备) try { // 反序列化现有的设备分配结果 if (!string.IsNullOrEmpty(integrationRecord.EquipmentAllocationResultJson)) { var equipmentAllocationResult = JsonSerializer.Deserialize( integrationRecord.EquipmentAllocationResultJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); if (equipmentAllocationResult?.SuccessfulMatches != null) { // 更新successfulMatches中对应的匹配信息 foreach (var modification in result.SuccessfulModifications) { // 检查修改备注中是否包含设备信息 if (modification.NewValue.Contains("设备分配修改")) { var existingMatch = equipmentAllocationResult.SuccessfulMatches .FirstOrDefault(m => m.TaskId == modification.TaskId); if (existingMatch != null) { // 从备注中提取设备信息 var equipmentInfo = ExtractEquipmentInfoFromModification(modification.NewValue); if (equipmentInfo.HasValue) { existingMatch.EquipmentId = equipmentInfo.Value.equipmentId; existingMatch.EquipmentName = equipmentInfo.Value.equipmentName; } } } } // 重新序列化并更新 integrationRecord.EquipmentAllocationResultJson = JsonSerializer.Serialize( equipmentAllocationResult, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true }); } } } catch (Exception ex) { _logger.LogWarning(ex, "更新设备分配结果失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecord.Id, ex.Message); } } await _integrationRecordRepository.UpdateAsync(integrationRecord); } catch (Exception ex) { _logger.LogError(ex, "更新整合记录失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecord.Id, ex.Message); } } /// /// 从修改备注中提取设备信息 /// private (long equipmentId, string equipmentName)? ExtractEquipmentInfoFromModification(string modificationValue) { try { // 解析类似 "设备分配修改:设备ID:1001, 设备名:设备A" 的字符串 if (modificationValue.Contains("设备ID:") && modificationValue.Contains("设备名:")) { var equipmentIdStr = modificationValue.Split(new[] { "设备ID:", "," }, StringSplitOptions.None)[1]; var equipmentNameStr = modificationValue.Split(new[] { "设备名:" }, StringSplitOptions.None)[1]; if (long.TryParse(equipmentIdStr, out long equipmentId)) { return (equipmentId, equipmentNameStr); } } } catch (Exception ex) { _logger.LogWarning(ex, "解析设备信息失败: ModificationValue={ModificationValue}", modificationValue); } return null; } /// /// 为设备修改更新整合记录 /// private async Task UpdateIntegrationRecordForEquipmentModificationAsync( IntegrationRecordEntity integrationRecord, TaskEquipmentAssignmentModificationInput input, TaskAssignmentModificationResult result) { try { var modificationSummary = $"任务设备分配修改:成功{result.SuccessfulCount}个,失败{result.FailedCount}个"; if (!string.IsNullOrWhiteSpace(input.ModificationReason)) { modificationSummary = $"{input.ModificationReason} - {modificationSummary}"; } integrationRecord.Remarks = string.IsNullOrWhiteSpace(integrationRecord.Remarks) ? $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationSummary}" : $"{integrationRecord.Remarks}\n[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {modificationSummary}"; integrationRecord.ModifiedTime = DateTime.Now; integrationRecord.ModifiedUserId = input.OperatorUserId; integrationRecord.ModifiedUserName = input.OperatorUserName; // 更新设备分配结果中的successfulMatches if (result.SuccessfulModifications.Any()) { try { // 反序列化现有的设备分配结果 if (!string.IsNullOrEmpty(integrationRecord.EquipmentAllocationResultJson)) { var equipmentAllocationResult = JsonSerializer.Deserialize( integrationRecord.EquipmentAllocationResultJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); if (equipmentAllocationResult?.SuccessfulMatches != null) { // 更新successfulMatches中对应的匹配信息 foreach (var modification in result.SuccessfulModifications) { var existingMatch = equipmentAllocationResult.SuccessfulMatches .FirstOrDefault(m => m.TaskId == modification.TaskId); if (existingMatch != null) { // 更新设备信息 existingMatch.EquipmentId = modification.NewValue.Contains("设备ID:") ? long.Parse(modification.NewValue.Split(',')[0].Split(':')[1]) : existingMatch.EquipmentId; existingMatch.EquipmentName = modification.NewValue.Contains("设备名:") ? modification.NewValue.Split(',')[1].Split(':')[1] : existingMatch.EquipmentName; } } // 重新序列化并更新 integrationRecord.EquipmentAllocationResultJson = JsonSerializer.Serialize( equipmentAllocationResult, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true }); } } } catch (Exception ex) { _logger.LogWarning(ex, "更新设备分配结果失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecord.Id, ex.Message); } } await _integrationRecordRepository.UpdateAsync(integrationRecord); } catch (Exception ex) { _logger.LogError(ex, "更新整合记录失败: IntegrationRecordId={IntegrationRecordId}, Error={Message}", integrationRecord.Id, ex.Message); } } /// /// 生成修改摘要 /// private string GenerateModificationSummary(TaskAssignmentModificationResult result) { var summary = $"任务分配修改完成:总计{result.TotalTaskCount}个任务,成功{result.SuccessfulCount}个,失败{result.FailedCount}个"; if (result.FailedCount > 0) { var failureReasons = result.FailedModifications .GroupBy(f => f.FailureReason) .Select(g => $"{g.Key}({g.Count()}个)") .ToList(); summary += $"。失败原因:{string.Join("、", failureReasons)}"; } summary += $"。耗时{result.ElapsedMilliseconds}毫秒"; return summary; } /// /// 解析修改历史 /// private TaskAssignmentModificationHistory ParseModificationHistory(WorkOrderEntity task) { try { // 简单的历史解析实现 return new TaskAssignmentModificationHistory { TaskId = task.Id, TaskCode = task.WorkOrderCode ?? task.Code ?? $"TASK-{task.Id}", ModificationTime = task.ModifiedTime ?? DateTime.Now, ModificationDetails = task.Remarks ?? "", ModifiedByUserId = task.ModifiedUserId, ModifiedByUserName = task.ModifiedUserName ?? "", CurrentPersonnelId = task.AssignedPersonnelId, CurrentPersonnelName = task.AssignedPersonnelName ?? "", CurrentEquipmentId = task.AssignedEquipmentId, CurrentEquipmentName = task.AssignedEquipmentName ?? "" }; } catch (Exception ex) { _logger.LogWarning(ex, "解析任务修改历史失败: TaskId={TaskId}, Error={Message}", task.Id, ex.Message); return null; } } #endregion #region 内部数据模型 /// /// 任务验证结果 /// private class TaskValidationResult { public bool IsValid { get; set; } public string ErrorMessage { get; set; } = ""; public List ValidationErrors { get; set; } = new(); public List Tasks { get; set; } = new(); } /// /// 任务修改执行结果 /// private class TaskModificationExecutionResult { public List SuccessfulModifications { get; set; } = new(); public List FailedModifications { get; set; } = new(); } #endregion } #region 输入输出模型 /// /// 任务人员分配修改输入 /// public class TaskAssignmentModificationInput { /// /// 整合记录ID /// public long IntegrationRecordId { get; set; } /// /// 操作员用户ID /// public long OperatorUserId { get; set; } /// /// 操作员用户名 /// public string OperatorUserName { get; set; } = string.Empty; /// /// 任务分配修改列表 /// public List TaskAssignmentModifications { get; set; } = new(); /// /// 修改原因说明 /// public string ModificationReason { get; set; } = string.Empty; /// /// 是否强制执行(忽略部分警告) /// public bool ForceExecute { get; set; } = false; } /// /// 任务设备分配修改输入 /// public class TaskEquipmentAssignmentModificationInput { /// /// 整合记录ID /// public long IntegrationRecordId { get; set; } /// /// 操作员用户ID /// public long OperatorUserId { get; set; } /// /// 操作员用户名 /// public string OperatorUserName { get; set; } = string.Empty; /// /// 任务设备分配修改列表 /// public List TaskEquipmentModifications { get; set; } = new(); /// /// 修改原因说明 /// public string ModificationReason { get; set; } = string.Empty; /// /// 是否强制执行(忽略部分警告) /// public bool ForceExecute { get; set; } = false; } /// /// 单个任务人员分配修改 /// public class TaskAssignmentModification { /// /// 任务ID /// public long TaskId { get; set; } /// /// 任务代码(可选,用于显示) /// public string? TaskCode { get; set; } /// /// 新的人员ID /// public long? NewPersonnelId { get; set; } /// /// 新的人员姓名 /// public string? NewPersonnelName { get; set; } /// /// 新的设备ID(可选,支持同时修改设备) /// public long? NewEquipmentId { get; set; } /// /// 新的设备名称(可选) /// public string? NewEquipmentName { get; set; } /// /// 修改备注 /// public string ModificationNote { get; set; } = string.Empty; } /// /// 单个任务设备分配修改 /// public class TaskEquipmentAssignmentModification { /// /// 任务ID /// public long TaskId { get; set; } /// /// 任务代码(可选,用于显示) /// public string? TaskCode { get; set; } /// /// 新的设备ID /// public long? NewEquipmentId { get; set; } /// /// 新的设备名称 /// public string? NewEquipmentName { get; set; } /// /// 修改备注 /// public string ModificationNote { get; set; } = string.Empty; } /// /// 任务分配修改结果 /// public class TaskAssignmentModificationResult { /// /// 是否修改成功 /// public bool IsSuccess { get; set; } /// /// 开始时间 /// public DateTime StartTime { get; set; } /// /// 完成时间 /// public DateTime CompletedTime { get; set; } /// /// 耗时毫秒数 /// public int ElapsedMilliseconds { get; set; } /// /// 整合批次编码 /// public string IntegrationBatchCode { get; set; } = string.Empty; /// /// 总任务数量 /// public int TotalTaskCount { get; set; } /// /// 成功修改数量 /// public int SuccessfulCount { get; set; } /// /// 失败修改数量 /// public int FailedCount { get; set; } /// /// 成功修改的任务详情 /// public List SuccessfulModifications { get; set; } = new(); /// /// 失败修改的任务详情 /// public List FailedModifications { get; set; } = new(); /// /// 修改摘要 /// public string ModificationSummary { get; set; } = string.Empty; /// /// 错误消息 /// public string ErrorMessage { get; set; } = string.Empty; /// /// 验证错误列表 /// public List ValidationErrors { get; set; } = new(); } /// /// 任务修改详情 /// public class TaskModificationDetail { /// /// 任务ID /// public long TaskId { get; set; } /// /// 任务代码 /// public string TaskCode { get; set; } = string.Empty; /// /// 修改类型 /// public string ModificationType { get; set; } = string.Empty; /// /// 修改前的值 /// public string PreviousValue { get; set; } = string.Empty; /// /// 修改后的值 /// public string NewValue { get; set; } = string.Empty; /// /// 修改时间 /// public DateTime ModificationTime { get; set; } /// /// 修改备注 /// public string ModificationNote { get; set; } = string.Empty; } /// /// 任务修改失败详情 /// public class TaskModificationFailure { /// /// 任务ID /// public long TaskId { get; set; } /// /// 任务代码 /// public string TaskCode { get; set; } = string.Empty; /// /// 失败原因 /// public string FailureReason { get; set; } = string.Empty; /// /// 错误详情 /// public string ErrorDetails { get; set; } = string.Empty; } /// /// 任务分配修改历史 /// public class TaskAssignmentModificationHistory { /// /// 任务ID /// public long TaskId { get; set; } /// /// 任务代码 /// public string TaskCode { get; set; } = string.Empty; /// /// 修改时间 /// public DateTime ModificationTime { get; set; } /// /// 修改详情 /// public string ModificationDetails { get; set; } = string.Empty; /// /// 修改人用户ID /// public long? ModifiedByUserId { get; set; } /// /// 修改人用户名 /// public string ModifiedByUserName { get; set; } = string.Empty; /// /// 当前人员ID /// public long? CurrentPersonnelId { get; set; } /// /// 当前人员姓名 /// public string CurrentPersonnelName { get; set; } = string.Empty; /// /// 当前设备ID /// public long? CurrentEquipmentId { get; set; } /// /// 当前设备名称 /// public string CurrentEquipmentName { get; set; } = string.Empty; } #endregion }