feat: 精简模板代码

This commit is contained in:
ccnetcore
2026-01-10 17:11:37 +08:00
parent 05b81b710f
commit 699fc54885
402 changed files with 75 additions and 16599 deletions

View File

@@ -1,66 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding
{
/// <summary>
/// 用户股票持仓DTO
/// </summary>
public class StockHoldingDto : EntityDto<Guid>
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 持有数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 持仓成本
/// </summary>
public decimal CostPrice { get; set; }
/// <summary>
/// 当前价格
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// 持仓市值
/// </summary>
public decimal MarketValue { get; set; }
/// <summary>
/// 盈亏金额
/// </summary>
public decimal ProfitLoss { get; set; }
/// <summary>
/// 盈亏百分比
/// </summary>
public decimal ProfitLossPercentage { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding
{
/// <summary>
/// 获取用户持仓列表的输入DTO
/// </summary>
public class StockHoldingGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票代码
/// </summary>
public string? StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string? StockName { get; set; }
}
}

View File

@@ -1,20 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 买入股票输入DTO
/// </summary>
public class BuyStockInputDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 买入数量
/// </summary>
public int Quantity { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
/// <summary>
/// 创建股市输入DTO
/// </summary>
public class CreateStockMarketInputDto
{
/// <summary>
/// 股市代码
/// </summary>
public string MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string MarketName { get; set; }
/// <summary>
/// 股市描述
/// </summary>
public string Description { get; set; }
}

View File

@@ -1,20 +0,0 @@
using System;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 卖出股票输入DTO
/// </summary>
public class SellStockInputDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 卖出数量
/// </summary>
public int Quantity { get; set; }
}
}

View File

