268 lines
7.8 KiB
Go
268 lines
7.8 KiB
Go
package member
|
||
|
||
import (
|
||
"context"
|
||
|
||
"go-common/app/interface/main/account/model"
|
||
accmdl "go-common/app/service/main/account/model"
|
||
arcmdl "go-common/app/service/main/archive/model/archive"
|
||
memmdl "go-common/app/service/main/member/model"
|
||
"go-common/library/ecode"
|
||
"go-common/library/log"
|
||
"go-common/library/net/metadata"
|
||
)
|
||
|
||
const (
|
||
_maxMonthlyOfficialSubmitTimes = 3
|
||
)
|
||
|
||
// IdentifyInfo get user identify info.
|
||
func (s *Service) IdentifyInfo(c context.Context, mid int64, ip string) (res *model.Identification, err error) {
|
||
var rid *model.IdentifyInfo
|
||
if rid, err = s.accDao.IdentifyInfo(c, mid, ip); err != nil {
|
||
log.Error("s.memRPC.IdentifyInfo(%d) err(%+v)", mid, err)
|
||
return
|
||
}
|
||
res = &model.Identification{}
|
||
switch rid.Identify {
|
||
case model.APIIdentifyOk:
|
||
res.Identification = model.IdentifyOK
|
||
case model.APIIdentifyNoInfo:
|
||
res.Identification = model.IdentifyNotOK
|
||
default:
|
||
log.Error("unknow mid(%d) identify(%d) status", mid, rid.Identify)
|
||
}
|
||
return
|
||
}
|
||
|
||
// SubmitOfficial is.
|
||
func (s *Service) SubmitOfficial(c context.Context, mid int64, apply *model.OfficialApply) error {
|
||
//ip := metadata.String(c, metadata.RemoteIP)
|
||
if apply.Role == memmdl.OfficialRoleUp || apply.Role == memmdl.OfficialRoleIdentify {
|
||
cons, err := s.OfficialConditions(c, mid)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if !cons.AllPass() {
|
||
log.Warn("Unexpected official apply submited: mid: %d conditons: %+v apply: %+v", mid, cons, apply)
|
||
return ecode.RequestErr
|
||
}
|
||
}
|
||
|
||
// 是否超出本月提交次数限制
|
||
times, err := s.accDao.GetMonthlyOfficialSubmittedTimes(c, mid)
|
||
if err != nil {
|
||
log.Error("Faield to get monthly official submitted times with mid %d: %+v", mid, err)
|
||
}
|
||
if times >= _maxMonthlyOfficialSubmitTimes {
|
||
log.Warn("User %d is exceed max monthly official submitted times")
|
||
return ecode.LimitExceed
|
||
}
|
||
|
||
ood, err := s.memRPC.OfficialDoc(c, &memmdl.ArgMid{Mid: mid})
|
||
// 是否已经存在审核中的申请
|
||
if err == nil && ood != nil && ood.State == memmdl.OfficialStateWait {
|
||
return nil
|
||
}
|
||
|
||
if apply.Telephone != "" {
|
||
if apply.TelVerifyCode == 0 {
|
||
log.Error("Invalid tel verify code: mid: %d code:%d", mid, apply.TelVerifyCode)
|
||
return ecode.RequestErr
|
||
}
|
||
vcode, verr := s.accDao.GetVerifyCode(c, mid, apply.Telephone)
|
||
if verr != nil {
|
||
log.Error("Failed to get verify code: %d, %s: %+v", mid, apply.Telephone, verr)
|
||
return ecode.CaptchaErr
|
||
}
|
||
if apply.TelVerifyCode != vcode {
|
||
log.Error("Failed to verify telephone verification code: %s, %d, %d", apply.Telephone, apply.TelVerifyCode, vcode)
|
||
return ecode.CaptchaErr
|
||
}
|
||
}
|
||
|
||
arg := &memmdl.ArgOfficialDoc{
|
||
Mid: mid,
|
||
Name: apply.Name,
|
||
Role: apply.Role,
|
||
Title: apply.Title,
|
||
Desc: apply.Desc,
|
||
|
||
Operator: apply.Operator,
|
||
Telephone: apply.Telephone,
|
||
Email: apply.Email,
|
||
Address: apply.Address,
|
||
Company: apply.Company,
|
||
CreditCode: apply.CreditCode,
|
||
Organization: apply.Organization,
|
||
OrganizationType: apply.OrganizationType,
|
||
BusinessLicense: apply.BusinessLicense,
|
||
BusinessScale: apply.BusinessScale,
|
||
BusinessLevel: apply.BusinessLevel,
|
||
BusinessAuth: apply.BusinessAuth,
|
||
Supplement: apply.Supplement,
|
||
Professional: apply.Professional,
|
||
Identification: apply.Identification,
|
||
OfficialSite: apply.OfficialSite,
|
||
RegisteredCapital: apply.RegisteredCapital,
|
||
|
||
SubmitSource: "user", // 来自 account-interface 的全部为 user
|
||
}
|
||
|
||
pros, err := s.accRPC.ProfileWithStat3(c, &accmdl.ArgMid{Mid: mid})
|
||
if err != nil {
|
||
log.Error("Failed to call ProfileWithStat3(%d): %+v", mid, err)
|
||
return err
|
||
}
|
||
arg.Realname = int8(pros.Identification)
|
||
|
||
if err := s.accDao.DelVerifyCode(c, mid, apply.Telephone); err != nil {
|
||
log.Error("Failed to delete verify code: mid: %d: mobile: %s: %+v", mid, apply.Telephone, err)
|
||
}
|
||
if _, err = s.accDao.IncreaseMonthlyOfficialSubmittedTimes(c, mid); err != nil {
|
||
log.Error("Failed to increase monthly official submitted times with mid: %d: %+v", mid, err)
|
||
}
|
||
return s.memRPC.SetOfficialDoc(c, arg)
|
||
}
|
||
|
||
// OfficialConditions is.
|
||
func (s *Service) OfficialConditions(c context.Context, mid int64) (*model.OfficialConditions, error) {
|
||
con := new(model.OfficialConditions)
|
||
pros, err := s.accRPC.ProfileWithStat3(c, &accmdl.ArgMid{Mid: mid})
|
||
if err != nil {
|
||
log.Error("Failed to call ProfileWithStat3(%d): %+v", mid, err)
|
||
return nil, err
|
||
}
|
||
if pros.Rank >= 10000 {
|
||
con.IsFormal = true
|
||
}
|
||
// 1 正常号码,2 虚拟号码
|
||
if pros.TelStatus >= 1 {
|
||
con.BindTel = true
|
||
}
|
||
if pros.Identification == 1 {
|
||
con.Realname = true
|
||
}
|
||
if pros.Follower >= 100000 {
|
||
con.FollowerCount = true
|
||
}
|
||
|
||
arcCount, err := s.arcRPC.UpCount2(c, &arcmdl.ArgUpCount2{Mid: mid})
|
||
if err != nil {
|
||
log.Error("Failed to call s.arcRPC.UpCount2(%d): %+v", mid, err)
|
||
// return nil, err
|
||
}
|
||
if err == nil && arcCount >= 1 {
|
||
con.ArchiveCount = true
|
||
}
|
||
|
||
// 累计播放数
|
||
// upStat, err := s.upRPC.UpStatBase(c, &upmdl.ArgMidWithDate{Mid: mid})
|
||
// if err != nil {
|
||
// log.Error("Failed to call s.upRPC.UpStatBase(%d): %+v", mid, err)
|
||
// }
|
||
// if err == nil && upStat != nil && upStat.View >= 1000000 {
|
||
// con.ViewCount = true
|
||
// }
|
||
|
||
return con, nil
|
||
}
|
||
|
||
// UploadImage article upload cover.
|
||
func (s *Service) UploadImage(c context.Context, fileType string, body []byte) (url string, err error) {
|
||
if len(body) == 0 {
|
||
err = ecode.FileNotExists
|
||
return
|
||
}
|
||
if len(body) > s.c.BFS.MaxFileSize {
|
||
err = ecode.FileTooLarge
|
||
return
|
||
}
|
||
url, err = s.accDao.UploadImage(c, fileType, body, s.c.BFS)
|
||
if err != nil {
|
||
log.Error("account-interface: s.bfs.Upload error(%v)", err)
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
// MobileVerify is.
|
||
func (s *Service) MobileVerify(c context.Context, mid int64, mobile string, country int64) error {
|
||
ip := metadata.String(c, metadata.RemoteIP)
|
||
vcode, err := s.accDao.GenVerifyCode(c, mid, mobile)
|
||
if err != nil {
|
||
log.Error("Failed to generate verify code: %+v", err)
|
||
return err
|
||
}
|
||
return s.accDao.SendMobileVerify(c, vcode, country, mobile, ip)
|
||
}
|
||
|
||
// OfficialDoc is.
|
||
func (s *Service) OfficialDoc(c context.Context, mid int64) (*memmdl.OfficialDoc, error) {
|
||
ip := metadata.String(c, metadata.RemoteIP)
|
||
od, err := s.memRPC.OfficialDoc(c, &memmdl.ArgMid{Mid: mid, RealIP: ip})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return od, nil
|
||
}
|
||
|
||
// MonthlyOfficialSubmittedTimes is
|
||
func (s *Service) MonthlyOfficialSubmittedTimes(c context.Context, mid int64) *model.OfficialSubmittedTimes {
|
||
result := &model.OfficialSubmittedTimes{
|
||
Submitted: 0,
|
||
Remain: _maxMonthlyOfficialSubmitTimes,
|
||
}
|
||
times, err := s.accDao.GetMonthlyOfficialSubmittedTimes(c, mid)
|
||
if err != nil {
|
||
log.Warn("Failed to get monthly official submitted times with mid: %d: %+v", mid, err)
|
||
return result
|
||
}
|
||
result.Submitted = times
|
||
if result.Submitted > _maxMonthlyOfficialSubmitTimes {
|
||
result.Submitted = _maxMonthlyOfficialSubmitTimes
|
||
}
|
||
result.Remain = _maxMonthlyOfficialSubmitTimes - result.Submitted
|
||
return result
|
||
}
|
||
|
||
// OfficialAutoFillDoc is
|
||
func (s *Service) OfficialAutoFillDoc(ctx context.Context, mid int64) (*memmdl.OfficialDoc, error) {
|
||
res := &memmdl.OfficialDoc{
|
||
Mid: mid,
|
||
}
|
||
// default name
|
||
info, err := s.accRPC.Info3(ctx, &accmdl.ArgMid{Mid: mid})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
res.Name = info.Name
|
||
// default from cm api
|
||
func() {
|
||
cminfo, err := s.accDao.BusinessAccountInfo(ctx, mid)
|
||
if err != nil {
|
||
log.Error("Failed to get cm business account info with mid: %d: %+v", mid, err)
|
||
return
|
||
}
|
||
if cminfo.Nickname != "" {
|
||
res.Name = cminfo.Nickname
|
||
}
|
||
if cminfo.CertificationTitle != "" {
|
||
res.Title = cminfo.CertificationTitle
|
||
}
|
||
if cminfo.CreditCode != "" {
|
||
res.CreditCode = cminfo.CreditCode
|
||
}
|
||
if cminfo.CompanyName != "" {
|
||
res.Company = cminfo.CompanyName
|
||
}
|
||
if cminfo.Organization != "" {
|
||
res.Organization = cminfo.Organization
|
||
}
|
||
if cminfo.OrganizationType != "" {
|
||
res.OrganizationType = cminfo.OrganizationType
|
||
}
|
||
}()
|
||
return res, nil
|
||
}
|