From 1650b8a1273d3939f139501b587d083847621a6c Mon Sep 17 00:00:00 2001 From: nsnail Date: Tue, 29 Jul 2025 10:11:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E6=A1=86=E6=9E=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=90=8C=E6=AD=A5=20(#342)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: tk --- assets/res/NetAdmin.Fields.ln | 15 +- assets/res/NetAdmin.Statements.ln | 8 +- assets/seed-data/Sys_Menu.json | 142 ++++---- build/code.quality.props | 4 +- .../Extensions/ISelectExtensions.cs | 2 +- .../Modules/ICrudModule.cs | 5 + .../Services/RepositoryService.cs | 2 +- .../DbMaps/Dependency/Fields/IFieldSummary.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs | 2 +- .../DbMaps/Sys/Sys_CodeTemplate.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs | 2 +- .../DbMaps/Sys/Sys_DicContent.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Job.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_SiteMsg.cs | 2 +- .../NetAdmin.Domain/DbMaps/Sys/Sys_User.cs | 2 +- .../DbMaps/Sys/Sys_UserInvite.cs | 8 + .../DbMaps/Sys/Sys_WalletFrozen.cs | 2 +- .../DbMaps/Sys/Sys_WalletTrade.cs | 4 +- .../Dto/Dependency/QueryReq.cs | 22 ++ .../Dto/Sys/Api/ExportApiRsp.cs | 2 +- .../Dto/Sys/Api/QueryApiRsp.cs | 2 +- .../Sys/CodeTemplate/CreateCodeTemplateReq.cs | 2 +- .../Sys/CodeTemplate/QueryCodeTemplateRsp.cs | 2 +- .../Sys/DepositOrder/CreateDepositOrderReq.cs | 2 +- .../Dto/Sys/Dept/CreateDeptReq.cs | 2 +- .../Dto/Sys/Dept/ExportDeptRsp.cs | 2 +- .../Dto/Sys/Dept/QueryDeptRsp.cs | 2 +- .../Dto/Sys/Dev/FieldItemInfo.cs | 2 +- .../Dto/Sys/Dev/GenerateCsCodeReq.cs | 2 +- .../Sys/Dic/Content/CreateDicContentReq.cs | 2 +- .../Sys/Dic/Content/ExportDicContentRsp.cs | 2 +- .../Dto/Sys/Dic/Content/QueryDicContentRsp.cs | 2 +- .../Dto/Sys/Job/CreateJobReq.cs | 2 +- .../Dto/Sys/Job/QueryJobRsp.cs | 2 +- .../Dto/Sys/Role/CreateRoleReq.cs | 2 +- .../Dto/Sys/Role/QueryRoleRsp.cs | 2 +- .../Dto/Sys/SiteMsg/ExportSiteMsgRsp.cs | 2 +- .../Dto/Sys/SiteMsg/QuerySiteMsgRsp.cs | 2 +- .../Dto/Sys/User/CreateEditUserReq.cs | 2 +- .../Dto/Sys/User/CreateUserReq.cs | 2 +- .../Dto/Sys/User/QueryUserRsp.cs | 8 +- .../Sys/UserInvite/CreateFansAccountReq.cs | 8 + .../Dto/Sys/UserInvite/CreateUserInviteReq.cs | 3 + .../Dto/Sys/UserInvite/QueryUserInviteRsp.cs | 4 + .../Dto/Sys/UserInvite/SetFansRoleReq.cs | 15 + .../Dto/Sys/UserInvite/SetInviterReq.cs | 30 ++ .../UserInvite/SetSelfRechargeAllowedReq.cs | 19 ++ .../Sys/WalletFrozen/CreateWalletFrozenReq.cs | 2 +- .../Sys/WalletFrozen/QueryWalletFrozenRsp.cs | 2 +- .../Sys/WalletTrade/CreateWalletTradeReq.cs | 9 +- .../Sys/WalletTrade/QueryWalletTradeRsp.cs | 4 +- .../Dto/Sys/WalletTrade/TransferReq.cs | 28 ++ .../NetAdmin.Domain/Enums/Sys/DataScopes.cs | 14 +- .../Events/Sys/UserRegisteredEvent.cs | 13 + .../NetAdmin.Infrastructure/Constant/Chars.cs | 8 +- .../Enums/AdminTradeTypes.cs | 24 ++ .../Enums/TradeTypes.cs | 22 +- .../Modules/Sys/IUserInviteModule.cs | 32 ++ .../Modules/Sys/IUserWalletModule.cs | 6 +- .../Modules/Sys/IWalletTradeModule.cs | 13 +- .../Services/Sys/ApiService.cs | 9 +- .../Services/Sys/CodeTemplateService.cs | 12 +- .../Services/Sys/ConfigService.cs | 9 +- .../Sys/Dependency/IUserInviteService.cs | 2 +- .../Services/Sys/DepositOrderService.cs | 7 + .../Services/Sys/DeptService.cs | 9 +- .../Services/Sys/DevService.cs | 6 +- .../Services/Sys/DicCatalogService.cs | 9 +- .../Services/Sys/DicContentService.cs | 9 +- .../Services/Sys/DocCatalogService.cs | 11 +- .../Services/Sys/DocContentService.cs | 9 +- .../Services/Sys/JobRecordService.cs | 9 +- .../Services/Sys/JobService.cs | 9 +- .../Services/Sys/LoginLogService.cs | 9 +- .../Services/Sys/MenuService.cs | 9 +- .../Services/Sys/RequestLogDetailService.cs | 9 +- .../Services/Sys/RequestLogService.cs | 9 +- .../Services/Sys/RoleService.cs | 9 +- .../Services/Sys/SiteMsgDeptService.cs | 9 +- .../Services/Sys/SiteMsgFlagService.cs | 9 +- .../Services/Sys/SiteMsgRoleService.cs | 9 +- .../Services/Sys/SiteMsgService.cs | 9 +- .../Services/Sys/SiteMsgUserService.cs | 9 +- .../Services/Sys/UserInviteService.cs | 123 ++++++- .../Services/Sys/UserProfileService.cs | 9 +- .../Services/Sys/UserRoleService.cs | 9 +- .../Services/Sys/UserService.cs | 72 ++-- .../Services/Sys/UserWalletService.cs | 15 +- .../Services/Sys/VerifyCodeService.cs | 10 +- .../Services/Sys/WalletFrozenService.cs | 12 +- .../Services/Sys/WalletTradeService.cs | 92 ++++- .../Sys/ApiCache.cs | 6 + .../Sys/CodeTemplateCache.cs | 6 + .../Sys/ConfigCache.cs | 6 + .../Sys/DepositOrderCache.cs | 6 + .../Sys/DeptCache.cs | 6 + .../Sys/DicCatalogCache.cs | 6 + .../Sys/DicContentCache.cs | 6 + .../Sys/DocCatalogCache.cs | 6 + .../Sys/DocContentCache.cs | 6 + .../Sys/JobCache.cs | 6 + .../Sys/JobRecordCache.cs | 6 + .../Sys/LoginLogCache.cs | 6 + .../Sys/MenuCache.cs | 6 + .../Sys/RequestLogCache.cs | 8 +- .../Sys/RequestLogDetailCache.cs | 6 + .../Sys/RoleCache.cs | 6 + .../Sys/SiteMsgCache.cs | 6 + .../Sys/SiteMsgDeptCache.cs | 6 + .../Sys/SiteMsgFlagCache.cs | 6 + .../Sys/SiteMsgRoleCache.cs | 6 + .../Sys/SiteMsgUserCache.cs | 6 + .../Sys/UserCache.cs | 6 + .../Sys/UserInviteCache.cs | 44 +++ .../Sys/UserProfileCache.cs | 6 + .../Sys/UserWalletCache.cs | 6 + .../Sys/VerifyCodeCache.cs | 6 + .../Sys/WalletFrozenCache.cs | 6 + .../Sys/WalletTradeCache.cs | 18 + .../Controllers/Sys/ApiController.cs | 10 + .../Controllers/Sys/CodeTemplateController.cs | 10 + .../Controllers/Sys/ConfigController.cs | 10 + .../Controllers/Sys/DepositOrderController.cs | 10 + .../Controllers/Sys/DeptController.cs | 10 + .../Controllers/Sys/JobController.cs | 10 + .../Controllers/Sys/LoginLogController.cs | 10 + .../Controllers/Sys/MenuController.cs | 10 + .../Controllers/Sys/RequestLogController.cs | 10 + .../Controllers/Sys/RoleController.cs | 10 + .../Controllers/Sys/SiteMsgController.cs | 10 + .../Controllers/Sys/UserController.cs | 10 + .../Controllers/Sys/UserInviteController.cs | 62 ++++ .../Controllers/Sys/UserWalletController.cs | 10 + .../Controllers/Sys/VerifyCodeController.cs | 10 + .../Controllers/Sys/WalletFrozenController.cs | 10 + .../Controllers/Sys/WalletTradeController.cs | 27 ++ src/backend/UnitTests/Sys/ApiTests.cs | 10 + src/backend/UnitTests/Sys/ConfigTests.cs | 10 + src/backend/UnitTests/Sys/DeptTests.cs | 10 + src/backend/UnitTests/Sys/JobTests.cs | 10 + src/backend/UnitTests/Sys/LoginLogTests.cs | 10 + src/backend/UnitTests/Sys/MenuTests.cs | 10 + src/backend/UnitTests/Sys/RequestLogTests.cs | 10 + src/backend/UnitTests/Sys/RoleTests.cs | 10 + src/backend/UnitTests/Sys/SiteMsgTests.cs | 10 + src/backend/UnitTests/Sys/UserTests.cs | 10 + src/backend/UnitTests/Sys/VerifyCodeTests.cs | 10 + .../CommandLineArgs.cs | 6 + .../Extensions/ServiceCollectionExtensions.cs | 10 +- .../YourSolution.AdmServer.Host/Startup.cs | 3 +- src/frontend/admin/package.json | 14 +- src/frontend/admin/src/api/sys/api.js | 11 - .../admin/src/api/sys/codetemplate.js | 11 - src/frontend/admin/src/api/sys/config.js | 11 - .../admin/src/api/sys/depositorder.js | 11 - src/frontend/admin/src/api/sys/dept.js | 11 - src/frontend/admin/src/api/sys/job.js | 11 - src/frontend/admin/src/api/sys/loginlog.js | 11 - src/frontend/admin/src/api/sys/menu.js | 11 - src/frontend/admin/src/api/sys/requestlog.js | 11 - src/frontend/admin/src/api/sys/role.js | 11 - src/frontend/admin/src/api/sys/sitemsg.js | 11 - src/frontend/admin/src/api/sys/user.js | 11 - src/frontend/admin/src/api/sys/userinvite.js | 77 ++++- src/frontend/admin/src/api/sys/userwallet.js | 11 - src/frontend/admin/src/api/sys/verifycode.js | 11 - .../admin/src/api/sys/walletfrozen.js | 11 - src/frontend/admin/src/api/sys/wallettrade.js | 44 ++- src/frontend/admin/src/assets/icon/index.js | 3 +- .../admin/src/assets/icon/transfer.vue | 6 + .../src/components/na-col-avatar/index.vue | 6 +- .../admin/src/components/na-col-user/core.vue | 70 ++++ .../src/components/na-col-user/index.vue | 51 +-- .../src/components/na-table-page/detail.vue | 27 +- .../src/components/na-table-page/index.vue | 101 ++++-- .../src/components/sc-select-filter/index.vue | 2 +- src/frontend/admin/src/config/icon-select.js | 2 +- .../admin/src/layout/components/tasks.vue | 4 +- src/frontend/admin/src/utils/tool.js | 64 ++-- .../admin/src/views/profile/account/index.vue | 2 +- .../doc/components/catalog-select.vue | 0 .../src/views/sys/{ => archive}/doc/index.vue | 0 .../sys/{ => archive}/doc/list/index.vue | 0 .../views/sys/{ => archive}/doc/list/save.vue | 2 +- .../src/views/sys/{ => archive}/doc/save.vue | 0 .../src/views/{ => sys}/dev/code/index.vue | 0 .../views/sys/{ => dev}/template/index.vue | 4 +- .../views/sys/{ => finance}/order/index.vue | 5 +- .../views/sys/{ => finance}/order/save.vue | 2 +- .../sys/{ => finance}/trade/frozen/index.vue | 75 ++-- .../views/sys/{ => finance}/trade/index.vue | 0 .../views/sys/finance/trade/list/index.vue | 153 +++++++++ .../sys/{ => finance}/trade/list/save.vue | 0 .../src/views/sys/finance/wallet/index.vue | 131 +++++++ .../views/sys/{ => finance}/wallet/trade.vue | 41 +-- .../admin/src/views/sys/invite/index.vue | 79 ----- .../src/views/sys/log/operation/index.vue | 2 +- .../views/sys/market/invite/create-fans.vue | 108 ++++++ .../src/views/sys/market/invite/index.vue | 145 ++++++++ .../sys/{ => market}/invite/set-inviter.vue | 21 +- .../src/views/sys/market/invite/set-role.vue | 74 ++++ .../src/views/sys/{ => power}/dept/index.vue | 0 .../src/views/sys/{ => power}/dept/save.vue | 2 +- .../src/views/sys/{ => power}/menu/index.vue | 0 .../src/views/sys/{ => power}/menu/save.vue | 0 .../src/views/sys/{ => power}/role/index.vue | 0 .../src/views/sys/{ => power}/role/save.vue | 2 +- .../src/views/sys/{ => power}/user/index.vue | 4 +- .../src/views/sys/{ => power}/user/save.vue | 4 +- .../src/views/sys/{ => system}/api/index.vue | 0 .../views/sys/{ => system}/cache/index.vue | 0 .../views/sys/{ => system}/config/index.vue | 0 .../views/sys/{ => system}/config/save.vue | 4 +- .../dic/components/catalog-select.vue | 0 .../src/views/sys/{ => system}/dic/index.vue | 0 .../views/sys/{ => system}/dic/list/index.vue | 0 .../sys/{ => system}/dic/list/save-batch.vue | 0 .../views/sys/{ => system}/dic/list/save.vue | 2 +- .../src/views/sys/{ => system}/dic/save.vue | 0 .../views/sys/{ => system}/job/all/index.vue | 0 .../views/sys/{ => system}/job/all/save.vue | 2 +- .../src/views/sys/{ => system}/job/index.vue | 4 +- .../sys/{ => system}/job/record/index.vue | 2 +- .../sys/{ => system}/job/record/save.vue | 0 .../src/views/sys/{ => system}/msg/index.vue | 0 .../src/views/sys/{ => system}/msg/save.vue | 0 .../admin/src/views/sys/trade/list/index.vue | 323 ------------------ .../admin/src/views/sys/wallet/index.vue | 308 ----------------- .../admin/src/views/sys/wallet/save.vue | 121 ------- 230 files changed, 2488 insertions(+), 1438 deletions(-) create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateFansAccountReq.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetFansRoleReq.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetInviterReq.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetSelfRechargeAllowedReq.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/WalletTrade/TransferReq.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Events/Sys/UserRegisteredEvent.cs create mode 100644 src/backend/NetAdmin/NetAdmin.Infrastructure/Enums/AdminTradeTypes.cs create mode 100644 src/frontend/admin/src/assets/icon/transfer.vue create mode 100644 src/frontend/admin/src/components/na-col-user/core.vue rename src/frontend/admin/src/views/sys/{ => archive}/doc/components/catalog-select.vue (100%) rename src/frontend/admin/src/views/sys/{ => archive}/doc/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => archive}/doc/list/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => archive}/doc/list/save.vue (99%) rename src/frontend/admin/src/views/sys/{ => archive}/doc/save.vue (100%) rename src/frontend/admin/src/views/{ => sys}/dev/code/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => dev}/template/index.vue (97%) rename src/frontend/admin/src/views/sys/{ => finance}/order/index.vue (98%) rename src/frontend/admin/src/views/sys/{ => finance}/order/save.vue (99%) rename src/frontend/admin/src/views/sys/{ => finance}/trade/frozen/index.vue (79%) rename src/frontend/admin/src/views/sys/{ => finance}/trade/index.vue (100%) create mode 100644 src/frontend/admin/src/views/sys/finance/trade/list/index.vue rename src/frontend/admin/src/views/sys/{ => finance}/trade/list/save.vue (100%) create mode 100644 src/frontend/admin/src/views/sys/finance/wallet/index.vue rename src/frontend/admin/src/views/sys/{ => finance}/wallet/trade.vue (54%) delete mode 100644 src/frontend/admin/src/views/sys/invite/index.vue create mode 100644 src/frontend/admin/src/views/sys/market/invite/create-fans.vue create mode 100644 src/frontend/admin/src/views/sys/market/invite/index.vue rename src/frontend/admin/src/views/sys/{ => market}/invite/set-inviter.vue (63%) create mode 100644 src/frontend/admin/src/views/sys/market/invite/set-role.vue rename src/frontend/admin/src/views/sys/{ => power}/dept/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => power}/dept/save.vue (98%) rename src/frontend/admin/src/views/sys/{ => power}/menu/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => power}/menu/save.vue (100%) rename src/frontend/admin/src/views/sys/{ => power}/role/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => power}/role/save.vue (99%) rename src/frontend/admin/src/views/sys/{ => power}/user/index.vue (99%) rename src/frontend/admin/src/views/sys/{ => power}/user/save.vue (99%) rename src/frontend/admin/src/views/sys/{ => system}/api/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/cache/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/config/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/config/save.vue (98%) rename src/frontend/admin/src/views/sys/{ => system}/dic/components/catalog-select.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/dic/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/dic/list/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/dic/list/save-batch.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/dic/list/save.vue (98%) rename src/frontend/admin/src/views/sys/{ => system}/dic/save.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/job/all/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/job/all/save.vue (99%) rename src/frontend/admin/src/views/sys/{ => system}/job/index.vue (90%) rename src/frontend/admin/src/views/sys/{ => system}/job/record/index.vue (99%) rename src/frontend/admin/src/views/sys/{ => system}/job/record/save.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/msg/index.vue (100%) rename src/frontend/admin/src/views/sys/{ => system}/msg/save.vue (100%) delete mode 100644 src/frontend/admin/src/views/sys/trade/list/index.vue delete mode 100644 src/frontend/admin/src/views/sys/wallet/index.vue delete mode 100644 src/frontend/admin/src/views/sys/wallet/save.vue 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, int>( - req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_User).GetProperty(y)!.GetValue(x.Key)!.ToString()) + req.RequiredFields.ToImmutableDictionary(y => y, y => typeof(Sys_User).GetProperty(y)!.GetValue(x.Key)?.ToString()) , x.Value)) .OrderByDescending(x => x.Value); } @@ -110,10 +110,10 @@ public sealed class UserService( req.ThrowIfInvalid(); var roles = await CreateEditCheckAsync(req).ConfigureAwait(false); - var newDeptId = YitIdHelper.NextId(); + var userId = YitIdHelper.NextId(); // 主表 - var entity = req.Adapt() with { DeptId = newDeptId }; + var entity = req.Adapt() with { DeptId = userId, Id = userId }; var dbUser = await Rpo.InsertAsync(entity).ConfigureAwait(false); // 分表 @@ -139,7 +139,9 @@ public sealed class UserService( _ = await userInviteService.CreateAsync((req.Invite ?? new CreateUserInviteReq()) with { Id = dbUser.Id }).ConfigureAwait(false); // 创建一个用户自己的部门 - _ = S().CreateAsync(new CreateDeptReq { Id = newDeptId, Name = $"{req.UserName}的部门", ParentId = req.Invite?.OwnerDeptId ?? 0 }); + _ = await S() + .CreateAsync(new CreateDeptReq { Id = userId, Name = $"{req.UserName}", ParentId = req.Invite?.OwnerDeptId ?? 0 }) + .ConfigureAwait(false); // 发布用户创建事件 var ret = userList.First(); @@ -275,7 +277,8 @@ public sealed class UserService( var listUserExp = req.GetToListExp() ?? _listUserExp; var includeRoles = listUserExp == _listUserExp; var select = await QueryInternalAsync(req, includeRoles).ConfigureAwait(false); - IEnumerable list = await select.Page(req.Page, req.PageSize) + IEnumerable list = await select.Include(a => a.Invite.Owner) + .Page(req.Page, req.PageSize) .WithNoLockNoWait() .Count(out var total) .ToListAsync(listUserExp) @@ -338,8 +341,10 @@ public sealed class UserService( Profile = new CreateUserProfileReq() , Invite = new CreateUserInviteReq { OwnerId = inviterId, OwnerDeptId = inviterDeptId } }; - return (await CreateAsync(createReq with { Mobile = config.RegisterMobileRequired ? createReq.Mobile : null }).ConfigureAwait(false)) + var ret = (await CreateAsync(createReq with { Mobile = config.RegisterMobileRequired ? createReq.Mobile : null }).ConfigureAwait(false)) .Adapt(); + await eventPublisher.PublishAsync(new UserRegisteredEvent(ret)).ConfigureAwait(false); + return ret; } /// @@ -475,6 +480,13 @@ public sealed class UserService( return userProfileService.SetSessionUserAppConfigAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp()); + } + /// public async Task UserInfoAsync() { @@ -506,14 +518,7 @@ public sealed class UserService( .Where(a => req.RoleIds.Contains(a.Id)) .ToDictionaryAsync(a => a.Id, a => a.DashboardLayout) .ConfigureAwait(false); - if (roles.Count != req.RoleIds.Count) { - throw new NetAdminInvalidOperationException(Ln.角色不存在); - } - - // 检查部门是否存在 - var dept = await Rpo.Orm.Select().WithNoLockNoWait().Where(a => req.DeptId == a.Id).ToListAsync(a => a.Id).ConfigureAwait(false); - - return dept.Count != 1 ? throw new NetAdminInvalidOperationException(Ln.部门不存在) : roles; + return roles.Count != req.RoleIds.Count ? throw new NetAdminInvalidOperationException(Ln.角色不存在) : roles; } private async Task LoginInternalAsync(Sys_User dbUser) @@ -552,7 +557,8 @@ public sealed class UserService( req.Filter?.RoleId > 0, a => Enumerable.Any(a.Roles, b => b.Id == req.Filter.RoleId)) .WhereIf( // req.Keywords?.Length > 0 - , a => a.Id == req.Keywords.Int64Try(0) || a.UserName == req.Keywords || a.Mobile == req.Keywords || a.Email == req.Keywords || + , a => a.Id == req.Keywords.Int64Try(0) || a.UserName.Contains(req.Keywords) || a.Mobile == req.Keywords || + a.Email == req.Keywords || a.Summary.Contains(req.Keywords)); // ReSharper restore InvokeAsExtensionMethod 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 799acfcc..84d59cd2 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserWalletService.cs @@ -84,7 +84,10 @@ public sealed class UserWalletService(BasicRepository rpo) public async Task GetAsync(QueryUserWalletReq req) { req.ThrowIfInvalid(); - var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); + var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }) + .Include(a => a.Owner) + .ToOneAsync() + .ConfigureAwait(false); return ret.Adapt(); } @@ -93,7 +96,8 @@ public sealed class UserWalletService(BasicRepository rpo) { req.ThrowIfInvalid(); var list = await QueryInternal(req) - .Include(a => a.Owner) + .IncludeMany(a => a.Owner.Roles) + .Include(a => a.Owner.Invite.Owner) .Page(req.Page, req.PageSize) .WithNoLockNoWait() .Count(out var total) @@ -111,6 +115,13 @@ public sealed class UserWalletService(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) { IEnumerable deptIds = null; 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 e6770af2..36d60b04 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs @@ -45,7 +45,7 @@ public sealed class VerifyCodeService(BasicRepository rpo, .ConfigureAwait(false); return ret.Select(x => new KeyValuePair, int>( req.RequiredFields.ToImmutableDictionary( - y => y, y => typeof(Sys_VerifyCode).GetProperty(y)!.GetValue(x.Key)!.ToString()), x.Value)) + y => y, y => typeof(Sys_VerifyCode).GetProperty(y)!.GetValue(x.Key)?.ToString()), x.Value)) .OrderByDescending(x => x.Value); } @@ -123,6 +123,7 @@ public sealed class VerifyCodeService(BasicRepository rpo, QueryVerifyCodeRsp ret; #if !DEBUG + // 有发送记录,且小于1分钟,不允许 if (lastSent != null && (DateTime.Now - lastSent.CreatedTime).TotalMinutes < 1) { throw new NetAdminInvalidOperationException(Ln._1分钟内只能发送1次); @@ -147,6 +148,13 @@ public sealed class VerifyCodeService(BasicRepository rpo, return UpdateAsync(req, [nameof(req.Status)]); } + /// + public Task SumAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return QueryInternal(req with { Order = Orders.None }).WithNoLockNoWait().SumAsync(req.GetSumExp()); + } + /// public async Task VerifyAsync(VerifyCodeReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs index a7cad568..b051e476 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletFrozenService.cs @@ -47,8 +47,9 @@ public sealed class WalletFrozenService(BasicRepository 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)) + 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); } @@ -173,6 +174,13 @@ public sealed class WalletFrozenService(BasicRepository return 1; } + /// + 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/WalletTradeService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs index 78cf9342..591f0963 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/WalletTradeService.cs @@ -1,5 +1,7 @@ using NetAdmin.Application.Extensions; using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserInvite; using NetAdmin.Domain.Dto.Sys.UserWallet; using NetAdmin.Domain.Dto.Sys.WalletTrade; using NetAdmin.Domain.Extensions; @@ -103,7 +105,7 @@ public sealed class WalletTradeService(BasicRepository rp { req.ThrowIfInvalid(); var list = await QueryInternal(req) - .Include(a => a.Owner) + .Include(a => a.Owner.Invite.Owner) .Page(req.Page, req.PageSize) .WithNoLockNoWait() .Count(out var total) @@ -121,9 +123,95 @@ public sealed class WalletTradeService(BasicRepository rp return ret.Adapt>(); } + /// + public async Task SumAsync(QueryReq req) + { + req.ThrowIfInvalid(); + return req.RequiredFields[0].Equals(nameof(QueryWalletTradeReq.Amount), StringComparison.OrdinalIgnoreCase) + ? await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .SumAsync(a => SqlExt.Case().When(a.Amount < 0, -a.Amount).Else(a.Amount).End()) + .ConfigureAwait(false) + : await QueryInternal(req with { Order = Orders.None }) + .WithNoLockNoWait() + .SumAsync(req.GetSumExp()) + .ConfigureAwait(false); + } + + /// + public async Task TransferFromAnotherAccountAsync(TransferReq req) + { + // 检查源账户是不是自己的下级 + var fromAccount = await S().GetAsync(new QueryUserInviteReq { Id = req.OwnerId!.Value }).ConfigureAwait(false); + if (fromAccount == null || fromAccount.OwnerId != UserToken.Id) { + throw new NetAdminInvalidOperationException(Ln.此操作不被允许); + } + + var fromUser = await S().GetAsync(new QueryUserReq { Id = fromAccount.Id }).ConfigureAwait(false); + + // 源账户扣钱 + _ = await CreateAsync(new CreateWalletTradeReq { + OwnerDeptId = fromUser.DeptId + , Amount = -req.Amount + , OwnerId = fromUser.Id + , Summary = req.Summary + , TradeDirection = TradeDirections.Expense + , TradeType = TradeTypes.TransferExpense + }) + .ConfigureAwait(false); + + // 自己账户加钱 + _ = await CreateAsync(new CreateWalletTradeReq { + Amount = req.Amount + , Summary = req.Summary + , TradeDirection = TradeDirections.Income + , TradeType = TradeTypes.TransferIncome + , OwnerId = UserToken.Id + , OwnerDeptId = UserToken.DeptId + }) + .ConfigureAwait(false); + return 1; + } + + /// + public async Task TransferToAnotherAccountAsync(TransferReq req) + { + var toUser = await S().GetAsync(new QueryUserReq { Id = req.OwnerId!.Value }).ConfigureAwait(false); + + // 自己账户扣钱 + _ = await CreateAsync(new CreateWalletTradeReq { + Amount = -req.Amount + , Summary = req.Summary + , TradeDirection = TradeDirections.Expense + , TradeType = TradeTypes.TransferExpense + , OwnerId = UserToken.Id + , OwnerDeptId = UserToken.DeptId + }) + .ConfigureAwait(false); + + // 他人账户加钱 + _ = await CreateAsync(new CreateWalletTradeReq { + OwnerDeptId = toUser.DeptId + , Amount = req.Amount + , OwnerId = toUser.Id + , Summary = req.Summary + , TradeDirection = TradeDirections.Income + , TradeType = TradeTypes.TransferIncome + }) + .ConfigureAwait(false); + return 1; + } + private ISelect QueryInternal(QueryReq req) { - var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); + return QueryInternal(req, null); + } + + private ISelect QueryInternal(QueryReq req, List userIds) + { + var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereIf(req.Filter?.Id > 0, a => a.Id == req.Filter.Id) + .WhereIf(userIds?.Count > 0, a => userIds.Contains(a.OwnerId.Value)); // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs index 41015815..f0aa3d2e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs @@ -72,6 +72,12 @@ public sealed class ApiCache(IDistributedCache cache, IApiService service) // return Service.QueryAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task SyncAsync() { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs index 05639583..132b798b 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/CodeTemplateCache.cs @@ -65,4 +65,10 @@ public sealed class CodeTemplateCache(IDistributedCache cache, ICodeTemplateServ { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs index 6a02da6c..11b32698 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs @@ -83,4 +83,10 @@ public sealed class ConfigCache(IDistributedCache cache, IConfigService service) { return Service.SetEnabledAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DepositOrderCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DepositOrderCache.cs index d130b623..3b758d2e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DepositOrderCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DepositOrderCache.cs @@ -83,4 +83,10 @@ public sealed class DepositOrderCache(IDistributedCache cache, IDepositOrderServ { return Service.ReceivedConfirmationAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs index 610c4dd4..4aca80d4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs @@ -71,4 +71,10 @@ public sealed class DeptCache(IDistributedCache cache, IDeptService service) // { return Service.SetEnabledAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs index 09d7ca8b..90d220be 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs @@ -65,4 +65,10 @@ public sealed class DicCatalogCache(IDistributedCache cache, IDicCatalogService { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs index e68a5046..7aabd911 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs @@ -82,4 +82,10 @@ public sealed class DicContentCache(IDistributedCache cache, IDicContentService { return Service.SetEnabledAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs index cd4a12b3..9cc5e148 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocCatalogCache.cs @@ -65,4 +65,10 @@ public sealed class DocCatalogCache(IDistributedCache cache, IDocCatalogService { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs index 0de569d7..b9ec787d 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/DocContentCache.cs @@ -71,4 +71,10 @@ public sealed class DocContentCache(IDistributedCache cache, IDocContentService { return Service.SetEnabledAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs index b1cf5885..9dd5ab59 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobCache.cs @@ -144,4 +144,10 @@ public sealed class JobCache(IDistributedCache cache, IJobService service) : Dis { return Service.SetEnabledAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs index 3c951195..ec23e089 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/JobRecordCache.cs @@ -65,4 +65,10 @@ public sealed class JobRecordCache(IDistributedCache cache, IJobRecordService se { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs index 8c46a485..d43641c0 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/LoginLogCache.cs @@ -65,4 +65,10 @@ public sealed class LoginLogCache(IDistributedCache cache, ILoginLogService serv { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs index e54198dc..80f52e26 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs @@ -66,6 +66,12 @@ public sealed class MenuCache(IDistributedCache cache, IMenuService service) // return Service.QueryAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task> UserMenusAsync() { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs index 35a8d2c1..dfab3918 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs @@ -16,7 +16,7 @@ public sealed class RequestLogCache(IDistributedCache cache, IRequestLogService /// #if !DEBUG public async Task CountAsync(QueryReq req) - #else + #else public Task CountAsync(QueryReq req) #endif { @@ -114,4 +114,10 @@ public sealed class RequestLogCache(IDistributedCache cache, IRequestLogService { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs index 23d2c002..cb43c5a7 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RequestLogDetailCache.cs @@ -65,4 +65,10 @@ public sealed class RequestLogDetailCache(IDistributedCache cache, IRequestLogDe { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs index bbf7a5b1..6ad6a268 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs @@ -85,6 +85,12 @@ public sealed class RoleCache(IDistributedCache cache, IRoleService service) // return Service.SetIgnorePermissionControlAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task, int>>> UserCountByAsync(QueryReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs index c12d2556..94f50456 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgCache.cs @@ -85,6 +85,12 @@ public sealed class SiteMsgCache(IDistributedCache cache, ISiteMsgService servic return Service.SetSiteMsgStatusAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task UnreadCountAsync() { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs index f69560be..fedceab9 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgDeptCache.cs @@ -65,4 +65,10 @@ public sealed class SiteMsgDeptCache(IDistributedCache cache, ISiteMsgDeptServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs index f4471e6c..5330bf75 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgFlagCache.cs @@ -65,4 +65,10 @@ public sealed class SiteMsgFlagCache(IDistributedCache cache, ISiteMsgFlagServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs index f4b7497c..00ff36eb 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgRoleCache.cs @@ -65,4 +65,10 @@ public sealed class SiteMsgRoleCache(IDistributedCache cache, ISiteMsgRoleServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs index 32a326f9..efd2555e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/SiteMsgUserCache.cs @@ -65,4 +65,10 @@ public sealed class SiteMsgUserCache(IDistributedCache cache, ISiteMsgUserServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs index c5ee0417..4287c0b8 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserCache.cs @@ -184,6 +184,12 @@ public sealed class UserCache(IDistributedCache cache, IUserService service, IVe return Service.SetSessionUserAppConfigAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task UserInfoAsync() { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs index 1dc48cad..2a0cd241 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.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.Cache.Sys; @@ -30,6 +32,12 @@ public sealed class UserInviteCache(IDistributedCache cache, IUserInviteService return Service.CreateAsync(req); } + /// + public Task CreateFansAccountAsync(CreateFansAccountReq req) + { + return Service.CreateFansAccountAsync(req); + } + /// public Task DeleteAsync(DelReq req) { @@ -54,6 +62,12 @@ public sealed class UserInviteCache(IDistributedCache cache, IUserInviteService return Service.GetAsync(req); } + /// + public Task GetSelfRechargeAllowedAsync() + { + return Service.GetSelfRechargeAllowedAsync(); + } + /// public Task> PagedQueryAsync(PagedQueryReq req) { @@ -66,9 +80,39 @@ public sealed class UserInviteCache(IDistributedCache cache, IUserInviteService return Service.QueryAsync(req); } + /// + public Task> QueryRolesAllowApplyAsync() + { + return Service.QueryRolesAllowApplyAsync(); + } + /// public Task SetCommissionRatioAsync(SetCommissionRatioReq req) { return Service.SetCommissionRatioAsync(req); } + + /// + public Task SetFansRoleAsync(SetFansRoleReq req) + { + return Service.SetFansRoleAsync(req); + } + + /// + public Task SetInviterAsync(SetInviterReq req) + { + return Service.SetInviterAsync(req); + } + + /// + public Task SetSelfRechargeAllowedAsync(SetSelfRechargeAllowedReq req) + { + return Service.SetSelfRechargeAllowedAsync(req); + } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs index 8630606f..d37a60ff 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs @@ -65,4 +65,10 @@ public sealed class UserProfileCache(IDistributedCache cache, IUserProfileServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserWalletCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserWalletCache.cs index c5a59d58..3ae8e4d5 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserWalletCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserWalletCache.cs @@ -65,4 +65,10 @@ public sealed class UserWalletCache(IDistributedCache cache, IUserWalletService { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs index 1d0ac382..ef6477df 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs @@ -72,6 +72,12 @@ public sealed class VerifyCodeCache(IDistributedCache cache, IVerifyCodeService return Service.SendVerifyCodeAsync(req); } + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + /// public Task VerifyAsync(VerifyCodeReq req) { diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs index dea11b79..ab97182f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletFrozenCache.cs @@ -71,4 +71,10 @@ public sealed class WalletFrozenCache(IDistributedCache cache, IWalletFrozenServ { return Service.SetStatusToThawedAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletTradeCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletTradeCache.cs index a97020e2..004a29c6 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletTradeCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/WalletTradeCache.cs @@ -65,4 +65,22 @@ public sealed class WalletTradeCache(IDistributedCache cache, IWalletTradeServic { return Service.QueryAsync(req); } + + /// + public Task SumAsync(QueryReq req) + { + return Service.SumAsync(req); + } + + /// + public Task TransferFromAnotherAccountAsync(TransferReq req) + { + return Service.TransferFromAnotherAccountAsync(req); + } + + /// + public Task TransferToAnotherAccountAsync(TransferReq req) + { + return Service.TransferToAnotherAccountAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs index 143f9b94..6de28f76 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs @@ -22,6 +22,7 @@ public sealed class ApiController(IApiCache cache) : ControllerBase /// 接口计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -108,6 +109,15 @@ public sealed class ApiController(IApiCache cache) : ControllerBase + /// 接口求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 同步接口 /// 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 4c1c6a15..d2f4aff4 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/CodeTemplateController.cs @@ -22,6 +22,7 @@ public sealed class CodeTemplateController(ICodeTemplateCache cache) /// /// 代码模板计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -95,4 +96,13 @@ public sealed class CodeTemplateController(ICodeTemplateCache cache) { return Cache.QueryAsync(req); } + + /// + /// 代码模板求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs index cd248545..6a6cb8de 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs @@ -21,6 +21,7 @@ public sealed class ConfigController(IConfigCache cache) : ControllerBase /// 配置计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -117,4 +118,13 @@ public sealed class ConfigController(IConfigCache cache) : ControllerBase + /// 配置求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DepositOrderController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DepositOrderController.cs index 7a645028..3679a34f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DepositOrderController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DepositOrderController.cs @@ -22,6 +22,7 @@ public sealed class DepositOrderController(IDepositOrderCache cache) /// /// 充值订单计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -119,4 +120,13 @@ public sealed class DepositOrderController(IDepositOrderCache cache) { return Cache.ReceivedConfirmationAsync(req); } + + /// + /// 充值订单求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs index 9e6f9a36..294e6f8b 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs @@ -21,6 +21,7 @@ public sealed class DeptController(IDeptCache cache) : ControllerBase /// 部门计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -101,4 +102,13 @@ public sealed class DeptController(IDeptCache cache) : ControllerBase + /// 部门求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs index 54cbc78c..3693091d 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/JobController.cs @@ -23,6 +23,7 @@ public sealed class JobController(IJobCache cache) : ControllerBase /// 计划作业计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -174,4 +175,13 @@ public sealed class JobController(IJobCache cache) : ControllerBase + /// 作业求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs index 422d4b98..9c6e1765 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/LoginLogController.cs @@ -21,6 +21,7 @@ public sealed class LoginLogController(ILoginLogCache cache) : ControllerBase /// 登录日志计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -93,4 +94,13 @@ public sealed class LoginLogController(ILoginLogCache cache) : ControllerBase + /// 登录日志求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs index 85e2d434..0a39a89f 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs @@ -21,6 +21,7 @@ public sealed class MenuController(IMenuCache cache) : ControllerBase /// 菜单计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -96,6 +97,15 @@ public sealed class MenuController(IMenuCache cache) : ControllerBase + /// 菜单求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 当前用户菜单 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs index 55523645..4360586e 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RequestLogController.cs @@ -23,6 +23,7 @@ public sealed class RequestLogController(IRequestLogCache cache) : ControllerBas /// /// 请求日志计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -121,4 +122,13 @@ public sealed class RequestLogController(IRequestLogCache cache) : ControllerBas { return Cache.QueryAsync(req); } + + /// + /// 请求日志求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs index e1b67c46..0b0b99f1 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs @@ -22,6 +22,7 @@ public sealed class RoleController(IRoleCache cache) : ControllerBase /// 角色计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -118,6 +119,15 @@ public sealed class RoleController(IRoleCache cache) : ControllerBase + /// 角色求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 角色用户映射分组计数 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs index 580923c8..faaea965 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/SiteMsgController.cs @@ -22,6 +22,7 @@ public sealed class SiteMsgController(ISiteMsgCache cache) : ControllerBase /// 站内信计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -118,6 +119,15 @@ public sealed class SiteMsgController(ISiteMsgCache cache) : ControllerBase + /// 站内信求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 未读数量 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs index 00fc0cd3..5390f1fb 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs @@ -50,6 +50,7 @@ public sealed class UserController(IUserCache cache, IConfigCache configCache) : /// /// 用户计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -244,6 +245,15 @@ public sealed class UserController(IUserCache cache, IConfigCache configCache) : return Cache.SetSessionUserAppConfigAsync(req); } + /// + /// 用户求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 当前用户信息 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.cs index 74ff9398..51c21f93 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.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.Host.Controllers.Sys; @@ -21,6 +23,7 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas /// /// 用户邀请计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -43,6 +46,14 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas return Cache.CreateAsync(req); } + /// + /// 创建粉丝账号 + /// + public Task CreateFansAccountAsync(CreateFansAccountReq req) + { + return Cache.CreateFansAccountAsync(req); + } + /// /// 删除用户邀请 /// @@ -78,6 +89,14 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas return Cache.GetAsync(req); } + /// + /// 获取自己是否允许自助充值 + /// + public Task GetSelfRechargeAllowedAsync() + { + return Cache.GetSelfRechargeAllowedAsync(); + } + /// /// 分页查询用户邀请 /// @@ -94,6 +113,14 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas return Cache.QueryAsync(req); } + /// + /// 查询可分配的角色 + /// + public Task> QueryRolesAllowApplyAsync() + { + return Cache.QueryRolesAllowApplyAsync(); + } + /// /// 设置返佣比率 /// @@ -101,4 +128,39 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas { return Cache.SetCommissionRatioAsync(req); } + + /// + /// 修改粉丝角色 + /// + [Transaction] + public Task SetFansRoleAsync(SetFansRoleReq req) + { + return Cache.SetFansRoleAsync(req); + } + + /// + /// 设置上级 + /// + [Transaction] + public Task SetInviterAsync(SetInviterReq req) + { + return Cache.SetInviterAsync(req); + } + + /// + /// 设置允许自助充值 + /// + public Task SetSelfRechargeAllowedAsync(SetSelfRechargeAllowedReq req) + { + return Cache.SetSelfRechargeAllowedAsync(req); + } + + /// + /// 用户邀请求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserWalletController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserWalletController.cs index 51cab216..addf2e5d 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserWalletController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserWalletController.cs @@ -21,6 +21,7 @@ public sealed class UserWalletController(IUserWalletCache cache) : ControllerBas /// /// 用户钱包计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -94,4 +95,13 @@ public sealed class UserWalletController(IUserWalletCache cache) : ControllerBas { return Cache.QueryAsync(req); } + + /// + /// 用户钱包求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs index 3166f208..378d68ee 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs @@ -22,6 +22,7 @@ public sealed class VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache c /// /// 验证码计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -111,6 +112,15 @@ public sealed class VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache c return await Cache.SendVerifyCodeAsync(req).ConfigureAwait(false); } + /// + /// 验证码求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + /// /// 完成验证 /// diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs index ade94d84..ae642e47 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletFrozenController.cs @@ -22,6 +22,7 @@ public sealed class WalletFrozenController(IWalletFrozenCache cache) /// /// 钱包冻结计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -104,4 +105,13 @@ public sealed class WalletFrozenController(IWalletFrozenCache cache) { return Cache.SetStatusToThawedAsync(req); } + + /// + /// 钱包冻结求和 + /// + [NonAction] + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } } \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletTradeController.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletTradeController.cs index 1efffb3b..c9db34d3 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletTradeController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/WalletTradeController.cs @@ -21,6 +21,7 @@ public sealed class WalletTradeController(IWalletTradeCache cache) : ControllerB /// /// 钱包交易计数 /// + [NonAction] public Task CountAsync(QueryReq req) { return Cache.CountAsync(req); @@ -94,4 +95,30 @@ public sealed class WalletTradeController(IWalletTradeCache cache) : ControllerB { return Cache.QueryAsync(req); } + + /// + /// 钱包交易求和 + /// + public Task SumAsync(QueryReq req) + { + return Cache.SumAsync(req); + } + + /// + /// 从他人账户转账给自己 + /// + [Transaction] + public Task TransferFromAnotherAccountAsync(TransferReq req) + { + return Cache.TransferFromAnotherAccountAsync(req); + } + + /// + /// 转账到他人账户 + /// + [Transaction] + public Task TransferToAnotherAccountAsync(TransferReq req) + { + return Cache.TransferToAnotherAccountAsync(req); + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/ApiTests.cs b/src/backend/UnitTests/Sys/ApiTests.cs index 45aad3a7..c852d015 100644 --- a/src/backend/UnitTests/Sys/ApiTests.cs +++ b/src/backend/UnitTests/Sys/ApiTests.cs @@ -120,6 +120,16 @@ public class ApiTests(WebTestApplicationFactory factory, ITestOutputHel return null; } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(ApiController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [Fact] public async Task SyncAsync() diff --git a/src/backend/UnitTests/Sys/ConfigTests.cs b/src/backend/UnitTests/Sys/ConfigTests.cs index c6579387..367fc43b 100644 --- a/src/backend/UnitTests/Sys/ConfigTests.cs +++ b/src/backend/UnitTests/Sys/ConfigTests.cs @@ -136,4 +136,14 @@ public class ConfigTests(WebTestApplicationFactory factory, ITestOutput Assert.True(rsp.IsSuccessStatusCode); return 0; } + + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(ConfigController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/DeptTests.cs b/src/backend/UnitTests/Sys/DeptTests.cs index 7a9cbb7b..0c9e31d3 100644 --- a/src/backend/UnitTests/Sys/DeptTests.cs +++ b/src/backend/UnitTests/Sys/DeptTests.cs @@ -119,4 +119,14 @@ public class DeptTests(WebTestApplicationFactory factory, ITestOutputHe Assert.True(rsp.IsSuccessStatusCode); return 0; } + + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(DeptController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/JobTests.cs b/src/backend/UnitTests/Sys/JobTests.cs index 6b2b1f73..64cd1a2b 100644 --- a/src/backend/UnitTests/Sys/JobTests.cs +++ b/src/backend/UnitTests/Sys/JobTests.cs @@ -210,4 +210,14 @@ public class JobTests(WebTestApplicationFactory factory, ITestOutputHel Assert.True(rsp.IsSuccessStatusCode); return 0; } + + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(JobController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/LoginLogTests.cs b/src/backend/UnitTests/Sys/LoginLogTests.cs index aff1253b..9b4aec80 100644 --- a/src/backend/UnitTests/Sys/LoginLogTests.cs +++ b/src/backend/UnitTests/Sys/LoginLogTests.cs @@ -109,4 +109,14 @@ public class LoginLogTests(WebTestApplicationFactory factory, ITestOutp Assert.True(rsp.IsSuccessStatusCode); return null; } + + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(LoginLogController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/MenuTests.cs b/src/backend/UnitTests/Sys/MenuTests.cs index 6ea0ce85..af6e0622 100644 --- a/src/backend/UnitTests/Sys/MenuTests.cs +++ b/src/backend/UnitTests/Sys/MenuTests.cs @@ -110,6 +110,16 @@ public class MenuTests(WebTestApplicationFactory factory, ITestOutputHe return null; } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(MenuController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [Fact] public async Task> UserMenusAsync() diff --git a/src/backend/UnitTests/Sys/RequestLogTests.cs b/src/backend/UnitTests/Sys/RequestLogTests.cs index b055e9c3..74352fa6 100644 --- a/src/backend/UnitTests/Sys/RequestLogTests.cs +++ b/src/backend/UnitTests/Sys/RequestLogTests.cs @@ -140,4 +140,14 @@ public class RequestLogTests(WebTestApplicationFactory factory, ITestOu Assert.True(rsp.IsSuccessStatusCode); return null; } + + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(RequestLogController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } } \ No newline at end of file diff --git a/src/backend/UnitTests/Sys/RoleTests.cs b/src/backend/UnitTests/Sys/RoleTests.cs index b2fb51a1..f8946b23 100644 --- a/src/backend/UnitTests/Sys/RoleTests.cs +++ b/src/backend/UnitTests/Sys/RoleTests.cs @@ -141,6 +141,16 @@ public class RoleTests(WebTestApplicationFactory factory, ITestOutputHe return 0; } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(RoleController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [InlineData(null)] [Theory] diff --git a/src/backend/UnitTests/Sys/SiteMsgTests.cs b/src/backend/UnitTests/Sys/SiteMsgTests.cs index f02c33d4..31ae3327 100644 --- a/src/backend/UnitTests/Sys/SiteMsgTests.cs +++ b/src/backend/UnitTests/Sys/SiteMsgTests.cs @@ -140,6 +140,16 @@ public class SiteMsgTests(WebTestApplicationFactory factory, ITestOutpu Assert.True(rsp.IsSuccessStatusCode); } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(SiteMsgController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [Fact] public async Task UnreadCountAsync() diff --git a/src/backend/UnitTests/Sys/UserTests.cs b/src/backend/UnitTests/Sys/UserTests.cs index b0552963..b20f8d63 100644 --- a/src/backend/UnitTests/Sys/UserTests.cs +++ b/src/backend/UnitTests/Sys/UserTests.cs @@ -294,6 +294,16 @@ public class UserTests(WebTestApplicationFactory factory, ITestOutputHe return 0; } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(UserController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [Fact] [TestPriority(102500)] diff --git a/src/backend/UnitTests/Sys/VerifyCodeTests.cs b/src/backend/UnitTests/Sys/VerifyCodeTests.cs index f50a51c3..0f4917d2 100644 --- a/src/backend/UnitTests/Sys/VerifyCodeTests.cs +++ b/src/backend/UnitTests/Sys/VerifyCodeTests.cs @@ -120,6 +120,16 @@ public class VerifyCodeTests(WebTestApplicationFactory factory, ITestOu return null; } + /// + [InlineData(null)] + [Theory] + public async Task SumAsync(QueryReq req) + { + var rsp = await PostJsonAsync(typeof(VerifyCodeController), req); + Assert.True(rsp.IsSuccessStatusCode); + return 0; + } + /// [InlineData(null)] [Theory] diff --git a/src/backend/YourSolution.AdmServer.Host/CommandLineArgs.cs b/src/backend/YourSolution.AdmServer.Host/CommandLineArgs.cs index 8551ad1c..3fd9864a 100644 --- a/src/backend/YourSolution.AdmServer.Host/CommandLineArgs.cs +++ b/src/backend/YourSolution.AdmServer.Host/CommandLineArgs.cs @@ -13,6 +13,12 @@ public sealed class CommandLineArgs : CommandSettings [CommandOption("-i|--insert-seed-data")] public bool InsertSeedData { get; init; } + /// + /// 强制启动计划作业 + /// + [CommandOption("-j|--job-force")] + public bool JobForce { get; init; } + /// /// 同步数据库结构 /// diff --git a/src/backend/YourSolution.AdmServer.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/YourSolution.AdmServer.Host/Extensions/ServiceCollectionExtensions.cs index fa69df2c..3fa309db 100644 --- a/src/backend/YourSolution.AdmServer.Host/Extensions/ServiceCollectionExtensions.cs +++ b/src/backend/YourSolution.AdmServer.Host/Extensions/ServiceCollectionExtensions.cs @@ -33,9 +33,15 @@ public static class ServiceCollectionExtensions // 本部门和子部门 _ = freeSql.GlobalFilter.ApplyOnlyIf( // - Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILD - , () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.DeptWithChild) ?? false + Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_CHILDREN + , () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.DeptWithChildren) ?? false , a => ContextUserInfo.Create().DeptIds.Contains(a.OwnerDeptId)); + + // 本部门和下一级部门 + _ = freeSql.GlobalFilter.ApplyOnlyIf( // + Chars.FLG_FREE_SQL_GLOBAL_FILTER_DEPT_WITH_SON + , () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.DeptWithSon) ?? false + , a => ContextUserInfo.Create().DeptIds.Take(2).Contains(a.OwnerDeptId)); }); } diff --git a/src/backend/YourSolution.AdmServer.Host/Startup.cs b/src/backend/YourSolution.AdmServer.Host/Startup.cs index 37b12929..983b4c9c 100644 --- a/src/backend/YourSolution.AdmServer.Host/Startup.cs +++ b/src/backend/YourSolution.AdmServer.Host/Startup.cs @@ -72,6 +72,7 @@ namespace YourSolution.AdmServer.Host .UseMiddleware() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点 .UseWebSockets() // 使用WebSockets中间件,启用WebSocket支持 .UseMiddleware() // 使用VersionUpdaterMiddleware中间件,用于检查版本 + .UseMiddleware() // 使用EnvironmentInfoMiddleware中间件,用于获取环境信息 .UseEndpoints(); // 配置端点以处理请求 _ = lifeTime.ApplicationStopping.Register(SafetyShopHostMiddleware.OnStopping); } @@ -94,7 +95,7 @@ namespace YourSolution.AdmServer.Host .AddContextUserToken() // 添加上下文用户令牌 .AddContextUserInfo() // 添加上下文用户信息 .AddRedisCache() // 添加 Redis 缓存 - .AddSchedules() // 添加计划任务 + .AddSchedules(Args.JobForce) // 添加计划任务 .AddTronScanClient() // 添加 TronScan 客户端 // IMvcBuilder diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json index 992f4816..ce9366e8 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.1", + "ace-builds": "1.43.2", "aieditor": "1.4.0", - "axios": "1.10.0", + "axios": "1.11.0", "crypto-js": "4.2.0", "dayjs": "1.11.13", "echarts": "5.6.0", - "element-plus": "2.10.3", + "element-plus": "2.10.4", "json-bigint": "1.0.0", "markdown-it": "14.1.0", "markdown-it-emoji": "3.0.0", @@ -24,8 +24,8 @@ "qrcode-svg": "1.1.0", "sortablejs": "1.15.6", "vkbeautify": "0.99.3", - "vue": "3.5.17", - "vue-i18n": "11.1.9", + "vue": "3.5.18", + "vue-i18n": "11.1.11", "vue-router": "4.5.1", "vue3-ace-editor": "2.2.4", "vue3-json-viewer": "2.4.1", @@ -33,12 +33,12 @@ "vuex": "4.1.0" }, "devDependencies": { - "@vitejs/plugin-vue": "6.0.0", + "@vitejs/plugin-vue": "6.0.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", "sass": "1.89.2", "terser": "5.43.1", - "vite": "7.0.4" + "vite": "7.0.6" }, "browserslist": [ "> 1%", diff --git a/src/frontend/admin/src/api/sys/api.js b/src/frontend/admin/src/api/sys/api.js index b9276610..40179b7b 100644 --- a/src/frontend/admin/src/api/sys/api.js +++ b/src/frontend/admin/src/api/sys/api.js @@ -5,17 +5,6 @@ import config from '@/config' import http from '@/utils/request' export default { - /** - * 接口计数 - */ - count: { - url: `${config.API_URL}/api/sys/api/count`, - name: `接口计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 导出接口 */ diff --git a/src/frontend/admin/src/api/sys/codetemplate.js b/src/frontend/admin/src/api/sys/codetemplate.js index 26256474..cb4b1b79 100644 --- a/src/frontend/admin/src/api/sys/codetemplate.js +++ b/src/frontend/admin/src/api/sys/codetemplate.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 代码模板计数 - */ - count: { - url: `${config.API_URL}/api/sys/code.template/count`, - name: `代码模板计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 代码模板分组计数 */ diff --git a/src/frontend/admin/src/api/sys/config.js b/src/frontend/admin/src/api/sys/config.js index b425b7af..ab518236 100644 --- a/src/frontend/admin/src/api/sys/config.js +++ b/src/frontend/admin/src/api/sys/config.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 配置计数 - */ - count: { - url: `${config.API_URL}/api/sys/config/count`, - name: `配置计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 配置分组计数 */ diff --git a/src/frontend/admin/src/api/sys/depositorder.js b/src/frontend/admin/src/api/sys/depositorder.js index 5361bf51..caf3fceb 100644 --- a/src/frontend/admin/src/api/sys/depositorder.js +++ b/src/frontend/admin/src/api/sys/depositorder.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 充值订单计数 - */ - count: { - url: `${config.API_URL}/api/sys/deposit.order/count`, - name: `充值订单计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 充值订单分组计数 */ diff --git a/src/frontend/admin/src/api/sys/dept.js b/src/frontend/admin/src/api/sys/dept.js index d5331e3c..f1db1798 100644 --- a/src/frontend/admin/src/api/sys/dept.js +++ b/src/frontend/admin/src/api/sys/dept.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 部门计数 - */ - count: { - url: `${config.API_URL}/api/sys/dept/count`, - name: `部门计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 部门分组计数 */ diff --git a/src/frontend/admin/src/api/sys/job.js b/src/frontend/admin/src/api/sys/job.js index cd52273f..e38a0025 100644 --- a/src/frontend/admin/src/api/sys/job.js +++ b/src/frontend/admin/src/api/sys/job.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 计划作业计数 - */ - count: { - url: `${config.API_URL}/api/sys/job/count`, - name: `计划作业计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 计划作业分组计数 */ diff --git a/src/frontend/admin/src/api/sys/loginlog.js b/src/frontend/admin/src/api/sys/loginlog.js index 50d9efbf..4e4ad049 100644 --- a/src/frontend/admin/src/api/sys/loginlog.js +++ b/src/frontend/admin/src/api/sys/loginlog.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 登录日志计数 - */ - count: { - url: `${config.API_URL}/api/sys/login.log/count`, - name: `登录日志计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 登录日志分组计数 */ diff --git a/src/frontend/admin/src/api/sys/menu.js b/src/frontend/admin/src/api/sys/menu.js index a578aa27..8fd53d6a 100644 --- a/src/frontend/admin/src/api/sys/menu.js +++ b/src/frontend/admin/src/api/sys/menu.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 菜单计数 - */ - count: { - url: `${config.API_URL}/api/sys/menu/count`, - name: `菜单计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 创建菜单 */ diff --git a/src/frontend/admin/src/api/sys/requestlog.js b/src/frontend/admin/src/api/sys/requestlog.js index 74e68138..68670bc5 100644 --- a/src/frontend/admin/src/api/sys/requestlog.js +++ b/src/frontend/admin/src/api/sys/requestlog.js @@ -5,17 +5,6 @@ import config from '@/config' import http from '@/utils/request' export default { - /** - * 请求日志计数 - */ - count: { - url: `${config.API_URL}/api/sys/request.log/count`, - name: `请求日志计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 请求日志分组计数 */ diff --git a/src/frontend/admin/src/api/sys/role.js b/src/frontend/admin/src/api/sys/role.js index 21cde53e..6aa64bd6 100644 --- a/src/frontend/admin/src/api/sys/role.js +++ b/src/frontend/admin/src/api/sys/role.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 角色计数 - */ - count: { - url: `${config.API_URL}/api/sys/role/count`, - name: `角色计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 角色分组计数 */ diff --git a/src/frontend/admin/src/api/sys/sitemsg.js b/src/frontend/admin/src/api/sys/sitemsg.js index d5fed316..f5aa0986 100644 --- a/src/frontend/admin/src/api/sys/sitemsg.js +++ b/src/frontend/admin/src/api/sys/sitemsg.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 站内信计数 - */ - count: { - url: `${config.API_URL}/api/sys/site.msg/count`, - name: `站内信计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 站内信分组计数 */ diff --git a/src/frontend/admin/src/api/sys/user.js b/src/frontend/admin/src/api/sys/user.js index 36f6ba58..19d642cb 100644 --- a/src/frontend/admin/src/api/sys/user.js +++ b/src/frontend/admin/src/api/sys/user.js @@ -38,17 +38,6 @@ export default { }, }, - /** - * 用户计数 - */ - count: { - url: `${config.API_URL}/api/sys/user/count`, - name: `用户计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 用户分组计数 */ diff --git a/src/frontend/admin/src/api/sys/userinvite.js b/src/frontend/admin/src/api/sys/userinvite.js index 960981d7..506f7309 100644 --- a/src/frontend/admin/src/api/sys/userinvite.js +++ b/src/frontend/admin/src/api/sys/userinvite.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 用户邀请计数 - */ - count: { - url: `${config.API_URL}/api/sys/user.invite/count`, - name: `用户邀请计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 用户邀请分组计数 */ @@ -49,6 +38,17 @@ export default { }, }, + /** + * 创建粉丝账号 + */ + createFansAccount: { + url: `${config.API_URL}/api/sys/user.invite/create.fans.account`, + name: `创建粉丝账号`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 删除用户邀请 */ @@ -82,6 +82,17 @@ export default { }, }, + /** + * 获取自己是否允许自助充值 + */ + getSelfRechargeAllowed: { + url: `${config.API_URL}/api/sys/user.invite/get.self.recharge.allowed`, + name: `获取自己是否允许自助充值`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 分页查询用户邀请 */ @@ -104,6 +115,17 @@ export default { }, }, + /** + * 查询可分配的角色 + */ + queryRolesAllowApply: { + url: `${config.API_URL}/api/sys/user.invite/query.roles.allow.apply`, + name: `查询可分配的角色`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + /** * 设置返佣比率 */ @@ -114,4 +136,37 @@ export default { return await http.post(this.url, data, config) }, }, + + /** + * 修改粉丝角色 + */ + setFansRole: { + url: `${config.API_URL}/api/sys/user.invite/set.fans.role`, + name: `修改粉丝角色`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 设置上级 + */ + setInviter: { + url: `${config.API_URL}/api/sys/user.invite/set.inviter`, + name: `设置上级`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 设置允许自助充值 + */ + setSelfRechargeAllowed: { + url: `${config.API_URL}/api/sys/user.invite/set.self.recharge.allowed`, + 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/userwallet.js b/src/frontend/admin/src/api/sys/userwallet.js index 1b56ab4f..257605e5 100644 --- a/src/frontend/admin/src/api/sys/userwallet.js +++ b/src/frontend/admin/src/api/sys/userwallet.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 用户钱包计数 - */ - count: { - url: `${config.API_URL}/api/sys/user.wallet/count`, - name: `用户钱包计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 用户钱包分组计数 */ diff --git a/src/frontend/admin/src/api/sys/verifycode.js b/src/frontend/admin/src/api/sys/verifycode.js index c17714d5..ac4dc62e 100644 --- a/src/frontend/admin/src/api/sys/verifycode.js +++ b/src/frontend/admin/src/api/sys/verifycode.js @@ -5,17 +5,6 @@ import config from '@/config' import http from '@/utils/request' export default { - /** - * 验证码计数 - */ - count: { - url: `${config.API_URL}/api/sys/verify.code/count`, - name: `验证码计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 发送验证码 */ diff --git a/src/frontend/admin/src/api/sys/walletfrozen.js b/src/frontend/admin/src/api/sys/walletfrozen.js index 9757a6d9..6f347f06 100644 --- a/src/frontend/admin/src/api/sys/walletfrozen.js +++ b/src/frontend/admin/src/api/sys/walletfrozen.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 钱包冻结计数 - */ - count: { - url: `${config.API_URL}/api/sys/wallet.frozen/count`, - name: `钱包冻结计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 钱包冻结分组计数 */ diff --git a/src/frontend/admin/src/api/sys/wallettrade.js b/src/frontend/admin/src/api/sys/wallettrade.js index 0a8cbc07..6c19bb69 100644 --- a/src/frontend/admin/src/api/sys/wallettrade.js +++ b/src/frontend/admin/src/api/sys/wallettrade.js @@ -16,17 +16,6 @@ export default { }, }, - /** - * 钱包交易计数 - */ - count: { - url: `${config.API_URL}/api/sys/wallet.trade/count`, - name: `钱包交易计数`, - post: async function (data = {}, config = {}) { - return await http.post(this.url, data, config) - }, - }, - /** * 钱包交易分组计数 */ @@ -92,4 +81,37 @@ export default { return await http.post(this.url, data, config) }, }, + + /** + * 钱包交易求和 + */ + sum: { + url: `${config.API_URL}/api/sys/wallet.trade/sum`, + name: `钱包交易求和`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 从他人账户转账给自己 + */ + transferFromAnotherAccount: { + url: `${config.API_URL}/api/sys/wallet.trade/transfer.from.another.account`, + name: `从他人账户转账给自己`, + post: async function (data = {}, config = {}) { + return await http.post(this.url, data, config) + }, + }, + + /** + * 转账到他人账户 + */ + transferToAnotherAccount: { + url: `${config.API_URL}/api/sys/wallet.trade/transfer.to.another.account`, + 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/index.js b/src/frontend/admin/src/assets/icon/index.js index e39d1a39..f9eb2470 100644 --- a/src/frontend/admin/src/assets/icon/index.js +++ b/src/frontend/admin/src/assets/icon/index.js @@ -78,4 +78,5 @@ export { default as telegram } from './telegram' export { default as country } from './country' export { default as template } from './template.vue' export { default as order } from './order.vue' -export { default as income } from './income.vue' \ No newline at end of file +export { default as income } from './income.vue' +export { default as transfer } from './transfer.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icon/transfer.vue b/src/frontend/admin/src/assets/icon/transfer.vue new file mode 100644 index 00000000..7f83bd84 --- /dev/null +++ b/src/frontend/admin/src/assets/icon/transfer.vue @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/components/na-col-avatar/index.vue b/src/frontend/admin/src/components/na-col-avatar/index.vue index 526fb751..b02f62d3 100644 --- a/src/frontend/admin/src/components/na-col-avatar/index.vue +++ b/src/frontend/admin/src/components/na-col-avatar/index.vue @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/src/frontend/admin/src/components/na-col-user/index.vue b/src/frontend/admin/src/components/na-col-user/index.vue index c4b0fdcf..76a3083c 100644 --- a/src/frontend/admin/src/components/na-col-user/index.vue +++ b/src/frontend/admin/src/components/na-col-user/index.vue @@ -1,59 +1,14 @@