@@ -1,36 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 股市信息DTO
/// </summary>
public class StockMarketDto : EntityDto<Guid>
{
/// <summary>
/// 股市代码
/// </summary>
public string MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string MarketName { get; set; }
/// <summary>
/// 股市描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 状态
/// </summary>
public bool State { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,26 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket
{
/// <summary>
/// 获取股市列表的输入DTO
/// </summary>
public class StockMarketGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股市代码
/// </summary>
public string? MarketCode { get; set; }
/// <summary>
/// 股市名称
/// </summary>
public string? MarketName { get; set; }
/// <summary>
/// 状态
/// </summary>
public bool? State { get; set; }
}
}

View File

@@ -1,41 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockNews
{
/// <summary>
/// 股市新闻DTO
/// </summary>
public class StockNewsDto : EntityDto<Guid>
{
/// <summary>
/// 新闻标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 新闻内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 发布时间
/// </summary>
public DateTime PublishTime { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string Source { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 排序号
/// </summary>
public int OrderNum { get; set; }
}
}

View File

@@ -1,37 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockNews
{
/// <summary>
/// 获取股市新闻列表的输入DTO
/// </summary>
public class StockNewsGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 新闻标题关键词
/// </summary>
public string? Title { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string? Source { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 是否只显示最近10天的新闻
/// </summary>
/// <remarks>默认为true查询最近10天的新闻</remarks>
public bool IsRecent { get; set; } = true;
}
}

View File

@@ -1,47 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice
{
/// <summary>
/// 股市价格记录DTO
/// </summary>
public class StockPriceRecordDto : EntityDto<Guid>
{
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// 当前价
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// 交易量
/// </summary>
public long Volume { get; set; }
/// <summary>
/// 交易额
/// </summary>
public decimal Turnover { get; set; }
/// <summary>
/// 时间周期类型
/// </summary>
public PeriodTypeEnum PeriodType { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime RecordTime { get; set; }
}
}

View File

@@ -1,32 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice
{
/// <summary>
/// 获取股市价格记录的输入DTO
/// </summary>
public class StockPriceRecordGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票ID
/// </summary>
public Guid? StockId { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 时间周期类型
/// </summary>
public PeriodTypeEnum? PeriodType { get; set; }
}
}

View File

@@ -1,62 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction
{
/// <summary>
/// 股票交易记录DTO
/// </summary>
public class StockTransactionDto : EntityDto<Guid>
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum TransactionType { get; set; }
/// <summary>
/// 交易价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 交易数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 交易总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 交易费用
/// </summary>
public decimal Fee { get; set; }
/// <summary>
/// 交易时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,37 +0,0 @@
using System;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction
{
/// <summary>
/// 获取交易记录的输入DTO
/// </summary>
public class StockTransactionGetListInputDto : PagedAndSortedResultRequestDto
{
/// <summary>
/// 股票代码
/// </summary>
public string? StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string? StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum? TransactionType { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
}
}

View File

@@ -1,29 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 用户持仓服务接口
/// </summary>
public interface IStockHoldingService : IApplicationService
{
/// <summary>
/// 获取当前用户的持仓列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>持仓列表</returns>
Task<PagedResultDto<StockHoldingDto>> GetUserHoldingsAsync(StockHoldingGetListInputDto input);
/// <summary>
/// 获取当前用户的交易记录
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>交易记录列表</returns>
Task<PagedResultDto<StockTransactionDto>> GetUserTransactionsAsync(StockTransactionGetListInputDto input);
}
}

View File

@@ -1,49 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 股市服务接口
/// </summary>
public interface IStockMarketService : IApplicationService
{
/// <summary>
/// 获取股市列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>股市列表</returns>
Task<PagedResultDto<StockMarketDto>> GetStockMarketListAsync(StockMarketGetListInputDto input);
/// <summary>
/// 获取股市价格记录看板
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>股价记录列表</returns>
Task<PagedResultDto<StockPriceRecordDto>> GetStockPriceRecordListAsync(StockPriceRecordGetListInputDto input);
/// <summary>
/// 买入股票
/// </summary>
/// <param name="input">买入股票参数</param>
/// <returns>操作结果</returns>
Task BuyStockAsync(BuyStockInputDto input);
/// <summary>
/// 卖出股票
/// </summary>
/// <param name="input">卖出股票参数</param>
/// <returns>操作结果</returns>
Task SellStockAsync(SellStockInputDto input);
/// <summary>
/// 生成最新股票记录
/// </summary>
/// <returns>操作结果</returns>
Task GenerateStocksAsync();
}
}

View File

@@ -1,20 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockNews;
namespace Yi.Framework.Stock.Application.Contracts.IServices
{
/// <summary>
/// 股市新闻服务接口
/// </summary>
public interface IStockNewsService : IApplicationService
{
/// <summary>
/// 获取股市新闻列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>新闻列表</returns>
Task<PagedResultDto<StockNewsDto>> GetStockNewsListAsync(StockNewsGetListInputDto input);
}
}

View File

@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Ddd.Application.Contracts\Yi.Framework.Ddd.Application.Contracts.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain.Shared\Yi.Framework.Stock.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Application.Contracts" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<Folder Include="IServices\" />
</ItemGroup>
</Project>

View File

@@ -1,17 +0,0 @@
using Volo.Abp.SettingManagement;
using Yi.Framework.Stock.Domain.Shared;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Stock.Application.Contracts
{
[DependsOn(
typeof(YiFrameworkStockDomainSharedModule),
typeof(AbpSettingManagementApplicationContractsModule),
typeof(YiFrameworkDddApplicationContractsModule))]
public class YiFrameworkStockApplicationContractsModule:AbpModule
{
}
}

View File

@@ -1,107 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockHolding;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockTransaction;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Volo.Abp.Users;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 用户持仓服务实现
/// </summary>
[Authorize]
public class StockHoldingService : ApplicationService, IStockHoldingService
{
private readonly ISqlSugarRepository<StockHoldingAggregateRoot> _stockHoldingRepository;
private readonly ISqlSugarRepository<StockTransactionEntity> _stockTransactionRepository;
public StockHoldingService(
ISqlSugarRepository<StockHoldingAggregateRoot> stockHoldingRepository,
ISqlSugarRepository<StockTransactionEntity> stockTransactionRepository)
{
_stockHoldingRepository = stockHoldingRepository;
_stockTransactionRepository = stockTransactionRepository;
}
/// <summary>
/// 获取当前用户的持仓列表
/// </summary>
[Authorize]
[HttpGet("stock/user-holdings")]
public async Task<PagedResultDto<StockHoldingDto>> GetUserHoldingsAsync(StockHoldingGetListInputDto input)
{
Guid userId = CurrentUser.GetId();
RefAsync<int> total = 0;
var query = _stockHoldingRepository._DbQueryable
.Where(h => h.UserId == userId)
.WhereIF(!string.IsNullOrEmpty(input.StockCode), h => h.StockCode.Contains(input.StockCode))
.WhereIF(!string.IsNullOrEmpty(input.StockName), h => h.StockName.Contains(input.StockName))
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),t=>t.CreationTime,OrderByType.Desc);
var list = await query
.Select(h => new StockHoldingDto
{
Id = h.Id,
UserId = h.UserId,
StockId = h.StockId,
StockCode = h.StockCode,
StockName = h.StockName,
Quantity = h.Quantity,
CreationTime = h.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockHoldingDto>(total, list);
}
/// <summary>
/// 获取当前用户的交易记录
/// </summary>
[Authorize]
[HttpGet("stock/user-transactions")]
public async Task<PagedResultDto<StockTransactionDto>> GetUserTransactionsAsync(StockTransactionGetListInputDto input)
{
Guid userId = CurrentUser.GetId();
RefAsync<int> total = 0;
var query = _stockTransactionRepository._DbQueryable
.Where(t => t.UserId == userId)
.WhereIF(!string.IsNullOrEmpty(input.StockCode), t => t.StockCode.Contains(input.StockCode))
.WhereIF(!string.IsNullOrEmpty(input.StockName), t => t.StockName.Contains(input.StockName))
.WhereIF(input.TransactionType.HasValue, t => t.TransactionType == input.TransactionType.Value)
.WhereIF(input.StartTime.HasValue, t => t.CreationTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, t => t.CreationTime <= input.EndTime.Value)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),t=>t.CreationTime,OrderByType.Desc);
var list = await query
.Select(t => new StockTransactionDto
{
Id = t.Id,
UserId = t.UserId,
StockId = t.StockId,
StockCode = t.StockCode,
StockName = t.StockName,
TransactionType = t.TransactionType,
Price = t.Price,
Quantity = t.Quantity,
TotalAmount = t.TotalAmount,
Fee = t.Fee,
CreationTime = t.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockTransactionDto>(total, list);
}
}
}

View File

@@ -1,167 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Users;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockMarket;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockPrice;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers;
using Mapster;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 股市服务实现
/// </summary>
public class StockMarketService : ApplicationService, IStockMarketService
{
private readonly ISqlSugarRepository<StockMarketAggregateRoot> _stockMarketRepository;
private readonly ISqlSugarRepository<StockPriceRecordEntity> _stockPriceRecordRepository;
private readonly StockMarketManager _stockMarketManager;
public StockMarketService(
ISqlSugarRepository<StockMarketAggregateRoot> stockMarketRepository,
ISqlSugarRepository<StockPriceRecordEntity> stockPriceRecordRepository,
StockMarketManager stockMarketManager)
{
_stockMarketRepository = stockMarketRepository;
_stockPriceRecordRepository = stockPriceRecordRepository;
_stockMarketManager = stockMarketManager;
}
/// <summary>
/// 创建股市
/// </summary>
[HttpPost("stock/markets")]
[Authorize]
public async Task<StockMarketDto> CreateStockMarketAsync(CreateStockMarketInputDto input)
{
// 使用映射将输入DTO转换为实体
var stockMarket = input.Adapt<StockMarketAggregateRoot>();
// 保存到数据库
var result = await _stockMarketRepository.InsertReturnEntityAsync(stockMarket);
// 使用映射将实体转换为返回DTO
return result.Adapt<StockMarketDto>();
}
/// <summary>
/// 获取股市列表
/// </summary>
[HttpGet("stock/markets")]
public async Task<PagedResultDto<StockMarketDto>> GetStockMarketListAsync(StockMarketGetListInputDto input)
{
RefAsync<int> total = 0;
var query = _stockMarketRepository._DbQueryable
.WhereIF(!string.IsNullOrEmpty(input.MarketCode), m => m.MarketCode.Contains(input.MarketCode))
.WhereIF(!string.IsNullOrEmpty(input.MarketName), m => m.MarketName.Contains(input.MarketName))
.WhereIF(input.State.HasValue, m => m.State == input.State.Value)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),m=>m.OrderNum,OrderByType.Asc)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),m=>m.CreationTime,OrderByType.Desc);
var list = await query
.Select(m => new StockMarketDto
{
Id = m.Id,
MarketCode = m.MarketCode,
MarketName = m.MarketName,
Description = m.Description,
State = m.State,
CreationTime = m.CreationTime
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockMarketDto>(total, list);
}
/// <summary>
/// 获取股市价格记录看板
/// </summary>
[HttpGet("stock/price-records")]
public async Task<PagedResultDto<StockPriceRecordDto>> GetStockPriceRecordListAsync(StockPriceRecordGetListInputDto input)
{
RefAsync<int> total = 0;
var query = _stockPriceRecordRepository._DbQueryable
.WhereIF(input.StockId.HasValue, p => p.StockId == input.StockId.Value)
.WhereIF(input.StartTime.HasValue, p => p.RecordTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, p => p.RecordTime <= input.EndTime.Value)
.WhereIF(input.PeriodType.HasValue, p => p.PeriodType == input.PeriodType.Value)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),p=>p.RecordTime);
var list = await query
.Select(p => new StockPriceRecordDto
{
Id = p.Id,
StockId = p.StockId,
CreationTime = p.CreationTime,
RecordTime = p.RecordTime,
CurrentPrice = p.CurrentPrice,
Volume = p.Volume,
Turnover = p.Turnover,
PeriodType = p.PeriodType
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockPriceRecordDto>(total, list);
}
/// <summary>
/// 买入股票
/// </summary>
[HttpPost("stock/buy")]
[Authorize]
public async Task BuyStockAsync(BuyStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票购买
await _stockMarketManager.BuyStockAsync(
userId,
input.StockId,
input.Quantity
);
}
/// <summary>
/// 卖出股票
/// </summary>
[HttpDelete("stock/sell")]
[Authorize]
public async Task SellStockAsync(SellStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票卖出
await _stockMarketManager.SellStockAsync(
userId,
input.StockId,
input.Quantity
);
}
/// <summary>
/// 生成最新股票记录
/// </summary>
[HttpPost("stock/generate")]
[Authorize]
public async Task GenerateStocksAsync()
{
await _stockMarketManager.GenerateStocksAsync();
}
}
}

View File

@@ -1,80 +0,0 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Yi.Framework.Stock.Application.Contracts.Dtos.StockNews;
using Yi.Framework.Stock.Application.Contracts.IServices;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers;
namespace Yi.Framework.Stock.Application.Services
{
/// <summary>
/// 股市新闻服务实现
/// </summary>
public class StockNewsService : ApplicationService, IStockNewsService
{
private readonly ISqlSugarRepository<StockNewsAggregateRoot> _stockNewsRepository;
private readonly NewsManager _newsManager;
public StockNewsService(
ISqlSugarRepository<StockNewsAggregateRoot> stockNewsRepository,
NewsManager newsManager)
{
_stockNewsRepository = stockNewsRepository;
_newsManager = newsManager;
}
/// <summary>
/// 获取股市新闻列表
/// </summary>
[HttpGet("/api/app/stock/news")]
public async Task<PagedResultDto<StockNewsDto>> GetStockNewsListAsync(StockNewsGetListInputDto input)
{
RefAsync<int> total = 0;
// 计算10天前的日期
DateTime tenDaysAgo = DateTime.Now.AddDays(-10);
var query = _stockNewsRepository._DbQueryable
.WhereIF(!string.IsNullOrEmpty(input.Title), n => n.Title.Contains(input.Title))
.WhereIF(!string.IsNullOrEmpty(input.Source), n => n.Source.Contains(input.Source))
.WhereIF(input.StartTime.HasValue, n => n.PublishTime >= input.StartTime.Value)
.WhereIF(input.EndTime.HasValue, n => n.PublishTime <= input.EndTime.Value)
// 如果IsRecent为true则只查询最近10天的新闻
.WhereIF(input.IsRecent, n => n.PublishTime >= tenDaysAgo)
.OrderByIF(!string.IsNullOrEmpty(input.Sorting),input.Sorting)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),n=>n.OrderNum,OrderByType.Asc)
.OrderByIF(string.IsNullOrEmpty(input.Sorting),n=>n.PublishTime,OrderByType.Desc) ;
var list = await query
.Select(n => new StockNewsDto
{
Id = n.Id,
Title = n.Title,
Content = n.Content,
PublishTime = n.PublishTime,
Source = n.Source,
CreationTime = n.CreationTime,
OrderNum = n.OrderNum
})
.ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResultDto<StockNewsDto>(total, list);
}
/// <summary>
/// 生成股市新闻
/// </summary>
/// <returns>生成结果</returns>
[HttpPost("/api/app/stock/news/generate")]
public async Task GenerateNewsAsync()
{
await _newsManager.GenerateNewsAsync();
}
}
}

