Browse Source

用户模块实现

master
shanji 3 years ago
parent
commit
9a861b6f25
  1. 12
      Binance.TradeRobot.API/.config/dotnet-tools.json
  2. 12
      Binance.TradeRobot.API/Binance.TradeRobot.API.xml
  3. 15
      Binance.TradeRobot.API/Controllers/BaseApiController.cs
  4. 30
      Binance.TradeRobot.API/Controllers/UserController.cs
  5. 8
      Binance.TradeRobot.Business/BaseBusiness.cs
  6. 18
      Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml
  7. 17
      Binance.TradeRobot.Business/Extensions/FreeSqlExtension.cs
  8. 25
      Binance.TradeRobot.Business/Extensions/UserExtension.cs
  9. 233
      Binance.TradeRobot.Business/UserBusiness.cs
  10. 4
      Binance.TradeRobot.Model/Base/MappingProfiles.cs
  11. 40
      Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml
  12. 3
      Binance.TradeRobot.Model/Db/UserAccountFundChangeRecord.cs
  13. 4
      Binance.TradeRobot.Model/Db/UserAccountProfitLossRecord.cs
  14. 11
      Binance.TradeRobot.Model/Dto/Request/User/FundsChangeRequest.cs
  15. 13
      Binance.TradeRobot.Model/Dto/Request/User/FundsTransferRequest.cs
  16. 6
      Binance.TradeRobot.Model/Dto/Request/User/LoginRequest.cs
  17. 17
      Binance.TradeRobot.Model/Dto/Request/User/QueryUserAccountRequest.cs
  18. 29
      Binance.TradeRobot.Model/Dto/Response/User/UserAccountFundChangeRecordResponse.cs
  19. 16
      Binance.TradeRobot.Model/Dto/Response/User/UserResponse.cs

12
Binance.TradeRobot.API/.config/dotnet-tools.json

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "6.0.2",
"commands": [
"dotnet-ef"
]
}
}
}

12
Binance.TradeRobot.API/Binance.TradeRobot.API.xml

@ -8,7 +8,7 @@
<summary>
用户登录
</summary>
<param name="loginRequest"></param>
<param name="loginRequest">密码需小写md5加密</param>
<returns></returns>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.GetUserList">
@ -16,27 +16,27 @@
获取用户列表
</summary>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.GetUserAccountFundChangeRecordList">
<member name="M:Binance.TradeRobot.API.Controllers.UserController.GetUserAccountFundChangeRecordList(Binance.TradeRobot.Model.Dto.QueryUserAccountRequest)">
<summary>
获取用户资金变更记录
</summary>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.GetUserAccountProfitLossRecordList">
<summary>
获取用户盈亏记录
获取用户盈亏记录,暂未开放
</summary>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.AddFunds">
<member name="M:Binance.TradeRobot.API.Controllers.UserController.AddFunds(Binance.TradeRobot.Model.Dto.FundsChangeRequest)">
<summary>
追投
</summary>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.ReduceFunds">
<member name="M:Binance.TradeRobot.API.Controllers.UserController.ReduceFunds(Binance.TradeRobot.Model.Dto.FundsChangeRequest)">
<summary>
提现
</summary>
</member>
<member name="M:Binance.TradeRobot.API.Controllers.UserController.TransferFunds">
<member name="M:Binance.TradeRobot.API.Controllers.UserController.TransferFunds(Binance.TradeRobot.Model.Dto.FundsTransferRequest)">
<summary>
转移资金
</summary>

15
Binance.TradeRobot.API/Controllers/BaseApiController.cs

@ -1,4 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using Binance.TradeRobot.Model.Dto;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace Binance.TradeRobot.API.Controllers
{
@ -7,5 +9,16 @@ namespace Binance.TradeRobot.API.Controllers
[ApiController]
public class BaseApiController : ControllerBase
{
public LoginResponse LoginUser
{
get
{
return new LoginResponse()
{
Id = long.Parse(HttpContext.User.Claims.FirstOrDefault(c => c.Type == "Id").Value),
UserName = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "UserName").Value
};
}
}
}
}

30
Binance.TradeRobot.API/Controllers/UserController.cs

