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
{
///
/// 股市服务实现
///
public class StockMarketService : ApplicationService, IStockMarketService
{
private readonly ISqlSugarRepository _stockMarketRepository;
private readonly ISqlSugarRepository _stockPriceRecordRepository;
private readonly StockMarketManager _stockMarketManager;
public StockMarketService(
ISqlSugarRepository stockMarketRepository,
ISqlSugarRepository stockPriceRecordRepository,
StockMarketManager stockMarketManager)
{
_stockMarketRepository = stockMarketRepository;
_stockPriceRecordRepository = stockPriceRecordRepository;
_stockMarketManager = stockMarketManager;
}
///
/// 创建股市
///
[HttpPost("stock/markets")]
[Authorize]
public async Task CreateStockMarketAsync(CreateStockMarketInputDto input)
{
// 使用映射将输入DTO转换为实体
var stockMarket = input.Adapt();
// 保存到数据库
var result = await _stockMarketRepository.InsertReturnEntityAsync(stockMarket);
// 使用映射将实体转换为返回DTO
return result.Adapt();
}
///
/// 获取股市列表
///
[HttpGet("stock/markets")]
public async Task> GetStockMarketListAsync(StockMarketGetListInputDto input)
{
RefAsync 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(total, list);
}
///
/// 获取股市价格记录看板
///
[HttpGet("stock/price-records")]
public async Task> GetStockPriceRecordListAsync(StockPriceRecordGetListInputDto input)
{
RefAsync 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(total, list);
}
///
/// 买入股票
///
[HttpPost("stock/buy")]
[Authorize]
public async Task BuyStockAsync(BuyStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票购买
await _stockMarketManager.BuyStockAsync(
userId,
input.StockId,
input.Quantity
);
}
///
/// 卖出股票
///
[HttpDelete("stock/sell")]
[Authorize]
public async Task SellStockAsync(SellStockInputDto input)
{
// 获取当前登录用户ID
var userId = CurrentUser.GetId();
// 调用领域服务进行股票卖出
await _stockMarketManager.SellStockAsync(
userId,
input.StockId,
input.Quantity
);
}
///
/// 生成最新股票记录
///
[HttpPost("stock/generate")]
[Authorize]
public async Task GenerateStocksAsync()
{
await _stockMarketManager.GenerateStocksAsync();
}
}
}