View File

@@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Ddd.Application\Yi.Framework.Ddd.Application.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Application.Contracts\Yi.Framework.Stock.Application.Contracts.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,17 +0,0 @@
using Yi.Framework.Stock.Application.Contracts;
using Yi.Framework.Stock.Domain;
using Yi.Framework.Ddd.Application;
namespace Yi.Framework.Stock.Application
{
[DependsOn(
typeof(YiFrameworkStockApplicationContractsModule),
typeof(YiFrameworkStockDomainModule),
typeof(YiFrameworkDddApplicationModule)
)]
public class YiFrameworkStockApplicationModule : AbpModule
{
}
}

View File

@@ -1,41 +0,0 @@
namespace Yi.Framework.Stock.Domain.Shared
{
/// <summary>
/// 时间周期类型枚举
/// </summary>
/// <remarks>
/// 用于定义股票价格记录的时间周期类型
/// </remarks>
public enum PeriodTypeEnum
{
/// <summary>
/// 分钟
/// </summary>
Minute = 0,
/// <summary>
/// 小时
/// </summary>
Hour = 1,
/// <summary>
/// 天
/// </summary>
Day = 2,
/// <summary>
/// 周
/// </summary>
Week = 3,
/// <summary>
/// 月
/// </summary>
Month = 4,
/// <summary>
/// 年
/// </summary>
Year = 5
}
}

View File

@@ -1,18 +0,0 @@
namespace Yi.Framework.Stock.Domain.Shared
{
/// <summary>
/// 交易类型枚举
/// </summary>
public enum TransactionTypeEnum
{
/// <summary>
/// 买入
/// </summary>
Buy = 0,
/// <summary>
/// 卖出
/// </summary>
Sell = 1
}
}

View File

@@ -1,56 +0,0 @@
using System;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain.Shared.Etos
{
/// <summary>
/// 股票交易事件数据传输对象
/// </summary>
public class StockTransactionEto
{
/// <summary>
/// 用户ID
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 股票ID
/// </summary>
public Guid StockId { get; set; }
/// <summary>
/// 股票代码
/// </summary>
public string StockCode { get; set; }
/// <summary>
/// 股票名称
/// </summary>
public string StockName { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public TransactionTypeEnum TransactionType { get; set; }
/// <summary>
/// 交易价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 交易数量
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// 交易总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 交易费用
/// </summary>
public decimal Fee { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Domain.Shared" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Domain.Shared" Version="$(AbpVersion)" />
</ItemGroup>
<ItemGroup>
<Folder Include="Consts\" />
<Folder Include="Dtos\" />
<Folder Include="Enums\" />
<Folder Include="Etos\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\bbs\Yi.Framework.Bbs.Domain.Shared\Yi.Framework.Bbs.Domain.Shared.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,14 +0,0 @@
using Volo.Abp.Domain;
using Volo.Abp.SettingManagement;
namespace Yi.Framework.Stock.Domain.Shared
{
[DependsOn(
typeof(AbpSettingManagementDomainSharedModule),
typeof(AbpDddDomainSharedModule))]
public class YiFrameworkStockDomainSharedModule : AbpModule
{
}
}

View File

@@ -1,141 +0,0 @@
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;
}
}
}
}

View File

@@ -1,79 +0,0 @@
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; }
/// <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>
public string MarketCode { get; set; } = string.Empty;
/// <summary>
/// 股市名称
/// </summary>
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;
}
}
}

View File

@@ -1,87 +0,0 @@
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; }
/// <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>
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
public string Content { get; set; } = string.Empty;
/// <summary>
/// 发布时间
/// </summary>
public DateTime PublishTime { get; set; }
/// <summary>
/// 新闻来源
/// </summary>
public string Source { get; set; } = string.Empty;
/// <summary>
/// 新闻摘要
/// </summary>
public string Summary { get; set; } = string.Empty;
public StockNewsAggregateRoot() { }
public StockNewsAggregateRoot(
string title,
string content,
string source = "")
{
Title = title;
Content = content;
Source = source;
PublishTime = DateTime.Now;
}
}
}

View File

@@ -1,78 +0,0 @@
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>
public DateTime CreationTime { get; set; }
/// <summary>
/// 记录时间
/// </summary>
/// <remarks>价格记录的实际时间点</remarks>
public DateTime RecordTime { 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;
RecordTime = DateTime.Now;
CurrentPrice = currentPrice;
Volume = volume;
Turnover = turnover;
PeriodType = periodType;
}
}
}

View File

@@ -1,121 +0,0 @@
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;
}
}
}

View File

@@ -1,42 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Stock.Domain.EventHandlers
{
/// <summary>
/// 股票交易事件处理器
/// </summary>
public class StockTransactionEventHandler : ILocalEventHandler<StockTransactionEto>, ITransientDependency
{
private readonly ISqlSugarRepository<StockTransactionEntity> _transactionRepository;
public StockTransactionEventHandler(
ISqlSugarRepository<StockTransactionEntity> transactionRepository)
{
_transactionRepository = transactionRepository;
}
public async Task HandleEventAsync(StockTransactionEto eventData)
{
// 创建交易记录实体
var transaction = new StockTransactionEntity(
eventData.UserId,
eventData.StockId,
eventData.StockCode,
eventData.StockName,
eventData.TransactionType,
eventData.Price,
eventData.Quantity,
eventData.Fee
);
// 保存交易记录
await _transactionRepository.InsertAsync(transaction);
}
}
}

View File

@@ -1,91 +0,0 @@
using Volo.Abp.Domain.Services;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using System.Text;
using System.IO;
namespace Yi.Framework.Stock.Domain.Managers;
public class NewsManager:DomainService
{
private SemanticKernelClient _skClient;
private ISqlSugarRepository<StockNewsAggregateRoot> _newsRepository;
public NewsManager(SemanticKernelClient skClient,ISqlSugarRepository<StockNewsAggregateRoot> newsRepository)
{
_skClient = skClient;
_newsRepository = newsRepository;
}
/// <summary>
/// 获取最近的新闻
/// </summary>
/// <param name="count">获取数量</param>
/// <returns>最近的新闻列表</returns>
public async Task<List<StockNewsAggregateRoot>> GetRecentNewsAsync(int count = 10)
{
return await _newsRepository._DbQueryable
.OrderByDescending(n => n.CreationTime)
.Take(count)
.Select(n => new StockNewsAggregateRoot
{
Title = n.Title,
Summary = n.Summary,
Source = n.Source,
CreationTime = n.CreationTime
})
.ToListAsync();
}
/// <summary>
/// 生成一个新闻
/// </summary>
/// <returns></returns>
public async Task GenerateNewsAsync()
{
// 获取最近10条新闻
var recentNews = await GetRecentNewsAsync(10);
// 构建新闻背景上下文
var newsContext = new StringBuilder();
if (recentNews.Any())
{
newsContext.AppendLine("以下是最近的新闻简介:");
foreach (var news in recentNews)
{
newsContext.AppendLine($"- {news.CreationTime:yyyy-MM-dd} 来源:{news.Source}");
newsContext.AppendLine($" 标题:{news.Title}");
newsContext.AppendLine($" 简介:{news.Summary}");
newsContext.AppendLine();
}
}
else
{
newsContext.AppendLine("目前没有最近的新闻记录。");
}
var promptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "stock", "newsPrompt.txt");
var question = await File.ReadAllTextAsync(promptPath);
question = question.Replace("{{newsContext}}", newsContext.ToString());
await _skClient.ChatCompletionAsync(question, ("NewsPlugins","save_news"));
}
public async Task SaveNewsAsync(NewsModel news)
{
var newsEntity = new StockNewsAggregateRoot(
title: news.Title,
content: news.Content,
source: news.Source
)
{
Summary = news.Summary,
CreationTime = DateTime.Now,
IsDeleted = false,
OrderNum = 0
};
await _newsRepository.InsertAsync(newsEntity);
}
}

