Files
jx-callback/business/jxstore/cms/user.go
gazebo 434827abe6 - check status in CancelPromotion.
- return more accurate error in user related funcs
2018-11-06 08:34:23 +08:00

192 lines
6.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package cms
import (
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
type StoreUserInfo struct {
legacymodel.WeiXins
ParentMobile string `json:"parentMobile"`
Members []*legacymodel.WeiXins `orm:"-" json:"members"`
MembersStr string `json:"-"`
}
func GetStoreUsers(ctx *jxcontext.Context, storeID int) (storeUserInfos []*StoreUserInfo, err error) {
sql := `
SELECT t1.id, t1.jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid, t3.tel parent_mobile,
CONCAT("[", GROUP_CONCAT(CONCAT('{"id":', t2.id, ',"parentID":', t2.parentid, ',"openID":"', IF(t2.openid IS NULL, "", t2.openid), '","tel":"', t2.tel, '","nickname":"', IF(t2.nickname IS NULL, "", t2.nickname), '"}')), "]") members_str
FROM weixins t1
LEFT JOIN weixins t2 ON t2.parentid = t1.id
LEFT JOIN weixins t3 ON t1.parentid = t3.id
WHERE t1.parentid = -1 AND t1.jxstoreid = ?
GROUP BY t1.id, t1.jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid;
`
if err = dao.GetRows(nil, &storeUserInfos, sql, storeID); err == nil {
for _, storeUserInfo := range storeUserInfos {
if storeUserInfo.MembersStr != "" {
err = utils.UnmarshalUseNumber([]byte(storeUserInfo.MembersStr), &storeUserInfo.Members)
}
}
}
return storeUserInfos, err
}
func GetUserInfo(ctx *jxcontext.Context, mobile string) (storeUserInfo *StoreUserInfo, err error) {
sql := `
SELECT t1.id, IF(t3.id IS NULL, t1.jxstoreid, t3.jxstoreid) jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid, t3.tel parent_mobile,
CONCAT("[", GROUP_CONCAT(CONCAT('{"id":', t2.id, ',"openID":"', IF(t2.openid IS NULL, "", t2.openid), '","tel":"', t2.tel, '","nickname":"', IF(t2.nickname IS NULL, "", t2.nickname), '"}')), "]") members_str
FROM weixins t1
LEFT JOIN weixins t2 ON t2.parentid = t1.id
LEFT JOIN weixins t3 ON t1.parentid = t3.id
WHERE t1.tel = ?
GROUP BY t1.id, t1.jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid;
`
storeUserInfo = new(StoreUserInfo)
if err = dao.GetRow(nil, storeUserInfo, sql, mobile); err == nil {
if storeUserInfo.MembersStr != "" {
err = utils.UnmarshalUseNumber([]byte(storeUserInfo.MembersStr), &storeUserInfo.Members)
}
}
return storeUserInfo, err
}
func GetSelfInfo(ctx *jxcontext.Context, openID string) (storeUserInfo *StoreUserInfo, err error) {
sql := `
SELECT t1.id, IF(t3.id IS NULL, t1.jxstoreid, t3.jxstoreid) jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid, t3.tel parent_mobile,
CONCAT("[", GROUP_CONCAT(CONCAT('{"id":', t2.id, ',"openID":"', IF(t2.openid IS NULL, "", t2.openid), '","tel":"', t2.tel, '","nickname":"', IF(t2.nickname IS NULL, "", t2.nickname), '"}')), "]") members_str
FROM weixins t1
LEFT JOIN weixins t2 ON t2.parentid = t1.id
LEFT JOIN weixins t3 ON t1.parentid = t3.id
WHERE t1.openid = ?
GROUP BY t1.id, t1.jxstoreid, t1.openid, t1.tel, t1.nickname, t1.parentid;
`
storeUserInfo = new(StoreUserInfo)
if err = dao.GetRow(nil, storeUserInfo, sql, openID); err == nil || err == orm.ErrNoRows { // todo
err = nil
if storeUserInfo.MembersStr != "" {
err = utils.UnmarshalUseNumber([]byte(storeUserInfo.MembersStr), &storeUserInfo.Members)
}
}
return storeUserInfo, err
}
func UnbindMobile(ctx *jxcontext.Context, mobile string) (num int64, err error) {
return dao.UpdateEntityByKV(nil, &legacymodel.WeiXins{}, map[string]interface{}{
"JxStoreID": nil,
"ParentID": -1,
}, map[string]interface{}{
"Tel": mobile,
})
}
func BindMobile2Store(ctx *jxcontext.Context, mobile string, storeID int) (num int64, err error) {
db := dao.GetDB()
user, err2 := verifyMobileIsBlank(db, mobile)
if err = err2; err == nil || err == orm.ErrNoRows {
user.JxStoreID = storeID
if err == nil {
num, err = dao.UpdateEntity(db, user, "JxStoreID")
} else {
user.ParentID = -1
if err = createUserAndSetOpenIDNull(db, user); err == nil {
num = 1
}
}
}
return num, err
}
func AddMobile2Mobile(ctx *jxcontext.Context, parentMobile, mobile string) (num int64, err error) {
db := dao.GetDB()
parentUser := &legacymodel.WeiXins{}
parentUser.Tel = parentMobile
if err = dao.GetEntity(db, parentUser, "Tel"); err == nil {
if parentUser.ParentID == -1 {
globals.SugarLogger.Debug(parentUser)
if err = verifyMobileHasNoMembers(db, mobile); err == nil {
user, err2 := verifyMobileIsBlank(db, mobile)
if err = err2; err == nil || err == orm.ErrNoRows {
user.ParentID = parentUser.ID
if err == nil {
num, err = dao.UpdateEntity(db, user, "ParentID")
} else {
if err = createUserAndSetOpenIDNull(db, user); err == nil {
num = 1
}
}
}
}
} else {
err = fmt.Errorf("%s本身是成员", parentMobile)
}
}
return num, err
}
func ChangeMobile(ctx *jxcontext.Context, curMobile, expectedMobile string) (num int64, err error) {
return dao.UpdateEntityByKV(nil, &legacymodel.WeiXins{}, map[string]interface{}{
"Tel": expectedMobile,
}, map[string]interface{}{
"Tel": curMobile,
})
}
func verifyMobileIsBlank(db *dao.DaoDB, mobile string) (user *legacymodel.WeiXins, err error) {
user = &legacymodel.WeiXins{
Tel: mobile,
}
if err = dao.GetEntity(db, user, "Tel"); err == nil {
if user.ParentID != -1 && user.ParentID != 0 {
userParent := &legacymodel.WeiXins{
ID: user.ParentID,
}
if err = dao.GetEntity(db, userParent, "Tel"); err != nil && err != orm.ErrNoRows {
return nil, err
}
err = fmt.Errorf("%s已经是组长%s门店%d小组成员", mobile, userParent.Tel, userParent.JxStoreID)
} else if user.JxStoreID != 0 {
err = fmt.Errorf("%s本身已经是门店%d的组长", mobile, user.JxStoreID)
}
}
return user, err
}
func verifyMobileHasNoMembers(db *dao.DaoDB, mobile string) (err error) {
countInfo := &struct{ Ct int }{}
if err = dao.GetRow(db, countInfo, `
SELECT COUNT(*) ct
FROM weixins t1
JOIN weixins t2 ON t1.parentid = t2.id AND t2.tel = ?
`, mobile); err == nil {
if countInfo.Ct > 0 {
user := &legacymodel.WeiXins{
Tel: mobile,
}
dao.GetEntity(db, user, "Tel")
err = fmt.Errorf("%s本身已经是门店%d组长", mobile, user.JxStoreID)
}
}
return err
}
func createUserAndSetOpenIDNull(db *dao.DaoDB, user *legacymodel.WeiXins) (err error) {
dao.Begin(db)
if err = dao.CreateEntity(db, user); err != nil {
dao.Rollback(db)
return err
}
if _, err = dao.ExecuteSQL(db, "UPDATE weixins SET openid = NULL WHERE tel = ?", user.Tel); err != nil {
dao.Rollback(db)
return err
}
dao.Commit(db)
return err
}