diff --git a/assets/res/NetAdmin.Fields.ln b/assets/res/NetAdmin.Fields.ln
index bafc1d51..db1e63fb 100644
--- a/assets/res/NetAdmin.Fields.ln
+++ b/assets/res/NetAdmin.Fields.ln
@@ -41,6 +41,7 @@ USDT
响应体
响应状态码
唯一编码
+处理中
备注
外国人居留证
外部错误
@@ -58,13 +59,14 @@ USDT
已冻结
已发送
已婚
+已完成
已校验
-已经冻结
已解冻
已读
并且
归属角色
归属部门
+待执行
微信支付
成功
或者
@@ -99,10 +101,12 @@ USDT
最后登录时间
未处理异常
未婚
+未结算
未读
本人数据
本科
-本部门和下级部门数据
+本部门和下一级部门数据
+本部门和所有子部门数据
本部门数据
框架
比较数据库结构
@@ -112,6 +116,7 @@ USDT
消息类型
港澳台通行证
用户代理
+用户取消
用户名
用户导出
用户邀请导出
@@ -128,13 +133,12 @@ USDT
等于
等待发送
等待支付
-管理员充值
管理员扣费
+管理员赠送
管理模块
系统模块
绑定手机号码
结果非预期
-结算解冻
群众
自助充值
自定义
@@ -149,8 +153,9 @@ USDT
请求方式
请求日志导出
调试
-超时解冻
身份证
+转账支出
+转账收入
运行
追踪
追踪标识
diff --git a/assets/res/NetAdmin.Statements.ln b/assets/res/NetAdmin.Statements.ln
index dcfd275a..d92ca1de 100644
--- a/assets/res/NetAdmin.Statements.ln
+++ b/assets/res/NetAdmin.Statements.ln
@@ -2,6 +2,7 @@
6位数字
8位以上数字字母组合
XML注释文件不存在
+不能设置自己为上级
中文姓名
事务已回滚
事务已提交
@@ -32,6 +33,7 @@ XML注释文件不存在
性别不正确
手机号码不正确
手机号码不能为空
+指定的上级为该账号的下级用户
接口编码不存在
支付宝账号
支付方式不正确
@@ -59,9 +61,6 @@ XML注释文件不存在
未指定部门
未获取到待执行任务
档案可见性不正确
-模块名称不能为空
-模块类型不能为空
-模块说明不能为空
此节点已下线
民族不正确
消息主题不能为空
@@ -72,13 +71,11 @@ XML注释文件不存在
用户名不能为空
用户名不能是手机号码
用户名或密码错误
-用户名长度4位以上
用户头像不能为空
用户编号不存在
登录用户
目标设备不能为空
短信验证请求不能为空
-种子数据插入完成
站内信不存在
站内信状态不正确
站内信类型不正确
@@ -119,6 +116,7 @@ XML注释文件不存在
随机延时结束时间不正确
随机延时起始时间不正确
非JSON字符串
+此操作不被允许
验证数据不能为空
验证码不正确
验证码不能为空
diff --git a/assets/seed-data/Sys_Menu.json b/assets/seed-data/Sys_Menu.json
index 7477665a..556f2cac 100644
--- a/assets/seed-data/Sys_Menu.json
+++ b/assets/seed-data/Sys_Menu.json
@@ -1,5 +1,5 @@
[
- // ------------------------------ 主控面板 ------------------------------
+ // ------------------------------ 主控面板 /home ------------------------------
{
"Component": "home",
"Icon": "el-icon-house",
@@ -8,9 +8,9 @@
"Path": "/home",
"Sort": 999,
"Title": "主控面板",
- "Type": 1
+ "Type": 1,
},
- // ------------------------------ 权限管理 ------------------------------
+ // ------------------------------ 权限管理 /power ------------------------------
{
"Icon": "el-icon-setting",
"Id": 373837917724677,
@@ -18,96 +18,96 @@
"Path": "/power",
"Sort": 100,
"Title": "权限管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/user",
+ "Component": "sys/power/user",
"Icon": "el-icon-user",
"Id": 373837957840901,
- "Name": "sys/user",
+ "Name": "sys/power/user",
"ParentId": 373837917724677,
"Path": "/power/user",
"Sort": 100,
"Title": "用户管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/role",
+ "Component": "sys/power/role",
"Icon": "sc-icon-role",
"Id": 373838018527237,
- "Name": "sys/role",
+ "Name": "sys/power/role",
"ParentId": 373837917724677,
"Path": "/power/role",
"Sort": 99,
"Title": "角色管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/dept",
+ "Component": "sys/power/dept",
"Icon": "sc-icon-dept",
"Id": 373838045605893,
- "Name": "sys/dept",
+ "Name": "sys/power/dept",
"ParentId": 373837917724677,
"Path": "/power/dept",
"Sort": 98,
"Title": "部门管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/menu",
+ "Component": "sys/power/menu",
"Icon": "el-icon-fold",
"Id": 373838070898693,
- "Name": "sys/menu",
+ "Name": "sys/power/menu",
"ParentId": 373837917724677,
"Path": "/power/menu",
"Sort": 97,
"Title": "菜单管理",
- "Type": 1
+ "Type": 1,
},
- // ------------------------------ 财务管理 ------------------------------
+ // ------------------------------ 财务管理 /finance ------------------------------
{
"Icon": "el-icon-money",
"Id": 690906994118665,
- "Name": "finance",
+ "Name": "sys/finance",
"Path": "/finance",
"Sort": 99,
"Title": "财务管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/wallet",
+ "Component": "sys/finance/wallet",
"Icon": "el-icon-wallet",
"Id": 690907673255942,
- "Name": "sys/wallet",
+ "Name": "sys/finance/wallet",
"ParentId": 690906994118665,
"Path": "/finance/wallet",
"Sort": 100,
"Title": "钱包管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/trade",
+ "Component": "sys/finance/trade",
"Icon": "el-icon-calendar",
"Id": 690907673255943,
- "Name": "sys/trade",
+ "Name": "sys/finance/trade",
"ParentId": 690906994118665,
"Path": "/finance/trade",
"Sort": 99,
"Title": "交易流水",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/order",
+ "Component": "sys/finance/order",
"Icon": "el-icon-shopping-cart",
"Id": 690907673255944,
- "Name": "sys/order",
+ "Name": "sys/finance/order",
"ParentId": 690906994118665,
"Path": "/finance/order",
"Sort": 98,
- "Title": "充值订单",
- "Type": 1
+ "Title": "自助充值",
+ "Type": 1,
},
- // ------------------------------ 营销管理 ------------------------------
+ // ------------------------------ 营销管理 /market ------------------------------
{
"Icon": "el-icon-share",
"Id": 692575802241032,
@@ -115,67 +115,67 @@
"Path": "/market",
"Sort": 98,
"Title": "营销管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/invite",
+ "Component": "sys/market/invite",
"Icon": "el-icon-connection",
"Id": 692575802245126,
- "Name": "sys/invite",
+ "Name": "sys/market/invite",
"ParentId": 692575802241032,
"Path": "/market/invite",
"Sort": 100,
- "Title": "邀请管理",
- "Type": 1
+ "Title": "粉丝管理",
+ "Type": 1,
},
- // ------------------------------ 系统管理 ------------------------------
+ // ------------------------------ 系统管理 /system ------------------------------
{
"Icon": "sc-icon-app",
"Id": 485278637670422,
- "Name": "sys",
- "Path": "/sys",
+ "Name": "system",
+ "Path": "/system",
"Sort": 98,
"Title": "系统管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/config",
+ "Component": "sys/system/config",
"Icon": "el-icon-set-up",
"Id": 380415005847557,
- "Name": "sys/config",
+ "Name": "sys/system/config",
"ParentId": 485278637670422,
"Path": "/system/config",
"Sort": 100,
"Title": "系统设置",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/job",
+ "Component": "sys/system/job",
"Icon": "sc-icon-scheduled-job",
"Id": 510067557638158,
- "Name": "sys/job",
+ "Name": "sys/system/job",
"ParentId": 485278637670422,
"Path": "/system/job",
"Sort": 99,
"Title": "计划作业",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/dic",
+ "Component": "sys/system/dic",
"Icon": "sc-icon-dic",
"Id": 375315654221829,
- "Name": "sys/dic",
+ "Name": "sys/system/dic",
"ParentId": 485278637670422,
"Path": "/system/dic",
"Sort": 98,
"Title": "字典管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/msg",
+ "Component": "sys/system/msg",
"Icon": "el-icon-message",
"Id": 482779610341392,
- "Name": "sys/msg",
+ "Name": "sys/system/msg",
"ParentId": 485278637670422,
"Path": "/system/msg",
"Sort": 97,
@@ -183,28 +183,28 @@
"Type": 1,
},
{
- "Component": "sys/api",
+ "Component": "sys/system/api",
"Icon": "sc-icon-api",
"Id": 397880678895621,
- "Name": "sys/api",
+ "Name": "sys/system/api",
"ParentId": 485278637670422,
"Path": "/system/api",
"Sort": 96,
"Title": "接口管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/cache",
+ "Component": "sys/system/cache",
"Icon": "sc-icon-memory",
"Id": 374911555702789,
- "Name": "sys/cache",
+ "Name": "sys/system/cache",
"ParentId": 485278637670422,
"Path": "/system/cache",
"Sort": 95,
"Title": "缓存管理",
- "Type": 1
+ "Type": 1,
},
- // ------------------------------ 档案管理 ------------------------------
+ // ------------------------------ 档案管理 /archive ------------------------------
{
"Icon": "sc-icon-archive",
"Id": 616214756757512,
@@ -212,20 +212,20 @@
"Path": "/archive",
"Sort": 97,
"Title": "档案管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/doc",
+ "Component": "sys/archive/doc",
"Icon": "el-icon-document",
"Id": 616214756757516,
- "Name": "archive/doc",
+ "Name": "sys/archive/doc",
"ParentId": 616214756757512,
"Path": "/archive/doc",
"Sort": 100,
"Title": "文档管理",
- "Type": 1
+ "Type": 1,
},
- // ------------------------------ 日志管理 ------------------------------
+ // ------------------------------ 日志管理 /log ------------------------------
{
"Icon": "el-icon-tickets",
"Id": 374792687640581,
@@ -233,7 +233,7 @@
"Path": "/log",
"Sort": 96,
"Title": "日志管理",
- "Type": 1
+ "Type": 1,
},
{
"Component": "sys/log/operation",
@@ -257,7 +257,7 @@
"Title": "登录日志",
"Type": 1,
},
- // ------------------------------ 开发管理 ------------------------------
+ // ------------------------------ 开发管理 /dev ------------------------------
{
"Icon": "sc-icon-code",
"Id": 373838105399301,
@@ -265,29 +265,29 @@
"Path": "/dev",
"Sort": 95,
"Title": "开发管理",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "dev/code",
+ "Component": "sys/dev/code",
"Icon": "sc-icon-code2",
"Id": 373838147022853,
- "Name": "dev/code",
+ "Name": "sys/dev/code",
"ParentId": 373838105399301,
"Path": "/dev/code",
"Sort": 100,
"Title": "代码生成",
- "Type": 1
+ "Type": 1,
},
{
- "Component": "sys/template",
+ "Component": "sys/dev/template",
"Icon": "sc-icon-template",
"Id": 694076641718288,
- "Name": "dev/template",
+ "Name": "sys/dev/template",
"ParentId": 373838105399301,
"Path": "/dev/template",
"Sort": 99,
"Title": "页面模板",
- "Type": 1
+ "Type": 1,
},
{
"Id": 482777529417739,
diff --git a/build/code.quality.props b/build/code.quality.props
index 47425c89..a00a7dc7 100644
--- a/build/code.quality.props
+++ b/build/code.quality.props
@@ -19,11 +19,11 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs b/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs
index 8512b512..0df019af 100644
--- a/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs
+++ b/src/backend/NetAdmin/NetAdmin.Application/Extensions/ISelectExtensions.cs
@@ -16,7 +16,7 @@ public static class ISelectExtensions
{
if (req.IgnoreOwner) {
me = me.DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_SELF, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT
- , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD);
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON);
}
return me;
diff --git a/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs b/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs
index 9dd729c8..062f6752 100644
--- a/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs
+++ b/src/backend/NetAdmin/NetAdmin.Application/Modules/ICrudModule.cs
@@ -69,4 +69,9 @@ public interface ICrudModule
Task> QueryAsync(QueryReq req);
+
+ ///
+ /// 实体求和
+ ///
+ Task SumAsync(QueryReq req);
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Application/Services/RepositoryService.cs b/src/backend/NetAdmin/NetAdmin.Application/Services/RepositoryService.cs
index e4b82017..7c8a8b88 100644
--- a/src/backend/NetAdmin/NetAdmin.Application/Services/RepositoryService.cs
+++ b/src/backend/NetAdmin/NetAdmin.Application/Services/RepositoryService.cs
@@ -103,7 +103,7 @@ public abstract class RepositoryService(BasicReposit
var update = BuildUpdate(newValue, includeFields, excludeFields, ignoreVersion).Where(whereExp).Where(whereSql);
if (disableGlobalDataFilter) {
update = update.DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_SELF, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT
- , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD);
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON);
}
return update.ExecuteEffectsAsync();
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs
index 48353a24..e9d4fea3 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs
@@ -8,5 +8,5 @@ public interface IFieldSummary
///
/// 备注
///
- string Summary { get; init; }
+ string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
index 14b846b1..ad5e57c8 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs
@@ -79,5 +79,5 @@ public record Sys_Api : ImmutableEntity, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
}
\ No newline at end of file
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 0bef2ece..a0255a24 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_CodeTemplate.cs
@@ -85,5 +85,5 @@ public record Sys_CodeTemplate : VersionEntity, IFieldSort, IFieldSummary, IFiel
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
index 0f1ddc92..668c5cbb 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs
@@ -68,5 +68,5 @@ public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
index 7c721761..5ace9df5 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs
@@ -45,7 +45,7 @@ public record Sys_DicContent : VersionEntity, IFieldEnabled, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 键值
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
index 2dbb25c4..51f7e741 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs
@@ -134,7 +134,7 @@ public record Sys_Job : VersionEntity, IFieldEnabled, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 执行用户
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
index bd8614b6..1e37d3f3 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs
@@ -104,7 +104,7 @@ public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 此角色下的用户集合
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
index 02dc1a4c..d7cd14e4 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs
@@ -62,7 +62,7 @@ public record Sys_SiteMsg : VersionEntity, IRegister, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 消息主题
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
index f49ffebd..e3b9504b 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs
@@ -121,7 +121,7 @@ public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 授权验证Token,全局唯一,可以随时重置(强制下线)
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs
index b5d45bf7..a7ac2f71 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs
@@ -46,6 +46,14 @@ public record Sys_UserInvite : VersionEntity, IFieldOwner
[JsonIgnore]
public virtual long? OwnerId { get; init; }
+ ///
+ /// 允许自助充值
+ ///
+ [Column]
+ [CsvIgnore]
+ [JsonIgnore]
+ public virtual bool SelfRechargeAllowed { 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
index 16407897..0f788736 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletFrozen.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletFrozen.cs
@@ -87,7 +87,7 @@ public record Sys_WalletFrozen : LiteVersionEntity, IFieldOwner, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 钱包
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletTrade.cs b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletTrade.cs
index e2e29cd1..e8333283 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletTrade.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_WalletTrade.cs
@@ -12,7 +12,7 @@ public record Sys_WalletTrade : ImmutableEntity, IFieldOwner, IFieldSummary
[Column]
[CsvIgnore]
[JsonIgnore]
- public virtual long Amount { get; init; }
+ public virtual long Amount { get; set; }
///
/// 交易前余额
@@ -60,7 +60,7 @@ public record Sys_WalletTrade : ImmutableEntity, IFieldOwner, IFieldSummary
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
///
/// 交易方向
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
index b767d0fb..f432942b 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Dependency/QueryReq.cs
@@ -48,6 +48,23 @@ public record QueryReq : DataAbstraction
///
public string[] RequiredFields { get; init; }
+ ///
+ /// 求和表达式
+ ///
+ public Expression> GetSumExp()
+ {
+ if (RequiredFields.NullOrEmpty()) {
+ return null;
+ }
+
+ var field = RequiredFields[0];
+ var leftParameter = Expression.Parameter(typeof(TEntity), "a");
+ var prop = typeof(TEntity).GetRecursiveProperty(field);
+ return prop == null || prop.GetCustomAttribute() != null
+ ? null
+ : Expression.Lambda>(CreatePropertyExpression(leftParameter, field), leftParameter);
+ }
+
///
/// 列表表达式
///
@@ -79,4 +96,9 @@ public record QueryReq : DataAbstraction
, bindings.SelectMany(x => x.Item1.PropertyType == x.Item2.Type ? [Expression.Bind(x.Item1, x.Item2)] : x.Item2.Bindings.ToArray()));
return Expression.Lambda>(expBody, expParameter);
}
+
+ private static Expression CreatePropertyExpression(ParameterExpression param, string propertyPath)
+ {
+ return propertyPath.Split('.').Aggregate(param, Expression.PropertyOrField);
+ }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/ExportApiRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/ExportApiRsp.cs
index 23f45161..bfd44f50 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/ExportApiRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/ExportApiRsp.cs
@@ -31,5 +31,5 @@ public sealed record ExportApiRsp : QueryApiRsp
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.接口描述))]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs
index 3ada91ac..aa1d3e06 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs
@@ -33,5 +33,5 @@ public record QueryApiRsp : Sys_Api
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
}
\ No newline at end of file
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 29810c4b..bc470d59 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/CreateCodeTemplateReq.cs
@@ -26,5 +26,5 @@ public record CreateCodeTemplateReq : Sys_CodeTemplate
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
}
\ 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 adb11b27..8cd36fc9 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/CodeTemplate/QueryCodeTemplateRsp.cs
@@ -64,7 +64,7 @@ public record QueryCodeTemplateRsp : Sys_CodeTemplate
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/DepositOrder/CreateDepositOrderReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/DepositOrder/CreateDepositOrderReq.cs
index 86cdd4f8..2026958d 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/DepositOrder/CreateDepositOrderReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/DepositOrder/CreateDepositOrderReq.cs
@@ -13,7 +13,7 @@ public record CreateDepositOrderReq : Sys_DepositOrder
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
- [Range(100, long.MaxValue)]
+ [Range(100, int.MaxValue)]
public override long DepositPoint { get; init; }
///
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs
index 83667e8a..08e4b66f 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs
@@ -23,5 +23,5 @@ public record CreateDeptReq : Sys_Dept
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/ExportDeptRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/ExportDeptRsp.cs
index 3a2424c2..34b6b523 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/ExportDeptRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/ExportDeptRsp.cs
@@ -43,5 +43,5 @@ public sealed record ExportDeptRsp : QueryDeptRsp
[CsvIndex(3)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.备注))]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs
index a3cdb87a..1574aae6 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs
@@ -34,7 +34,7 @@ public record QueryDeptRsp : Sys_Dept
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
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 6be97f24..ff980070 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/FieldItemInfo.cs
@@ -38,7 +38,7 @@ public sealed record FieldItemInfo : DataAbstraction
///
/// 备注
///
- public string Summary { get; init; }
+ public string Summary { get; set; }
///
/// 类型
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 57c09451..095d7bed 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs
@@ -33,5 +33,5 @@ public sealed record GenerateCsCodeReq : DataAbstraction
///
/// 描述
///
- public string Summary { get; init; }
+ public string Summary { get; set; }
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs
index cc7bafee..1b72494a 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs
@@ -21,7 +21,7 @@ public record CreateDicContentReq : Sys_DicContent
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/ExportDicContentRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/ExportDicContentRsp.cs
index 4edf2f59..a24c09e3 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/ExportDicContentRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/ExportDicContentRsp.cs
@@ -27,7 +27,7 @@ public sealed record ExportDicContentRsp : QueryDicContentRsp
[CsvIndex(4)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.备注))]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[CsvIndex(1)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs
index 802fe7e2..7d0d7fc8 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs
@@ -23,7 +23,7 @@ public record QueryDicContentRsp : Sys_DicContent
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/CreateJobReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/CreateJobReq.cs
index fc760b39..5e84c886 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/CreateJobReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/CreateJobReq.cs
@@ -58,7 +58,7 @@ public record CreateJobReq : Sys_Job
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/QueryJobRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/QueryJobRsp.cs
index 0a4f8bcf..5ebdc6a7 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/QueryJobRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Job/QueryJobRsp.cs
@@ -112,7 +112,7 @@ public record QueryJobRsp : Sys_Job
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
public new virtual QueryUserRsp User { get; init; }
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs
index 43484ad7..5fa940ce 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs
@@ -55,7 +55,7 @@ public record CreateRoleReq : Sys_Role
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
protected override IEnumerable ValidateInternal(ValidationContext validationContext)
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs
index 8a223b94..cf604bce 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs
@@ -63,7 +63,7 @@ public record QueryRoleRsp : Sys_Role
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/ExportSiteMsgRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/ExportSiteMsgRsp.cs
index 88d0b74e..fb68d33f 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/ExportSiteMsgRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/ExportSiteMsgRsp.cs
@@ -46,7 +46,7 @@ public sealed record ExportSiteMsgRsp : QuerySiteMsgRsp
[CsvIndex(4)]
[CsvIgnore(false)]
[CsvName(nameof(Ln.消息摘要))]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[CsvIndex(3)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
index b3f80ee7..38effaed 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs
@@ -53,7 +53,7 @@ public record QuerySiteMsgRsp : Sys_SiteMsg
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateEditUserReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateEditUserReq.cs
index b541f285..d8a70800 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateEditUserReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateEditUserReq.cs
@@ -44,7 +44,7 @@ public abstract record CreateEditUserReq : Sys_User
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs
index e11a16c8..d2f6e428 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.Domain.Dto.Sys.User;
///
/// 请求:创建用户
///
-public sealed record CreateUserReq : CreateEditUserReq
+public record CreateUserReq : CreateEditUserReq
{
///
public override bool Enabled { get; init; } = true;
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs
index 1383749f..85eab844 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs
@@ -1,5 +1,6 @@
using NetAdmin.Domain.Dto.Sys.Dept;
using NetAdmin.Domain.Dto.Sys.Role;
+using NetAdmin.Domain.Dto.Sys.UserInvite;
namespace NetAdmin.Domain.Dto.Sys.User;
@@ -30,7 +31,7 @@ public record QueryUserRsp : Sys_User
///
/// 本部门以及子部门编号
///
- public List DeptIds { get; init; }
+ public IReadOnlyCollection DeptIds { get; init; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -44,6 +45,9 @@ public record QueryUserRsp : Sys_User
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override long Id { get; init; }
+ ///
+ public new virtual QueryUserInviteRsp Invite { get; init; }
+
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public override string InviteCode { get; init; }
@@ -61,7 +65,7 @@ public record QueryUserRsp : Sys_User
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateFansAccountReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateFansAccountReq.cs
new file mode 100644
index 00000000..e78169af
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateFansAccountReq.cs
@@ -0,0 +1,8 @@
+using NetAdmin.Domain.Dto.Sys.User;
+
+namespace NetAdmin.Domain.Dto.Sys.UserInvite;
+
+///
+/// 请求:创建粉丝账号
+///
+public record CreateFansAccountReq : CreateUserReq;
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs
index f7c19b3a..c45909af 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs
@@ -8,4 +8,7 @@ public record CreateUserInviteReq : Sys_UserInvite
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override int CommissionRatio { get; init; }
+
+ ///
+ public override bool SelfRechargeAllowed { get; init; } = true;
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs
index 38eb4b74..802f0da6 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs
@@ -54,6 +54,10 @@ public record QueryUserInviteRsp : Sys_UserInvite
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public override long? OwnerId { get; init; }
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override bool SelfRechargeAllowed { get; init; }
+
///
[CsvIgnore]
public new virtual QueryUserRsp User { get; init; }
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetFansRoleReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetFansRoleReq.cs
new file mode 100644
index 00000000..2f616098
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetFansRoleReq.cs
@@ -0,0 +1,15 @@
+namespace NetAdmin.Domain.Dto.Sys.UserInvite;
+
+///
+/// 请求:修改粉丝角色
+///
+public record SetFansRoleReq : Sys_UserInvite
+{
+ ///
+ public override long Id { get; init; }
+
+ ///
+ /// 角色编号
+ ///
+ public long RoleId { get; init; }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetInviterReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetInviterReq.cs
new file mode 100644
index 00000000..a72d8528
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetInviterReq.cs
@@ -0,0 +1,30 @@
+namespace NetAdmin.Domain.Dto.Sys.UserInvite;
+
+///
+/// 请求:设置上级
+///
+public record SetInviterReq : Sys_UserInvite
+{
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override long Id { get; init; }
+
+ ///
+ [Required]
+ [Range(1, long.MaxValue)]
+ public override long? OwnerId { get; init; }
+
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override long Version { get; init; }
+
+ ///
+ protected override IEnumerable ValidateInternal(ValidationContext validationContext)
+ {
+ if (OwnerId == Id) {
+ yield return new ValidationResult(Ln.不能设置自己为上级, [nameof(OwnerId)]);
+ }
+
+ yield return ValidationResult.Success;
+ }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetSelfRechargeAllowedReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetSelfRechargeAllowedReq.cs
new file mode 100644
index 00000000..b9fe7e42
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetSelfRechargeAllowedReq.cs
@@ -0,0 +1,19 @@
+namespace NetAdmin.Domain.Dto.Sys.UserInvite;
+
+///
+/// 请求:设置允许自助充值
+///
+public record SetSelfRechargeAllowedReq : Sys_UserInvite
+{
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override long Id { get; init; }
+
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override bool SelfRechargeAllowed { 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/CreateWalletFrozenReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs
index f1ac994f..af385be8 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/CreateWalletFrozenReq.cs
@@ -25,7 +25,7 @@ public record CreateWalletFrozenReq : Sys_WalletFrozen
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs
index f2ff34b3..504f17ec 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletFrozen/QueryWalletFrozenRsp.cs
@@ -49,7 +49,7 @@ public record QueryWalletFrozenRsp : Sys_WalletFrozen
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
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 4326e466..94254fbc 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/CreateWalletTradeReq.cs
@@ -7,7 +7,7 @@ public record CreateWalletTradeReq : Sys_WalletTrade
{
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
- public override long Amount { get; init; }
+ public override long Amount { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
@@ -22,7 +22,7 @@ public record CreateWalletTradeReq : Sys_WalletTrade
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
public override TradeDirections TradeDirection { get; init; }
@@ -42,9 +42,12 @@ public record CreateWalletTradeReq : Sys_WalletTrade
protected override IEnumerable ValidateInternal(ValidationContext validationContext)
{
var tradeDirection = TradeType.Attr().Direction;
- if (Amount == 0 || (tradeDirection == TradeDirections.Income && Amount < 0) || (tradeDirection == TradeDirections.Expense && Amount > 0)) {
+ if (Amount == 0) {
yield return new ValidationResult(Ln.交易金额不正确, [nameof(Amount)]);
}
+ else if ((tradeDirection == TradeDirections.Income && Amount < 0) || (tradeDirection == TradeDirections.Expense && Amount > 0)) {
+ Amount = -Amount;
+ }
yield return ValidationResult.Success;
}
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/QueryWalletTradeRsp.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/QueryWalletTradeRsp.cs
index 5d20164b..7d406c02 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/QueryWalletTradeRsp.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/QueryWalletTradeRsp.cs
@@ -9,7 +9,7 @@ public record QueryWalletTradeRsp : Sys_WalletTrade
{
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
- public override long Amount { get; init; }
+ public override long Amount { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
@@ -49,7 +49,7 @@ public record QueryWalletTradeRsp : Sys_WalletTrade
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
///
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/TransferReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/TransferReq.cs
new file mode 100644
index 00000000..cdc8f4df
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/TransferReq.cs
@@ -0,0 +1,28 @@
+namespace NetAdmin.Domain.Dto.Sys.WalletTrade;
+
+///
+/// 请求:转账
+///
+public record TransferReq : Sys_WalletTrade
+{
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public override long Amount { get; set; }
+
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ [Required]
+ [UserId]
+ [Range(1, long.MaxValue)]
+ public override long? OwnerId { get; init; }
+
+ ///
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public override string Summary { get; set; }
+
+ ///
+ protected override IEnumerable ValidateInternal(ValidationContext validationContext)
+ {
+ yield return Amount <= 0 ? new ValidationResult(Ln.交易金额不正确, [nameof(Amount)]) : ValidationResult.Success;
+ }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/DataScopes.cs b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/DataScopes.cs
index 4f5c9d98..779c9d63 100644
--- a/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/DataScopes.cs
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Enums/Sys/DataScopes.cs
@@ -15,10 +15,10 @@ public enum DataScopes
,
///
- /// 本部门和下级部门数据
+ /// 本部门和所有子部门数据
///
- [ResourceDescription(nameof(Ln.本部门和下级部门数据))]
- DeptWithChild = 2
+ [ResourceDescription(nameof(Ln.本部门和所有子部门数据))]
+ DeptWithChildren = 2
,
@@ -43,4 +43,12 @@ public enum DataScopes
///
[ResourceDescription(nameof(Ln.指定部门数据))]
SpecificDept = 5
+
+ ,
+
+ ///
+ /// 本部门和下一级部门数据
+ ///
+ [ResourceDescription(nameof(Ln.本部门和下一级部门数据))]
+ DeptWithSon = 6
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Events/Sys/UserRegisteredEvent.cs b/src/backend/NetAdmin/NetAdmin.Domain/Events/Sys/UserRegisteredEvent.cs
new file mode 100644
index 00000000..af248307
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Domain/Events/Sys/UserRegisteredEvent.cs
@@ -0,0 +1,13 @@
+using NetAdmin.Domain.Dto.Sys.User;
+
+namespace NetAdmin.Domain.Events.Sys;
+
+///
+/// 用户注册事件
+///
+public sealed record UserRegisteredEvent : EventData
+{
+ ///
+ public UserRegisteredEvent(UserInfoRsp payLoad) //
+ : base(payLoad) { }
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Constant/Chars.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Constant/Chars.cs
index ba3c5ebd..554d938b 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Constant/Chars.cs
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Constant/Chars.cs
@@ -46,11 +46,13 @@ public static class Chars
public const string FLG_DB_FIELD_TYPE_VARCHAR_7 = "varchar(7)";
public const string FLG_DB_INDEX_PREFIX = "idx_{tablename}_";
public const string FLG_DB_TABLE_NAME_PREFIX = "";
- public const string FLG_FREE_SQL_GLOBAL_FILTER_SELF = nameof(FLG_FREE_SQL_GLOBAL_FILTER_SELF);
- public const string FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD);
- public const string FLG_FREE_SQL_GLOBAL_FILTER_DEPT = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DEPT);
+ public const string FLG_DIC_CATALOG_NEW_USER_ROLE_CONFIG = "new-user-role-config";
public const string FLG_FREE_SQL_GLOBAL_FILTER_DELETE = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DELETE);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_DEPT = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DEPT);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON = nameof(FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON);
public const string FLG_FREE_SQL_GLOBAL_FILTER_MEMBER = nameof(FLG_FREE_SQL_GLOBAL_FILTER_MEMBER);
+ public const string FLG_FREE_SQL_GLOBAL_FILTER_SELF = nameof(FLG_FREE_SQL_GLOBAL_FILTER_SELF);
public const string FLG_FREE_SQL_GLOBAL_FILTER_TENANT = nameof(FLG_FREE_SQL_GLOBAL_FILTER_TENANT);
public const string FLG_FRONT_APP_SET_HOME_GRID = "APP_SET_HOME_GRID";
public const string FLG_HTTP_HEADER_KEY_ACCESS_TOKEN = "ACCESS-TOKEN";
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/AdminTradeTypes.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/AdminTradeTypes.cs
new file mode 100644
index 00000000..d2d5e1dd
--- /dev/null
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/AdminTradeTypes.cs
@@ -0,0 +1,24 @@
+namespace NetAdmin.Infrastructure.Enums;
+
+///
+/// 管理员交易类型
+///
+[Export]
+public enum AdminTradeTypes
+{
+ ///
+ /// 管理员赠送
+ ///
+ [ResourceDescription(nameof(Ln.管理员赠送))]
+ [Trade(Direction = TradeDirections.Income)]
+ AdminDeposit = 1
+
+ ,
+
+ ///
+ /// 管理员扣费
+ ///
+ [ResourceDescription(nameof(Ln.管理员扣费))]
+ [Trade(Direction = TradeDirections.Expense)]
+ AdminDeduct = 2
+}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/TradeTypes.cs b/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/TradeTypes.cs
index ba1fd3f3..91b0e6c4 100644
--- a/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/TradeTypes.cs
+++ b/src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/TradeTypes.cs
@@ -7,9 +7,9 @@ namespace NetAdmin.Infrastructure.Enums;
public enum TradeTypes
{
///
- /// 管理员充值
+ /// 管理员赠送
///
- [ResourceDescription(nameof(Ln.管理员充值))]
+ [ResourceDescription(nameof(Ln.管理员赠送))]
[Trade(Direction = TradeDirections.Income)]
AdminDeposit = 1
@@ -30,4 +30,22 @@ public enum TradeTypes
[ResourceDescription(nameof(Ln.自助充值))]
[Trade(Direction = TradeDirections.Income)]
SelfDeposit = 3
+
+ ,
+
+ ///
+ /// 转账支出
+ ///
+ [ResourceDescription(nameof(Ln.转账支出))]
+ [Trade(Direction = TradeDirections.Expense)]
+ TransferExpense = 4
+
+ ,
+
+ ///
+ /// 转账收入
+ ///
+ [ResourceDescription(nameof(Ln.转账收入))]
+ [Trade(Direction = TradeDirections.Income)]
+ TransferIncome = 5
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs
index 0d1f8217..cbd0d8eb 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs
@@ -1,3 +1,5 @@
+using NetAdmin.Domain.Dto.Sys.Dic.Content;
+using NetAdmin.Domain.Dto.Sys.User;
using NetAdmin.Domain.Dto.Sys.UserInvite;
namespace NetAdmin.SysComponent.Application.Modules.Sys;
@@ -11,8 +13,38 @@ public interface IUserInviteModule : ICrudModule
{
+ ///
+ /// 创建粉丝账号
+ ///
+ Task CreateFansAccountAsync(CreateFansAccountReq req);
+
+ ///
+ /// 获取自己是否允许自助充值
+ ///
+ Task GetSelfRechargeAllowedAsync();
+
+ ///
+ /// 查询可分配的角色
+ ///
+ Task> QueryRolesAllowApplyAsync();
+
///
/// 设置返佣比率
///
Task SetCommissionRatioAsync(SetCommissionRatioReq req);
+
+ ///
+ /// 修改粉丝角色
+ ///
+ Task SetFansRoleAsync(SetFansRoleReq req);
+
+ ///
+ /// 设置上级
+ ///
+ Task SetInviterAsync(SetInviterReq req);
+
+ ///
+ /// 设置允许自助充值
+ ///
+ Task SetSelfRechargeAllowedAsync(SetSelfRechargeAllowedReq req);
}
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserWalletModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserWalletModule.cs
index a0d0dab5..e9606188 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserWalletModule.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserWalletModule.cs
@@ -6,7 +6,7 @@ namespace NetAdmin.SysComponent.Application.Modules.Sys;
/// 用户钱包模块
///
public interface IUserWalletModule : ICrudModule;
\ No newline at end of file
diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletTradeModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletTradeModule.cs
index 1228079a..17734a5a 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletTradeModule.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IWalletTradeModule.cs
@@ -9,4 +9,15 @@ public interface IWalletTradeModule : ICrudModule;
\ No newline at end of file
+>
+{
+ ///
+ /// 从他人账户转账给自己
+ ///
+ Task TransferFromAnotherAccountAsync(TransferReq req);
+
+ ///
+ /// 转账到他人账户
+ ///
+ Task TransferToAnotherAccountAsync(TransferReq 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 500f854e..855c1959 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs
@@ -36,7 +36,7 @@ public sealed class ApiService(
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Api).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Api).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -140,6 +140,13 @@ public sealed class ApiService(
}
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
///
public async Task SyncAsync()
{
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 f04a8106..06b1d9ae 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/CodeTemplateService.cs
@@ -44,8 +44,9 @@ public sealed class CodeTemplateService(BasicRepository
y => y
, y => y.Contains('.')
? typeof(Sys_CodeTemplate).GetRecursiveProperty(y)!.GetValue(
- x.Key.GetType().GetRecursiveProperty(y[..y.LastIndexOf('.')]).GetValue(x.Key))!.ToString()
- : typeof(Sys_CodeTemplate).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ x.Key.GetType().GetRecursiveProperty(y[..y.LastIndexOf('.')]).GetValue(x.Key))
+ ?.ToString()
+ : typeof(Sys_CodeTemplate).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -114,6 +115,13 @@ public sealed class CodeTemplateService(BasicRepository
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 c5e5c7ee..e996350e 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs
@@ -40,7 +40,7 @@ public sealed class ConfigService(BasicRepository rpo) //
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Config).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Config).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -132,6 +132,13 @@ public sealed class ConfigService(BasicRepository rpo) //
return UpdateAsync(req, [nameof(req.Enabled)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.Include(a => a.UserRegisterDept)
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 56a7213a..8437ca15 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
@@ -8,5 +8,5 @@ public interface IUserInviteService : IService, IUserInviteModule
///
/// 获取关联用户Id
///
- Task> GetAssociatedUserIdAsync(long userId);
+ Task> GetAssociatedUserIdAsync(long userId, bool up = true);
}
\ 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 955922dc..edb5ebca 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DepositOrderService.cs
@@ -213,6 +213,13 @@ public sealed class DepositOrderService(BasicRepository
return ret;
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 340ac45b..0eb12c1a 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs
@@ -40,7 +40,7 @@ public sealed class DeptService(BasicRepository rpo) //
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Dept).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Dept).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -131,6 +131,13 @@ public sealed class DeptService(BasicRepository rpo) //
return UpdateAsync(req, [nameof(req.Enabled)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
return QueryInternal(req, false);
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 5566e955..fbb7fc98 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs
@@ -352,7 +352,7 @@ public sealed class DevService(IApiService apiService) : ServiceBase
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
""");
}
@@ -661,7 +661,7 @@ public sealed class DevService(IApiService apiService) : ServiceBase
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)]
[CsvIgnore]
[JsonIgnore]
- public virtual string Summary { get; init; }
+ public virtual string Summary { get; set; }
""");
}
@@ -904,7 +904,7 @@ public sealed class DevService(IApiService apiService) : ServiceBase
///
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
- public override string Summary { get; init; }
+ public override string Summary { get; set; }
""");
}
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 bffa0177..f6052fa9 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs
@@ -41,7 +41,7 @@ public sealed class DicCatalogService(BasicRepository rpo)
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_DicCatalog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_DicCatalog).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -120,6 +120,13 @@ public sealed class DicCatalogService(BasicRepository rpo)
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
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 b89157d1..bf9745b5 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs
@@ -41,7 +41,7 @@ public sealed class DicContentService(BasicRepository rpo)
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_DicContent).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_DicContent).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -138,6 +138,13 @@ public sealed class DicContentService(BasicRepository rpo)
return UpdateAsync(req, [nameof(Sys_DicContent.Enabled)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
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 56af5d94..416cdc00 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocCatalogService.cs
@@ -41,7 +41,7 @@ public sealed class DocCatalogService(BasicRepository rpo)
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_DocCatalog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_DocCatalog).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -79,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
}
@@ -121,6 +121,13 @@ public sealed class DocCatalogService(BasicRepository rpo)
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 cfa025c4..d8aabd8d 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/DocContentService.cs
@@ -45,7 +45,7 @@ public sealed class DocContentService(BasicRepository rpo)
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_DocContent).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_DocContent).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -131,6 +131,13 @@ public sealed class DocContentService(BasicRepository rpo)
return UpdateAsync(req, [nameof(Sys_DocContent.Enabled)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
///
public async Task ViewAsync(QueryDocContentReq req)
{
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 8bb6d332..e30cfbc6 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobRecordService.cs
@@ -41,7 +41,7 @@ public sealed class JobRecordService(BasicRepository rpo) /
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_JobRecord).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_JobRecord).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -150,6 +150,13 @@ public sealed class JobRecordService(BasicRepository rpo) /
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.Include(a => a.Job)
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 7b2f392b..c70cc6e2 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/JobService.cs
@@ -45,7 +45,7 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Job).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Job).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -317,6 +317,13 @@ public sealed class JobService(BasicRepository rpo, IJobRecordSer
return UpdateAsync(req, [nameof(Sys_Job.Enabled)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private static DateTime? GetNextExecTime(string cron)
{
return CronExpression.Parse(cron, CronFormat.IncludeSeconds).GetNextOccurrence(DateTime.UtcNow, TimeZoneInfo.Local)?.ToLocalTime();
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 e3cf549f..0a514f7e 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/LoginLogService.cs
@@ -40,7 +40,7 @@ public sealed class LoginLogService(BasicRepository rpo) //
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_LoginLog).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_LoginLog).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -117,6 +117,13 @@ public sealed class LoginLogService(BasicRepository rpo) //
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 fe0e345c..8f88882a 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs
@@ -40,7 +40,7 @@ public sealed class MenuService(BasicRepository rpo, IUserServic
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Menu).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Menu).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -103,6 +103,13 @@ public sealed class MenuService(BasicRepository rpo, IUserServic
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
///
public async Task> UserMenusAsync()
{
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 7f30edcb..92d3568a 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogDetailService.cs
@@ -42,7 +42,7 @@ public sealed class RequestLogDetailService(BasicRepository new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_RequestLogDetail).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_RequestLogDetail).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -107,6 +107,13 @@ public sealed class RequestLogDetailService(BasicRepository>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 95fb9cba..19846955 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs
@@ -43,7 +43,7 @@ public sealed class RequestLogService(BasicRepository rpo,
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_RequestLog).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_RequestLog).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -190,6 +190,13 @@ public sealed class RequestLogService(BasicRepository rpo,
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
return QueryInternal(req, true);
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 9e9f1bad..261818bf 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs
@@ -41,7 +41,7 @@ public sealed class RoleService(BasicRepository rpo, IUserRoleSe
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Role).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_Role).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -142,6 +142,13 @@ public sealed class RoleService(BasicRepository rpo, IUserRoleSe
return UpdateAsync(req, [nameof(req.IgnorePermissionControl)]);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
///
public Task, int>>> UserCountByAsync(QueryReq req)
{
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 b75e2c52..38ce91b8 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgDeptService.cs
@@ -41,7 +41,7 @@ public sealed class SiteMsgDeptService(BasicRepository rp
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_SiteMsgDept).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_SiteMsgDept).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -104,6 +104,13 @@ public sealed class SiteMsgDeptService(BasicRepository rp
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 4f55c997..b6298b12 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgFlagService.cs
@@ -41,7 +41,7 @@ public sealed class SiteMsgFlagService(BasicRepository rp
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_SiteMsgFlag).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_SiteMsgFlag).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -111,6 +111,13 @@ public sealed class SiteMsgFlagService(BasicRepository rp
return UpdateAsync(req, [nameof(req.UserSiteMsgStatus)], null, a => a.UserId == req.UserId && a.SiteMsgId == req.SiteMsgId);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 57d15541..1741fc97 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgRoleService.cs
@@ -41,7 +41,7 @@ public sealed class SiteMsgRoleService(BasicRepository rp
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_SiteMsgRole).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_SiteMsgRole).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -104,6 +104,13 @@ public sealed class SiteMsgRoleService(BasicRepository rp
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 a0b9d9bc..fa72df88 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgService.cs
@@ -44,7 +44,7 @@ public sealed class SiteMsgService(BasicRepository rpo, Conte
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_SiteMsg).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_SiteMsg).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -195,6 +195,13 @@ public sealed class SiteMsgService(BasicRepository rpo, Conte
}
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
///
public async Task UnreadCountAsync()
{
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 83e1abaa..d5c1051f 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/SiteMsgUserService.cs
@@ -41,7 +41,7 @@ public sealed class SiteMsgUserService(BasicRepository rp
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_SiteMsgUser).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_SiteMsgUser).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -104,6 +104,13 @@ public sealed class SiteMsgUserService(BasicRepository rp
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 00207ee9..0a93d59e 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs
@@ -1,6 +1,12 @@
using NetAdmin.Application.Extensions;
+using NetAdmin.Domain.Contexts;
using NetAdmin.Domain.DbMaps.Sys;
+using NetAdmin.Domain.Dto.Sys.Dept;
+using NetAdmin.Domain.Dto.Sys.Dic.Catalog;
+using NetAdmin.Domain.Dto.Sys.Dic.Content;
+using NetAdmin.Domain.Dto.Sys.User;
using NetAdmin.Domain.Dto.Sys.UserInvite;
+using NetAdmin.Domain.Dto.Sys.UserRole;
using NetAdmin.Domain.Extensions;
namespace NetAdmin.SysComponent.Application.Services.Sys;
@@ -54,6 +60,19 @@ public sealed class UserInviteService(BasicRepository rpo)
return ret.Adapt();
}
+ ///
+ public async Task CreateFansAccountAsync(CreateFansAccountReq req)
+ {
+ req.ThrowIfInvalid();
+
+ var rolesAllowApply = (await QueryRolesAllowApplyAsync().ConfigureAwait(false)).Select(x => x.Value);
+ return !req.RoleIds.All(x => rolesAllowApply.Contains(x.ToInvString()))
+ ? throw new NetAdminInvalidOperationException(Ln.此操作不被允许)
+ : await S()
+ .CreateAsync(req with { Invite = new CreateUserInviteReq { OwnerId = UserToken.Id, OwnerDeptId = UserToken.DeptId } })
+ .ConfigureAwait(false);
+ }
+
///
public Task DeleteAsync(DelReq req)
{
@@ -80,17 +99,18 @@ public sealed class UserInviteService(BasicRepository rpo)
}
///
- public Task> GetAssociatedUserIdAsync(long userId)
+ public Task> GetAssociatedUserIdAsync(long userId, bool up = true)
{
return Rpo.Orm.Select()
.DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_SELF, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT
-, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD)
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON)
.Where(a => a.Id == userId)
.AsTreeCte( //
- up: true
+ up: up
, disableGlobalFilters: [
Chars.FLG_FREE_SQL_GLOBAL_FILTER_SELF, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT
- , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON
])
.ToListAsync(a => a.Id);
}
@@ -103,6 +123,15 @@ public sealed class UserInviteService(BasicRepository rpo)
return ret.Adapt();
}
+ ///
+ public Task GetSelfRechargeAllowedAsync()
+ {
+ return QueryInternal(new QueryReq { Filter = new QueryUserInviteReq { Id = UserToken.Id } })
+ .DisableGlobalFilter(Chars.FLG_FREE_SQL_GLOBAL_FILTER_SELF, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT
+ , Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN, Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON)
+ .ToOneAsync(a => a.SelfRechargeAllowed);
+ }
+
///
public async Task> PagedQueryAsync(PagedQueryReq req)
{
@@ -121,7 +150,7 @@ public sealed class UserInviteService(BasicRepository rpo)
public async Task> QueryAsync(QueryReq req)
{
req.ThrowIfInvalid();
- var query = QueryInternal(req).Include(a => a.Owner).Include(a => a.User).WithNoLockNoWait();
+ var query = QueryInternal(req).Include(a => a.Owner).IncludeMany(a => a.User.Roles).WithNoLockNoWait();
var ret = req.Filter?.IsPlainQuery == true
? await query.ToListAsync().ConfigureAwait(false)
: await query.ToTreeListAsync().ConfigureAwait(false);
@@ -129,6 +158,34 @@ public sealed class UserInviteService(BasicRepository rpo)
return ret.Adapt>();
}
+ ///
+ public async Task> QueryRolesAllowApplyAsync()
+ {
+ var dicService = S();
+ var catalogIds = (await dicService.QueryCatalogAsync(new QueryReq {
+ DynamicFilter = new DynamicFilterInfo {
+ Field = nameof(QueryDicCatalogReq.Code)
+ , Operator = DynamicFilterOperators.Any
+ , Value = S()
+ .Roles
+ .Select(x =>
+ $"{Chars.FLG_DIC_CATALOG_NEW_USER_ROLE_CONFIG}>{x.Id}")
+ }
+ })
+ .ConfigureAwait(false)).Select(x => x.Id);
+ return !catalogIds.Any()
+ ? null
+ : await dicService
+ .QueryContentAsync(new QueryReq {
+ DynamicFilter = new DynamicFilterInfo {
+ Field = nameof(QueryDicContentReq.CatalogId)
+ , Operator = DynamicFilterOperators.Any
+ , Value = catalogIds
+ }
+ })
+ .ConfigureAwait(false);
+ }
+
///
public Task SetCommissionRatioAsync(SetCommissionRatioReq req)
{
@@ -136,6 +193,62 @@ public sealed class UserInviteService(BasicRepository rpo)
return UpdateAsync(req with { CommissionRatio = req.CommissionRatio }, [nameof(req.CommissionRatio)], null, a => a.Id == req.Id, null, true);
}
+ ///
+ public async Task SetFansRoleAsync(SetFansRoleReq req)
+ {
+ req.ThrowIfInvalid();
+
+ var rolesAllowApply = (await QueryRolesAllowApplyAsync().ConfigureAwait(false)).Select(x => x.Value).ToList();
+ if (!rolesAllowApply.Contains(req.RoleId.ToInvString())) {
+ throw new NetAdminInvalidOperationException(Ln.此操作不被允许);
+ }
+
+ var userRoleService = App.GetService();
+ _ = await userRoleService.BulkDeleteByUserIdAsync(req.Id).ConfigureAwait(false);
+ _ = await userRoleService.CreateAsync(new CreateUserRoleReq { RoleId = req.RoleId, UserId = req.Id }).ConfigureAwait(false);
+ return 1;
+ }
+
+ ///
+ public async Task SetInviterAsync(SetInviterReq req)
+ {
+ req.ThrowIfInvalid();
+
+ var userService = S();
+ var child = await userService.GetAsync(new QueryUserReq { Id = req.Id }).ConfigureAwait(false);
+ var parent = await userService.GetAsync(new QueryUserReq { Id = req.OwnerId!.Value }).ConfigureAwait(false);
+
+ // 不能将上级设置为自己的下级避免死循环
+ if ((await GetAssociatedUserIdAsync(req.Id, false).ConfigureAwait(false)).Contains(req.OwnerId!.Value)) {
+ throw new NetAdminInvalidOperationException(Ln.指定的上级为该账号的下级用户);
+ }
+
+ // 修改部门层级关系
+ var dept = await S().GetAsync(new QueryDeptReq { Id = child.DeptId }).ConfigureAwait(false);
+ if (dept.Id == req.Id && dept.Id != parent.DeptId) {
+ _ = await S().EditAsync(dept.Adapt() with { ParentId = parent.DeptId }).ConfigureAwait(false);
+ }
+
+ return await UpdateAsync( //
+ new Sys_UserInvite { Id = req.Id, Version = req.Version, OwnerId = req.OwnerId!.Value, OwnerDeptId = parent.DeptId }
+ , [nameof(req.OwnerDeptId), nameof(req.OwnerId)])
+ .ConfigureAwait(false);
+ }
+
+ ///
+ public Task SetSelfRechargeAllowedAsync(SetSelfRechargeAllowedReq req)
+ {
+ req.ThrowIfInvalid();
+ return UpdateAsync(req, [nameof(req.SelfRechargeAllowed)]);
+ }
+
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter)
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 1be30c65..1bc654b5 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs
@@ -60,7 +60,7 @@ public sealed class UserProfileService(BasicRepository rp
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
req.RequiredFields.ToImmutableDictionary(
- y => y, y => typeof(Sys_UserProfile).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value))
+ y => y, y => typeof(Sys_UserProfile).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value))
.OrderByDescending(x => x.Value);
}
@@ -182,6 +182,13 @@ public sealed class UserProfileService(BasicRepository rp
return UpdateAsync(req, [nameof(req.AppConfig)], null, a => a.Id == UserToken.Id, null, true);
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 22ac2712..621a9fc3 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserRoleService.cs
@@ -46,7 +46,7 @@ public sealed class UserRoleService(BasicRepository rpo) //
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair, int>(
- req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_UserRole).GetProperty(y)!.GetValue(x.Key)!.ToString())
+ req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_UserRole).GetProperty(y)!.GetValue(x.Key)?.ToString())
, x.Value))
.OrderByDescending(x => x.Value);
}
@@ -110,6 +110,13 @@ public sealed class UserRoleService(BasicRepository rpo) //
return ret.Adapt>();
}
+ ///
+ public Task SumAsync(QueryReq req)
+ {
+ req.ThrowIfInvalid();
+ return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp());
+ }
+
private ISelect QueryInternal(QueryReq req)
{
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
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 1c9275d0..c9d852d5 100644
--- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs
+++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs
@@ -24,24 +24,24 @@ public sealed class UserService(
, IEventPublisher eventPublisher) //
: RepositoryService(rpo), IUserService
{
- private readonly Expression> _listUserExp = a => new Sys_User {
- Id = a.Id
- , Avatar = a.Avatar
- , Email = a.Email
- , Mobile = a.Mobile
- , Enabled = a.Enabled
- , UserName = a.UserName
- , Summary = a.Summary
- , Version = a.Version
- , CreatedTime = a.CreatedTime
- , LastLoginTime = a.LastLoginTime
- , Dept = new Sys_Dept {
- Id = a.Dept.Id, Name = a.Dept.Name
- }
- , Roles = a.Roles
- , CreatedUserId = a.CreatedUserId
- , CreatedUserName = a.CreatedUserName
- };
+ private readonly Expression> _listUserExp = a => //
+ new Sys_User {
+ Id = a.Id
+ , Avatar = a.Avatar
+ , Email = a.Email
+ , Mobile = a.Mobile
+ , Enabled = a.Enabled
+ , UserName = a.UserName
+ , Summary = a.Summary
+ , Version = a.Version
+ , CreatedTime = a.CreatedTime
+ , LastLoginTime = a.LastLoginTime
+ , Dept = new Sys_Dept { Id = a.Dept.Id, Name = a.Dept.Name }
+ , Roles = a.Roles
+ , CreatedUserId = a.CreatedUserId
+ , CreatedUserName = a.CreatedUserName
+ , Invite = new Sys_UserInvite { Owner = new Sys_User { Id = a.Invite.Owner.Id, UserName = a.Invite.Owner.UserName } }
+ };
///
public async Task BulkDeleteAsync(BulkReq req)
@@ -99,7 +99,7 @@ public sealed class UserService(
.ToDictionaryAsync(a => a.Count())
.ConfigureAwait(false);
return ret.Select(x => new KeyValuePair