Browse Source

feat: 在CaseStepConfigController中添加GetFormTypeStepTypeMapping接口

- 新增GET /api/casestepconfigs/form-type-step-type-mapping端点
- 实现表单类型到步骤类型映射查询功能
- 遵循现有控制器模式,使用MediatR和CQRS架构
- 添加完整的日志记录和错误处理
- 返回OperationResult<GetFormTypeStepTypeResponse>统一格式
- 支持前端获取表单类型和步骤类型的映射关系

Closes: 表单类型映射查询功能需求
release/web-ui-v1.0.0
root 4 months ago
parent
commit
aaff94d40b
  1. 5
      src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommand.cs
  2. 5
      src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommandHandler.cs
  3. 10
      src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigResponse.cs
  4. 6
      src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigCommand.cs
  5. 5
      src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigCommandHandler.cs
  6. 10
      src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigResponse.cs
  7. 2
      src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdQueryHandler.cs
  8. 10
      src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdResponse.cs
  9. 2
      src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsQueryHandler.cs
  10. 10
      src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsResponse.cs
  11. 11
      src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeQuery.cs
  12. 48
      src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeQueryHandler.cs
  13. 100
      src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeResponse.cs
  14. 22
      src/X1.Domain/Common/EnumValueObject.cs
  15. 140
      src/X1.Domain/Common/FormTypeStepTypeConverter.cs
  16. 11
      src/X1.Domain/Entities/TestCase/CaseStepConfig.cs
  17. 32
      src/X1.Domain/Entities/TestCase/FormType.cs
  18. 4
      src/X1.Infrastructure/Configurations/TestCase/CaseStepConfigConfiguration.cs
  19. 1889
      src/X1.Infrastructure/Migrations/20250822101301_AddFormTypeToCaseStepConfig.Designer.cs
  20. 29
      src/X1.Infrastructure/Migrations/20250822101301_AddFormTypeToCaseStepConfig.cs
  21. 4
      src/X1.Infrastructure/Migrations/AppDbContextModelSnapshot.cs
  22. 21
      src/X1.Presentation/Controllers/CaseStepConfigController.cs
  23. 269
      src/modify.md

5
src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommand.cs

@ -47,4 +47,9 @@ public class CreateCaseStepConfigCommand : IRequest<OperationResult<CreateCaseSt
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; } = true;
/// <summary>
/// 表单类型
/// </summary>
public FormType FormType { get; set; } = FormType.None;
}

5
src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommandHandler.cs

@ -66,7 +66,8 @@ public class CreateUseCaseNodeConfigCommandHandler : IRequestHandler<CreateCaseS
createdBy: currentUserId,
description: request.Description,
icon: request.Icon,
isEnabled: request.IsEnabled);
isEnabled: request.IsEnabled,
formType: request.FormType);
// 保存用例步骤配置
await _caseStepConfigRepository.AddStepConfigAsync(caseStepConfig, cancellationToken);
@ -85,6 +86,8 @@ public class CreateUseCaseNodeConfigCommandHandler : IRequestHandler<CreateCaseS
Icon = caseStepConfig.Icon,
Mapping = caseStepConfig.Mapping,
IsEnabled = caseStepConfig.IsEnabled,
FormType = (int)caseStepConfig.FormType,
FormTypeName = caseStepConfig.FormType.ToString(),
CreatedAt = caseStepConfig.CreatedAt
};

10
src/X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigResponse.cs

@ -45,6 +45,16 @@ public class CreateCaseStepConfigResponse
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 表单类型
/// </summary>
public int FormType { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string FormTypeName { get; set; } = null!;
/// <summary>
/// 创建时间
/// </summary>

6
src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigCommand.cs

@ -1,6 +1,7 @@
using X1.Domain.Common;
using MediatR;
using System.ComponentModel.DataAnnotations;
using X1.Domain.Entities.TestCase;
namespace X1.Application.Features.CaseStepConfigs.Commands.UpdateCaseStepConfig;
@ -31,4 +32,9 @@ public class UpdateCaseStepConfigCommand : IRequest<OperationResult<UpdateCaseSt
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; } = true;
/// <summary>
/// 表单类型
/// </summary>
public FormType FormType { get; set; } = FormType.None;
}

5
src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigCommandHandler.cs

