237 lines
8.4 KiB
Go
237 lines
8.4 KiB
Go
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{},
|
|
},
|
|
// 已完成状态已合并到StatusContractSigned中
|
|
}
|
|
|
|
// 转换配置
|
|
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: "用户签署合同",
|
|
},
|
|
// 合同签署即为认证完成,无需额外状态转换
|
|
}
|
|
|
|
// 构建映射
|
|
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{}
|
|
} |