You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
6.1 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// ============================================================================
// 【文件说明】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;
/// <summary>
/// 产品信息控制器。
/// <para>
/// 【控制器职责】
/// 控制器只负责"请求处理",不包含业务逻辑:
/// 1. 接收 HTTP 请求
/// 2. 调用 Service 处理业务
/// 3. 返回统一格式的响应
///
/// 业务逻辑在 HwProductInfoService 中实现。
/// </para>
/// </summary>
[AllowAnonymous]
[Route("portal/productInfo")]
public class HwProductInfoController : HwPortalControllerBase
{
/// <summary>
/// 产品信息服务。
/// </summary>
private readonly HwProductInfoService _productInfoService;
/// <summary>
/// 配置类型服务。
/// </summary>
private readonly HwPortalConfigTypeService _configTypeService;
/// <summary>
/// 构造函数(依赖注入)。
/// <para>
/// 【多服务注入】
/// 这个控制器需要两个服务:
/// - HwProductInfoService处理产品信息
/// - HwPortalConfigTypeService处理配置类型
///
/// ASP.NET Core 的 DI 容器会自动创建并注入这些服务。
/// </para>
/// </summary>
/// <param name="productInfoService">产品信息服务</param>
/// <param name="configTypeService">配置类型服务</param>
public HwProductInfoController(HwProductInfoService productInfoService, HwPortalConfigTypeService configTypeService)
{
_productInfoService = productInfoService;
_configTypeService = configTypeService;
}
/// <summary>
/// 查询产品列表(分页)。
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>分页数据</returns>
[HttpGet("list")]
public async Task<HwPortalTableDataInfo<HwProductInfo>> List([FromQuery] HwProductInfo input)
{
// GetDataTable 是基类方法,做内存分页。
// 如果数据量大应该在数据库层面分页SQL LIMIT/OFFSET
return GetDataTable(await _productInfoService.SelectHwProductInfoJoinList(input));
}
/// <summary>
/// 导出产品信息到 Excel。
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>Excel 文件</returns>
[HttpPost("export")]
[Idempotent]
public async Task<IActionResult> Export([FromQuery] HwProductInfo input)
{
return ExportExcel(await _productInfoService.SelectHwProductInfoList(input), "产品信息数据");
}
/// <summary>
/// 根据产品ID查询详情。
/// </summary>
/// <param name="productInfoId">产品ID</param>
/// <returns>产品详情</returns>
[HttpGet("{productInfoId:long}")]
public async Task<HwPortalAjaxResult> GetInfo(long productInfoId)
{
return Success(await _productInfoService.SelectHwProductInfoByProductInfoId(productInfoId));
}
/// <summary>
/// 新增产品。
/// </summary>
/// <param name="input">产品数据</param>
/// <returns>操作结果</returns>
[HttpPost]
[Idempotent]
public async Task<HwPortalAjaxResult> Add([FromBody] HwProductInfo input)
{
return ToAjax(await _productInfoService.InsertHwProductInfo(input));
}
/// <summary>
/// 更新产品。
/// </summary>
/// <param name="input">产品数据</param>
/// <returns>操作结果</returns>
[HttpPut]
[Idempotent]
public async Task<HwPortalAjaxResult> Edit([FromBody] HwProductInfo input)
{
return ToAjax(await _productInfoService.UpdateHwProductInfo(input));
}
/// <summary>
/// 批量删除产品。
/// </summary>
/// <param name="productInfoIds">逗号分隔的产品ID</param>
/// <returns>操作结果</returns>
[HttpDelete("{productInfoIds}")]
[Idempotent]
public async Task<HwPortalAjaxResult> Remove(string productInfoIds)
{
return ToAjax(await _productInfoService.DeleteHwProductInfoByProductInfoIds(ParseLongArray(productInfoIds)));
}
/// <summary>
/// 查询配置类型树。
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>配置类型树</returns>
[HttpGet("portalConfigTypeTree")]
public async Task<HwPortalAjaxResult> PortalConfigTypeTree([FromQuery] HwPortalConfigType input)
{
return Success(await _configTypeService.SelectPortalConfigTypeTreeList(input));
}
/// <summary>
/// 解析逗号分隔的长整型数组(私有方法)。
/// <para>
/// 【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();
/// </para>
/// </summary>
/// <param name="value">逗号分隔的字符串</param>
/// <returns>长整型数组</returns>
private static long[] ParseLongArray(string value) =>
value.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(long.Parse).ToArray();
}