View File

@@ -1,42 +0,0 @@
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
public class NewsPlugins
{
private readonly IServiceProvider _serviceProvider;
public NewsPlugins(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
[KernelFunction("save_news"), Description("生成并保存一个新闻")]
public async Task SaveAsync(NewsModel news)
{
var newsManager = _serviceProvider.GetRequiredService<NewsManager>();
await newsManager.SaveNewsAsync(news);
}
}
public class NewsModel
{
[JsonPropertyName("title")]
[DisplayName("新闻标题")]
public string Title { get; set; }
[JsonPropertyName("content")]
[DisplayName("新闻内容")]
public string Content { get; set; }
[JsonPropertyName("summary")]
[DisplayName("新闻简介")]
public string Summary { get; set; }
[JsonPropertyName("source")]
[DisplayName("新闻来源")]
public string Source { get; set; }
}

View File

@@ -1,34 +0,0 @@
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
public class StockPlugins
{
private readonly IServiceProvider _serviceProvider;
public StockPlugins(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
[KernelFunction("save_stocks"), Description("生成并且保存多个股票记录")]
public async Task SaveAsync(List<StockModel> stockModels)
{
var stockMarketManager= _serviceProvider.GetRequiredService<StockMarketManager>();
await stockMarketManager.SaveStockAsync(stockModels);
}
}
public class StockModel
{
[JsonPropertyName("id")]
[DisplayName("股票id")]
public Guid Id { get; set; }
[JsonPropertyName("values")]
[DisplayName("股票未来24小时价格")]
public decimal[] Values { get; set; }
}

View File

@@ -1,55 +0,0 @@
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Volo.Abp.DependencyInjection;
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel;
public class SemanticKernelClient:ITransientDependency
{
public Kernel Kernel { get;}
public SemanticKernelClient(Kernel kernel)
{
this.Kernel = kernel;
}
/// <summary>
/// 执行插件
/// </summary>
/// <param name="input"></param>
/// <param name="pluginName"></param>
/// <param name="functionName"></param>
/// <returns></returns>
public async Task<string> InovkerFunctionAsync(string input, string pluginName, string functionName)
{
KernelFunction jsonFun = this.Kernel.Plugins.GetFunction(pluginName, functionName);
var result = await this.Kernel.InvokeAsync(function: jsonFun, new KernelArguments() { ["input"] = input });
return result.GetValue<string>();
}
/// <summary>
/// 聊天对话,调用方法
/// </summary>
/// <returns></returns>
public async Task<IReadOnlyList<ChatMessageContent>> ChatCompletionAsync(string question,params (string,string)[] functions)
{
if (functions is null)
{
throw new Exception("请选择插件");
}
var openSettings = new OpenAIPromptExecutionSettings()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(functions.Select(x=>this.Kernel.Plugins.GetFunction(x.Item1, x.Item2)).ToList(),true),
// ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
MaxTokens =1000
};
var chatCompletionService = this.Kernel.GetRequiredService<IChatCompletionService>();
var results =await chatCompletionService.GetChatMessageContentsAsync(
question,
executionSettings: openSettings,
kernel: Kernel);
return results;
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Stock.Domain.Managers.SemanticKernel
{
public class SemanticKernelOptions
{
public List<string> ModelIds { get; set; }
public string Endpoint { get; set; }
public string ApiKey { get; set; }
}
}

View File

@@ -1,446 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Local;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.Stock.Domain.Entities;
using Yi.Framework.Stock.Domain.Shared;
using Yi.Framework.Stock.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using Microsoft.Extensions.Hosting;
using System.Text;
using System.IO;
namespace Yi.Framework.Stock.Domain.Managers
{
/// <summary>
/// 股市领域服务
/// </summary>
/// <remarks>
/// 处理股票交易相关业务,例如买入、卖出等
/// </remarks>
public class StockMarketManager : DomainService
{
private readonly ISqlSugarRepository<StockHoldingAggregateRoot> _stockHoldingRepository;
private readonly ISqlSugarRepository<StockTransactionEntity> _stockTransactionRepository;
private readonly ISqlSugarRepository<StockPriceRecordEntity> _stockPriceRecordRepository;
private readonly ISqlSugarRepository<StockMarketAggregateRoot> _stockMarketRepository;
private readonly ILocalEventBus _localEventBus;
private readonly SemanticKernelClient _skClient;
private readonly IHostEnvironment _hostEnvironment;
private readonly NewsManager _newsManager;
public StockMarketManager(
ISqlSugarRepository<StockHoldingAggregateRoot> stockHoldingRepository,
ISqlSugarRepository<StockTransactionEntity> stockTransactionRepository,
ISqlSugarRepository<StockPriceRecordEntity> stockPriceRecordRepository,
ISqlSugarRepository<StockMarketAggregateRoot> stockMarketRepository,
ILocalEventBus localEventBus,
SemanticKernelClient skClient,
IHostEnvironment hostEnvironment,
NewsManager newsManager)
{
_stockHoldingRepository = stockHoldingRepository;
_stockTransactionRepository = stockTransactionRepository;
_stockPriceRecordRepository = stockPriceRecordRepository;
_stockMarketRepository = stockMarketRepository;
_localEventBus = localEventBus;
_skClient = skClient;
_hostEnvironment = hostEnvironment;
_newsManager = newsManager;
}
/// <summary>
/// 购买股票
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="stockId">股票ID</param>
/// <param name="quantity">购买数量</param>
/// <returns></returns>
public async Task BuyStockAsync(Guid userId, Guid stockId, int quantity)
{
if (quantity <= 0)
{
throw new UserFriendlyException("购买数量必须大于0");
}
// 通过stockId查询获取股票信息
var stockInfo = await _stockMarketRepository.GetFirstAsync(s => s.Id == stockId);
if (stockInfo == null)
{
throw new UserFriendlyException("找不到指定的股票");
}
string stockCode = stockInfo.MarketCode; // 根据实际字段调整
string stockName = stockInfo.MarketName; // 根据实际字段调整
// 获取当前股票价格
decimal currentPrice = await GetCurrentStockPriceAsync(stockId);
// 计算总金额和手续费
decimal totalAmount = currentPrice * quantity;
decimal fee = CalculateTradingFee(totalAmount, TransactionTypeEnum.Buy);
decimal totalCost = totalAmount + fee;
// 扣减用户资金
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = userId, Number = -totalCost }, false);
// 更新或创建用户持仓
var holding = await _stockHoldingRepository.GetFirstAsync(h =>
h.UserId == userId &&
h.StockId == stockId &&
!h.IsDeleted);
if (holding == null)
{
// 创建新持仓
holding = new StockHoldingAggregateRoot(
userId,
stockId,
stockCode,
stockName,
quantity,
currentPrice);
await _stockHoldingRepository.InsertAsync(holding);
}
else
{
// 更新现有持仓
holding.AddQuantity(quantity, currentPrice);
await _stockHoldingRepository.UpdateAsync(holding);
}
// 发布交易事件
await _localEventBus.PublishAsync(new StockTransactionEto
{
UserId = userId,
StockId = stockId,
StockCode = stockCode,
StockName = stockName,
TransactionType = TransactionTypeEnum.Buy,
Price = currentPrice,
Quantity = quantity,
TotalAmount = totalAmount,
Fee = fee
}, false);
}
/// <summary>
/// 卖出股票
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="stockId">股票ID</param>
/// <param name="quantity">卖出数量</param>
/// <returns></returns>
public async Task SellStockAsync(Guid userId, Guid stockId, int quantity)
{
// 验证卖出时间
VerifySellTime();
if (quantity <= 0)
{
throw new UserFriendlyException("卖出数量必须大于0");
}
// 获取用户持仓
var holding = await _stockHoldingRepository.GetFirstAsync(h =>
h.UserId == userId &&
h.StockId == stockId &&
!h.IsDeleted);
if (holding == null)
{
throw new UserFriendlyException("您没有持有该股票");
}
if (holding.Quantity < quantity)
{
throw new UserFriendlyException("持仓数量不足");
}
// 获取当前股票价格
decimal currentPrice = await GetCurrentStockPriceAsync(stockId);
// 计算总金额和手续费
decimal totalAmount = currentPrice * quantity;
decimal fee = CalculateTradingFee(totalAmount, TransactionTypeEnum.Sell);
decimal actualIncome = totalAmount - fee;
// 增加用户资金
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = userId, Number = actualIncome }, false);
// 更新用户持仓
holding.ReduceQuantity(quantity);
if (holding.Quantity > 0)
{
await _stockHoldingRepository.UpdateAsync(holding);
}
else
{
await _stockHoldingRepository.DeleteAsync(holding);
}
// 发布交易事件
await _localEventBus.PublishAsync(new StockTransactionEto
{
UserId = userId,
StockId = stockId,
StockCode = holding.StockCode,
StockName = holding.StockName,
TransactionType = TransactionTypeEnum.Sell,
Price = currentPrice,
Quantity = quantity,
TotalAmount = totalAmount,
Fee = fee
}, false);
}
/// <summary>
/// 获取股票当前价格
/// </summary>
/// <param name="stockId">股票ID</param>
/// <returns>当前价格</returns>
public async Task<decimal> GetCurrentStockPriceAsync(Guid stockId)
{
// 获取最新的价格记录
var latestPriceRecord = await _stockPriceRecordRepository._DbQueryable
.Where(p => p.StockId == stockId)
.Where(x=>x.RecordTime<=DateTime.Now)
.OrderByDescending(p => p.RecordTime)
.FirstAsync();
if (latestPriceRecord == null)
{
throw new UserFriendlyException("无法获取股票价格信息");
}
return latestPriceRecord.CurrentPrice;
}
/// <summary>
/// 计算交易手续费
/// </summary>
/// <param name="amount">交易金额</param>
/// <param name="transactionType">交易类型</param>
/// <returns>手续费</returns>
private decimal CalculateTradingFee(decimal amount, TransactionTypeEnum transactionType)
{
// 买入不收手续费卖出收2%
decimal feeRate = transactionType == TransactionTypeEnum.Buy ? 0m : 0.02m;
return amount * feeRate;
}
/// <summary>
/// 验证卖出时间
/// </summary>
/// <exception cref="UserFriendlyException">如果不在允许卖出的时间范围内</exception>
private void VerifySellTime()
{
// 如果是开发环境,跳过验证
if (_hostEnvironment.IsDevelopment())
{
return;
}
DateTime now = DateTime.Now;
// 检查是否为工作日(周一到周五)
if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday)
{
throw new UserFriendlyException("股票只能在工作日(周一至周五)卖出");
}
// 检查是否在下午5点到6点之间
if (now.Hour < 17 || now.Hour >= 18)
{
throw new UserFriendlyException("股票只能在下午5点到6点之间卖出");
}
}
/// <summary>
/// 批量保存多个股票的最新价格记录
/// </summary>
/// <param name="priceRecords">价格记录列表</param>
/// <returns>保存的记录数量</returns>
public async Task BatchSaveStockPriceRecordsAsync(List<StockPriceRecordEntity> priceRecords)
{
if (priceRecords == null || !priceRecords.Any())
{
return;
}
// 验证数据
for (int i = 0; i < priceRecords.Count; i++)
{
var record = priceRecords[i];
if (record.CurrentPrice <= 0)
{
throw new UserFriendlyException($"股票ID {record.StockId} 的价格必须大于0");
}
// 计算交易额(如果未设置)
if (record.Turnover == 0 && record.Volume > 0)
{
record.Turnover = record.CurrentPrice * record.Volume;
}
}
await _stockPriceRecordRepository.InsertManyAsync(priceRecords);
}
public async Task SaveStockAsync(List<StockModel> stockModels)
{
if (stockModels == null || !stockModels.Any())
{
return;
}
// 收集所有股票ID
var stockIds = stockModels.Select(m => m.Id).ToList();
// 一次性查询所有相关股票信息
var stockMarkets = await _stockMarketRepository.GetListAsync(s => stockIds.Contains(s.Id));
// 构建字典以便快速查找
var stockMarketsDict = stockMarkets.ToDictionary(s => s.Id);
// 将StockModel转换为StockPriceRecordEntity
var priceRecords = new List<StockPriceRecordEntity>();
// 获取当前小时的起始时间点
var currentHour = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0);
foreach (var stockModel in stockModels)
{
if (stockModel.Values == null || !stockModel.Values.Any())
{
continue;
}
// 从字典中查找股票信息,而不是每次查询数据库
if (!stockMarketsDict.TryGetValue(stockModel.Id, out var stockMarket))
{
continue;
}
// 为每个价格点创建一个记录,并设置递增的时间
for (int i = 0; i < stockModel.Values.Count(); i++)
{
var priceValue = stockModel.Values[i];
var recordTime = currentHour.AddHours(i); // 从当前小时开始每个价格点加1小时
var priceRecord = new StockPriceRecordEntity
{
StockId = stockMarket.Id,
CurrentPrice = priceValue,
Volume = 0, // 可以根据实际情况设置
Turnover = 0, // 可以根据实际情况设置
PeriodType = PeriodTypeEnum.Hour,
RecordTime = recordTime // 直接在这里设置时间
};
priceRecords.Add(priceRecord);
}
}
// 批量保存价格记录
if (priceRecords.Any())
{
await _stockPriceRecordRepository.InsertManyAsync(priceRecords);
}
}
/// <summary>
/// 获取所有活跃股票的最新价格
/// </summary>
/// <returns>股票ID和最新价格的字典</returns>
private async Task<Dictionary<Guid, decimal>> GetLatestStockPricesAsync()
{
// 获取所有活跃的股票
var activeStocks = await _stockMarketRepository.GetListAsync(s => s.State && !s.IsDeleted);
var result = new Dictionary<Guid, decimal>();
foreach (var stock in activeStocks)
{
try
{
var price = await GetCurrentStockPriceAsync(stock.Id);
result.Add(stock.Id, price);
}
catch
{
// 如果获取价格失败使用默认价格10
result.Add(stock.Id, 10m);
}
}
return result;
}
/// <summary>
/// 生成最新股票记录
/// </summary>
/// <returns></returns>
public async Task GenerateStocksAsync()
{
// 获取所有活跃股票的最新价格
var stockPrices = await GetLatestStockPricesAsync();
if (!stockPrices.Any())
{
return; // 没有股票数据,直接返回
}
// 获取所有活跃股票信息,用于构建提示词
var activeStocks = await _stockMarketRepository.GetListAsync(s =>
s.State && !s.IsDeleted && stockPrices.Keys.Contains(s.Id));
// 获取最近10条新闻
var recentNews = await _newsManager.GetRecentNewsAsync(10);
// 构建新闻上下文
var newsContext = new StringBuilder();
if (recentNews.Any())
{
newsContext.AppendLine("以下是最近的新闻摘要:");
foreach (var news in recentNews)
{
newsContext.AppendLine($"- {news.CreationTime:yyyy-MM-dd}: {news.Title}");
newsContext.AppendLine($" {news.Summary}");
newsContext.AppendLine();
}
}
else
{
newsContext.AppendLine("最近没有重要新闻报道。");
}
// 构建股票信息上下文
var stocksContext = new StringBuilder();
stocksContext.AppendLine("以下是需要预测的股票信息:");
foreach (var stock in activeStocks)
{
if (stockPrices.TryGetValue(stock.Id, out var price))
{
stocksContext.AppendLine($"{stock.MarketName}id:{stock.Id},简介:{stock.Description} 最后一次价格:{price:F2}");
}
}
// 从文件读取问题模板
string promptTemplate = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "stock", "marketPrompt.txt"));
// 替换变量
string question = promptTemplate
.Replace("{{newsContext}}", newsContext.ToString())
.Replace("{{stocksContext}}", stocksContext.ToString());
await _skClient.ChatCompletionAsync(question, ("StockPlugins", "save_stocks"));
}
}
}

