feat: 新增ai-stock模块
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
using SqlSugar;
|
||||
using Volo.Abp.Auditing;
|
||||
using Volo.Abp.Domain.Entities;
|
||||
using Yi.Framework.Core.Data;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户股票持仓聚合根
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 记录用户持有的股票数量和相关信息
|
||||
/// </remarks>
|
||||
[SugarTable("Stock_Holding")]
|
||||
public class StockHoldingAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 逻辑删除
|
||||
/// </summary>
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreationTime { get; set; } = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
public Guid? CreatorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改者
|
||||
/// </summary>
|
||||
public Guid? LastModifierId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改时间
|
||||
/// </summary>
|
||||
public DateTime? LastModificationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户ID
|
||||
/// </summary>
|
||||
/// <remarks>关联到持有股票的用户</remarks>
|
||||
public Guid UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 股票ID
|
||||
/// </summary>
|
||||
/// <remarks>关联到具体的股票</remarks>
|
||||
public Guid StockId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 股票代码
|
||||
/// </summary>
|
||||
/// <remarks>冗余字段,方便查询</remarks>
|
||||
public string StockCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 股票名称
|
||||
/// </summary>
|
||||
/// <remarks>冗余字段,方便查询</remarks>
|
||||
public string StockName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 持有数量
|
||||
/// </summary>
|
||||
/// <remarks>用户持有的股票数量</remarks>
|
||||
public int Quantity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均成本价
|
||||
/// </summary>
|
||||
/// <remarks>用户购买这些股票的平均成本价</remarks>
|
||||
public decimal AverageCostPrice { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 持仓成本
|
||||
/// </summary>
|
||||
/// <remarks>总投入成本 = 平均成本价 * 持有数量</remarks>
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public decimal TotalCost => AverageCostPrice * Quantity;
|
||||
|
||||
public StockHoldingAggregateRoot() { }
|
||||
|
||||
public StockHoldingAggregateRoot(
|
||||
Guid userId,
|
||||
Guid stockId,
|
||||
string stockCode,
|
||||
string stockName,
|
||||
int quantity,
|
||||
decimal averageCostPrice)
|
||||
{
|
||||
UserId = userId;
|
||||
StockId = stockId;
|
||||
StockCode = stockCode;
|
||||
StockName = stockName;
|
||||
Quantity = quantity;
|
||||
AverageCostPrice = averageCostPrice;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 增加持仓数量
|
||||
/// </summary>
|
||||
/// <param name="quantity">增加的数量</param>
|
||||
/// <param name="price">本次购买价格</param>
|
||||
public void AddQuantity(int quantity, decimal price)
|
||||
{
|
||||
if (quantity <= 0)
|
||||
throw new ArgumentException("增加的数量必须大于0");
|
||||
|
||||
// 计算新的平均成本价
|
||||
decimal totalCost = AverageCostPrice * Quantity + price * quantity;
|
||||
Quantity += quantity;
|
||||
AverageCostPrice = totalCost / Quantity;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 减少持仓数量
|
||||
/// </summary>
|
||||
/// <param name="quantity">减少的数量</param>
|
||||
public void ReduceQuantity(int quantity)
|
||||
{
|
||||
if (quantity <= 0)
|
||||
throw new ArgumentException("减少的数量必须大于0");
|
||||
|
||||
if (quantity > Quantity)
|
||||
throw new ArgumentException("减少的数量不能大于持有数量");
|
||||
|
||||
Quantity -= quantity;
|
||||
|
||||
// 如果数量为0,标记为删除
|
||||
if (Quantity == 0)
|
||||
{
|
||||
IsDeleted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using SqlSugar;
|
||||
using Volo.Abp.Auditing;
|
||||
using Volo.Abp.Domain.Entities;
|
||||
using Yi.Framework.Core.Data;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 股市聚合根实体
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于定义有哪些公司上架的股市
|
||||
/// </remarks>
|
||||
[SugarTable("Stock_Market")]
|
||||
public class StockMarketAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject, IOrderNum, IState
|
||||
{
|
||||
/// <summary>
|
||||
/// 逻辑删除
|
||||
/// </summary>
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreationTime { get; set; } = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
public Guid? CreatorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改者
|
||||
/// </summary>
|
||||
public Guid? LastModifierId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改时间
|
||||
/// </summary>
|
||||
public DateTime? LastModificationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 排序
|
||||
/// </summary>
|
||||
public int OrderNum { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 状态
|
||||
/// </summary>
|
||||
public bool State { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 股市代码
|
||||
/// </summary>
|
||||
/// <remarks>如:SH、SZ、HK等</remarks>
|
||||
public string MarketCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 股市名称
|
||||
/// </summary>
|
||||
/// <remarks>如:上海证券交易所、深圳证券交易所等</remarks>
|
||||
public string MarketName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 股市描述
|
||||
/// </summary>
|
||||
public string Description { get; set; } = string.Empty;
|
||||
|
||||
public StockMarketAggregateRoot() { }
|
||||
|
||||
public StockMarketAggregateRoot(
|
||||
string marketCode,
|
||||
string marketName,
|
||||
string description = "")
|
||||
{
|
||||
MarketCode = marketCode;
|
||||
MarketName = marketName;
|
||||
Description = description;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
using SqlSugar;
|
||||
using Volo.Abp.Auditing;
|
||||
using Volo.Abp.Domain.Entities;
|
||||
using Yi.Framework.Core.Data;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 股市新闻聚合根实体
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于记录影响股市波动的新闻事件
|
||||
/// </remarks>
|
||||
[SugarTable("Stock_News")]
|
||||
public class StockNewsAggregateRoot : AggregateRoot<Guid>, ISoftDelete, IAuditedObject, IOrderNum
|
||||
{
|
||||
/// <summary>
|
||||
/// 逻辑删除
|
||||
/// </summary>
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime CreationTime { get; set; } = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者ID
|
||||
/// </summary>
|
||||
public Guid? CreatorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改时间
|
||||
/// </summary>
|
||||
public DateTime? LastModificationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改者ID
|
||||
/// </summary>
|
||||
public Guid? LastModifierId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 排序号
|
||||
/// </summary>
|
||||
public int OrderNum { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 新闻标题
|
||||
/// </summary>
|
||||
public string Title { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 新闻内容
|
||||
/// </summary>
|
||||
public string Content { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 发布时间
|
||||
/// </summary>
|
||||
public DateTime PublishTime { get; set; } = DateTime.Now;
|
||||
|
||||
/// <summary>
|
||||
/// 新闻来源
|
||||
/// </summary>
|
||||
public string Source { get; set; } = string.Empty;
|
||||
|
||||
public StockNewsAggregateRoot() { }
|
||||
|
||||
public StockNewsAggregateRoot(
|
||||
string title,
|
||||
string content,
|
||||
string source = "")
|
||||
{
|
||||
Title = title;
|
||||
Content = content;
|
||||
Source = source;
|
||||
PublishTime = DateTime.Now;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
using SqlSugar;
|
||||
using Volo.Abp.Domain.Entities;
|
||||
using Volo.Abp.Auditing;
|
||||
using Yi.Framework.Stock.Domain.Shared;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 股票价格记录实体
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于记录每支股票在不同时间点的价格数据,支持趋势分析和图表展示
|
||||
/// </remarks>
|
||||
[SugarTable("Stock_PriceRecord")]
|
||||
public class StockPriceRecordEntity : Entity<Guid>, IHasCreationTime
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 股票ID
|
||||
/// </summary>
|
||||
/// <remarks>关联到具体的股票</remarks>
|
||||
public Guid StockId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 记录时间
|
||||
/// </summary>
|
||||
/// <remarks>价格记录的时间点</remarks>
|
||||
public DateTime CreationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前价
|
||||
/// </summary>
|
||||
public decimal CurrentPrice { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易量
|
||||
/// </summary>
|
||||
/// <remarks>该时间段内的交易股数</remarks>
|
||||
public long Volume { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易额
|
||||
/// </summary>
|
||||
/// <remarks>该时间段内的交易金额</remarks>
|
||||
public decimal Turnover { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 时间周期类型
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 记录的时间周期类型:分钟、小时、日、周、月等
|
||||
/// </remarks>
|
||||
public PeriodTypeEnum PeriodType { get; set; }
|
||||
|
||||
public StockPriceRecordEntity() { }
|
||||
|
||||
public StockPriceRecordEntity(
|
||||
Guid stockId,
|
||||
decimal currentPrice,
|
||||
long volume = 0,
|
||||
decimal turnover = 0,
|
||||
PeriodTypeEnum periodType = PeriodTypeEnum.Day)
|
||||
{
|
||||
StockId = stockId;
|
||||
CreationTime = DateTime.Now;
|
||||
CurrentPrice = currentPrice;
|
||||
Volume = volume;
|
||||
Turnover = turnover;
|
||||
PeriodType = periodType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
using SqlSugar;
|
||||
using Volo.Abp.Domain.Entities;
|
||||
using Volo.Abp.Auditing;
|
||||
using Yi.Framework.Stock.Domain.Shared;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// 股票交易记录实体
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于记录用户买入或卖出股票的交易历史
|
||||
/// </remarks>
|
||||
[SugarTable("Stock_Transaction")]
|
||||
public class StockTransactionEntity : Entity<Guid>, IAuditedObject
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户ID
|
||||
/// </summary>
|
||||
/// <remarks>进行交易的用户</remarks>
|
||||
public Guid UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 股票ID
|
||||
/// </summary>
|
||||
/// <remarks>交易的股票</remarks>
|
||||
public Guid StockId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 股票代码
|
||||
/// </summary>
|
||||
/// <remarks>冗余字段,方便查询</remarks>
|
||||
public string StockCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 股票名称
|
||||
/// </summary>
|
||||
/// <remarks>冗余字段,方便查询</remarks>
|
||||
public string StockName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 交易类型
|
||||
/// </summary>
|
||||
public TransactionTypeEnum TransactionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易价格
|
||||
/// </summary>
|
||||
/// <remarks>股票的单价</remarks>
|
||||
public decimal Price { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易数量
|
||||
/// </summary>
|
||||
/// <remarks>买入或卖出的股票数量</remarks>
|
||||
public int Quantity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易总额
|
||||
/// </summary>
|
||||
/// <remarks>价格 × 数量</remarks>
|
||||
public decimal TotalAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易费用
|
||||
/// </summary>
|
||||
/// <remarks>手续费、佣金等</remarks>
|
||||
public decimal Fee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
/// <remarks>交易发生时间</remarks>
|
||||
public DateTime CreationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建者ID
|
||||
/// </summary>
|
||||
public Guid? CreatorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改时间
|
||||
/// </summary>
|
||||
public DateTime? LastModificationTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最后修改者ID
|
||||
/// </summary>
|
||||
public Guid? LastModifierId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; } = string.Empty;
|
||||
|
||||
public StockTransactionEntity() { }
|
||||
|
||||
public StockTransactionEntity(
|
||||
Guid userId,
|
||||
Guid stockId,
|
||||
string stockCode,
|
||||
string stockName,
|
||||
TransactionTypeEnum transactionType,
|
||||
decimal price,
|
||||
int quantity,
|
||||
decimal fee = 0)
|
||||
{
|
||||
Id = Guid.NewGuid();
|
||||
UserId = userId;
|
||||
StockId = stockId;
|
||||
StockCode = stockCode;
|
||||
StockName = stockName;
|
||||
TransactionType = transactionType;
|
||||
Price = price;
|
||||
Quantity = quantity;
|
||||
TotalAmount = price * quantity;
|
||||
Fee = fee;
|
||||
CreationTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="..\..\..\common.props" />
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(AbpVersion)" />
|
||||
<PackageReference Include="Volo.Abp.Caching" Version="$(AbpVersion)" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
|
||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore.Abstractions\Yi.Framework.SqlSugarCore.Abstractions.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="EventHandlers\" />
|
||||
<Folder Include="Managers\" />
|
||||
<Folder Include="Repositories\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,19 @@
|
||||
using Volo.Abp.Caching;
|
||||
using Volo.Abp.Domain;
|
||||
using Yi.Framework.Stock.Domain.Shared;
|
||||
using Yi.Framework.Mapster;
|
||||
|
||||
namespace Yi.Framework.Stock.Domain
|
||||
{
|
||||
[DependsOn(
|
||||
typeof(YiFrameworkStockDomainSharedModule),
|
||||
|
||||
typeof(YiFrameworkMapsterModule),
|
||||
typeof(AbpDddDomainModule),
|
||||
typeof(AbpCachingModule)
|
||||
)]
|
||||
public class YiFrameworkStockDomainModule : AbpModule
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user