|
|
// ============================================================================
|
|
|
// 【文件说明】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();
|
|
|
}
|