@ -59,10 +59,11 @@ public class UpdateCaseStepConfigCommandHandler : IRequestHandler<UpdateCaseStep
return OperationResult<UpdateCaseStepConfigResponse>.CreateFailure("用户未认证,无法更新用例步骤配置");
}
// 更新步骤配置(只能修改启用、图标和步骤说明
// 更新步骤配置(只能修改启用、图标、步骤说明和表单类型
existingConfig.Description = request.Description;
existingConfig.Icon = request.Icon;
existingConfig.IsEnabled = request.IsEnabled;
existingConfig.FormType = request.FormType;
existingConfig.UpdatedAt = DateTime.UtcNow;
existingConfig.UpdatedBy = currentUserId;
@ -80,6 +81,8 @@ public class UpdateCaseStepConfigCommandHandler : IRequestHandler<UpdateCaseStep
Description = existingConfig.Description,
Icon = existingConfig.Icon,
IsEnabled = existingConfig.IsEnabled,
FormType = (int)existingConfig.FormType,
FormTypeName = existingConfig.FormType.ToString(),
UpdatedAt = existingConfig.UpdatedAt
};

10
src/X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigResponse.cs

@ -40,6 +40,16 @@ public class UpdateCaseStepConfigResponse
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 表单类型
/// </summary>
public int FormType { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string FormTypeName { get; set; } = null!;
/// <summary>
/// 更新时间
/// </summary>

2
src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdQueryHandler.cs

@ -51,6 +51,8 @@ public class GetCaseStepConfigByIdQueryHandler : IRequestHandler<GetCaseStepConf
Description = nodeConfig.Description,
Icon = nodeConfig.Icon,
IsEnabled = nodeConfig.IsEnabled,
FormType = (int)nodeConfig.FormType,
FormTypeName = nodeConfig.FormType.ToString(),
CreatedAt = nodeConfig.CreatedAt,
UpdatedAt = nodeConfig.UpdatedAt,
CreatedBy = nodeConfig.CreatedBy,

10
src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdResponse.cs

@ -40,6 +40,16 @@ public class GetCaseStepConfigByIdResponse
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 表单类型
/// </summary>
public int FormType { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string FormTypeName { get; set; } = null!;
/// <summary>
/// 创建时间
/// </summary>

2
src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsQueryHandler.cs

@ -73,6 +73,8 @@ public class GetCaseStepConfigsQueryHandler : IRequestHandler<GetCaseStepConfigs
Icon = x.Icon,
Mapping = x.Mapping,
IsEnabled = x.IsEnabled,
FormType = (int)x.FormType,
FormTypeName = x.FormType.ToString(),
CreatedAt = x.CreatedAt,
UpdatedAt = x.UpdatedAt
}).ToList();

10
src/X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsResponse.cs

