diff --git a/assets/res/NetAdmin.Fields.ln b/assets/res/NetAdmin.Fields.ln index 3acdc230..bafc1d51 100644 --- a/assets/res/NetAdmin.Fields.ln +++ b/assets/res/NetAdmin.Fields.ln @@ -13,7 +13,10 @@ USDT 中专 中共党员 为其中之一 +交易 +人工 人工审核 +代码模板导出 以什么开始 以什么结束 作业名称 @@ -52,9 +55,12 @@ USDT 小于 小于等于 小学 +已冻结 已发送 已婚 已校验 +已经冻结 +已解冻 已读 并且 归属角色 @@ -116,7 +122,6 @@ USDT 登录名 登录日志导出 硕士 -代码模板导出 离异 空闲 站内信导出 @@ -129,6 +134,7 @@ USDT 系统模块 绑定手机号码 结果非预期 +结算解冻 群众 自助充值 自定义 @@ -143,6 +149,7 @@ USDT 请求方式 请求日志导出 调试 +超时解冻 身份证 运行 追踪 @@ -154,6 +161,7 @@ USDT 配置导出 重设密码 钱包交易导出 +钱包冻结导出 链接 错误 随机排序 diff --git a/assets/res/NetAdmin.Statements.ln b/assets/res/NetAdmin.Statements.ln index fa0a078f..c5887517 100644 --- a/assets/res/NetAdmin.Statements.ln +++ b/assets/res/NetAdmin.Statements.ln @@ -12,6 +12,7 @@ XML注释文件不存在 作业名称不能为空 允许的文件大小 允许的文件格式 +冻结状态不正确 区号电话号码分机号 参数格式不正确 唯一编码不能为空 @@ -111,7 +112,7 @@ XML注释文件不存在 部门可见 部门名称不能为空 配置文件初始化完毕 -钱包余额不足 +钱包可用余额不足 键值不能为空 键名称不能为空 随机延时结束时间不正确 diff --git a/assets/seed-data/Sys_RoleApi.json b/assets/seed-data/Sys_RoleApi.json index c5584175..de0e43da 100644 --- a/assets/seed-data/Sys_RoleApi.json +++ b/assets/seed-data/Sys_RoleApi.json @@ -106,5 +106,17 @@ { "ApiId": "api/sys/user.invite/query", "RoleId": 371729946431493, - } + }, + { + "ApiId": "api/sys/wallet.frozen/get", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/wallet.frozen/paged.query", + "RoleId": 371729946431493, + }, + { + "ApiId": "api/sys/wallet.frozen/count.by", + "RoleId": 371729946431493, + }, ] \ No newline at end of file diff --git a/package.json b/package.json index 21f61adb..7ff9a85d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "version": "2.4.0", "devDependencies": { - "cz-git": "^1.11.2", + "cz-git": "^1.12.0", "commitizen": "^4.3.1", "prettier": "^3.6.2", "standard-version": "^9.5.0" @@ -11,4 +11,4 @@ "path": "node_modules/cz-git" } } -} +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs b/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs new file mode 100644 index 00000000..9a3c4051 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs @@ -0,0 +1,23 @@ +using NetAdmin.Domain; +using NetAdmin.Domain.Dto.Dependency; + +namespace NetAdmin.Application.Extensions; + +/// +/// FreeSql Select 扩展方法 +/// +public static class ISelectExtensions +{ + /// + /// 附加其他过滤条件 + /// + public static ISelect AppendOtherFilters(this ISelect me, QueryReq req) + where TQuery : DataAbstraction, new() + { + if (req.IgnoreOwner) { + me = me.DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA); + } + + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Application/Services/ServiceBase.cs b/src/backend/NetAdmin/NetAdmin.Application/Services/ServiceBase.cs index c66da022..f25431e9 100644 --- a/src/backend/NetAdmin/NetAdmin.Application/Services/ServiceBase.cs +++ b/src/backend/NetAdmin/NetAdmin.Application/Services/ServiceBase.cs @@ -42,12 +42,7 @@ public abstract class ServiceBase : IScoped, IService /// /// 获取服务 /// - #pragma warning disable RCS1036 - #pragma warning restore RCS1036 - - // ReSharper disable once MemberCanBeMadeStatic.Global - #pragma warning disable CA1822, S2325 - protected T S() + protected static T S() #pragma warning restore S2325, CA1822 where T : class { diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs index 2d7bcfb4..0bef2ece 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs @@ -1,15 +1,10 @@ -using NetAdmin.Domain.Attributes; -using NetAdmin.Domain.DbMaps.Dependency; -using NetAdmin.Domain.DbMaps.Dependency.Fields; -using NetAdmin.Domain.DbMaps.Sys; - namespace NetAdmin.Domain.DbMaps.Sys; /// /// 代码模板表 /// [Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_CodeTemplate))] -public record Sys_CodeTemplate : VersionEntity, IFieldSummary, IFieldOwner, IFieldSort, IFieldEnabled +public record Sys_CodeTemplate : VersionEntity, IFieldSort, IFieldSummary, IFieldEnabled, IFieldOwner { /// /// 是否启用 @@ -20,6 +15,34 @@ public record Sys_CodeTemplate : VersionEntity, IFieldSummary, IFieldOwner, IFie [JsonIgnore] public virtual bool Enabled { get; init; } + /// + /// 性别 + /// + /// Male + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual Genders? Gender { get; init; } + + /// + /// 唯一编码 + /// + /// 123456 + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + [CsvIgnore] + [JsonIgnore] + [Snowflake] + public override long Id { get; init; } + + /// + /// 名称 + /// + /// 老王 + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + [CsvIgnore] + [JsonIgnore] + public virtual string Name { get; init; } + /// /// 归属用户 /// @@ -63,32 +86,4 @@ public record Sys_CodeTemplate : VersionEntity, IFieldSummary, IFieldOwner, IFie [CsvIgnore] [JsonIgnore] public virtual string Summary { get; init; } - - /// - /// 代码模板编号 - /// - /// 123456 - [Column(IsIdentity = false, IsPrimary = true, Position = 1)] - [CsvIgnore] - [JsonIgnore] - [Snowflake] - public override long Id { get; init; } - - /// - /// 名称 - /// - /// 老王 - [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] - [CsvIgnore] - [JsonIgnore] - public virtual string Name { get; init; } - - /// - /// 性别 - /// - /// Male - [Column] - [CsvIgnore] - [JsonIgnore] - public virtual Genders? Gender { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserWallet.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserWallet.cs index ecfc6bf8..bb9e495e 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserWallet.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserWallet.cs @@ -46,14 +46,6 @@ public record Sys_UserWallet : LiteVersionEntity, IFieldOwner [JsonIgnore] public virtual long? OwnerId { get; init; } - /// - /// 总余额 - /// - [Column] - [CsvIgnore] - [JsonIgnore] - public virtual long TotalBalance { get; init; } - /// /// 总支出 /// diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletFrozen.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletFrozen.cs new file mode 100644 index 00000000..16407897 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletFrozen.cs @@ -0,0 +1,99 @@ +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 钱包冻结表 +/// +[Table(Name = Chars.FLG_DB_TABLE_NAME_PREFIX + nameof(Sys_WalletFrozen))] +public record Sys_WalletFrozen : LiteVersionEntity, IFieldOwner, IFieldSummary +{ + /// + /// 冻结金额 + /// + /// 100 + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual long Amount { get; init; } + + /// + /// 冻结前数值 + /// + /// 100 + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual long FrozenBalanceBefore { get; init; } + + /// + /// 冻结编号 + /// + /// 123456 + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + [CsvIgnore] + [JsonIgnore] + [Snowflake] + public override long Id { get; init; } + + /// + /// 归属用户 + /// + [CsvIgnore] + [JsonIgnore] + [Navigate(nameof(OwnerId))] + public Sys_User Owner { get; init; } + + /// + /// 归属部门编号 + /// + /// 370942943322181 + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual long? OwnerDeptId { get; init; } + + /// + /// 归属用户编号 + /// + /// 370942943322181 + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual long? OwnerId { get; init; } + + /// + /// 冻结原因 + /// + /// Trade + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual WalletFrozenReasons Reason { get; init; } + + /// + /// 冻结状态 + /// + /// Frozen + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual WalletFrozenStatues Status { get; init; } + + /// + /// 备注 + /// + /// 备注文字 + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [CsvIgnore] + [JsonIgnore] + public virtual string Summary { get; init; } + + /// + /// 钱包 + /// + [CsvIgnore] + [JsonIgnore] + [Navigate(nameof(OwnerId))] + public Sys_UserWallet Wallet { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs index 44f9e4aa..b767d0fb 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs @@ -22,6 +22,12 @@ public record QueryReq : DataAbstraction /// public T Filter { get; init; } + /// + /// 忽略归属 + /// + [JsonIgnore] + public bool IgnoreOwner { get; init; } + /// /// 查询关键字 /// diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs index 01e17dad..29810c4b 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs @@ -1,6 +1,3 @@ -using NetAdmin.Domain.DbMaps.Dependency.Fields; -using NetAdmin.Domain.DbMaps.Sys; - namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; /// @@ -11,13 +8,9 @@ public record CreateCodeTemplateReq : Sys_CodeTemplate /// public override bool Enabled { get; init; } = true; - /// + /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long Sort { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string Summary { get; init; } + public override Genders? Gender { get; init; } /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] @@ -27,8 +20,11 @@ public record CreateCodeTemplateReq : Sys_CodeTemplate [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override string Name { get; init; } - /// + /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - [EnumDataType(typeof(Genders))] - public override Genders? Gender { get; init; } + public override long Sort { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/EditCodeTemplateReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/EditCodeTemplateReq.cs index cb84fa03..a9ebc5d5 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/EditCodeTemplateReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/EditCodeTemplateReq.cs @@ -1,5 +1,3 @@ -using NetAdmin.Domain.DbMaps.Dependency.Fields; - namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; /// diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateReq.cs index 1d612c09..9eaab40e 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateReq.cs @@ -1,6 +1,3 @@ -using NetAdmin.Domain.DbMaps.Dependency; -using NetAdmin.Domain.DbMaps.Sys; - namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; /// @@ -8,7 +5,7 @@ namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; /// public sealed record QueryCodeTemplateReq : Sys_CodeTemplate { - /// + /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override long Id { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs index 6e434d4f..adb11b27 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs @@ -1,6 +1,3 @@ -using NetAdmin.Domain.DbMaps.Dependency; -using NetAdmin.Domain.DbMaps.Dependency.Fields; -using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.User; namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; @@ -10,18 +7,10 @@ namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; /// public record QueryCodeTemplateRsp : Sys_CodeTemplate { - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override bool Enabled { get; init; } - /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override DateTime CreatedTime { get; init; } - /// - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override DateTime? ModifiedTime { get; init; } - /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override long? CreatedUserId { get; init; } @@ -30,6 +19,22 @@ public record QueryCodeTemplateRsp : Sys_CodeTemplate [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override string CreatedUserName { get; init; } + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override Genders? Gender { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override DateTime? ModifiedTime { get; init; } + /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override long? ModifiedUserId { get; init; } @@ -38,6 +43,10 @@ public record QueryCodeTemplateRsp : Sys_CodeTemplate [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override string ModifiedUserName { get; init; } + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + /// public new virtual QueryUserRsp Owner { get; init; } @@ -60,16 +69,4 @@ public record QueryCodeTemplateRsp : Sys_CodeTemplate /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override long Version { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long Id { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string Name { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override Genders? Gender { get; init; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/SetCodeTemplateEnabledReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/SetCodeTemplateEnabledReq.cs deleted file mode 100644 index 2a3e4079..00000000 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/SetCodeTemplateEnabledReq.cs +++ /dev/null @@ -1,21 +0,0 @@ -using NetAdmin.Domain.DbMaps.Dependency.Fields; - -namespace NetAdmin.Domain.Dto.Sys.CodeTemplate; - -/// -/// 请求:设置代码模板启用状态 -/// -public sealed record SetCodeTemplateEnabledReq : Sys_CodeTemplate -{ - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override bool Enabled { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long Id { get; init; } - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long Version { get; init; } -} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs index c108dc28..6be97f24 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs @@ -1,4 +1,4 @@ -namespace NetAdmin.Domain.Dto.Sys.Dev; +namespace NetAdmin.Domain.Dto.Sys.Dev; /// /// 信息:字段项信息 diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs index 9e61b60b..57c09451 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs @@ -1,4 +1,4 @@ -namespace NetAdmin.Domain.Dto.Sys.Dev; +namespace NetAdmin.Domain.Dto.Sys.Dev; /// /// 请求:生成后端代码 diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GetDotnetDataTypesReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GetDotnetDataTypesReq.cs index 24a07f46..542bdad7 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GetDotnetDataTypesReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GetDotnetDataTypesReq.cs @@ -1,4 +1,4 @@ -namespace NetAdmin.Domain.Dto.Sys.Dev; +namespace NetAdmin.Domain.Dto.Sys.Dev; /// /// 请求:获取所有数据类型 diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserWallet/QueryUserWalletRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserWallet/QueryUserWalletRsp.cs index 7524925b..68d1eacc 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserWallet/QueryUserWalletRsp.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserWallet/QueryUserWalletRsp.cs @@ -38,10 +38,6 @@ public record QueryUserWalletRsp : Sys_UserWallet [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public override long? OwnerId { get; init; } - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long TotalBalance { get; init; } - /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override long TotalExpenditure { get; init; } diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs new file mode 100644 index 00000000..f1ac994f --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs @@ -0,0 +1,33 @@ +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.WalletFrozen; + +/// +/// 请求:创建钱包冻结 +/// +public record CreateWalletFrozenReq : Sys_WalletFrozen +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Amount { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override long? OwnerId { get; init; } + + /// + [EnumDataType(typeof(WalletFrozenReasons))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override WalletFrozenReasons Reason { get; init; } + + /// + public override WalletFrozenStatues Status { get; init; } = WalletFrozenStatues.Frozen; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/EditWalletFrozenReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/EditWalletFrozenReq.cs new file mode 100644 index 00000000..a5bf8f15 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/EditWalletFrozenReq.cs @@ -0,0 +1,15 @@ +namespace NetAdmin.Domain.Dto.Sys.WalletFrozen; + +/// +/// 请求:编辑钱包冻结 +/// +public sealed record EditWalletFrozenReq : CreateWalletFrozenReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenReq.cs new file mode 100644 index 00000000..08fe0cb6 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenReq.cs @@ -0,0 +1,11 @@ +namespace NetAdmin.Domain.Dto.Sys.WalletFrozen; + +/// +/// 请求:查询钱包冻结 +/// +public sealed record QueryWalletFrozenReq : Sys_WalletFrozen +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs new file mode 100644 index 00000000..f2ff34b3 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs @@ -0,0 +1,57 @@ +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.WalletFrozen; + +/// +/// 响应:查询钱包冻结 +/// +public record QueryWalletFrozenRsp : Sys_WalletFrozen +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Amount { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long FrozenBalanceBefore { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override DateTime? ModifiedTime { get; init; } + + /// + public new virtual QueryUserRsp Owner { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override long? OwnerDeptId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override long? OwnerId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override WalletFrozenReasons Reason { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override WalletFrozenStatues Status { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/SetStatusToThawedReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/SetStatusToThawedReq.cs new file mode 100644 index 00000000..b624a5b7 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/SetStatusToThawedReq.cs @@ -0,0 +1,11 @@ +namespace NetAdmin.Domain.Dto.Sys.WalletFrozen; + +/// +/// 请求:将状态设置为解冻 +/// +public record SetStatusToThawedReq : Sys_WalletFrozen +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs index 03298ca6..b5455e79 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs @@ -5,8 +5,6 @@ namespace NetAdmin.Domain.Dto.Sys.WalletTrade; /// public record CreateWalletTradeReq : Sys_WalletTrade, IValidatableObject { - private readonly TradeTypes _tradeType; - /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override long Amount { get; init; } @@ -33,9 +31,9 @@ public record CreateWalletTradeReq : Sys_WalletTrade, IValidatableObject [JsonIgnore(Condition = JsonIgnoreCondition.Never)] [EnumDataType(typeof(TradeTypes))] public override TradeTypes TradeType { - get => _tradeType; + get; init { - _tradeType = value; + field = value; TradeDirection = value.Attr().Direction; } } diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenReasons.cs b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenReasons.cs new file mode 100644 index 00000000..851a8564 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenReasons.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 钱包冻结原因 +/// +[Export] +public enum WalletFrozenReasons +{ + /// + /// 交易 + /// + [ResourceDescription(nameof(Ln.交易))] + Trade = 1 + + , + + /// + /// 人工 + /// + [ResourceDescription(nameof(Ln.人工))] + Manual = 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenStatues.cs b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenStatues.cs new file mode 100644 index 00000000..f31d0bd4 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/WalletFrozenStatues.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 钱包冻结状态 +/// +[Export] +public enum WalletFrozenStatues +{ + /// + /// 已冻结 + /// + [ResourceDescription(nameof(Ln.已冻结))] + Frozen = 1 + + , + + /// + /// 已解冻 + /// + [ResourceDescription(nameof(Ln.已解冻))] + Thawed = 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/StringExtensions.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/StringExtensions.cs index 3d11f41a..3ffb668f 100644 --- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/StringExtensions.cs +++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Extensions/StringExtensions.cs @@ -24,9 +24,7 @@ public static class StringExtensions /// /// 去掉尾部字符串“Async” /// - #pragma warning disable RCS1047, ASA002, VSTHRD200 - public static string TrimSuffixAsync(this string me) - #pragma warning restore VSTHRD200, ASA002, RCS1047 + public static string TrimAsyncSuffix(this string me) { return me.TrimSuffix("Async"); } @@ -34,7 +32,7 @@ public static class StringExtensions /// /// 去掉尾部字符串“Options” /// - public static string TrimSuffixOptions(this string me) + public static string TrimOptionsSuffix(this string me) { return me.TrimSuffix("Options"); } diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/PhoneNumberHelper.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/PhoneNumberHelper.cs index b6fc9fee..9e10facb 100644 --- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/PhoneNumberHelper.cs +++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/PhoneNumberHelper.cs @@ -27,8 +27,9 @@ public static class PhoneNumberHelper /// /// 电话号码转国家代码 /// - public static CountryCodes PhoneNumberToCountryCode(string phoneNumber) + public static CountryCodes? PhoneNumberToCountryCode(string phoneNumber) { - return _countryList.First(x => phoneNumber.Replace("+", string.Empty).Trim().StartsWith(x.CallingCode, StringComparison.Ordinal)).CountryCode; + return _countryList.FirstOrDefault(x => phoneNumber.Replace("+", string.Empty).Trim().StartsWith(x.CallingCode, StringComparison.Ordinal)) + .CountryCode; } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs index 1b0a3d7b..a2d739fe 100644 --- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs +++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs @@ -17,7 +17,7 @@ public sealed class XmlCommentReader : ISingleton public XmlCommentReader(IOptions specificationDocumentSettings) { var xmlComments = specificationDocumentSettings.Value.XmlComments // - ?? App.GetConfig(nameof(SpecificationDocumentSettingsOptions).TrimSuffixOptions()) + ?? App.GetConfig(nameof(SpecificationDocumentSettingsOptions).TrimOptionsSuffix()) .XmlComments; foreach (var commentFile in xmlComments) { var xmlDoc = new XmlDocument(); diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/ICodeTemplateModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/ICodeTemplateModule.cs index 9a44396e..d2f2efe9 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/ICodeTemplateModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/ICodeTemplateModule.cs @@ -9,10 +9,4 @@ public interface ICodeTemplateModule : ICrudModule -{ - /// - /// 设置代码模板启用状态 - /// - Task SetEnabledAsync(SetCodeTemplateEnabledReq req); -} \ No newline at end of file +>; \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletFrozenModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletFrozenModule.cs new file mode 100644 index 00000000..15aa9a8f --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletFrozenModule.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.Dto.Sys.WalletFrozen; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 钱包冻结模块 +/// +public interface IWalletFrozenModule : ICrudModule +{ + /// + /// 将状态设置为解冻 + /// + Task SetStatusToThawedAsync(SetStatusToThawedReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs index 948d4251..500f854e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Api; using NetAdmin.Domain.Extensions; @@ -176,7 +177,7 @@ public sealed class ApiService( // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -187,6 +188,6 @@ public sealed class ApiService( ret = ret.OrderByDescending(a => a.CreatedTime); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs index f6bc15e7..f04a8106 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.CodeTemplate; using NetAdmin.Domain.Extensions; @@ -113,13 +114,6 @@ public sealed class CodeTemplateService(BasicRepository return ret.Adapt>(); } - /// - public Task SetEnabledAsync(SetCodeTemplateEnabledReq req) - { - req.ThrowIfInvalid(); - return UpdateAsync(req, [nameof(req.Enabled)]); - } - private ISelect QueryInternal(QueryReq req) { var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); @@ -127,7 +121,7 @@ public sealed class CodeTemplateService(BasicRepository // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -137,6 +131,6 @@ public sealed class CodeTemplateService(BasicRepository ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs index 012c38ed..c5e5c7ee 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Config; using NetAdmin.Domain.Extensions; @@ -142,7 +143,7 @@ public sealed class ConfigService(BasicRepository rpo) // // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -152,6 +153,6 @@ public sealed class ConfigService(BasicRepository rpo) // ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserInviteService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserInviteService.cs index 7ac01dfd..56a7213a 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserInviteService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserInviteService.cs @@ -3,4 +3,10 @@ namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; /// /// 用户邀请服务 /// -public interface IUserInviteService : IService, IUserInviteModule; \ No newline at end of file +public interface IUserInviteService : IService, IUserInviteModule +{ + /// + /// 获取关联用户Id + /// + Task> GetAssociatedUserIdAsync(long userId); +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IWalletFrozenService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IWalletFrozenService.cs new file mode 100644 index 00000000..a2707258 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IWalletFrozenService.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 钱包冻结服务 +/// +public interface IWalletFrozenService : IService, IWalletFrozenModule; \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs index e0bb5602..b8edb733 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs @@ -220,7 +220,7 @@ public sealed class DepositOrderService(BasicRepository // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -230,6 +230,6 @@ public sealed class DepositOrderService(BasicRepository ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs index ae779d05..5976a2be 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Dept; using NetAdmin.Domain.Extensions; @@ -143,7 +144,7 @@ public sealed class DeptService(BasicRepository rpo) // // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -158,6 +159,6 @@ public sealed class DeptService(BasicRepository rpo) // ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs index bbe982f9..5566e955 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs @@ -302,6 +302,87 @@ public sealed class DevService(IApiService apiService) : ServiceBase await WriteCsCodeAsync(Path.Combine(dir, $"{req.EntityName}Cache.cs"), templateContent).ConfigureAwait(false); } + private static Task GenerateDomainCreateReqFileAsync(GenerateCsCodeReq req, string project, string prefix) + { + var sb = new StringBuilder(); + _ = sb.AppendLine(CultureInfo.InvariantCulture, $"using {project}.DbMaps.{prefix};"); + if (!req.Interfaces.NullOrEmpty()) { + _ = sb.AppendLine("using NetAdmin.Domain.DbMaps.Dependency.Fields;"); + } + + _ = sb.AppendLine(); + _ = sb.AppendLine(CultureInfo.InvariantCulture, $"namespace {project}.Dto.{prefix}.{req.EntityName};"); + _ = sb.AppendLine(); + _ = sb.AppendLine(CultureInfo.InvariantCulture, $""" + /// + /// 请求:创建{req.Summary} + /// + """); + _ = sb.AppendLine(CultureInfo.InvariantCulture, $"public record Create{req.EntityName}Req : {prefix}_{req.EntityName}"); + _ = sb.Append('{'); + if (req.Interfaces?.Contains(nameof(IFieldEnabled)) == true) { + _ = sb.AppendLine(""" + + /// + public override bool Enabled { get; init; } = true; + """); + } + + if (req.BaseClass != nameof(SimpleEntity) && req.FieldList.Single(x => x.IsPrimary).Type == "string") { + _ = sb.AppendLine(""" + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [Required] + public override string Id { get; init; } + """); + } + + if (req.Interfaces?.Contains(nameof(IFieldSort)) == true) { + _ = sb.AppendLine(""" + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } + """); + } + + if (req.Interfaces?.Contains(nameof(IFieldSummary)) == true) { + _ = sb.AppendLine(""" + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + """); + } + + foreach (var field in req.FieldList) { + var condition = field.IsStruct ? "Never" : "WhenWritingNull"; + var nul = field.IsStruct && field.IsNullable ? "?" : null; + var isEnum = S().GetEnums().FirstOrDefault(x => x.Key == field.Type); + string enumConstraint = null; + if (!isEnum.Key.NullOrEmpty()) { + enumConstraint = $""" + + [EnumDataType(typeof({field.Type}))] + """; + } + + _ = sb.AppendLine(CultureInfo.InvariantCulture, $$""" + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.{{condition}})]{{enumConstraint}} + public override {{field.Type}}{{nul}} {{field.Name}} { get; init; } + """); + } + + _ = sb.Append('}'); + + var outPath = Path.Combine(Path.GetDirectoryName(req.Project)!, "Dto", prefix, req.EntityName); + _ = Directory.CreateDirectory(outPath); + return WriteCsCodeAsync(Path.Combine(outPath, $"Create{req.EntityName}Req.cs"), sb.ToString()); + } + private static Task GenerateDomainEditReqFileAsync(GenerateCsCodeReq req, string project, string prefix) { var sb = new StringBuilder(); @@ -1002,85 +1083,4 @@ public sealed class DevService(IApiService apiService) : ServiceBase content = string.Join('\n', usings) + sb; return File.WriteAllTextAsync(path, usings.Count == 0 ? content.Trim() : content); } - - private Task GenerateDomainCreateReqFileAsync(GenerateCsCodeReq req, string project, string prefix) - { - var sb = new StringBuilder(); - _ = sb.AppendLine(CultureInfo.InvariantCulture, $"using {project}.DbMaps.{prefix};"); - if (!req.Interfaces.NullOrEmpty()) { - _ = sb.AppendLine("using NetAdmin.Domain.DbMaps.Dependency.Fields;"); - } - - _ = sb.AppendLine(); - _ = sb.AppendLine(CultureInfo.InvariantCulture, $"namespace {project}.Dto.{prefix}.{req.EntityName};"); - _ = sb.AppendLine(); - _ = sb.AppendLine(CultureInfo.InvariantCulture, $""" - /// - /// 请求:创建{req.Summary} - /// - """); - _ = sb.AppendLine(CultureInfo.InvariantCulture, $"public record Create{req.EntityName}Req : {prefix}_{req.EntityName}"); - _ = sb.Append('{'); - if (req.Interfaces?.Contains(nameof(IFieldEnabled)) == true) { - _ = sb.AppendLine(""" - - /// - public override bool Enabled { get; init; } = true; - """); - } - - if (req.BaseClass != nameof(SimpleEntity) && req.FieldList.Single(x => x.IsPrimary).Type == "string") { - _ = sb.AppendLine(""" - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - [Required] - public override string Id { get; init; } - """); - } - - if (req.Interfaces?.Contains(nameof(IFieldSort)) == true) { - _ = sb.AppendLine(""" - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.Never)] - public override long Sort { get; init; } - """); - } - - if (req.Interfaces?.Contains(nameof(IFieldSummary)) == true) { - _ = sb.AppendLine(""" - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public override string Summary { get; init; } - """); - } - - foreach (var field in req.FieldList) { - var condition = field.IsStruct ? "Never" : "WhenWritingNull"; - var nul = field.IsStruct && field.IsNullable ? "?" : null; - var isEnum = S().GetEnums().FirstOrDefault(x => x.Key == field.Type); - string enumConstraint = null; - if (!isEnum.Key.NullOrEmpty()) { - enumConstraint = $""" - - [EnumDataType(typeof({field.Type}))] - """; - } - - _ = sb.AppendLine(CultureInfo.InvariantCulture, $$""" - - /// - [JsonIgnore(Condition = JsonIgnoreCondition.{{condition}})]{{enumConstraint}} - public override {{field.Type}}{{nul}} {{field.Name}} { get; init; } - """); - } - - _ = sb.Append('}'); - - var outPath = Path.Combine(Path.GetDirectoryName(req.Project)!, "Dto", prefix, req.EntityName); - _ = Directory.CreateDirectory(outPath); - return WriteCsCodeAsync(Path.Combine(outPath, $"Create{req.EntityName}Req.cs"), sb.ToString()); - } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs index a917057d..e8666cea 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Dic.Catalog; using NetAdmin.Domain.Extensions; @@ -77,7 +78,7 @@ public sealed class DicCatalogService(BasicRepository rpo) return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDicCatalogReq { Id = req.Id }).ConfigureAwait(false) : null; #endif } @@ -126,7 +127,7 @@ public sealed class DicCatalogService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -136,6 +137,6 @@ public sealed class DicCatalogService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs index 9153ca59..b89157d1 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Dic.Content; using NetAdmin.Domain.Extensions; @@ -148,7 +149,7 @@ public sealed class DicContentService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -158,6 +159,6 @@ public sealed class DicContentService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs index 8993274a..56af5d94 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Doc.Catalog; using NetAdmin.Domain.Extensions; @@ -78,7 +79,7 @@ public sealed class DocCatalogService(BasicRepository rpo) return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDocCatalogReq { Id = req.Id }).ConfigureAwait(false) : null; #endif } @@ -127,7 +128,7 @@ public sealed class DocCatalogService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -137,6 +138,6 @@ public sealed class DocCatalogService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs index 053751b8..cfa025c4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Doc.Content; using NetAdmin.Domain.Enums.Sys; @@ -171,7 +172,7 @@ public sealed class DocContentService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -181,6 +182,6 @@ public sealed class DocContentService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs index 6997e80b..8bb6d332 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys; using NetAdmin.Domain.Dto.Sys.JobRecord; @@ -161,7 +162,7 @@ public sealed class JobRecordService(BasicRepository rpo) / // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -171,6 +172,6 @@ public sealed class JobRecordService(BasicRepository rpo) / ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs index 862a1dac..7b2f392b 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs @@ -1,5 +1,6 @@ using Cronos; using FreeSql.Internal; +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys; using NetAdmin.Domain.Dto.Sys.Job; @@ -342,7 +343,7 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -352,6 +353,6 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer ret = ret.OrderByDescending(a => a.LastExecTime); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs index 9b40df67..e3cf549f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.LoginLog; using NetAdmin.Domain.Extensions; @@ -129,7 +130,7 @@ public sealed class LoginLogService(BasicRepository rpo) // // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -139,6 +140,6 @@ public sealed class LoginLogService(BasicRepository rpo) // ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs index 7edfe30c..fe0e345c 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Menu; using NetAdmin.Domain.Extensions; @@ -130,13 +131,14 @@ public sealed class MenuService(BasicRepository rpo, IUserServic { var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); - return req.Order switch { - Orders.None => ret - , Orders.Random => ret.OrderByRandom() - , _ => ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) - .OrderByDescending(a => a.Sort) - .OrderBy(a => a.Name) - .OrderBy(a => a.Id) - }; + ret = req.Order switch { + Orders.None => ret + , Orders.Random => ret.OrderByRandom() + , _ => ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Sort) + .OrderBy(a => a.Name) + .OrderBy(a => a.Id) + }; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs index 1f9ba5a8..7f30edcb 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.RequestLogDetail; using NetAdmin.Domain.Extensions; @@ -113,7 +114,7 @@ public sealed class RequestLogDetailService(BasicRepository a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs index 9545276c..95fb9cba 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys; using NetAdmin.Domain.Dto.Sys.LoginLog; @@ -215,7 +216,7 @@ public sealed class RequestLogService(BasicRepository rpo, // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -226,6 +227,6 @@ public sealed class RequestLogService(BasicRepository rpo, ret = ret.OrderByDescending(a => a.CreatedTime); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs index 9fd45092..9e9f1bad 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Role; using NetAdmin.Domain.Dto.Sys.UserRole; @@ -168,7 +169,7 @@ public sealed class RoleService(BasicRepository rpo, IUserRoleSe // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -183,6 +184,6 @@ public sealed class RoleService(BasicRepository rpo, IUserRoleSe ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs index 4a2c1873..b75e2c52 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.SiteMsgDept; using NetAdmin.Domain.Extensions; @@ -110,7 +111,7 @@ public sealed class SiteMsgDeptService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -120,6 +121,6 @@ public sealed class SiteMsgDeptService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs index 0afc7f65..4f55c997 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.SiteMsgFlag; using NetAdmin.Domain.Extensions; @@ -117,7 +118,7 @@ public sealed class SiteMsgFlagService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -127,6 +128,6 @@ public sealed class SiteMsgFlagService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs index 9b603e7c..57d15541 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.SiteMsgRole; using NetAdmin.Domain.Extensions; @@ -110,7 +111,7 @@ public sealed class SiteMsgRoleService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -120,6 +121,6 @@ public sealed class SiteMsgRoleService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs index 3e91fcaf..a0b9d9bc 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.Contexts; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.SiteMsg; @@ -271,7 +272,7 @@ public sealed class SiteMsgService(BasicRepository rpo, Conte // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -281,7 +282,7 @@ public sealed class SiteMsgService(BasicRepository rpo, Conte ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } private ISelectGrouping // diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs index e308ec43..83e1abaa 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.SiteMsgUser; using NetAdmin.Domain.Extensions; @@ -110,7 +111,7 @@ public sealed class SiteMsgUserService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: return ret.OrderByRandom(); } @@ -120,6 +121,6 @@ public sealed class SiteMsgUserService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs index 5871d46d..f88ac949 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.UserInvite; using NetAdmin.Domain.Extensions; @@ -78,6 +79,16 @@ public sealed class UserInviteService(BasicRepository rpo) return ExportAsync(QueryInternal, req, Ln.用户邀请导出); } + /// + public Task> GetAssociatedUserIdAsync(long userId) + { + return Rpo.Orm.Select() + .DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA) + .Where(a => a.Id == userId) + .AsTreeCte(up: true, disableGlobalFilters: [Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA]) + .ToListAsync(a => a.Id); + } + /// public async Task GetAsync(QueryUserInviteReq req) { @@ -128,9 +139,9 @@ public sealed class UserInviteService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -138,6 +149,6 @@ public sealed class UserInviteService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs index 8fc2c723..1be30c65 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.Contexts; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Dic.Content; @@ -87,7 +88,7 @@ public sealed class UserProfileService(BasicRepository rp return #if DBTYPE_SQLSERVER (await UpdateReturnListAsync(req.Adapt()).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); - #else + #else await UpdateAsync(req.Adapt()).ConfigureAwait(false) > 0 ? await GetAsync(new QueryUserProfileReq { Id = req.Id }).ConfigureAwait(false) : null; @@ -188,9 +189,9 @@ public sealed class UserProfileService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -198,7 +199,7 @@ public sealed class UserProfileService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } private ISelect QueryInternalComplex( diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs index 2afd32c4..70018504 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.UserRole; using NetAdmin.Domain.Extensions; @@ -110,9 +111,9 @@ public sealed class UserRoleService(BasicRepository rpo) // // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -120,6 +121,6 @@ public sealed class UserRoleService(BasicRepository rpo) // ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs index d0e5226f..27b4af8f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.Attributes.DataValidation; using NetAdmin.Domain.Contexts; using NetAdmin.Domain.DbMaps.Sys; @@ -551,9 +552,9 @@ public sealed class UserService( // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -562,7 +563,7 @@ public sealed class UserService( ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } private ISelect QueryInternal(QueryReq req) diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs index 05ca18ea..799acfcc 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.UserWallet; using NetAdmin.Domain.Extensions; @@ -65,7 +66,8 @@ public sealed class UserWalletService(BasicRepository rpo) { req.ThrowIfInvalid(); #if DBTYPE_SQLSERVER - return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); + return (await UpdateReturnListAsync(req, [nameof(req.FrozenBalance), nameof(req.AvailableBalance)]).ConfigureAwait(false)).FirstOrDefault() + ?.Adapt(); #else return await UpdateAsync(req).ConfigureAwait(false) > 0 ? await GetAsync(new QueryUserWalletReq { Id = req.Id }).ConfigureAwait(false) : null; #endif @@ -130,9 +132,9 @@ public sealed class UserWalletService(BasicRepository rpo) // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -140,6 +142,6 @@ public sealed class UserWalletService(BasicRepository rpo) ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs index c0ba3338..e6770af2 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.VerifyCode; using NetAdmin.Domain.Enums.Sys; @@ -191,9 +192,9 @@ public sealed class VerifyCodeService(BasicRepository rpo, // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -201,6 +202,6 @@ public sealed class VerifyCodeService(BasicRepository rpo, ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs new file mode 100644 index 00000000..a7cad568 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs @@ -0,0 +1,195 @@ +using NetAdmin.Application.Extensions; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserWallet; +using NetAdmin.Domain.Dto.Sys.WalletFrozen; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Domain.Extensions; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class WalletFrozenService(BasicRepository rpo) // + : RepositoryService(rpo), IWalletFrozenService +{ + /// + public async Task BulkDeleteAsync(BulkReq req) + { + req.ThrowIfInvalid(); + var ret = 0; + + // ReSharper disable once LoopCanBeConvertedToQuery + foreach (var item in req.Items) { + ret += await DeleteAsync(item).ConfigureAwait(false); + } + + return ret; + } + + /// + public Task CountAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return QueryInternal(req).WithNoLockNoWait().CountAsync(); + } + + /// + public async Task, int>>> CountByAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .GroupBy(req.GetToListExp()) + .ToDictionaryAsync(a => a.Count()) + .ConfigureAwait(false); + return ret.Select(x => new KeyValuePair, int>( + req.RequiredFields.ToImmutableDictionary( + y => y + , y => y.Contains('.') + ? typeof(Sys_WalletFrozen).GetRecursiveProperty(y)!.GetValue( + x.Key.GetType().GetRecursiveProperty(y[..y.LastIndexOf('.')]).GetValue(x.Key))!.ToString() + : typeof(Sys_WalletFrozen).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + .OrderByDescending(x => x.Value); + } + + /// + public async Task CreateAsync(CreateWalletFrozenReq req) + { + req.ThrowIfInvalid(); + var userId = UserToken.Id; + var userDeptId = UserToken.DeptId; + if (req.OwnerId != null) { + userId = req.OwnerId.Value; + var owner = await S().GetAsync(new QueryUserReq { Id = userId }).ConfigureAwait(false); + userDeptId = owner.DeptId; + } + + var wallet = await S().GetAsync(new QueryUserWalletReq { Id = userId }).ConfigureAwait(false); + if (wallet.AvailableBalance < req.Amount) { + throw new NetAdminInvalidOperationException(Ln.钱包可用余额不足); + } + + var frozenBalanceBefore = wallet.FrozenBalance; + if (await S() + .EditAsync(wallet.Adapt() with { + AvailableBalance = wallet.AvailableBalance - req.Amount + , FrozenBalance = wallet.FrozenBalance + req.Amount + }) + .ConfigureAwait(false) == null) { + throw new NetAdminUnexpectedException(Ln.结果非预期); + } + + var ret = await Rpo.InsertAsync(req with { OwnerDeptId = userDeptId, FrozenBalanceBefore = frozenBalanceBefore }).ConfigureAwait(false); + return ret.Adapt(); + } + + /// + public Task DeleteAsync(DelReq req) + { + req.ThrowIfInvalid(); + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + public async Task EditAsync(EditWalletFrozenReq req) + { + req.ThrowIfInvalid(); + #if DBTYPE_SQLSERVER + return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); + #else + return await UpdateAsync(req).ConfigureAwait(false) > 0 + ? await GetAsync(new QueryWalletFrozenReq { Id = req.Id }).ConfigureAwait(false) + : null; + #endif + } + + /// + public Task ExportAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return ExportAsync(QueryInternal, req, Ln.钱包冻结导出); + } + + /// + public async Task GetAsync(QueryWalletFrozenReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); + return ret.Adapt(); + } + + /// + public async Task> PagedQueryAsync(PagedQueryReq 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(req.Page, req.PageSize, total, list.Adapt>()); + } + + /// + public async Task> QueryAsync(QueryReq req) + { + req.ThrowIfInvalid(); + var ret = await QueryInternal(req).WithNoLockNoWait().Take(req.Count).ToListAsync(req).ConfigureAwait(false); + return ret.Adapt>(); + } + + /// + public async Task SetStatusToThawedAsync(SetStatusToThawedReq req) + { + req.ThrowIfInvalid(); + + var frozen = await GetAsync(new QueryWalletFrozenReq { Id = req.Id }).ConfigureAwait(false); + if (frozen?.Status != WalletFrozenStatues.Frozen) { + throw new NetAdminInvalidOperationException(Ln.冻结状态不正确); + } + + var updateCnt = await UpdateAsync(new Sys_WalletFrozen { Status = WalletFrozenStatues.Thawed }, [nameof(req.Status)], null + , a => a.Status == WalletFrozenStatues.Frozen && a.Id == req.Id) + .ConfigureAwait(false); + if (updateCnt != 1) { + throw new NetAdminUnexpectedException(Ln.结果非预期); + } + + var userWalletService = S(); + var wallet = await userWalletService.GetAsync(new QueryUserWalletReq { Id = frozen.OwnerId!.Value }).ConfigureAwait(false); + if (wallet.FrozenBalance < req.Amount) { + throw new NetAdminUnexpectedException(Ln.结果非预期); + } + + _ = await userWalletService + .EditAsync(wallet.Adapt() with { + AvailableBalance = wallet.AvailableBalance + frozen.Amount + , FrozenBalance = wallet.FrozenBalance - frozen.Amount + }) + .ConfigureAwait(false) ?? throw new NetAdminUnexpectedException(Ln.结果非预期); + return 1; + } + + private ISelect QueryInternal(QueryReq req) + { + var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); + + // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault + switch (req.Order) { + case Orders.None: + return ret.AppendOtherFilters(req); + case Orders.Random: + return ret.OrderByRandom().AppendOtherFilters(req); + } + + 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.AppendOtherFilters(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs index 0bc7ff62..78cf9342 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs @@ -1,3 +1,4 @@ +using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.UserWallet; using NetAdmin.Domain.Dto.Sys.WalletTrade; @@ -53,13 +54,10 @@ public sealed class WalletTradeService(BasicRepository rp var userWalletService = S(); var wallet = await userWalletService.GetAsync(new QueryUserWalletReq { Id = req.OwnerId!.Value }).ConfigureAwait(false); if (wallet.AvailableBalance + req.Amount < 0) { - throw new NetAdminInvalidOperationException(Ln.钱包余额不足); + throw new NetAdminInvalidOperationException(Ln.钱包可用余额不足); } - _ = await userWalletService.EditAsync(wallet.Adapt() with { - AvailableBalance = wallet.AvailableBalance + req.Amount - , TotalBalance = wallet.TotalBalance + req.Amount - }) + _ = await userWalletService.EditAsync(wallet.Adapt() with { AvailableBalance = wallet.AvailableBalance + req.Amount }) .ConfigureAwait(false) ?? throw new NetAdminUnexpectedException(Ln.交易失败); var ret = await Rpo.InsertAsync(req with { BalanceBefore = wallet.AvailableBalance, OwnerDeptId = wallet.OwnerDeptId }).ConfigureAwait(false); return ret.Adapt(); @@ -130,9 +128,9 @@ public sealed class WalletTradeService(BasicRepository rp // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: - return ret; + return ret.AppendOtherFilters(req); case Orders.Random: - return ret.OrderByRandom(); + return ret.OrderByRandom().AppendOtherFilters(req); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); @@ -140,6 +138,6 @@ public sealed class WalletTradeService(BasicRepository rp ret = ret.OrderByDescending(a => a.Id); } - return ret; + return ret.AppendOtherFilters(req); } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs index 2b83c1cd..05639583 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs @@ -65,10 +65,4 @@ public sealed class CodeTemplateCache(IDistributedCache cache, ICodeTemplateServ { return Service.QueryAsync(req); } - - /// - public Task SetEnabledAsync(SetCodeTemplateEnabledReq req) - { - return Service.SetEnabledAsync(req); - } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/Dependency/IWalletFrozenCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/Dependency/IWalletFrozenCache.cs new file mode 100644 index 00000000..3c51a636 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/Dependency/IWalletFrozenCache.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 钱包冻结缓存 +/// +public interface IWalletFrozenCache : ICache, IWalletFrozenModule; \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs new file mode 100644 index 00000000..dea11b79 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs @@ -0,0 +1,74 @@ +using NetAdmin.Domain.Dto.Sys.WalletFrozen; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +public sealed class WalletFrozenCache(IDistributedCache cache, IWalletFrozenService service) + : DistributedCache(cache, service), IScoped, IWalletFrozenCache +{ + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CountAsync(QueryReq req) + { + return Service.CountAsync(req); + } + + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Service.CountByAsync(req); + } + + /// + public Task CreateAsync(CreateWalletFrozenReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task EditAsync(EditWalletFrozenReq req) + { + return Service.EditAsync(req); + } + + /// + public Task ExportAsync(QueryReq req) + { + return Service.ExportAsync(req); + } + + /// + public Task GetAsync(QueryWalletFrozenReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task SetStatusToThawedAsync(SetStatusToThawedReq req) + { + return Service.SetStatusToThawedAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs index d49b814f..4c1c6a15 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs @@ -95,12 +95,4 @@ public sealed class CodeTemplateController(ICodeTemplateCache cache) { return Cache.QueryAsync(req); } - - /// - /// 设置代码模板启用状态 - /// - public Task SetEnabledAsync(SetCodeTemplateEnabledReq req) - { - return Cache.SetEnabledAsync(req); - } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs new file mode 100644 index 00000000..ade94d84 --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs @@ -0,0 +1,107 @@ +using NetAdmin.Domain.Dto.Sys.WalletFrozen; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 钱包冻结服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +[Produces(Chars.FLG_HTTP_HEADER_VALUE_APPLICATION_JSON)] +public sealed class WalletFrozenController(IWalletFrozenCache cache) + : ControllerBase(cache), IWalletFrozenModule +{ + /// + /// 批量删除钱包冻结 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 钱包冻结计数 + /// + public Task CountAsync(QueryReq req) + { + return Cache.CountAsync(req); + } + + /// + /// 钱包冻结分组计数 + /// + public Task, int>>> CountByAsync(QueryReq req) + { + return Cache.CountByAsync(req); + } + + /// + /// 创建钱包冻结 + /// + [Transaction] + public Task CreateAsync(CreateWalletFrozenReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除钱包冻结 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 编辑钱包冻结 + /// + [Transaction] + public Task EditAsync(EditWalletFrozenReq req) + { + return Cache.EditAsync(req); + } + + /// + /// 导出钱包冻结 + /// + [NonAction] + public Task ExportAsync(QueryReq req) + { + return Cache.ExportAsync(req); + } + + /// + /// 获取单个钱包冻结 + /// + public Task GetAsync(QueryWalletFrozenReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询钱包冻结 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询钱包冻结 + /// + [NonAction] + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 将状态设置为解冻 + /// + [Transaction] + public Task SetStatusToThawedAsync(SetStatusToThawedReq req) + { + return Cache.SetStatusToThawedAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj b/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj index fc52e374..19bad2c0 100644 --- a/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj +++ b/src/backend/NetAdmin/NetAdmin.Tests/NetAdmin.Tests.csproj @@ -5,7 +5,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/backend/UnitTests/Sys/UserTests.cs b/src/backend/UnitTests/Sys/UserTests.cs index 82723189..b0552963 100644 --- a/src/backend/UnitTests/Sys/UserTests.cs +++ b/src/backend/UnitTests/Sys/UserTests.cs @@ -206,17 +206,6 @@ public class UserTests(WebTestApplicationFactory factory, ITestOutputHe return null; } - /// - [InlineData(null)] - [Theory] - [TestPriority(101600)] - public async Task> QueryRelationAsync(QueryReq req) - { - var rsp = await PostJsonAsync(typeof(UserController), req); - Assert.True(rsp.IsSuccessStatusCode); - return null; - } - /// [InlineData(null)] [Theory] diff --git a/src/backend/YourSolution.AdmServer.Domain/ProjectUsings.cs b/src/backend/YourSolution.AdmServer.Domain/ProjectUsings.cs index bdad148a..196b3220 100644 --- a/src/backend/YourSolution.AdmServer.Domain/ProjectUsings.cs +++ b/src/backend/YourSolution.AdmServer.Domain/ProjectUsings.cs @@ -1 +1 @@ -global using CsvIgnore = CsvHelper.Configuration.Attributes.IgnoreAttribute; \ No newline at end of file +global using CsvIgnore = CsvHelper.Configuration.Attributes.IgnoreAttribute; \ No newline at end of file diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json index 06e5e5bf..992f4816 100644 --- a/src/frontend/admin/package.json +++ b/src/frontend/admin/package.json @@ -10,13 +10,13 @@ }, "dependencies": { "@element-plus/icons-vue": "2.3.1", - "ace-builds": "1.43.0", + "ace-builds": "1.43.1", "aieditor": "1.4.0", "axios": "1.10.0", "crypto-js": "4.2.0", "dayjs": "1.11.13", "echarts": "5.6.0", - "element-plus": "2.10.2", + "element-plus": "2.10.3", "json-bigint": "1.0.0", "markdown-it": "14.1.0", "markdown-it-emoji": "3.0.0", @@ -25,7 +25,7 @@ "sortablejs": "1.15.6", "vkbeautify": "0.99.3", "vue": "3.5.17", - "vue-i18n": "11.1.7", + "vue-i18n": "11.1.9", "vue-router": "4.5.1", "vue3-ace-editor": "2.2.4", "vue3-json-viewer": "2.4.1", @@ -38,7 +38,7 @@ "prettier-plugin-organize-attributes": "1.0.0", "sass": "1.89.2", "terser": "5.43.1", - "vite": "7.0.0" + "vite": "7.0.4" }, "browserslist": [ "> 1%", diff --git a/src/frontend/admin/src/api/sys/codetemplate.js b/src/frontend/admin/src/api/sys/codetemplate.js index 0d91fafc..26256474 100644 --- a/src/frontend/admin/src/api/sys/codetemplate.js +++ b/src/frontend/admin/src/api/sys/codetemplate.js @@ -92,15 +92,4 @@ export default { return await http.post(this.url, data, config) }, }, - - /** - * 设置代码模板启用状态 - */ - setEnabled: { - url: `${config.API_URL}/api/sys/code.template/set.enabled`, - name: `设置代码模板启用状态`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, } \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/walletfrozen.js b/src/frontend/admin/src/api/sys/walletfrozen.js new file mode 100644 index 00000000..9757a6d9 --- /dev/null +++ b/src/frontend/admin/src/api/sys/walletfrozen.js @@ -0,0 +1,106 @@ +/** + * 钱包冻结服务 + * @module @/api/sys/wallet.frozen + */ +import config from '@/config' +import http from '@/utils/request' +export default { + /** + * 批量删除钱包冻结 + */ + bulkDelete: { + url: `${config.API_URL}/api/sys/wallet.frozen/bulk.delete`, + name: `批量删除钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 钱包冻结计数 + */ + count: { + url: `${config.API_URL}/api/sys/wallet.frozen/count`, + name: `钱包冻结计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 钱包冻结分组计数 + */ + countBy: { + url: `${config.API_URL}/api/sys/wallet.frozen/count.by`, + name: `钱包冻结分组计数`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 创建钱包冻结 + */ + create: { + url: `${config.API_URL}/api/sys/wallet.frozen/create`, + name: `创建钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 删除钱包冻结 + */ + delete: { + url: `${config.API_URL}/api/sys/wallet.frozen/delete`, + name: `删除钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 编辑钱包冻结 + */ + edit: { + url: `${config.API_URL}/api/sys/wallet.frozen/edit`, + name: `编辑钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 获取单个钱包冻结 + */ + get: { + url: `${config.API_URL}/api/sys/wallet.frozen/get`, + name: `获取单个钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 分页查询钱包冻结 + */ + pagedQuery: { + url: `${config.API_URL}/api/sys/wallet.frozen/paged.query`, + name: `分页查询钱包冻结`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 将状态设置为解冻 + */ + setStatusToThawed: { + url: `${config.API_URL}/api/sys/wallet.frozen/set.status.to.thawed`, + name: `将状态设置为解冻`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, +} \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icon/archive.vue b/src/frontend/admin/src/assets/icon/archive.vue index f437272f..616c7ab8 100644 --- a/src/frontend/admin/src/assets/icon/archive.vue +++ b/src/frontend/admin/src/assets/icon/archive.vue @@ -1,6 +1,6 @@