@ -1,9 +1,13 @@
using Binance.TradeRobot.Business;
using Binance.TradeRobot.Model.Dto;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace Binance.TradeRobot.API.Controllers
{
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class UserController : BaseApiController
{
private UserBusiness userBusiness;
@ -15,9 +19,10 @@ namespace Binance.TradeRobot.API.Controllers
/// <summary>
/// 用户登录
/// </summary>
/// <param name="loginRequest"></param>
/// <param name="loginRequest">密码需小写md5加密</param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public LoginResponse Login([FromBody] LoginRequest loginRequest)
{
return userBusiness.Login(loginRequest);
@ -27,53 +32,54 @@ namespace Binance.TradeRobot.API.Controllers
/// 获取用户列表
/// </summary>
[HttpGet]
public void GetUserList()
public IList<UserResponse> GetUserList()
{
return userBusiness.GetUserList();
}
/// <summary>
/// 获取用户资金变更记录
/// </summary>
[HttpGet]
public void GetUserAccountFundChangeRecordList()
public UserAccountChangeRecordListResponse GetUserAccountFundChangeRecordList([FromBody] QueryUserAccountRequest queryUserAccountRequest)
{
return userBusiness.GetUserAccountFundChangeRecordList(queryUserAccountRequest);
}
/// <summary>
/// 获取用户盈亏记录
/// 获取用户盈亏记录,暂未开放
/// </summary>
[HttpGet]
public void GetUserAccountProfitLossRecordList()
{
}
/// <summary>
/// 追投
/// </summary>
[HttpPost]
public void AddFunds()
public void AddFunds([FromBody] FundsChangeRequest fundsChangeRequest)
{
userBusiness.AddFunds(LoginUser.Id, fundsChangeRequest);
}
/// <summary>
/// 提现
/// </summary>
[HttpPost]
public void ReduceFunds()
public void ReduceFunds([FromBody] FundsChangeRequest fundsChangeRequest)
{
userBusiness.ReduceFunds(LoginUser.Id, fundsChangeRequest);
}
/// <summary>
/// 转移资金
/// </summary>
[HttpPost]
public void TransferFunds()
public void TransferFunds([FromBody] FundsTransferRequest fundsTransferRequest)
{
userBusiness.TransferFunds(LoginUser.Id, fundsTransferRequest);
}
}
}

8
Binance.TradeRobot.Business/BaseBusiness.cs

@ -1,13 +1,17 @@
namespace Binance.TradeRobot.Business
using Yitter.IdGenerator;
namespace Binance.TradeRobot.Business
{
public class BaseBusiness
{
protected IFreeSql fsql;
protected NLogManager logManager;
public BaseBusiness(IFreeSql fsql, NLogManager logManager)
protected IIdGenerator idGenerator;
public BaseBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator)
{
this.fsql = fsql;
this.logManager = logManager;
this.idGenerator = idGenerator;
}
}
}

18
Binance.TradeRobot.Business/Binance.TradeRobot.Business.xml

@ -4,5 +4,23 @@
<name>Binance.TradeRobot.Business</name>
</assembly>
<members>
<member name="M:Binance.TradeRobot.Business.Extensions.UserExtension.CalculateRatio(System.Collections.Generic.IList{Binance.TradeRobot.Model.Dto.UserResponse},System.Boolean)">
<summary>
计算成员分红/本金比例
</summary>
<param name="userList"></param>
<param name="multiplyBy100">比例乘100</param>
</member>
<member name="M:Binance.TradeRobot.Business.UserBusiness.OneWayAssetChange(System.Int64,System.Decimal,System.Int64,Binance.TradeRobot.Model.Base.Enums.CapitalChangeType,System.String)">
<summary>
单向资产变更
</summary>
<param name="operationUserId"></param>
<param name="changeAmount"></param>
<param name="changeUserId"></param>
<param name="capitalChangeType"></param>
<param name="remark"></param>
<exception cref="T:Binance.TradeRobot.Model.Base.BusinessException"></exception>
</member>
</members>
</doc>

17
Binance.TradeRobot.Business/Extensions/FreeSqlExtension.cs