@ -61,6 +61,16 @@ public class UseCaseStepConfigDto
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 表单类型
/// </summary>
public int FormType { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string FormTypeName { get; set; } = null!;
/// <summary>
/// 创建时间
/// </summary>

11
src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeQuery.cs

@ -0,0 +1,11 @@
using MediatR;
using X1.Domain.Common;
namespace X1.Application.Features.CaseStepConfigs.Queries.GetFormTypeStepTypeMapping;
/// <summary>
/// 获取表单类型到步骤类型映射查询
/// </summary>
public class GetFormTypeStepTypeQuery : IRequest<OperationResult<GetFormTypeStepTypeResponse>>
{
}

48
src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeQueryHandler.cs

@ -0,0 +1,48 @@
using MediatR;
using X1.Domain.Common;
namespace X1.Application.Features.CaseStepConfigs.Queries.GetFormTypeStepTypeMapping;
/// <summary>
/// 获取表单类型到步骤类型映射查询处理器
/// </summary>
public class GetFormTypeStepTypeQueryHandler : IRequestHandler<GetFormTypeStepTypeQuery, OperationResult<GetFormTypeStepTypeResponse>>
{
/// <summary>
/// 处理查询
/// </summary>
/// <param name="request">查询请求</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>操作结果</returns>
public async Task<OperationResult<GetFormTypeStepTypeResponse>> Handle(GetFormTypeStepTypeQuery request, CancellationToken cancellationToken)
{
try
{
// 构建响应对象
var response = new GetFormTypeStepTypeResponse();
// 获取表单类型列表
response.FormTypes = FormTypeStepTypeConverter.GetFormTypes().Select(ft => new FormTypeDto
{
Value = ft.Value,
Name = ft.Name,
Description = ft.Description
}).ToList();
// 获取步骤类型列表
response.StepTypes = FormTypeStepTypeConverter.GetStepTypes().Select(st => new StepTypeDto
{
Value = st.Value,
Name = st.Name,
Description = st.Description
}).ToList();
return await Task.FromResult(OperationResult<GetFormTypeStepTypeResponse>.CreateSuccess(response));
}
catch (Exception ex)
{
return await Task.FromResult(OperationResult<GetFormTypeStepTypeResponse>.CreateFailure($"获取映射信息失败: {ex.Message}"));
}
}
}

100
src/X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/GetFormTypeStepTypeResponse.cs

@ -0,0 +1,100 @@
namespace X1.Application.Features.CaseStepConfigs.Queries.GetFormTypeStepTypeMapping;
/// <summary>
/// 获取表单类型到步骤类型映射响应
/// </summary>
public class GetFormTypeStepTypeResponse
{
/// <summary>
/// 表单类型列表
/// </summary>
public List<FormTypeDto> FormTypes { get; set; } = new();
/// <summary>
/// 步骤类型列表
/// </summary>
public List<StepTypeDto> StepTypes { get; set; } = new();
}
/// <summary>
/// 表单类型DTO
/// </summary>
public class FormTypeDto
{
/// <summary>
/// 表单类型值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string Name { get; set; } = null!;
/// <summary>
/// 表单类型描述
/// </summary>
public string Description { get; set; } = null!;
}
/// <summary>
/// 步骤类型DTO
/// </summary>
public class StepTypeDto
{
/// <summary>
/// 步骤类型值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 步骤类型名称
/// </summary>
public string Name { get; set; } = null!;
/// <summary>
/// 步骤类型描述
/// </summary>
public string Description { get; set; } = null!;
}
/// <summary>
/// 映射关系DTO
/// </summary>
public class MappingDto
{
/// <summary>
/// 表单类型
/// </summary>
public int FormType { get; set; }
/// <summary>
/// 表单类型名称
/// </summary>
public string FormTypeName { get; set; } = null!;
/// <summary>
/// 表单类型描述
/// </summary>
public string FormTypeDescription { get; set; } = null!;
/// <summary>
/// 推荐步骤类型
/// </summary>
public int RecommendedStepType { get; set; }
/// <summary>
/// 推荐步骤类型名称
/// </summary>
public string RecommendedStepTypeName { get; set; } = null!;
/// <summary>
/// 推荐步骤类型描述
/// </summary>
public string RecommendedStepTypeDescription { get; set; } = null!;
/// <summary>
/// 支持的步骤类型列表
/// </summary>
public List<StepTypeDto> SupportedStepTypes { get; set; } = new();
}

22
src/X1.Domain/Common/EnumValueObject.cs

@ -0,0 +1,22 @@
namespace X1.Domain.Common;
/// <summary>
/// 枚举项值对象
/// </summary>
public class EnumValueObject
{
/// <summary>
/// 枚举值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 枚举名称
/// </summary>
public string Name { get; set; } = string.Empty;
/// <summary>
/// 枚举描述
/// </summary>
public string Description { get; set; } = string.Empty;
}

140
src/X1.Domain/Common/FormTypeStepTypeConverter.cs

@ -0,0 +1,140 @@
using X1.Domain.Entities.TestCase;
namespace X1.Domain.Common;
/// <summary>
/// 表单类型到步骤类型转换器
/// </summary>
public static class FormTypeStepTypeConverter
{
/// <summary>
/// 根据表单类型获取推荐的步骤类型
/// </summary>
/// <param name="formType">表单类型</param>
/// <returns>推荐的步骤类型</returns>
public static CaseStepType GetRecommendedStepType(FormType formType)
{
return formType switch
{
FormType.None => CaseStepType.Process,
FormType.Registration => CaseStepType.Process,
FormType.Ping => CaseStepType.Process,
FormType.Iperf => CaseStepType.Process,
FormType.Call => CaseStepType.Process,
_ => CaseStepType.Process
};
}
/// <summary>
/// 获取表单类型与步骤类型的映射关系
/// </summary>
/// <returns>表单类型到步骤类型的映射字典</returns>
public static Dictionary<FormType, CaseStepType> GetFormTypeToStepTypeMapping()
{
return new Dictionary<FormType, CaseStepType>
{
{ FormType.None, CaseStepType.Process },
{ FormType.Registration, CaseStepType.Process },
{ FormType.Ping, CaseStepType.Process },
{ FormType.Iperf, CaseStepType.Process },
{ FormType.Call, CaseStepType.Process }
};
}
/// <summary>
/// 获取步骤类型支持的表单类型列表
/// </summary>
/// <param name="stepType">步骤类型</param>
/// <returns>支持的表单类型列表</returns>
public static List<FormType> GetSupportedFormTypes(CaseStepType stepType)
{
return stepType switch
{
CaseStepType.Start => new List<FormType> { FormType.None },
CaseStepType.End => new List<FormType> { FormType.None },
CaseStepType.Process => new List<FormType>
{
FormType.None,
FormType.Registration,
FormType.Ping,
FormType.Iperf,
FormType.Call
},
CaseStepType.Decision => new List<FormType> { FormType.None },
_ => new List<FormType> { FormType.None }
};
}
/// <summary>
/// 检查表单类型是否与步骤类型兼容
/// </summary>
/// <param name="formType">表单类型</param>
/// <param name="stepType">步骤类型</param>
/// <returns>是否兼容</returns>
public static bool IsCompatible(FormType formType, CaseStepType stepType)
{
var supportedFormTypes = GetSupportedFormTypes(stepType);
return supportedFormTypes.Contains(formType);
}
/// <summary>
/// 获取所有表单类型及其描述
/// </summary>
/// <returns>表单类型描述字典</returns>
public static Dictionary<FormType, string> GetFormTypeDescriptions()
{
return new Dictionary<FormType, string>
{
{ FormType.None, "无表单" },
{ FormType.Registration, "注册表单" },
{ FormType.Ping, "Ping表单" },
{ FormType.Iperf, "iperf表单" },
{ FormType.Call, "打电话表单" }
};
}
/// <summary>
/// 获取所有步骤类型及其描述
/// </summary>
/// <returns>步骤类型描述字典</returns>
public static Dictionary<CaseStepType, string> GetStepTypeDescriptions()
{
return new Dictionary<CaseStepType, string>
{
{ CaseStepType.Start, "开始步骤" },
{ CaseStepType.End, "结束步骤" },
{ CaseStepType.Process, "处理步骤" },
{ CaseStepType.Decision, "判断步骤" }
};
}
/// <summary>
/// 获取所有表单类型列表
/// </summary>
/// <returns>表单类型列表</returns>
public static List<EnumValueObject> GetFormTypes()
{
var formTypeDescriptions = GetFormTypeDescriptions();
return formTypeDescriptions.Select(kvp => new EnumValueObject
{
Value = (int)kvp.Key,
Name = kvp.Key.ToString(),
Description = kvp.Value
}).ToList();
}
/// <summary>
/// 获取所有步骤类型列表
/// </summary>
/// <returns>步骤类型列表</returns>
public static List<EnumValueObject> GetStepTypes()
{
var stepTypeDescriptions = GetStepTypeDescriptions();
return stepTypeDescriptions.Select(kvp => new EnumValueObject
{
Value = (int)kvp.Key,
Name = kvp.Key.ToString(),
Description = kvp.Value
}).ToList();
}
}

11
src/X1.Domain/Entities/TestCase/CaseStepConfig.cs

@ -45,6 +45,11 @@ public class CaseStepConfig : AuditableEntity
/// </summary>
public bool IsEnabled { get; set; } = true;
/// <summary>
/// 表单类型
/// </summary>
public FormType FormType { get; set; } = FormType.None;
/// <summary>
/// 默认构造函数
/// </summary>
@ -54,6 +59,7 @@ public class CaseStepConfig : AuditableEntity
CreatedAt = DateTime.UtcNow;
UpdatedAt = DateTime.UtcNow;
IsEnabled = true; // 默认启用
FormType = FormType.None; // 默认无表单
}
/// <summary>
@ -66,6 +72,7 @@ public class CaseStepConfig : AuditableEntity
/// <param name="description">步骤说明</param>
/// <param name="icon">步骤图标</param>
/// <param name="isEnabled">是否启用</param>
/// <param name="formType">表单类型</param>
public static CaseStepConfig Create(
string stepName,
CaseStepType stepType,
@ -73,7 +80,8 @@ public class CaseStepConfig : AuditableEntity
string createdBy,
string? description = null,
string? icon = null,
bool isEnabled = true)
bool isEnabled = true,
FormType formType = FormType.None)
{
var caseStepConfig = new CaseStepConfig
{
@ -84,6 +92,7 @@ public class CaseStepConfig : AuditableEntity
Description = description,
Icon = icon,
IsEnabled = isEnabled,
FormType = formType,
CreatedAt = DateTime.UtcNow,
UpdatedAt = DateTime.UtcNow,
CreatedBy = createdBy,

32
src/X1.Domain/Entities/TestCase/FormType.cs

@ -0,0 +1,32 @@
namespace X1.Domain.Entities.TestCase;
/// <summary>
/// 表单类型枚举
/// </summary>
public enum FormType
{
/// <summary>
/// 无表单
/// </summary>
None = 0,
/// <summary>
/// 注册表单
/// </summary>
Registration = 1,
/// <summary>
/// Ping表单
/// </summary>
Ping = 2,
/// <summary>
/// iperf表单
/// </summary>
Iperf = 3,
/// <summary>
/// 打电话表单
/// </summary>
Call = 4
}

4
src/X1.Infrastructure/Configurations/TestCase/CaseStepConfigConfiguration.cs

@ -53,6 +53,10 @@ public class CaseStepConfigConfiguration : IEntityTypeConfiguration<CaseStepConf
.HasColumnName("isenabled")
.IsRequired();
builder.Property(x => x.FormType)
.HasColumnName("formtype")
.IsRequired();
builder.Property(x => x.CreatedAt)
.HasColumnName("createdat")
.IsRequired();

1889
src/X1.Infrastructure/Migrations/20250822101301_AddFormTypeToCaseStepConfig.Designer.cs

File diff suppressed because it is too large

29
src/X1.Infrastructure/Migrations/20250822101301_AddFormTypeToCaseStepConfig.cs

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace X1.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class AddFormTypeToCaseStepConfig : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "formtype",
table: "tb_casestepconfig",
type: "integer",
nullable: false,
defaultValue: 0);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "formtype",
table: "tb_casestepconfig");
}
}
}

