go-common/app/interface/main/mcn/service/uniquecheck.go
2019-04-22 18:49:16 +08:00

101 lines
2.2 KiB
Go

package service
import (
"sync"
"go-common/app/interface/main/mcn/model/mcnmodel"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/time"
)
var (
lastLoadMcnUniqueTime time.Time
)
//UniqueCheck check unique
type UniqueCheck struct {
// all the values is mcn id
PhoneMap map[string]int64
IDCardMap map[string]int64
CompanyNameMap map[string]int64
CompanyLicenseIDMap map[string]int64
lock sync.Mutex
}
//NewUniqueCheck new checker
func NewUniqueCheck() *UniqueCheck {
return &UniqueCheck{
PhoneMap: make(map[string]int64),
IDCardMap: make(map[string]int64),
CompanyNameMap: make(map[string]int64),
CompanyLicenseIDMap: make(map[string]int64),
}
}
//CheckIsUniqe check is unique
func (u *UniqueCheck) CheckIsUniqe(req *mcnmodel.McnApplyReq) (err error) {
if req == nil {
return
}
u.lock.Lock()
defer u.lock.Unlock()
if v, ok := u.PhoneMap[req.ContactPhone]; ok {
if req.McnMid != v {
err = ecode.MCNUpBindUpDuplicatePhone
return
}
}
if v, ok := u.IDCardMap[req.ContactIdcard]; ok {
if req.McnMid != v {
err = ecode.MCNUpBindUpDuplicateIDCard
return
}
}
if v, ok := u.CompanyNameMap[req.CompanyName]; ok {
if req.McnMid != v {
err = ecode.MCNUpBindUpDuplicateCompanyName
return
}
}
if v, ok := u.CompanyLicenseIDMap[req.CompanyLicenseID]; ok {
if req.McnMid != v {
err = ecode.MCNUpBindUpDuplicateCompanyLicenseID
return
}
}
return
}
//AddItem add item from db
func (u *UniqueCheck) AddItem(sign *mcnmodel.McnSign) {
u.lock.Lock()
defer u.lock.Unlock()
u.PhoneMap[sign.ContactPhone] = sign.McnMid
u.IDCardMap[sign.ContactIdcard] = sign.McnMid
u.CompanyNameMap[sign.CompanyName] = sign.McnMid
u.CompanyLicenseIDMap[sign.CompanyLicenseID] = sign.McnMid
}
func (s *Service) loadMcnUniqueCache() {
var list []*mcnmodel.McnSign
var err = s.mcndao.GetMcnDB().
Select("mcn_mid, company_name, company_license_id, contact_idcard, contact_phone, mtime").
Where("mtime>?", lastLoadMcnUniqueTime).
Find(&list).Error
if err != nil {
log.Warn("cannot get unique, err=%s", err)
return
}
for _, v := range list {
s.uniqueChecker.AddItem(v)
if lastLoadMcnUniqueTime < v.Mtime {
lastLoadMcnUniqueTime = v.Mtime
}
}
}