@ -0,0 +1,17 @@
using FreeSql;
using System;
using System.Collections.Generic;
namespace Binance.TradeRobot.Business.Extensions
{
public static class FreeSqlExtension
{
public static ISelect<T1, T2, T3> WithLock<T1, T2, T3>(this ISelect<T1, T2, T3> that, SqlServerLock lockType = SqlServerLock.NoLock, Dictionary<Type, bool> rule = null) where T2 : class where T3 : class
{
return rule == null ?
that.AsAlias((type, old) => $"{old} With({lockType})") :
that.AsAlias((type, old) => rule.TryGetValue(type, out var trybool) && trybool ? $"{old} With({lockType.ToString()})" : old);
}
}
}

25
Binance.TradeRobot.Business/Extensions/UserExtension.cs

@ -0,0 +1,25 @@
using Binance.TradeRobot.Model.Dto;
using System.Collections.Generic;
using System.Linq;
namespace Binance.TradeRobot.Business.Extensions
{
public static class UserExtension
{
/// <summary>
/// 计算成员分红/本金比例
/// </summary>
/// <param name="userList"></param>
/// <param name="multiplyBy100">比例乘100</param>
public static void CalculateRatio(this IList<UserResponse> userList, bool multiplyBy100 = true)
{
var totalAssets = userList.Sum(u => u.TotalAssets); //总资产
var totalCostAmount = userList.Sum(u => u.CostAmount); //总本金
foreach (var u in userList)
{
u.CostRatio = totalCostAmount == 0 ? 0 : u.CostAmount / totalCostAmount * (multiplyBy100 ? 100 : 1);
u.DividendRatio = totalAssets == 0 ? 0 : u.TotalAssets / totalAssets * (multiplyBy100 ? 100 : 1);
}
}
}
}

233
Binance.TradeRobot.Business/UserBusiness.cs

