163 lines
4.9 KiB
Go
163 lines
4.9 KiB
Go
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
|
|
}
|