332 lines
10 KiB
Go
332 lines
10 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/codinl/go-logger"
|
|
"github.com/xuri/excelize/v2"
|
|
orm "go-admin/common/global"
|
|
"time"
|
|
)
|
|
|
|
//go:generate goqueryset -in analyse.go
|
|
|
|
type Statistic struct {
|
|
Model
|
|
|
|
Count uint32 `json:"count"` // 计数
|
|
Type uint32 `json:"type" gorm:"index"` // 类型:1-
|
|
|
|
}
|
|
|
|
const (
|
|
UserRenewalLogActionPop = 1 // 弹窗
|
|
UserRenewalLogActionEnterActivity = 2 // 进入活动
|
|
UserRenewalLogActionPickGold = 3 // 领取黄金会员
|
|
UserRenewalLogActionPickPlatinum = 4 // 领取白金会员
|
|
UserRenewalLogActionPickBlackGold = 5 // 领取黑金会员
|
|
UserRenewalLogActionUseGold = 6 // 使用黄金会员
|
|
UserRenewalLogActionUsePlatinum = 7 // 使用白金会员
|
|
UserRenewalLogActionUseBlackGold = 8 // 使用黑金会员
|
|
UserRenewalLogSendMessage = 9 // 发送短信
|
|
)
|
|
|
|
// gen:qs
|
|
type UserRenewalLog struct {
|
|
Model
|
|
|
|
Uid uint32 `json:"uid"`
|
|
Action uint32 `json:"action"`
|
|
MemberExpire time.Time `json:"member_expire"`
|
|
Type uint32 `json:"type"` // 类型:1-续费 2-升级
|
|
RenewalNum uint32 `json:"renewal_num"`
|
|
Serial uint32 `json:"serial"`
|
|
// user_renewal_log
|
|
}
|
|
|
|
func (l *UserRenewalLog) Add() error {
|
|
err := orm.Eloquent.Create(l).Error
|
|
if err != nil {
|
|
logger.Error("user log add err:", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetActionUserRenewalLog(uid, action uint32) (UserRenewalLog, error) {
|
|
var userRenewalLog UserRenewalLog
|
|
err := orm.Eloquent.Table("user_renewal_log").Where("uid=?", uid).Where("action").
|
|
Order("id DESC").Limit(1).Find(&userRenewalLog).Error
|
|
//err := NewUserRenewalLogQuerySet(DB).UidEq(uid).ActionEq(action).OrderDescByID().Limit(1).One(&userRenewalLog)
|
|
if err != nil && err != RecordNotFound {
|
|
logger.Error("user renewal log err:", err)
|
|
return userRenewalLog, err
|
|
}
|
|
return userRenewalLog, nil
|
|
}
|
|
|
|
func GetActionUserRenewalLogMulti(uids []uint32, action uint32) ([]UserRenewalLog, error) {
|
|
var userRenewalLogs []UserRenewalLog
|
|
err := orm.Eloquent.Table("user_renewal_log").Where("uid IN (?)", uids).Where("action=?", action).
|
|
Order("id DESC").Limit(1).Find(&userRenewalLogs).Error
|
|
//err := NewUserRenewalLogQuerySet(DB).UidEq(uid).ActionEq(action).OrderDescByID().Limit(1).One(&userRenewalLog)
|
|
if err != nil && err != RecordNotFound {
|
|
logger.Error("user renewal log err:", err)
|
|
return userRenewalLogs, err
|
|
}
|
|
return userRenewalLogs, nil
|
|
}
|
|
|
|
// gen:qs
|
|
type UserMemberRecord struct {
|
|
Model
|
|
Uid uint32 `json:"uid" gorm:"index"`
|
|
BeforeMemberLevel uint32 `json:"before_member_level"`
|
|
AfterMemberLevel uint32 `json:"after_member_level"`
|
|
BeforeMemberExpire time.Time `json:"before_member_expire"`
|
|
AfterMemberExpire time.Time `json:"after_member_expire"`
|
|
InviteUid uint32 `json:"invite_uid" gorm:"index"`
|
|
DeductionDays uint32 `json:"deduction_days"` // 抵扣天数
|
|
DeductionFee uint32 `json:"deduction_fee"` // 抵扣金额
|
|
CouponId uint32 `json:"coupon_id"` // 优惠券id
|
|
Serial uint32 `json:"serial" gorm:"index"` // 日志
|
|
Type uint32 `json:"type" gorm:"index"` // 1-开通黄金 2-开通白金 3-开通黑金 4-续费黄金 5-续费白金 6-续费黑金 7-升级白金 8-升级黑金
|
|
OpenMemberLevel uint32 `json:"open_member_level"`
|
|
OpenMemberTime time.Time `json:"open_member_time"`
|
|
RegisterTime time.Time `json:"register_time" gorm:"-"`
|
|
UserInfo *UserInfo `json:"user_info" gorm:"-"`
|
|
MemberLevel uint32 `json:"member_level" gorm:"-"`
|
|
MemberExpire time.Time `json:"member_expire" gorm:"-"` // 会员到期时间
|
|
// user_member_record
|
|
}
|
|
|
|
type UserMemberRecordReq struct {
|
|
Uid uint32 `json:"uid"`
|
|
OpenMemberLevel uint32 `json:"open_member_level"` // 开通等级
|
|
RenewalMemberLevel uint32 `json:"renewal_member_level"` // 续费等级
|
|
MemberLevel uint32 `json:"member_level"` // 当前等级
|
|
RenewalStartTime time.Time `json:"renewal_start_time"` // 续费开始时间
|
|
RenewalEndTime time.Time `json:"renewal_end_time"` // 续费结束时间
|
|
OpenStartTime time.Time `json:"open_start_time"` // 开通开始时间
|
|
OpenEndTime time.Time `json:"open_end_time"` // 开通结束时间
|
|
PageIndex int `json:"pageIndex"`
|
|
PageSize int `json:"pageSize"`
|
|
}
|
|
|
|
func (m *UserMemberRecordReq) List() ([]UserMemberRecord, int64, error) {
|
|
m.PageIndex -= 1
|
|
if m.PageIndex < 0 {
|
|
m.PageIndex = 0
|
|
}
|
|
if m.PageSize == 0 {
|
|
m.PageSize = 10
|
|
}
|
|
var records []UserMemberRecord
|
|
qs := orm.Eloquent.Table("user_member_record")
|
|
if m.Uid != 0 {
|
|
qs = qs.Where("uid=?", m.Uid)
|
|
}
|
|
if m.OpenMemberLevel != 0 {
|
|
if m.OpenMemberLevel == 1000 {
|
|
qs = qs.Where("type IN (1,2,3)")
|
|
} else {
|
|
qs = qs.Where("type=?", m.OpenMemberLevel)
|
|
}
|
|
}
|
|
if m.RenewalMemberLevel != 0 {
|
|
if m.RenewalMemberLevel == 1001 {
|
|
qs = qs.Where("type IN (4,5,6)")
|
|
} else {
|
|
qs = qs.Where("type=?", m.RenewalMemberLevel)
|
|
//qs = qs.Where("type=?", TypeToRenewalMemberLevel(m.RenewalMemberLevel))
|
|
}
|
|
}
|
|
|
|
if m.MemberLevel != 0 {
|
|
var users []UserInfo
|
|
err := orm.Eloquent.Table("user").Where("member_level=?", m.MemberLevel).Find(&users).Error
|
|
if err != nil {
|
|
logger.Error("user info err:", err)
|
|
}
|
|
ids := make([]uint32, 0, len(users))
|
|
for i, _ := range users {
|
|
ids = append(ids, users[i].Uid)
|
|
}
|
|
if len(ids) > 0 {
|
|
qs = qs.Where("uid IN (?)", ids)
|
|
}
|
|
}
|
|
|
|
if !m.RenewalStartTime.IsZero() {
|
|
qs = qs.Where("created_at > ?", m.RenewalStartTime)
|
|
}
|
|
if !m.RenewalEndTime.IsZero() {
|
|
qs = qs.Where("created_at < ?", m.RenewalEndTime)
|
|
}
|
|
if !m.OpenStartTime.IsZero() {
|
|
qs = qs.Where("open_member_time > ?", m.OpenStartTime)
|
|
}
|
|
if !m.OpenEndTime.IsZero() {
|
|
qs = qs.Where("open_member_time < ?", m.OpenEndTime)
|
|
}
|
|
var count int64
|
|
err := qs.Count(&count).Error
|
|
if err != nil {
|
|
logger.Error("count error:", err)
|
|
return records, count, err
|
|
}
|
|
|
|
err = qs.Order("id DESC").Offset(m.PageIndex * m.PageSize).Limit(m.PageSize).Find(&records).Error
|
|
if err != nil && err != RecordNotFound {
|
|
logger.Error("record error:", err)
|
|
return records, count, err
|
|
}
|
|
UserMemberRecordListSetUser(records)
|
|
|
|
return records, count, nil
|
|
}
|
|
|
|
func (m *UserMemberRecordReq) Export() (string, error) {
|
|
|
|
var records []UserMemberRecord
|
|
qs := orm.Eloquent.Table("user_member_record")
|
|
if m.Uid != 0 {
|
|
qs = qs.Where("uid=?", m.Uid)
|
|
}
|
|
if m.OpenMemberLevel != 0 {
|
|
qs = qs.Where("open_member_level=?", m.OpenMemberLevel)
|
|
}
|
|
if m.RenewalMemberLevel != 0 {
|
|
qs = qs.Where("after_member_level=?", m.RenewalMemberLevel)
|
|
}
|
|
if m.MemberLevel != 0 {
|
|
var users []UserInfo
|
|
err := orm.Eloquent.Table("user").Where("member_level=?", m.MemberLevel).Find(&users).Error
|
|
if err != nil {
|
|
logger.Error("user info err:", err)
|
|
}
|
|
ids := make([]uint32, 0, len(users))
|
|
for i, _ := range users {
|
|
ids = append(ids, users[i].Uid)
|
|
}
|
|
if len(ids) > 0 {
|
|
qs = qs.Where("uid IN (?)", ids)
|
|
}
|
|
}
|
|
|
|
if !m.RenewalStartTime.IsZero() {
|
|
qs = qs.Where("created_at > ?", m.RenewalStartTime)
|
|
}
|
|
if !m.RenewalEndTime.IsZero() {
|
|
qs = qs.Where("created_at < ?", m.RenewalEndTime)
|
|
}
|
|
if !m.OpenStartTime.IsZero() {
|
|
qs = qs.Where("open_member_time > ?", m.OpenStartTime)
|
|
}
|
|
if !m.OpenEndTime.IsZero() {
|
|
qs = qs.Where("open_member_time < ?", m.OpenEndTime)
|
|
}
|
|
|
|
err := qs.Order("id DESC").Find(&records).Error
|
|
if err != nil && err != RecordNotFound {
|
|
logger.Error("record error:", err)
|
|
return "", err
|
|
}
|
|
UserMemberRecordListSetUser(records)
|
|
|
|
file := excelize.NewFile()
|
|
streamWriter, err := file.NewStreamWriter("Sheet1")
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
|
|
//url := "http://39.108.188.218:8000/img/export/"
|
|
//f, err := os.OpenFile(fmt.Sprintf("/www/server/images/export/")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
|
|
|
|
fileName := "用户会员记录" + time.Now().Format("2006-01-02 15:04:05") + ".xlsx"
|
|
|
|
//title := []interface{}{"时间", "新增会员数", "会员过期数", "净增会员数", "累计会员数"}
|
|
title := []interface{}{"用户ID", "注册时间", "开通类型", "开通时间", "续费类型", "续费时间", "当前类型", "会员到期时间"}
|
|
cell, _ := excelize.CoordinatesToCellName(1, 1)
|
|
if err = streamWriter.SetRow(cell, title); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
var row []interface{}
|
|
for rowId := 0; rowId < len(records); rowId++ {
|
|
row = []interface{}{records[rowId].Uid, records[rowId].RegisterTime.Format("2006.01.02"),
|
|
MemberLevelToString(records[rowId].OpenMemberLevel), records[rowId].OpenMemberTime.Format("2006.01.02"),
|
|
records[rowId].TypeToString(), records[rowId].CreatedAt.Format("2006.01.02"), MemberLevelToString(records[rowId].MemberLevel), records[rowId].MemberExpire.Format("2006.01.02")}
|
|
cell, _ := excelize.CoordinatesToCellName(1, rowId+2)
|
|
if err := streamWriter.SetRow(cell, row); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
}
|
|
if err := streamWriter.Flush(); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
//if err := file.SaveAs("/www/server/images/export/Book1.xlsx"); err != nil {
|
|
if err := file.SaveAs("/www/server/images/export/" + fileName); err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
|
|
return ExportUrl + fileName, nil
|
|
}
|
|
|
|
func UserMemberRecordListSetUser(list []UserMemberRecord) {
|
|
ids := make([]uint32, 0)
|
|
for i, _ := range list {
|
|
ids = append(ids, list[i].Uid)
|
|
}
|
|
infoMap, err := GetUserInfoMap(ids)
|
|
if err != nil {
|
|
logger.Error("get user info map err:", err)
|
|
return
|
|
}
|
|
|
|
for i, _ := range list {
|
|
v, ok := infoMap[list[i].Uid]
|
|
if ok {
|
|
//list[i].UserInfo = &v
|
|
list[i].RegisterTime = v.CreatedAt
|
|
list[i].MemberLevel = v.MemberLevel
|
|
list[i].MemberExpire = *v.MemberExpire
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *UserMemberRecord) TypeToString() string {
|
|
//// 1-开通黄金 2-开通白金 3-开通黑金 4-续费黄金 5-续费白金 6-续费黑金 7-升级白金 8-升级黑金
|
|
switch m.Type {
|
|
case 1:
|
|
return "开通黄金"
|
|
case 2:
|
|
return "开通白金"
|
|
case 3:
|
|
return "开通黑金"
|
|
case 4:
|
|
return "续费黄金"
|
|
case 5:
|
|
return "续费白金"
|
|
case 6:
|
|
return "续费黑金"
|
|
case 7:
|
|
return "升级白金"
|
|
case 8:
|
|
return "升级黑金"
|
|
}
|
|
|
|
return ""
|
|
}
|
|
func TypeToRenewalMemberLevel(level uint32) uint32 {
|
|
//// 1-开通黄金 2-开通白金 3-开通黑金 4-续费黄金 5-续费白金 6-续费黑金 7-升级白金 8-升级黑金
|
|
switch level {
|
|
case 1:
|
|
return 4
|
|
case 2:
|
|
return 5
|
|
case 3:
|
|
return 6
|
|
}
|
|
|
|
return 0
|
|
}
|