@ -1,4 +1,5 @@
using Binance.TradeRobot.Common.DI;
using Binance.TradeRobot.Business.Extensions;
using Binance.TradeRobot.Common.DI;
using Binance.TradeRobot.Common.Extensions;
using Binance.TradeRobot.Model.Base;
using Binance.TradeRobot.Model.Db;
@ -9,8 +10,10 @@ using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using Yitter.IdGenerator;
namespace Binance.TradeRobot.Business
{
@ -19,7 +22,7 @@ namespace Binance.TradeRobot.Business
{
private IConfiguration configuration;
public UserBusiness(IFreeSql fsql, NLogManager logManager, IConfiguration configuration) : base(fsql, logManager)
public UserBusiness(IFreeSql fsql, NLogManager logManager, IIdGenerator idGenerator, IConfiguration configuration) : base(fsql, logManager, idGenerator)
{
this.configuration = configuration;
}
@ -53,5 +56,231 @@ namespace Binance.TradeRobot.Business
Token = token
};
}
public IList<UserResponse> GetUserList()
{
var userList = fsql.Select<User>().ToList().Map<IList<UserResponse>>();
userList.CalculateRatio();
return userList;
}
#region 用户资产
/// <summary>
/// 单向资产变更
/// </summary>
/// <param name="operationUserId"></param>
/// <param name="changeAmount"></param>
/// <param name="changeUserId"></param>
/// <param name="capitalChangeType"></param>
/// <param name="remark"></param>
/// <exception cref="BusinessException"></exception>
private void OneWayAssetChange(long operationUserId, decimal changeAmount, long changeUserId, Enums.CapitalChangeType capitalChangeType, string remark)
{
var changeUser = fsql.Select<User>(changeUserId).ToOne().Map<UserResponse>();
if (changeUser == null)
throw new BusinessException("资金变更用户不存在");
if (capitalChangeType == Enums.CapitalChangeType.Reduce)
{
if (changeUser.TotalAssets < changeAmount)
throw new BusinessException("用户资产小于减持资金,不能提现");
//获取交易所账户总额(usdt)
//var apiKeyList = stockExchangeAccountBusiness.GetAPIKeyList(null);
//var totalBalance = apiKeyList.Sum(k => k.Balance);
//if (totalBalance < changeAmount)
// throw new BusinessException("交易所总余额小于减持资金,不能提现");
}
if (capitalChangeType == Enums.CapitalChangeType.Add)
{
changeUser.CostAmount += changeAmount;
}
else if (capitalChangeType == Enums.CapitalChangeType.Reduce)
{
if (changeUser.Profit > 0)
{
if (changeUser.Profit >= changeAmount)
changeUser.Profit -= changeAmount; //收益足够提现,只扣收益
else
{
var lessChangeAmount = changeAmount; //收益不足提现,先扣收益,不足部分再扣本金
lessChangeAmount -= changeUser.Profit;
changeUser.Profit = 0;
changeUser.CostAmount -= lessChangeAmount;
}
}
else
{
changeUser.CostAmount -= changeAmount;
}
}
fsql.Transaction(() =>
{
fsql.Update<User>(changeUser.Id).Set(u => u.CostAmount, changeUser.CostAmount)
.Set(u => u.Profit, changeUser.Profit)
.SetIf(capitalChangeType == Enums.CapitalChangeType.Reduce, u => u.WithdrawAmount + changeAmount)
.ExecuteAffrows();
fsql.Insert(new UserAccountFundChangeRecord()
{
Id = idGenerator.NewLong(),
ChangeAmount = changeAmount,
UserId = changeUserId,
OperationType = capitalChangeType,
OperationUserId = operationUserId,
Remark = remark,
Direction = capitalChangeType == Enums.CapitalChangeType.Add ? Enums.FundDirection.In : Enums.FundDirection.Out
}).ExecuteAffrows();
});
}
public void AddFunds(long operationUserId, FundsChangeRequest fundsChangeRequest)
{
if (fundsChangeRequest.ChangeAmount <= 0)
throw new BusinessException("无效金额");
OneWayAssetChange(operationUserId, fundsChangeRequest.ChangeAmount, fundsChangeRequest.UserId, Enums.CapitalChangeType.Add, fundsChangeRequest.Remark);
}
public void ReduceFunds(long operationUserId, FundsChangeRequest fundsChangeRequest)
{
if (fundsChangeRequest.ChangeAmount <= 0)
throw new BusinessException("无效金额");
OneWayAssetChange(operationUserId, fundsChangeRequest.ChangeAmount, fundsChangeRequest.UserId, Enums.CapitalChangeType.Reduce, fundsChangeRequest.Remark);
}
public void TransferFunds(long operationUserId, FundsTransferRequest fundsTransferRequest)
{
if (fundsTransferRequest.ChangeAmount <= 0)
throw new BusinessException("无效金额");
var userList = fsql.Select<User>().ToList().Map<IList<UserResponse>>();
var fromUser = userList.FirstOrDefault(u => u.Id == fundsTransferRequest.FromUserId);
if (fromUser == null)
throw new BusinessException("资金变更用户不存在");
var toUser = userList.FirstOrDefault(u => u.Id == fundsTransferRequest.ToUserId);
if (toUser == null)
throw new BusinessException("资金变更用户不存在");
if (fromUser.TotalAssets < fundsTransferRequest.ChangeAmount)
throw new BusinessException("用户资产小于转移资金,不能转移");
if (fromUser.Profit > 0)
{
if (fromUser.Profit >= fundsTransferRequest.ChangeAmount)
fromUser.Profit -= fundsTransferRequest.ChangeAmount; //收益足够提现,只扣收益
else
{
var lessChangeAmount = fundsTransferRequest.ChangeAmount; //收益不足提现,先扣收益,不足部分再扣本金
lessChangeAmount -= fromUser.Profit;
fromUser.Profit = 0;
fromUser.CostAmount -= lessChangeAmount;
}
}
else
{
fromUser.CostAmount -= fundsTransferRequest.ChangeAmount;
}
fsql.Transaction(() =>
{
fsql.Update<User>(fromUser.Id).Set(u => u.CostAmount, fromUser.CostAmount)
.Set(u => u.Profit, fromUser.Profit)
.Set(u => u.WithdrawAmount + fundsTransferRequest.ChangeAmount)
.ExecuteAffrows();
fsql.Update<User>(toUser.Id).Set(u => u.CostAmount + fundsTransferRequest.ChangeAmount)
.ExecuteAffrows();
fsql.Insert(new UserAccountFundChangeRecord()
{
Id = idGenerator.NewLong(),
ChangeAmount = fundsTransferRequest.ChangeAmount,
UserId = fundsTransferRequest.FromUserId,
OperationType = Enums.CapitalChangeType.Transfer,
OperationUserId = operationUserId,
Remark = fundsTransferRequest.Remark,
Direction = Enums.FundDirection.Out,
ToUserId = fundsTransferRequest.ToUserId
}).ExecuteAffrows();
fsql.Insert(new UserAccountFundChangeRecord()
{
Id = idGenerator.NewLong(),
ChangeAmount = fundsTransferRequest.ChangeAmount,
UserId = fundsTransferRequest.ToUserId,
OperationType = Enums.CapitalChangeType.Transfer,
OperationUserId = operationUserId,
Remark = fundsTransferRequest.Remark,
Direction = Enums.FundDirection.In,
ToUserId = fundsTransferRequest.FromUserId
}).ExecuteAffrows();
});
}
public UserAccountChangeRecordListResponse GetUserAccountFundChangeRecordList(QueryUserAccountRequest queryUserAccountRequest)
{
var list = fsql.Select<UserAccountFundChangeRecord, User, User, User>()
.InnerJoin((ucr, u, ou, tu) => ucr.UserId == u.Id)
.InnerJoin((ucr, u, ou, tu) => ucr.OperationUserId == ou.Id)
.LeftJoin((ucr, u, ou, tu) => ucr.ToUserId == tu.Id)
.Where((ucr, u, ou, tu) => ucr.UserId == queryUserAccountRequest.UserId)
.Count(out var recordCount)
.Page(queryUserAccountRequest.PageIndex, queryUserAccountRequest.PageSize)
.ToList((ucr, u, ou, tu) => new UserAccountFundChangeRecordResponse()
{
Id = ucr.Id,
ChangeAmount = ucr.ChangeAmount,
CreateTime = ucr.CreateTime,
OperationType = ucr.OperationType,
OperationUserId = ucr.OperationUserId,
OperationUserName = ou.UserName,
UserId = ucr.UserId,
UserName = u.UserName,
Remark = ucr.Remark,
Direction = ucr.Direction,
ToUserId = tu.Id,
ToUserName = tu.UserName
});
return new UserAccountChangeRecordListResponse()
{
List = list,
RecordCount = recordCount
};
}
//public UserAccountProfitLossRecordListResponse GetUserAccountProfitLossRecordList(QueryUserAccountRequest queryUserAccountRequest)
//{
// var list = fsql.Select<Model.Db.UserAccountProfitLossRecord, Model.Db.User, Model.Db.Robot>()
// .WithLock(SqlServerLock.NoLock)
// .InnerJoin((p, u, r) => p.UserId == u.Id)
// .InnerJoin((p, u, r) => p.RobotId == r.Id)
// .Where((p, u, r) => p.UserId == queryUserAccountRequest.UserId)
// .Count(out var recordCount)
// .Page(queryUserAccountRequest.PageIndex, queryUserAccountRequest.PageSize)
// .ToList((p, u, r) => new UserAccountProfitLossRecordResponse()
// {
// Id = p.Id,
// ChangeAmount = p.ChangeAmount,
// CreateTime = p.CreateTime,
// DividendRatio = p.DividendRatio,
// OrderProfit = p.OrderProfit,
// RobotId = p.RobotId,
// SpotOrderId = p.SpotOrderId,
// Symbol = r.Symbol,
// UserId = p.UserId,
// UserName = u.UserName,
// UserProfit = p.UserProfit
// });
// return new UserAccountProfitLossRecordListResponse()
// {
// List = list,
// RecordCount = recordCount
// };
//}
#endregion
}
}

