192 lines
6.6 KiB
Go
192 lines
6.6 KiB
Go
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
|
||
}
|