package member_center import ( "applet/app/db" "applet/app/e" md "applet/app/md/institutional_management/member_center" svc "applet/app/svc/member_center" "applet/app/utils" "code.fnuoos.com/EggPlanet/egg_models.git/src/implement" "code.fnuoos.com/EggPlanet/egg_models.git/src/model" "errors" "fmt" "github.com/gin-gonic/gin" "strings" ) // UserManagementGetUserList // @Summary 制度中心-会员中心-用户管理-用户信息管理(获取) // @Tags 会员中心 // @Description 用户信息管理(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param req body md.UserManagementGetUserListReq true "分页信息必填" // @Success 200 {object} md.UserManagementGetUserListResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/getUserList [post] func UserManagementGetUserList(c *gin.Context) { var req *md.UserManagementGetUserListReq if err := c.ShouldBindJSON(&req); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err.Error()) return } levelDb := implement.NewUserLevelDb(db.Db) levels, err1 := levelDb.UserLevelAllByAsc() if err1 != nil { e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } levelsList := make([]map[string]interface{}, 0) levelsMap := make(map[int]string) for _, level := range levels { levelsList = append(levelsList, map[string]interface{}{ "id": level.Id, "name": level.LevelName, }) levelsMap[level.Id] = level.LevelName } tagDb := implement.NewUserTagDb(db.Db) tags, err2 := tagDb.UserTagAllByAsc() if err2 != nil { e.OutErr(c, e.ERR_DB_ORM, err2.Error()) return } tagsList := make([]map[string]interface{}, 0) tagsMap := make(map[int]string) for _, tag := range tags { tagsList = append(tagsList, map[string]interface{}{ "id": tag.Id, "name": tag.TagName, }) tagsMap[tag.Id] = tag.TagName } users, total, err3 := svc.UserManagementGetUsers(db.Db, req) if err3 != nil { e.OutErr(c, e.ERR_DB_ORM, err3.Error()) return } var levelCounts []md.LevelCount err4 := db.Db.Table("user").Select("level, Count(*) AS count").GroupBy("level").Find(&levelCounts) if err4 != nil { e.OutErr(c, e.ERR_DB_ORM, err4.Error()) return } list := make([]md.UserManagementGetUserListNode, len(*users)) for i, user := range *users { list[i] = md.UserManagementGetUserListNode{ ID: user.Id, Avatar: user.Avatar, Nickname: user.Nickname, Phone: user.Phone, IsRealName: user.IsRealName, InviteCode: user.SystemInviteCode, ParentID: user.ParentUid, ParentInviteCode: user.ParentSystemInviteCode, ParentPhone: user.Phone, RegisterTime: user.CreateAt, Memo: user.Memo, } tag, ok := tagsMap[user.TagID] if ok { list[i].Tag = tag } level, ok := levelsMap[user.Level] if ok { list[i].LevelName = level } } resp := md.UserManagementGetUserListResp{ LevelsList: levelsList, TagsList: tagsList, List: list, Paginate: md.Paginate{ Limit: req.Limit, Page: req.Page, Total: total, }, } e.OutSuc(c, resp, nil) } // UserManagementUpdateUserInfo // @Summary 制度中心-会员中心-用户管理-用户信息管理(更新) // @Tags 会员中心 // @Description 用户信息管理(更新) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param req body md.UserManagementUpdateUserInfoReq true "用户ID 必传" // @Success 200 {int} "修改数据行数" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/updateUserInfo [post] func UserManagementUpdateUserInfo(c *gin.Context) { var req *md.UserManagementUpdateUserInfoReq if err := c.ShouldBindJSON(&req); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err.Error()) return } session := db.Db.NewSession() defer session.Close() session.Begin() userDb := implement.NewUserDb(db.Db) var affected int64 var err1 error forceColumns := make([]string, 0) user := model.User{ Id: req.UID, Phone: req.Phone, UnionId: req.UnionId, Nickname: req.Nickname, Avatar: req.Avatar, LastLoginIp: req.LastLoginIp, Memo: req.Memo, } if req.Level != "" { user.Level = utils.StrToInt(req.Level) } if req.State != "" { user.State = utils.StrToInt(req.State) } if req.Sex != "" { user.Sex = utils.StrToInt(req.Sex) } if req.ParentUid != "" { user.ParentUid = utils.StrToInt64(req.ParentUid) } else { user.ParentUid = 0 } forceColumns = []string{"sex", "parent_uid"} affected, err1 = userDb.UserUpdateBySession(session, req.UID, &user, forceColumns...) if err1 != nil { session.Rollback() e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } relateDb := implement.NewUserRelateDb(db.Db) relateForceColumns := []string{"sex", "parent_uid"} relate := &model.UserRelate{ ParentUid: user.ParentUid, } affected, err1 = relateDb.UpdateUserRelateBySession(session, req.UID, relate, relateForceColumns...) if err1 != nil { session.Rollback() e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } var err2 error if req.Tag != "" { record := model.UserTagRecords{ TagId: utils.StrToInt(req.Tag), } recordsDb := implement.NewUserTagRecordsDb(db.Db) affected, err2 = recordsDb.UserTagRecordsUpdateBySession(session, req.UID, &record, "tag_id") if err2 != nil { session.Rollback() e.OutErr(c, e.ERR_DB_ORM, err2.Error()) return } } err3 := session.Commit() if err3 != nil { session.Rollback() e.OutErr(c, e.ERR_DB_ORM, err3.Error()) return } e.OutSuc(c, affected, nil) } // UserManagementGetOneBasic // @Summary 制度中心-会员中心-用户管理-会员明细概况(获取) // @Tags 会员中心 // @Description 会员明细概况(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param uid query string true "用户 ID" // @Success 200 {object} md.UserManagementGetOneBasicResp "会员明细概况具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/userData [get] func UserManagementGetOneBasic(c *gin.Context) { uid := c.Query("uid") userDb := implement.NewUserDb(db.Db) user, err := userDb.UserGetOneByParams(map[string]interface{}{ "key": "id", "value": uid, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } // 1. 查询等级列表 levelDb := implement.NewUserLevelDb(db.Db) levels, err1 := levelDb.UserLevelAllByAsc() if err1 != nil { e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } levelsList := make([]map[string]interface{}, 0) levelsMap := make(map[int]string) for _, level := range levels { levelsList = append(levelsList, map[string]interface{}{ "id": level.Id, "name": level.LevelName, }) levelsMap[level.Id] = level.LevelName } //2. 查询标签列表 tagDb := implement.NewUserTagDb(db.Db) tags, err2 := tagDb.UserTagAllByAsc() if err2 != nil { e.OutErr(c, e.ERR_DB_ORM, err2.Error()) return } tagsList := make([]map[string]interface{}, 0) tagsMap := make(map[int]string) for _, tag := range tags { tagsList = append(tagsList, map[string]interface{}{ "id": tag.Id, "name": tag.TagName, }) tagsMap[tag.Id] = tag.TagName } //3. 查询父用户信息 parent, err := userDb.UserGetOneByParams(map[string]interface{}{ "key": "id", "value": user.ParentUid, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } //4. 查询用户标签 recordsDb := implement.NewUserTagRecordsDb(db.Db) userTagRecord, err := recordsDb.UserTagRecordsGetOneByParams(map[string]interface{}{ "key": "uid", "value": uid, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } resp := md.UserManagementGetOneBasicResp{ TagsList: tagsList, LevelsList: levelsList, BasicInfo: md.BasicInfoNode{ Avatar: user.Avatar, Sex: user.Sex, Nickname: user.Nickname, Phone: user.Phone, UnionId: user.UnionId, Password: user.Password, State: user.State, Memo: user.Memo, }, OtherInfo: md.OtherNode{ LastLoginIp: user.LastLoginIp, LastLoginAt: user.UpdateAt, CreateAt: user.CreateAt, }, } if userTagRecord != nil { resp.BasicInfo.TagName = tagsMap[userTagRecord.TagId] } if parent != nil { resp.BasicInfo.ParentUid = parent.Id resp.BasicInfo.ParentName = parent.Nickname resp.BasicInfo.ParentPhone = parent.Phone } level, ok := levelsMap[user.Level] if ok { resp.BasicInfo.LevelName = level } e.OutSuc(c, resp, nil) } // UserManagementGetFans // @Summary 制度中心-会员中心-用户管理-会员明细粉丝情况(获取) // @Tags 会员中心 // @Description 会员明细粉丝情况(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param uid query string true "用户 ID" // @Param type query string true "粉丝类型(1.全部 2.直推 3.二代 4.二代以后)" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Success 200 {object} md.UserManagementGetFansResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/getFans [get] func UserManagementGetFans(c *gin.Context) { uid := c.Query("uid") fansType := c.Query("type") limit := c.Query("limit") page := c.Query("page") //1. 查询符合情况用户 ID relateDb := implement.NewUserRelateDb(db.Db) var level int switch fansType { case "0": level = 0 case "1": level = 1 case "2": level = 2 default: level = 3 } relates, total, err := relateDb.PageFindUserRelateByParentUidAndLevel(utils.StrToInt64(uid), utils.StrToInt(page), utils.StrToInt(limit), level) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } userIDs := make([]int64, len(*relates)) for i, relate := range *relates { userIDs[i] = relate.Uid } //2. 查询所属代数 platoonUserRelationDb := implement.NewPublicPlatoonUserRelationDb(db.Db) levelTotals, err := platoonUserRelationDb.PublicPlatoonUserRelationFindByParamsByPage(map[string]interface{}{ "key": "uid", "value": userIDs, }, utils.StrToInt(page), utils.StrToInt(limit)) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } levelTotalMap := make(map[int64]int) for _, levelTotal := range *levelTotals { levelTotalMap[levelTotal.Uid] = levelTotal.LevelTotal } //3. 查询可提现余额 walletDb := implement.NewUserWalletDb(db.Db) wallets, err := walletDb.FindUserWalletByParams(map[string]interface{}{ "key": uid, "value": userIDs, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } walletMap := make(map[int64]string) for _, wallet := range *wallets { walletMap[wallet.Uid] = wallet.Amount } //4. 查询累计收益 var incomeMap = map[int64]string{} if len(*relates) > 0 { userIDStrs := make([]string, len(*relates)) for i, id := range userIDs { userIDStrs[i] = utils.Int64ToStr(id) } sql := "SELECT SUM(amount) as total, uid FROM `user_wallet_flow` WHERE uid in (%s) AND direction = 1 Group BY uid" results, err := db.QueryNativeString(db.Db, fmt.Sprintf(sql, strings.Join(userIDStrs, ","))) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } for _, res := range results { incomeMap[utils.StrToInt64(res["uid"])] = res["total"] } } //5. 查询用户信息 userDb := implement.NewUserDb(db.Db) users, err := userDb.UserFindByParams(map[string]interface{}{ "key": "uid", "value": userIDs, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } list := make([]md.FansNode, len(users)) for i, user := range users { list[i] = md.FansNode{ ID: user.Id, Nickname: user.Nickname, Phone: user.Phone, RegisterAt: user.CreateAt, } val, ok := incomeMap[user.Id] if ok { list[i].TotalIncome = val } levelTotal, ok := levelTotalMap[user.Id] if ok { list[i].LevelTotal = levelTotal } amount, ok := walletMap[user.Id] if ok { list[i].Amount = amount } } resp := md.UserManagementGetFansResp{ List: list, Paginate: md.Paginate{ Limit: utils.StrToInt(limit), Page: utils.StrToInt(page), Total: total, }, } e.OutSuc(c, resp, nil) } // UserManagementGetBalanceDetail // @Summary 制度中心-会员中心-用户管理-会员明细(余额获取) // @Tags 会员中心 // @Description 会员明细(余额获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param uid query string true "用户 ID" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Success 200 {object} md.UserManagementGetBalanceDetailResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/balanceDetail [get] func UserManagementGetBalanceDetail(c *gin.Context) { uid := c.Query("uid") page := c.DefaultQuery("page", "1") limit := c.DefaultQuery("limit", "10") walletFlowDb := implement.NewUserWalletFlowDb(db.Db) walletFlows, total, err := walletFlowDb.UserWalletFlowFindByParams(map[string]interface{}{ "key": "uid", "value": uid, }, utils.StrToInt(page), utils.StrToInt(limit)) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } kindMap := map[int]string{ 1: "管理员操作增加余额", 2: "管理员操作扣除余额", 3: "蛋蛋能量兑换余额", 4: "余额兑换蛋蛋能量", } list := make([]md.BalanceDetailNode, len(*walletFlows)) for i, flow := range *walletFlows { list[i] = md.BalanceDetailNode{ ID: flow.Id, Amount: flow.Amount, AfterAmount: flow.AfterAmount, Kind: kindMap[flow.Kind], CreateAt: flow.CreateAt, } } resp := md.UserManagementGetBalanceDetailResp{ List: list, Paginate: md.Paginate{ Limit: utils.StrToInt(limit), Page: utils.StrToInt(page), Total: total, }, } e.OutSuc(c, resp, nil) } // UserManagementGetVirtualCoinDetail // @Summary 制度中心-会员中心-用户管理-会员明细(积分明细获取) // @Tags 会员中心 // @Description 会员明细(积分明细获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param uid query string true "用户 ID" // @Param coinId query string true "货币 ID" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Success 200 {object} md.UserManagementGetVirtualCoinDetailResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/memberCenter/userManagement/getVirtualCoinDetail [get] func UserManagementGetVirtualCoinDetail(c *gin.Context) { page := c.DefaultQuery("page", "1") limit := c.DefaultQuery("limit", "10") uid := c.Query("uid") coinID := c.Query("coinId") coinDb := implement.NewVirtualCoinDb(db.Db) coins, err := coinDb.VirtualCoinFindAll() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } if coins == nil { e.OutErr(c, e.ERR_NO_DATA, errors.New("未初始化货币")) return } coinsList := make([]map[string]interface{}, len(coins)) coinsMap := map[int]string{} for i, coin := range coins { coinsList[i] = map[string]interface{}{ "coinID": coin.Id, "name": coin.Name, } coinsMap[coin.Id] = coin.Name } // 传入不存在的货币类型时 默认为第一种货币类型 var reqCoinID int _, ok := coinsMap[utils.StrToInt(coinID)] if !ok { reqCoinID = coinsList[0]["coinID"].(int) } else { reqCoinID = utils.StrToInt(coinID) } flowDb := implement.NewUserVirtualCoinFlowDb(db.Db) flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(utils.StrToInt(page), utils.StrToInt(limit), reqCoinID, utils.StrToInt64(uid), "", "", 0) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } list := make([]md.VirtualCoinDetailNode, len(flows)) for i, flow := range flows { list[i] = md.VirtualCoinDetailNode{ Uid: flow.Uid, Amount: flow.Amount, AfterAmount: flow.AfterAmount, Direction: flow.Direction, CreateAt: flow.CreateAt, } } resp := md.UserManagementGetVirtualCoinDetailResp{ CoinList: coinsList, List: list, Paginate: md.Paginate{ Limit: utils.StrToInt(limit), Page: utils.StrToInt(page), Total: total, }, } e.OutSuc(c, resp, nil) }