f
This commit is contained in:
@@ -32,6 +32,11 @@ type CertificationApplicationService interface {
|
||||
// 获取认证列表(管理员)
|
||||
ListCertifications(ctx context.Context, query *queries.ListCertificationsQuery) (*responses.CertificationListResponse, error)
|
||||
|
||||
// ================ 管理员后台操作用例 ================
|
||||
|
||||
// AdminCompleteCertificationWithoutContract 管理员代用户完成认证(暂不关联合同)
|
||||
AdminCompleteCertificationWithoutContract(ctx context.Context, cmd *commands.AdminCompleteCertificationCommand) (*responses.CertificationResponse, error)
|
||||
|
||||
// ================ e签宝回调处理 ================
|
||||
|
||||
// 处理e签宝回调
|
||||
|
||||
@@ -581,6 +581,110 @@ func (s *CertificationApplicationServiceImpl) HandleEsignCallback(
|
||||
}
|
||||
}
|
||||
|
||||
// ================ 管理员后台操作用例 ================
|
||||
|
||||
// AdminCompleteCertificationWithoutContract 管理员代用户完成认证(暂不关联合同)
|
||||
func (s *CertificationApplicationServiceImpl) AdminCompleteCertificationWithoutContract(
|
||||
ctx context.Context,
|
||||
cmd *commands.AdminCompleteCertificationCommand,
|
||||
) (*responses.CertificationResponse, error) {
|
||||
s.logger.Info("管理员代用户完成认证(不关联合同)",
|
||||
zap.String("admin_id", cmd.AdminID),
|
||||
zap.String("user_id", cmd.UserID),
|
||||
)
|
||||
|
||||
// 1. 基础参数及企业信息校验
|
||||
enterpriseInfo := &certification_value_objects.EnterpriseInfo{
|
||||
CompanyName: cmd.CompanyName,
|
||||
UnifiedSocialCode: cmd.UnifiedSocialCode,
|
||||
LegalPersonName: cmd.LegalPersonName,
|
||||
LegalPersonID: cmd.LegalPersonID,
|
||||
LegalPersonPhone: cmd.LegalPersonPhone,
|
||||
EnterpriseAddress: cmd.EnterpriseAddress,
|
||||
}
|
||||
if err := enterpriseInfo.Validate(); err != nil {
|
||||
return nil, fmt.Errorf("企业信息验证失败: %s", err.Error())
|
||||
}
|
||||
|
||||
// 检查统一社会信用代码唯一性(排除当前用户)
|
||||
exists, err := s.userAggregateService.CheckUnifiedSocialCodeExists(ctx, cmd.UnifiedSocialCode, cmd.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("检查企业信息失败: %s", err.Error())
|
||||
}
|
||||
if exists {
|
||||
return nil, fmt.Errorf("统一社会信用代码已被其他用户使用")
|
||||
}
|
||||
|
||||
var cert *entities.Certification
|
||||
|
||||
// 2. 事务内:创建/加载认证、写入企业信息、直接完成认证、创建钱包和API用户
|
||||
err = s.txManager.ExecuteInTx(ctx, func(txCtx context.Context) error {
|
||||
// 2.1 检查并创建认证记录
|
||||
existsCert, err := s.aggregateService.ExistsByUserID(txCtx, cmd.UserID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("检查用户认证是否存在失败: %s", err.Error())
|
||||
}
|
||||
if !existsCert {
|
||||
cert, err = s.aggregateService.CreateCertification(txCtx, cmd.UserID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建认证信息失败: %s", err.Error())
|
||||
}
|
||||
} else {
|
||||
cert, err = s.aggregateService.LoadCertificationByUserID(txCtx, cmd.UserID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("加载认证信息失败: %s", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
// 2.2 写入/覆盖用户域企业信息
|
||||
if err := s.userAggregateService.CreateOrUpdateEnterpriseInfo(
|
||||
txCtx,
|
||||
cmd.UserID,
|
||||
cmd.CompanyName,
|
||||
cmd.UnifiedSocialCode,
|
||||
cmd.LegalPersonName,
|
||||
cmd.LegalPersonID,
|
||||
cmd.LegalPersonPhone,
|
||||
cmd.EnterpriseAddress,
|
||||
); err != nil {
|
||||
return fmt.Errorf("保存企业信息失败: %s", err.Error())
|
||||
}
|
||||
|
||||
// 2.3 直接将认证状态设置为完成(管理员操作,暂不校验合同信息)
|
||||
if err := cert.TransitionTo(
|
||||
enums.StatusCompleted,
|
||||
enums.ActorTypeAdmin,
|
||||
cmd.AdminID,
|
||||
fmt.Sprintf("管理员代用户完成认证:%s", cmd.Reason),
|
||||
); err != nil {
|
||||
return fmt.Errorf("更新认证状态失败: %s", err.Error())
|
||||
}
|
||||
|
||||
// 2.4 基础激活:创建钱包、API用户并在用户域标记完成认证
|
||||
if err := s.completeUserActivationWithoutContract(txCtx, cert); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 2.5 保存认证信息
|
||||
if err := s.aggregateService.SaveCertification(txCtx, cert); err != nil {
|
||||
return fmt.Errorf("保存认证信息失败: %s", err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
response := s.convertToResponse(cert)
|
||||
s.logger.Info("管理员代用户完成认证成功(不关联合同)",
|
||||
zap.String("admin_id", cmd.AdminID),
|
||||
zap.String("user_id", cmd.UserID),
|
||||
zap.String("certification_id", cert.ID),
|
||||
)
|
||||
return response, nil
|
||||
}
|
||||
|
||||
// ================ 辅助方法 ================
|
||||
|
||||
// convertToResponse 转换实体为响应DTO
|
||||
@@ -932,21 +1036,8 @@ func (s *CertificationApplicationServiceImpl) handleContractAfterSignComplete(ct
|
||||
s.logger.Info("合同信息已保存到聚合根", zap.String("file_name", fileName), zap.String("qiniu_url", qiniuURL))
|
||||
}
|
||||
|
||||
_, err = s.walletAggregateService.CreateWallet(ctx, cert.UserID)
|
||||
if err != nil {
|
||||
s.logger.Error("创建钱包失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
}
|
||||
|
||||
// 6. 创建API用户
|
||||
err = s.apiUserAggregateService.CreateApiUser(ctx, cert.UserID)
|
||||
if err != nil {
|
||||
s.logger.Error("创建API用户失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
}
|
||||
err = s.userAggregateService.CompleteCertification(ctx, cert.UserID)
|
||||
if err != nil {
|
||||
s.logger.Error("用户域完成认证失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
}
|
||||
return nil
|
||||
// 合同签署完成后的基础激活流程
|
||||
return s.completeUserActivationWithoutContract(ctx, cert)
|
||||
}
|
||||
|
||||
// downloadFileContent 通过URL下载文件内容
|
||||
@@ -995,6 +1086,27 @@ func (s *CertificationApplicationServiceImpl) AddStatusMetadata(ctx context.Cont
|
||||
return metadata, nil
|
||||
}
|
||||
|
||||
// completeUserActivationWithoutContract 创建钱包、API用户并在用户域标记完成认证(不依赖合同信息)
|
||||
func (s *CertificationApplicationServiceImpl) completeUserActivationWithoutContract(ctx context.Context, cert *entities.Certification) error {
|
||||
// 创建钱包
|
||||
if _, err := s.walletAggregateService.CreateWallet(ctx, cert.UserID); err != nil {
|
||||
s.logger.Error("创建钱包失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
}
|
||||
|
||||
// 创建API用户
|
||||
if err := s.apiUserAggregateService.CreateApiUser(ctx, cert.UserID); err != nil {
|
||||
s.logger.Error("创建API用户失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
}
|
||||
|
||||
// 标记用户域完成认证
|
||||
if err := s.userAggregateService.CompleteCertification(ctx, cert.UserID); err != nil {
|
||||
s.logger.Error("用户域完成认证失败", zap.String("user_id", cert.UserID), zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RecognizeBusinessLicense OCR识别营业执照
|
||||
func (s *CertificationApplicationServiceImpl) RecognizeBusinessLicense(
|
||||
ctx context.Context,
|
||||
|
||||
@@ -71,7 +71,19 @@ type EsignOrganization struct {
|
||||
// 可以根据需要添加更多企业信息字段
|
||||
}
|
||||
|
||||
|
||||
// AdminCompleteCertificationCommand 管理员代用户完成认证命令(可不关联合同)
|
||||
type AdminCompleteCertificationCommand struct {
|
||||
AdminID string `json:"-" validate:"required"`
|
||||
UserID string `json:"user_id" validate:"required"`
|
||||
CompanyName string `json:"company_name" validate:"required,min=2,max=100"`
|
||||
UnifiedSocialCode string `json:"unified_social_code" validate:"required"`
|
||||
LegalPersonName string `json:"legal_person_name" validate:"required,min=2,max=20"`
|
||||
LegalPersonID string `json:"legal_person_id" validate:"required"`
|
||||
LegalPersonPhone string `json:"legal_person_phone" validate:"required"`
|
||||
EnterpriseAddress string `json:"enterprise_address" validate:"required"`
|
||||
// 备注信息,用于记录后台操作原因
|
||||
Reason string `json:"reason" validate:"required"`
|
||||
}
|
||||
// ForceTransitionStatusCommand 强制状态转换命令(管理员)
|
||||
type ForceTransitionStatusCommand struct {
|
||||
CertificationID string `json:"certification_id" validate:"required"`
|
||||
|
||||
Reference in New Issue
Block a user