mh_server/model/user.go

1732 lines
60 KiB
Go
Raw Permalink Normal View History

2021-06-30 02:12:05 +00:00
package model
import (
"encoding/json"
2021-06-30 02:12:05 +00:00
"errors"
2022-01-26 08:02:21 +00:00
"fmt"
2021-06-30 02:12:05 +00:00
"github.com/codinl/go-logger"
2022-01-27 14:24:29 +00:00
"github.com/jinzhu/gorm"
2022-05-28 06:18:27 +00:00
"github.com/rs/zerolog/log"
2021-11-01 03:32:23 +00:00
"mh-server/lib/utils"
2022-04-25 05:59:56 +00:00
"mh-server/lib/wxpay"
2024-05-20 07:17:50 +00:00
"sort"
"strings"
2022-01-15 13:10:00 +00:00
"sync"
2021-06-30 02:12:05 +00:00
"time"
)
// gen:qs
2023-07-10 06:44:36 +00:00
//
//go:generate goqueryset -in user.go
2021-06-30 02:12:05 +00:00
type User struct {
Model
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"`
MemberLevel uint32 `json:"member_level"` // 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员
MemberGenre uint32 `json:"member_genre"` // 会员类型
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
OpenMemberTime time.Time `json:"open_member_time"` // 开通会员
Bond uint32 `json:"bond"` // 保证金
WxName string `json:"wx_name"` // 昵称
WxAvatar string `json:"wx_avatar"` // 头像
WxOpenID string `json:"wx_open_id"` // 微信openid
AppOpenID string `json:"app_open_id"` //
WxUnionID string `json:"wx_union_id"` // 微信uniodid
Tel string `json:"tel"` // 电话
Gender uint8 `json:"gender"` // 性别
City string `json:"city"` // 城市
Province string `json:"province"` // 省
Country string `json:"country"` // 市
Deposit uint32 `json:"deposit"` // 押金
UserType uint32 `json:"user_type"` // 用户类型: 1-普通用户 2-店员
XcxRoleId uint32 `json:"xcx_role_id"` // 角色id
OpenMemberChannel string `json:"open_member_channel" ` // 开通会员渠道: -门店推广 -用户邀请 -兑换码
StoreId uint64 `json:"store_id"` // 门店id
InviteCodeUrl string `json:"invite_code_url"` // 分享二维码
LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间
IP string `json:"-" gorm:"type:varchar(60)"` // ip
InBlack bool `json:"in_black"` // 是否在黑名单
StoreType uint32 `json:"store_type"` // 1-订单门店
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
ShopAssistantName string `json:"shop_assistant_name"` // 店员名称
OpenMemberLevel uint32 `json:"open_member_level"` // 开通会员级别2-黄金会员 4-白金会员 5-黑金会员
FirstRetailOrder time.Time `json:"first_retail_order"` //
Version uint32 `json:"-"` //
UserVm *UserVm `json:"user_vm" gorm:"-"` //
InviteTime time.Time `json:"invite_time"` //
DepositType uint32 `json:"deposit_type"` // 押金类型: 3-未充值
StoreList []StoreInfo `gorm:"-" json:"store_list"` // 有效门店列表
RoleId uint32 `json:"role_id" gorm:"-"` // 角色id
2022-07-25 04:02:53 +00:00
//RenewalTime time.Time `json:"renewal_time"`
//RenewalMemberLevel uint32 `json:"renewal_member_level"`
2023-01-06 02:03:56 +00:00
//MemberLevelString string `json:"member_level_string" gorm:"-"` // 会员类型
2021-06-30 02:12:05 +00:00
}
type AuthLoginReq struct {
Code string `json:"code" binding:"required"` // 小程序code码
InviteUid uint32 `json:"invite_uid"` // 邀请人用户ID
EncryptedData string `json:"encrypted_data" binding:"required"`
Iv string `json:"iv" binding:"required"`
//RawData string `json:"raw_data" binding:"required"`
//Signature string `json:"signature" binding:"required"`
//Tel string `json:"tel"` // 手机号
//WxName string `json:"wx_name"` // 昵称
//WxAvatar string `json:"wx_avatar"` // 头像
}
type AuthLoginResp struct {
AccessToken string `json:"access_token"`
AccessExpire int64 `json:"access_expire"`
RefreshToken string `json:"refresh_token"`
RefreshExpire int64 `json:"refresh_expire"`
Uid uint32 `json:"uid"`
AccessCreatedAt time.Time `json:"access_created_at"`
}
2021-06-30 02:12:05 +00:00
func (o *User) TableName() string {
return "user"
}
2021-11-01 03:32:23 +00:00
const (
2024-05-20 07:17:50 +00:00
MemberGenreYear = 200 // 短期会员:黄金年费会员
MemberGenreQuarter = 201 // 短期会员:黄金季度会员
MemberGenreHalfYear = 202 // 短期会员:黄金半年会员
2022-01-16 08:56:20 +00:00
)
const (
2024-05-20 07:17:50 +00:00
MemberLevelConsumer = 10 // 普通用户:有开过零售单,留了手机号,但是小程序端未登陆过的,仍然是普通用户
MemberLevelUser = 1 // 普通会员:仅进入了小程序且授权过手机号的为会员用户,未开通租卡会员的为“普通会员”
MemberLevelGold = 2 // 黄金会员
MemberLevelPeriod = 3 // 短期会员
MemberLevelPlatinum = 4 // 白金会员
MemberLevelBlackGold = 5 // 黑金会员
2021-11-01 03:32:23 +00:00
)
2022-03-26 03:25:15 +00:00
const (
DateTimeFormat = "2006-01-02"
TimeFormat = "2006-01-02 15:04:05"
)
2022-04-19 01:55:38 +00:00
const (
2022-04-23 07:47:13 +00:00
OpenMemberChannelStorePromotion = "store_promotion" // 门店推荐
2022-04-19 01:55:38 +00:00
OpenMemberChannelUserInvite = "user_invite"
OpenMemberChannelRedeemCode = "redeem_code"
)
2021-11-01 03:32:23 +00:00
// gen:qs
type UserInvite struct {
Model
2022-07-29 02:02:33 +00:00
FromUid uint32 `json:"from_uid"` // 邀请用户id
2022-08-04 03:57:21 +00:00
UserType uint32 `json:"user_type"` // 用户类型 1-普通用户 邀请用户类型
StoreId uint64 `json:"store_id"` // 门店id 邀请用户门店
2022-07-29 02:02:33 +00:00
MemberOpenTime time.Time `json:"member_open_time"` // 开通会员
MemberType uint32 `json:"member_type"` // 被邀请用户 1-普通用户 2-会员
MemberStatus uint8 `json:"member_status"` // 被邀请用户 1-未开通 2-已开通 3-已取消会员
ToUid uint32 `json:"to_uid"` // 被邀请用户
StoreType uint32 `json:"store_type"` // 门店类型 1-自有 2-合作商
Action uint32 `json:"action"` // 1-未激活 2-激活邀请 表示:该会员是开通还是续费
2022-11-23 08:20:05 +00:00
SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级 5-店员推广续费
2022-07-29 02:02:33 +00:00
MemberLevel uint32 `json:"member_level"` // 会员等级
2023-07-14 09:29:05 +00:00
MemberGenre uint32 `json:"member_genre"` // 会员类型
2022-07-29 02:02:33 +00:00
UserInviteRecordId uint32 `json:"user_invite_record_id"` // 邀请记录
2024-05-20 07:17:50 +00:00
FirstInvite uint32 `json:"first_invite"` // 首次邀请标志1 首次邀请 0 非首次
2022-07-29 02:02:33 +00:00
Scan uint32 `json:"scan"` // 扫码
2022-11-23 08:20:05 +00:00
InviteForm uint32 `json:"invite_form"` // 邀请方式: 1-店员邀请码续费
RenewHide uint32 `json:"renew_hide"` // 自动续费 1-自动 0-干预
2022-08-04 03:57:21 +00:00
//InviteTime time.Time `json:"invite_time"` // 邀请时间
ToUser *User `json:"to_user" gorm:"-"`
2022-07-29 02:02:33 +00:00
//ToUser *UserLess `json:"to_user" gorm:"-"` //
2022-06-03 03:30:03 +00:00
}
type UserLess struct {
Uid uint32 `json:"uid"`
MemberOpenTime time.Time `json:"member_open_time"` // 开通会员
MemberLevel uint32 `json:"member_level"` // 会员等级
2021-11-01 03:32:23 +00:00
}
2021-12-25 08:38:30 +00:00
const (
DepositRefundStatusUnconfirmed = 1 // 待确认
DepositRefundStatusConfirmed = 2 // 已确认
DepositRefundStatusRefunded = 3 // 已退款
DepositRefundStatusRefused = 4 // 已拒绝
)
2022-03-26 03:25:15 +00:00
const (
MemberExpireDelayDailyFee = 200
)
2021-12-25 08:38:30 +00:00
// gen:qs
type DepositRefundRecord struct {
Model
Uid uint32 `json:"uid"`
Status uint32 `json:"status"` // 1 // 待确认 2 // 已确认 3 // 已退款 4 // 已拒绝
Amount uint32 `json:"amount"`
Operator uint32 `json:"operator"`
ConfirmTime time.Time `json:"confirm_time"`
User User `json:"user" gorm:"-"`
}
2022-01-26 08:02:21 +00:00
const (
2022-04-26 06:28:41 +00:00
FundTypeMemberFee = "member_fee" // 会员费
FundTypeMemberDeposit = "member_deposit" // 押金
2022-04-23 07:47:13 +00:00
FundTypeExpressFee = "express_fee" // 邮费
FundTypeUpgradeMember = "upgrade_member" // 升级会员
FundTypeMemberExpireDelay = "member_expire_delay" // 滞纳金
2022-04-25 05:59:56 +00:00
FundTypeDepositRefund = "deposit_refund" // 退押金
FundTypeExpressFeeRefund = "express_fee_refund" // 退邮费
2022-05-28 06:18:27 +00:00
FundTypeBuyGoods = "buy_goods" // 购买商品
2022-06-14 06:07:15 +00:00
FundTypeBuyGoodsCancel = "buy_goods_cancel" // 购买商品取消订单
FundTypeBuyGoodsRefund = "buy_goods_refund" // 购买商品退货
2022-08-12 02:41:33 +00:00
FundTypeRecycleCard = "recycle_card" // 回收卡带
2022-09-29 07:49:16 +00:00
FundTypePostagePackageFee = "postage_package_fee" // 购买运费包
2022-01-26 08:02:21 +00:00
)
// gen:qs
2022-04-23 07:47:13 +00:00
type FundRecord struct {
2022-01-26 08:02:21 +00:00
Model
2022-04-26 06:28:41 +00:00
Uid uint32 `json:"uid" gorm:"index"`
FundType string `json:"fund_type" gorm:"index"` // -member_gold -member_platinum -member_black_gold
2022-04-23 07:47:13 +00:00
Amount int64 `json:"amount"`
2022-04-26 06:28:41 +00:00
TransactionId string `json:"transaction_id" gorm:"index"` // 支付单号
OutTradeNo string `json:"out_trade_no" gorm:"index"`
RefundId string `json:"refund_id" gorm:"index"`
PaymentNo string `json:"payment_no" gorm:"index"` // 付款单号
Status uint32 `json:"status"` // 1-待支付 2-已支付 3-已退款
Remark string `json:"remark"` // 备注
2022-06-23 04:21:01 +00:00
2022-01-26 08:02:21 +00:00
}
// gen:qs
type UserRentCard struct {
Model
Uid uint32 `json:"uid"`
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
LevelRentCount uint32 `json:"level_rent_count"` // 等级借卡数量
HaveRentCount uint32 `json:"have_rent_count"` // 已借卡数量
CanRentCount uint32 `json:"can_rent_count"` // 可借卡数量
Status uint32 `json:"status"` // 状态
}
2022-03-26 03:25:15 +00:00
// gen:qs
type UserMemberExpireDelay struct {
Model
Uid uint32 `json:"uid" gorm:"column:uid;index"`
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
DelayAmount uint32 `json:"delay_amount"`
ExpireDays uint32 `json:"expire_days"`
DailyFee uint32 `json:"daily_fee"`
2022-04-16 13:26:14 +00:00
IsPay uint32 `json:"is_pay"` // 1-已支付
2022-03-26 03:25:15 +00:00
}
2022-05-10 07:17:34 +00:00
// gen:qs
type XcxRole struct {
Model
RoleId uint32 `json:"role_id" gorm:"unique_index,not null"`
RoleName string `json:"role_name" gorm:"size:255;"` // 角色名称
RoleKey string `json:"role_key" gorm:"size:255;"` // 角色代码
RoleSort int `json:"role_sort" gorm:""` // 角色排序
Status string `json:"status" gorm:"size:255;"` // 状态:1-停用 2-正常
Flag string `json:"flag" gorm:"size:255;"` //
CreateBy string `json:"create_by" gorm:"size:255;"` //
UpdateBy string `json:"update_by" gorm:"size:255;"` //
Remark string `json:"remark" gorm:"size:255;"` // 备注
Params string `json:"params" gorm:"-"`
MenuIds []int `json:"menuIds" gorm:"-"`
DeptIds []int `json:"deptIds" gorm:"-"`
}
2022-11-01 06:23:06 +00:00
// gen:qs
// ShopperPromotionCode 店员优惠码
2022-11-01 06:23:06 +00:00
type ShopperPromotionCode struct {
Model
Uid uint32 `json:"uid" gorm:"column:uid;index"`
State uint32 `json:"state"` // 1-停用 2-使用
Code string `json:"code" gorm:"index"`
StoreId uint32 `json:"store_id"` // 门店id
// shopper_promotion_code
}
2021-06-30 02:12:05 +00:00
func GetUserByUid(uid uint32) *User {
user := new(User)
if err := NewUserQuerySet(DB).UidEq(uid).One(user); err != nil {
logger.Error(err, uid)
2023-09-12 06:54:27 +00:00
return user
2021-06-30 02:12:05 +00:00
}
return user
}
const StoreDateTimeFormat = "2006.01.02"
2024-05-20 07:17:50 +00:00
// GetUserEffectiveStore 获取店员当前的有效门店(邀请客户时使用)
func GetUserEffectiveStore(uid uint32) (*StoreInfo, error) {
if uid == 0 {
return &StoreInfo{}, nil
}
2024-05-20 07:17:50 +00:00
user := new(SysUser)
if err := NewSysUserQuerySet(DB).UidEq(uid).One(user); err != nil {
logger.Error("Error:", err, "UID:", uid)
return &StoreInfo{}, err
}
var userStores []StoreInfo
if user.RoleId == 1 { // 系统管理员
var stores []Store
err := NewStoreQuerySet(DB).CooperativeBusinessIdEq(user.CooperativeBusinessId).All(&stores)
if err != nil {
return &StoreInfo{}, err
}
2024-05-20 07:17:50 +00:00
for _, item := range stores {
tempStore := StoreInfo{
StoreID: uint64(item.ID),
StoreName: item.Name,
ExpireTime: "2099.12.30",
}
userStores = append(userStores, tempStore)
}
} else { // 普通用户
// 解析门店数据
if err := json.Unmarshal([]byte(user.StoreData), &userStores); err != nil {
return &StoreInfo{}, err
}
if len(userStores) == 0 {
return &StoreInfo{}, errors.New("no stores found")
}
2024-05-20 07:17:50 +00:00
}
// 当前时间
now := time.Now()
// 过滤掉过期的门店
validStores := make([]StoreInfo, 0)
for _, store := range userStores {
expireTime, err := time.Parse(StoreDateTimeFormat, store.ExpireTime)
if err != nil {
logger.Error("Error parsing time:", err, "ExpireTime:", store.ExpireTime)
continue
}
// 包含当天有效时间
expireTime = expireTime.Add(24*time.Hour - time.Second)
if expireTime.After(now) {
validStores = append(validStores, store)
}
}
if len(validStores) == 0 {
return &StoreInfo{}, nil
}
// 按有效时间和 store_id 排序
sort.Slice(validStores, func(i, j int) bool {
timeI, _ := time.Parse(StoreDateTimeFormat, validStores[i].ExpireTime)
timeJ, _ := time.Parse(StoreDateTimeFormat, validStores[j].ExpireTime)
2024-05-20 07:17:50 +00:00
if timeI.Equal(timeJ) {
return validStores[i].StoreID < validStores[j].StoreID
2024-05-20 07:17:50 +00:00
}
return timeI.Before(timeJ)
})
return &validStores[0], nil
2024-05-20 07:17:50 +00:00
}
2022-01-26 08:02:21 +00:00
func GetUserRentCard(uid uint32) *UserRentCard {
userRent := new(UserRentCard)
if err := NewUserRentCardQuerySet(DB).UidEq(uid).One(userRent); err != nil {
logger.Error(err, uid)
return nil
}
return userRent
}
2021-06-30 02:12:05 +00:00
func UserUpdate(user *User) error {
if user.Uid == 0 {
return errors.New("uid is null")
}
fields := make([]UserDBSchemaField, 0)
if user.WxName != "" {
fields = append(fields, UserDBSchema.WxName)
}
if user.WxAvatar != "" {
fields = append(fields, UserDBSchema.WxAvatar)
}
if user.Tel != "" {
fields = append(fields, UserDBSchema.Tel)
}
if user.MemberLevel != 0 {
fields = append(fields, UserDBSchema.MemberLevel)
}
if !user.MemberExpire.IsZero() {
2021-06-30 02:12:05 +00:00
fields = append(fields, UserDBSchema.MemberExpire)
}
2021-12-25 08:38:30 +00:00
if user.Deposit != 0 {
fields = append(fields, UserDBSchema.Deposit)
}
if user.WxOpenID != "" {
fields = append(fields, UserDBSchema.WxOpenID)
}
if user.WxUnionID != "" {
fields = append(fields, UserDBSchema.WxUnionID)
}
if !user.LastLoginAt.IsZero() {
fields = append(fields, UserDBSchema.LastLoginAt)
}
if !user.CreatedAt.IsZero() {
fields = append(fields, UserDBSchema.CreatedAt)
}
2021-06-30 02:12:05 +00:00
if len(fields) > 0 {
err := user.Update(DB.Where(&User{Uid: user.Uid}), fields...)
if err != nil {
logger.Error("err:", err)
return err
}
}
return nil
}
2022-09-29 07:49:16 +00:00
//OrderType: 1-物流支付 2-取消物流租卡 3-滞纳金 4-收回卡 5-退物流费 6-商城购物 7-购买商品取消订单 8-购买商品订单退货 9-升级会员 10-开通 续费 11-运费包
2022-05-28 06:18:27 +00:00
2021-06-30 02:12:05 +00:00
// gen:qs
type UserOpenMemberRecord struct {
Model
2022-07-25 04:02:53 +00:00
Uid uint32 `json:"uid" gorm:"index"`
OpenNo string `json:"open_no" gorm:"index"`
OrderId uint32 `json:"order_id" gorm:"index"`
OrderType uint32 `json:"order_type"`
MemberLevel uint32 `json:"member_level"`
2023-07-14 09:29:05 +00:00
MemberGenre uint32 `json:"member_genre"`
2022-07-25 04:02:53 +00:00
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
UserCouponId uint32 `json:"user_coupon_id" gorm:"index"` // 优惠券id
State uint32 `json:"state"` // 1-未处理 2-已处理
DeductionDays uint32 `json:"deduction_days"`
DeductionFee uint32 `json:"deduction_fee"`
2022-05-28 06:18:27 +00:00
2022-04-25 05:59:56 +00:00
Order *Order `json:"order" gorm:"-"`
ShareCardRetrieve *ShareCardRetrieve `json:"share_card_retrieve" gorm:"-"`
2022-05-28 06:18:27 +00:00
GoodsOrder *GoodsOrder `json:"goods_order" gorm:"-"`
2022-11-26 08:52:05 +00:00
Attach string `json:"attach"`
2021-06-30 02:12:05 +00:00
}
func (o *UserOpenMemberRecord) TableName() string {
return "user_open_member_record"
}
func (m UserOpenMemberRecord) Insert() error {
err := m.Create(DB)
if err != nil {
logger.Error("err:", err)
return err
}
return nil
}
2022-05-10 07:17:34 +00:00
const (
2022-08-01 07:14:53 +00:00
LogCorrelationOrderId = "order_id"
LogCorrelationOrderCard = "order_card_id"
LogCorrelationRecycleCardOrderId = "recycle_card_order_id"
2022-05-10 07:17:34 +00:00
)
const (
2022-08-01 07:14:53 +00:00
OperationTypeRentCardRevert = "rent_card_revert"
OperationTypeRentCardDeliver = "rent_card_deliver"
OperationTypeGameCardGoodsInStock = "game_card_goods_in_stock" // 入库
OperationTypeRecycleCardOrderImageUpdate = "recycle_card_order_image_update" // 回收卡上传图片
2022-05-10 07:17:34 +00:00
)
// gen:qs
type OperationLog struct {
Model
2022-05-28 06:18:27 +00:00
Uid uint32 `json:"uid" gorm:"index"` // 店员id
SysUid uint32 `json:"sys_uid" gorm:"index"`
2022-05-18 06:28:00 +00:00
Description string `json:"description"` // 描述
OperationType string `json:"operation_type" gorm:"index"` // 操作类型
CorrelationId uint32 `json:"correlation_id" gorm:"index"` // 关联id
CorrelationName string `json:"correlation_name" gorm:"index"` // 关联name
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
StoreName string `json:"store_name"` // 门店名称
CooperativeName string `json:"cooperative_name"` // 合作商名称
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
SerialNumber string `json:"serial_number" gorm:"index"` // 卡编号
Detail string `json:"detail"` // 详情
Remark string `json:"remark"` // 备注
2022-05-10 07:17:34 +00:00
}
2022-09-29 07:49:16 +00:00
// gen:qs
type UserMemberDurationRecord struct {
Model
Uid uint32 `json:"uid"`
Duration uint32 `json:"duration"`
EventType uint32 `json:"event_type"` // 类型: 1-购买运费包
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
}
2022-04-25 05:59:56 +00:00
func (m *UserOpenMemberRecord) OrderRefund(outTradeNo string) error {
if m.Order == nil {
return errors.New("order is nil")
}
if m.OpenNo == "" {
m.OpenNo = GetOrderSn()
}
m.Uid = uint32(m.Order.Uid)
m.OrderId = m.Order.ID
err := m.Refund(outTradeNo, m.Order.PayPrice)
if err != nil {
logger.Error("refund err:", err)
return err
}
return nil
}
2022-05-28 06:18:27 +00:00
func (m *UserOpenMemberRecord) MallGoodsOrderRefund(outTradeNo string) error {
if m.GoodsOrder == nil {
return errors.New("goods order is nil")
}
if m.OpenNo == "" {
m.OpenNo = GetOrderSn()
}
m.Uid = uint32(m.GoodsOrder.Uid)
m.OrderId = m.GoodsOrder.ID
err := m.Refund(outTradeNo, m.GoodsOrder.Rm)
if err != nil {
logger.Error("refund err:", err)
return err
}
return nil
}
2022-05-10 07:17:34 +00:00
// gen:qs
type InviteMemberReport struct {
Model
Uid uint32 `json:"uid" gorm:"index"` // 店员uid
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金数量
GoldCountHalf uint32 `json:"gold_count_half"` // 半年黄金数量
GoldCountQuarter uint32 `json:"gold_count_quarter"` // 季度黄金数量
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
2022-05-13 09:35:10 +00:00
//ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
Date string `json:"date" gorm:"index"` // 业绩时间
DeductAmount uint32 `json:"deduct_amount"` // 店员提成
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成
RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费年度黄金会员数量(自动)
RenewalGoldCountHalf uint32 `json:"renewal_gold_count_half"` // 续费半年黄金会员数量(自动)
RenewalGoldCountQuarter uint32 `json:"renewal_gold_count_quarter"` // 续费季度黄金会员数量(自动)
RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动)
RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量(自动)
UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(自动)
UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(自动)
UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(自动)
InviteRenewalGoldCount uint32 `json:"invite_renewal_gold_count"` // 续费黄金会员数量(干预)
InviteRenewalPlatinumCount uint32 `json:"invite_renewal_platinum_count"` // 续费白金会员数量(干预)
InviteRenewalBlackGoldCount uint32 `json:"invite_renewal_black_gold_count"` // 续费黑金会员数量(干预)
InviteUpgradeGoldToPlatinumCount uint32 `json:"invite_upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(干预)
InviteUpgradeGoldToBlackCount uint32 `json:"invite_upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(干预)
InviteUpgradePlatinumToBlackCount uint32 `json:"invite_upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(干预)
2022-05-10 07:17:34 +00:00
// invite_member_report
2022-05-12 05:42:45 +00:00
User *User `json:"user" gorm:"-"`
2022-05-10 07:17:34 +00:00
}
2022-04-25 05:59:56 +00:00
func (m *UserOpenMemberRecord) Refund(outTradeNo string, amount uint32) error {
configInfo, err := PayConfigInfo()
if err != nil {
logger.Error("config info err:", err)
return err
}
//configInfo.NotifyUrl = "https://dev.switch.deovo.com:8004/api/v1/wxpay_refund/notice"
err = m.Insert()
if err != nil {
logger.Error("insert user open member record err:", err)
return err
}
orderRefund := wxpay.OrderRefund{
OutTradeNo: outTradeNo,
OutRefundNo: m.OpenNo,
NotifyUrl: configInfo.RefundNotifyUrl,
Amount: wxpay.OrderRefundAmount{
Refund: amount,
Total: amount,
Currency: "CNY",
},
}
2022-11-30 01:43:36 +00:00
err = wxpay.HmRefundTransaction(orderRefund)
2022-04-25 05:59:56 +00:00
if err != nil {
logger.Error("err:", err)
return err
}
2022-11-30 01:43:36 +00:00
//err = wxpay.TransactionOrderRefund(orderRefund)
//if err != nil {
// logger.Error("err:", err)
// return err
//}
2022-04-25 05:59:56 +00:00
//FundRecord{
// Uid: m.Uid,
// FundType: FundTypeExpressFeeRefund,
// Amount: int64(m.Order.PayPrice) * (-1),
// TransactionId: "",
// OutTradeNo: "",
// Status: 0,
// Remark: "",
//}
return nil
}
2022-05-10 07:17:34 +00:00
//func (m *UserOpenMemberRecord) ShareCardRetrieveRefund(outTradeNo string) error {
// //if m.ShareCardRetrieve == nil {
// // return errors.New("order is nil")
// //}
// //if m.OpenNo == "" {
// // m.OpenNo = GetShareCardRetrieveOrderSn()
// //}
// //m.Uid = uint32(m.Order.Uid)
// //m.OrderId = m.ShareCardRetrieve.ID
// //configInfo, err := PayConfigInfo()
// //if err != nil {
// // logger.Error("config info err:", err)
// // return err
// //}
// //
// //err = m.Insert()
// //if err != nil {
// // logger.Error("insert user open member record err:", err)
// // return err
// //}
// //
// //orderRefund := wxpay.OrderRefund{
// // OutTradeNo: outTradeNo,
// // OutRefundNo: m.OpenNo,
// // NotifyUrl: configInfo.NotifyUrl,
// // Amount: wxpay.OrderRefundAmount{
// // Refund: m.ShareCardRetrieve.PayAmount,
// // Total: m.ShareCardRetrieve.PayAmount,
// // Currency: "CNY",
// // },
// //}
// //err = wxpay.TransactionOrderRefund(orderRefund)
// //if err != nil {
// // logger.Error("err:", err)
// // return err
// //}
// return nil
//}
2022-04-25 05:59:56 +00:00
2021-06-30 02:12:05 +00:00
func (m *UserOpenMemberRecord) GetByOpenNo() error {
err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(m.OpenNo).One(m)
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return err
}
return nil
}
// gen:qs
type CommonProblem struct {
Model
Question string `json:"question"`
Answer string `json:"answer" gorm:"type:text"`
Sort uint32 `json:"sort" gorm:"index"`
}
2021-12-25 08:38:30 +00:00
type GroupSendMessageTemplate struct {
Model
Title string `json:"title" `
Message string `json:"message"`
UserType uint32 `json:"user_type" gorm:"index,column:user_type"` // 1-所有用户 2-会员 3-非会员 4-指定用户
SendTime time.Time `json:"send_time"`
Tels string `json:"tels"`
Status uint32 `json:"status"` // 1-待发送 2-已发送
}
2021-06-30 02:12:05 +00:00
func (*CommonProblem) TableName() string {
return "common_problem"
}
func (*CommonProblem) List() ([]CommonProblem, error) {
commons := make([]CommonProblem, 0)
err := NewCommonProblemQuerySet(DB).OrderDescBySort().All(&commons)
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return commons, err
}
return commons, err
}
2021-11-01 03:32:23 +00:00
func (m *User) AppletQRCodeUpdate() error {
num, err := NewUserQuerySet(DB).UidEq(m.Uid).GetUpdater().SetInviteCodeUrl(m.InviteCodeUrl).UpdateNum()
if err != nil || num != 1 {
logger.Error("AppletQRCodeUpdate err")
return errors.New("AppletQRCodeUpdate err")
}
return nil
}
type UserInviteListReq struct {
Page int `json:"page"` // 页码
PageSize int `json:"page_size"` // 每页条数
Uid uint32 `json:"uid"` // 当前用户ID
MemberType int `json:"member_type"` // 会员类型0-全部 1-普通用户 2-会员
SpendType uint32 `json:"spend_type"` // 操作类型2-开通会员 3-续费 4-升级
2021-11-01 03:32:23 +00:00
StartTime string `json:"start_time"` // 开始时间
EndTime string `json:"end_time"` // 结束时间
}
type UserInviteListResp struct {
2022-07-29 02:02:33 +00:00
Page int `json:"page"`
TotalPage int `json:"total_page"`
//List []UserInviteList `json:"list"`
List []UserInvite `json:"list"`
Count int `json:"count"`
2021-11-01 03:32:23 +00:00
}
2022-07-29 02:02:33 +00:00
//type UserInviteList struct {
// User User `json:"user"`
// UserInvite UserInvite `json:"user_invite"`
//}
2021-11-01 03:32:23 +00:00
func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) {
list := make([]User, 0)
resp := &UserInviteListResp{
Page: m.Page,
2022-07-29 02:02:33 +00:00
List: make([]UserInvite, 0),
2021-11-01 03:32:23 +00:00
}
page := m.Page - 1
if page < 0 {
page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
qs := NewUserInviteQuerySet(DB).FromUidEq(m.Uid).ActionEq(2) // action=2激活邀请
2021-11-01 03:32:23 +00:00
if m.MemberType != 0 {
2022-05-10 07:17:34 +00:00
qs = qs.MemberTypeEq(uint32(m.MemberType))
if m.MemberType == 2 { // 查询会员数据
2022-11-01 06:23:06 +00:00
user := GetUserByUid(m.Uid)
2022-08-04 03:57:21 +00:00
//qs = qs.FirstInviteNe(1).SpendTypeEq(2)
//qs = qs.SpendTypeEq(2)
2022-11-01 06:23:06 +00:00
//qs = qs.SpendTypeNotIn([]uint32{3, 4}...)
if user.CooperativeBusinessId == 1 { // 合作商为迪为
2022-11-22 07:42:48 +00:00
if m.SpendType != 0 {
qs = qs.SpendTypeEq(m.SpendType)
if m.SpendType == 3 { // 如果是3-续费则查询是否为店员推广续费invite_form = 1
2022-11-23 08:20:05 +00:00
qs = qs.InviteFormEq(1)
}
} else { // 如果没有指定spend_type则默认查询2-开通会员3-续费
2022-11-22 07:42:48 +00:00
qs = qs.SpendTypeIn([]uint32{2, 3}...)
}
} else { // 如果不是迪为合作商则查询非3-续费4-升级的数据
2022-11-01 06:23:06 +00:00
qs = qs.SpendTypeNotIn([]uint32{3, 4}...)
}
2022-08-04 03:57:21 +00:00
}
2021-11-01 03:32:23 +00:00
}
if m.MemberType == 0 && m.SpendType != 0 { // 被邀请用户为0-未注册用户操作类型不为0
2022-11-22 07:42:48 +00:00
qs = qs.SpendTypeEq(m.SpendType)
if m.SpendType == 3 { // 如果是3-续费则查询是否为店员推广续费invite_form = 1
2022-11-23 08:20:05 +00:00
qs = qs.InviteFormEq(1)
}
2022-11-22 07:42:48 +00:00
}
2021-11-01 03:32:23 +00:00
if m.StartTime != "" {
parse, err := time.Parse(DateTimeFormat, m.StartTime)
if err != nil {
logger.Errorf("err:%#v", err)
return resp, err
}
if m.MemberType == 2 { // 如果被邀请用户是2-会员,则比较会员注册时间,否则比较记录时间
2021-11-01 03:32:23 +00:00
qs = qs.MemberOpenTimeGte(parse)
} else {
qs = qs.CreatedAtGte(parse)
}
}
if m.EndTime != "" {
parse, err := time.Parse(DateTimeFormat, m.EndTime)
if err != nil {
logger.Errorf("err:%#v", err)
return resp, err
}
if m.MemberType == 2 {
qs = qs.MemberOpenTimeLte(parse.AddDate(0, 0, 1))
} else {
qs = qs.CreatedAtLte(parse.AddDate(0, 0, 1))
}
}
count, err := qs.Count()
if err != nil {
logger.Error("err:", err)
return resp, err
}
resp.TotalPage = count/m.PageSize + 1
resp.Count = count
var invites []UserInvite
2022-06-03 03:30:03 +00:00
//err = qs.Offset(page * m.PageSize).Limit(m.PageSize).OrderDescByID().All(&invites)
2022-08-04 03:57:21 +00:00
err = qs.OrderDescByCreatedAt().Offset(page * m.PageSize).Limit(m.PageSize).OrderDescByMemberOpenTime().All(&invites)
2021-11-01 03:32:23 +00:00
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return resp, err
}
2022-07-29 02:02:33 +00:00
//if len(invites) == 0 {
// return resp, nil
//}
2021-11-01 03:32:23 +00:00
uids := make([]uint32, 0)
2022-07-29 02:02:33 +00:00
//inviteMap := make(map[uint32]UserInvite, 0)
2021-11-01 03:32:23 +00:00
for i, _ := range invites {
uids = append(uids, invites[i].ToUid)
2022-07-29 02:02:33 +00:00
//inviteMap[invites[i].ToUid] = invites[i]
if invites[i].MemberStatus != 1 {
invites[i].CreatedAt = invites[i].MemberOpenTime
}
}
if len(uids) == 0 {
return resp, nil
2021-11-01 03:32:23 +00:00
}
err = NewUserQuerySet(DB).UidIn(uids...).All(&list)
if err != nil {
logger.Error("err:", err)
return resp, err
}
userMap := make(map[uint32]User, 0)
for i, _ := range list {
userMap[list[i].Uid] = list[i]
}
2022-07-29 02:02:33 +00:00
for i, _ := range invites {
2021-11-01 03:32:23 +00:00
user, ok1 := userMap[uids[i]]
2022-07-29 02:02:33 +00:00
if ok1 {
invites[i].ToUser = &user
2021-11-01 03:32:23 +00:00
}
}
2022-07-29 02:02:33 +00:00
//users := make([]User, 0)
//users := make([]UserInviteList, 0)
//for i, _ := range uids {
// user, ok1 := userMap[uids[i]]
// invite, ok2 := inviteMap[uids[i]]
// if !ok1 || !ok2 {
// continue
// }
// userInvite := UserInviteList{
// User: user,
// UserInvite: invite,
// }
// users = append(users, userInvite)
//}
resp.List = invites
2021-11-01 03:32:23 +00:00
return resp, nil
}
func GetOrderSn() string {
var orderSn string
for {
2022-04-08 02:28:50 +00:00
//orderSn = utils.GetSerialNo32HEXString()
orderSn = utils.GenSerialNo()
2021-11-01 03:32:23 +00:00
count, err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(orderSn).Count()
if err != nil {
logger.Error("err:", err)
}
if count == 0 {
break
}
}
return orderSn
}
2021-12-25 08:38:30 +00:00
2022-03-26 03:25:15 +00:00
func GetShareCardBillSn() string {
var billSn string
for {
2022-04-08 02:28:50 +00:00
//billSn = utils.GetSerialNo32HEXString()
billSn = utils.GenSerialNo()
2022-03-26 03:25:15 +00:00
count, err := NewUserShareCardBillQuerySet(DB).BillSnEq(billSn).Count()
if err != nil {
logger.Error("err:", err)
}
if count == 0 {
break
}
}
return billSn
}
2022-04-04 11:03:22 +00:00
func GetShareCardRetrieveOrderSn() string {
var orderSn string
for {
2022-04-08 02:28:50 +00:00
//orderSn = utils.GetSerialNo32HEXString()
orderSn = utils.GenSerialNo()
2022-04-04 11:03:22 +00:00
count, err := NewShareCardRetrieveQuerySet(DB).OrderSnEq(orderSn).Count()
if err != nil {
logger.Error("err:", err)
}
if count == 0 {
break
}
}
return orderSn
}
2021-12-25 08:38:30 +00:00
func (m *User) Edit() {
err := DB.Save(m).Error
if err != nil {
logger.Error("err:", err)
}
return
}
func GetWxPayExpressFeeRefundRecord(orderId uint32) (string, error) {
var openMemberRecord UserOpenMemberRecord
2022-05-28 06:18:27 +00:00
//err := NewUserOpenMemberRecordQuerySet(DB).OrderIdEq(orderId).OrderTypeEq(1).
//OrderDescByID().Limit(1).One(&openMemberRecord)
err := NewUserOpenMemberRecordQuerySet(DB).OrderIdEq(orderId).OrderDescByID().
Limit(1).One(&openMemberRecord)
2021-12-25 08:38:30 +00:00
if err != nil {
logger.Error("err:", err)
return "", err
}
return openMemberRecord.OpenNo, nil
}
func GetDepositRefundRecordList(uid uint32) ([]DepositRefundRecord, error) {
var deposits []DepositRefundRecord
err := NewDepositRefundRecordQuerySet(DB).UidEq(uid).OrderDescByID().All(&deposits)
if err != nil {
logger.Error("deposit refund record err:", err)
return deposits, err
}
return deposits, nil
}
2022-01-15 13:10:00 +00:00
var userMutexMap map[string]*sync.Mutex
func GetUserMutexMap() map[string]*sync.Mutex {
if userMutexMap == nil {
userMutexMap = make(map[string]*sync.Mutex, 0)
}
return userMutexMap
}
func GetUserMutex(mutexKey string) *sync.Mutex {
mutexMap := GetUserMutexMap()
if v, ok := mutexMap[mutexKey]; ok {
return v
} else {
mutexMap[mutexKey] = new(sync.Mutex)
return mutexMap[mutexKey]
}
}
//func AuthLoginMutex(uid uint32) *sync.Mutex {
// return GetUserMutex(fmt.Sprintf("AuthLogin:%d", uid))
//}
2022-01-16 08:56:20 +00:00
var AuthLoginMutex = sync.Mutex{}
2022-01-26 08:02:21 +00:00
2022-02-26 06:29:39 +00:00
func OrderCardUserRentCard(uid uint32, count uint32, memberConfig *MemberConfig, gdb *gorm.DB) error {
2022-01-26 08:02:21 +00:00
//UserRentCard{}
2022-01-27 14:24:29 +00:00
if gdb == nil {
gdb = DB
}
2022-01-26 08:02:21 +00:00
var userRentCard UserRentCard
err := NewUserRentCardQuerySet(DB).UidEq(uid).One(&userRentCard)
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return err
}
if err == RecordNotFound {
user := GetUserByUid(uid)
if user == nil {
logger.Error("user nil")
return errors.New("user nil")
}
if memberConfig == nil {
2023-07-14 09:29:05 +00:00
memberConfig, err = GetMemberConfig(user.MemberLevel, user.MemberGenre)
2022-01-26 08:02:21 +00:00
if err != nil {
logger.Error("GetMemberConfig err:", err)
return err
}
}
rentCard := &UserRentCard{
Uid: uid,
MemberLevel: user.MemberLevel,
LevelRentCount: memberConfig.CardMax,
HaveRentCount: uint32(count),
CanRentCount: uint32(memberConfig.CardMax - count),
Status: 0,
}
2022-01-27 14:24:29 +00:00
err := gdb.Create(rentCard).Error
2022-01-26 08:02:21 +00:00
if err != nil {
logger.Error("err", err)
return err
}
return nil
}
2022-06-29 08:03:50 +00:00
sql := fmt.Sprintf(
"UPDATE user_rent_card SET have_rent_count=have_rent_count+%d ,can_rent_count=can_rent_count-%d WHERE uid = %d",
count, count, uid)
2022-01-27 14:24:29 +00:00
err = gdb.Exec(sql).Error
2022-01-26 08:02:21 +00:00
if err != nil {
logger.Error("err", err)
return err
}
return nil
}
2022-02-26 06:29:39 +00:00
func ShoppingCartCreateOrder(uid uint32, cards []CardInfo) {
cardIds := make([]uint64, 0, len(cards))
for i, _ := range cards {
cardIds = append(cardIds, uint64(cards[i].GameCardId))
}
err := NewShoppingCartQuerySet(DB).UidEq(uint64(uid)).GameCardIdIn(cardIds...).Delete()
if err != nil {
logger.Error("err:", err)
}
return
}
func ShoppingCartCreateOrderByOrder(order Order) {
var orderCards []OrderCard
err := NewOrderCardQuerySet(DB).OrderIdEq(order.ID).All(&orderCards)
if err != nil {
logger.Error("err:", err.Error())
}
cardIds := make([]uint64, 0, len(orderCards))
for i, _ := range orderCards {
cardIds = append(cardIds, uint64(orderCards[i].GameCardId))
}
err = NewShoppingCartQuerySet(DB).UidEq(uint64(order.Uid)).GameCardIdIn(cardIds...).Delete()
if err != nil {
logger.Error("err:", err)
}
return
}
func CreateUserRentCardByMemberLevel(uid, memberLevel, cardMax uint32) {
var userRentCard UserRentCard
err := NewUserRentCardQuerySet(DB).UidEq(uid).One(&userRentCard)
if err != nil && err != RecordNotFound {
logger.Error("UserRentCard err:", err)
return
}
if err == RecordNotFound {
userRentCard = UserRentCard{
Uid: uid,
MemberLevel: memberLevel,
LevelRentCount: cardMax,
HaveRentCount: 0,
CanRentCount: cardMax,
Status: 0,
}
err := DB.Create(&userRentCard).Error
if err != nil {
logger.Error("UserRentCard create err:", err)
}
return
}
_, err = NewUserRentCardQuerySet(DB).IDEq(userRentCard.ID).GetUpdater().
SetMemberLevel(memberLevel).
SetCanRentCount(cardMax - userRentCard.HaveRentCount).
SetLevelRentCount(cardMax).UpdateNum()
if err != nil {
logger.Error("update err:", err)
}
2022-03-26 03:25:15 +00:00
}
2022-02-26 06:29:39 +00:00
2022-03-26 03:25:15 +00:00
func MemberExpireDelaying(uid uint32) (map[string]interface{}, error) {
ret := make(map[string]interface{}, 0)
ret["is_surrender"] = 0
ret["expire_days"] = 0
ret["daily_fee"] = MemberExpireDelayDailyFee
ret["delay_amount"] = 0
var user User
err := NewUserQuerySet(DB).UidEq(uid).One(&user)
if err != nil {
logger.Error("user err:", err)
return ret, err
}
var userMemberExpireDelay UserMemberExpireDelay
err = NewUserMemberExpireDelayQuerySet(DB).UidEq(uid).MemberExpireEq(user.MemberExpire).One(&userMemberExpireDelay)
if err != nil && err != RecordNotFound {
logger.Error("user member expire delay err:", err)
return ret, err
}
if err == nil {
if userMemberExpireDelay.IsPay != 1 {
ret["is_surrender"] = 1
ret["expire_days"] = userMemberExpireDelay.ExpireDays
ret["daily_fee"] = userMemberExpireDelay.DailyFee
ret["delay_amount"] = userMemberExpireDelay.DelayAmount
}
return ret, nil
}
var orderCard OrderCard
err = NewOrderCardQuerySet(DB).UidEq(uid).CardStatusIn([]uint32{1, 2, 3, 4}...).OrderDescByOrderId().One(&orderCard)
2022-08-31 07:25:45 +00:00
if err != nil && err != RecordNotFound {
2022-03-26 03:25:15 +00:00
logger.Error("order card err:", err)
return ret, err
}
2022-08-31 07:25:45 +00:00
if err == RecordNotFound {
var order Order
err = NewOrderQuerySet(DB).UidEq(uint64(uid)).CardStatusIn([]uint8{1, 2, 3, 4}...).OrderDescByID().Limit(1).One(&order)
if err != nil && err != RecordNotFound {
logger.Error("order card err:", err)
return ret, err
}
orderCard.RevertTime = order.RevertTime
orderCard.CardStatus = uint32(order.CardStatus)
}
2022-03-26 03:25:15 +00:00
deadline := orderCard.RevertTime
2023-05-09 03:37:56 +00:00
if orderCard.CardStatus > 0 && orderCard.CardStatus != 4 {
2022-03-26 03:25:15 +00:00
deadline = time.Now()
}
if user.MemberLevel == 3 {
deadline = time.Unix(1647925200, 0)
}
if user.MemberExpire.AddDate(0, 0, 1).Before(deadline) {
days := (deadline.Unix() - user.MemberExpire.Unix()) / 24 / 3600
if user.MemberLevel != 3 || (user.MemberLevel == 3 && days > 7) {
ret["is_surrender"] = 1
ret["expire_days"] = days
ret["delay_amount"] = days * MemberExpireDelayDailyFee
delay := &UserMemberExpireDelay{
Uid: uid,
MemberExpire: user.MemberExpire,
DelayAmount: uint32(days) * MemberExpireDelayDailyFee,
ExpireDays: uint32(days),
DailyFee: MemberExpireDelayDailyFee,
IsPay: 0,
}
err := delay.Create(DB)
if err != nil {
logger.Error("delay create err:", err)
}
}
}
return ret, nil
2022-02-26 06:29:39 +00:00
}
2022-05-10 07:17:34 +00:00
func (m *OperationLog) AddLog() {
defer func() {
if err := recover(); err != nil {
fmt.Println("recover err:", err)
}
}()
go func() {
err := DB.Create(m).Error
if err != nil {
logger.Error("create operation log err:")
}
}()
}
type InviteMemberReportListReq struct {
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
Uid uint32 `json:"uid"`
}
type InviteMemberReportListResp struct {
CurPage int `json:"cur_page"`
TotalPage int `json:"total_page"`
Count int `json:"count"` // 总记录数
List []InviteMemberReport `json:"list"`
}
func (m *InviteMemberReportListReq) List() ([]InviteMemberReport, int, int, error) {
2022-05-10 07:17:34 +00:00
var memberReport []InviteMemberReport
qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid)
count, err := qs.Count()
if err != nil {
logger.Error("err:", err)
return memberReport, 0, 0, err
2022-05-10 07:17:34 +00:00
}
page := m.PageNum - 1
if page < 0 {
page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
totalPage := count/m.PageSize + 1
err = qs.Offset(page * m.PageSize).Limit(m.PageSize).OrderDescByID().All(&memberReport)
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return memberReport, totalPage, count, err
2022-05-10 07:17:34 +00:00
}
assistant := GetUserByUid(m.Uid)
cooperative := new(CooperativeBusiness)
cooperative.ID = assistant.CooperativeBusinessId
cooperative.SetAssistantMemberDeductConfig(uint32(assistant.StoreId))
2022-05-12 05:42:45 +00:00
fmt.Println("CooperativeBusinessId:", assistant.CooperativeBusinessId, assistant.StoreId)
fmt.Println("CooperativeAssistantMemberDeduct:", cooperative.CooperativeAssistantMemberDeduct)
2022-05-10 07:17:34 +00:00
if len(memberReport) > 0 {
memberReport[len(memberReport)-1].GoldDeduct = cooperative.CooperativeAssistantMemberDeduct.GoldDeduct
memberReport[len(memberReport)-1].PlatinumDeduct = cooperative.CooperativeAssistantMemberDeduct.PlatinumDeduct
memberReport[len(memberReport)-1].BlackGoldDeduct = cooperative.CooperativeAssistantMemberDeduct.BlackGoldDeduct
report := memberReport[len(memberReport)-1]
2022-05-12 05:42:45 +00:00
fmt.Println("report:", report)
2022-05-10 07:17:34 +00:00
memberReport[len(memberReport)-1].DeductAmount += report.GoldCount * report.GoldDeduct
memberReport[len(memberReport)-1].DeductAmount += report.PlatinumCount * report.PlatinumDeduct
memberReport[len(memberReport)-1].DeductAmount += report.BlackGoldCount * report.BlackGoldDeduct
}
return memberReport, totalPage, count, nil
2022-05-10 07:17:34 +00:00
}
2022-05-12 05:42:45 +00:00
func GetUserMap(ids []uint32) (map[uint32]*User, error) {
userMap := make(map[uint32]*User, 0)
2022-05-13 09:35:10 +00:00
if len(ids) == 0 {
return userMap, nil
}
2022-05-12 05:42:45 +00:00
var users []User
err := NewUserQuerySet(DB).UidIn(ids...).All(&users)
if err != nil {
logger.Error("user err:", err)
return userMap, err
}
for i, _ := range users {
userMap[users[i].Uid] = &users[i]
}
return userMap, nil
}
2022-05-28 06:18:27 +00:00
func (u *User) SetVm() error {
var userVm UserVm
err := NewUserVmQuerySet(DB).UidEq(u.Uid).One(&userVm)
if err != nil {
log.Error().Msgf("UserVm err:%#v", err)
return err
}
u.UserVm = &userVm
return nil
}
2022-06-03 03:30:03 +00:00
func UserInviteListSetToUser(list []UserInvite) {
2022-07-29 02:02:33 +00:00
//ids := make([]uint32, 0, len(list))
//for i, _ := range list {
// ids = append(ids, list[i].ToUid)
//}
//
//userMap, err := GetUserMap(ids)
//if err != nil {
// logger.Error("user map err:", err)
// return
//}
2022-06-03 03:30:03 +00:00
2022-07-29 02:02:33 +00:00
//for i, _ := range list {
// v, ok := userMap[list[i].ToUid]
// if ok {
//
// list[i].ToUser = &UserLess{
// Uid: v.Uid,
// MemberOpenTime: v.OpenMemberTime,
// MemberLevel: v.MemberLevel,
// }
// }
//}
2022-06-03 03:30:03 +00:00
}
2022-07-25 04:02:53 +00:00
// gen:qs
type MemberStatisticDaily struct {
Model
MemberLevel uint32 `json:"member_level"`
Date string `json:"date"`
DateTime time.Time `json:"date_time"`
Increase uint32 `json:"increase"`
Expire uint32 `json:"expire"`
Net uint32 `json:"net"`
Accumulative uint32 `json:"accumulative"`
}
2022-11-01 06:23:06 +00:00
// StorePromotion 记录促销情况
2022-11-01 06:23:06 +00:00
func StorePromotion(inviteUid, uid uint32, inviteUser, user *User) error {
//inviteUid := uint32(0)
//uid := uint32(0)
if inviteUser == nil {
inviteUser = GetUserByUid(inviteUid)
}
if user == nil {
user = GetUserByUid(uid)
}
if user == nil || inviteUser == nil {
logger.Error("user inviteUser is nil")
return errors.New("user inviteUser is nil")
}
// 目前在领取优惠券的时候做了邀请记录,这里不再重复记录
//if inviteUser.UserType == 2 && user.Uid != 0 { // 是店员邀请并且用户id不为空
// nowTime := time.Now()
// effectiveStoreInfo, err := GetUserEffectiveStore(inviteUid)
// if err != nil {
// return err
// }
//
// exist, err := QueryRecordExist(
// fmt.Sprintf("SELECT * FROM user_invite_record WHERE to_uid = %d AND from_uid = %d ",
// user.Uid, inviteUid))
// if err != nil {
// logger.Error("query err:", err)
// return err
// }
// if !exist {
// firstInviteRecord := &UserInviteRecord{
// ToUid: user.Uid,
// FromUid: inviteUid,
// StoreId: effectiveStoreInfo.StoreID,
// Action: 2, // 激活邀请
// SpendType: 1, // 未开通
// MemberLevel: 0, // 未开通会员
// First: 1, // 首次邀请
// Scan: 1,
// ActionTime: nowTime,
// }
// err = DB.Create(firstInviteRecord).Error
// if err != nil {
// logger.Error("create user invite record err:", err)
// }
// }
// // 扫码记录
// inviteRecord := &UserInviteRecord{
// ToUid: user.Uid,
// FromUid: inviteUid,
// StoreId: effectiveStoreInfo.StoreID,
// Action: 1, // 未激活
// SpendType: 1, // 未开通
// MemberLevel: 0,
// First: 0,
// Scan: 1,
// ActionTime: nowTime,
// }
// err = DB.Create(inviteRecord).Error
// if err != nil {
// logger.Error("create user invite record err:", err)
// }
// // UserInvite 邀请主要
// var inviteNew UserInvite
// inviteErr := NewUserInviteQuerySet(DB).ToUidEq(user.Uid).FromUidEq(inviteUid).ActionEq(1).
// SpendTypeEq(1).One(&inviteNew)
// if inviteErr != nil && inviteErr != RecordNotFound {
// // 是否存在未开通
// logger.Error("user invite err:", err)
// }
// //fmt.Println("inviteErr:", inviteErr)
// //fmt.Printf("inviteNew:%#v \n", inviteNew)
// if inviteErr == RecordNotFound {
// memberLevel := user.MemberLevel
// if memberLevel == 0 {
// memberLevel = MemberLevelUser
// }
// invite := &UserInvite{
// FromUid: inviteUid, // 邀请人用户id
// UserType: inviteUser.UserType, // 邀请人用户类型
// StoreId: effectiveStoreInfo.StoreID, // 邀请人门店id
// MemberOpenTime: nowTime, // 开通会员时间
// MemberType: memberLevel, // 被邀请用户类型
// MemberStatus: 1, // 被邀请用户会员状态 1-未开通
// ToUid: user.Uid, // 被邀请用户id
// Action: 1, // 未激活
// SpendType: 1, // 未开通
// UserInviteRecordId: inviteRecord.ID, // 邀请记录id
// FirstInvite: 0, // TODO 首次邀请id
// Scan: 1, // 扫码次数
// InviteForm: 1, // 1-店员邀请码续费
// }
// fmt.Println("创建邀请:", invite)
// if err := invite.Create(DB); err != nil {
// logger.Error(err)
// return err
// }
// }
//
// if inviteErr == nil {
// err = NewUserInviteQuerySet(DB).IDEq(inviteNew.ID).GetUpdater().SetCreatedAt(nowTime).
// SetUserInviteRecordId(inviteRecord.ID).SetInviteForm(1).Update()
// if err != nil {
// logger.Error("from uid update user invite err:", err, inviteUid)
// }
// }
//}
2022-11-01 06:23:06 +00:00
return nil
}
2023-07-14 09:29:05 +00:00
func GetMemberGenreFromLevel(level uint32) uint32 {
switch level {
case 4: //白金
2023-07-14 09:29:05 +00:00
return 400
case 5: //黑金
2023-07-14 09:29:05 +00:00
return 500
}
return 0
}
2022-11-01 06:23:06 +00:00
//// todo
//var userCoupon model.UserCoupon
//err := model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).One(&userCoupon)
//if err != nil {
//logger.Error("user coupon err:", err)
//}
// // UserInviteRecord
// // user_invite
// if userCoupon.PromotionalSales == 0 {
// logger.Error("promotional sales is null")
// } else {
// inviteCouponUser := model.GetUserByUid(userCoupon.PromotionalSales)
// if inviteCouponUser != nil {
// userCouponInvite := &model.UserInvite{
// FromUid: userCoupon.PromotionalSales,
// UserType: inviteCouponUser.UserType, // user.UserType
// StoreId: inviteCouponUser.StoreId,
// MemberOpenTime: newTime,
// MemberType: 2,
// MemberStatus: 2,
// ToUid: user.Uid,
// StoreType: inviteCouponUser.StoreType,
// Action: 1,
// SpendType: spendType,
// MemberLevel: record.MemberLevel,
// UserInviteRecordId: 0,
// FirstInvite: 1,
// }
//
// err = userCouponInvite.Create(model.DB)
// if err != nil {
// logger.Error("create user coupon invite err:", err)
// }
// }
// }
type MemberType int
const (
Unknown MemberType = iota
FirstInvite // 1-首次邀请
OpenAnnualGold // 2-开通年费黄金
OpenQuarterGold // 3-开通季度黄金
OpenHalfYearGold // 4-开通半年黄金
OpenAnnualPlatinum // 5-开通年费白金
OpenAnnualBlack // 6-开通年费黑金
RenewAnnualGoldIntervene // 7-续费年费黄金(干预)
RenewAnnualPlatinumIntervene // 8-续费年费白金(干预)
RenewAnnualBlackIntervene // 9-续费年费黑金(干预)
RenewAnnualGoldAuto // 10-续费年费黄金(自动)
RenewQuarterGoldAuto // 11-续费季度黄金(自动)
RenewHalfYearGoldAuto // 12-续费半年黄金(自动)
RenewAnnualPlatinumAuto // 13-续费年费白金(自动)
RenewAnnualBlackAuto // 14-续费年费黑金(自动)
UpgradeGoldToPlatinumIntervene // 15-黄金→白金(干预)
UpgradeGoldToBlackIntervene // 16-黄金→黑金(干预)
UpgradePlatinumToBlackIntervene // 17-白金→黑金(干预)
UpgradeGoldToPlatinumAuto // 18-黄金→白金(自动)
UpgradeGoldToBlackAuto // 19-黄金→黑金(自动)
UpgradePlatinumToBlackAuto // 20-白金→黑金(自动)
)
type NewUserInviteRecordReq struct {
PageNum int `json:"pageIndex"`
PageSize int `json:"pageSize"`
FromUid uint32 `json:"from_uid"` // 邀请人ID
ToUid uint32 `json:"to_uid"` // 用户ID
RecordType []uint32 `json:"record_type"` // 记录类型 1-首次邀请2-开通年费黄金3-开通季度黄金4-开通半年黄金, 5-开通年费白金6-开通年费黑金7-续费年费黄金干预8-续费年费白金干预9-续费年费黑金干预10-续费年费黄金(自动), 11-续费季度黄金自动12-续费半年黄金自动13-续费年费白金自动14-续费年费黑金自动15-黄金→白金(干预), 16-黄金→黑金干预17-白金→黑金干预18-黄金→白金自动19-黄金→黑金自动20-白金→黑金(自动)
RecordStartTime time.Time `json:"record_start_time"` // 记录时间-开始时间
RecordEndTime time.Time `json:"record_end_time"` // 记录时间-结束时间
}
type UserInviteRecordListResp struct {
Count int `json:"count"` // 总记录数
PageIndex int `json:"pageIndex"` // 页码
List []UserInviteRecordListData `json:"list"`
}
type UserInviteRecordListData struct {
InviteUid uint32 `json:"invite_uid"` // 邀请人ID
UserUid uint32 `json:"user_uid"` // 用户ID
RecordType uint32 `json:"record_type"` // 记录类型
RecordTime time.Time `json:"record_time"` // 记录时间
MemberLevel uint32 `json:"member_level"` // 会员等级1-普通 2-黄金 4-白金 5-黑金
}
func UpdateUserInviteRecordRenewHide() error {
err := NewUserInviteRecordQuerySet(DB).SpendTypeEq(3).ScanEq(0).RenewHideNe(1).
GetUpdater().SetRenewHide(1).Update()
if err != nil {
logger.Errorf("update renew_hide err:", err)
return err
}
return nil
}
func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
var records []UserInviteRecord
err := UpdateUserInviteRecordRenewHide()
if err != nil {
logger.Errorf("err:", err)
return nil, err
}
page := m.PageNum - 1
pageSize := m.PageSize
if page < 0 {
page = 0
}
if pageSize == 0 {
pageSize = 10
}
qs := NewUserInviteRecordQuerySet(DB).ActionEq(2)
if m.FromUid != 0 {
qs = qs.FromUidEq(m.FromUid)
}
if m.ToUid != 0 {
qs = qs.ToUidEq(m.ToUid)
}
//if m.RecordType != 0 {
// switch m.RecordType {
// case 1: // 首次邀请
// qs = qs.FirstEq(1).SpendTypeEq(1)
// case 2: // 开通年费黄金
// qs = qs.MemberLevelEq(2).SpendTypeEq(2)
// case 3: // 开通季度黄金
// qs = qs.MemberLevelEq(2).SpendTypeEq(2).MemberGenreEq(201)
// case 4: // 开通半年黄金
// qs = qs.MemberLevelEq(2).SpendTypeEq(2).MemberGenreEq(202)
// case 5: // 开通年费白金
// qs = qs.MemberLevelEq(4).SpendTypeEq(2)
// case 6: // 开通年费黑金
// qs = qs.MemberLevelEq(5).SpendTypeEq(2)
//
// case 7: // 续费年费黄金(干预)
// qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(0)
// case 8: // 续费年费白金(干预)
// qs = qs.MemberLevelEq(4).SpendTypeEq(3).RenewHideEq(0)
// case 9: // 续费年费黑金(干预)
// qs = qs.MemberLevelEq(5).SpendTypeEq(3).RenewHideEq(0)
//
// case 10: // 续费年费黄金(自动)
// qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1)
// case 11: // 续费季度黄金(自动)
// qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1).
// MemberGenreEq(201)
// case 12: // 续费半年黄金(自动)
// qs = qs.MemberLevelEq(2).SpendTypeEq(3).RenewHideEq(1).
// MemberGenreEq(202)
// case 13: // 续费年费白金(自动)
// qs = qs.MemberLevelEq(4).SpendTypeEq(3).RenewHideEq(1)
// case 14: // 续费年费黑金(自动)
// qs = qs.MemberLevelEq(5).SpendTypeEq(3).RenewHideEq(1)
//
// case 15: //黄金→白金(干预)
// qs = qs.MemberLevelEq(4).SpendTypeEq(4).RenewHideEq(0)
// case 16: //黄金→黑金(干预)
// qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(0).
// MemberGenreIn(200, 201, 202)
// case 17: //白金→黑金(干预)
// qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(0).
// MemberGenreNotIn(200, 201, 202)
//
// case 18: //黄金→白金(自动)
// qs = qs.MemberLevelEq(4).SpendTypeEq(4).RenewHideEq(1)
// case 19: //黄金→黑金(自动)
// qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(1).
// MemberGenreIn(200, 201, 202)
// case 20: //白金→黑金(自动)
// qs = qs.MemberLevelEq(5).SpendTypeEq(4).RenewHideEq(1).
// MemberGenreNotIn(200, 201, 202)
// }
//}
if len(m.RecordType) != 0 {
var recordTypeConditions []string
for _, t := range m.RecordType {
switch t {
case 1:
recordTypeConditions = append(recordTypeConditions, "(first=1 AND spend_type=1)")
case 2:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2)")
case 3:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2 AND user_invite_record.member_genre=201)")
case 4:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2 AND user_invite_record.member_genre=202)")
case 5:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=2)")
case 6:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=2)")
case 7:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=0)")
case 8:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=3 AND renew_hide=0)")
case 9:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=3 AND renew_hide=0)")
case 10:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1)")
case 11:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1 AND user_invite_record.member_genre=201)")
case 12:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1 AND user_invite_record.member_genre=202)")
case 13:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=3 AND renew_hide=1)")
case 14:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=3 AND renew_hide=1)")
case 15:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=4 AND renew_hide=0)")
case 16:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=0 AND user_invite_record.member_genre in (200,201,202))")
case 17:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=0 AND user_invite_record.member_genre not in (200,201,202))")
case 18:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=4 AND renew_hide=1)")
case 19:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=1 AND user_invite_record.member_genre in (200,201,202))")
case 20:
recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=1 AND user_invite_record.member_genre not in (200,201,202))")
}
}
// 拼接多选条件
if len(recordTypeConditions) > 0 {
recordTypeQuery := strings.Join(recordTypeConditions, " OR ")
qs = qs.Where(recordTypeQuery)
}
}
if !m.RecordStartTime.IsZero() {
qs = qs.ActionTimeGte(m.RecordStartTime)
}
if !m.RecordEndTime.IsZero() {
qs = qs.ActionTimeLte(m.RecordStartTime)
}
err = qs.Select("user_invite_record.*").OrderDescByActionTime().Offset(page * pageSize).
Limit(pageSize).All(&records)
if err != nil && err != RecordNotFound {
logger.Errorf("err:", err)
return nil, err
}
var count int
count, err = qs.Count()
if err != nil {
logger.Errorf("err:", err)
return nil, err
}
resp := new(UserInviteRecordListResp)
var listData []UserInviteRecordListData
for _, item := range records {
data := UserInviteRecordListData{
InviteUid: item.FromUid,
UserUid: item.ToUid,
RecordType: uint32(CalculateMemberType(item.SpendType, item.RenewHide, item.MemberGenre, item.MemberLevel)),
RecordTime: item.ActionTime,
MemberLevel: item.MemberLevel,
}
listData = append(listData, data)
}
resp.List = listData
resp.PageIndex = m.PageNum
resp.Count = count
return resp, nil
}
// CalculateMemberType 匹配记录类型
func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) MemberType {
switch {
case spendType == 1:
return FirstInvite
case spendType == 2:
switch memberLevel {
case 2:
return OpenAnnualGold
case 4:
return OpenAnnualPlatinum
case 5:
return OpenAnnualBlack
}
case spendType == 3 && renewHide == 0:
switch memberLevel {
case 2:
return RenewAnnualGoldIntervene
case 4:
return RenewAnnualPlatinumIntervene
case 5:
return RenewAnnualBlackIntervene
}
case spendType == 3 && renewHide == 1:
switch memberLevel {
case 2:
return RenewAnnualGoldAuto
case 4:
return RenewAnnualPlatinumAuto
case 5:
return RenewAnnualBlackAuto
}
case spendType == 4 && renewHide == 0:
switch memberLevel {
case 4:
return UpgradeGoldToPlatinumIntervene
case 5:
if memberGenre == 200 || memberGenre == 201 || memberGenre == 202 {
return UpgradeGoldToBlackIntervene
}
return UpgradePlatinumToBlackIntervene
}
case spendType == 4 && renewHide == 1:
switch memberLevel {
case 4:
return UpgradeGoldToPlatinumAuto
case 5:
if memberGenre == 200 {
return UpgradeGoldToBlackAuto
}
return UpgradePlatinumToBlackAuto
}
case spendType == 2 && memberLevel == 2 && memberGenre == 201:
return OpenQuarterGold
case spendType == 2 && memberLevel == 2 && memberGenre == 202:
return OpenHalfYearGold
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 201:
return RenewQuarterGoldAuto
case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 202:
return RenewHalfYearGoldAuto
}
return Unknown
}