// Package personal_customer 提供个人客户管理的业务逻辑服务 // 包含个人客户注册、登录、微信绑定、短信验证等功能 package personal_customer import ( "context" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/internal/service/verification" "github.com/break/junhong_cmp_fiber/internal/store/postgres" "github.com/break/junhong_cmp_fiber/pkg/auth" "github.com/break/junhong_cmp_fiber/pkg/errors" "go.uber.org/zap" "gorm.io/gorm" ) // Service 个人客户服务 type Service struct { store *postgres.PersonalCustomerStore phoneStore *postgres.PersonalCustomerPhoneStore verificationService *verification.Service jwtManager *auth.JWTManager logger *zap.Logger } // NewService 创建个人客户服务实例 func NewService( store *postgres.PersonalCustomerStore, phoneStore *postgres.PersonalCustomerPhoneStore, verificationService *verification.Service, jwtManager *auth.JWTManager, logger *zap.Logger, ) *Service { return &Service{ store: store, phoneStore: phoneStore, verificationService: verificationService, jwtManager: jwtManager, logger: logger, } } // SendVerificationCode 发送验证码 func (s *Service) SendVerificationCode(ctx context.Context, phone string) error { return s.verificationService.SendCode(ctx, phone) } // VerifyCode 验证验证码 func (s *Service) VerifyCode(ctx context.Context, phone string, code string) error { return s.verificationService.VerifyCode(ctx, phone, code) } // UpdateProfile 更新个人资料 func (s *Service) UpdateProfile(ctx context.Context, customerID uint, nickname, avatarURL string) error { customer, err := s.store.GetByID(ctx, customerID) if err != nil { s.logger.Error("查询个人客户失败", zap.Uint("customer_id", customerID), zap.Error(err), ) return errors.Wrap(errors.CodeInternalError, err, "查询个人客户失败") } // 更新资料 if nickname != "" { customer.Nickname = nickname } if avatarURL != "" { customer.AvatarURL = avatarURL } if err := s.store.Update(ctx, customer); err != nil { s.logger.Error("更新个人资料失败", zap.Uint("customer_id", customerID), zap.Error(err), ) return errors.Wrap(errors.CodeInternalError, err, "更新个人资料失败") } s.logger.Info("更新个人资料成功", zap.Uint("customer_id", customerID), ) return nil } // GetProfile 获取个人资料 func (s *Service) GetProfile(ctx context.Context, customerID uint) (*model.PersonalCustomer, error) { customer, err := s.store.GetByID(ctx, customerID) if err != nil { s.logger.Error("查询个人客户失败", zap.Uint("customer_id", customerID), zap.Error(err), ) return nil, errors.Wrap(errors.CodeInternalError, err, "查询个人客户失败") } return customer, nil } // GetProfileWithPhone 获取个人资料(包含主手机号) func (s *Service) GetProfileWithPhone(ctx context.Context, customerID uint) (*model.PersonalCustomer, string, error) { // 获取客户信息 customer, err := s.store.GetByID(ctx, customerID) if err != nil { s.logger.Error("查询个人客户失败", zap.Uint("customer_id", customerID), zap.Error(err), ) return nil, "", errors.Wrap(errors.CodeInternalError, err, "查询个人客户失败") } // 获取主手机号 phone := "" primaryPhone, err := s.phoneStore.GetPrimaryPhone(ctx, customerID) if err != nil { if err != gorm.ErrRecordNotFound { s.logger.Error("查询主手机号失败", zap.Uint("customer_id", customerID), zap.Error(err), ) // 不返回错误,继续返回客户信息(手机号为空) } } else { phone = primaryPhone.Phone } return customer, phone, nil }