// ============================================================================
// 【文件说明】HwProductInfoController.cs - 产品信息控制器
// ============================================================================
// 这个控制器负责处理产品信息相关的 HTTP 请求。
//
// 【RESTful API 设计】
// - GET portal/productInfo/list -> 查询列表
// - GET portal/productInfo/{productInfoId} -> 查询详情
// - POST portal/productInfo -> 新增
// - PUT portal/productInfo -> 更新
// - DELETE portal/productInfo/{productInfoIds} -> 批量删除
// - GET portal/productInfo/portalConfigTypeTree -> 查询配置类型树
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
///
/// 产品信息控制器。
///
/// 【控制器职责】
/// 控制器只负责"请求处理",不包含业务逻辑:
/// 1. 接收 HTTP 请求
/// 2. 调用 Service 处理业务
/// 3. 返回统一格式的响应
///
/// 业务逻辑在 HwProductInfoService 中实现。
///
///
[AllowAnonymous]
[Route("portal/productInfo")]
public class HwProductInfoController : HwPortalControllerBase
{
///
/// 产品信息服务。
///
private readonly HwProductInfoService _productInfoService;
///
/// 配置类型服务。
///
private readonly HwPortalConfigTypeService _configTypeService;
///
/// 构造函数(依赖注入)。
///
/// 【多服务注入】
/// 这个控制器需要两个服务:
/// - HwProductInfoService:处理产品信息
/// - HwPortalConfigTypeService:处理配置类型
///
/// ASP.NET Core 的 DI 容器会自动创建并注入这些服务。
///
///
/// 产品信息服务
/// 配置类型服务
public HwProductInfoController(HwProductInfoService productInfoService, HwPortalConfigTypeService configTypeService)
{
_productInfoService = productInfoService;
_configTypeService = configTypeService;
}
///
/// 查询产品列表(分页)。
///
/// 查询条件
/// 分页数据
[HttpGet("list")]
public async Task> List([FromQuery] HwProductInfo input)
{
// GetDataTable 是基类方法,做内存分页。
// 如果数据量大,应该在数据库层面分页(SQL LIMIT/OFFSET)。
return GetDataTable(await _productInfoService.SelectHwProductInfoJoinList(input));
}
///
/// 导出产品信息到 Excel。
///
/// 查询条件
/// Excel 文件
[HttpPost("export")]
[Idempotent]
public async Task Export([FromQuery] HwProductInfo input)
{
return ExportExcel(await _productInfoService.SelectHwProductInfoList(input), "产品信息数据");
}
///
/// 根据产品ID查询详情。
///
/// 产品ID
/// 产品详情
[HttpGet("{productInfoId:long}")]
public async Task GetInfo(long productInfoId)
{
return Success(await _productInfoService.SelectHwProductInfoByProductInfoId(productInfoId));
}
///
/// 新增产品。
///
/// 产品数据
/// 操作结果
[HttpPost]
[Idempotent]
public async Task Add([FromBody] HwProductInfo input)
{
return ToAjax(await _productInfoService.InsertHwProductInfo(input));
}
///
/// 更新产品。
///
/// 产品数据
/// 操作结果
[HttpPut]
[Idempotent]
public async Task Edit([FromBody] HwProductInfo input)
{
return ToAjax(await _productInfoService.UpdateHwProductInfo(input));
}
///
/// 批量删除产品。
///
/// 逗号分隔的产品ID
/// 操作结果
[HttpDelete("{productInfoIds}")]
[Idempotent]
public async Task Remove(string productInfoIds)
{
return ToAjax(await _productInfoService.DeleteHwProductInfoByProductInfoIds(ParseLongArray(productInfoIds)));
}
///
/// 查询配置类型树。
///
/// 查询条件
/// 配置类型树
[HttpGet("portalConfigTypeTree")]
public async Task PortalConfigTypeTree([FromQuery] HwPortalConfigType input)
{
return Success(await _configTypeService.SelectPortalConfigTypeTreeList(input));
}
///
/// 解析逗号分隔的长整型数组(私有方法)。
///
/// 【C# 语法知识点 - 表达式体方法】
/// private static long[] ParseLongArray(string value) => ...
//
/// 这是"表达式体方法"(Expression-bodied method)语法。
/// 等价于:
/// private static long[] ParseLongArray(string value) {
/// return value.Split(...).Select(...).ToArray();
/// }
///
/// 当方法体只有一行 return 语句时,可以用 => 简化。
///
/// 对比 Java:
/// Java 没有这个语法,但 Java 14+ 有类似的表达式体方法:
/// private static long[] parseLongArray(String value) ->
/// Arrays.stream(value.split(",")).mapToLong(Long::parseLong).toArray();
///
///
/// 逗号分隔的字符串
/// 长整型数组
private static long[] ParseLongArray(string value) =>
value.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(long.Parse).ToArray();
}