mirror of
				https://github.com/nsnail/NetAdmin.git
				synced 2025-10-31 03:19:26 +08:00 
			
		
		
		
	feat: ✨ 自助充值
This commit is contained in:
		| @@ -1,3 +1,4 @@ | |||||||
|  | USDT | ||||||
| 上次执行时间 | 上次执行时间 | ||||||
| 上次执行状态 | 上次执行状态 | ||||||
| 上次执行耗时 | 上次执行耗时 | ||||||
| @@ -19,6 +20,8 @@ | |||||||
| 作业状态 | 作业状态 | ||||||
| 信息 | 信息 | ||||||
| 倒序排序 | 倒序排序 | ||||||
|  | 充值成功 | ||||||
|  | 充值订单导出 | ||||||
| 全部数据 | 全部数据 | ||||||
| 公告 | 公告 | ||||||
| 共青团员 | 共青团员 | ||||||
| @@ -26,6 +29,7 @@ | |||||||
| 创建时间 | 创建时间 | ||||||
| 初中 | 初中 | ||||||
| 删除 | 删除 | ||||||
|  | 到账确认中 | ||||||
| 包含 | 包含 | ||||||
| 博士 | 博士 | ||||||
| 博士后 | 博士后 | ||||||
| @@ -53,10 +57,11 @@ | |||||||
| 已校验 | 已校验 | ||||||
| 已读 | 已读 | ||||||
| 并且 | 并且 | ||||||
|  | 微信支付 | ||||||
| 成功 | 成功 | ||||||
| 或者 | 或者 | ||||||
| 所属角色 | 归属角色 | ||||||
| 所属部门 | 归属部门 | ||||||
| 手机 | 手机 | ||||||
| 手机号 | 手机号 | ||||||
| 执行耗时 | 执行耗时 | ||||||
| @@ -71,6 +76,8 @@ | |||||||
| 接口路径 | 接口路径 | ||||||
| 插入种子数据 | 插入种子数据 | ||||||
| 操作系统 | 操作系统 | ||||||
|  | 支付宝 | ||||||
|  | 支付超时 | ||||||
| 支出 | 支出 | ||||||
| 收入 | 收入 | ||||||
| 数据范围 | 数据范围 | ||||||
| @@ -114,6 +121,7 @@ | |||||||
| 站内信导出 | 站内信导出 | ||||||
| 等于 | 等于 | ||||||
| 等待发送 | 等待发送 | ||||||
|  | 等待支付 | ||||||
| 管理员充值 | 管理员充值 | ||||||
| 管理员扣费 | 管理员扣费 | ||||||
| 管理模块 | 管理模块 | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ XML注释文件不存在 | |||||||
| 手机号码不能为空 | 手机号码不能为空 | ||||||
| 接口编码不存在 | 接口编码不存在 | ||||||
| 支付宝账号 | 支付宝账号 | ||||||
|  | 支付方式不正确 | ||||||
| 政治面貌不正确 | 政治面貌不正确 | ||||||
| 数据库同步开始 | 数据库同步开始 | ||||||
| 数据库服务器时钟偏移 | 数据库服务器时钟偏移 | ||||||
|   | |||||||
| @@ -1,8 +1,11 @@ | |||||||
| [ | [ | ||||||
|   { |   { | ||||||
|  |     "CnyToPointRate": 100, | ||||||
|     "Enabled": true, |     "Enabled": true, | ||||||
|  |     "Trc20ReceiptAddress": "TMTByCrcZkY7o8YMax1pXiYV5SUQBZEnCu", | ||||||
|  |     "UsdToPointRate": 700, | ||||||
|     "UserRegisterConfirm": false, |     "UserRegisterConfirm": false, | ||||||
|     "UserRegisterDeptId": 372119301627909, |     "UserRegisterDeptId": 372119301627909, | ||||||
|     "UserRegisterRoleId": 371729946431493 |     "UserRegisterRoleId": 371729946431493, | ||||||
|   } |   } | ||||||
| ] | ] | ||||||
| @@ -2,12 +2,21 @@ | |||||||
|   { |   { | ||||||
|     "Enabled": true, |     "Enabled": true, | ||||||
|     "ExecutionCron": "0 * * * * ?", |     "ExecutionCron": "0 * * * * ?", | ||||||
|     "HttpMethod": 3, |     "HttpMethod": 7, | ||||||
|     "JobName": "HTTP 请求测试", |     "JobName": "用户收入支出统计", | ||||||
|     "NextExecTime": "2020-09-13 12:26:40", |     "RequestBody": "{\"Sql\":\"UPDATE Sys_UserWallet SET TotalIncome = (SELECT COALESCE(SUM(Amount), 0) FROM Sys_WalletTrade WHERE Sys_WalletTrade.OwnerId = Sys_UserWallet.Id AND Sys_WalletTrade.TradeDirection = 1);UPDATE Sys_UserWallet SET TotalExpenditure = (SELECT COALESCE(SUM(Amount), 0) FROM Sys_WalletTrade WHERE Sys_WalletTrade.OwnerId = Sys_UserWallet.Id AND Sys_WalletTrade.TradeDirection = 2);\",\"TimeoutSecs\":60}", | ||||||
|     "NextTimeId": 1600000000, |     "RequestHeader": "{\"Content-Type\":\"application/json\"}", | ||||||
|     "RequestUrl": "https://httpbin.org/ip", |     "RequestUrl": "https://na.tools92.top/api/sys/tools/execute.sql", | ||||||
|     "Status": 1, |     "UserId": 664362432344581, | ||||||
|     "UserId": 370942943322181, |   }, | ||||||
|   } |   { | ||||||
|  |     "Enabled": true, | ||||||
|  |     "ExecutionCron": "0 * * * * ?", | ||||||
|  |     "HttpMethod": 7, | ||||||
|  |     "JobName": "充值到账确认", | ||||||
|  |     "RequestBody": "{\"readRecordCount\":100}", | ||||||
|  |     "RequestHeader": "{\"Content-Type\":\"application/json\"}", | ||||||
|  |     "RequestUrl": "https://na.tools92.top/api/sys/deposit.order/received.confirmation", | ||||||
|  |     "UserId": 664362432344581, | ||||||
|  |   }, | ||||||
| ] | ] | ||||||
| @@ -96,6 +96,17 @@ | |||||||
|     "Title": "交易流水", |     "Title": "交易流水", | ||||||
|     "Type": 1 |     "Type": 1 | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     "Component": "sys/order", | ||||||
|  |     "Icon": "el-icon-shopping-cart", | ||||||
|  |     "Id": 690907673255944, | ||||||
|  |     "Name": "sys/order", | ||||||
|  |     "ParentId": 690906994118665, | ||||||
|  |     "Path": "/finance/order", | ||||||
|  |     "Sort": 98, | ||||||
|  |     "Title": "充值订单", | ||||||
|  |     "Type": 1 | ||||||
|  |   }, | ||||||
|   // ------------------------------  系统管理 ------------------------------ |   // ------------------------------  系统管理 ------------------------------ | ||||||
|   { |   { | ||||||
|     "Icon": "sc-icon-App", |     "Icon": "sc-icon-App", | ||||||
|   | |||||||
| @@ -78,5 +78,29 @@ | |||||||
|   { |   { | ||||||
|     "ApiId": "api/sys/wallet.trade/get", |     "ApiId": "api/sys/wallet.trade/get", | ||||||
|     "RoleId": 371729946431493, |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/paged.query", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/count.by", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/create", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/get", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/get.deposit.config", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "ApiId": "api/sys/deposit.order/pay.confirm", | ||||||
|  |     "RoleId": 371729946431493, | ||||||
|   } |   } | ||||||
| ] | ] | ||||||
| @@ -26,5 +26,9 @@ | |||||||
|   { |   { | ||||||
|     "MenuId": 690907673255943, |     "MenuId": 690907673255943, | ||||||
|     "RoleId": 371729946431493 |     "RoleId": 371729946431493 | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "MenuId": 690907673255944, | ||||||
|  |     "RoleId": 371729946431493 | ||||||
|   } |   } | ||||||
| ] | ] | ||||||
| @@ -14,5 +14,13 @@ | |||||||
|     "Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15", |     "Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15", | ||||||
|     "Token": "4208EA97-B32F-4E39-A290-4C0D27B61EBF", |     "Token": "4208EA97-B32F-4E39-A290-4C0D27B61EBF", | ||||||
|     "UserName": "user" |     "UserName": "user" | ||||||
|  |   }, | ||||||
|  |   { | ||||||
|  |     "DeptId": 372119301627909, | ||||||
|  |     "Enabled": true, | ||||||
|  |     "Id": 664362432344581, | ||||||
|  |     "Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15", | ||||||
|  |     "Token": "751D599B-2B8C-417C-9565-CCF2363F5F6F", | ||||||
|  |     "UserName": "jobs" | ||||||
|   } |   } | ||||||
| ] | ] | ||||||
| @@ -3,6 +3,10 @@ | |||||||
|     "Id": 370942943322181, |     "Id": 370942943322181, | ||||||
|     "AppConfig": "[]" |     "AppConfig": "[]" | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     "Id": 664362432344581, | ||||||
|  |     "AppConfig": "[]" | ||||||
|  |   }, | ||||||
|   { |   { | ||||||
|     "Id": 560217289236492, |     "Id": 560217289236492, | ||||||
|     "AppConfig": "[]" |     "AppConfig": "[]" | ||||||
|   | |||||||
| @@ -3,6 +3,10 @@ | |||||||
|     "RoleId": 370943613149253, |     "RoleId": 370943613149253, | ||||||
|     "UserId": 370942943322181 |     "UserId": 370942943322181 | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     "RoleId": 370943613149253, | ||||||
|  |     "UserId": 664362432344581 | ||||||
|  |   }, | ||||||
|   { |   { | ||||||
|     "RoleId": 371729946431493, |     "RoleId": 371729946431493, | ||||||
|     "UserId": 560217289236492 |     "UserId": 560217289236492 | ||||||
|   | |||||||
| @@ -4,6 +4,11 @@ | |||||||
|     "OwnerDeptId": 372119301627909, |     "OwnerDeptId": 372119301627909, | ||||||
|     "OwnerId": 370942943322181, |     "OwnerId": 370942943322181, | ||||||
|   }, |   }, | ||||||
|  |   { | ||||||
|  |     "Id": 664362432344581, | ||||||
|  |     "OwnerDeptId": 372119301627909, | ||||||
|  |     "OwnerId": 664362432344581, | ||||||
|  |   }, | ||||||
|   { |   { | ||||||
|     "Id": 560217289236492, |     "Id": 560217289236492, | ||||||
|     "OwnerDeptId": 372119301627909, |     "OwnerDeptId": 372119301627909, | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| namespace NetAdmin.Domain.DbMaps.Dependency.Fields; | namespace NetAdmin.Domain.DbMaps.Dependency.Fields; | ||||||
|  |  | ||||||
| /// <summary> | /// <summary> | ||||||
| ///     所有者字段接口 | ///     归属字段接口 | ||||||
| /// </summary> | /// </summary> | ||||||
| public interface IFieldOwner | public interface IFieldOwner | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     long? OwnerDeptId { get; init; } |     long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     long? OwnerId { get; init; } |     long? OwnerId { get; init; } | ||||||
| } | } | ||||||
| @@ -6,6 +6,14 @@ namespace NetAdmin.Domain.DbMaps.Sys; | |||||||
| [Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Config))] | [Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_Config))] | ||||||
| public record Sys_Config : VersionEntity, IFieldEnabled | public record Sys_Config : VersionEntity, IFieldEnabled | ||||||
| { | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     人民币兑点数比率 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual int CnyToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     是否启用 |     ///     是否启用 | ||||||
|     /// </summary> |     /// </summary> | ||||||
| @@ -14,6 +22,22 @@ public record Sys_Config : VersionEntity, IFieldEnabled | |||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
|     public virtual bool Enabled { get; init; } |     public virtual bool Enabled { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Trc20收款地址 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(DbType = Chars.FLG_DB_FIELD_TYPE_CHAR_34)] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual string Trc20ReceiptAddress { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     美元兑点数比率 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual int UsdToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     用户注册是否需要人工确认 |     ///     用户注册是否需要人工确认 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|   | |||||||
| @@ -0,0 +1,115 @@ | |||||||
|  | namespace NetAdmin.Domain.DbMaps.Sys; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单表 | ||||||
|  | /// </summary> | ||||||
|  | [Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_DepositOrder))] | ||||||
|  | [SqlIndex( // | ||||||
|  |     $"{Chars.FLG_DB_INDEX_PREFIX}{nameof(ActualPayAmount)}_{nameof(FinishTimestamp)}", $"{nameof(ActualPayAmount)},{nameof(FinishTimestamp)}", true)] | ||||||
|  | [SqlIndex(Chars.FLG_DB_INDEX_PREFIX + nameof(PaymentFinger), nameof(PaymentFinger), true, WhenNotNull = true)] | ||||||
|  | public record Sys_DepositOrder : LiteVersionEntity, IFieldOwner | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     实际支付金额 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual long ActualPayAmount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     订单状态 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual DepositOrderStatues DepositOrderStatus { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     充值点数 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual long DepositPoint { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     完成时间戳 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual long FinishTimestamp { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     归属用户 | ||||||
|  |     /// </summary> | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     [Navigate(nameof(OwnerId))] | ||||||
|  |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     归属部门编号 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     归属用户编号 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual long? OwnerId { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     付款账号 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual string PaidAccount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     付款时间 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual DateTime? PaidTime { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     付款指纹 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual string PaymentFinger { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     支付方式 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual PaymentModes PaymentMode { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     收款账号 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual string ReceiptAccount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     兑点数比率 | ||||||
|  |     /// </summary> | ||||||
|  |     [Column] | ||||||
|  |     [CsvIgnore] | ||||||
|  |     [JsonIgnore] | ||||||
|  |     public virtual int ToPointRate { get; init; } | ||||||
|  | } | ||||||
| @@ -40,7 +40,7 @@ public record Sys_DocCatalog : VersionEntity, IFieldOwner | |||||||
|     public virtual string Name { get; init; } |     public virtual string Name { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -48,7 +48,7 @@ public record Sys_DocCatalog : VersionEntity, IFieldOwner | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -56,7 +56,7 @@ public record Sys_DocCatalog : VersionEntity, IFieldOwner | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ public record Sys_DocContent : VersionEntity, IFieldEnabled, IFieldOwner | |||||||
|     public virtual bool Enabled { get; init; } |     public virtual bool Enabled { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -49,7 +49,7 @@ public record Sys_DocContent : VersionEntity, IFieldEnabled, IFieldOwner | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -57,7 +57,7 @@ public record Sys_DocContent : VersionEntity, IFieldEnabled, IFieldOwner | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ public record Sys_JobRecord : LiteImmutableEntity | |||||||
|     public int HttpStatusCode { get; init; } |     public int HttpStatusCode { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者信息 |     ///     归属信息 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
|   | |||||||
| @@ -66,7 +66,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel | |||||||
|     public virtual string LoginUserName { get; protected init; } |     public virtual string LoginUserName { get; protected init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -74,7 +74,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -82,7 +82,7 @@ public record Sys_LoginLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFiel | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ public record Sys_RequestLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFi | |||||||
|     public virtual int HttpStatusCode { get; init; } |     public virtual int HttpStatusCode { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -84,7 +84,7 @@ public record Sys_RequestLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFi | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -92,7 +92,7 @@ public record Sys_RequestLog : SimpleEntity, IFieldCreatedTime, IFieldOwner, IFi | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister | |||||||
|     public virtual string Avatar { get; init; } |     public virtual string Avatar { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所属部门 |     ///     归属部门 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -84,7 +84,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister | |||||||
|     public Sys_UserProfile Profile { get; init; } |     public Sys_UserProfile Profile { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所属角色 |     ///     归属角色 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ public record Sys_UserWallet : LiteVersionEntity, IFieldOwner | |||||||
|     public virtual long FrozenBalance { get; init; } |     public virtual long FrozenBalance { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -31,7 +31,7 @@ public record Sys_UserWallet : LiteVersionEntity, IFieldOwner | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -39,7 +39,7 @@ public record Sys_UserWallet : LiteVersionEntity, IFieldOwner | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ public record Sys_WalletTrade : ImmutableEntity, IFieldOwner, IFieldSummary | |||||||
|     public virtual long? BusinessOrderNumber { get; init; } |     public virtual long? BusinessOrderNumber { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者 |     ///     归属用户 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|     [JsonIgnore] |     [JsonIgnore] | ||||||
| @@ -39,7 +39,7 @@ public record Sys_WalletTrade : ImmutableEntity, IFieldOwner, IFieldSummary | |||||||
|     public Sys_User Owner { get; init; } |     public Sys_User Owner { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者部门编号 |     ///     归属部门编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
| @@ -47,7 +47,7 @@ public record Sys_WalletTrade : ImmutableEntity, IFieldOwner, IFieldSummary | |||||||
|     public virtual long? OwnerDeptId { get; init; } |     public virtual long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所有者用户编号 |     ///     归属用户编号 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [Column] |     [Column] | ||||||
|     [CsvIgnore] |     [CsvIgnore] | ||||||
|   | |||||||
| @@ -5,10 +5,25 @@ namespace NetAdmin.Domain.Dto.Sys.Config; | |||||||
| /// </summary> | /// </summary> | ||||||
| public record CreateConfigReq : Sys_Config | public record CreateConfigReq : Sys_Config | ||||||
| { | { | ||||||
|  |     /// <inheritdoc cref="Sys_Config.CnyToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     [Range(1, int.MaxValue)] | ||||||
|  |     public override int CnyToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="IFieldEnabled.Enabled" /> |     /// <inheritdoc cref="IFieldEnabled.Enabled" /> | ||||||
|     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|     public override bool Enabled { get; init; } |     public override bool Enabled { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.Trc20ReceiptAddress" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     [Length(34, 34)] | ||||||
|  |     public override string Trc20ReceiptAddress { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.UsdToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     [Range(1, int.MaxValue)] | ||||||
|  |     public override int UsdToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Sys_Config.UserRegisterConfirm" /> |     /// <inheritdoc cref="Sys_Config.UserRegisterConfirm" /> | ||||||
|     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|     public override bool UserRegisterConfirm { get; init; } |     public override bool UserRegisterConfirm { get; init; } | ||||||
|   | |||||||
| @@ -8,6 +8,10 @@ namespace NetAdmin.Domain.Dto.Sys.Config; | |||||||
| /// </summary> | /// </summary> | ||||||
| public record QueryConfigRsp : Sys_Config | public record QueryConfigRsp : Sys_Config | ||||||
| { | { | ||||||
|  |     /// <inheritdoc cref="Sys_Config.CnyToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override int CnyToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="IFieldCreatedTime.CreatedTime" /> |     /// <inheritdoc cref="IFieldCreatedTime.CreatedTime" /> | ||||||
|     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|     public override DateTime CreatedTime { get; init; } |     public override DateTime CreatedTime { get; init; } | ||||||
| @@ -20,6 +24,14 @@ public record QueryConfigRsp : Sys_Config | |||||||
|     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|     public override long Id { get; init; } |     public override long Id { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.Trc20ReceiptAddress" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override string Trc20ReceiptAddress { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.UsdToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override int UsdToPointRate { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Sys_Config.UserRegisterConfirm" /> |     /// <inheritdoc cref="Sys_Config.UserRegisterConfirm" /> | ||||||
|     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|     public override bool UserRegisterConfirm { get; init; } |     public override bool UserRegisterConfirm { get; init; } | ||||||
|   | |||||||
| @@ -0,0 +1,36 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     请求:创建充值订单 | ||||||
|  | /// </summary> | ||||||
|  | public record CreateDepositOrderReq : Sys_DepositOrder, IValidatableObject | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.ActualPayAmount" /> | ||||||
|  |     public override long ActualPayAmount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.DepositOrderStatus" /> | ||||||
|  |     public override DepositOrderStatues DepositOrderStatus { get; init; } = DepositOrderStatues.WaitingForPayment; | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.DepositPoint" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     [Range(100, long.MaxValue)] | ||||||
|  |     public override long DepositPoint { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.PaymentMode" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     [EnumDataType(typeof(PaymentModes))] | ||||||
|  |     public override PaymentModes PaymentMode { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.ToPointRate" /> | ||||||
|  |     public override int ToPointRate { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) | ||||||
|  |     { | ||||||
|  |         if (PaymentMode != PaymentModes.USDT) { | ||||||
|  |             yield return new ValidationResult(Ln.支付方式不正确, [nameof(PaymentMode)]); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         yield return ValidationResult.Success; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     请求:编辑充值订单 | ||||||
|  | /// </summary> | ||||||
|  | public record EditDepositOrderReq : CreateDepositOrderReq | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="EntityBase{T}.Id" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Id { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldVersion.Version" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Version { get; init; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,19 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     响应:查询充值订单 | ||||||
|  | /// </summary> | ||||||
|  | public sealed record GetDepositConfigRsp : Sys_Config | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="Sys_Config.CnyToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override int CnyToPointRate { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.Trc20ReceiptAddress" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override string Trc20ReceiptAddress { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_Config.UsdToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override int UsdToPointRate { get; init; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,11 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     请求:支付确认 | ||||||
|  | /// </summary> | ||||||
|  | public record PayConfirmReq : Sys_DepositOrder | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="EntityBase{T}.Id" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Id { get; init; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,11 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     请求:查询充值订单 | ||||||
|  | /// </summary> | ||||||
|  | public sealed record QueryDepositOrderReq : Sys_DepositOrder | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="EntityBase{T}.Id" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Id { get; init; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,73 @@ | |||||||
|  | using NetAdmin.Domain.Dto.Sys.User; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     响应:查询充值订单 | ||||||
|  | /// </summary> | ||||||
|  | public record QueryDepositOrderRsp : Sys_DepositOrder | ||||||
|  | { | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.ActualPayAmount" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long ActualPayAmount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldCreatedTime.CreatedTime" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override DateTime CreatedTime { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.DepositOrderStatus" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override DepositOrderStatues DepositOrderStatus { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.DepositPoint" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long DepositPoint { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="EntityBase{T}.Id" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Id { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldModifiedTime.ModifiedTime" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override DateTime? ModifiedTime { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.Owner" /> | ||||||
|  |     [CsvIgnore] | ||||||
|  |     public new virtual QueryUserRsp Owner { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldOwner.OwnerDeptId" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override long? OwnerDeptId { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldOwner.OwnerId" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override long? OwnerId { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.PaidAccount" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override string PaidAccount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.PaidTime" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override DateTime? PaidTime { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.PaymentFinger" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override string PaymentFinger { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.PaymentMode" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override PaymentModes PaymentMode { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.ReceiptAccount" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  |     public override string ReceiptAccount { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="Sys_DepositOrder.ToPointRate" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override int ToPointRate { get; init; } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc cref="IFieldVersion.Version" /> | ||||||
|  |     [JsonIgnore(Condition = JsonIgnoreCondition.Never)] | ||||||
|  |     public override long Version { get; init; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | namespace NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     请求:到账确认 | ||||||
|  | /// </summary> | ||||||
|  | public record ReceivedConfirmationReq : DataAbstraction | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     读取前n条记录 | ||||||
|  |     /// </summary> | ||||||
|  |     public int ReadRecordCount { get; init; } | ||||||
|  | } | ||||||
| @@ -19,10 +19,10 @@ public sealed record ExportUserRsp : QueryUserRsp | |||||||
|     public override QueryDeptRsp Dept { get; init; } |     public override QueryDeptRsp Dept { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所属部门 |     ///     归属部门 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIndex(5)] |     [CsvIndex(5)] | ||||||
|     [CsvName(nameof(Ln.所属部门))] |     [CsvName(nameof(Ln.归属部门))] | ||||||
|     public string DeptName { get; init; } |     public string DeptName { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
| @@ -56,10 +56,10 @@ public sealed record ExportUserRsp : QueryUserRsp | |||||||
|     public override string Mobile { get; init; } |     public override string Mobile { get; init; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     所属角色 |     ///     归属角色 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [CsvIndex(4)] |     [CsvIndex(4)] | ||||||
|     [CsvName(nameof(Ln.所属角色))] |     [CsvName(nameof(Ln.归属角色))] | ||||||
|     public string RoleNames { get; init; } |     public string RoleNames { get; init; } | ||||||
|  |  | ||||||
|     /// <inheritdoc /> |     /// <inheritdoc /> | ||||||
|   | |||||||
| @@ -10,6 +10,11 @@ public abstract record ApiClientOptions : OptionAbstraction | |||||||
|     /// </summary> |     /// </summary> | ||||||
|     public string Gateway { get; set; } |     public string Gateway { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     超时时间 | ||||||
|  |     /// </summary> | ||||||
|  |     public int TimeoutSecs { get; set; } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     密钥 |     ///     密钥 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|   | |||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | using NetAdmin.Infrastructure.Configuration.Dependency; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.Infrastructure.Configuration.Options; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     TronScan 配置 | ||||||
|  | /// </summary> | ||||||
|  | public sealed record TronScanOptions : ApiClientOptions; | ||||||
| @@ -18,6 +18,7 @@ public static class Chars | |||||||
|     public const string FLG_DB_EXCEPTION_IDX                           = "idx_"; |     public const string FLG_DB_EXCEPTION_IDX                           = "idx_"; | ||||||
|     public const string FLG_DB_EXCEPTION_PRIMARY_KEY_CONFLICT          = "PRIMARY KEY"; |     public const string FLG_DB_EXCEPTION_PRIMARY_KEY_CONFLICT          = "PRIMARY KEY"; | ||||||
|     public const string FLG_DB_EXCEPTION_UNIQUE_CONSTRAINT_CONFLICT    = "UNIQUE constraint"; |     public const string FLG_DB_EXCEPTION_UNIQUE_CONSTRAINT_CONFLICT    = "UNIQUE constraint"; | ||||||
|  |     public const string FLG_DB_FIELD_TYPE_CHAR_34                      = "char(34)"; | ||||||
|     public const string FLG_DB_FIELD_TYPE_NVARCHAR                     = "nvarchar"; |     public const string FLG_DB_FIELD_TYPE_NVARCHAR                     = "nvarchar"; | ||||||
|     public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022                = "nvarchar(1022)"; |     public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022                = "nvarchar(1022)"; | ||||||
|     public const string FLG_DB_FIELD_TYPE_NVARCHAR_127                 = "nvarchar(127)"; |     public const string FLG_DB_FIELD_TYPE_NVARCHAR_127                 = "nvarchar(127)"; | ||||||
| @@ -53,6 +54,7 @@ public static class Chars | |||||||
|     public const string FLG_HTTP_HEADER_KEY_ACCESS_TOKEN               = "ACCESS-TOKEN"; |     public const string FLG_HTTP_HEADER_KEY_ACCESS_TOKEN               = "ACCESS-TOKEN"; | ||||||
|     public const string FLG_HTTP_HEADER_KEY_AUTHORIZATION              = "Authorization"; |     public const string FLG_HTTP_HEADER_KEY_AUTHORIZATION              = "Authorization"; | ||||||
|     public const string FLG_HTTP_HEADER_KEY_REFERER                    = "Referer"; |     public const string FLG_HTTP_HEADER_KEY_REFERER                    = "Referer"; | ||||||
|  |     public const string FLG_HTTP_HEADER_KEY_TRON_PRO_API_KEY           = "TRON-PRO-API-KEY"; | ||||||
|     public const string FLG_HTTP_HEADER_KEY_USER_AGENT                 = "User-Agent"; |     public const string FLG_HTTP_HEADER_KEY_USER_AGENT                 = "User-Agent"; | ||||||
|     public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN             = "X-ACCESS-TOKEN"; |     public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN             = "X-ACCESS-TOKEN"; | ||||||
|     public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN_HEADER_KEY  = "X-Authorization"; |     public const string FLG_HTTP_HEADER_KEY_X_ACCESS_TOKEN_HEADER_KEY  = "X-Authorization"; | ||||||
|   | |||||||
| @@ -28,5 +28,6 @@ public static class Numbers | |||||||
|     public const int  SECS_CACHE_LOGIN_BY_USER_ID    = 3600 * 24 * 30;  // 缓存时间(秒):通过用户编号登录的用户信息 |     public const int  SECS_CACHE_LOGIN_BY_USER_ID    = 3600 * 24 * 30;  // 缓存时间(秒):通过用户编号登录的用户信息 | ||||||
|     public const int  SECS_REDIS_LOCK_EXPIRY         = 60;              // 秒:Redis锁过期时间 |     public const int  SECS_REDIS_LOCK_EXPIRY         = 60;              // 秒:Redis锁过期时间 | ||||||
|     public const int  SECS_REDIS_LOCK_RETRY_DELAY    = 1;               // 秒:Redis锁重试间隔 |     public const int  SECS_REDIS_LOCK_RETRY_DELAY    = 1;               // 秒:Redis锁重试间隔 | ||||||
|  |     public const int  SECS_TIMEOUT_HTTP_CLIENT       = 15;              // 超时时间(秒):HTTP 客户端 | ||||||
|     public const int  SECS_TIMEOUT_JOB               = 180;             // 超时时间(秒):作业 |     public const int  SECS_TIMEOUT_JOB               = 180;             // 超时时间(秒):作业 | ||||||
| } | } | ||||||
| @@ -0,0 +1,38 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Enums; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单状态 | ||||||
|  | /// </summary> | ||||||
|  | [Export] | ||||||
|  | public enum DepositOrderStatues | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     等待支付 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.等待支付))] | ||||||
|  |     WaitingForPayment = 1 | ||||||
|  |  | ||||||
|  |    , | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     到账确认中 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.到账确认中))] | ||||||
|  |     PaymentConfirming = 2 | ||||||
|  |  | ||||||
|  |    , | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     充值成功 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.充值成功))] | ||||||
|  |     Succeeded = 3 | ||||||
|  |  | ||||||
|  |    , | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     支付超时 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.支付超时))] | ||||||
|  |     PaymentTimeout = 4 | ||||||
|  | } | ||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Enums; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     支付方式 | ||||||
|  | /// </summary> | ||||||
|  | [Export] | ||||||
|  | public enum PaymentModes | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     USDT | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.USDT))] | ||||||
|  |     USDT = 1 | ||||||
|  |  | ||||||
|  |    , | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     支付宝 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.支付宝))] | ||||||
|  |     Alipay = 2 | ||||||
|  |  | ||||||
|  |    , | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     微信支付 | ||||||
|  |     /// </summary> | ||||||
|  |     [ResourceDescription<Ln>(nameof(Ln.微信支付))] | ||||||
|  |     WeChat = 3 | ||||||
|  | } | ||||||
| @@ -10,7 +10,7 @@ public enum TradeDirections | |||||||
|     ///     收入 |     ///     收入 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [ResourceDescription<Ln>(nameof(Ln.收入))] |     [ResourceDescription<Ln>(nameof(Ln.收入))] | ||||||
|     Income = 4 |     Income = 1 | ||||||
|  |  | ||||||
|    , |    , | ||||||
|  |  | ||||||
| @@ -18,5 +18,5 @@ public enum TradeDirections | |||||||
|     ///     支出 |     ///     支出 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     [ResourceDescription<Ln>(nameof(Ln.支出))] |     [ResourceDescription<Ln>(nameof(Ln.支出))] | ||||||
|     Expense = 5 |     Expense = 2 | ||||||
| } | } | ||||||
| @@ -0,0 +1,43 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     云码平台 客户端 | ||||||
|  | /// </summary> | ||||||
|  | public interface ITronScanClient : IHttpDispatchProxy | ||||||
|  | { | ||||||
|  |     private static readonly ILogger<ITronScanClient> _logger = App.GetService<ILogger<ITronScanClient>>(); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     异常拦截 | ||||||
|  |     /// </summary> | ||||||
|  |     [Interceptor(InterceptorTypes.Exception)] | ||||||
|  |     static Task OnExceptionAsync(HttpClient _, HttpResponseMessage rsp, string errors) | ||||||
|  |     { | ||||||
|  |         return rsp.LogExceptionAsync(errors, _logger); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     请求拦截 | ||||||
|  |     /// </summary> | ||||||
|  |     [Interceptor(InterceptorTypes.Request)] | ||||||
|  |     static Task OnRequestAsyncAsync(HttpClient _, HttpRequestMessage req) | ||||||
|  |     { | ||||||
|  |         return req.LogAsync(_logger); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     响应拦截 | ||||||
|  |     /// </summary> | ||||||
|  |     [Interceptor(InterceptorTypes.Response)] | ||||||
|  |     static Task OnResponsingAsync(HttpClient _, HttpResponseMessage rsp) | ||||||
|  |     { | ||||||
|  |         return rsp.LogAsync(_logger); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取交易记录 | ||||||
|  |     /// </summary> | ||||||
|  |     [Client(nameof(TronScanOptions))] | ||||||
|  |     [Get("api/filter/trc20/transfers?limit={limit}&toAddress={toAddress}")] | ||||||
|  |     Task<TransfersRsp> TransfersAsync([Headers(Chars.FLG_HTTP_HEADER_KEY_TRON_PRO_API_KEY)] string token, int limit, string toAddress); | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     表示一个普通的地址信息记录。 | ||||||
|  | /// </summary> | ||||||
|  | /// <remarks> | ||||||
|  | ///     该记录包含一个布尔值属性,用于指示地址是否存在风险。 | ||||||
|  | /// </remarks> | ||||||
|  | public record NormalAddressInfo | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置地址是否存在风险的标识。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool Risk { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,57 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     表示一个令牌的信息,包括发行者地址、令牌缩写、显示属性等详细信息。 | ||||||
|  | /// </summary> | ||||||
|  | public record TokenInfo | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置发行者的地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string IssuerAddr { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的缩写。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenAbbr { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌可显示的数量。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int TokenCanShow { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的小数位数。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int TokenDecimal { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的唯一标识符。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenId { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的级别。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenLevel { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的Logo URL或路径。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenLogo { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的名称。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenName { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌的类型。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string TokenType { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置是否为VIP令牌。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool Vip { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,116 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     表示一个代币转账事件。 | ||||||
|  | /// </summary> | ||||||
|  | public record TokenTransferInfo | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置批准的转账金额。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("approval_amount")] | ||||||
|  |     public string ApprovalAmount { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置发生转账事件的区块编号。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int Block { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置发生转账事件的区块的时间戳。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("block_ts")] | ||||||
|  |     public long BlockTs { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置一个值,指示转账是否已确认。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool Confirmed { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置代币的合约地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("contract_address")] | ||||||
|  |     public string ContractAddress { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约执行的返回结果。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string ContractRet { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约类型。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("contract_type")] | ||||||
|  |     public string ContractType { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置事件类型。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("event_type")] | ||||||
|  |     public string EventType { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置转账的最终结果。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string FinalResult { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置发送方地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("from_address")] | ||||||
|  |     public string FromAddress { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置一个值,指示发送方地址是否为合约地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool FromAddressIsContract { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置转账数量。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Quant { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置一个值,指示转账是否已回滚。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool Revert { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置一个值,指示转账是否为风险交易。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool RiskTransaction { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置转账状态。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int Status { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置接收方地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("to_address")] | ||||||
|  |     public string ToAddress { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置一个值,指示接收方地址是否为合约地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     public bool ToAddressIsContract { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置代币信息。 | ||||||
|  |     /// </summary> | ||||||
|  |     public TokenInfo TokenInfo { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置交易ID。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("transaction_id")] | ||||||
|  |     public string TransactionId { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约触发信息。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("trigger_info")] | ||||||
|  |     public TriggerInfo TriggerInfo { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     表示包含合约信息及相关数据的根响应对象。 | ||||||
|  | /// </summary> | ||||||
|  | public record TransfersRsp | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置按地址键入的正常地址信息字典。 | ||||||
|  |     /// </summary> | ||||||
|  |     public Dictionary<string, NormalAddressInfo> NormalAddressInfo { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置范围内的项目总数。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int RangeTotal { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置令牌转账列表。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("token_transfers")] | ||||||
|  |     public IReadOnlyCollection<TokenTransferInfo> TokenTransfers { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置项目的总数。 | ||||||
|  |     /// </summary> | ||||||
|  |     public int Total { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | namespace NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     表示触发智能合约的信息。 | ||||||
|  | /// </summary> | ||||||
|  | public record TriggerInfo | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置调用合约时传递的值。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("call_value")] | ||||||
|  |     public int CallValue { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约的地址。 | ||||||
|  |     /// </summary> | ||||||
|  |     [JsonPropertyName("contract_address")] | ||||||
|  |     public string ContractAddress { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置调用合约方法的数据。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Data { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约方法的标识符。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string Method { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取或设置合约方法的名称。 | ||||||
|  |     /// </summary> | ||||||
|  |     public string MethodName { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | using NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.SysComponent.Application.Modules.Sys; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单模块 | ||||||
|  | /// </summary> | ||||||
|  | public interface IDepositOrderModule : ICrudModule<CreateDepositOrderReq, QueryDepositOrderRsp // 创建类型 | ||||||
|  |   , EditDepositOrderReq                                                                        // 编辑类型 | ||||||
|  |   , QueryDepositOrderReq, QueryDepositOrderRsp                                                 // 查询类型 | ||||||
|  |   , DelReq                                                                                     // 删除类型 | ||||||
|  | > | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取充值配置 | ||||||
|  |     /// </summary> | ||||||
|  |     Task<GetDepositConfigRsp> GetDepositConfigAsync(); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     支付确认 | ||||||
|  |     /// </summary> | ||||||
|  |     Task<int> PayConfirmAsync(PayConfirmReq req); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     到账确认 | ||||||
|  |     /// </summary> | ||||||
|  |     Task<int> ReceivedConfirmationAsync(ReceivedConfirmationReq req); | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单服务 | ||||||
|  | /// </summary> | ||||||
|  | public interface IDepositOrderService : IService, IDepositOrderModule; | ||||||
| @@ -0,0 +1,235 @@ | |||||||
|  | using NetAdmin.Application.Extensions; | ||||||
|  | using NetAdmin.Domain.DbMaps.Sys; | ||||||
|  | using NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  | using NetAdmin.Domain.Dto.Sys.WalletTrade; | ||||||
|  | using NetAdmin.Domain.Extensions; | ||||||
|  | using NetAdmin.Infrastructure.Rpc.TronScan; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.SysComponent.Application.Services.Sys; | ||||||
|  |  | ||||||
|  | /// <inheritdoc cref="IDepositOrderService" /> | ||||||
|  | public sealed class DepositOrderService(BasicRepository<Sys_DepositOrder, long> rpo) // | ||||||
|  |     : RepositoryService<Sys_DepositOrder, long, IDepositOrderService>(rpo), IDepositOrderService | ||||||
|  | { | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<int> BulkDeleteAsync(BulkReq<DelReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var ret = 0; | ||||||
|  |  | ||||||
|  |         // ReSharper disable once LoopCanBeConvertedToQuery | ||||||
|  |         foreach (var item in req.Items) { | ||||||
|  |             ret += await DeleteAsync(item).ConfigureAwait(false); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<long> CountAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         return QueryInternal(req).WithNoLockNoWait().CountAsync(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<IOrderedEnumerable<KeyValuePair<IImmutableDictionary<string, string>, int>>> CountByAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var ret = await QueryInternal(req with { Order = Orders.None }) | ||||||
|  |                         .WithNoLockNoWait() | ||||||
|  |                         .GroupBy(req.GetToListExp<Sys_DepositOrder>()) | ||||||
|  |                         .ToDictionaryAsync(a => a.Count()) | ||||||
|  |                         .ConfigureAwait(false); | ||||||
|  |         return ret.Select(x => new KeyValuePair<IImmutableDictionary<string, string>, int>( | ||||||
|  |                               req.RequiredFields.ToImmutableDictionary( | ||||||
|  |                                   y => y, y => typeof(Sys_DepositOrder).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value)) | ||||||
|  |                   .Where(x => x.Key.Any(y => !y.Value.NullOrEmpty())) | ||||||
|  |                   .OrderByDescending(x => x.Value); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <exception cref="ArgumentOutOfRangeException">req</exception> | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<QueryDepositOrderRsp> CreateAsync(CreateDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |  | ||||||
|  |         var config = await GetDepositConfigAsync().ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |         var toPointRate = req.PaymentMode switch { | ||||||
|  |                               PaymentModes.USDT   => config.UsdToPointRate | ||||||
|  |                             , PaymentModes.Alipay => config.CnyToPointRate | ||||||
|  |                             , PaymentModes.WeChat => config.CnyToPointRate | ||||||
|  |                             , _                   => throw new ArgumentOutOfRangeException(nameof(req)) | ||||||
|  |                           }; | ||||||
|  |  | ||||||
|  |         var ret = await Rpo.InsertAsync(req with { | ||||||
|  |                                                      ActualPayAmount = (long)(((decimal)req.DepositPoint / toPointRate).Round(3) * 1000) | ||||||
|  |                                                    , ToPointRate = toPointRate | ||||||
|  |                                                    , ReceiptAccount = config.Trc20ReceiptAddress | ||||||
|  |                                                  }) | ||||||
|  |                            .ConfigureAwait(false); | ||||||
|  |         return ret.Adapt<QueryDepositOrderRsp>(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> DeleteAsync(DelReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         return Rpo.DeleteAsync(a => a.Id == req.Id); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<QueryDepositOrderRsp> EditAsync(EditDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         #if DBTYPE_SQLSERVER | ||||||
|  |         return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt<QueryDepositOrderRsp>(); | ||||||
|  |         #else | ||||||
|  |         return await UpdateAsync(req).ConfigureAwait(false) > 0 | ||||||
|  |             ? await GetAsync(new QueryDepositOrderReq { Id = req.Id }).ConfigureAwait(false) | ||||||
|  |             : null; | ||||||
|  |         #endif | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<IActionResult> ExportAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         return ExportAsync<QueryDepositOrderReq, QueryDepositOrderRsp>(QueryInternal, req, Ln.充值订单导出); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<QueryDepositOrderRsp> GetAsync(QueryDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var ret = await QueryInternal(new QueryReq<QueryDepositOrderReq> { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); | ||||||
|  |         return ret.Adapt<QueryDepositOrderRsp>(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<GetDepositConfigRsp> GetDepositConfigAsync() | ||||||
|  |     { | ||||||
|  |         var ret = await S<IConfigService>().GetLatestConfigAsync().ConfigureAwait(false); | ||||||
|  |         return ret.Adapt<GetDepositConfigRsp>(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<PagedQueryRsp<QueryDepositOrderRsp>> PagedQueryAsync(PagedQueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var list = await QueryInternal(req) | ||||||
|  |                          .Include(a => a.Owner) | ||||||
|  |                          .Page(req.Page, req.PageSize) | ||||||
|  |                          .WithNoLockNoWait() | ||||||
|  |                          .Count(out var total) | ||||||
|  |                          .ToListAsync(req) | ||||||
|  |                          .ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |         return new PagedQueryRsp<QueryDepositOrderRsp>(req.Page, req.PageSize, total, list.Adapt<IEnumerable<QueryDepositOrderRsp>>()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> PayConfirmAsync(PayConfirmReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         return UpdateAsync(req with { DepositOrderStatus = DepositOrderStatues.PaymentConfirming }, [nameof(req.DepositOrderStatus)], null | ||||||
|  |                          , a => a.DepositOrderStatus == DepositOrderStatues.WaitingForPayment && a.Id == req.Id, null, true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<IEnumerable<QueryDepositOrderRsp>> QueryAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var ret = await QueryInternal(req).WithNoLockNoWait().Take(req.Count).ToListAsync(req).ConfigureAwait(false); | ||||||
|  |         return ret.Adapt<IEnumerable<QueryDepositOrderRsp>>(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public async Task<int> ReceivedConfirmationAsync(ReceivedConfirmationReq req) | ||||||
|  |     { | ||||||
|  |         req.ThrowIfInvalid(); | ||||||
|  |         var ret    = 0; | ||||||
|  |         var config = await S<IConfigService>().GetLatestConfigAsync().ConfigureAwait(false); | ||||||
|  |         var waitConfirmList = (await QueryAsync(new QueryReq<QueryDepositOrderReq> { | ||||||
|  |                                                                                        Count = Numbers.MAX_LIMIT_QUERY_PAGE_SIZE | ||||||
|  |                                                                                      , DynamicFilter | ||||||
|  |                                                                                            = new DynamicFilterInfo { | ||||||
|  |                                                                                                  Field = nameof( | ||||||
|  |                                                                                                      QueryDepositOrderReq.DepositOrderStatus) | ||||||
|  |                                                                                                , Operator = DynamicFilterOperators.Eq | ||||||
|  |                                                                                                , Value    = DepositOrderStatues.PaymentConfirming | ||||||
|  |                                                                                              } | ||||||
|  |                                                                                      , Order = Orders.Ascending | ||||||
|  |                                                                                      , Prop  = nameof(QueryDepositOrderReq.Id) | ||||||
|  |                                                                                    }) | ||||||
|  |             .ConfigureAwait(false)).ToList(); | ||||||
|  |         var apiResult = await S<ITronScanClient>() | ||||||
|  |                               .TransfersAsync(S<IOptions<TronScanOptions>>().Value.Token, req.ReadRecordCount, config.Trc20ReceiptAddress) | ||||||
|  |                               .ConfigureAwait(false); | ||||||
|  |         foreach (var apiItem in apiResult.TokenTransfers.Where(x => x.TokenInfo.TokenAbbr == "USDT" && x.Confirmed && x.ContractRet == "SUCCESS" && | ||||||
|  |                                                                     x.FinalResult         == "SUCCESS")) { | ||||||
|  |             var order = waitConfirmList.SingleOrDefault(x => x.ActualPayAmount == apiItem.Quant.Int64() / 1000); | ||||||
|  |             if (order == null || order.CreatedTime > apiItem.BlockTs.Time()) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             try { | ||||||
|  |                 await S<UnitOfWorkManager>() | ||||||
|  |                       .AtomicOperateAsync(async () => { | ||||||
|  |                           var updated = await UpdateAsync( // | ||||||
|  |                                   new Sys_DepositOrder { | ||||||
|  |                                                            DepositOrderStatus = DepositOrderStatues.Succeeded | ||||||
|  |                                                          , Version = order.Version | ||||||
|  |                                                          , FinishTimestamp = DateTime.Now.TimeUnixUtcMs() | ||||||
|  |                                                          , PaidAccount = apiItem.FromAddress | ||||||
|  |                                                          , PaidTime = apiItem.BlockTs.Time() | ||||||
|  |                                                          , PaymentFinger = apiItem.TransactionId | ||||||
|  |                                                        }, [nameof(Sys_DepositOrder.DepositOrderStatus), nameof(Sys_DepositOrder.FinishTimestamp), nameof(Sys_DepositOrder.PaidAccount), nameof(Sys_DepositOrder.PaidTime), nameof(Sys_DepositOrder.PaymentFinger)] | ||||||
|  |                                 , null, a => a.Id == order.Id && a.DepositOrderStatus == DepositOrderStatues.PaymentConfirming) | ||||||
|  |                               .ConfigureAwait(false); | ||||||
|  |                           if (updated != 1) { | ||||||
|  |                               throw new NetAdminUnexpectedException(Ln.结果非预期); | ||||||
|  |                           } | ||||||
|  |  | ||||||
|  |                           _ = await S<IWalletTradeService>() | ||||||
|  |                                     .CreateAsync(new CreateWalletTradeReq { | ||||||
|  |                                                                               Amount              = order.DepositPoint | ||||||
|  |                                                                             , BusinessOrderNumber = order.Id | ||||||
|  |                                                                             , TradeDirection      = TradeDirections.Income | ||||||
|  |                                                                             , TradeType           = TradeTypes.SelfDeposit | ||||||
|  |                                                                             , OwnerId             = order.OwnerId | ||||||
|  |                                                                           }) | ||||||
|  |                                     .ConfigureAwait(false) ?? throw new NetAdminUnexpectedException(Ln.结果非预期); | ||||||
|  |                       }) | ||||||
|  |                       .ConfigureAwait(false); | ||||||
|  |                 ret++; | ||||||
|  |             } | ||||||
|  |             catch { | ||||||
|  |                 // ignore | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private ISelect<Sys_DepositOrder> QueryInternal(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); | ||||||
|  |  | ||||||
|  |         // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault | ||||||
|  |         switch (req.Order) { | ||||||
|  |             case Orders.None: | ||||||
|  |                 return ret; | ||||||
|  |             case Orders.Random: | ||||||
|  |                 return ret.OrderByRandom(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); | ||||||
|  |         if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) { | ||||||
|  |             ret = ret.OrderByDescending(a => a.Id); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return ret; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace NetAdmin.SysComponent.Cache.Sys.Dependency; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单缓存 | ||||||
|  | /// </summary> | ||||||
|  | public interface IDepositOrderCache : ICache<IDistributedCache, IDepositOrderService>, IDepositOrderModule; | ||||||
| @@ -0,0 +1,86 @@ | |||||||
|  | using NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.SysComponent.Cache.Sys; | ||||||
|  |  | ||||||
|  | /// <inheritdoc cref="IDepositOrderCache" /> | ||||||
|  | public sealed class DepositOrderCache(IDistributedCache cache, IDepositOrderService service) | ||||||
|  |     : DistributedCache<IDepositOrderService>(cache, service), IScoped, IDepositOrderCache | ||||||
|  | { | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> BulkDeleteAsync(BulkReq<DelReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.BulkDeleteAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<long> CountAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.CountAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<IOrderedEnumerable<KeyValuePair<IImmutableDictionary<string, string>, int>>> CountByAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.CountByAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<QueryDepositOrderRsp> CreateAsync(CreateDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Service.CreateAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> DeleteAsync(DelReq req) | ||||||
|  |     { | ||||||
|  |         return Service.DeleteAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<QueryDepositOrderRsp> EditAsync(EditDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Service.EditAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<IActionResult> ExportAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.ExportAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<QueryDepositOrderRsp> GetAsync(QueryDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Service.GetAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<GetDepositConfigRsp> GetDepositConfigAsync() | ||||||
|  |     { | ||||||
|  |         return Service.GetDepositConfigAsync(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<PagedQueryRsp<QueryDepositOrderRsp>> PagedQueryAsync(PagedQueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.PagedQueryAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> PayConfirmAsync(PayConfirmReq req) | ||||||
|  |     { | ||||||
|  |         return Service.PayConfirmAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<IEnumerable<QueryDepositOrderRsp>> QueryAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Service.QueryAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <inheritdoc /> | ||||||
|  |     public Task<int> ReceivedConfirmationAsync(ReceivedConfirmationReq req) | ||||||
|  |     { | ||||||
|  |         return Service.ReceivedConfirmationAsync(req); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,122 @@ | |||||||
|  | using NetAdmin.Domain.Dto.Sys.DepositOrder; | ||||||
|  |  | ||||||
|  | namespace NetAdmin.SysComponent.Host.Controllers.Sys; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     充值订单服务 | ||||||
|  | /// </summary> | ||||||
|  | [ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] | ||||||
|  | [Produces(Chars.FLG_HTTP_HEADER_VALUE_APPLICATION_JSON)] | ||||||
|  | public sealed class DepositOrderController(IDepositOrderCache cache) | ||||||
|  |     : ControllerBase<IDepositOrderCache, IDepositOrderService>(cache), IDepositOrderModule | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     批量删除充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [Transaction] | ||||||
|  |     public Task<int> BulkDeleteAsync(BulkReq<DelReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.BulkDeleteAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     充值订单计数 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<long> CountAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.CountAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     充值订单分组计数 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<IOrderedEnumerable<KeyValuePair<IImmutableDictionary<string, string>, int>>> CountByAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.CountByAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     创建充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [Transaction] | ||||||
|  |     public Task<QueryDepositOrderRsp> CreateAsync(CreateDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.CreateAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     删除充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [Transaction] | ||||||
|  |     public Task<int> DeleteAsync(DelReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.DeleteAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     编辑充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [Transaction] | ||||||
|  |     public Task<QueryDepositOrderRsp> EditAsync(EditDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.EditAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     导出充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [NonAction] | ||||||
|  |     public Task<IActionResult> ExportAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.ExportAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取单个充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<QueryDepositOrderRsp> GetAsync(QueryDepositOrderReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.GetAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取充值配置 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<GetDepositConfigRsp> GetDepositConfigAsync() | ||||||
|  |     { | ||||||
|  |         return Cache.GetDepositConfigAsync(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     分页查询充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<PagedQueryRsp<QueryDepositOrderRsp>> PagedQueryAsync(PagedQueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.PagedQueryAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     支付确认 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<int> PayConfirmAsync(PayConfirmReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.PayConfirmAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     查询充值订单 | ||||||
|  |     /// </summary> | ||||||
|  |     [NonAction] | ||||||
|  |     public Task<IEnumerable<QueryDepositOrderRsp>> QueryAsync(QueryReq<QueryDepositOrderReq> req) | ||||||
|  |     { | ||||||
|  |         return Cache.QueryAsync(req); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     到账确认 | ||||||
|  |     /// </summary> | ||||||
|  |     public Task<int> ReceivedConfirmationAsync(ReceivedConfirmationReq req) | ||||||
|  |     { | ||||||
|  |         return Cache.ReceivedConfirmationAsync(req); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -3,6 +3,7 @@ using NetAdmin.Domain.Contexts; | |||||||
| using NetAdmin.Domain.Events; | using NetAdmin.Domain.Events; | ||||||
| using NetAdmin.Host.Filters; | using NetAdmin.Host.Filters; | ||||||
| using NetAdmin.Host.Middlewares; | using NetAdmin.Host.Middlewares; | ||||||
|  | using NetAdmin.Infrastructure.Configuration.Dependency; | ||||||
| using NetAdmin.Infrastructure.Schedule; | using NetAdmin.Infrastructure.Schedule; | ||||||
| using NetAdmin.SysComponent.Host.Utils; | using NetAdmin.SysComponent.Host.Utils; | ||||||
| using FreeSqlBuilder = NetAdmin.Infrastructure.Utils.FreeSqlBuilder; | using FreeSqlBuilder = NetAdmin.Infrastructure.Utils.FreeSqlBuilder; | ||||||
| @@ -104,6 +105,31 @@ public static class ServiceCollectionExtensions | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     添加 TronScan 客户端 | ||||||
|  |     /// </summary> | ||||||
|  |     public static IServiceCollection AddTronScanClient(this IServiceCollection me) | ||||||
|  |     { | ||||||
|  |         _ = me.AddHttpClient(nameof(TronScanOptions), ConfigClient<TronScanOptions>); | ||||||
|  |         return me; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static void ConfigClient<T>(HttpClient client) | ||||||
|  |         where T : ApiClientOptions, new() | ||||||
|  |     { | ||||||
|  |         ConfigClient<T>(client, Numbers.SECS_TIMEOUT_HTTP_CLIENT); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static void ConfigClient<T>(HttpClient client, int timeoutSecs) | ||||||
|  |         where T : ApiClientOptions, new() | ||||||
|  |     { | ||||||
|  |         var options = App.GetOptions<T>(); | ||||||
|  |  | ||||||
|  |         client.Timeout = TimeSpan.FromSeconds(options.TimeoutSecs > 0 ? options.TimeoutSecs : timeoutSecs); | ||||||
|  |         client.DefaultRequestHeaders.Add("User-Agent", nameof(NetAdmin)); | ||||||
|  |         client.BaseAddress = new Uri($"{options.Gateway}/"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private static void RunJob(IEnumerable<KeyValuePair<Type, JobConfigAttribute>> jobTypes) |     private static void RunJob(IEnumerable<KeyValuePair<Type, JobConfigAttribute>> jobTypes) | ||||||
|     { |     { | ||||||
|         foreach (var job in jobTypes) { |         foreach (var job in jobTypes) { | ||||||
|   | |||||||
| @@ -149,7 +149,7 @@ public sealed class SqlAuditor : ISingleton | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     设置所有者 |     ///     设置归属 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     private static void SetOwner(AuditValueEventArgs e, ContextUserInfo userInfo) |     private static void SetOwner(AuditValueEventArgs e, ContextUserInfo userInfo) | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ public sealed class JwtHandler : AppAuthorizeHandler | |||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // 获取所属角色接口权限 进行核对 |             // 获取归属角色接口权限 进行核对 | ||||||
|             if (role.ApiIds?.Contains(path) ?? false) { |             if (role.ApiIds?.Contains(path) ?? false) { | ||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -95,6 +95,7 @@ namespace YourSolution.AdmServer.Host | |||||||
|                         .AddContextUserInfo()  // 添加上下文用户信息 |                         .AddContextUserInfo()  // 添加上下文用户信息 | ||||||
|                         .AddRedisCache()       // 添加 Redis 缓存 |                         .AddRedisCache()       // 添加 Redis 缓存 | ||||||
|                         .AddSchedules()        // 添加计划任务 |                         .AddSchedules()        // 添加计划任务 | ||||||
|  |                         .AddTronScanClient()   // 添加 TronScan 客户端 | ||||||
|  |  | ||||||
|                         // IMvcBuilder |                         // IMvcBuilder | ||||||
|                         .AddControllers()             // 添加控制器 |                         .AddControllers()             // 添加控制器 | ||||||
|   | |||||||
| @@ -94,4 +94,9 @@ | |||||||
|       "Secure": false |       "Secure": false | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|  |   // TronScan 客户端配置 | ||||||
|  |   "TronScan": { | ||||||
|  |     "Gateway": "https://apilist.tronscanapi.com", | ||||||
|  |     "Token": "fc6629dc-0139-4238-bead-8db7c45ec1e2" | ||||||
|  |   }, | ||||||
| } | } | ||||||
| @@ -21,6 +21,7 @@ | |||||||
|         "markdown-it": "14.1.0", |         "markdown-it": "14.1.0", | ||||||
|         "markdown-it-emoji": "3.0.0", |         "markdown-it-emoji": "3.0.0", | ||||||
|         "nprogress": "0.2.0", |         "nprogress": "0.2.0", | ||||||
|  |         "qrcode-svg": "1.1.0", | ||||||
|         "sortablejs": "1.15.6", |         "sortablejs": "1.15.6", | ||||||
|         "vkbeautify": "0.99.3", |         "vkbeautify": "0.99.3", | ||||||
|         "vue": "3.5.17", |         "vue": "3.5.17", | ||||||
|   | |||||||
							
								
								
									
										117
									
								
								src/frontend/admin/src/api/sys/depositorder.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/frontend/admin/src/api/sys/depositorder.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | |||||||
|  | /** | ||||||
|  |  *  充值订单服务 | ||||||
|  |  *  @module @/api/sys/deposit.order | ||||||
|  |  */ | ||||||
|  | import config from '@/config' | ||||||
|  | import http from '@/utils/request' | ||||||
|  | export default { | ||||||
|  |     /** | ||||||
|  |      * 批量删除充值订单 | ||||||
|  |      */ | ||||||
|  |     bulkDelete: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/bulk.delete`, | ||||||
|  |         name: `批量删除充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 充值订单计数 | ||||||
|  |      */ | ||||||
|  |     count: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/count`, | ||||||
|  |         name: `充值订单计数`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 充值订单分组计数 | ||||||
|  |      */ | ||||||
|  |     countBy: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/count.by`, | ||||||
|  |         name: `充值订单分组计数`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建充值订单 | ||||||
|  |      */ | ||||||
|  |     create: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/create`, | ||||||
|  |         name: `创建充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除充值订单 | ||||||
|  |      */ | ||||||
|  |     delete: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/delete`, | ||||||
|  |         name: `删除充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 编辑充值订单 | ||||||
|  |      */ | ||||||
|  |     edit: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/edit`, | ||||||
|  |         name: `编辑充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取单个充值订单 | ||||||
|  |      */ | ||||||
|  |     get: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/get`, | ||||||
|  |         name: `获取单个充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取充值配置 | ||||||
|  |      */ | ||||||
|  |     getDepositConfig: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/get.deposit.config`, | ||||||
|  |         name: `获取充值配置`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询充值订单 | ||||||
|  |      */ | ||||||
|  |     pagedQuery: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/paged.query`, | ||||||
|  |         name: `分页查询充值订单`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付确认 | ||||||
|  |      */ | ||||||
|  |     payConfirm: { | ||||||
|  |         url: `${config.API_URL}/api/sys/deposit.order/pay.confirm`, | ||||||
|  |         name: `支付确认`, | ||||||
|  |         post: async function (data = {}, config = {}) { | ||||||
|  |             return await http.post(this.url, data, config) | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  | } | ||||||
| @@ -188,7 +188,7 @@ | |||||||
|         <scContextmenuItem :title="$t('复制')" command="copy" divided icon="el-icon-copy-document" suffix="C"></scContextmenuItem> |         <scContextmenuItem :title="$t('复制')" command="copy" divided icon="el-icon-copy-document" suffix="C"></scContextmenuItem> | ||||||
|         <scContextmenuItem |         <scContextmenuItem | ||||||
|             v-if="contextOpers.includes('add')" |             v-if="contextOpers.includes('add')" | ||||||
|             :title="$t('新增')" |             :title="$t('新建')" | ||||||
|             command="add" |             command="add" | ||||||
|             divided |             divided | ||||||
|             icon="el-icon-plus" |             icon="el-icon-plus" | ||||||
|   | |||||||
| @@ -90,6 +90,8 @@ export default { | |||||||
|             //         Object.keys(item).forEach((x) => delete item[x]) |             //         Object.keys(item).forEach((x) => delete item[x]) | ||||||
|             //         Object.assign(item, data) |             //         Object.assign(item, data) | ||||||
|             //     }) |             //     }) | ||||||
|  |         } else { | ||||||
|  |             table.refresh() | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
| } | } | ||||||
| @@ -99,9 +99,9 @@ export default { | |||||||
|     性别: 'Gender', |     性别: 'Gender', | ||||||
|     成功: 'Successful', |     成功: 'Successful', | ||||||
|     我的消息: 'My messages', |     我的消息: 'My messages', | ||||||
|     所属字典: 'Dictionary', |     归属字典: 'Dictionary', | ||||||
|     所属角色: 'Role', |     归属角色: 'Role', | ||||||
|     所属部门: 'Department', |     归属部门: 'Department', | ||||||
|     手机号: 'Mobile', |     手机号: 'Mobile', | ||||||
|     手机号码: 'Mobile phone number', |     手机号码: 'Mobile phone number', | ||||||
|     手风琴菜单: 'Accordion menu', |     手风琴菜单: 'Accordion menu', | ||||||
| @@ -131,13 +131,13 @@ export default { | |||||||
|     整页路由: 'Full page routing', |     整页路由: 'Full page routing', | ||||||
|     文化程度: 'Educational level', |     文化程度: 'Educational level', | ||||||
|     斑马纹: 'Zebra pattern', |     斑马纹: 'Zebra pattern', | ||||||
|     新增作业: 'Add job', |     新建作业: 'Add job', | ||||||
|     新增字典项: 'Add Dictionary Item', |     新建字典项: 'Add Dictionary Item', | ||||||
|     新增消息: 'Add Message', |     新建消息: 'Add Message', | ||||||
|     新增用户: 'Add User', |     新建用户: 'Add User', | ||||||
|     新增角色: 'Add Role', |     新建角色: 'Add Role', | ||||||
|     新增部门: 'Add Department', |     新建部门: 'Add Department', | ||||||
|     新增配置: 'Add Configuration', |     新建配置: 'Add Configuration', | ||||||
|     新密码: 'New password', |     新密码: 'New password', | ||||||
|     新手机号码: 'New mobile phone number', |     新手机号码: 'New mobile phone number', | ||||||
|     新手机验证码: 'New mobile verification code', |     新手机验证码: 'New mobile verification code', | ||||||
| @@ -379,7 +379,7 @@ export default { | |||||||
|     响应体: 'Response body', |     响应体: 'Response body', | ||||||
|     响应头: 'Response header', |     响应头: 'Response header', | ||||||
|     执行时间编号: 'Execution time ID', |     执行时间编号: 'Execution time ID', | ||||||
|     新增字典目录: 'Add dictionary catalog', |     新建字典目录: 'Add dictionary catalog', | ||||||
|     字典名称: 'Dictionary name', |     字典名称: 'Dictionary name', | ||||||
|     字典编码: 'Dictionary code', |     字典编码: 'Dictionary code', | ||||||
|     父路径: 'Parent path', |     父路径: 'Parent path', | ||||||
| @@ -579,7 +579,7 @@ export default { | |||||||
|     '结束值(毫秒)': 'End Value (ms)', |     '结束值(毫秒)': 'End Value (ms)', | ||||||
|     '起始值(毫秒)': 'Starting Value (ms)', |     '起始值(毫秒)': 'Starting Value (ms)', | ||||||
|     复制: 'Copy', |     复制: 'Copy', | ||||||
|     新增: 'New', |     新建: 'New', | ||||||
|     '数据已导出(上限 {n} 条)': 'Data exported (Maximum {n} entries)', |     '数据已导出(上限 {n} 条)': 'Data exported (Maximum {n} entries)', | ||||||
|     同步成功: 'Synchronization succeeded', |     同步成功: 'Synchronization succeeded', | ||||||
|     缓存详情: 'Cache details', |     缓存详情: 'Cache details', | ||||||
| @@ -587,11 +587,11 @@ export default { | |||||||
|     数据权限: 'Data Permissions', |     数据权限: 'Data Permissions', | ||||||
|     首页视图: 'Home view', |     首页视图: 'Home view', | ||||||
|     删除配置: 'Delete the configuration', |     删除配置: 'Delete the configuration', | ||||||
|     所属字典目录: 'Dictionary catalog', |     归属字典目录: 'Dictionary catalog', | ||||||
|     删除字典项: 'Delete dictionary entries', |     删除字典项: 'Delete dictionary entries', | ||||||
|     接口总数: 'Total number of apis', |     接口总数: 'Total number of apis', | ||||||
|     所属文档分类: 'Document catalog', |     归属文档分类: 'Document catalog', | ||||||
|     请选择所属文档分类: 'Please select the document category', |     请选择归属文档分类: 'Please select the document category', | ||||||
|     请输入文档标题: 'Please enter a title for the document', |     请输入文档标题: 'Please enter a title for the document', | ||||||
|     请输入文档内容: 'Please enter the content of the document', |     请输入文档内容: 'Please enter the content of the document', | ||||||
|     请选择档案可见性: 'Please select profile visibility', |     请选择档案可见性: 'Please select profile visibility', | ||||||
|   | |||||||
| @@ -99,9 +99,9 @@ export default { | |||||||
|     性别: '性别', |     性别: '性别', | ||||||
|     成功: '成功', |     成功: '成功', | ||||||
|     我的消息: '我的消息', |     我的消息: '我的消息', | ||||||
|     所属字典: '所属字典', |     归属字典: '归属字典', | ||||||
|     所属角色: '所属角色', |     归属角色: '归属角色', | ||||||
|     所属部门: '所属部门', |     归属部门: '归属部门', | ||||||
|     手机号: '手机号', |     手机号: '手机号', | ||||||
|     手机号码: '手机号码', |     手机号码: '手机号码', | ||||||
|     手风琴菜单: '手风琴菜单', |     手风琴菜单: '手风琴菜单', | ||||||
| @@ -131,13 +131,13 @@ export default { | |||||||
|     整页路由: '整页路由', |     整页路由: '整页路由', | ||||||
|     文化程度: '文化程度', |     文化程度: '文化程度', | ||||||
|     斑马纹: '斑马纹', |     斑马纹: '斑马纹', | ||||||
|     新增作业: '新增作业', |     新建作业: '新建作业', | ||||||
|     新增字典项: '新增字典项', |     新建字典项: '新建字典项', | ||||||
|     新增消息: '新增消息', |     新建消息: '新建消息', | ||||||
|     新增用户: '新增用户', |     新建用户: '新建用户', | ||||||
|     新增角色: '新增角色', |     新建角色: '新建角色', | ||||||
|     新增部门: '新增部门', |     新建部门: '新建部门', | ||||||
|     新增配置: '新增配置', |     新建配置: '新建配置', | ||||||
|     新密码: '新密码', |     新密码: '新密码', | ||||||
|     新手机号码: '新手机号码', |     新手机号码: '新手机号码', | ||||||
|     新手机验证码: '新手机验证码', |     新手机验证码: '新手机验证码', | ||||||
| @@ -378,7 +378,7 @@ export default { | |||||||
|     响应体: '响应体', |     响应体: '响应体', | ||||||
|     响应头: '响应头', |     响应头: '响应头', | ||||||
|     执行时间编号: '执行时间编号', |     执行时间编号: '执行时间编号', | ||||||
|     新增字典目录: '新增字典目录', |     新建字典目录: '新建字典目录', | ||||||
|     字典名称: '字典名称', |     字典名称: '字典名称', | ||||||
|     字典编码: '字典编码', |     字典编码: '字典编码', | ||||||
|     父路径: '父路径', |     父路径: '父路径', | ||||||
| @@ -577,7 +577,7 @@ export default { | |||||||
|     '结束值(毫秒)': '结束值(毫秒)', |     '结束值(毫秒)': '结束值(毫秒)', | ||||||
|     '起始值(毫秒)': '起始值(毫秒)', |     '起始值(毫秒)': '起始值(毫秒)', | ||||||
|     复制: '复制', |     复制: '复制', | ||||||
|     新增: '新增', |     新建: '新建', | ||||||
|     '数据已导出(上限 {n} 条)': '数据已导出(上限 {n} 条)', |     '数据已导出(上限 {n} 条)': '数据已导出(上限 {n} 条)', | ||||||
|     同步成功: '同步成功', |     同步成功: '同步成功', | ||||||
|     缓存详情: '缓存详情', |     缓存详情: '缓存详情', | ||||||
| @@ -585,11 +585,11 @@ export default { | |||||||
|     数据权限: '数据权限', |     数据权限: '数据权限', | ||||||
|     首页视图: '首页视图', |     首页视图: '首页视图', | ||||||
|     删除配置: '删除配置', |     删除配置: '删除配置', | ||||||
|     所属字典目录: '所属字典目录', |     归属字典目录: '归属字典目录', | ||||||
|     删除字典项: '删除字典项', |     删除字典项: '删除字典项', | ||||||
|     接口总数: '接口总数', |     接口总数: '接口总数', | ||||||
|     所属文档分类: '所属文档分类', |     归属文档分类: '归属文档分类', | ||||||
|     请选择所属文档分类: '请选择所属文档分类', |     请选择归属文档分类: '请选择归属文档分类', | ||||||
|     请输入文档标题: '请输入文档标题', |     请输入文档标题: '请输入文档标题', | ||||||
|     请输入文档内容: '请输入文档内容', |     请输入文档内容: '请输入文档内容', | ||||||
|     请选择档案可见性: '请选择档案可见性', |     请选择档案可见性: '请选择档案可见性', | ||||||
|   | |||||||
| @@ -85,6 +85,11 @@ | |||||||
|                         </template> |                         </template> | ||||||
|                     </el-table-column> |                     </el-table-column> | ||||||
|                 </el-table-column> |                 </el-table-column> | ||||||
|  |                 <el-table-column :label="$t('财务配置')" align="center"> | ||||||
|  |                     <el-table-column :label="$t('人民币兑点数比率')" align="center" prop="cnyToPointRate" width="150" /> | ||||||
|  |                     <el-table-column :label="$t('美元兑点数比率')" align="center" prop="usdToPointRate" width="150" /> | ||||||
|  |                     <el-table-column :label="$t('USDT 收款地址')" align="center" prop="trc20ReceiptAddress" width="300" /> | ||||||
|  |                 </el-table-column> | ||||||
|                 <el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100"> |                 <el-table-column :label="$t('启用')" align="center" prop="enabled" sortable="custom" width="100"> | ||||||
|                     <template #default="{ row }"> |                     <template #default="{ row }"> | ||||||
|                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> |                         <el-switch v-model="row.enabled" @change="changeSwitch($event, row)"></el-switch> | ||||||
| @@ -93,7 +98,7 @@ | |||||||
|                 <naColOperation |                 <naColOperation | ||||||
|                     :buttons="naColOperation.buttons.concat(naColOperation.delButton(this.$t('删除配置'), $API.sys_config.delete))" |                     :buttons="naColOperation.buttons.concat(naColOperation.delButton(this.$t('删除配置'), $API.sys_config.delete))" | ||||||
|                     :vue="this" |                     :vue="this" | ||||||
|                     width="150" /> |                     width="120" /> | ||||||
|             </scTable> |             </scTable> | ||||||
|         </el-main> |         </el-main> | ||||||
|     </el-container> |     </el-container> | ||||||
|   | |||||||
| @@ -25,6 +25,19 @@ | |||||||
|                                     </el-form-item> |                                     </el-form-item> | ||||||
|                                 </div> |                                 </div> | ||||||
|                             </el-collapse-item> |                             </el-collapse-item> | ||||||
|  |                             <el-collapse-item :title="$t('财务配置')" name="2"> | ||||||
|  |                                 <div style="margin: 1rem"> | ||||||
|  |                                     <el-form-item :label="$t('人民币兑点数比率')" prop="cnyToPointRate"> | ||||||
|  |                                         <el-input-number v-model="form.cnyToPointRate" :max="999999999" :min="1"></el-input-number> | ||||||
|  |                                     </el-form-item> | ||||||
|  |                                     <el-form-item :label="$t('美元兑点数比率')" prop="usdToPointRate"> | ||||||
|  |                                         <el-input-number v-model="form.usdToPointRate" :max="999999999" :min="1"></el-input-number> | ||||||
|  |                                     </el-form-item> | ||||||
|  |                                     <el-form-item :label="$t('USDT 收款地址')" prop="trc20ReceiptAddress"> | ||||||
|  |                                         <el-input v-model="form.trc20ReceiptAddress" maxlength="34" placeholder="placeholder"></el-input> | ||||||
|  |                                     </el-form-item> | ||||||
|  |                                 </div> | ||||||
|  |                             </el-collapse-item> | ||||||
|                         </el-collapse> |                         </el-collapse> | ||||||
|  |  | ||||||
|                         <el-form-item :label="$t('启用')" prop="enabled"> |                         <el-form-item :label="$t('启用')" prop="enabled"> | ||||||
| @@ -70,7 +83,7 @@ export default { | |||||||
|                 userRegisterRoleId: [{ required: true, message: '请选择默认角色' }], |                 userRegisterRoleId: [{ required: true, message: '请选择默认角色' }], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增配置'), |                 add: this.$t('新建配置'), | ||||||
|                 edit: this.$t('编辑配置'), |                 edit: this.$t('编辑配置'), | ||||||
|                 view: this.$t('查看配置'), |                 view: this.$t('查看配置'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -81,7 +81,7 @@ export default { | |||||||
|             }, |             }, | ||||||
|             tabId: '0', |             tabId: '0', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增部门'), |                 add: this.$t('新建部门'), | ||||||
|                 edit: this.$t('编辑部门'), |                 edit: this.$t('编辑部门'), | ||||||
|                 view: this.$t('查看部门'), |                 view: this.$t('查看部门'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|             <el-tabs tab-position="top"> |             <el-tabs tab-position="top"> | ||||||
|                 <el-tab-pane :label="$t('基本信息')"> |                 <el-tab-pane :label="$t('基本信息')"> | ||||||
|                     <el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm"> |                     <el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm"> | ||||||
|                         <el-form-item :label="$t('所属字典目录')" prop="catalogId"> |                         <el-form-item :label="$t('归属字典目录')" prop="catalogId"> | ||||||
|                             <catalog-select v-model="form.catalogId" class="w100p" /> |                             <catalog-select v-model="form.catalogId" class="w100p" /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('项名')" prop="key"> |                         <el-form-item :label="$t('项名')" prop="key"> | ||||||
| @@ -49,12 +49,12 @@ export default { | |||||||
|             mode: 'add', |             mode: 'add', | ||||||
|             //验证规则 |             //验证规则 | ||||||
|             rules: { |             rules: { | ||||||
|                 catalogId: [{ required: true, message: '请选择所属字典目录' }], |                 catalogId: [{ required: true, message: '请选择归属字典目录' }], | ||||||
|                 key: [{ required: true, message: '请输入项名' }], |                 key: [{ required: true, message: '请输入项名' }], | ||||||
|                 value: [{ required: true, message: '请输入项值' }], |                 value: [{ required: true, message: '请输入项值' }], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增字典项'), |                 add: this.$t('新建字典项'), | ||||||
|                 edit: this.$t('编辑字典项'), |                 edit: this.$t('编辑字典项'), | ||||||
|                 view: this.$t('查看字典项'), |                 view: this.$t('查看字典项'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ export default { | |||||||
|                 name: [{ required: true, message: '请输入字典目录名称' }], |                 name: [{ required: true, message: '请输入字典目录名称' }], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增字典目录'), |                 add: this.$t('新建字典目录'), | ||||||
|                 edit: this.$t('编辑字典目录'), |                 edit: this.$t('编辑字典目录'), | ||||||
|             }, |             }, | ||||||
|             visible: false, |             visible: false, | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|             <el-tabs tab-position="top"> |             <el-tabs tab-position="top"> | ||||||
|                 <el-tab-pane :label="$t('基本信息')"> |                 <el-tab-pane :label="$t('基本信息')"> | ||||||
|                     <el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm"> |                     <el-form :disabled="mode === 'view'" :model="form" :rules="rules" label-width="10rem" ref="dialogForm"> | ||||||
|                         <el-form-item :label="$t('所属文档分类')" prop="catalogId"> |                         <el-form-item :label="$t('归属文档分类')" prop="catalogId"> | ||||||
|                             <catalog-select v-model="form.catalogId" class="w100p" /> |                             <catalog-select v-model="form.catalogId" class="w100p" /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('文档标题')" prop="title"> |                         <el-form-item :label="$t('文档标题')" prop="title"> | ||||||
| @@ -60,13 +60,13 @@ export default { | |||||||
|             mode: 'add', |             mode: 'add', | ||||||
|             //验证规则 |             //验证规则 | ||||||
|             rules: { |             rules: { | ||||||
|                 catalogId: [{ required: true, message: this.$t('请选择所属文档分类') }], |                 catalogId: [{ required: true, message: this.$t('请选择归属文档分类') }], | ||||||
|                 title: [{ required: true, message: this.$t('请输入文档标题') }], |                 title: [{ required: true, message: this.$t('请输入文档标题') }], | ||||||
|                 body: [{ required: true, message: this.$t('请输入文档内容') }], |                 body: [{ required: true, message: this.$t('请输入文档内容') }], | ||||||
|                 visibility: [{ required: true, message: this.$t('请选择档案可见性') }], |                 visibility: [{ required: true, message: this.$t('请选择档案可见性') }], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增文档'), |                 add: this.$t('新建文档'), | ||||||
|                 edit: this.$t('编辑文档'), |                 edit: this.$t('编辑文档'), | ||||||
|                 view: this.$t('查看文档'), |                 view: this.$t('查看文档'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ export default { | |||||||
|                 name: [{ required: true, message: '请输入文档分类名称' }], |                 name: [{ required: true, message: '请输入文档分类名称' }], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增文档分类'), |                 add: this.$t('新建文档分类'), | ||||||
|                 edit: this.$t('编辑文档分类'), |                 edit: this.$t('编辑文档分类'), | ||||||
|             }, |             }, | ||||||
|             visible: false, |             visible: false, | ||||||
|   | |||||||
| @@ -204,7 +204,7 @@ export default { | |||||||
|             }, |             }, | ||||||
|             tabId: '0', |             tabId: '0', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增作业'), |                 add: this.$t('新建作业'), | ||||||
|                 edit: this.$t('编辑作业'), |                 edit: this.$t('编辑作业'), | ||||||
|                 view: this.$t('查看作业'), |                 view: this.$t('查看作业'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -133,7 +133,7 @@ export default { | |||||||
|             //验证规则 |             //验证规则 | ||||||
|             rules: {}, |             rules: {}, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增作业记录'), |                 add: this.$t('新建作业记录'), | ||||||
|                 edit: this.$t('编辑作业记录'), |                 edit: this.$t('编辑作业记录'), | ||||||
|                 view: this.$t('查看作业记录'), |                 view: this.$t('查看作业记录'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
|         </el-col> |         </el-col> | ||||||
|         <template v-else> |         <template v-else> | ||||||
|             <el-col> |             <el-col> | ||||||
|                 <h2>{{ form.meta.title || '新增菜单' }}</h2> |                 <h2>{{ form.meta.title || '新建菜单' }}</h2> | ||||||
|                 <el-form :model="form" :rules="rules" label-width="15rem" ref="dialogForm"> |                 <el-form :model="form" :rules="rules" label-width="15rem" ref="dialogForm"> | ||||||
|                     <el-form-item :label="$t('显示名称')" prop="meta.title"> |                     <el-form-item :label="$t('显示名称')" prop="meta.title"> | ||||||
|                         <el-input v-model="form.meta.title" :placeholder="$t('菜单显示名字')" clearable></el-input> |                         <el-input v-model="form.meta.title" :placeholder="$t('菜单显示名字')" clearable></el-input> | ||||||
|   | |||||||
| @@ -117,7 +117,7 @@ export default { | |||||||
|                 ], |                 ], | ||||||
|             }, |             }, | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增消息'), |                 add: this.$t('新建消息'), | ||||||
|                 edit: this.$t('编辑消息'), |                 edit: this.$t('编辑消息'), | ||||||
|                 view: this.$t('查看消息'), |                 view: this.$t('查看消息'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
							
								
								
									
										351
									
								
								src/frontend/admin/src/views/sys/order/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										351
									
								
								src/frontend/admin/src/views/sys/order/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,351 @@ | |||||||
|  | <template> | ||||||
|  |     <el-container> | ||||||
|  |         <el-header v-loading="statistics.total === '...'" class="el-header-statistics"> | ||||||
|  |             <el-row :gutter="15"> | ||||||
|  |                 <el-col :lg="24"> | ||||||
|  |                     <el-card shadow="never"> | ||||||
|  |                         <scStatistic :title="$t('总数')" :value="statistics.total" group-separator></scStatistic> | ||||||
|  |                     </el-card> | ||||||
|  |                 </el-col> | ||||||
|  |             </el-row> | ||||||
|  |         </el-header> | ||||||
|  |         <el-header class="el-header-select-filter"> | ||||||
|  |             <scSelectFilter | ||||||
|  |                 :data="[ | ||||||
|  |                     { | ||||||
|  |                         title: $t('订单状态'), | ||||||
|  |                         key: 'depositOrderStatus', | ||||||
|  |                         options: [ | ||||||
|  |                             { label: '全部', value: '' }, | ||||||
|  |                             ...Object.entries(this.$GLOBAL.enums.depositOrderStatues).map((x) => { | ||||||
|  |                                 return { | ||||||
|  |                                     value: x[0], | ||||||
|  |                                     label: x[1][1], | ||||||
|  |                                     badge: this.statistics.depositOrderStatus?.find( | ||||||
|  |                                         (y) => y.key.depositOrderStatus.toLowerCase() === x[0].toLowerCase(), | ||||||
|  |                                     )?.value, | ||||||
|  |                                 } | ||||||
|  |                             }), | ||||||
|  |                         ], | ||||||
|  |                     }, | ||||||
|  |                     { | ||||||
|  |                         title: $t('支付方式'), | ||||||
|  |                         key: 'paymentMode', | ||||||
|  |                         options: [ | ||||||
|  |                             { label: '全部', value: '' }, | ||||||
|  |                             ...Object.entries(this.$GLOBAL.enums.paymentModes).map((x) => { | ||||||
|  |                                 return { | ||||||
|  |                                     value: x[0], | ||||||
|  |                                     label: x[1][1], | ||||||
|  |                                     badge: this.statistics.paymentMode?.find((y) => y.key.paymentMode.toLowerCase() === x[0].toLowerCase())?.value, | ||||||
|  |                                 } | ||||||
|  |                             }), | ||||||
|  |                         ], | ||||||
|  |                     }, | ||||||
|  |                 ]" | ||||||
|  |                 :label-width="15" | ||||||
|  |                 @on-change="filterChange" | ||||||
|  |                 ref="selectFilter"></scSelectFilter> | ||||||
|  |         </el-header> | ||||||
|  |         <el-header> | ||||||
|  |             <div class="left-panel"> | ||||||
|  |                 <na-search | ||||||
|  |                     :controls="[ | ||||||
|  |                         { | ||||||
|  |                             type: 'select-input', | ||||||
|  |                             field: [ | ||||||
|  |                                 'dy', | ||||||
|  |                                 [ | ||||||
|  |                                     { label: $t('订单编号'), key: 'id' }, | ||||||
|  |                                     { label: $t('用户名'), key: 'owner.userName' }, | ||||||
|  |                                     { label: $t('用户编号'), key: 'ownerId' }, | ||||||
|  |                                     { label: $t('充值点数'), key: 'depositPoint' }, | ||||||
|  |                                 ], | ||||||
|  |                             ], | ||||||
|  |                             placeholder: $t('匹配内容'), | ||||||
|  |                             style: 'width:25rem', | ||||||
|  |                             selectStyle: 'width:8rem', | ||||||
|  |                         }, | ||||||
|  |                     ]" | ||||||
|  |                     :vue="this" | ||||||
|  |                     @reset="onReset" | ||||||
|  |                     @search="onSearch" | ||||||
|  |                     dateFormat="YYYY-MM-DD HH:mm:ss" | ||||||
|  |                     dateType="datetimerange" | ||||||
|  |                     dateValueFormat="YYYY-MM-DD HH:mm:ss" | ||||||
|  |                     ref="search" /> | ||||||
|  |             </div> | ||||||
|  |             <div class="right-panel"> | ||||||
|  |                 <el-button @click="this.dialog.save = { mode: 'add' }" icon="el-icon-plus" type="primary"></el-button> | ||||||
|  |             </div> | ||||||
|  |         </el-header> | ||||||
|  |         <el-main class="nopadding"> | ||||||
|  |             <scTable | ||||||
|  |                 :context-menus="[ | ||||||
|  |                     'id', | ||||||
|  |                     'ownerId', | ||||||
|  |                     'createdTime', | ||||||
|  |                     'paymentMode', | ||||||
|  |                     'amount', | ||||||
|  |                     'depositPoint', | ||||||
|  |                     'toPointRate', | ||||||
|  |                     'owner.userName', | ||||||
|  |                     'depositOrderStatus', | ||||||
|  |                     'actualPayAmount', | ||||||
|  |                 ]" | ||||||
|  |                 :context-multi="{ id: ['createdTime'], ownerId: ['owner.userName'] }" | ||||||
|  |                 :context-opers="['view']" | ||||||
|  |                 :default-sort="{ prop: 'id', order: 'descending' }" | ||||||
|  |                 :export-api="$API.sys_depositorder.export" | ||||||
|  |                 :params="query" | ||||||
|  |                 :query-api="$API.sys_depositorder.pagedQuery" | ||||||
|  |                 :vue="this" | ||||||
|  |                 @data-change="getStatistics" | ||||||
|  |                 @selection-change=" | ||||||
|  |                     (items) => { | ||||||
|  |                         selection = items | ||||||
|  |                     } | ||||||
|  |                 " | ||||||
|  |                 ref="table" | ||||||
|  |                 remote-filter | ||||||
|  |                 remote-sort | ||||||
|  |                 row-key="id" | ||||||
|  |                 stripe> | ||||||
|  |                 <naColId :label="$t('订单编号')" prop="id" sortable="custom" width="170" /> | ||||||
|  |                 <naColUser | ||||||
|  |                     :clickOpenDialog="$GLOBAL.hasApiPermission('api/sys/user/get')" | ||||||
|  |                     :label="$t('归属用户')" | ||||||
|  |                     header-align="center" | ||||||
|  |                     nestProp="owner.userName" | ||||||
|  |                     nestProp2="ownerId" | ||||||
|  |                     prop="ownerId" | ||||||
|  |                     sortable="custom" | ||||||
|  |                     width="170"></naColUser> | ||||||
|  |                 <naColIndicator | ||||||
|  |                     :label="$t('订单状态')" | ||||||
|  |                     :options=" | ||||||
|  |                         Object.entries(this.$GLOBAL.enums.depositOrderStatues).map((x) => { | ||||||
|  |                             return { value: x[0], text: `${x[1][1]}`, type: x[1][2], pulse: x[1][3] === 'true' } | ||||||
|  |                         }) | ||||||
|  |                     " | ||||||
|  |                     align="center" | ||||||
|  |                     prop="depositOrderStatus" | ||||||
|  |                     sortable="custom" /> | ||||||
|  |                 <el-table-column | ||||||
|  |                     :formatter="(row) => $TOOL.groupSeparator(row.depositPoint)" | ||||||
|  |                     :label="$t('充值点数')" | ||||||
|  |                     align="right" | ||||||
|  |                     prop="depositPoint" | ||||||
|  |                     sortable="custom" /> | ||||||
|  |                 <el-table-column | ||||||
|  |                     :formatter="(row) => $TOOL.groupSeparator(row.toPointRate)" | ||||||
|  |                     :label="$t('兑换比率')" | ||||||
|  |                     align="right" | ||||||
|  |                     prop="toPointRate" | ||||||
|  |                     sortable="custom" /> | ||||||
|  |                 <el-table-column | ||||||
|  |                     :formatter="(row) => $TOOL.groupSeparator(row.actualPayAmount / 1000)" | ||||||
|  |                     :label="$t('支付金额')" | ||||||
|  |                     align="right" | ||||||
|  |                     prop="actualPayAmount" | ||||||
|  |                     sortable="custom" /> | ||||||
|  |                 <naColIndicator | ||||||
|  |                     :label="$t('支付方式')" | ||||||
|  |                     :options=" | ||||||
|  |                         Object.entries(this.$GLOBAL.enums.paymentModes).map((x) => { | ||||||
|  |                             return { value: x[0], text: `${x[1][1]}`, type: x[1][2], pulse: x[1][3] === 'true' } | ||||||
|  |                         }) | ||||||
|  |                     " | ||||||
|  |                     align="center" | ||||||
|  |                     prop="paymentMode" | ||||||
|  |                     sortable="custom" /> | ||||||
|  |                 <naColOperation | ||||||
|  |                     :buttons="[ | ||||||
|  |                         naColOperation.buttons[0], | ||||||
|  |                         { | ||||||
|  |                             icon: 'el-icon-credit-card', | ||||||
|  |                             title: '支付', | ||||||
|  |                             click: async (row, vue) => { | ||||||
|  |                                 vue.dialog.save = { row, mode: 'pay' } | ||||||
|  |                             }, | ||||||
|  |                             condition: (row) => { | ||||||
|  |                                 return row.depositOrderStatus === 'waitingForPayment' | ||||||
|  |                             }, | ||||||
|  |                         }, | ||||||
|  |                     ]" | ||||||
|  |                     :vue="this" | ||||||
|  |                     width="120" /> | ||||||
|  |             </scTable> | ||||||
|  |         </el-main> | ||||||
|  |     </el-container> | ||||||
|  |  | ||||||
|  |     <save-dialog | ||||||
|  |         v-if="dialog.save" | ||||||
|  |         @closed="dialog.save = null" | ||||||
|  |         @mounted="$refs.saveDialog.open(dialog.save)" | ||||||
|  |         @success="(data, mode) => table.handleUpdate($refs.table, data, mode)" | ||||||
|  |         ref="saveDialog"></save-dialog> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import { defineAsyncComponent } from 'vue' | ||||||
|  | import table from '@/config/table' | ||||||
|  | import naColOperation from '@/config/naColOperation' | ||||||
|  | const naColUser = defineAsyncComponent(() => import('@/components/naColUser')) | ||||||
|  | const saveDialog = defineAsyncComponent(() => import('./save.vue')) | ||||||
|  | export default { | ||||||
|  |     components: { | ||||||
|  |         naColUser, | ||||||
|  |         saveDialog, | ||||||
|  |     }, | ||||||
|  |     computed: { | ||||||
|  |         naColOperation() { | ||||||
|  |             return naColOperation | ||||||
|  |         }, | ||||||
|  |         table() { | ||||||
|  |             return table | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     async created() { | ||||||
|  |         if (this.ownerId) { | ||||||
|  |             this.query.dynamicFilter.filters.push({ field: 'ownerId', operator: 'eq', value: this.ownerId }) | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     data() { | ||||||
|  |         return { | ||||||
|  |             statistics: { | ||||||
|  |                 total: '...', | ||||||
|  |             }, | ||||||
|  |             dialog: {}, | ||||||
|  |             loading: false, | ||||||
|  |             query: { | ||||||
|  |                 dynamicFilter: { | ||||||
|  |                     filters: [], | ||||||
|  |                 }, | ||||||
|  |                 filter: {}, | ||||||
|  |                 keywords: this.keywords, | ||||||
|  |             }, | ||||||
|  |             selection: [], | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     inject: ['reload'], | ||||||
|  |     methods: { | ||||||
|  |         filterChange(data) { | ||||||
|  |             Object.entries(data).forEach(([key, value]) => { | ||||||
|  |                 this.$refs.search.form.dy[key] = value === 'true' ? true : value === 'false' ? false : value | ||||||
|  |             }) | ||||||
|  |             this.$refs.search.search() | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         async getStatistics() { | ||||||
|  |             this.statistics.total = this.$refs.table?.total | ||||||
|  |             const res = await Promise.all([ | ||||||
|  |                 this.$API.sys_depositorder.countBy.post({ | ||||||
|  |                     dynamicFilter: { | ||||||
|  |                         filters: this.query.dynamicFilter.filters, | ||||||
|  |                     }, | ||||||
|  |                     requiredFields: ['PaymentMode'], | ||||||
|  |                 }), | ||||||
|  |                 this.$API.sys_depositorder.countBy.post({ | ||||||
|  |                     dynamicFilter: { | ||||||
|  |                         filters: this.query.dynamicFilter.filters, | ||||||
|  |                     }, | ||||||
|  |                     requiredFields: ['DepositOrderStatus'], | ||||||
|  |                 }), | ||||||
|  |             ]) | ||||||
|  |             this.statistics.paymentMode = res[0].data | ||||||
|  |             this.statistics.depositOrderStatus = res[1].data | ||||||
|  |         }, | ||||||
|  |         //重置 | ||||||
|  |         onReset() { | ||||||
|  |             Object.entries(this.$refs.selectFilter.selected).forEach(([key, _]) => (this.$refs.selectFilter.selected[key] = [''])) | ||||||
|  |             if (this.ownerId) { | ||||||
|  |                 this.$refs.search.selectInputKey = 'ownerId' | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         //搜索 | ||||||
|  |         async onSearch(form) { | ||||||
|  |             if (Array.isArray(form.dy.createdTime)) { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'createdTime', | ||||||
|  |                     operator: 'dateRange', | ||||||
|  |                     value: form.dy.createdTime.map((x) => x.replace(/ 00:00:00$/, '')), | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |             if (typeof form.dy['owner.userName'] === 'string' && form.dy['owner.userName'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'owner.userName', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['owner.userName'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |             if (typeof form.dy['ownerId'] === 'string' && form.dy['ownerId'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'ownerId', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['ownerId'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (typeof form.dy['id'] === 'string' && form.dy['id'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'id', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['id'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (typeof form.dy['paymentMode'] === 'string' && form.dy['paymentMode'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'paymentMode', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['paymentMode'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (typeof form.dy['depositOrderStatus'] === 'string' && form.dy['depositOrderStatus'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'depositOrderStatus', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['depositOrderStatus'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (typeof form.dy['depositPoint'] === 'string' && form.dy['depositPoint'].trim() !== '') { | ||||||
|  |                 this.query.dynamicFilter.filters.push({ | ||||||
|  |                     field: 'depositPoint', | ||||||
|  |                     operator: 'eq', | ||||||
|  |                     value: form.dy['depositPoint'], | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|  |             await this.$refs.table.upData() | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     async mounted() { | ||||||
|  |         if (this.ownerId) { | ||||||
|  |             this.$refs.search.selectInputKey = 'ownerId' | ||||||
|  |             this.$refs.search.form.dy.ownerId = this.ownerId | ||||||
|  |             this.$refs.search.keeps.push({ | ||||||
|  |                 field: 'ownerId', | ||||||
|  |                 value: this.ownerId, | ||||||
|  |                 type: 'dy', | ||||||
|  |             }) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (this.keywords) { | ||||||
|  |             this.$refs.search.form.root.keywords = this.keywords | ||||||
|  |             this.$refs.search.keeps.push({ | ||||||
|  |                 field: 'keywords', | ||||||
|  |                 value: this.keywords, | ||||||
|  |                 type: 'root', | ||||||
|  |             }) | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this.onReset() | ||||||
|  |     }, | ||||||
|  |     props: ['keywords', 'ownerId'], | ||||||
|  |     watch: {}, | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped></style> | ||||||
							
								
								
									
										197
									
								
								src/frontend/admin/src/views/sys/order/save.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								src/frontend/admin/src/views/sys/order/save.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,197 @@ | |||||||
|  | <template> | ||||||
|  |     <scDialog v-model="visible" :title="`${titleMap[mode]}:${form?.id ?? '...'}`" @closed="$emit('closed')" destroy-on-close> | ||||||
|  |         <div v-loading="loading"> | ||||||
|  |             <el-tabs v-model="tabId" @tab-change="tabChange" tab-position="top"> | ||||||
|  |                 <el-tab-pane :label="$t('基本信息')" name="basic"> | ||||||
|  |                     <el-form :disabled="mode === 'view' || mode === 'pay'" :model="form" :rules="rules" label-width="15rem" ref="dialogForm"> | ||||||
|  |                         <el-form-item v-if="mode !== 'add'" :label="$t('订单编号')" prop="id"> | ||||||
|  |                             <el-input v-model="form.id" clearable /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item v-if="mode !== 'add'" :label="$t('订单状态')" prop="depositOrderStatus"> | ||||||
|  |                             <el-select v-model="form.depositOrderStatus" filterable> | ||||||
|  |                                 <el-option v-for="(item, i) in $GLOBAL.enums.depositOrderStatues" :key="i" :label="item[1]" :value="i" /> | ||||||
|  |                             </el-select> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item :label="$t('充值点数')" prop="depositPoint"> | ||||||
|  |                             <el-input-number | ||||||
|  |                                 :max="999999999" | ||||||
|  |                                 :min="100" | ||||||
|  |                                 :model-value="form.depositPoint" | ||||||
|  |                                 :step="100" | ||||||
|  |                                 @input=" | ||||||
|  |                                     (e) => { | ||||||
|  |                                         if (e < 0) e = 0 | ||||||
|  |                                         if (e % 10 === 0) { | ||||||
|  |                                             e += Math.floor(Math.random() * 9) + 1 | ||||||
|  |                                         } | ||||||
|  |                                         if (e < 100) { | ||||||
|  |                                             e += 100 | ||||||
|  |                                         } | ||||||
|  |  | ||||||
|  |                                         this.form.depositPoint = e | ||||||
|  |                                     } | ||||||
|  |                                 " | ||||||
|  |                                 clearable | ||||||
|  |                                 style="width: 15rem" /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item :label="$t('支付方式')" prop="paymentMode"> | ||||||
|  |                             <el-select v-model="form.paymentMode" filterable> | ||||||
|  |                                 <el-option v-for="(item, i) in $GLOBAL.enums.paymentModes" :key="i" :label="item[1]" :value="i" /> | ||||||
|  |                             </el-select> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item :label="$t('货币兑点数比率')" prop="toPointRate"> | ||||||
|  |                             <el-input :model-value="form.toPointRate ? `1:${form.toPointRate}` : ''" disabled /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item :label="$t('支付货币金额')" prop="actualPayAmount"> | ||||||
|  |                             <el-input :model-value="form.actualPayAmount ? form.actualPayAmount / 1000 : ''" disabled /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item v-if="mode === 'pay'" :label="$t('收款账号')" prop="receiptAccount"> | ||||||
|  |                             <el-input v-model="form.receiptAccount" clearable /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item v-if="mode === 'pay'" :label="$t('收款二维码')"> | ||||||
|  |                             <div v-html="form.receiptAccountQrCode"></div> | ||||||
|  |                         </el-form-item> | ||||||
|  |                         <el-form-item v-if="mode !== 'add'" :label="$t('创建时间')" prop="createdTime"> | ||||||
|  |                             <el-input v-model="form.createdTime" clearable /> | ||||||
|  |                         </el-form-item> | ||||||
|  |                     </el-form> | ||||||
|  |                 </el-tab-pane> | ||||||
|  |                 <el-tab-pane v-if="mode === 'view'" :label="$t('原始数据')"> | ||||||
|  |                     <JsonViewer | ||||||
|  |                         :expand-depth="5" | ||||||
|  |                         :theme="this.$TOOL.data.get('APP_SET_DARK') || this.$CONFIG.APP_SET_DARK ? 'dark' : 'light'" | ||||||
|  |                         :value="form" | ||||||
|  |                         copyable | ||||||
|  |                         expanded | ||||||
|  |                         sort></JsonViewer> | ||||||
|  |                 </el-tab-pane> | ||||||
|  |             </el-tabs> | ||||||
|  |         </div> | ||||||
|  |         <template #footer> | ||||||
|  |             <el-button @click="visible = false">{{ $t('取消') }}</el-button> | ||||||
|  |             <el-button v-if="mode === 'add'" :disabled="loading" :loading="loading" @click="submit" type="primary">{{ $t('提交订单') }}</el-button> | ||||||
|  |             <el-button | ||||||
|  |                 v-if="mode === 'pay'" | ||||||
|  |                 :disabled="loading" | ||||||
|  |                 :loading="loading" | ||||||
|  |                 @click=" | ||||||
|  |                     async () => { | ||||||
|  |                         this.loading = true | ||||||
|  |                         try { | ||||||
|  |                             const res = await this.$API.sys_depositorder.payConfirm.post(this.form) | ||||||
|  |                             this.$emit('success', res.data, this.mode) | ||||||
|  |                             this.visible = false | ||||||
|  |                             this.$message.success(this.$t('操作成功')) | ||||||
|  |                         } catch {} | ||||||
|  |                         this.loading = false | ||||||
|  |                     } | ||||||
|  |                 " | ||||||
|  |                 type="danger" | ||||||
|  |                 >{{ $t('确认已支付') }}</el-button | ||||||
|  |             > | ||||||
|  |         </template> | ||||||
|  |     </scDialog> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import QRCode from 'qrcode-svg' | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |     computed: {}, | ||||||
|  |     components: {}, | ||||||
|  |  | ||||||
|  |     watch: { | ||||||
|  |         'form.paymentMode': { | ||||||
|  |             immediate: true, | ||||||
|  |             handler(n, o) { | ||||||
|  |                 if (n === 'alipay' || n === 'weChat') { | ||||||
|  |                     this.form.toPointRate = this.config?.cnyToPointRate | ||||||
|  |                 } else if (n === 'usdt') { | ||||||
|  |                     this.form.toPointRate = this.config?.usdToPointRate | ||||||
|  |                 } else { | ||||||
|  |                     delete this.form.toPointRate | ||||||
|  |                 } | ||||||
|  |                 if (this.form.toPointRate && this.form.depositPoint) { | ||||||
|  |                     this.form.actualPayAmount = (this.form.depositPoint / this.form.toPointRate).toFixed(3) * 1000 | ||||||
|  |                 } else { | ||||||
|  |                     delete this.form.actualPayAmount | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |         }, | ||||||
|  |         'form.depositPoint': { | ||||||
|  |             immediate: true, | ||||||
|  |             handler(n, o) { | ||||||
|  |                 if (this.form.toPointRate) { | ||||||
|  |                     this.form.actualPayAmount = (n / this.form.toPointRate).toFixed(3) * 1000 | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     data() { | ||||||
|  |         return { | ||||||
|  |             config: null, | ||||||
|  |             //表单数据 | ||||||
|  |             form: {}, | ||||||
|  |             loading: true, | ||||||
|  |             mode: 'add', | ||||||
|  |             //验证规则 | ||||||
|  |             rules: { | ||||||
|  |                 depositPoint: [{ required: true, message: this.$t('请输入充值点数') }], | ||||||
|  |                 paymentMode: [{ required: true, message: this.$t('请选择支付方式') }], | ||||||
|  |             }, | ||||||
|  |             tabId: 'basic', | ||||||
|  |             titleMap: { | ||||||
|  |                 add: this.$t('新建充值订单'), | ||||||
|  |                 view: this.$t('查看充值订单'), | ||||||
|  |                 pay: this.$t('支付充值订单'), | ||||||
|  |             }, | ||||||
|  |             visible: false, | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     emits: ['success', 'closed', 'mounted'], | ||||||
|  |     methods: { | ||||||
|  |         //显示 | ||||||
|  |         async open(data) { | ||||||
|  |             this.visible = true | ||||||
|  |             this.config = (await this.$API.sys_depositorder.getDepositConfig.post({})).data | ||||||
|  |             if (data.mode === 'add') { | ||||||
|  |                 this.loading = false | ||||||
|  |                 return this | ||||||
|  |             } | ||||||
|  |             this.loading = true | ||||||
|  |             this.mode = data.mode | ||||||
|  |             if (data.row?.id) { | ||||||
|  |                 const res = await this.$API.sys_depositorder.get.post({ id: data.row.id }) | ||||||
|  |                 if (res.data) { | ||||||
|  |                     Object.assign(this.form, res.data) | ||||||
|  |                     this.form.receiptAccountQrCode = new QRCode(this.form.receiptAccount).svg() | ||||||
|  |                     this.loading = false | ||||||
|  |                     return this | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             this.$message.error(`未找到该数据`) | ||||||
|  |             return this | ||||||
|  |         }, | ||||||
|  |         //表单提交方法 | ||||||
|  |         async submit() { | ||||||
|  |             const valid = await this.$refs.dialogForm.validate().catch(() => {}) | ||||||
|  |             if (!valid) { | ||||||
|  |                 return false | ||||||
|  |             } | ||||||
|  |             this.loading = true | ||||||
|  |             try { | ||||||
|  |                 const res = await this.$API.sys_depositorder.create.post(this.form) | ||||||
|  |                 this.$emit('success', res.data, this.mode) | ||||||
|  |                 this.visible = false | ||||||
|  |                 this.$message.success(this.$t('操作成功')) | ||||||
|  |             } catch {} | ||||||
|  |             this.loading = false | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     mounted() { | ||||||
|  |         this.$emit('mounted') | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped></style> | ||||||
| @@ -134,7 +134,7 @@ export default { | |||||||
|             }, |             }, | ||||||
|             tabId: '0', |             tabId: '0', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增角色'), |                 add: this.$t('新建角色'), | ||||||
|                 edit: this.$t('编辑角色'), |                 edit: this.$t('编辑角色'), | ||||||
|                 view: this.$t('查看角色'), |                 view: this.$t('查看角色'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -109,7 +109,7 @@ | |||||||
|                 <naColId :label="$t('交易编号')" prop="id" sortable="custom" width="170" /> |                 <naColId :label="$t('交易编号')" prop="id" sortable="custom" width="170" /> | ||||||
|                 <naColUser |                 <naColUser | ||||||
|                     :clickOpenDialog="$GLOBAL.hasApiPermission('api/sys/user/get')" |                     :clickOpenDialog="$GLOBAL.hasApiPermission('api/sys/user/get')" | ||||||
|                     :label="$t('所属用户')" |                     :label="$t('归属用户')" | ||||||
|                     header-align="center" |                     header-align="center" | ||||||
|                     nestProp="owner.userName" |                     nestProp="owner.userName" | ||||||
|                     nestProp2="ownerId" |                     nestProp2="ownerId" | ||||||
|   | |||||||
| @@ -22,16 +22,16 @@ | |||||||
|                         <el-form-item :label="$t('交易后余额')"> |                         <el-form-item :label="$t('交易后余额')"> | ||||||
|                             <el-input :value="form.balanceBefore + form.amount" clearable /> |                             <el-input :value="form.balanceBefore + form.amount" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('所有者部门编号')" prop="ownerDeptId"> |                         <el-form-item :label="$t('归属部门编号')" prop="ownerDeptId"> | ||||||
|                             <el-input v-model="form.ownerDeptId" clearable /> |                             <el-input v-model="form.ownerDeptId" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('所有者用户编号')" prop="ownerId"> |                         <el-form-item :label="$t('归属用户编号')" prop="ownerId"> | ||||||
|                             <el-input v-model="form.ownerId" clearable /> |                             <el-input v-model="form.ownerId" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('创建者用户编号')" prop="createdUserId"> |                         <el-form-item :label="$t('创建者用户编号')" prop="createdUserId"> | ||||||
|                             <el-input v-model="form.createdUserId" clearable /> |                             <el-input v-model="form.createdUserId" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('所有者用户名')" prop="createdUserName"> |                         <el-form-item :label="$t('归属用户名')" prop="createdUserName"> | ||||||
|                             <el-input v-model="form.createdUserName" clearable /> |                             <el-input v-model="form.createdUserName" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('创建时间')" prop="createdTime"> |                         <el-form-item :label="$t('创建时间')" prop="createdTime"> | ||||||
| @@ -70,7 +70,7 @@ export default { | |||||||
|             rules: {}, |             rules: {}, | ||||||
|             tabId: 'basic', |             tabId: 'basic', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增交易'), |                 add: this.$t('新建交易'), | ||||||
|                 edit: this.$t('编辑交易'), |                 edit: this.$t('编辑交易'), | ||||||
|                 view: this.$t('查看交易'), |                 view: this.$t('查看交易'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ | |||||||
|                             field: ['filter', 'roleId'], |                             field: ['filter', 'roleId'], | ||||||
|                             api: $API.sys_role.query, |                             api: $API.sys_role.query, | ||||||
|                             config: { props: { label: 'name', value: 'id' } }, |                             config: { props: { label: 'name', value: 'id' } }, | ||||||
|                             placeholder: $t('所属角色'), |                             placeholder: $t('归属角色'), | ||||||
|                             style: 'width:15rem', |                             style: 'width:15rem', | ||||||
|                         }, |                         }, | ||||||
|                     ]" |                     ]" | ||||||
| @@ -121,13 +121,13 @@ | |||||||
|                             </template> |                             </template> | ||||||
|                         </el-table-column> |                         </el-table-column> | ||||||
|                         <naColTags |                         <naColTags | ||||||
|                             :label="$t('所属部门')" |                             :label="$t('归属部门')" | ||||||
|                             @click="(item) => (this.dialog.deptSave = { row: item, mode: 'view' })" |                             @click="(item) => (this.dialog.deptSave = { row: item, mode: 'view' })" | ||||||
|                             field="name" |                             field="name" | ||||||
|                             prop="dept" |                             prop="dept" | ||||||
|                             width="120" /> |                             width="120" /> | ||||||
|                         <naColTags |                         <naColTags | ||||||
|                             :label="$t('所属角色')" |                             :label="$t('归属角色')" | ||||||
|                             @click="(item) => (this.dialog.roleSave = { row: item, mode: 'view' })" |                             @click="(item) => (this.dialog.roleSave = { row: item, mode: 'view' })" | ||||||
|                             field="name" |                             field="name" | ||||||
|                             min-width="200" |                             min-width="200" | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ | |||||||
|                         </div> |                         </div> | ||||||
|                     </el-form-item> |                     </el-form-item> | ||||||
|  |  | ||||||
|                     <el-form-item :label="$t('所属角色')" prop="roleIds"> |                     <el-form-item :label="$t('归属角色')" prop="roleIds"> | ||||||
|                         <scSelect |                         <scSelect | ||||||
|                             v-if="!this.loading" |                             v-if="!this.loading" | ||||||
|                             v-model="form.roleIds" |                             v-model="form.roleIds" | ||||||
| @@ -61,7 +61,7 @@ | |||||||
|                             filterable |                             filterable | ||||||
|                             multiple /> |                             multiple /> | ||||||
|                     </el-form-item> |                     </el-form-item> | ||||||
|                     <el-form-item :label="$t('所属部门')" prop="deptId"> |                     <el-form-item :label="$t('归属部门')" prop="deptId"> | ||||||
|                         <naDept v-model="form.deptId" class="w100p"></naDept> |                         <naDept v-model="form.deptId" class="w100p"></naDept> | ||||||
|                     </el-form-item> |                     </el-form-item> | ||||||
|  |  | ||||||
| @@ -315,18 +315,18 @@ export default { | |||||||
|                         pattern: this.$GLOBAL.chars.RGX_PASSWORD, |                         pattern: this.$GLOBAL.chars.RGX_PASSWORD, | ||||||
|                     }, |                     }, | ||||||
|                 ], |                 ], | ||||||
|                 deptId: [{ required: true, message: '请选择所属部门' }], |                 deptId: [{ required: true, message: '请选择归属部门' }], | ||||||
|                 roleIds: [ |                 roleIds: [ | ||||||
|                     { |                     { | ||||||
|                         required: true, |                         required: true, | ||||||
|                         message: '请选择所属角色', |                         message: '请选择归属角色', | ||||||
|                         trigger: 'change', |                         trigger: 'change', | ||||||
|                     }, |                     }, | ||||||
|                 ], |                 ], | ||||||
|             }, |             }, | ||||||
|             tabId: '0', |             tabId: '0', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增用户'), |                 add: this.$t('新建用户'), | ||||||
|                 edit: this.$t('编辑用户'), |                 edit: this.$t('编辑用户'), | ||||||
|                 view: this.$t('查看用户'), |                 view: this.$t('查看用户'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
|                             field: ['filter', 'deptId'], |                             field: ['filter', 'deptId'], | ||||||
|                             api: $API.sys_dept.query, |                             api: $API.sys_dept.query, | ||||||
|                             config: { props: { label: 'name', value: 'id' } }, |                             config: { props: { label: 'name', value: 'id' } }, | ||||||
|                             placeholder: $t('所属部门'), |                             placeholder: $t('归属部门'), | ||||||
|                             style: 'width:15rem', |                             style: 'width:15rem', | ||||||
|                             condition: () => $GLOBAL.hasApiPermission('api/sys/dept/query'), |                             condition: () => $GLOBAL.hasApiPermission('api/sys/dept/query'), | ||||||
|                         }, |                         }, | ||||||
| @@ -42,7 +42,7 @@ | |||||||
|                             field: ['filter', 'roleId'], |                             field: ['filter', 'roleId'], | ||||||
|                             api: $API.sys_role.query, |                             api: $API.sys_role.query, | ||||||
|                             config: { props: { label: 'name', value: 'id' } }, |                             config: { props: { label: 'name', value: 'id' } }, | ||||||
|                             placeholder: $t('所属角色'), |                             placeholder: $t('归属角色'), | ||||||
|                             style: 'width:15rem', |                             style: 'width:15rem', | ||||||
|                             condition: () => $GLOBAL.hasApiPermission('api/sys/dept/query'), |                             condition: () => $GLOBAL.hasApiPermission('api/sys/dept/query'), | ||||||
|                         }, |                         }, | ||||||
| @@ -92,7 +92,7 @@ | |||||||
|                 <naColId :label="$t('钱包编号')" prop="id" sortable="custom" width="170" /> |                 <naColId :label="$t('钱包编号')" prop="id" sortable="custom" width="170" /> | ||||||
|                 <naColUser |                 <naColUser | ||||||
|                     :clickOpenDialog="$GLOBAL.hasApiPermission('api/sys/user/get')" |                     :clickOpenDialog="$GLOBAL.hasApiPermission('api/sys/user/get')" | ||||||
|                     :label="$t('所属用户')" |                     :label="$t('归属用户')" | ||||||
|                     nestProp="owner.userName" |                     nestProp="owner.userName" | ||||||
|                     nestProp2="ownerId" |                     nestProp2="ownerId" | ||||||
|                     prop="ownerId" |                     prop="ownerId" | ||||||
|   | |||||||
| @@ -22,10 +22,10 @@ | |||||||
|                         <el-form-item :label="$t('总支出')" prop="totalExpenditure"> |                         <el-form-item :label="$t('总支出')" prop="totalExpenditure"> | ||||||
|                             <el-input v-model="form.totalExpenditure" clearable /> |                             <el-input v-model="form.totalExpenditure" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('所有者部门编号')" prop="ownerDeptId"> |                         <el-form-item :label="$t('归属部门编号')" prop="ownerDeptId"> | ||||||
|                             <el-input v-model="form.ownerDeptId" clearable /> |                             <el-input v-model="form.ownerDeptId" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('所有者用户编号')" prop="ownerId"> |                         <el-form-item :label="$t('归属用户编号')" prop="ownerId"> | ||||||
|                             <el-input v-model="form.ownerId" clearable /> |                             <el-input v-model="form.ownerId" clearable /> | ||||||
|                         </el-form-item> |                         </el-form-item> | ||||||
|                         <el-form-item :label="$t('创建时间')" prop="createdTime"> |                         <el-form-item :label="$t('创建时间')" prop="createdTime"> | ||||||
| @@ -75,7 +75,7 @@ export default { | |||||||
|             rules: {}, |             rules: {}, | ||||||
|             tabId: 'basic', |             tabId: 'basic', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增钱包'), |                 add: this.$t('新建钱包'), | ||||||
|                 edit: this.$t('编辑钱包'), |                 edit: this.$t('编辑钱包'), | ||||||
|                 view: this.$t('查看钱包'), |                 view: this.$t('查看钱包'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ export default { | |||||||
|             }, |             }, | ||||||
|             tabId: '0', |             tabId: '0', | ||||||
|             titleMap: { |             titleMap: { | ||||||
|                 add: this.$t('新增用户'), |                 add: this.$t('新建用户'), | ||||||
|                 edit: this.$t('编辑用户'), |                 edit: this.$t('编辑用户'), | ||||||
|                 view: this.$t('查看用户'), |                 view: this.$t('查看用户'), | ||||||
|             }, |             }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user