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.

138 lines
4.7 KiB
C#

// ============================================================================
// 【文件说明】HwProductInfoJoinDetailRow.cs - 产品信息关联明细行 DTO
// ============================================================================
// 这是一个"数据传输对象"DTO用于接收 SQL JOIN 查询的扁平结果集。
//
// 【什么是 DTO
// DTO = Data Transfer Object数据传输对象
// 用于在不同层之间传输数据,不包含业务逻辑。
//
// 【为什么需要这个类?】
// SQL JOIN 查询返回的是"扁平结构"
// 产品ID | 产品名称 | 明细ID | 明细标题 | ...
// 1 | 产品A | 101 | 明细1 | ...
// 1 | 产品A | 102 | 明细2 | ...
//
// 每行包含产品字段 + 明细字段,需要用这个类接收。
// 然后在 Service 层通过 LINQ GroupBy 转换成树形结构。
//
// 【命名约定】
// Row 后缀表示"行",代表 SQL 结果集的一行。
// Join 表示这是 JOIN 查询的结果。
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
/// <summary>
/// 产品信息关联明细行 DTO。
/// <para>
/// 【C# 语法知识点 - internal sealed class】
/// internal只能在当前程序集Assembly内访问。
/// sealed密封类不能被继承。
///
/// 为什么用 internal
/// 这个类只在插件内部使用,不需要暴露给外部。
///
/// 为什么用 sealed
/// 1. 这个类不需要被继承
/// 2. 密封类可以有编译器优化(虚方法调用转直接调用)
///
/// 对比 Java
/// Java 用 package-private不写访问修饰符实现类似 internal 的效果。
/// Java 用 final 关键字实现 sealed 的效果:
/// final class HwProductInfoJoinDetailRow extends HwProductInfo { ... }
/// </para>
/// <para>
/// 【继承设计】
/// : HwProductInfo 表示继承自产品信息实体类。
/// 这样这个类就包含了产品的所有字段,再加上明细字段。
///
/// 对比 Java
/// Java 的继承写法一样:
/// class HwProductInfoJoinDetailRow extends HwProductInfo { ... }
/// </para>
/// <para>
/// 【字段命名约定】
/// Sub 前缀表示"子表字段"(明细表字段):
/// - SubProductInfoDetailId明细ID
/// - SubProductInfoDetailTitle明细标题
/// - ...
///
/// 这样可以区分主表字段和子表字段,避免命名冲突。
/// </para>
/// </summary>
internal sealed class HwProductInfoJoinDetailRow : HwProductInfo
{
/// <summary>
/// 明细ID子表字段
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_detail_id")]
public long? SubProductInfoDetailId { get; set; }
/// <summary>
/// 明细父ID子表字段
/// </summary>
[SugarColumn(ColumnName = "sub_parent_id")]
public long? SubParentId { get; set; }
/// <summary>
/// 明细所属产品ID子表字段
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_id")]
public long? SubProductInfoId { get; set; }
/// <summary>
/// 明细标题(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_detail_title")]
public string SubProductInfoDetailTitle { get; set; }
/// <summary>
/// 明细描述(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_detail_desc")]
public string SubProductInfoDetailDesc { get; set; }
/// <summary>
/// 明细排序号(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_detail_order")]
public long? SubProductInfoDetailOrder { get; set; }
/// <summary>
/// 明细图片URL子表字段
/// </summary>
[SugarColumn(ColumnName = "sub_product_info_detail_pic")]
public string SubProductInfoDetailPic { get; set; }
/// <summary>
/// 明细祖级列表(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_ancestors")]
public string SubAncestors { get; set; }
/// <summary>
/// 明细创建时间(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_create_time")]
public DateTime? SubCreateTime { get; set; }
/// <summary>
/// 明细创建人(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_create_by")]
public string SubCreateBy { get; set; }
/// <summary>
/// 明细更新时间(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_update_time")]
public DateTime? SubUpdateTime { get; set; }
/// <summary>
/// 明细更新人(子表字段)。
/// </summary>
[SugarColumn(ColumnName = "sub_update_by")]
public string SubUpdateBy { get; set; }
}