package services import ( "tyapi-server/internal/domains/certification/enums" ) // StateConfig 状态配置 type StateConfig struct { Status enums.CertificationStatus `json:"status"` Name string `json:"name"` ProgressPercentage int `json:"progress_percentage"` IsUserActionRequired bool `json:"is_user_action_required"` IsAdminActionRequired bool `json:"is_admin_action_required"` TimestampField string `json:"timestamp_field,omitempty"` Description string `json:"description"` NextValidStatuses []enums.CertificationStatus `json:"next_valid_statuses"` } // TransitionConfig 状态转换配置 type TransitionConfig struct { From enums.CertificationStatus `json:"from"` To enums.CertificationStatus `json:"to"` Action string `json:"action"` ActionName string `json:"action_name"` AllowUser bool `json:"allow_user"` AllowAdmin bool `json:"allow_admin"` RequiresValidation bool `json:"requires_validation"` Description string `json:"description"` } // CertificationStateManager 认证状态管理器 type CertificationStateManager struct { stateMap map[enums.CertificationStatus]*StateConfig transitionMap map[enums.CertificationStatus][]*TransitionConfig } // NewCertificationStateManager 创建认证状态管理器 func NewCertificationStateManager() *CertificationStateManager { manager := &CertificationStateManager{ stateMap: make(map[enums.CertificationStatus]*StateConfig), transitionMap: make(map[enums.CertificationStatus][]*TransitionConfig), } // 初始化状态配置 manager.initStateConfigs() return manager } // initStateConfigs 初始化状态配置 func (manager *CertificationStateManager) initStateConfigs() { // 状态配置 states := []*StateConfig{ { Status: enums.StatusPending, Name: "待认证", ProgressPercentage: 0, IsUserActionRequired: true, IsAdminActionRequired: false, Description: "等待用户提交企业信息", NextValidStatuses: []enums.CertificationStatus{enums.StatusInfoSubmitted}, }, { Status: enums.StatusInfoSubmitted, Name: "已提交企业信息", ProgressPercentage: 20, IsUserActionRequired: true, IsAdminActionRequired: false, TimestampField: "InfoSubmittedAt", Description: "用户已提交企业信息", NextValidStatuses: []enums.CertificationStatus{enums.StatusEnterpriseVerified, enums.StatusInfoSubmitted}, // 可以重新提交 }, { Status: enums.StatusEnterpriseVerified, Name: "已企业认证", ProgressPercentage: 40, IsUserActionRequired: true, IsAdminActionRequired: false, TimestampField: "EnterpriseVerifiedAt", Description: "企业认证已完成", NextValidStatuses: []enums.CertificationStatus{enums.StatusContractApplied}, }, { Status: enums.StatusContractApplied, Name: "已申请合同", ProgressPercentage: 60, IsUserActionRequired: true, IsAdminActionRequired: false, TimestampField: "ContractAppliedAt", Description: "合同已申请", NextValidStatuses: []enums.CertificationStatus{enums.StatusContractSigned}, }, { Status: enums.StatusContractSigned, Name: "已签署合同", ProgressPercentage: 80, IsUserActionRequired: false, IsAdminActionRequired: false, TimestampField: "ContractSignedAt", Description: "合同已签署", NextValidStatuses: []enums.CertificationStatus{enums.StatusCompleted}, }, { Status: enums.StatusCompleted, Name: "认证完成", ProgressPercentage: 100, IsUserActionRequired: false, IsAdminActionRequired: false, TimestampField: "CompletedAt", Description: "认证流程已完成", NextValidStatuses: []enums.CertificationStatus{}, }, } // 转换配置 transitions := []*TransitionConfig{ // 提交企业信息 { From: enums.StatusPending, To: enums.StatusInfoSubmitted, Action: "submit_info", ActionName: "提交企业信息", AllowUser: true, AllowAdmin: false, RequiresValidation: true, Description: "用户提交企业信息", }, // 重新提交企业信息 { From: enums.StatusInfoSubmitted, To: enums.StatusInfoSubmitted, Action: "resubmit_info", ActionName: "重新提交企业信息", AllowUser: true, AllowAdmin: false, RequiresValidation: true, Description: "用户重新提交企业信息", }, // 企业认证 { From: enums.StatusInfoSubmitted, To: enums.StatusEnterpriseVerified, Action: "enterprise_verify", ActionName: "企业认证", AllowUser: true, AllowAdmin: false, RequiresValidation: true, Description: "用户完成企业认证", }, // 申请合同 { From: enums.StatusEnterpriseVerified, To: enums.StatusContractApplied, Action: "apply_contract", ActionName: "申请合同", AllowUser: true, AllowAdmin: false, RequiresValidation: false, Description: "用户申请合同", }, // 签署合同 { From: enums.StatusContractApplied, To: enums.StatusContractSigned, Action: "sign_contract", ActionName: "签署合同", AllowUser: true, AllowAdmin: false, RequiresValidation: true, Description: "用户签署合同", }, // 完成认证 { From: enums.StatusContractSigned, To: enums.StatusCompleted, Action: "complete", ActionName: "完成认证", AllowUser: false, AllowAdmin: false, RequiresValidation: false, Description: "系统自动完成认证", }, } // 构建映射 for _, state := range states { manager.stateMap[state.Status] = state } for _, transition := range transitions { manager.transitionMap[transition.From] = append(manager.transitionMap[transition.From], transition) } } // GetStateConfig 获取状态配置 func (manager *CertificationStateManager) GetStateConfig(status enums.CertificationStatus) *StateConfig { return manager.stateMap[status] } // GetTransitionConfigs 获取状态转换配置 func (manager *CertificationStateManager) GetTransitionConfigs(from enums.CertificationStatus) []*TransitionConfig { return manager.transitionMap[from] } // CanTransition 检查是否可以转换 func (manager *CertificationStateManager) CanTransition(from enums.CertificationStatus, to enums.CertificationStatus, isUser bool, isAdmin bool) (bool, string) { transitions := manager.GetTransitionConfigs(from) for _, transition := range transitions { if transition.To == to { if isUser && !transition.AllowUser { return false, "用户不允许执行此操作" } if isAdmin && !transition.AllowAdmin { return false, "管理员不允许执行此操作" } if !isUser && !isAdmin && (transition.AllowUser || transition.AllowAdmin) { return false, "此操作需要用户或管理员权限" } return true, "" } } return false, "不支持的状态转换" } // GetProgressPercentage 获取进度百分比 func (manager *CertificationStateManager) GetProgressPercentage(status enums.CertificationStatus) int { if stateConfig := manager.GetStateConfig(status); stateConfig != nil { return stateConfig.ProgressPercentage } return 0 } // IsUserActionRequired 检查是否需要用户操作 func (manager *CertificationStateManager) IsUserActionRequired(status enums.CertificationStatus) bool { if stateConfig := manager.GetStateConfig(status); stateConfig != nil { return stateConfig.IsUserActionRequired } return false } // IsAdminActionRequired 检查是否需要管理员操作 func (manager *CertificationStateManager) IsAdminActionRequired(status enums.CertificationStatus) bool { if stateConfig := manager.GetStateConfig(status); stateConfig != nil { return stateConfig.IsAdminActionRequired } return false } // GetNextValidStatuses 获取下一个有效状态 func (manager *CertificationStateManager) GetNextValidStatuses(status enums.CertificationStatus) []enums.CertificationStatus { if stateConfig := manager.GetStateConfig(status); stateConfig != nil { return stateConfig.NextValidStatuses } return []enums.CertificationStatus{} }