4
Binance.TradeRobot.Model/Base/MappingProfiles.cs

@ -4,5 +4,9 @@ namespace Binance.TradeRobot.Model.Base
{
public class MappingProfiles : Profile
{
public MappingProfiles()
{
}
}
}

40
Binance.TradeRobot.Model/Binance.TradeRobot.Model.xml

@ -119,5 +119,45 @@
密码需要Md5小写加密
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.QueryUserAccountRequest.PageIndex">
<summary>
页数,从1开始
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.QueryUserAccountRequest.PageSize">
<summary>
每页记录数
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserAccountFundChangeRecordResponse.UserName">
<summary>
资金变更用户名
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserAccountFundChangeRecordResponse.OperationUserName">
<summary>
操作用户名
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserAccountFundChangeRecordResponse.ToUserName">
<summary>
对端用户名
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserResponse.TotalAssets">
<summary>
总资产(本金+收益)
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserResponse.CostRatio">
<summary>
本金比例
</summary>
</member>
<member name="P:Binance.TradeRobot.Model.Dto.UserResponse.DividendRatio">
<summary>
分红比例
</summary>
</member>
</members>
</doc>

3
Binance.TradeRobot.Model/Db/UserAccountFundChangeRecord.cs

@ -41,6 +41,9 @@ namespace Binance.TradeRobot.Model.Db
/// 对端用户Id
/// </summary>
public long? ToUserId { get; set; }
[Column(StringLength = 100)]
public string Remark { get; set; }
}
}

