using System; using System.Threading.Tasks; using AIK.Common.Language; using AIK.Models.ApiModels.Membership; using AIK.Service.IService; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.Logging; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; namespace AIK.ViewModels.Membership { public partial class MembershipOpenViewModel : ObservableObject { private readonly IMembershipService _membershipService; private readonly IDataCacheService _dataCacheService; private readonly IUserSessionCoordinator _userSessionCoordinator; private readonly ILogger _logger; public MembershipOpenViewModel( IMembershipService membershipService, IDataCacheService dataCacheService, IUserSessionCoordinator userSessionCoordinator, ILogger logger) { _membershipService = membershipService; _dataCacheService = dataCacheService; _userSessionCoordinator = userSessionCoordinator; _logger = logger; } public ObservableCollection Modules { get; } = new(); [ObservableProperty] private bool _isBusy; [ObservableProperty] private string _statusMessage = string.Empty; public string WindowTitle => AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpenWindowTitle") ?? string.Empty; public string FeeStandardText => AiKLanguage.LanguageKey.GetValueOrDefault("MembershipFeeStandard") ?? string.Empty; public string IntegralPerYearText => AiKLanguage.LanguageKey.GetValueOrDefault("MembershipIntegralPerYear") ?? string.Empty; public string OpenButtonText => AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpenButton") ?? string.Empty; [RelayCommand] public async Task LoadModulesAsync() { IsBusy = true; StatusMessage = string.Empty; try { var modules = await _membershipService.GetModuleListAsync("key"); SetModules(modules.Select(ToOpenItem).Where(item => item != null).Cast()); if (Modules.Count == 0) { SetModules(GetDefaultModules()); } } catch (Exception ex) { _logger.LogError(ex, "加载会员功能列表失败"); SetModules(GetDefaultModules()); StatusMessage = AiKLanguage.LanguageKey.GetValueOrDefault("MembershipLoadFailedFallback") ?? string.Empty; } finally { IsBusy = false; } } [RelayCommand] public async Task OpenModuleAsync(MembershipOpenItem? module) { if (module == null || module.IsOpening) { return; } var token = await _dataCacheService.GetLatestUserTokenAsync(); if (string.IsNullOrWhiteSpace(token)) { StatusMessage = AiKLanguage.LanguageKey.GetValueOrDefault("MembershipLoginRequired") ?? string.Empty; return; } module.IsOpening = true; IsBusy = true; StatusMessage = AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpening") ?? string.Empty; try { var response = await _membershipService.OpenFunctionAsync(token, new OpenMembershipRequest { FuncCode = module.Code, SerNo = null }); if (response.Code == 1) { var successSuffix = AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpenSuccess") ?? string.Empty; StatusMessage = string.IsNullOrWhiteSpace(module.Name) ? successSuffix : $"{module.Name}{successSuffix}"; await _userSessionCoordinator.RefreshIntegralAsync(); return; } StatusMessage = response.I18nMsg ?? response.Msg ?? AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpenFailed") ?? string.Empty; } catch (Exception ex) { _logger.LogError(ex, "开通会员功能失败:{Code}", module.Code); StatusMessage = AiKLanguage.LanguageKey.GetValueOrDefault("MembershipOpenFailed") ?? string.Empty; } finally { module.IsOpening = false; IsBusy = false; } } private void SetModules(IEnumerable modules) { Modules.Clear(); foreach (var module in modules) { Modules.Add(module); } } private static MembershipOpenItem? ToOpenItem(MembershipModule module) { if (string.IsNullOrWhiteSpace(module.Code) || string.IsNullOrWhiteSpace(module.Name)) { return null; } return new MembershipOpenItem(module.Code, module.Name, module.Num); } private static IEnumerable GetDefaultModules() { yield return new MembershipOpenItem( "data_write_start", AiKLanguage.LanguageKey.GetValueOrDefault("MembershipModuleDataWriteStart") ?? "数据写启动", 25000); yield return new MembershipOpenItem( "k3_genie_plus", AiKLanguage.LanguageKey.GetValueOrDefault("MembershipModuleK3GeniePlus") ?? "K3精灵+", 25000); yield return new MembershipOpenItem( "ai", AiKLanguage.LanguageKey.GetValueOrDefault("MembershipModuleAiIntelligent") ?? "AI智能功能", 30000); } } }