View File

@@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel" Version="1.40.0" />
<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="Repositories\" />
</ItemGroup>
</Project>

View File

@@ -1,51 +0,0 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Volo.Abp.Caching;
using Volo.Abp.Domain;
using Yi.Framework.Mapster;
using Yi.Framework.Stock.Domain.Managers;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel;
using Yi.Framework.Stock.Domain.Managers.SemanticKernel.Plugins;
using Yi.Framework.Stock.Domain.Shared;
namespace Yi.Framework.Stock.Domain
{
[DependsOn(
typeof(YiFrameworkStockDomainSharedModule),
typeof(YiFrameworkMapsterModule),
typeof(AbpDddDomainModule),
typeof(AbpCachingModule)
)]
public class YiFrameworkStockDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var services = context.Services;
// 配置绑定
var semanticKernelSection = configuration.GetSection("SemanticKernel");
services.Configure<SemanticKernelOptions>(configuration.GetSection("SemanticKernel"));
services.AddHttpClient();
#pragma warning disable SKEXP0010
// 从配置中获取值
var options = semanticKernelSection.Get<SemanticKernelOptions>();
//股市优先使用第一个ai模型
services.AddKernel()
.AddOpenAIChatCompletion(
modelId: options.ModelIds.FirstOrDefault(),
endpoint: new Uri(options.Endpoint),
apiKey: options.ApiKey);
#pragma warning restore SKEXP0010
// 添加插件
services.AddSingleton<KernelPlugin>(sp => KernelPluginFactory.CreateFromType<NewsPlugins>(serviceProvider: sp));
services.AddSingleton<KernelPlugin>(sp => KernelPluginFactory.CreateFromType<StockPlugins>(serviceProvider: sp));
// 注册NewsManager
services.AddTransient<NewsManager>();
}
}
}

