package services import ( "context" "fmt" "go.uber.org/zap" "tyapi-server/internal/domains/certification/enums" "tyapi-server/internal/domains/certification/repositories" ) // CertificationWorkflowService 认证工作流领域服务 // 负责认证流程的状态转换和业务逻辑处理 type CertificationWorkflowService struct { certRepo repositories.CertificationRepository stateMachine *CertificationStateMachine logger *zap.Logger } // NewCertificationWorkflowService 创建认证工作流领域服务 func NewCertificationWorkflowService( certRepo repositories.CertificationRepository, stateMachine *CertificationStateMachine, logger *zap.Logger, ) *CertificationWorkflowService { return &CertificationWorkflowService{ certRepo: certRepo, stateMachine: stateMachine, logger: logger, } } // SubmitEnterpriseInfo 提交企业信息 func (s *CertificationWorkflowService) SubmitEnterpriseInfo(ctx context.Context, certificationID string) error { cert, err := s.certRepo.GetByID(ctx, certificationID) if err != nil { return fmt.Errorf("认证申请不存在: %w", err) } // 检查当前状态是否可以提交企业信息 if cert.Status != enums.StatusPending && cert.Status != enums.StatusInfoSubmitted { return fmt.Errorf("当前状态不允许提交企业信息") } // 使用状态机转换状态 if err := s.stateMachine.TransitionTo(ctx, certificationID, enums.StatusInfoSubmitted, true, false, nil); err != nil { return fmt.Errorf("状态转换失败: %w", err) } s.logger.Info("企业信息提交成功", zap.String("certification_id", certificationID), zap.String("user_id", cert.UserID), ) return nil } // CompleteEnterpriseVerification 完成企业认证 func (s *CertificationWorkflowService) CompleteEnterpriseVerification(ctx context.Context, certificationID string) error { cert, err := s.certRepo.GetByID(ctx, certificationID) if err != nil { return fmt.Errorf("认证申请不存在: %w", err) } // 检查当前状态是否可以完成企业认证 if cert.Status != enums.StatusInfoSubmitted { return fmt.Errorf("当前状态不允许完成企业认证") } // 使用状态机转换状态 if err := s.stateMachine.TransitionTo(ctx, certificationID, enums.StatusEnterpriseVerified, true, false, nil); err != nil { return fmt.Errorf("状态转换失败: %w", err) } s.logger.Info("企业认证完成", zap.String("certification_id", certificationID), zap.String("user_id", cert.UserID), ) return nil } // ApplyContract 申请签署合同 func (s *CertificationWorkflowService) ApplyContract(ctx context.Context, certificationID string) error { cert, err := s.certRepo.GetByID(ctx, certificationID) if err != nil { return fmt.Errorf("认证申请不存在: %w", err) } // 检查当前状态是否可以申请签署合同 if cert.Status != enums.StatusEnterpriseVerified { return fmt.Errorf("当前状态不允许申请签署合同") } // 使用状态机转换状态 if err := s.stateMachine.TransitionTo(ctx, certificationID, enums.StatusContractApplied, true, false, nil); err != nil { return fmt.Errorf("状态转换失败: %w", err) } s.logger.Info("签署合同申请成功", zap.String("certification_id", certificationID), zap.String("user_id", cert.UserID), ) return nil } // CompleteContractSign 完成合同签署 func (s *CertificationWorkflowService) CompleteContractSign(ctx context.Context, certificationID, contractURL string) error { cert, err := s.certRepo.GetByID(ctx, certificationID) if err != nil { return fmt.Errorf("认证申请不存在: %w", err) } // 检查当前状态是否可以签署 if cert.Status != enums.StatusContractApplied { return fmt.Errorf("当前状态不允许签署") } // 准备签署元数据 metadata := map[string]interface{}{ "contract_url": contractURL, } // 使用状态机转换状态 if err := s.stateMachine.TransitionTo(ctx, certificationID, enums.StatusContractSigned, true, false, metadata); err != nil { return fmt.Errorf("状态转换失败: %w", err) } s.logger.Info("合同签署完成", zap.String("certification_id", certificationID), zap.String("user_id", cert.UserID), ) return nil } // CompleteCertification 完成认证 func (s *CertificationWorkflowService) CompleteCertification(ctx context.Context, certificationID string) error { cert, err := s.certRepo.GetByID(ctx, certificationID) if err != nil { return fmt.Errorf("认证申请不存在: %w", err) } // 检查当前状态是否可以完成 if cert.Status != enums.StatusContractSigned { return fmt.Errorf("当前状态不允许完成认证") } // 使用状态机转换状态 if err := s.stateMachine.TransitionTo(ctx, certificationID, enums.StatusCompleted, false, false, nil); err != nil { return fmt.Errorf("状态转换失败: %w", err) } s.logger.Info("认证完成", zap.String("certification_id", certificationID), zap.String("user_id", cert.UserID), ) return nil }