4
src/X1.Infrastructure/Migrations/AppDbContextModelSnapshot.cs

@ -1427,6 +1427,10 @@ namespace X1.Infrastructure.Migrations
.HasColumnType("character varying(500)")
.HasColumnName("description");
b.Property<int>("FormType")
.HasColumnType("integer")
.HasColumnName("formtype");
b.Property<string>("Icon")
.HasMaxLength(100)
.HasColumnType("character varying(100)")

21
src/X1.Presentation/Controllers/CaseStepConfigController.cs

@ -3,6 +3,7 @@ using X1.Application.Features.CaseStepConfigs.Commands.UpdateCaseStepConfig;
using X1.Application.Features.CaseStepConfigs.Commands.DeleteCaseStepConfig;
using X1.Application.Features.CaseStepConfigs.Queries.GetCaseStepConfigs;
using X1.Application.Features.CaseStepConfigs.Queries.GetCaseStepConfigById;
using X1.Application.Features.CaseStepConfigs.Queries.GetFormTypeStepTypeMapping;
using X1.Domain.Common;
using X1.Presentation.Abstractions;
using MediatR;
@ -132,4 +133,24 @@ public class CaseStepConfigController : ApiController
_logger.LogInformation("成功删除用例步骤配置,配置ID: {ConfigId}", id);
return result;
}
/// <summary>
/// 获取表单类型到步骤类型映射
/// </summary>
[HttpGet("form-type-step-type-mapping")]
public async Task<OperationResult<GetFormTypeStepTypeResponse>> GetFormTypeStepTypeMapping()
{
_logger.LogInformation("开始获取表单类型到步骤类型映射");
var result = await mediator.Send(new GetFormTypeStepTypeQuery());
if (!result.IsSuccess)
{
_logger.LogWarning("获取表单类型到步骤类型映射失败: {Message}", result.ErrorMessages);
return result;
}
_logger.LogInformation("成功获取表单类型到步骤类型映射,表单类型数量: {FormTypeCount}, 步骤类型数量: {StepTypeCount}",
result.Data?.FormTypes?.Count ?? 0, result.Data?.StepTypes?.Count ?? 0);
return result;
}
}

