181 lines
5.9 KiB
Go
181 lines
5.9 KiB
Go
package cms
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.rosy.net.cn/baseapi/utils"
|
|
"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(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(mobile string) (storeUserInfo *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, ',"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(openID string) (storeUserInfo *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, ',"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(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(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(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(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 {
|
|
err = fmt.Errorf("%s已经是小组成员", mobile)
|
|
} 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 {
|
|
err = fmt.Errorf("%s本身已经是组长", mobile)
|
|
}
|
|
}
|
|
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
|
|
}
|