From e5a0f925a0650a263b79de0e5793b8db2348a7ae Mon Sep 17 00:00:00 2001 From: tk Date: Mon, 30 Jun 2025 16:38:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20=E8=90=A5=E9=94=80=E7=AE=A1?= =?UTF-8?q?=E7=90=86-=E8=BF=94=E4=BD=A3=E6=AF=94=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DbMaps/Sys/Sys_UserInvite.cs | 8 ++++ .../Dto/Sys/UserInvite/CreateUserInviteReq.cs | 7 +++- .../Dto/Sys/UserInvite/QueryUserInviteRsp.cs | 4 ++ .../Sys/UserInvite/SetCommissionRatioReq.cs | 15 ++++++++ .../Modules/Sys/IUserInviteModule.cs | 8 +++- .../Services/Sys/UserInviteService.cs | 7 ++++ .../Sys/UserInviteCache.cs | 6 +++ .../Controllers/Sys/UserInviteController.cs | 8 ++++ src/frontend/admin/src/api/sys/userinvite.js | 11 ++++++ .../admin/src/views/sys/invite/index.vue | 37 +++++++++++++++++-- 10 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetCommissionRatioReq.cs 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 21142f85..b5d45bf7 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/DbMaps/Sys/Sys_UserInvite.cs @@ -14,6 +14,14 @@ public record Sys_UserInvite : VersionEntity, IFieldOwner [Navigate(nameof(OwnerId))] public IEnumerable Children { get; init; } + /// + /// 返佣比率 + /// + [Column] + [CsvIgnore] + [JsonIgnore] + public virtual int CommissionRatio { get; init; } + /// /// 归属 /// 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 6199dd1b..f7c19b3a 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/CreateUserInviteReq.cs @@ -3,4 +3,9 @@ namespace NetAdmin.Domain.Dto.Sys.UserInvite; /// /// 请求:创建用户邀请 /// -public record CreateUserInviteReq : Sys_UserInvite; \ No newline at end of file +public record CreateUserInviteReq : Sys_UserInvite +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override int CommissionRatio { get; init; } +} \ 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 2f42250e..38eb4b74 100644 --- a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/QueryUserInviteRsp.cs @@ -10,6 +10,10 @@ public record QueryUserInviteRsp : Sys_UserInvite /// public new virtual IEnumerable Children { get; init; } + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override int CommissionRatio { get; init; } + /// [JsonIgnore(Condition = JsonIgnoreCondition.Never)] public override DateTime CreatedTime { get; init; } diff --git a/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetCommissionRatioReq.cs b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetCommissionRatioReq.cs new file mode 100644 index 00000000..4703c74f --- /dev/null +++ b/src/backend/NetAdmin/NetAdmin.Domain/Dto/Sys/UserInvite/SetCommissionRatioReq.cs @@ -0,0 +1,15 @@ +namespace NetAdmin.Domain.Dto.Sys.UserInvite; + +/// +/// 请求:设置返佣比率 +/// +public record SetCommissionRatioReq : CreateUserInviteReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs index c7159792..0d1f8217 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Modules/Sys/IUserInviteModule.cs @@ -9,4 +9,10 @@ public interface IUserInviteModule : ICrudModule; \ No newline at end of file +> +{ + /// + /// 设置返佣比率 + /// + Task SetCommissionRatioAsync(SetCommissionRatioReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs index eeab803b..d93425eb 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Application/Services/Sys/UserInviteService.cs @@ -108,6 +108,13 @@ public sealed class UserInviteService(BasicRepository rpo) return ret.Adapt>(); } + /// + public Task SetCommissionRatioAsync(SetCommissionRatioReq req) + { + req.ThrowIfInvalid(); + return UpdateAsync(req with { CommissionRatio = req.CommissionRatio }, [nameof(req.CommissionRatio)], null, a => a.Id == req.Id, null, true); + } + private ISelect QueryInternal(QueryReq req) { var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter); diff --git a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs index c3ed7982..1dc48cad 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Cache/Sys/UserInviteCache.cs @@ -65,4 +65,10 @@ public sealed class UserInviteCache(IDistributedCache cache, IUserInviteService { return Service.QueryAsync(req); } + + /// + public Task SetCommissionRatioAsync(SetCommissionRatioReq req) + { + return Service.SetCommissionRatioAsync(req); + } } \ No newline at end of file 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 5e6eb350..74ff9398 100644 --- a/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.cs +++ b/src/backend/NetAdmin/NetAdmin.SysComponent.Host/Controllers/Sys/UserInviteController.cs @@ -93,4 +93,12 @@ public sealed class UserInviteController(IUserInviteCache cache) : ControllerBas { return Cache.QueryAsync(req); } + + /// + /// 设置返佣比率 + /// + public Task SetCommissionRatioAsync(SetCommissionRatioReq req) + { + return Cache.SetCommissionRatioAsync(req); + } } \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/userinvite.js b/src/frontend/admin/src/api/sys/userinvite.js index 3b08b899..960981d7 100644 --- a/src/frontend/admin/src/api/sys/userinvite.js +++ b/src/frontend/admin/src/api/sys/userinvite.js @@ -103,4 +103,15 @@ export default { return await http.post(this.url, data, config) }, }, + + /** + * 设置返佣比率 + */ + setCommissionRatio: { + url: `${config.API_URL}/api/sys/user.invite/set.commission.ratio`, + 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/views/sys/invite/index.vue b/src/frontend/admin/src/views/sys/invite/index.vue index 10da54c7..bf429e62 100644 --- a/src/frontend/admin/src/views/sys/invite/index.vue +++ b/src/frontend/admin/src/views/sys/invite/index.vue @@ -44,14 +44,16 @@ - + + @@ -117,6 +125,29 @@ export default { }, inject: ['reload'], methods: { + async setCommissionRatio() { + let loading + try { + const prompt = await this.$prompt(this.$t('1 代表 0.01%'), this.$t('设置返佣比率'), { + inputPattern: /^[0-9]\d*$/, + inputErrorMessage: this.$t('返佣比率不正确'), + }) + loading = this.$loading() + const res = await Promise.all( + this.selection.map((x) => this.$API.sys_userinvite.setCommissionRatio.post(Object.assign(x, { commissionRatio: prompt.value }))), + ) + this.$message.success( + this.$t(`操作成功 {count}/{total} 项`, { + count: this.selection.length, + total: res.map((x) => x.data ?? 0).reduce((a, b) => a + b, 0), + }), + ) + this.$refs.table.refresh() + } catch { + // + } + loading?.close() + }, async getStatistics() { this.statistics.total = this.$refs.table?.tableData?.length },