269
src/modify.md

@ -1,5 +1,206 @@
# 修改记录
## 2025-01-22 - CaseStepConfig 添加 FormType 字段数据库迁移
### 修改内容
1. **创建数据库迁移**
- 新建迁移文件:`20250822101301_AddFormTypeToCaseStepConfig.cs`
- 迁移名称:`AddFormTypeToCaseStepConfig`
- 迁移时间:2025-08-22 10:13:01
2. **迁移内容**
- 为 `tb_casestepconfig` 表添加 `formtype` 字段
- 字段类型:`integer`(对应 FormType 枚举)
- 约束:`NOT NULL`
- 默认值:`0`(对应 FormType.None)
3. **迁移应用**
- 成功应用迁移到数据库
- 执行 SQL:`ALTER TABLE tb_casestepconfig ADD formtype integer NOT NULL DEFAULT 0;`
- 更新迁移历史表:`__EFMigrationsHistory`
### 解决的问题
- **数据库同步**:CaseStepConfig 实体已添加 FormType 属性,但数据库表缺少对应字段
- **数据一致性**:确保实体模型与数据库表结构完全一致
- **功能支持**:为表单类型功能提供数据库支持
### 技术特点
- 使用 Entity Framework Core 迁移机制
- 保持数据完整性,设置合理的默认值
- 支持回滚操作(Down 方法)
- 完整的迁移历史记录
### 修改时间
2025-01-22
### 修改原因
用户反映 CaseStepConfig 有更新,需要重新迁移数据库表以反映实体模型的变更,特别是添加的 FormType 字段。
---
## 2025-01-21 - 添加表单类型到用例步骤配置
### 修改内容
1. **创建表单类型枚举**
- 新建 `X1.Domain/Entities/TestCase/FormType.cs` 文件
- 定义 `FormType` 枚举,包含以下类型:
- `None = 0` - 无表单(默认)
- `Registration = 1` - 注册表单
- `Ping = 2` - Ping表单
- `Iperf = 3` - iperf表单
- `Call = 4` - 打电话表单
2. **更新 CaseStepConfig 实体**
- 在 `X1.Domain/Entities/TestCase/CaseStepConfig.cs` 中添加 `FormType` 属性
- 默认值设置为 `FormType.None`
- 更新 `Create` 方法,添加 `formType` 参数,默认值为 `FormType.None`
- 更新默认构造函数,设置 `FormType = FormType.None`
3. **更新数据库配置**
- 在 `X1.Infrastructure/Configurations/TestCase/CaseStepConfigConfiguration.cs` 中添加 `FormType` 字段映射
- 字段名设置为 `formtype`,设置为必填字段
4. **更新应用层命令和响应**
- 在 `X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommand.cs` 中添加 `FormType` 属性
- 在 `X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsResponse.cs` 中添加 `FormType``FormTypeName` 属性
### 解决的问题
- **表单类型支持**:为用例步骤配置添加表单类型支持
- **默认值设置**:启动和结束步骤默认使用 `FormType.None`
- **扩展性**:支持注册表单、Ping表单、iperf表单、打电话表单等多种表单类型
### 技术特点
- 使用枚举类型确保类型安全
- 默认值设置为 `None`,符合启动和结束步骤的需求
- 完整的数据库映射配置
- 前后端数据传输对象更新
### 修改时间
2025-01-21
### 修改原因
用户要求为用例步骤配置添加表单类型支持,包括注册表单、Ping表单、iperf表单、打电话表单,并且启动和结束步骤默认使用None类型。
---
## 2025-01-21 - 添加FormType到CaseStepType转换工具
### 修改内容
1. **创建转换工具类**
- 新建 `X1.Application/Features/CaseStepConfigs/Queries/FormTypeStepTypeConverter.cs` 文件
- 提供 `FormType``CaseStepType` 的转换功能
- 包含以下方法:
- `GetRecommendedStepType(FormType formType)` - 根据表单类型获取推荐的步骤类型
- `GetFormTypeToStepTypeMapping()` - 获取表单类型与步骤类型的映射关系
- `GetSupportedFormTypes(CaseStepType stepType)` - 获取步骤类型支持的表单类型列表
- `IsCompatible(FormType formType, CaseStepType stepType)` - 检查表单类型是否与步骤类型兼容
- `GetFormTypeDescriptions()` - 获取所有表单类型及其描述
- `GetStepTypeDescriptions()` - 获取所有步骤类型及其描述
- `GetCompleteMappingInfo()` - 获取表单类型和步骤类型的完整映射信息
2. **创建查询API**
- 新建 `X1.Application/Features/CaseStepConfigs/Queries/GetFormTypeStepTypeMapping/` 目录
- 创建 `GetFormTypeStepTypeMappingQuery.cs` - 查询请求
- 创建 `GetFormTypeStepTypeMappingResponse.cs` - 响应DTO,包含:
- `FormTypeDto` - 表单类型信息
- `StepTypeDto` - 步骤类型信息
- `MappingDto` - 映射关系信息
- 创建 `GetFormTypeStepTypeMappingQueryHandler.cs` - 查询处理器
### 功能特点
- **智能推荐**:根据表单类型自动推荐合适的步骤类型
- **兼容性检查**:验证表单类型与步骤类型的兼容性
- **完整映射**:提供完整的表单类型和步骤类型映射关系
- **API支持**:通过查询API提供映射信息给前端使用
- **类型安全**:使用强类型枚举确保类型安全
### 映射规则
- **开始步骤 (Start)**:仅支持 `FormType.None`
- **结束步骤 (End)**:仅支持 `FormType.None`
- **处理步骤 (Process)**:支持所有表单类型
- **判断步骤 (Decision)**:仅支持 `FormType.None`
### 修改时间
2025-01-21
### 修改原因
用户要求在 `X1.Application.Features.CaseStepConfigs/Queries` 目录中添加 `FormType``CaseStepType` 的转换集合/工具。
---
## 2025-01-21 - CreateCaseStepConfigCommand 已包含 FormType 属性
### 修改内容
经过检查发现,`CreateCaseStepConfigCommand` 类中已经包含了 `FormType` 属性:
```csharp
/// <summary>
/// 表单类型
/// </summary>
public FormType FormType { get; set; } = FormType.None;
```
### 当前状态
- **FormType 属性已存在**:`CreateCaseStepConfigCommand` 类中已经正确添加了 `FormType` 属性
- **默认值已设置**:默认值为 `FormType.None`,符合业务需求
- **验证特性已配置**:属性已正确配置,无需额外修改
### 修改时间
2025-01-21
### 修改原因
用户要求为 `CreateCaseStepConfigCommand` 添加 `FormType` 属性,但检查后发现该属性已经存在且配置正确。
---
## 2025-01-21 - 修复 CreateCaseStepConfigCommandHandler 中 FormType 传递问题
### 修改内容
修复了 `CreateCaseStepConfigCommandHandler``FormType` 参数未传递给 `CaseStepConfig.Create` 方法的问题:
1. **修复命令处理器**:在 `CreateCaseStepConfigCommandHandler.cs` 中,将 `request.FormType` 传递给 `CaseStepConfig.Create` 方法
2. **更新响应对象**:在 `CreateCaseStepConfigResponse.cs` 中添加了 `FormType``FormTypeName` 属性
3. **完善响应构建**:在命令处理器中构建响应时包含表单类型信息
### 修改的文件
- `X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigCommandHandler.cs`
- `X1.Application/Features/CaseStepConfigs/Commands/CreateCaseStepConfig/CreateCaseStepConfigResponse.cs`
### 修改时间
2025-01-21
### 修改原因
用户反馈 `CreateCaseStepConfigCommand``FormType` 属性没有正确传递给 `CaseStepConfig.Create` 方法,导致表单类型信息丢失。
---
## 2025-01-21 - 修复查询处理器中的 FormType 处理问题
### 修改内容
修复了查询处理器中 `FormType` 信息缺失的问题:
1. **修复 GetCaseStepConfigsQueryHandler**:在 `UseCaseStepConfigDto` 映射中添加了 `FormType``FormTypeName` 属性
2. **修复 GetCaseStepConfigByIdQueryHandler**:在响应构建中添加了 `FormType``FormTypeName` 信息
3. **更新响应类**
- `GetCaseStepConfigByIdResponse.cs` 添加了 `FormType``FormTypeName` 属性
- `UpdateCaseStepConfigResponse.cs` 添加了 `FormType``FormTypeName` 属性
4. **完善更新命令**:在 `UpdateCaseStepConfigCommand.cs` 中添加了 `FormType` 属性
### 修改的文件
- `X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigs/GetCaseStepConfigsQueryHandler.cs`
- `X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdQueryHandler.cs`
- `X1.Application/Features/CaseStepConfigs/Queries/GetCaseStepConfigById/GetCaseStepConfigByIdResponse.cs`
- `X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigResponse.cs`
- `X1.Application/Features/CaseStepConfigs/Commands/UpdateCaseStepConfig/UpdateCaseStepConfigCommand.cs`
### 修改时间
2025-01-21
### 修改原因
用户反馈查询处理器中缺少 `FormType` 信息的处理,需要确保所有相关的查询和响应都包含表单类型信息。
---
## 2025-01-21 - X1.WebUI Tabs 组件滚动条遮挡文字问题修复
### 修改内容
@ -14408,4 +14609,70 @@ catch (Exception ex)
2025-01-21
### 修改原因
用户反馈当标签特别多时,Content 区域被拉长看不见,Tabs 超出也看不见。需要修复布局问题,确保 Content 区域和 Tabs 都能正确显示和滚动。
用户反馈当标签特别多时,Content 区域被拉长看不见,Tabs 超出也看不见。需要修复布局问题,确保 Content 区域和 Tabs 都能正确显示和滚动。
---
## 2025-01-21 - CaseStepConfigController 添加 GetFormTypeStepTypeMapping 方法
### 修改内容
`CaseStepConfigController` 中添加了 `GetFormTypeStepTypeMapping` 方法,按照现有功能的模式实现:
1. **新增控制器方法**
- **方法名**:`GetFormTypeStepTypeMapping`
- **路由**:`[HttpGet("form-type-step-type-mapping")]` - 对应 `/api/casestepconfigs/form-type-step-type-mapping`
- **返回类型**:`OperationResult<GetFormTypeStepTypeResponse>`
- **功能**:获取表单类型到步骤类型的映射信息
2. **依赖注入更新**
- 添加了 `using X1.Application.Features.CaseStepConfigs.Queries.GetFormTypeStepTypeMapping;` 命名空间引用
- 确保能够正确引用 `GetFormTypeStepTypeQuery``GetFormTypeStepTypeResponse`
3. **实现特性**
- **命令处理**:使用 `mediator.Send(new GetFormTypeStepTypeQuery())` 发送查询
- **日志记录**:详细的开始、成功、失败日志记录
- **错误处理**:完整的错误处理和用户友好的错误信息
- **统计信息**:成功日志中包含表单类型数量和步骤类型数量的统计
4. **API端点**
```
GET /api/casestepconfigs/form-type-step-type-mapping
Authorization: Bearer {token}
```
5. **响应格式**
```json
{
"isSuccess": true,
"data": {
"formTypes": [
{
"value": 0,
"name": "None",
"description": "无表单"
}
],
"stepTypes": [
{
"value": 1,
"name": "Start",
"description": "开始步骤"
}
]
},
"errorMessages": null
}
```
### 技术特点
- **遵循现有模式**:完全按照 `CaseStepConfigController` 中其他方法的实现模式
- **CQRS架构**:使用 MediatR 发送查询,遵循 CQRS 模式
- **统一响应格式**:使用 `OperationResult<T>` 统一响应格式
- **完整日志记录**:包含详细的日志记录和错误处理
- **类型安全**:使用强类型响应对象,确保类型安全
### 修改时间
2025-01-21
### 修改原因
用户要求 `GetFormTypeStepTypeQueryHandler` 已经实现,需要在控制器 `CaseStepConfigController` 中按照现有功能模式实现相应的控制器方法,不添加额外功能。
Loading…
Cancel
Save