View File

@@ -1,19 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Yi.Framework.Mapster\Yi.Framework.Mapster.csproj" />
<ProjectReference Include="..\..\..\framework\Yi.Framework.SqlSugarCore\Yi.Framework.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\audit-logging\Yi.Framework.AuditLogging.SqlSugarCore\Yi.Framework.AuditLogging.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\rbac\Yi.Framework.Rbac.SqlSugarCore\Yi.Framework.Rbac.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\tenant-management\Yi.Framework.TenantManagement.SqlSugarCore\Yi.Framework.TenantManagement.SqlSugarCore.csproj" />
<ProjectReference Include="..\..\..\module\setting-management\Yi.Framework.SettingManagement.SqlSugarCore\Yi.Framework.SettingManagement.SqlSugarCore.csproj" />
<ProjectReference Include="..\Yi.Framework.Stock.Domain\Yi.Framework.Stock.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="DataSeeds\" />
<Folder Include="Repositories\" />
</ItemGroup>
</Project>

View File

@@ -1,30 +0,0 @@
using Yi.Framework.Stock.Domain;
using Yi.Framework.AuditLogging.SqlSugarCore;
using Yi.Framework.Mapster;
using Yi.Framework.Rbac.SqlSugarCore;
using Yi.Framework.SettingManagement.SqlSugarCore;
using Yi.Framework.SqlSugarCore;
using Yi.Framework.TenantManagement.SqlSugarCore;
namespace Yi.Framework.Stock.SqlsugarCore
{
[DependsOn(
typeof(YiFrameworkStockDomainModule),
typeof(YiFrameworkRbacSqlSugarCoreModule),
typeof(YiFrameworkSettingManagementSqlSugarCoreModule),
typeof(YiFrameworkAuditLoggingSqlSugarCoreModule),
typeof(YiFrameworkTenantManagementSqlSugarCoreModule),
typeof(YiFrameworkMapsterModule),
typeof(YiFrameworkSqlSugarCoreModule)
)]
public class YiFrameworkStockSqlSugarCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//默认不开放可根据项目需要是否Db直接对外开放
//context.Services.AddTransient(x => x.GetRequiredService<ISqlSugarDbContext>().SqlSugarClient);
}
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.AccessLog
{
public class AccessLogDto
{
public long Number { get; set; }
public DateTime? LastModificationTime { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,24 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
/// <summary>
/// 用户排行榜
/// </summary>
public class BaseAnalyseTopUserDto
{
public Guid UserId { get; set; }
public string UserName { get; set; }
public string? Nick { get; set; }
public int Order { get; set; }
public string? Icon { get; set; }
public int Level { get; set; }
/// <summary>
/// 用户等级名称
/// </summary>
public string LevelName { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
}

View File

@@ -1,7 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class MoneyTopUserDto:BaseAnalyseTopUserDto
{
public decimal Money { get; set; }
}

View File

@@ -1,8 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class PointsTopUserDto:BaseAnalyseTopUserDto
{
public int Points { get; set; }
}

View File

@@ -1,20 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class RegisterAnalyseDto
{
public RegisterAnalyseDto(DateTime time, int number)
{
Time = time;
Number = number;
}
/// <summary>
/// 时间
/// </summary>
public DateTime Time { get; set; }
/// <summary>
/// 人数
/// </summary>
public int Number { get; set; }
}

View File

@@ -1,6 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Analyse;
public class ValueTopUserDto:BaseAnalyseTopUserDto
{
public decimal Value { get; set; }
}

View File

@@ -1,24 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Argee
{
public class AgreeDto
{
public AgreeDto(bool isAgree)
{
IsAgree = isAgree;
if (isAgree)
{
Message = "点赞成功,点赞+1";
}
else
{
Message = "取消点赞,点赞-1";
}
}
public bool IsAgree { get; set; }
public string Message { get; set; }
}
}

View File

@@ -1,16 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleAllOutputDto : EntityDto<Guid>
{
//批量查询,不给内容,性能考虑
//public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public List<ArticleAllOutputDto>? Children { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
/// <summary>
/// Article输入创建对象
/// </summary>
public class ArticleCreateInputVo
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetListInputVo : PagedAllResultRequestDto
{
public string? Content { get; set; }
public string? Name { get; set; }
public Guid? DiscussId { get; set; }
public Guid? ParentId { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public Guid DiscussId { get; set; }
public List<ArticleGetListOutputDto>? Children { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,33 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Consts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleGetOutputDto : EntityDto<Guid>
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public DateTime CreationTime { get; set; }
public bool HasPermission { get;internal set; }
/// <summary>
/// 设置权限
/// </summary>
public void SetPassPermission()
{
HasPermission = true;
}
/// <summary>
/// 设置无权限
/// </summary>
public void SetNoPermission()
{
HasPermission = false;
Content=DiscussConst.Privacy;
}
}
}

View File

@@ -1,24 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleImprotDto
{
/// <summary>
/// 主题id
/// </summary>
[Required]
public Guid DiscussId { get; set; }
public Guid ArticleParentId { get; set; }= Guid.Empty;
public ArticleImportTypeEnum ImportType { get; set; } = ArticleImportTypeEnum.Default;
}
}

View File

@@ -1,10 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Article
{
public class ArticleUpdateInputVo
{
public string Content { get; set; }
public string Name { get; set; }
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
}
}

View File

@@ -1,44 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentDefineGetListOutputDto : EntityDto<Guid>
{
/// <summary>
/// 任务名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public AssignmentTypeEnum AssignmentType { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 总共步骤数
/// </summary>
public int TotalStepNumber { get; set; }
/// <summary>
/// 前置任务id
/// </summary>
public Guid? PreAssignmentId { get; set; }
/// <summary>
/// 任务奖励的钱钱数量
/// </summary>
public decimal RewardsMoneyNumber { get; set; }
public int OrderNum { get; set; }
}

View File

@@ -1,24 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentGetListInput
{
/// <summary>
/// 任务查询条件
/// </summary>
public AssignmentQueryStateEnum AssignmentQueryState { get; set; } = AssignmentQueryStateEnum.Progress;
}
public enum AssignmentQueryStateEnum
{
/// <summary>
/// 正在进行
/// </summary>
Progress,
/// <summary>
/// 已结束
/// </summary>
End
}

View File

@@ -1,54 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentGetListOutputDto:EntityDto<Guid>
{
/// <summary>
/// 任务名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 当前步骤数
/// </summary>
public int CurrentStepNumber { get; set; }
/// <summary>
/// 总共步骤数
/// </summary>
public int TotalStepNumber { get; set; }
/// <summary>
/// 任务类型
/// </summary>
public AssignmentTypeEnum AssignmentType { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 任务状态
/// </summary>
public AssignmentStateEnum AssignmentState { get; set; }
/// <summary>
/// 任务奖励的钱钱数量
/// </summary>
public decimal RewardsMoneyNumber { get; set; }
/// <summary>
/// 任务过期时间
/// </summary>
public DateTime? ExpireTime { get; set; }
public DateTime? CompleteTime { get; set; }
public DateTime CreationTime { get; set; }
public int OrderNum { get; set; }
}

View File

@@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Bank
{
public class BankCardDto:EntityDto<Guid>
{
/// <summary>
/// 满期限时间,可空
/// </summary>
public DateTime? FulltermTime { get; set; }
public DateTime? LastDepositTime { get; set; }
public DateTime CreationTime { get; set; }
/// <summary>
/// 用户id
/// </summary>
public Guid UserId { get; set; }
/// <summary>
/// 当前存储的钱
/// </summary>
public decimal StorageMoney { get; set; }
/// <summary>
/// 最大可存储的钱钱
/// </summary>
public decimal MaxStorageMoney { get; set; }
/// <summary>
/// 银行卡状态
/// </summary>
public BankCardStateEnum BankCardState { get; set; } = BankCardStateEnum.Unused;
}
}

View File

@@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Bank
{
public class InterestRecordsDto : EntityDto<Guid>
{
public DateTime CreationTime { get; set; }
/// <summary>
/// 当前汇率值
/// </summary>
public decimal Value { get; set; }
/// <summary>
/// 是否波动期
/// </summary>
public bool IsFluctuate { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
/// <summary>
/// Banner输入创建对象
/// </summary>
public class BannerCreateInputVo
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetListInputVo : PagedAndSortedResultRequestDto
{
public string? Name { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,13 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerGetOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Banner
{
public class BannerUpdateInputVo
{
public string? Name { get; set; }
public string? Logo { get; set; }
public string? Color { get; set; }
}
}

View File

@@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserAnalyseGetOutput
{
/// <summary>
/// 注册人数
/// </summary>
public long RegisterNumber { get; set; }
/// <summary>
/// 在线人数
/// </summary>
public long OnlineNumber { get; set; }
/// <summary>
/// 昨天新增用户
/// </summary>
public long YesterdayNewUser { get; set; }
}
}

View File

@@ -1,39 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserGetListOutputDto: UserGetListOutputDto
{
/// <summary>
/// 用户等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
/// <summary>
/// 钱钱
/// </summary>
public decimal Money { get; set; }
/// <summary>
/// 经验
/// </summary>
public long Experience { get; set; }
/// <summary>
/// 用户等级名称
/// </summary>
public string LevelName { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser
{
public class BbsUserGetOutputDto: UserGetOutputDto
{
/// <summary>
/// 用户等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 用户限制
/// </summary>
public UserLimitEnum UserLimit { get; set; }
}
}

View File

@@ -1,29 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// Comment输入创建对象
/// </summary>
public class CommentCreateInputVo
{
/// <summary>
/// 评论id
/// </summary>
public string? Content { get; set; }
/// <summary>
/// 主题id
/// </summary>
public Guid DiscussId { get; set; }
/// <summary>
/// 第一层评论id第一层为0
/// </summary>
public Guid RootId { get; set; }
/// <summary>
/// 被回复的CommentId第一层为0
/// </summary>
public Guid ParentId { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
public class CommentGetListInputVo
{
public DateTime? creationTime { get; set; }
public string? Content { get; set; }
//Ӧ<><D3A6>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ī<EFBFBD><C4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ
public Guid? DiscussId { get; set; }
}
}

View File

@@ -1,49 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// <20><><EFBFBD>۶෴
/// </summary>
public class CommentGetListOutputDto : EntityDto<Guid>
{
public DateTime? CreationTime { get; set; }
public string Content { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD>id
/// </summary>
public Guid DiscussId { get; set; }
public Guid ParentId { get; set; }
public Guid RootId { get; set; }
/// <summary>
/// <20>û<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ϣ
/// </summary>
public BbsUserGetOutputDto CreateUser { get; set; }
public Guid? CreatorId { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5>û<EFBFBD><C3BB><EFBFBD>Ϣ
/// </summary>
public BbsUserGetOutputDto CommentedUser { get; set; }
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><E9A3AC>Childrenֻ<6E><D6BB><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB>
/// </summary>
public List<CommentGetListOutputDto> Children { get; set; } = new List<CommentGetListOutputDto>();
}
}

View File

@@ -1,35 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD>
/// </summary>
public class CommentGetOutputDto : EntityDto<Guid>
{
public DateTime? CreateTime { get; set; }
public string Content { get; set; }
public Guid DiscussId { get; set; }
/// <summary>
/// <20>û<EFBFBD>id<69><64><EFBFBD><EFBFBD>Ϊ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public BbsUserGetOutputDto User { get; set; }
/// <summary>
/// <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
/// </summary>
public Guid RootId { get; set; }
/// <summary>
/// <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>CommentId
/// </summary>
public Guid ParentId { get; set; }
}
}

View File

@@ -1,10 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Comment
{
public class CommentUpdateInputVo
{
public string Content { get; set; }
//<2F><><EFBFBD>²<EFBFBD><C2B2>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
}
}

View File

@@ -1,71 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
/// <summary>
/// Discuss输入创建对象
/// </summary>
public class DiscussCreateInput
{
public DiscussTypeEnum DiscussType { get; set; }
public string Title { get; set; }
public string? Types { get; set; }
public string? Introduction { get; set; }
public DateTime? CreateTime { get; set; } = DateTime.Now;
public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
/// <summary>
/// 默认公开
/// </summary>
public DiscussPermissionTypeEnum PermissionType { get; set; } = DiscussPermissionTypeEnum.Public;
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public int OrderNum { get; set; } = 0;
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 标签
/// </summary>
public List<Guid>? DiscussLableIds { get; set; }
/// <summary>
/// 角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
/// <summary>
/// 悬赏类型主题
/// </summary>
public DiscussRewardCreateInput? RewardData { get; set; }
}
public class DiscussRewardCreateInput
{
/// <summary>
/// 悬赏最小价值
/// </summary>
public decimal MinValue { get; set; }
/// <summary>
/// 悬赏最大价值
/// </summary>
public decimal? MaxValue { get; set; }
/// <summary>
/// 作者联系方式
/// </summary>
public string Contact { get; set; }
}
}

View File

@@ -1,25 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetListInputVo : PagedAndSortedResultRequestDto
{
/// <summary>
/// 创建者的用户名
/// </summary>
public string? UserName { get; set; }
public Guid? UserId { get; set; }
public string? Title { get; set; }
public Guid? PlateId { get; set; }
//默认查询非置顶
public bool? IsTop { get; set; }
//查询方式
public QueryDiscussTypeEnum Type { get; set; } = QueryDiscussTypeEnum.New;
}
}

View File

@@ -1,58 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetListOutputDto : EntityDto<Guid>
{
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 是否已点赞,默认未登录不点赞
/// </summary>
public bool IsAgree { get; set; } = false;
public string Title { get; set; }
public string? Introduction { get; set; }
public int AgreeNum { get; set; }
public int SeeNum { get; set; }
//批量查询,不给内容,性能考虑
//public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
//是否置顶默认false
public bool IsTop { get; set; }
public DiscussTypeEnum DiscussType { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
//是否禁止默认false
public bool IsBan { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public DateTime CreationTime { get; set; }
/// <summary>
/// 所需角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
public BbsUserGetListOutputDto User { get; set; }
public List<Guid>? DiscussLableIds { get; set; } = new List<Guid>();
public List<DiscussLableGetOutputDto> Lables { get; set; } = new List<DiscussLableGetOutputDto>();
}
}

View File

@@ -1,73 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Bbs.Application.Contracts.Dtos.BbsUser;
using Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
using Yi.Framework.Bbs.Application.Contracts.Dtos.Plate;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Rbac.Application.Contracts.Dtos.User;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussGetOutputDto : EntityDto<Guid>
{
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
public string Title { get; set; }
public string? Introduction { get; set; }
public int AgreeNum { get; set; }
public int SeeNum { get; set; }
public string Content { get; set; }
public string? Color { get; set; }
public Guid PlateId { get; set; }
//是否置顶默认false
public bool IsTop { get; set; }
/// <summary>
/// 主题类型
/// </summary>
public DiscussTypeEnum DiscussType { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
//是否私有默认false
public bool IsPrivate { get; set; }
//私有需要判断code权限
public string? PrivateCode { get; set; }
public DateTime CreationTime { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
public bool IsAgree { get; set; } = false;
public List<string> PermissionRoleCodes { get; set; } = new List<string>();
public BbsUserGetListOutputDto User { get; set; }
public PlateGetOutputDto Plate { get; set; }
public List<Guid>? DiscussLableIds { get; set; } = new List<Guid>();
public List<DiscussLableGetOutputDto> Lables { get; set; } =new List<DiscussLableGetOutputDto>();
public bool HasPermission { get;internal set; }
public DiscussRewardGetOutputDto? RewardData { get; set; }
/// <summary>
/// 设置权限
/// </summary>
public void SetPassPermission()
{
HasPermission = true;
}
/// <summary>
/// 设置无权限
/// </summary>
public void SetNoPermission()
{
HasPermission = false;
Content=DiscussConst.Privacy;
}
}
}

View File

@@ -1,23 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss;
public class DiscussRewardGetOutputDto
{
/// <summary>
/// 是否已解决
/// </summary>
public bool IsResolved{ get; set; }
/// <summary>
/// 悬赏最小价值
/// </summary>
public decimal MinValue { get; set; }
/// <summary>
/// 悬赏最大价值
/// </summary>
public decimal? MaxValue { get; set; }
/// <summary>
/// 作者联系方式
/// </summary>
public string Contact { get; set; }
}

View File

@@ -1,39 +0,0 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Discuss
{
public class DiscussUpdateInput
{
public string Title { get; set; }
public string? Types { get; set; }
public string? Introduction { get; set; }
public string Content { get; set; }
public string? Color { get; set; }
public List<Guid>? PermissionUserIds { get; set; }
public DiscussPermissionTypeEnum PermissionType { get; set; }
/// <summary>
/// 封面
/// </summary>
public string? Cover { get; set; }
public int OrderNum { get; set; }
/// <summary>
/// 是否禁止评论创建功能
/// </summary>
public bool IsDisableCreateComment { get; set; }
/// <summary>
/// 标签
/// </summary>
public List<Guid>? DiscussLableIds { get; set; }
/// <summary>
/// 需求角色
/// </summary>
public List<string>? PermissionRoleCodes { get; set; } = new List<string>();
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.DiscussLable;
public class DiscussLableGetOutputDto:EntityDto<Guid>
{
public Guid Id { get; set; }
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}

View File

@@ -1,31 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Integral
{
public class SignInDto
{
/// <summary>
/// 签到数据
/// </summary>
public List<SignInItemDto> SignInItem { get; set; }=new List<SignInItemDto>();
/// <summary>
/// 当前连续签到次数
/// </summary>
public int CurrentContinuousNumber { get; set; }
}
public class SignInItemDto : EntityDto<Guid>
{
/// <summary>
/// 签到时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Level
{
public class LevelGetListInputDto:PagedResultRequestDto
{ /// <summary>
/// 当前等级
/// </summary>
public int? MinLevel { get; set; }
/// <summary>
/// 等级名称
/// </summary>
public string? Name { get; set; }
}
}

View File

@@ -1,34 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Level
{
public class LevelOutputDto : EntityDto<Guid>
{
public Guid Id { get; set; }
/// <summary>
/// 当前等级
/// </summary>
public int CurrentLevel { get; set; }
/// <summary>
/// 最小所需经验值
/// </summary>
public decimal MinExperience { get; set; }
/// <summary>
/// 等级名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 等级称号
/// </summary>
public string? Nick { get; set; }
/// <summary>
/// 等候logo
/// </summary>
public string? Logo { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
/// <summary>
/// Label输入创建对象
/// </summary>
public class DiscussLableCreateInputVo
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableGetListInputVo : PagedAndSortedResultRequestDto
{
public string? Name { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,12 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
public Guid UserId { get; set; }
}
}

View File

@@ -1,9 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.MyType
{
public class DiscussLableUpdateInputVo
{
public string Name { get; set; }
public string? Color { get; set; }
public string? BackgroundColor { get; set; }
}
}

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Notice
{
public class BbsNoticeGetListInputVo:PagedAllResultRequestDto
{
}
}

View File

@@ -1,37 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Notice
{
public class BbsNoticeGetListOutputDto
{
/// <summary>
/// 消息,支持html
/// </summary>
public string Message { get; set; }
/// <summary>
/// 消息类型
/// </summary>
public NoticeTypeEnum NoticeType { get; }
/// <summary>
/// 是否已读
/// </summary>
public bool IsRead { get; private set; }
/// <summary>
/// 已读时间
/// </summary>
public DateTime? ReadTime { get; private set; }
/// <summary>
/// 消息创建时间
/// </summary>
public DateTime CreationTime { get; set; }
}
}

View File

@@ -1,18 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
/// <summary>
/// Plate输入创建对象
/// </summary>
public class PlateCreateInputVo
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Introduction { get; set; }
public string Code { get; set; }
public int OrderNum { get; set; }
public bool IsDisableCreateDiscuss { get; set; }
}
}

View File

@@ -1,11 +0,0 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
public class PlateGetListInputVo : PagedAllResultRequestDto
{
public string? Name { get; set; }
public string? Code { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
public class PlateGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Introduction { get; set; }
public string Code { get; set; }
public DateTime CreationTime { get; set; }
public int OrderNum { get; set; }
public bool IsDisableCreateDiscuss { get; set; }
}
}

View File

@@ -1,17 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
public class PlateGetOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public string? Logo { get; set; }
public string? Introduction { get; set; }
public string Code { get; set; }
public DateTime CreationTime { get; set; }
public int OrderNum { get; set; }
public bool IsDisableCreateDiscuss { get; set; }
}
}

View File

@@ -1,16 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Plate
{
public class PlateUpdateInputVo
{
public string? Name { get; set; }
public string? Logo { get; set; }
public string? Introduction { get; set; }
public string? Code { get; set; }
public int OrderNum { get; set; }
public bool IsDisableCreateDiscuss { get; set; }
}
}

View File

@@ -1,19 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Shop;
public class BbsShopAccountDto
{
/// <summary>
/// 钱钱
/// </summary>
public decimal Money { get; set; }
/// <summary>
/// 积分
/// </summary>
public int Points { get; set; }
/// <summary>
/// 价值
/// </summary>
public decimal Value { get; set; }
}

View File

@@ -1,7 +0,0 @@
namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Shop;
public class BuyShopInputDto
{
public Guid GoodsId { get; set; }
public string ContactInformation { get; set; }
}

Some files were not shown because too many files have changed in this diff Show More