paiban/NPP.SmartSchedue.Api/Services/Integration/TaskAssignmentModificationService.cs
Asoka.Wang 2b3f9acdce 123
2025-09-22 19:09:47 +08:00

1123 lines
45 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 任务分配修改服务
/// 专门处理任务人员分配的修改操作
/// 深度业务思考:实现分配结果的精确修改,确保数据一致性和业务完整性
/// </summary>
[DynamicApi(Area = "app")]
public class TaskAssignmentModificationService : BaseService, IDynamicApi
{
private readonly IIntegrationRecordRepository _integrationRecordRepository;
private readonly WorkOrderRepository _workOrderRepository;
private readonly ILogger<TaskAssignmentModificationService> _logger;
public TaskAssignmentModificationService(
IIntegrationRecordRepository integrationRecordRepository,
WorkOrderRepository workOrderRepository,
ILogger<TaskAssignmentModificationService> logger)
{
_integrationRecordRepository = integrationRecordRepository;
_workOrderRepository = workOrderRepository;
_logger = logger;
}
/// <summary>
/// 修改任务人员分配
/// 深度业务思考:根据选中的人员精确修改任务分配,同时保持整合记录的一致性
/// 核心功能:
/// 1. 根据选中的人员修改任务的指定人员ID和姓名
/// 2. 更新整合记录的修改状态和备注
/// 3. 记录修改历史和审计信息
/// </summary>
[HttpPost]
public async Task<TaskAssignmentModificationResult> 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;
}
}
/// <summary>
/// 批量修改任务设备分配
/// 深度业务思考:支持批量设备分配修改,提高操作效率
/// </summary>
[HttpPost]
public async Task<TaskAssignmentModificationResult> 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<TaskModificationDetail>();
var failedModifications = new List<TaskModificationFailure>();
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;
}
}
/// <summary>
/// 查询任务分配修改历史
/// 深度业务思考:提供完整的修改历史追踪,支持审计和分析
/// </summary>
[HttpGet]
public async Task<List<TaskAssignmentModificationHistory>> GetTaskAssignmentModificationHistoryAsync(long integrationRecordId)
{
try
{
// 查询整合记录
var integrationRecord = await _integrationRecordRepository.GetAsync(integrationRecordId);
if (integrationRecord == null)
{
return new List<TaskAssignmentModificationHistory>();
}
// 获取相关任务的修改历史
var taskIds = integrationRecord.GetTaskIds();
if (!taskIds.Any())
{
return new List<TaskAssignmentModificationHistory>();
}
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<TaskAssignmentModificationHistory>();
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<TaskAssignmentModificationHistory>();
}
}
#region
/// <summary>
/// 验证整合记录存在性
/// </summary>
private async Task<IntegrationRecordEntity> ValidateIntegrationRecordAsync(long integrationRecordId)
{
return await _integrationRecordRepository.GetAsync(integrationRecordId);
}
/// <summary>
/// 验证和获取任务
/// </summary>
private async Task<TaskValidationResult> ValidateAndGetTasksAsync(List<TaskAssignmentModification> 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;
}
/// <summary>
/// 根据任务ID列表获取任务
/// </summary>
private async Task<List<WorkOrderEntity>> GetTasksByIdsAsync(List<long> taskIds)
{
return await _workOrderRepository.Select
.Where(t => taskIds.Contains(t.Id))
.ToListAsync();
}
/// <summary>
/// 执行任务分配修改
/// </summary>
private async Task<TaskModificationExecutionResult> ExecuteTaskAssignmentModificationsAsync(
List<WorkOrderEntity> tasks,
List<TaskAssignmentModification> 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;
}
/// <summary>
/// 更新整合记录
/// </summary>
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<PersonnelAllocationResult>(
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<EquipmentAllocationResult>(
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);
}
}
/// <summary>
/// 从修改备注中提取设备信息
/// </summary>
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;
}
/// <summary>
/// 为设备修改更新整合记录
/// </summary>
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<EquipmentAllocationResult>(
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);
}
}
/// <summary>
/// 生成修改摘要
/// </summary>
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;
}
/// <summary>
/// 解析修改历史
/// </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
/// <summary>
/// 任务验证结果
/// </summary>
private class TaskValidationResult
{
public bool IsValid { get; set; }
public string ErrorMessage { get; set; } = "";
public List<string> ValidationErrors { get; set; } = new();
public List<WorkOrderEntity> Tasks { get; set; } = new();
}
/// <summary>
/// 任务修改执行结果
/// </summary>
private class TaskModificationExecutionResult
{
public List<TaskModificationDetail> SuccessfulModifications { get; set; } = new();
public List<TaskModificationFailure> FailedModifications { get; set; } = new();
}
#endregion
}
#region
/// <summary>
/// 任务人员分配修改输入
/// </summary>
public class TaskAssignmentModificationInput
{
/// <summary>
/// 整合记录ID
/// </summary>
public long IntegrationRecordId { get; set; }
/// <summary>
/// 操作员用户ID
/// </summary>
public long OperatorUserId { get; set; }
/// <summary>
/// 操作员用户名
/// </summary>
public string OperatorUserName { get; set; } = string.Empty;
/// <summary>
/// 任务分配修改列表
/// </summary>
public List<TaskAssignmentModification> TaskAssignmentModifications { get; set; } = new();
/// <summary>
/// 修改原因说明
/// </summary>
public string ModificationReason { get; set; } = string.Empty;
/// <summary>
/// 是否强制执行(忽略部分警告)
/// </summary>
public bool ForceExecute { get; set; } = false;
}
/// <summary>
/// 任务设备分配修改输入
/// </summary>
public class TaskEquipmentAssignmentModificationInput
{
/// <summary>
/// 整合记录ID
/// </summary>
public long IntegrationRecordId { get; set; }
/// <summary>
/// 操作员用户ID
/// </summary>
public long OperatorUserId { get; set; }
/// <summary>
/// 操作员用户名
/// </summary>
public string OperatorUserName { get; set; } = string.Empty;
/// <summary>
/// 任务设备分配修改列表
/// </summary>
public List<TaskEquipmentAssignmentModification> TaskEquipmentModifications { get; set; } = new();
/// <summary>
/// 修改原因说明
/// </summary>
public string ModificationReason { get; set; } = string.Empty;
/// <summary>
/// 是否强制执行(忽略部分警告)
/// </summary>
public bool ForceExecute { get; set; } = false;
}
/// <summary>
/// 单个任务人员分配修改
/// </summary>
public class TaskAssignmentModification
{
/// <summary>
/// 任务ID
/// </summary>
public long TaskId { get; set; }
/// <summary>
/// 任务代码(可选,用于显示)
/// </summary>
public string? TaskCode { get; set; }
/// <summary>
/// 新的人员ID
/// </summary>
public long? NewPersonnelId { get; set; }
/// <summary>
/// 新的人员姓名
/// </summary>
public string? NewPersonnelName { get; set; }
/// <summary>
/// 新的设备ID可选支持同时修改设备
/// </summary>
public long? NewEquipmentId { get; set; }
/// <summary>
/// 新的设备名称(可选)
/// </summary>
public string? NewEquipmentName { get; set; }
/// <summary>
/// 修改备注
/// </summary>
public string ModificationNote { get; set; } = string.Empty;
}
/// <summary>
/// 单个任务设备分配修改
/// </summary>
public class TaskEquipmentAssignmentModification
{
/// <summary>
/// 任务ID
/// </summary>
public long TaskId { get; set; }
/// <summary>
/// 任务代码(可选,用于显示)
/// </summary>
public string? TaskCode { get; set; }
/// <summary>
/// 新的设备ID
/// </summary>
public long? NewEquipmentId { get; set; }
/// <summary>
/// 新的设备名称
/// </summary>
public string? NewEquipmentName { get; set; }
/// <summary>
/// 修改备注
/// </summary>
public string ModificationNote { get; set; } = string.Empty;
}
/// <summary>
/// 任务分配修改结果
/// </summary>
public class TaskAssignmentModificationResult
{
/// <summary>
/// 是否修改成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 完成时间
/// </summary>
public DateTime CompletedTime { get; set; }
/// <summary>
/// 耗时毫秒数
/// </summary>
public int ElapsedMilliseconds { get; set; }
/// <summary>
/// 整合批次编码
/// </summary>
public string IntegrationBatchCode { get; set; } = string.Empty;
/// <summary>
/// 总任务数量
/// </summary>
public int TotalTaskCount { get; set; }
/// <summary>
/// 成功修改数量
/// </summary>
public int SuccessfulCount { get; set; }
/// <summary>
/// 失败修改数量
/// </summary>
public int FailedCount { get; set; }
/// <summary>
/// 成功修改的任务详情
/// </summary>
public List<TaskModificationDetail> SuccessfulModifications { get; set; } = new();
/// <summary>
/// 失败修改的任务详情
/// </summary>
public List<TaskModificationFailure> FailedModifications { get; set; } = new();
/// <summary>
/// 修改摘要
/// </summary>
public string ModificationSummary { get; set; } = string.Empty;
/// <summary>
/// 错误消息
/// </summary>
public string ErrorMessage { get; set; } = string.Empty;
/// <summary>
/// 验证错误列表
/// </summary>
public List<string> ValidationErrors { get; set; } = new();
}
/// <summary>
/// 任务修改详情
/// </summary>
public class TaskModificationDetail
{
/// <summary>
/// 任务ID
/// </summary>
public long TaskId { get; set; }
/// <summary>
/// 任务代码
/// </summary>
public string TaskCode { get; set; } = string.Empty;
/// <summary>
/// 修改类型
/// </summary>
public string ModificationType { get; set; } = string.Empty;
/// <summary>
/// 修改前的值
/// </summary>
public string PreviousValue { get; set; } = string.Empty;
/// <summary>
/// 修改后的值
/// </summary>
public string NewValue { get; set; } = string.Empty;
/// <summary>
/// 修改时间
/// </summary>
public DateTime ModificationTime { get; set; }
/// <summary>
/// 修改备注
/// </summary>
public string ModificationNote { get; set; } = string.Empty;
}
/// <summary>
/// 任务修改失败详情
/// </summary>
public class TaskModificationFailure
{
/// <summary>
/// 任务ID
/// </summary>
public long TaskId { get; set; }
/// <summary>
/// 任务代码
/// </summary>
public string TaskCode { get; set; } = string.Empty;
/// <summary>
/// 失败原因
/// </summary>
public string FailureReason { get; set; } = string.Empty;
/// <summary>
/// 错误详情
/// </summary>
public string ErrorDetails { get; set; } = string.Empty;
}
/// <summary>
/// 任务分配修改历史
/// </summary>
public class TaskAssignmentModificationHistory
{
/// <summary>
/// 任务ID
/// </summary>
public long TaskId { get; set; }
/// <summary>
/// 任务代码
/// </summary>
public string TaskCode { get; set; } = string.Empty;
/// <summary>
/// 修改时间
/// </summary>
public DateTime ModificationTime { get; set; }
/// <summary>
/// 修改详情
/// </summary>
public string ModificationDetails { get; set; } = string.Empty;
/// <summary>
/// 修改人用户ID
/// </summary>
public long? ModifiedByUserId { get; set; }
/// <summary>
/// 修改人用户名
/// </summary>
public string ModifiedByUserName { get; set; } = string.Empty;
/// <summary>
/// 当前人员ID
/// </summary>
public long? CurrentPersonnelId { get; set; }
/// <summary>
/// 当前人员姓名
/// </summary>
public string CurrentPersonnelName { get; set; } = string.Empty;
/// <summary>
/// 当前设备ID
/// </summary>
public long? CurrentEquipmentId { get; set; }
/// <summary>
/// 当前设备名称
/// </summary>
public string CurrentEquipmentName { get; set; } = string.Empty;
}
#endregion
}