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