181 lines
4.9 KiB
Go
181 lines
4.9 KiB
Go
package value_objects
|
||
|
||
import (
|
||
"fmt"
|
||
"regexp"
|
||
"strings"
|
||
)
|
||
|
||
// EnterpriseInfo 企业信息值对象
|
||
// 负责封装和验证企业认证相关的信息
|
||
type EnterpriseInfo struct {
|
||
CompanyName string `json:"company_name" validate:"required,min=2,max=100"`
|
||
UnifiedSocialCode string `json:"unified_social_code" validate:"required,len=18"`
|
||
LegalPersonName string `json:"legal_person_name" validate:"required,min=2,max=50"`
|
||
LegalPersonID string `json:"legal_person_id" validate:"required,len=18"`
|
||
LegalPersonPhone string `json:"legal_person_phone" validate:"required,mobile"`
|
||
}
|
||
|
||
// NewEnterpriseInfo 创建企业信息值对象
|
||
func NewEnterpriseInfo(
|
||
companyName, unifiedSocialCode, legalPersonName, legalPersonID, legalPersonPhone string,
|
||
) (*EnterpriseInfo, error) {
|
||
// 清理输入数据
|
||
info := &EnterpriseInfo{
|
||
CompanyName: strings.TrimSpace(companyName),
|
||
UnifiedSocialCode: strings.TrimSpace(unifiedSocialCode),
|
||
LegalPersonName: strings.TrimSpace(legalPersonName),
|
||
LegalPersonID: strings.TrimSpace(legalPersonID),
|
||
LegalPersonPhone: strings.TrimSpace(legalPersonPhone),
|
||
}
|
||
|
||
// 验证数据
|
||
if err := info.Validate(); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return info, nil
|
||
}
|
||
|
||
// Validate 验证企业信息
|
||
func (e *EnterpriseInfo) Validate() error {
|
||
// 验证公司名称
|
||
if e.CompanyName == "" {
|
||
return fmt.Errorf("公司名称不能为空")
|
||
}
|
||
if len(e.CompanyName) < 2 || len(e.CompanyName) > 100 {
|
||
return fmt.Errorf("公司名称长度应在2-100个字符之间")
|
||
}
|
||
|
||
// 验证统一社会信用代码
|
||
if err := e.validateUnifiedSocialCode(); err != nil {
|
||
return err
|
||
}
|
||
|
||
// 验证法人姓名
|
||
if e.LegalPersonName == "" {
|
||
return fmt.Errorf("法人姓名不能为空")
|
||
}
|
||
if len(e.LegalPersonName) < 2 || len(e.LegalPersonName) > 50 {
|
||
return fmt.Errorf("法人姓名长度应在2-50个字符之间")
|
||
}
|
||
|
||
// 验证法人身份证
|
||
if err := e.validateLegalPersonID(); err != nil {
|
||
return err
|
||
}
|
||
|
||
// 验证法人手机号
|
||
if err := e.validateLegalPersonPhone(); err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// validateUnifiedSocialCode 验证统一社会信用代码
|
||
func (e *EnterpriseInfo) validateUnifiedSocialCode() error {
|
||
if e.UnifiedSocialCode == "" {
|
||
return fmt.Errorf("统一社会信用代码不能为空")
|
||
}
|
||
|
||
if len(e.UnifiedSocialCode) != 18 {
|
||
return fmt.Errorf("统一社会信用代码应为18位")
|
||
}
|
||
|
||
// 检查格式:应为数字和大写字母组合
|
||
matched, _ := regexp.MatchString(`^[0-9A-Z]{18}$`, e.UnifiedSocialCode)
|
||
if !matched {
|
||
return fmt.Errorf("统一社会信用代码格式不正确")
|
||
}
|
||
|
||
// TODO: 可以添加更严格的校验算法
|
||
|
||
return nil
|
||
}
|
||
|
||
// validateLegalPersonID 验证法人身份证号
|
||
func (e *EnterpriseInfo) validateLegalPersonID() error {
|
||
if e.LegalPersonID == "" {
|
||
return fmt.Errorf("法人身份证号不能为空")
|
||
}
|
||
|
||
if len(e.LegalPersonID) != 18 {
|
||
return fmt.Errorf("法人身份证号应为18位")
|
||
}
|
||
|
||
// 检查格式:前17位为数字,最后一位为数字或X
|
||
matched, _ := regexp.MatchString(`^\d{17}[\dX]$`, e.LegalPersonID)
|
||
if !matched {
|
||
return fmt.Errorf("法人身份证号格式不正确")
|
||
}
|
||
|
||
// TODO: 可以添加身份证校验算法
|
||
|
||
return nil
|
||
}
|
||
|
||
// validateLegalPersonPhone 验证法人手机号
|
||
func (e *EnterpriseInfo) validateLegalPersonPhone() error {
|
||
if e.LegalPersonPhone == "" {
|
||
return fmt.Errorf("法人手机号不能为空")
|
||
}
|
||
|
||
// 检查中国大陆手机号格式
|
||
matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, e.LegalPersonPhone)
|
||
if !matched {
|
||
return fmt.Errorf("法人手机号格式不正确")
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// ================ 业务方法 ================
|
||
|
||
// GetDisplayName 获取显示名称
|
||
func (e *EnterpriseInfo) GetDisplayName() string {
|
||
return fmt.Sprintf("%s(%s)", e.CompanyName, e.LegalPersonName)
|
||
}
|
||
|
||
// IsSame 判断是否为同一企业信息
|
||
func (e *EnterpriseInfo) IsSame(other *EnterpriseInfo) bool {
|
||
if other == nil {
|
||
return false
|
||
}
|
||
|
||
return e.UnifiedSocialCode == other.UnifiedSocialCode &&
|
||
e.LegalPersonID == other.LegalPersonID
|
||
}
|
||
|
||
// GetMaskedPhone 获取脱敏手机号
|
||
func (e *EnterpriseInfo) GetMaskedPhone() string {
|
||
if len(e.LegalPersonPhone) != 11 {
|
||
return e.LegalPersonPhone
|
||
}
|
||
return e.LegalPersonPhone[:3] + "****" + e.LegalPersonPhone[7:]
|
||
}
|
||
|
||
// GetMaskedIDNumber 获取脱敏身份证号
|
||
func (e *EnterpriseInfo) GetMaskedIDNumber() string {
|
||
if len(e.LegalPersonID) != 18 {
|
||
return e.LegalPersonID
|
||
}
|
||
return e.LegalPersonID[:6] + "******" + e.LegalPersonID[14:]
|
||
}
|
||
|
||
// ToMap 转换为Map格式
|
||
func (e *EnterpriseInfo) ToMap() map[string]string {
|
||
return map[string]string{
|
||
"company_name": e.CompanyName,
|
||
"unified_social_code": e.UnifiedSocialCode,
|
||
"legal_person_name": e.LegalPersonName,
|
||
"legal_person_id": e.LegalPersonID,
|
||
"legal_person_phone": e.LegalPersonPhone,
|
||
}
|
||
}
|
||
|
||
// String 字符串表示
|
||
func (e *EnterpriseInfo) String() string {
|
||
return fmt.Sprintf("企业信息[公司=%s, 法人=%s, 信用代码=%s]",
|
||
e.CompanyName, e.LegalPersonName, e.UnifiedSocialCode)
|
||
} |