4
Binance.TradeRobot.Model/Db/UserAccountProfitLossRecord.cs

@ -30,8 +30,8 @@ namespace Binance.TradeRobot.Model.Db
[Column(DbType = "decimal(18,2)")]
public decimal DividendRatio { get; set; } = 0.0M;
public long? Id { get; set; }
[Column(IsPrimary = true)]
public long Id { get; set; }
public long OrderId { get; set; }

11
Binance.TradeRobot.Model/Dto/Request/User/FundsChangeRequest.cs

@ -0,0 +1,11 @@
namespace Binance.TradeRobot.Model.Dto
{
public class FundsChangeRequest
{
public long UserId { get; set; }
public decimal ChangeAmount { get; set; }
public string Remark { get; set; }
}
}

13
Binance.TradeRobot.Model/Dto/Request/User/FundsTransferRequest.cs

@ -0,0 +1,13 @@
namespace Binance.TradeRobot.Model.Dto
{
public class FundsTransferRequest
{
public long FromUserId { get; set; }
public long ToUserId { get; set; }
public decimal ChangeAmount { get; set; }
public string Remark { get; set; }
}
}

6
Binance.TradeRobot.Model/Dto/Request/User/LoginRequest.cs

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Binance.TradeRobot.Model.Dto
namespace Binance.TradeRobot.Model.Dto
{
public class LoginRequest
{

17
Binance.TradeRobot.Model/Dto/Request/User/QueryUserAccountRequest.cs

@ -0,0 +1,17 @@
namespace Binance.TradeRobot.Model.Dto
{
public class QueryUserAccountRequest
{
public long UserId { get; set; }
/// <summary>
/// 页数,从1开始
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 每页记录数
/// </summary>
public int PageSize { get; set; }
}
}

29
Binance.TradeRobot.Model/Dto/Response/User/UserAccountFundChangeRecordResponse.cs

@ -0,0 +1,29 @@
using System.Collections.Generic;
namespace Binance.TradeRobot.Model.Dto
{
public class UserAccountFundChangeRecordResponse : Db.UserAccountFundChangeRecord
{
/// <summary>
/// 资金变更用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 操作用户名
/// </summary>
public string OperationUserName { get; set; }
/// <summary>
/// 对端用户名
/// </summary>
public string ToUserName { get; set; }
}
public class UserAccountChangeRecordListResponse
{
public long RecordCount { get; set; }
public IList<UserAccountFundChangeRecordResponse> List { get; set; }
}
}

16
Binance.TradeRobot.Model/Dto/Response/User/UserResponse.cs

@ -1,6 +1,20 @@
namespace Binance.TradeRobot.Model.Dto
{
public class UserResponse
public class UserResponse : Db.User
{
/// <summary>
/// 总资产(本金+收益)
/// </summary>
public decimal TotalAssets { get { return CostAmount + Profit; } }
/// <summary>
/// 本金比例
/// </summary>
public decimal CostRatio { get; set; }
/// <summary>
/// 分红比例
/// </summary>
public decimal DividendRatio { get; set; }
}
}

Loading…
Cancel
Save