diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go index bc2d834d8..c411824a4 100644 --- a/business/jxstore/cms/job.go +++ b/business/jxstore/cms/job.go @@ -80,7 +80,7 @@ func PublishJob(ctx *jxcontext.Context, job *model.Job) (err error) { } jobs, err := dao.GetJobsNoPage(db, []string{job.UserID}, nil, nil, utils.Str2Time(fromTime), utils.Str2Time(toTime), false) if len(jobs) > 0 { - members, err := dao.GetUserMember(db, job.UserID, 0, 0, true) + members, err := dao.GetUserMember(db, job.UserID, model.MemberTypeNormal) if err != nil { return err } diff --git a/business/jxstore/cms/user.go b/business/jxstore/cms/user.go deleted file mode 100644 index 070ee358f..000000000 --- a/business/jxstore/cms/user.go +++ /dev/null @@ -1,210 +0,0 @@ -package cms - -// var ( -// LoginTypeFieldMap = map[string]string{ -// mobile.LoginType: "tel", -// weixin.LoginType: "openid", -// weixin.LoginTypeMiniProgram: "openid_mini", -// } -// ) - -// func GetStoreUsers(ctx *jxcontext.Context, storeID int) (storeUserInfos []*dao.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, ',"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 1,2,3,4,5,6,7; -// ` -// // globals.SugarLogger.Debug(sql) -// 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 *dao.StoreUserInfo, err error) { -// storeUserInfo, err = dao.GetUserStoreInfo(dao.GetDB(), "tel", mobile) -// globals.SugarLogger.Debugf("GetUserInfo:%s, token:%s, mobile:%s, storeUserInfo:%s, err:%v", ctx.GetTrackInfo(), ctx.GetToken(), mobile, utils.Format4Output(storeUserInfo, true), err) -// return storeUserInfo, err -// } - -// func GetSelfInfo(ctx *jxcontext.Context) (storeUserInfo *dao.StoreUserInfo, err error) { -// loginInfo := ctx.GetLoginInfo() -// if loginInfo == nil { -// return nil, auth.ErrAPINeedRealLogin -// } -// fieldName := LoginTypeFieldMap[loginInfo.GetAuthType()] -// if fieldName == "" { -// return nil, auth.ErrIllegalLoginType -// } -// storeUserInfo, err = dao.GetUserStoreInfo(dao.GetDB(), fieldName, loginInfo.GetAuthID()) -// globals.SugarLogger.Debugf("GetSelfInfo:%s, token:%s, storeUserInfo:%s, err:%v", ctx.GetTrackInfo(), ctx.GetToken(), utils.Format4Output(storeUserInfo, true), err) -// return storeUserInfo, err -// } - -// func GetMyStoreList(ctx *jxcontext.Context) (storeList []*dao.StoreWithCityName, err error) { -// mobileNum, _ := ctx.GetMobileAndUserID() -// if mobileNum == "" { -// return nil, fmt.Errorf("不能得到用户手机号") -// } -// storeList, err = dao.GetStoreListByMobile(dao.GetDB(), mobileNum) -// return storeList, err -// } - -// func UnbindMobile(ctx *jxcontext.Context, mobile string) (num int64, err error) { -// db := dao.GetDB() -// num, err = dao.UpdateEntityByKV(db, &legacymodel.WeiXins{}, map[string]interface{}{ -// "JxStoreID": 0, -// "ParentID": -1, -// }, map[string]interface{}{ -// "Tel": mobile, -// }) -// if err == nil { -// jxutils.HandleUserWXRemark(db, mobile, false) -// TransferLegacyWeixins(mobile) -// } -// return num, err -// } - -// 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 { -// dao.Begin(db) -// defer func() { -// if r := recover(); r != nil { -// dao.Rollback(db) -// panic(r) -// } -// }() -// if num, err = dao.UpdateEntity(db, user, "JxStoreID"); err == nil { -// err = dao.SetWeiXinsEmpty2Null(db, user) -// } -// if err != nil { -// dao.Rollback(db) -// } else { -// dao.Commit(db) -// } -// } else { -// // globals.SugarLogger.Debug(utils.Format4Output(user, false)) -// dao.WrapAddIDCULEntity(user, ctx.GetUserName()) -// user.ParentID = -1 -// if err = dao.CreateWeiXins(db, user); err == nil { -// num = 1 -// } -// } -// } -// if err == nil { -// jxutils.HandleUserWXRemark(db, mobile, false) -// TransferLegacyWeixins(mobile) -// } -// 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 { -// // todo transaction -// if num, err = dao.UpdateEntity(db, user, "ParentID"); err == nil { -// err = dao.SetWeiXinsEmpty2Null(db, user) -// } -// } else { -// dao.WrapAddIDCULEntity(user, ctx.GetUserName()) -// if err = dao.CreateWeiXins(db, user); err == nil { -// num = 1 -// } -// } -// } -// } -// } else { -// err = fmt.Errorf("%s本身是成员", parentMobile) -// } -// } -// if err == nil { -// jxutils.HandleUserWXRemark(db, mobile, false) -// TransferLegacyWeixins(mobile) -// } -// return num, err -// } - -// func ChangeMobile(ctx *jxcontext.Context, curMobile, expectedMobile string) (num int64, err error) { -// num, err = dao.UpdateEntityByKV(nil, &legacymodel.WeiXins{}, map[string]interface{}{ -// "Tel": expectedMobile, -// }, map[string]interface{}{ -// "Tel": curMobile, -// }) -// if err == nil { -// TransferLegacyWeixins(curMobile) -// TransferLegacyWeixins(expectedMobile) -// } -// return num, err -// } - -// func verifyMobileIsBlank(db *dao.DaoDB, mobile string) (user *legacymodel.WeiXins, err error) { -// if !jxutils.IsStringLikeMobile(mobile) { -// return nil, fmt.Errorf("%s看起来不像是一个手机号", mobile) -// } -// 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); err != nil && err != orm.ErrNoRows { -// return nil, err -// } -// if err != orm.ErrNoRows { -// err = fmt.Errorf("%s已经是组长:%s,门店:%d的小组成员", mobile, userParent.Tel, userParent.JxStoreID) -// } else { -// err = nil -// } -// } else if user.JxStoreID != 0 { -// store := &model.Store{} -// store.ID = user.JxStoreID -// if err = dao.GetEntity(db, store); err == nil { -// err = fmt.Errorf("%s本身已经是门店:%d的组长", mobile, user.JxStoreID) -// } else if dao.IsNoRowsError(err) { -// err = nil -// } -// } -// } -// 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 -// } diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index 4de2ef583..22e8e4486 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -441,7 +441,7 @@ func GetSelfInfo(ctx *jxcontext.Context) (getSelfInfoResult *dao.GetSelfInfoResu tokenInfo, err := auth2.GetTokenInfo(ctx.GetToken()) if err == nil { if getSelfInfoResult, err = dao.GetUserByIDWithMembers(dao.GetDB(), "user_id", tokenInfo.GetID()); err == nil { - if userMembers, err3 := dao.GetUserMember(dao.GetDB(), getSelfInfoResult.User.UserID, 0, 0, true); err3 == nil { + if userMembers, err3 := dao.GetUserMember(dao.GetDB(), getSelfInfoResult.User.UserID, 0); err3 == nil { getSelfInfoResult.UserMembers = userMembers } else { err = err3 @@ -576,7 +576,7 @@ func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) { var ( db = dao.GetDB() ) - userMembers, err := dao.GetUserMember(db, "", 0, 0, true) + userMembers, err := dao.GetUserMember(db, "", 0) for _, userMember := range userMembers { if time.Now().Sub(userMember.EndAt) > 0 { userMember.DeletedAt = time.Now() @@ -585,3 +585,49 @@ func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) { } return err } + +func InvestMember(ctx *jxcontext.Context, memberID int) (err error) { + var ( + db = dao.GetDB() + memberCards []*model.MemberCard + memberCard *model.MemberCard + ) + userMembers, err := dao.GetUserMember(db, ctx.GetUserID(), model.MemberTypeNormal) + configList, err := dao.QueryConfigs(db, model.ConfigTypeName[model.ConfigTypeMemberCard], model.ConfigTypeMemberCard, "") + if len(configList) <= 0 { + return fmt.Errorf("未找到会员卡配置!") + } + config := configList[0] + err = jxutils.Strings2Objs(config.Value, &memberCards) + if err != nil { + return err + } + for _, v := range memberCards { + if v.ID == memberID { + memberCard = v + } + } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + //证明已经开了会员了,相当于续费 + if len(userMembers) > 0 { + userMember := userMembers[0] + if memberID == model.MemberCardTypeMonth { + userMember.EndAt = userMember.EndAt.AddDate(0, 1, 0) + } else { + userMember.EndAt = userMember.EndAt.AddDate(1, 0, 0) + } + } else { + userMember2 := &model.UserMember{} + dao.WrapAddIDCULDEntity(userMember2, ctx.GetUserName()) + } + //账户余额支出 + //支出明细、 + dao.Commit(db) + return err +} diff --git a/business/model/dao/dao_user.go b/business/model/dao/dao_user.go index 9dd6d8ba9..3cd8edce9 100644 --- a/business/model/dao/dao_user.go +++ b/business/model/dao/dao_user.go @@ -222,11 +222,10 @@ func GetUserOrderSMS(db *DaoDB, mobile, name string) (userOrderSms *model.UserOr return userOrderSms, err } -func GetUserMember(db *DaoDB, userID string, orderID int64, memberType int, isPay bool) (userMembers []*model.UserMember, err error) { +func GetUserMember(db *DaoDB, userID string, memberType int) (userMembers []*model.UserMember, err error) { sql := ` SELECT a.* FROM user_member a - JOIN order b ON b.id = a.order_id WHERE a.deleted_at = ? ` sqlParams := []interface{}{utils.DefaultTimeValue} @@ -234,18 +233,10 @@ func GetUserMember(db *DaoDB, userID string, orderID int64, memberType int, isPa sql += " AND a.user_id = ?" sqlParams = append(sqlParams, userID) } - if orderID != 0 { - sql += " AND a.order_id = ?" - sqlParams = append(sqlParams, orderID) - } if memberType != 0 { sql += " AND a.member_type = ?" sqlParams = append(sqlParams, memberType) } - if isPay { - sql += " AND b.status = ?" - sqlParams = append(sqlParams, isPay) - } err = GetRows(db, &userMembers, sql, sqlParams) return userMembers, err } diff --git a/business/model/new_config.go b/business/model/new_config.go index 495bddd32..d84123256 100644 --- a/business/model/new_config.go +++ b/business/model/new_config.go @@ -1,14 +1,14 @@ package model const ( - ConfigTypeSys = "Sys" - ConfigTypePricePack = "PricePack" - ConfigTypeFreightPack = "FreightPack" - ConfigTypeBank = "Bank" - ConfigTypeRole = "Role" - ConfigTypeJxStore = "JxStore" - ConfigTypeCookie = "Cookie" - ConfigTypeDiscountCard = "DiscountCard" + ConfigTypeSys = "Sys" + ConfigTypePricePack = "PricePack" + ConfigTypeFreightPack = "FreightPack" + ConfigTypeBank = "Bank" + ConfigTypeRole = "Role" + ConfigTypeJxStore = "JxStore" + ConfigTypeCookie = "Cookie" + ConfigTypeMemberCard = "MemberCard" ) const ( @@ -18,16 +18,21 @@ const ( ConfigSysMtwmSkuBoxFee = "MtwmSkuBoxFee" // 美团外卖单商品打包费 ) +const ( + MemberCardTypeMonth = 1 //1个月的会员 + MemberCardTypeYear = 2 //1年的会员 +) + var ( ConfigTypeName = map[string]string{ - ConfigTypeSys: "系统", - ConfigTypePricePack: "价格包", - ConfigTypeFreightPack: "免运包", - ConfigTypeBank: "银行", - ConfigTypeRole: "角色", - ConfigTypeJxStore: "京西商城", - ConfigTypeCookie: "Cookie", - ConfigTypeDiscountCard: "会员折扣卡", + ConfigTypeSys: "系统", + ConfigTypePricePack: "价格包", + ConfigTypeFreightPack: "免运包", + ConfigTypeBank: "银行", + ConfigTypeRole: "角色", + ConfigTypeJxStore: "京西商城", + ConfigTypeCookie: "Cookie", + ConfigTypeMemberCard: "会员卡", } ) diff --git a/business/model/order.go b/business/model/order.go index fd0b99db4..d3c07bfff 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -33,8 +33,7 @@ const ( OrderTypeSupplyGoods = 2 //进货订单 OrderTypeDefendPrice = 3 //守价订单 - OrderTypeAccount = 1 //任务保证金 - OrderTypeMember = 2 //开通会员 + OrderTypeAccount = 1 //账户余额 ) var ( diff --git a/business/model/user.go b/business/model/user.go index b836b15a1..ade8b4082 100644 --- a/business/model/user.go +++ b/business/model/user.go @@ -18,7 +18,7 @@ const ( UserTypeBoss = 8 UserTypeNonConsumer = ^1 - MemberTypeDiscountCard = 1 //会员折扣卡 + MemberTypeNormal = 1 //普通会员 ) var ( @@ -30,10 +30,9 @@ var ( } ) -type DiscountCard struct { - ID int `orm:"column(id)" json:"id"` - PicePercentage int `json:"pricePercentage"` - Price int `json:"price"` +type MemberCard struct { + ID int `orm:"column(id)" json:"id"` + Price int `json:"price"` } type User struct { @@ -206,7 +205,6 @@ func (*UserOrderSms) TableUnique() [][]string { type UserMember struct { ModelIDCULD - OrderID string `orm:"column(order_id);size(48)" json:"orderID"` //和order_pay关联的,不知道有没用,先加上把 UserID string `orm:"size(48);column(user_id)" json:"userID"` //内部唯一标识 MemberType int `json:"memberType"` //会员类型, 1为折扣卡 MemberTypeID int `orm:"column(member_type_id)" json:"memberTypeID"` //会员类型ID,折扣卡的话代表几档 diff --git a/controllers/cms_user2.go b/controllers/cms_user2.go index 3ac3435a1..e9d78d9de 100644 --- a/controllers/cms_user2.go +++ b/controllers/cms_user2.go @@ -224,3 +224,17 @@ func (c *User2Controller) GetUserAgreement() { return retVal, "", err }) } + +// @Title 会员充值 +// @Description 会员充值 +// @Param token header string false "认证token" +// @Param memberID formData int true "会员ID" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /InvestMember [post] +func (c *User2Controller) InvestMember() { + c.callInvestMember(func(params *tUser2InvestMemberParams) (retVal interface{}, errCode string, err error) { + + return retVal, "", err + }) +}