2398 lines
72 KiB
Go
2398 lines
72 KiB
Go
|
package models
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/csv"
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"github.com/xuri/excelize/v2"
|
|||
|
"go-admin/app/admin/apis/pay"
|
|||
|
utils "go-admin/app/admin/models/tools"
|
|||
|
orm "go-admin/common/global"
|
|||
|
"go-admin/logger"
|
|||
|
"go-admin/pkg/jwtauth"
|
|||
|
"go-admin/tools/app"
|
|||
|
"log"
|
|||
|
"net/http"
|
|||
|
"os"
|
|||
|
"sort"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// gen:qs
|
|||
|
//
|
|||
|
//go:generate goqueryset -in user.go
|
|||
|
type UserInfo struct {
|
|||
|
Model
|
|||
|
|
|||
|
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"`
|
|||
|
MemberLevel uint32 `json:"memberLevel"` // 会员等级 1-会员
|
|||
|
MemberExpire time.Time `json:"memberExpire"` // 会员到期时间
|
|||
|
OpenMemberTime time.Time `json:"open_member_time"` // 开通会员
|
|||
|
Bond uint32 `json:"bond"` // 保证金
|
|||
|
WxName string `json:"wxName"` // 昵称
|
|||
|
WxAvatar string `json:"wxAvatar"` // 头像
|
|||
|
WxOpenID string `json:"wxOpenID"`
|
|||
|
AppOpenID string `json:"appOpenID"`
|
|||
|
WxUnionID string `json:"wxUnionID"`
|
|||
|
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 uint8 `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"` // 分享二维码
|
|||
|
MemberOpenTime time.Time `json:"member_open_time" gorm:"-"` //
|
|||
|
LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间
|
|||
|
IP string `json:"-" gorm:"type:varchar(60)"` // ip
|
|||
|
InBlack bool `json:"in_black"` // 是否在黑名单
|
|||
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
|
|||
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
|||
|
Version uint32 `json:"-"`
|
|||
|
MemberStatus uint8 `json:"member_status" gorm:"-"`
|
|||
|
InviteTime time.Time `json:"invite_time"`
|
|||
|
ShopAssistantName string `json:"shop_assistant_name"` // 店员名称
|
|||
|
RenewalTime time.Time `json:"renewal_time"`
|
|||
|
RenewalMemberLevel uint32 `json:"renewal_member_level"`
|
|||
|
|
|||
|
Store *Store `json:"store" gorm:"-"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserInfo) TableName() string {
|
|||
|
return "user"
|
|||
|
}
|
|||
|
|
|||
|
const (
|
|||
|
UserTypeConsumer = 1 // 普通用户
|
|||
|
UserTypeShopAssistant = 2 // 店员
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
OpenMemberChannelStorePromotion = "store_promotion" // 门店推荐
|
|||
|
OpenMemberChannelUserInvite = "user_invite"
|
|||
|
OpenMemberChannelRedeemCode = "redeem_code"
|
|||
|
)
|
|||
|
|
|||
|
const DateTimeFormat = "2006-01-02"
|
|||
|
const TimeFormat = "2006-01-02 15:04:05"
|
|||
|
|
|||
|
const (
|
|||
|
ExportUrl = "https://dev.admin.deovo.com/load/export/"
|
|||
|
)
|
|||
|
|
|||
|
type UserInvite struct {
|
|||
|
Model
|
|||
|
|
|||
|
FromUid uint32 `json:"from_uid"` // 邀请用户id
|
|||
|
UserType uint8 `json:"user_type"` // 用户类型
|
|||
|
StoreId uint64 `json:"store_id"` // 门店id
|
|||
|
MemberOpenTime time.Time `json:"member_open_time"` // 开通会员
|
|||
|
MemberType uint8 `json:"member_type"` // 被邀请用户 1-普通用户 2-会员
|
|||
|
MemberStatus uint8 `json:"member_status"` // 被邀请用户 1-未开通 2-已开通 3-已取消会员
|
|||
|
ToUid uint32 `json:"to_uid"` // 被邀请用户
|
|||
|
StoreType uint32 `json:"store_type"` // 门店类型
|
|||
|
Action uint32 `json:"action"` // 2-激活邀请
|
|||
|
SpendType uint32 `json:"spend_type"` // 1-开通会员 2-续费 3-升级
|
|||
|
MemberLevel uint32 `json:"member_level"` // 会员等级
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserInvite) TableName() string {
|
|||
|
return "user_invite"
|
|||
|
}
|
|||
|
|
|||
|
const (
|
|||
|
DepositRefundStatusUnconfirmed = 1 // 待确认
|
|||
|
DepositRefundStatusConfirmed = 2 // 已确认
|
|||
|
DepositRefundStatusRefunded = 3 // 已退款
|
|||
|
DepositRefundStatusRefused = 4 // 已拒绝
|
|||
|
)
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type DepositRefundRecord struct {
|
|||
|
Model
|
|||
|
|
|||
|
Uid uint32 `json:"uid"`
|
|||
|
Status uint32 `json:"status"` // unconfirmed confirmed refunded
|
|||
|
Amount uint32 `json:"amount"`
|
|||
|
Operator uint32 `json:"operator"` // 操作者
|
|||
|
ConfirmTime time.Time `json:"confirm_time"`
|
|||
|
User User `json:"user" gorm:"-"`
|
|||
|
}
|
|||
|
|
|||
|
const (
|
|||
|
//FundTypeMemberGold = "member_gold" // 黄金会员
|
|||
|
//FundTypeMemberPlatinum = "member_platinum" // 白金会员
|
|||
|
//FundTypeMemberBlackGold = "member_black_gold" // 黑金会员
|
|||
|
//FundTypeMemberGoldDeposit = "member_gold_deposit" // 黄金会员押金
|
|||
|
//FundTypeMemberPlatinumDeposit = "member_platinum_deposit" // 白金会员押金
|
|||
|
//FundTypeMemberBlackGoldDeposit = "member_black_gold_platinum" // 黑金会员押金
|
|||
|
//FundTypeExpressFee = "express_fee" // 邮费
|
|||
|
//FundTypeUpgradeMember = "upgrade_member" // 升级会员
|
|||
|
//FundTypeMemberExpireDelay = "member_expire_delay" // 滞纳金
|
|||
|
|
|||
|
FundTypeMemberFee = "member_fee" // 会员费
|
|||
|
FundTypeMemberDeposit = "member_deposit" // 押金
|
|||
|
FundTypeExpressFee = "express_fee" // 邮费
|
|||
|
FundTypeUpgradeMember = "upgrade_member" // 升级会员
|
|||
|
FundTypeMemberExpireDelay = "member_expire_delay" // 滞纳金
|
|||
|
FundTypeDepositRefund = "deposit_refund" // 退押金
|
|||
|
FundTypeExpressFeeRefund = "express_fee_refund" // 退邮费
|
|||
|
FundTypeRecycleCard = "recycle_card" // 回收卡带
|
|||
|
)
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type FundRecord struct {
|
|||
|
Model
|
|||
|
Uid uint32 `json:"uid" gorm:"index"`
|
|||
|
FundType string `json:"fund_type" gorm:"index"` // -member_gold -member_platinum -member_black_gold
|
|||
|
Amount int64 `json:"amount"`
|
|||
|
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"` // 备注
|
|||
|
|
|||
|
// fund_record
|
|||
|
}
|
|||
|
|
|||
|
type XcxRole struct {
|
|||
|
Model
|
|||
|
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:"-"`
|
|||
|
// xcx_role
|
|||
|
}
|
|||
|
|
|||
|
const (
|
|||
|
OperationTypeRentCardRevert = "rent_card_revert"
|
|||
|
OperationTypeRentCardDeliver = "rent_card_deliver"
|
|||
|
OperationTypeMallOrderRefundSendReceive = "mall_goods_order_refund_receive" // 退货入库
|
|||
|
)
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type OperationLog struct {
|
|||
|
Model
|
|||
|
Uid uint32 `json:"uid" gorm:"index"` // 店员id
|
|||
|
SysUid uint32 `json:"sys_uid" gorm:"index"`
|
|||
|
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"` // 备注
|
|||
|
}
|
|||
|
|
|||
|
func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativeBusinessId int, tel, startTime, endTime, nameKey string) ([]UserInfo, uint32, uint32, error) {
|
|||
|
var (
|
|||
|
users = make([]UserInfo, 0)
|
|||
|
totalPage uint32
|
|||
|
)
|
|||
|
fmt.Println("tel:", tel)
|
|||
|
fmt.Println("nameKey:", nameKey)
|
|||
|
|
|||
|
page -= 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
user := &UserInfo{}
|
|||
|
qs := orm.Eloquent.Table(user.TableName()).Debug()
|
|||
|
|
|||
|
if tel != "" {
|
|||
|
qs = qs.Where("tel", tel)
|
|||
|
}
|
|||
|
if uid != 0 {
|
|||
|
qs = qs.Where("uid", uid)
|
|||
|
}
|
|||
|
if memberLevel != 0 {
|
|||
|
qs = qs.Where("member_level", memberLevel)
|
|||
|
}
|
|||
|
if storeId != 0 {
|
|||
|
qs = qs.Where("store_id", storeId)
|
|||
|
}
|
|||
|
if userType != 0 {
|
|||
|
qs = qs.Where("user_type", userType)
|
|||
|
}
|
|||
|
if cooperativeBusinessId != 0 {
|
|||
|
qs = qs.Where("cooperative_business_id=?", cooperativeBusinessId)
|
|||
|
}
|
|||
|
if startTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, startTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, 0, err
|
|||
|
}
|
|||
|
qs = qs.Where("created_at > ?", parse)
|
|||
|
}
|
|||
|
if endTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, endTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, 0, err
|
|||
|
}
|
|||
|
qs = qs.Where("created_at < ?", parse)
|
|||
|
}
|
|||
|
if nameKey != "" {
|
|||
|
qs = qs.Where("wx_name LIKE ?", "%"+nameKey+"%")
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, 0, err
|
|||
|
}
|
|||
|
|
|||
|
err = qs.Order("id DESC").Offset(page * pageSize).Limit(pageSize).Find(&users).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, 0, err
|
|||
|
}
|
|||
|
|
|||
|
totalPage = uint32(int(count)/pageSize + 1)
|
|||
|
|
|||
|
return users, totalPage, uint32(count), nil
|
|||
|
}
|
|||
|
|
|||
|
type CommonProblem struct {
|
|||
|
Model
|
|||
|
|
|||
|
Question string `json:"question"`
|
|||
|
Answer string `json:"answer" gorm:"type:text"`
|
|||
|
Sort uint32 `json:"sort" gorm:"index"`
|
|||
|
}
|
|||
|
|
|||
|
func (*CommonProblem) TableName() string {
|
|||
|
return "common_problem"
|
|||
|
}
|
|||
|
|
|||
|
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-已发送
|
|||
|
}
|
|||
|
|
|||
|
func (*GroupSendMessageTemplate) TableName() string {
|
|||
|
return "group_send_message_template"
|
|||
|
}
|
|||
|
|
|||
|
type ExpireMemberSmsSend struct {
|
|||
|
Model
|
|||
|
|
|||
|
Message string `json:"message"`
|
|||
|
SendTime time.Time `json:"send_time"`
|
|||
|
Tel string `json:"tel" gorm:"index"`
|
|||
|
Status uint32 `json:"status"` // 1-发送成功 2-发送失败
|
|||
|
}
|
|||
|
|
|||
|
func GetUserInfoMap(uids []uint32) (map[uint32]UserInfo, error) {
|
|||
|
userInfoMap := make(map[uint32]UserInfo, 0)
|
|||
|
if len(uids) == 0 {
|
|||
|
return userInfoMap, nil
|
|||
|
}
|
|||
|
var userInfos []UserInfo
|
|||
|
err := orm.Eloquent.Table("user").Where("uid in (?)", uids).Find(&userInfos).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return userInfoMap, err
|
|||
|
}
|
|||
|
|
|||
|
for i, _ := range userInfos {
|
|||
|
userInfoMap[userInfos[i].Uid] = userInfos[i]
|
|||
|
}
|
|||
|
return userInfoMap, nil
|
|||
|
}
|
|||
|
|
|||
|
func (m *CommonProblem) List() ([]CommonProblem, error) {
|
|||
|
commons := make([]CommonProblem, 0)
|
|||
|
err := orm.Eloquent.Table("common_problem").Order("sort desc").Find(&commons).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return commons, err
|
|||
|
}
|
|||
|
|
|||
|
return commons, nil
|
|||
|
}
|
|||
|
|
|||
|
func (m *CommonProblem) Add() error {
|
|||
|
err := orm.Eloquent.Table("common_problem").Create(m).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func (m *CommonProblem) Modify() error {
|
|||
|
err := orm.Eloquent.Table("common_problem").Save(m).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func (m *CommonProblem) Del() error {
|
|||
|
err := orm.Eloquent.Table("common_problem").Where("id", m.ID).Delete(m).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
type UserAddress struct {
|
|||
|
Model
|
|||
|
|
|||
|
Uid uint32 `json:"uid" gorm:"index"`
|
|||
|
ReceiverName string `json:"receiver_name"`
|
|||
|
Tel string `json:"tel" gorm:"type:varchar(20)"`
|
|||
|
Province string `json:"province" gorm:"type:varchar(100)"`
|
|||
|
City string `json:"city" gorm:"type:varchar(100)"`
|
|||
|
District string `json:"district" gorm:"type:varchar(100)"`
|
|||
|
Address string `json:"address" gorm:"type:varchar(100)"`
|
|||
|
State uint8 `json:"state"`
|
|||
|
IsDefault uint8 `json:"is_default"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserAddress) TableName() string {
|
|||
|
return `user_address`
|
|||
|
}
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type InviteMemberReport struct {
|
|||
|
Model
|
|||
|
Uid uint32 `json:"uid" gorm:"index"`
|
|||
|
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
|
|||
|
GoldCount uint32 `json:"gold_count"` // 黄金数量
|
|||
|
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
|
|||
|
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
|
|||
|
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"` // 黑金会员提成
|
|||
|
UserInfo *UserInfo `json:"user_info" gorm:"-"` // 用户
|
|||
|
Store *Store `json:"store" gorm:"-"` // 门店
|
|||
|
// ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
|
|||
|
// invite_member_report
|
|||
|
}
|
|||
|
|
|||
|
type UserInviteListReq struct {
|
|||
|
//StoreId uint32 `json:"store_id"` // 门店id
|
|||
|
Uid uint32 `json:"uid"` // 用户id
|
|||
|
Page int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
MemberType int `json:"memberType"` // 0-全部 1-普通用户 2-会员
|
|||
|
StartTime string `json:"startTime"` // 开始时间
|
|||
|
EndTime string `json:"endTime"` // 结束时间
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserInfo) InitUserInvite(invite UserInvite) {
|
|||
|
m.MemberOpenTime = invite.MemberOpenTime
|
|||
|
m.MemberStatus = invite.MemberStatus
|
|||
|
m.InviteTime = invite.CreatedAt
|
|||
|
m.MemberLevel = invite.MemberLevel
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserInviteListReq) InviteList() ([]UserInfo, int, error) {
|
|||
|
var (
|
|||
|
users = make([]UserInfo, 0)
|
|||
|
totalPage uint32
|
|||
|
page = m.Page - 1
|
|||
|
pageSize = m.PageSize
|
|||
|
)
|
|||
|
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if pageSize == 0 {
|
|||
|
pageSize = 10
|
|||
|
}
|
|||
|
|
|||
|
//user := &UserInfo{}
|
|||
|
//UserInvite{}
|
|||
|
var userInvites []UserInvite
|
|||
|
qs := orm.Eloquent.Table("user_invite").Where("from_uid", m.Uid)
|
|||
|
|
|||
|
if m.MemberType != 0 {
|
|||
|
qs = qs.Where("member_type=?", m.MemberType)
|
|||
|
}
|
|||
|
|
|||
|
if m.StartTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, m.StartTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, err
|
|||
|
}
|
|||
|
if m.MemberType == 2 {
|
|||
|
qs = qs.Where("member_open_time > ?", parse)
|
|||
|
} else {
|
|||
|
qs = qs.Where("created_at > ?", parse)
|
|||
|
}
|
|||
|
}
|
|||
|
if m.EndTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, m.EndTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, err
|
|||
|
}
|
|||
|
parse = parse.AddDate(0, 0, 1)
|
|||
|
if m.MemberType == 2 {
|
|||
|
qs = qs.Where("member_open_time < ?", parse)
|
|||
|
} else {
|
|||
|
qs = qs.Where("created_at < ?", parse)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, err
|
|||
|
}
|
|||
|
|
|||
|
err = qs.Order("id DESC").Offset(page * pageSize).Limit(pageSize).Find(&userInvites).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, err
|
|||
|
}
|
|||
|
|
|||
|
totalPage = uint32(int(count)/pageSize + 1)
|
|||
|
|
|||
|
uids := make([]uint32, 0)
|
|||
|
userInviteMap := make(map[uint32]UserInvite, 0)
|
|||
|
for i, _ := range userInvites {
|
|||
|
uids = append(uids, userInvites[i].ToUid)
|
|||
|
userInviteMap[userInvites[i].ToUid] = userInvites[i]
|
|||
|
}
|
|||
|
|
|||
|
err = orm.Eloquent.Table("user").Debug().Where("uid in (?)", uids).Find(&users).Error
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return users, 0, err
|
|||
|
}
|
|||
|
fmt.Println("totalPage", totalPage)
|
|||
|
userMap := make(map[uint32]UserInfo, 0)
|
|||
|
for i, _ := range users {
|
|||
|
userMap[users[i].Uid] = users[i]
|
|||
|
}
|
|||
|
|
|||
|
list := make([]UserInfo, 0, len(users))
|
|||
|
for i, _ := range uids {
|
|||
|
invite, ok1 := userInviteMap[uids[i]]
|
|||
|
if !ok1 {
|
|||
|
continue
|
|||
|
}
|
|||
|
userInfo, ok2 := userMap[uids[i]]
|
|||
|
if !ok2 {
|
|||
|
continue
|
|||
|
}
|
|||
|
userInfo.InitUserInvite(invite)
|
|||
|
list = append(list, userInfo)
|
|||
|
}
|
|||
|
|
|||
|
return list, int(count), nil
|
|||
|
}
|
|||
|
|
|||
|
type UserInviteMember struct {
|
|||
|
FromUserInfo UserInfo
|
|||
|
ToUserInfo UserInfo
|
|||
|
Store Store
|
|||
|
UserInvite
|
|||
|
UserInviteRecord UserInviteRecord
|
|||
|
}
|
|||
|
|
|||
|
func MemberLevelToString(memberLevel uint32) string {
|
|||
|
switch memberLevel {
|
|||
|
case 2:
|
|||
|
return "黄金会员"
|
|||
|
case 4:
|
|||
|
return "白金会员"
|
|||
|
case 5:
|
|||
|
return "黑金会员"
|
|||
|
}
|
|||
|
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
func ExportUserMember(storeId uint32, startTime, endTime string) string {
|
|||
|
var userInvites []UserInvite
|
|||
|
qs := orm.Eloquent.Table("invite")
|
|||
|
|
|||
|
if storeId != 0 {
|
|||
|
qs = qs.Where("store_id", storeId)
|
|||
|
}
|
|||
|
if startTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, startTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
qs = qs.Where("member_open_time > ?", parse)
|
|||
|
}
|
|||
|
if endTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, endTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
parse = parse.AddDate(0, 0, 1)
|
|||
|
qs = qs.Where("member_open_time < ?", parse)
|
|||
|
}
|
|||
|
|
|||
|
err := qs.Order("id DESC,store_id DESC,from_uid DESC").Find(&userInvites).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
storeIds := make([]uint64, 0)
|
|||
|
fromUids := make([]uint32, 0)
|
|||
|
toUids := make([]uint32, 0)
|
|||
|
for i, _ := range userInvites {
|
|||
|
storeIds = append(storeIds, userInvites[i].StoreId)
|
|||
|
fromUids = append(fromUids, userInvites[i].FromUid)
|
|||
|
toUids = append(toUids, userInvites[i].ToUid)
|
|||
|
}
|
|||
|
|
|||
|
var stores []Store
|
|||
|
err = orm.Eloquent.Table("store").Where("id in (?)", storeIds).Find(&stores).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
storeMap := make(map[uint32]Store)
|
|||
|
for i, _ := range stores {
|
|||
|
storeMap[stores[i].ID] = stores[i]
|
|||
|
}
|
|||
|
|
|||
|
fromUids = append(fromUids, toUids...)
|
|||
|
var userInfos []UserInfo
|
|||
|
err = orm.Eloquent.Table("user").Where("uid in (?)", fromUids).Find(&userInfos).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
userInfoMap := make(map[uint32]UserInfo, 0)
|
|||
|
for i, _ := range userInfos {
|
|||
|
userInfoMap[userInfos[i].Uid] = userInfos[i]
|
|||
|
}
|
|||
|
|
|||
|
inviteMembers := make([]UserInviteMember, 0, len(userInvites))
|
|||
|
for i, _ := range userInvites {
|
|||
|
fromUser, _ := userInfoMap[userInvites[i].FromUid]
|
|||
|
toUser, ok2 := userInfoMap[userInvites[i].ToUid]
|
|||
|
if !ok2 {
|
|||
|
continue
|
|||
|
}
|
|||
|
store, ok1 := storeMap[uint32(userInvites[i].StoreId)]
|
|||
|
if !ok1 {
|
|||
|
store = storeMap[uint32(toUser.StoreId)]
|
|||
|
}
|
|||
|
invite := UserInviteMember{
|
|||
|
FromUserInfo: fromUser,
|
|||
|
Store: store,
|
|||
|
ToUserInfo: toUser,
|
|||
|
UserInvite: userInvites[i],
|
|||
|
}
|
|||
|
inviteMembers = append(inviteMembers, invite)
|
|||
|
}
|
|||
|
|
|||
|
fileName := "邀请会员"
|
|||
|
if storeId == 0 {
|
|||
|
fileName = "全部门店邀请会员"
|
|||
|
} else {
|
|||
|
if len(stores) > 0 {
|
|||
|
fileName = stores[0].Name
|
|||
|
}
|
|||
|
}
|
|||
|
//url := "http://switch.deovo.com:8000/img/export/"
|
|||
|
//url := "http://39.108.188.218:8000/img/export/"
|
|||
|
|
|||
|
//fileName = fileName + time.Now().Format("2006-01-02 15:04:05") + ".csv"
|
|||
|
//f, err := os.OpenFile(fmt.Sprintf("./")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
|
|||
|
f, err := os.OpenFile(fmt.Sprintf("/www/server/images/export/")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
|
|||
|
if err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
return fileName
|
|||
|
}
|
|||
|
defer f.Close()
|
|||
|
|
|||
|
w := csv.NewWriter(f)
|
|||
|
|
|||
|
//headline := []string{"门店名称", "店员id", "店员昵称","姓名", "会员id", "会员昵称", "注册会员时间", "会员状态"}
|
|||
|
headline := []string{"门店名称", "店员id", "姓名", "会员id", "会员昵称", "会员等级", "会员手机号", "注册会员时间", "会员状态"}
|
|||
|
if err := w.Write(headline); err != nil {
|
|||
|
log.Fatalln("error writing record to csv:", err)
|
|||
|
}
|
|||
|
|
|||
|
for _, invite := range inviteMembers {
|
|||
|
//fmt.Println("MemberOpenTime",invite.UserInvite.MemberOpenTime)
|
|||
|
//fmt.Println("MemberOpenTime",invite.UserInvite.MemberOpenTime.Format("2006-01-02 15:04:05"))
|
|||
|
record := []string{invite.Store.Name, fmt.Sprintf("%d", invite.FromUserInfo.Uid), invite.FromUserInfo.ShopAssistantName,
|
|||
|
fmt.Sprintf("%d", invite.ToUserInfo.Uid), invite.ToUserInfo.WxName, MemberLevelToString(invite.UserInvite.MemberLevel),
|
|||
|
invite.ToUserInfo.Tel, invite.UserInvite.MemberOpenTime.Format("2006-01-02 15:04:05"),
|
|||
|
GetUserInviteStatus(invite.MemberStatus)}
|
|||
|
if err := w.Write(record); err != nil {
|
|||
|
log.Fatalln("error writing record to csv:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
w.Flush()
|
|||
|
if err := w.Error(); err != nil {
|
|||
|
log.Fatal(err)
|
|||
|
}
|
|||
|
|
|||
|
return ExportUrl + fileName
|
|||
|
}
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type UserInviteRecord struct {
|
|||
|
Model
|
|||
|
|
|||
|
ToUid uint32 `json:"to_uid"` // 用户ID
|
|||
|
FromUid uint32 `json:"from_uid"` // 邀请人ID
|
|||
|
Action uint32 `json:"action"` // 1-未激活 2-激活邀请
|
|||
|
SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级
|
|||
|
MemberLevel uint32 `json:"member_level"` // 会员等级
|
|||
|
First uint32 `json:"first"` // 首次
|
|||
|
Scan uint32 `json:"scan"` // 扫码
|
|||
|
ActionTime time.Time `json:"action_time"` // 激活时间
|
|||
|
RenewHide uint32 `json:"renew_hide"` // 自动续费
|
|||
|
ShopAssistantName string `json:"shop_assistant_name" gorm:"-"` // 店员名称
|
|||
|
// user_invite_record
|
|||
|
}
|
|||
|
|
|||
|
type UserInviteRecordReq struct {
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
MemberType int `json:"member_type"` // 1-首次邀请 2-开通黄金 3-开通白金 4-开通黑金 5-续费黄金 6-续费白金 7-续费黑金
|
|||
|
FromUid uint32 `json:"from_uid"`
|
|||
|
ToUid uint32 `json:"to_uid"`
|
|||
|
StartTime time.Time `json:"startTime"` // 开始时间
|
|||
|
EndTime time.Time `json:"endTime"` // 结束时间
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserInviteRecordReq) List() ([]UserInviteRecord, int64, error) {
|
|||
|
var records []UserInviteRecord
|
|||
|
err := UpdateUserInviteRecordRenewHide()
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return records, 0, err
|
|||
|
}
|
|||
|
|
|||
|
page := m.PageNum - 1
|
|||
|
pageSize := m.PageSize
|
|||
|
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if pageSize == 0 {
|
|||
|
pageSize = 10
|
|||
|
}
|
|||
|
|
|||
|
qs := orm.Eloquent.Table("user_invite_record").Where("action=2").Where("renew_hide!=1")
|
|||
|
//qs := orm.Eloquent.Table("user_invite_record")
|
|||
|
|
|||
|
if m.MemberType != 0 {
|
|||
|
switch m.MemberType {
|
|||
|
case 1:
|
|||
|
qs = qs.Where("first=1").Where("spend_type=1")
|
|||
|
case 2:
|
|||
|
qs = qs.Where("member_level=2").Where("spend_type=2")
|
|||
|
case 3:
|
|||
|
qs = qs.Where("member_level=4").Where("spend_type=2")
|
|||
|
case 4:
|
|||
|
qs = qs.Where("member_level=5").Where("spend_type=2")
|
|||
|
case 5:
|
|||
|
qs = qs.Where("member_level=2").Where("spend_type=3")
|
|||
|
case 6:
|
|||
|
qs = qs.Where("member_level=4").Where("spend_type=3")
|
|||
|
case 7:
|
|||
|
qs = qs.Where("member_level=5").Where("spend_type=3")
|
|||
|
}
|
|||
|
}
|
|||
|
if m.FromUid != 0 {
|
|||
|
qs = qs.Where("from_uid=?", m.FromUid)
|
|||
|
}
|
|||
|
if m.ToUid != 0 {
|
|||
|
qs = qs.Where("to_uid=?", m.ToUid)
|
|||
|
}
|
|||
|
if !m.StartTime.IsZero() {
|
|||
|
//qs = qs.Where("created_at > ?", m.StartTime)
|
|||
|
qs = qs.Where("action_time > ?", m.StartTime)
|
|||
|
}
|
|||
|
if !m.EndTime.IsZero() {
|
|||
|
//qs = qs.Where("created_at < ?", m.EndTime)
|
|||
|
qs = qs.Where("action_time < ?", m.EndTime)
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err = qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return records, 0, err
|
|||
|
}
|
|||
|
|
|||
|
err = qs.Order("action_time DESC").Offset(page * pageSize).Limit(pageSize).Find(&records).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return records, 0, err
|
|||
|
}
|
|||
|
return records, count, nil
|
|||
|
}
|
|||
|
|
|||
|
func UpdateUserInviteRecordRenewHide() error {
|
|||
|
err := orm.Eloquent.Exec("UPDATE user_invite_record SET renew_hide=1 WHERE spend_type=3 AND scan=0 AND renew_hide!=1;").Error
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("update renew_hide err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
//func ExportUserMemberList(storeId, memberType uint32, startTime, endTime string) string {
|
|||
|
// var userInvites []UserInvite
|
|||
|
// qs := orm.Eloquent.Table("user_11invite").Where("from_uid > 0")
|
|||
|
// if memberType == 1 {
|
|||
|
// qs = qs.Where("member_type=?", 1)
|
|||
|
// } else if memberType == 2 {
|
|||
|
// qs = qs.Where("member_type in (?)", []uint32{2, 4, 5})
|
|||
|
// } else if memberType == 3 {
|
|||
|
// qs = qs.Where("member_type=?", 3)
|
|||
|
// }
|
|||
|
//
|
|||
|
// if storeId != 0 {
|
|||
|
// qs = qs.Where("store_id", storeId)
|
|||
|
// }
|
|||
|
// if startTime != "" {
|
|||
|
// parse, err := time.Parse(DateTimeFormat, startTime)
|
|||
|
// if err != nil {
|
|||
|
// logger.Errorf("err:", err)
|
|||
|
// return ""
|
|||
|
// }
|
|||
|
// qs = qs.Where("member_open_time > ?", parse)
|
|||
|
// }
|
|||
|
// if endTime != "" {
|
|||
|
// parse, err := time.Parse(DateTimeFormat, endTime)
|
|||
|
// if err != nil {
|
|||
|
// logger.Errorf("err:", err)
|
|||
|
// return ""
|
|||
|
// }
|
|||
|
// parse = parse.AddDate(0, 0, 1)
|
|||
|
// qs = qs.Where("member_open_time < ?", parse)
|
|||
|
// }
|
|||
|
//
|
|||
|
// err := qs.Order("id DESC,store_id DESC,from_uid DESC").Find(&userInvites).Error
|
|||
|
// if err != nil && err != RecordNotFound {
|
|||
|
// logger.Errorf("err:", err)
|
|||
|
// return ""
|
|||
|
// }
|
|||
|
//
|
|||
|
// storeIds := make([]uint64, 0)
|
|||
|
// fromUids := make([]uint32, 0)
|
|||
|
// toUids := make([]uint32, 0)
|
|||
|
// for i, _ := range userInvites {
|
|||
|
// storeIds = append(storeIds, userInvites[i].StoreId)
|
|||
|
// fromUids = append(fromUids, userInvites[i].FromUid)
|
|||
|
// toUids = append(toUids, userInvites[i].ToUid)
|
|||
|
// }
|
|||
|
//
|
|||
|
// var stores []Store
|
|||
|
// err = orm.Eloquent.Table("store").Where("id in (?)", storeIds).Find(&stores).Error
|
|||
|
// if err != nil {
|
|||
|
// logger.Error("err:", err)
|
|||
|
// return ""
|
|||
|
// }
|
|||
|
// storeMap := make(map[uint32]Store)
|
|||
|
// for i, _ := range stores {
|
|||
|
// storeMap[stores[i].ID] = stores[i]
|
|||
|
// }
|
|||
|
//
|
|||
|
// fromUids = append(fromUids, toUids...)
|
|||
|
// var userInfos []UserInfo
|
|||
|
// err = orm.Eloquent.Table("user").Where("uid in (?)", fromUids).Find(&userInfos).Error
|
|||
|
// if err != nil {
|
|||
|
// logger.Error("err:", err)
|
|||
|
// return ""
|
|||
|
// }
|
|||
|
// userInfoMap := make(map[uint32]UserInfo, 0)
|
|||
|
// for i, _ := range userInfos {
|
|||
|
// userInfoMap[userInfos[i].Uid] = userInfos[i]
|
|||
|
// }
|
|||
|
//
|
|||
|
// inviteMembers := make([]UserInviteMember, 0, len(userInvites))
|
|||
|
// for i, _ := range userInvites {
|
|||
|
// fromUser, _ := userInfoMap[userInvites[i].FromUid]
|
|||
|
// toUser, ok2 := userInfoMap[userInvites[i].ToUid]
|
|||
|
// if !ok2 {
|
|||
|
// continue
|
|||
|
// }
|
|||
|
// store, ok1 := storeMap[uint32(userInvites[i].StoreId)]
|
|||
|
// if !ok1 {
|
|||
|
// store = storeMap[uint32(toUser.StoreId)]
|
|||
|
// }
|
|||
|
// invite := UserInviteMember{
|
|||
|
// FromUserInfo: fromUser,
|
|||
|
// Store: store,
|
|||
|
// ToUserInfo: toUser,
|
|||
|
// UserInvite: userInvites[i],
|
|||
|
// }
|
|||
|
// inviteMembers = append(inviteMembers, invite)
|
|||
|
// }
|
|||
|
//
|
|||
|
// fileName := "邀请会员"
|
|||
|
// if storeId == 0 {
|
|||
|
// fileName = "全部门店邀请会员"
|
|||
|
// } else {
|
|||
|
// if len(stores) > 0 {
|
|||
|
// fileName = stores[0].Name
|
|||
|
// }
|
|||
|
// }
|
|||
|
// //url := "http://switch.deovo.com:8000/img/export/"
|
|||
|
// url := "http://39.108.188.218:8000/img/export/"
|
|||
|
//
|
|||
|
// fileName = fileName + time.Now().Format("2006-01-02 15:04:05") + ".csv"
|
|||
|
// //f, err := os.OpenFile(fmt.Sprintf("./")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
|
|||
|
// f, err := os.OpenFile(fmt.Sprintf("/www/server/images/export/")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
|
|||
|
// if err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
// return fileName
|
|||
|
// }
|
|||
|
// defer f.Close()
|
|||
|
//
|
|||
|
// w := csv.NewWriter(f)
|
|||
|
//
|
|||
|
// //headline := []string{"门店名称", "店员id", "店员昵称","姓名", "会员id", "会员昵称", "注册会员时间", "会员状态"}
|
|||
|
// headline := []string{"门店名称", "店员id", "姓名", "会员id", "会员昵称", "会员等级", "注册会员时间", "会员状态"}
|
|||
|
// if err := w.Write(headline); err != nil {
|
|||
|
// log.Fatalln("error writing record to csv:", err)
|
|||
|
// }
|
|||
|
//
|
|||
|
// for _, invite := range inviteMembers {
|
|||
|
// //fmt.Println("MemberOpenTime",invite.UserInvite.MemberOpenTime)
|
|||
|
// //fmt.Println("MemberOpenTime",invite.UserInvite.MemberOpenTime.Format("2006-01-02 15:04:05"))
|
|||
|
// record := []string{invite.Store.Name, fmt.Sprintf("%d", invite.FromUserInfo.Uid), invite.FromUserInfo.ShopAssistantName,
|
|||
|
// fmt.Sprintf("%d", invite.ToUserInfo.Uid), invite.ToUserInfo.WxName, MemberLevelToString(invite.UserInvite.MemberLevel), invite.UserInvite.MemberOpenTime.Format("2006-01-02 15:04:05"),
|
|||
|
// GetUserInviteStatus(invite.MemberStatus)}
|
|||
|
// if err := w.Write(record); err != nil {
|
|||
|
// log.Fatalln("error writing record to csv:", err)
|
|||
|
// }
|
|||
|
// }
|
|||
|
//
|
|||
|
// w.Flush()
|
|||
|
// if err := w.Error(); err != nil {
|
|||
|
// log.Fatal(err)
|
|||
|
// }
|
|||
|
//
|
|||
|
// return url + fileName
|
|||
|
//}
|
|||
|
// 导出用户
|
|||
|
|
|||
|
func ExportUserMemberList(storeId, memberType, cooperativeId uint32, startTime, endTime, renewalStartTime, renewalEndTime string) string {
|
|||
|
var userInfos []UserInfo
|
|||
|
qs := orm.Eloquent.Table("user")
|
|||
|
if memberType == 1 {
|
|||
|
qs = qs.Where("member_level=?", 1)
|
|||
|
} else if memberType == 2 {
|
|||
|
qs = qs.Where("member_level in (?)", []uint32{2, 4, 5})
|
|||
|
} else if memberType == 3 {
|
|||
|
qs = qs.Where("member_level=?", 3)
|
|||
|
}
|
|||
|
|
|||
|
if storeId != 0 {
|
|||
|
qs = qs.Where("store_id=?", storeId)
|
|||
|
}
|
|||
|
if startTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, startTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
//qs = qs.Where("created_at > ?", parse)
|
|||
|
qs = qs.Where("open_member_time > ?", parse)
|
|||
|
}
|
|||
|
if endTime != "" {
|
|||
|
parse, err := time.Parse(DateTimeFormat, endTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
parse = parse.AddDate(0, 0, 1)
|
|||
|
//qs = qs.Where("created_at < ?", parse)
|
|||
|
qs = qs.Where("open_member_time < ?", parse)
|
|||
|
}
|
|||
|
if cooperativeId != 0 {
|
|||
|
qs = qs.Where("cooperative_business_id=?", cooperativeId)
|
|||
|
}
|
|||
|
//err := qs.Order("id DESC,store_id DESC,from_uid DESC").Find(&userInvites).Error
|
|||
|
err := qs.Order("id DESC,store_id DESC,uid DESC").Find(&userInfos).Error
|
|||
|
//err := qs.Order("id DESC").Find(&userInfos).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
storeIds := make([]uint32, 0)
|
|||
|
fromUids := make([]uint32, 0)
|
|||
|
toUids := make([]uint32, 0)
|
|||
|
for i, _ := range userInfos {
|
|||
|
storeIds = append(storeIds, uint32(userInfos[i].StoreId))
|
|||
|
//fromUids = append(fromUids, userInvites[i].FromUid)
|
|||
|
toUids = append(toUids, userInfos[i].Uid)
|
|||
|
}
|
|||
|
|
|||
|
//var stores []Store
|
|||
|
//err = orm.Eloquent.Table("store").Where("id in (?)", storeIds).Find(&stores).Error
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("err:", err)
|
|||
|
// return ""
|
|||
|
//}
|
|||
|
//storeMap := make(map[uint32]Store)
|
|||
|
//for i, _ := range stores {
|
|||
|
// storeMap[stores[i].ID] = stores[i]
|
|||
|
//}
|
|||
|
|
|||
|
//fromUids = append(fromUids, toUids...)
|
|||
|
var userInvites []UserInvite
|
|||
|
inviteQs := orm.Eloquent.Table("user_invite").Where("to_uid in (?)", toUids)
|
|||
|
if memberType == 1 {
|
|||
|
|
|||
|
}
|
|||
|
if memberType == 2 {
|
|||
|
inviteQs = inviteQs.Where("action=2").Where("spend_type=2")
|
|||
|
}
|
|||
|
err = inviteQs.Find(&userInvites).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
userInviteMap := make(map[uint32]UserInvite, 0)
|
|||
|
for i, _ := range userInvites {
|
|||
|
userInviteMap[userInvites[i].ToUid] = userInvites[i]
|
|||
|
fromUids = append(fromUids, userInvites[i].FromUid)
|
|||
|
}
|
|||
|
|
|||
|
var fromUserInfos []UserInfo
|
|||
|
err = orm.Eloquent.Table("user").Where("uid in (?)", fromUids).Find(&fromUserInfos).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("from user infos err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
fromUserMap := make(map[uint32]UserInfo, 0)
|
|||
|
for i, _ := range fromUserInfos {
|
|||
|
fromUserMap[fromUserInfos[i].Uid] = fromUserInfos[i]
|
|||
|
//
|
|||
|
storeIds = append(storeIds, uint32(fromUserInfos[i].StoreId))
|
|||
|
}
|
|||
|
|
|||
|
storeMap := StoreMapByIds(storeIds)
|
|||
|
|
|||
|
isRenewal := false
|
|||
|
var inviteRecords []UserInviteRecord
|
|||
|
//err = orm.Eloquent.Table("user_invite_record").Where("to_uid in (?)", toUids).Where("first!=1").
|
|||
|
// Where("scan=1").Order("id DESC").Find(&inviteRecords).Error
|
|||
|
qsInviteRecords := orm.Eloquent.Table("user_invite_record").Where("to_uid in (?)", toUids).
|
|||
|
Where("first!=1").Where("action=2")
|
|||
|
if renewalStartTime != "" {
|
|||
|
isRenewal = true
|
|||
|
parse, err := time.Parse(DateTimeFormat, renewalStartTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
//qs = qs.Where("created_at > ?", parse)
|
|||
|
qsInviteRecords = qsInviteRecords.Where("action_time > ?", parse).Where("spend_type=3")
|
|||
|
}
|
|||
|
if renewalEndTime != "" {
|
|||
|
isRenewal = true
|
|||
|
parse, err := time.Parse(DateTimeFormat, renewalEndTime)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
parse = parse.AddDate(0, 0, 1)
|
|||
|
//qs = qs.Where("created_at < ?", parse)
|
|||
|
qsInviteRecords = qsInviteRecords.Where("action_time < ?", parse).Where("spend_type=3")
|
|||
|
}
|
|||
|
err = qsInviteRecords.Order("id ASC").Find(&inviteRecords).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("invite record err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
UserInviteRecordListSetAssistantName(inviteRecords)
|
|||
|
inviteRecordMap := make(map[uint32][]UserInviteRecord, 0)
|
|||
|
for i, _ := range inviteRecords {
|
|||
|
fromUser, ok3 := fromUserMap[inviteRecords[i].FromUid]
|
|||
|
if ok3 {
|
|||
|
inviteRecords[i].ShopAssistantName = fromUser.ShopAssistantName
|
|||
|
}
|
|||
|
//inviteRecordMap[inviteRecords[i].ToUid] = inviteRecords[i]
|
|||
|
v, ok := inviteRecordMap[inviteRecords[i].ToUid]
|
|||
|
if ok {
|
|||
|
if len(v) >= 2 {
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
if inviteRecords[i].SpendType == 3 && inviteRecords[i].Scan == 0 {
|
|||
|
inviteRecords[i].ShopAssistantName = "自动续费"
|
|||
|
}
|
|||
|
inviteRecordMap[inviteRecords[i].ToUid] = append(inviteRecordMap[inviteRecords[i].ToUid], inviteRecords[i])
|
|||
|
}
|
|||
|
|
|||
|
inviteMembers := make([]UserInviteMember, 0, len(userInvites))
|
|||
|
for i, _ := range userInfos {
|
|||
|
//toUser, ok2 := userInfoMap[userInvites[i].ToUid]
|
|||
|
store, ok1 := storeMap[(userInfos[i].StoreId)]
|
|||
|
userInfoMember := UserInviteMember{
|
|||
|
FromUserInfo: UserInfo{},
|
|||
|
Store: store,
|
|||
|
ToUserInfo: userInfos[i],
|
|||
|
UserInvite: UserInvite{ToUid: userInfos[i].Uid},
|
|||
|
}
|
|||
|
if isRenewal {
|
|||
|
v, ok := inviteRecordMap[userInfos[i].Uid]
|
|||
|
if !ok {
|
|||
|
continue
|
|||
|
}
|
|||
|
if len(v) > 0 {
|
|||
|
userInfoMember.UserInviteRecord = v[len(v)-1]
|
|||
|
}
|
|||
|
}
|
|||
|
userInvite, ok2 := userInviteMap[userInfos[i].Uid]
|
|||
|
if ok2 {
|
|||
|
userInfoMember.UserInvite = userInvite
|
|||
|
if !ok1 {
|
|||
|
store = storeMap[(userInvite.StoreId)]
|
|||
|
userInfoMember.Store = store
|
|||
|
}
|
|||
|
|
|||
|
fromUser, ok3 := fromUserMap[userInvite.FromUid]
|
|||
|
if ok3 {
|
|||
|
userInfoMember.FromUserInfo = fromUser
|
|||
|
}
|
|||
|
}
|
|||
|
fromStore, ok4 := storeMap[userInfoMember.FromUserInfo.StoreId]
|
|||
|
if ok4 {
|
|||
|
userInfoMember.FromUserInfo.Store = &fromStore
|
|||
|
}
|
|||
|
inviteMembers = append(inviteMembers, userInfoMember)
|
|||
|
}
|
|||
|
if isRenewal {
|
|||
|
sort.Sort(ExportUserInviteMemberList(inviteMembers))
|
|||
|
}
|
|||
|
//UserInviteRecordListSetAssistantName(inviteRecords)
|
|||
|
//
|
|||
|
//inviteRecordMap := make(map[uint32][]UserInviteRecord, 0)
|
|||
|
//for i, _ := range inviteRecords {
|
|||
|
// v, ok := inviteRecordMap[inviteRecords[i].ToUid]
|
|||
|
// if ok {
|
|||
|
// if len(v) >= 2 {
|
|||
|
// continue
|
|||
|
// }
|
|||
|
// }
|
|||
|
// if inviteRecords[i].SpendType == 3 && inviteRecords[i].Scan == 0 {
|
|||
|
// inviteRecords[i].ShopAssistantName = "自动续费"
|
|||
|
// }
|
|||
|
//
|
|||
|
// inviteRecordMap[inviteRecords[i].ToUid] = append(inviteRecordMap[inviteRecords[i].ToUid], inviteRecords[i])
|
|||
|
//}
|
|||
|
|
|||
|
fileName := "邀请会员"
|
|||
|
if storeId == 0 {
|
|||
|
fileName = "全部门店邀请会员"
|
|||
|
} else {
|
|||
|
store, err := GetStore(storeId)
|
|||
|
if err != nil {
|
|||
|
logger.Error("get store err:", err)
|
|||
|
return ""
|
|||
|
}
|
|||
|
fileName = store.Name
|
|||
|
}
|
|||
|
//url := "http://39.108.188.218:8000/img/export/"
|
|||
|
//url := "https://dev.admin.deovo.com/img/export/"
|
|||
|
styleBorder := &excelize.Style{
|
|||
|
Border: []excelize.Border{{
|
|||
|
Type: "left",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "top",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "right",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "bottom",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}},
|
|||
|
}
|
|||
|
styleFill1 := &excelize.Style{
|
|||
|
Border: []excelize.Border{{
|
|||
|
Type: "left",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "top",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "right",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "bottom",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}},
|
|||
|
Fill: excelize.Fill{
|
|||
|
Type: "pattern",
|
|||
|
Pattern: 1,
|
|||
|
Color: []string{"FFFF00"},
|
|||
|
},
|
|||
|
}
|
|||
|
styleFill2 := &excelize.Style{
|
|||
|
Border: []excelize.Border{{
|
|||
|
Type: "left",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "top",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "right",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}, {
|
|||
|
Type: "bottom",
|
|||
|
Color: "000000",
|
|||
|
Style: 1,
|
|||
|
}},
|
|||
|
Fill: excelize.Fill{
|
|||
|
Type: "pattern",
|
|||
|
Pattern: 1,
|
|||
|
Color: []string{"FFEFDB"},
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
//url := "https://dev.admin.deovo.com/load/export/"
|
|||
|
|
|||
|
fileName = time.Now().Format(TimeFormat) + fileName + ".xlsx"
|
|||
|
fSheet := "Sheet1"
|
|||
|
file := excelize.NewFile()
|
|||
|
//streamWriter, err := file.NewStreamWriter("Sheet1")
|
|||
|
//if err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
//}
|
|||
|
styleBorderId, err := file.NewStyle(styleBorder)
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
}
|
|||
|
styleFillId1, err := file.NewStyle(styleFill1)
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
}
|
|||
|
styleFillId2, err := file.NewStyle(styleFill2)
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
}
|
|||
|
//headline := []string{"门店名称", "店员id", "店员姓名", "用户注册时间", "最近登录时间", "会员id", "会员昵称", "用户手机号", "会员等级", "注册会员时间", "会员状态"}
|
|||
|
headline := []interface{}{"门店名称", "店员id", "店员姓名", "店员门店", "用户注册时间", "最近登录时间", "用户id", "用户昵称", "用户手机号", "会员等级", "注册会员时间",
|
|||
|
"开通_店员id", "开通_店员名称", "开通_扫码时间", "续费_店员id", "续费_店员名称", "续费_扫码时间"}
|
|||
|
if cooperativeId != 0 {
|
|||
|
headline = []interface{}{"门店名称", "店员id", "店员姓名", "店员门店", "用户注册时间", "最近登录时间", "用户id", "会员等级", "注册会员时间",
|
|||
|
"开通_店员id", "开通_店员名称", "开通_扫码时间", "续费_店员id", "续费_店员名称", "续费_扫码时间"}
|
|||
|
}
|
|||
|
headLength := len(headline)
|
|||
|
for i, _ := range headline {
|
|||
|
cell, _ := excelize.CoordinatesToCellName(1+i, 1)
|
|||
|
err = file.SetCellValue(fSheet, cell, headline[i])
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
idx := i
|
|||
|
if cooperativeId == 0 {
|
|||
|
if idx+1 > 11 && idx+1 <= 14 {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleFillId1)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
} else if idx+1 > 14 && idx+1 <= 17 {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleFillId2)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
} else {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleBorderId)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
if idx+1 > 9 && idx+1 <= 12 {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleFillId1)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
} else if idx+1 > 12 && idx+1 <= 15 {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleFillId2)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
} else {
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleBorderId)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//if err = streamWriter.SetRow(cell, headline); err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
//}
|
|||
|
|
|||
|
for rowId := 0; rowId < len(inviteMembers); rowId++ {
|
|||
|
invite := inviteMembers[rowId]
|
|||
|
|
|||
|
fromStoreName := ""
|
|||
|
if invite.FromUserInfo.Store != nil {
|
|||
|
fromStoreName = invite.FromUserInfo.Store.Name
|
|||
|
}
|
|||
|
|
|||
|
record := []interface{}{}
|
|||
|
if cooperativeId != 0 {
|
|||
|
record = []interface{}{invite.Store.Name, fmt.Sprintf("%d", invite.FromUserInfo.Uid),
|
|||
|
invite.FromUserInfo.ShopAssistantName, fromStoreName,
|
|||
|
invite.ToUserInfo.CreatedAt.Format(TimeFormat), invite.ToUserInfo.LastLoginAt.Format(TimeFormat),
|
|||
|
fmt.Sprintf("%d", invite.ToUserInfo.Uid), MemberLevelToString(invite.UserInvite.MemberLevel),
|
|||
|
invite.UserInvite.MemberOpenTime.Format(TimeFormat),
|
|||
|
//GetUserInviteStatus(invite.MemberStatus),
|
|||
|
}
|
|||
|
} else {
|
|||
|
record = []interface{}{invite.Store.Name, fmt.Sprintf("%d", invite.FromUserInfo.Uid),
|
|||
|
invite.FromUserInfo.ShopAssistantName, fromStoreName,
|
|||
|
invite.ToUserInfo.CreatedAt.Format(TimeFormat), invite.ToUserInfo.LastLoginAt.Format(TimeFormat),
|
|||
|
fmt.Sprintf("%d", invite.ToUserInfo.Uid), invite.ToUserInfo.WxName, invite.ToUserInfo.Tel,
|
|||
|
MemberLevelToString(invite.ToUserInfo.MemberLevel),
|
|||
|
invite.ToUserInfo.OpenMemberTime.Format(TimeFormat),
|
|||
|
//GetUserInviteStatus(invite.ToUserInfo.MemberStatus),
|
|||
|
}
|
|||
|
//MemberLevelToString(invite.UserInvite.MemberLevel),
|
|||
|
//invite.UserInvite.MemberOpenTime.Format(TimeFormat),
|
|||
|
//GetUserInviteStatus(invite.MemberStatus)}
|
|||
|
}
|
|||
|
userInviteRecordList, ok := inviteRecordMap[invite.ToUid]
|
|||
|
if ok {
|
|||
|
for i, _ := range userInviteRecordList {
|
|||
|
if i == 0 && userInviteRecordList[i].SpendType != 2 {
|
|||
|
record = append(record, []interface{}{"", "", ""}...)
|
|||
|
}
|
|||
|
record = append(record, []interface{}{userInviteRecordList[i].FromUid, userInviteRecordList[i].ShopAssistantName, userInviteRecordList[i].CreatedAt.Format(TimeFormat)}...)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if len(record) < headLength {
|
|||
|
record = append(record, make([]interface{}, headLength-len(record))...)
|
|||
|
}
|
|||
|
for i, _ := range record {
|
|||
|
cell, _ := excelize.CoordinatesToCellName(1+i, rowId+2)
|
|||
|
err = file.SetCellValue(fSheet, cell, record[i])
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
|
|||
|
err = file.SetCellStyle(fSheet, cell, cell, styleBorderId)
|
|||
|
if err != nil {
|
|||
|
logger.Error("file set value err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
//if err := streamWriter.SetRow(cell, record); err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
//if err := streamWriter.Flush(); err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
//}
|
|||
|
if err := file.SaveAs("/www/server/images/export/" + fileName); err != nil {
|
|||
|
//if err := file.SaveAs("./" + fileName); err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
|
|||
|
return ExportUrl + fileName
|
|||
|
}
|
|||
|
|
|||
|
type ExportUserInviteMemberList []UserInviteMember
|
|||
|
|
|||
|
func (s ExportUserInviteMemberList) Len() int {
|
|||
|
//返回传入数据的总数
|
|||
|
return len(s)
|
|||
|
}
|
|||
|
func (s ExportUserInviteMemberList) Swap(i, j int) {
|
|||
|
//两个对象满足Less()则位置对换
|
|||
|
//表示执行交换数组中下标为i的数据和下标为j的数据
|
|||
|
s[i], s[j] = s[j], s[i]
|
|||
|
}
|
|||
|
func (s ExportUserInviteMemberList) Less(i, j int) bool {
|
|||
|
//按字段比较大小,此处是降序排序
|
|||
|
//返回数组中下标为i的数据是否小于下标为j的数据
|
|||
|
return s[i].UserInviteRecord.ActionTime.After(s[j].UserInviteRecord.ActionTime)
|
|||
|
}
|
|||
|
|
|||
|
func GetUserInviteStatus(status uint8) string {
|
|||
|
switch status {
|
|||
|
case 1:
|
|||
|
return "未注册"
|
|||
|
case 2:
|
|||
|
return "已注册"
|
|||
|
case 3:
|
|||
|
return "取消会员"
|
|||
|
}
|
|||
|
return ""
|
|||
|
}
|
|||
|
|
|||
|
func IsUserInfoByUid(uid uint32) (bool, error) {
|
|||
|
//userInfo := new(UserInfo)
|
|||
|
var count int64
|
|||
|
err := orm.Eloquent.Debug().Table("user").Where("uid = ?", uid).Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return false, err
|
|||
|
}
|
|||
|
if count == 0 {
|
|||
|
return true, errors.New("user not exist")
|
|||
|
}
|
|||
|
return true, nil
|
|||
|
}
|
|||
|
|
|||
|
func GetUserInfoByUid(uid uint32) (UserInfo, error) {
|
|||
|
//userInfo := new(UserInfo)
|
|||
|
var userInfo UserInfo
|
|||
|
err := orm.Eloquent.Debug().Table("user").Where("uid = ?", uid).Find(&userInfo).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return userInfo, err
|
|||
|
}
|
|||
|
return userInfo, nil
|
|||
|
}
|
|||
|
|
|||
|
type UserDepositRefundRecordListReq struct {
|
|||
|
//StoreId uint32 `json:"store_id"` // 门店id
|
|||
|
Uid uint32 `json:"uid"` // 用户id
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
Status uint32 `json:"status"`
|
|||
|
}
|
|||
|
type UserDepositRefundRecordListResp struct {
|
|||
|
List []DepositRefundRecord `json:"list"`
|
|||
|
Count uint32 `json:"count"`
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *UserDepositRefundRecordListReq) DepositRefundRecordList() (*UserDepositRefundRecordListResp, error) {
|
|||
|
qs := orm.Eloquent.Table("deposit_refund_record")
|
|||
|
if m.Status != 0 {
|
|||
|
qs = qs.Where("status=?", m.Status)
|
|||
|
}
|
|||
|
if m.Uid != 0 {
|
|||
|
qs = qs.Where("uid=?", m.Uid)
|
|||
|
}
|
|||
|
page := m.PageNum - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if m.PageSize == 0 {
|
|||
|
m.PageSize = 10
|
|||
|
}
|
|||
|
resp := &UserDepositRefundRecordListResp{PageNum: m.PageNum}
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.Count = uint32(count)
|
|||
|
|
|||
|
var depositRefunds []DepositRefundRecord
|
|||
|
err = qs.Order("status ASC").Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&depositRefunds).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
|
|||
|
resp.List = depositRefunds
|
|||
|
|
|||
|
return resp, nil
|
|||
|
}
|
|||
|
|
|||
|
type GroupSendMessageCreateTemplateListReq struct {
|
|||
|
Status uint32 `json:"status"` // 1-待发送 2-已发送
|
|||
|
Title string `json:"title"`
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
}
|
|||
|
type GroupSendMessageCreateTemplateListResp struct {
|
|||
|
List []GroupSendMessageTemplate `json:"list"`
|
|||
|
Count uint32 `json:"count"`
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *GroupSendMessageCreateTemplateListReq) List() (*GroupSendMessageCreateTemplateListResp, error) {
|
|||
|
qs := orm.Eloquent.Table("group_send_message_template")
|
|||
|
if m.Status != 0 {
|
|||
|
qs = qs.Where("status=?", m.Status)
|
|||
|
}
|
|||
|
if m.Title != "" {
|
|||
|
qs = qs.Where("title LIKE '%" + m.Title + "%'")
|
|||
|
}
|
|||
|
|
|||
|
page := m.PageNum - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if m.PageSize == 0 {
|
|||
|
m.PageSize = 10
|
|||
|
}
|
|||
|
resp := &GroupSendMessageCreateTemplateListResp{PageNum: m.PageNum}
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.Count = uint32(count)
|
|||
|
|
|||
|
var groupSends []GroupSendMessageTemplate
|
|||
|
err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&groupSends).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.List = groupSends
|
|||
|
|
|||
|
return resp, nil
|
|||
|
}
|
|||
|
|
|||
|
func CreateInviteMemberReport() {
|
|||
|
date := time.Now().AddDate(0, 0, 1)
|
|||
|
if date.Day() != 1 {
|
|||
|
return
|
|||
|
}
|
|||
|
var cooperatives []CooperativeBusiness
|
|||
|
err := orm.Eloquent.Table("cooperative_business").Find(&cooperatives).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("cooperative err:", err)
|
|||
|
return
|
|||
|
}
|
|||
|
for i, _ := range cooperatives {
|
|||
|
cooperatives[i].InviteMemberReport()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (m *CooperativeBusiness) InviteMemberReport() {
|
|||
|
var users []UserInfo
|
|||
|
err := orm.Eloquent.Table("user").Where("cooperative_business_id=?", m.ID).Where("user_type=2").Find(&users).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("cooperative err:", err)
|
|||
|
return
|
|||
|
}
|
|||
|
for i, _ := range users {
|
|||
|
m.UserInviteReport(users[i])
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) {
|
|||
|
//end := InDayZero(1)
|
|||
|
//start := end.AddDate(0, -1, 0)
|
|||
|
reportTime := time.Now().AddDate(0, 0, 1).Format("2006-01")
|
|||
|
//var userInvites []UserInvite
|
|||
|
//qs := orm.Eloquent.Table("user_invite").Where("from_uid=?", userInfo.Uid).
|
|||
|
// Where("member_status=?", 2).Where("user_type=?", 2).
|
|||
|
// Where("member_open_time>?", start).Where("member_open_time<?", end)
|
|||
|
//qs = qs.Where("action=2").Where("spend_type=2")
|
|||
|
//err := qs.Find(&userInvites).Error
|
|||
|
//if err != nil && err != RecordNotFound {
|
|||
|
// logger.Error("cooperative err:", err)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//reportTime := start.Format("2006-01")
|
|||
|
//m.SetMemberDeductConfig()
|
|||
|
m.SetAssistantMemberDeductConfig(uint32(userInfo.StoreId))
|
|||
|
if m.CooperativeAssistantMemberDeduct == nil {
|
|||
|
logger.Error("cooperative assistant member deduct is nil")
|
|||
|
return
|
|||
|
}
|
|||
|
exist, err := QueryRecordExist(fmt.Sprintf(
|
|||
|
"SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND date='%s' AND store_id=%d AND uid=%d",
|
|||
|
userInfo.CooperativeBusinessId, reportTime, userInfo.StoreId, userInfo.Uid))
|
|||
|
if err != nil {
|
|||
|
logger.Error("cooperative member promotion record exist err:", err)
|
|||
|
return
|
|||
|
}
|
|||
|
report := &InviteMemberReport{
|
|||
|
Uid: userInfo.Uid,
|
|||
|
StoreId: uint32(userInfo.StoreId),
|
|||
|
GoldCount: 0,
|
|||
|
PlatinumCount: 0,
|
|||
|
BlackGoldCount: 0,
|
|||
|
Date: reportTime,
|
|||
|
DeductAmount: 0,
|
|||
|
CooperativeBusinessId: userInfo.CooperativeBusinessId,
|
|||
|
CooperativeName: userInfo.CooperativeName,
|
|||
|
GoldDeduct: m.CooperativeAssistantMemberDeduct.GoldDeduct,
|
|||
|
PlatinumDeduct: m.CooperativeAssistantMemberDeduct.PlatinumDeduct,
|
|||
|
BlackGoldDeduct: m.CooperativeAssistantMemberDeduct.BlackGoldDeduct,
|
|||
|
}
|
|||
|
|
|||
|
//for i, _ := range userInvites {
|
|||
|
// switch userInvites[i].MemberLevel {
|
|||
|
// case 2:
|
|||
|
// report.GoldCount += 1
|
|||
|
// case 4:
|
|||
|
// report.PlatinumCount += 1
|
|||
|
// case 5:
|
|||
|
// report.BlackGoldCount += 1
|
|||
|
// }
|
|||
|
//}
|
|||
|
//report.DeductAmount += report.GoldCount * m.CooperativeAssistantMemberDeduct.GoldDeduct
|
|||
|
//report.DeductAmount += report.PlatinumCount * m.CooperativeAssistantMemberDeduct.PlatinumDeduct
|
|||
|
//report.DeductAmount += report.BlackGoldCount * m.CooperativeAssistantMemberDeduct.BlackGoldDeduct
|
|||
|
if exist {
|
|||
|
//err = orm.Eloquent.Save(report).Error
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("invite member report err:", err)
|
|||
|
//}
|
|||
|
logger.Error("member report exist ")
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//if len(userInvites) == 0 {
|
|||
|
// err = orm.Eloquent.Create(report).Error
|
|||
|
// if err != nil {
|
|||
|
// logger.Error("Create report err:", err)
|
|||
|
// }
|
|||
|
// return
|
|||
|
//}
|
|||
|
|
|||
|
err = orm.Eloquent.Create(report).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("Create report err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func GetSysUser(suid interface{}) (SysUser, error) {
|
|||
|
fmt.Println("sysUid:", suid)
|
|||
|
var sUser SysUser
|
|||
|
err := orm.Eloquent.Table("sys_user").Where(fmt.Sprintf("user_id=%.0f", suid.(float64))).Find(&sUser).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("invite member report err:", err)
|
|||
|
return sUser, err
|
|||
|
}
|
|||
|
|
|||
|
return sUser, nil
|
|||
|
}
|
|||
|
|
|||
|
type AssistantInviteMemberReportReq struct {
|
|||
|
CooperativeBusinessId uint32 `json:"cooperative_business_id"`
|
|||
|
//ParaCooperativeId uint32 `json:"para_cooperative_id"`
|
|||
|
StoreId uint32 `json:"store_id"` // 门店id
|
|||
|
SysUser SysUser `json:"sys_user"`
|
|||
|
Date string `json:"date"`
|
|||
|
Page int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, error) {
|
|||
|
var memberReport []InviteMemberReport
|
|||
|
var users []UserInfo
|
|||
|
err := orm.Eloquent.Table("user").Where("user_type=2").Where("shop_assistant_name=''").Find(&users).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return memberReport, 0, err
|
|||
|
}
|
|||
|
uids := make([]uint32, 0, len(users))
|
|||
|
for i, _ := range users {
|
|||
|
uids = append(uids, users[i].Uid)
|
|||
|
}
|
|||
|
|
|||
|
qs := orm.Eloquent.Table("invite_member_report")
|
|||
|
if m.SysUser.UserId != 1 {
|
|||
|
qs = qs.Where("cooperative_business_id=?", m.SysUser.CooperativeBusinessId)
|
|||
|
} else {
|
|||
|
qs = qs.Where("cooperative_business_id=?", m.CooperativeBusinessId)
|
|||
|
}
|
|||
|
if len(uids) > 0 {
|
|||
|
qs = qs.Where("uid NOT IN (?)", uids)
|
|||
|
}
|
|||
|
if m.StoreId != 0 {
|
|||
|
qs = qs.Where("store_id=?", m.StoreId)
|
|||
|
}
|
|||
|
if m.Date != "" {
|
|||
|
qs = qs.Where("date=?", m.Date)
|
|||
|
}
|
|||
|
//qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid)
|
|||
|
var count int64
|
|||
|
err = qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", err)
|
|||
|
return memberReport, 0, err
|
|||
|
}
|
|||
|
page := m.Page - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if m.PageSize == 0 {
|
|||
|
m.PageSize = 10
|
|||
|
}
|
|||
|
//totalPage := int(count)/m.PageSize + 1
|
|||
|
|
|||
|
err = qs.Order("store_id DESC,id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&memberReport).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("err:", err)
|
|||
|
return memberReport, count, err
|
|||
|
}
|
|||
|
|
|||
|
//assistant := GetUserByUid(m.Uid)
|
|||
|
//cooperative := new(CooperativeBusiness)
|
|||
|
//cooperative.ID = assistant.CooperativeBusinessId
|
|||
|
//cooperative.SetAssistantMemberDeductConfig(uint32(assistant.StoreId))
|
|||
|
//fmt.Println("CooperativeBusinessId:", assistant.CooperativeBusinessId, assistant.StoreId)
|
|||
|
//fmt.Println("CooperativeAssistantMemberDeduct:", cooperative.CooperativeAssistantMemberDeduct)
|
|||
|
//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]
|
|||
|
// fmt.Println("report:", report)
|
|||
|
// 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
|
|||
|
//}
|
|||
|
memberReport = InviteMemberReportListSetUser(memberReport)
|
|||
|
return memberReport, count, nil
|
|||
|
}
|
|||
|
|
|||
|
func InviteMemberReportListSetUser(list []InviteMemberReport) []InviteMemberReport {
|
|||
|
ids := make([]uint32, 0, len(list))
|
|||
|
for i, _ := range list {
|
|||
|
ids = append(ids, list[i].Uid)
|
|||
|
}
|
|||
|
if len(ids) == 0 {
|
|||
|
return list
|
|||
|
}
|
|||
|
|
|||
|
infoMap, err := GetUserInfoMap(ids)
|
|||
|
if err != nil {
|
|||
|
logger.Error("user info map err:", err)
|
|||
|
return list
|
|||
|
}
|
|||
|
|
|||
|
for i, _ := range list {
|
|||
|
v, ok := infoMap[list[i].Uid]
|
|||
|
if ok {
|
|||
|
list[i].UserInfo = &v
|
|||
|
}
|
|||
|
fmt.Println("UserInfo:", v)
|
|||
|
}
|
|||
|
|
|||
|
return list
|
|||
|
}
|
|||
|
|
|||
|
func InviteMemberReportListSetStore(list []InviteMemberReport) []InviteMemberReport {
|
|||
|
ids := make([]uint32, 0, len(list))
|
|||
|
for i, _ := range list {
|
|||
|
ids = append(ids, list[i].StoreId)
|
|||
|
}
|
|||
|
if len(ids) == 0 {
|
|||
|
return list
|
|||
|
}
|
|||
|
storeMap := GetStoreMapByIds(ids)
|
|||
|
//infoMap, err := GetUserInfoMap(ids)
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("user info map err:", err)
|
|||
|
// return list
|
|||
|
//}
|
|||
|
|
|||
|
for i, _ := range list {
|
|||
|
v, ok := storeMap[uint64(list[i].StoreId)]
|
|||
|
if ok {
|
|||
|
list[i].Store = v
|
|||
|
}
|
|||
|
fmt.Println("UserInfo:", v)
|
|||
|
}
|
|||
|
|
|||
|
return list
|
|||
|
}
|
|||
|
|
|||
|
func GetCooperativeBusinessId(c *gin.Context) (uint32, error) {
|
|||
|
data, _ := c.Get(jwtauth.JwtPayloadKey)
|
|||
|
sysUid, ok := data.(jwtauth.MapClaims)["identity"]
|
|||
|
if !ok {
|
|||
|
logger.Error("sys uid err")
|
|||
|
app.Error(c, http.StatusInternalServerError, errors.New("sys uid err"), "查询失败")
|
|||
|
return 0, errors.New("sys uid err")
|
|||
|
}
|
|||
|
sysUser, err := GetSysUser(sysUid)
|
|||
|
if err != nil {
|
|||
|
logger.Error("sys user err:", err)
|
|||
|
app.Error(c, http.StatusInternalServerError, err, "查询失败")
|
|||
|
return 0, err
|
|||
|
}
|
|||
|
//req.CooperativeBusinessId = sysUser.CooperativeBusinessId
|
|||
|
return sysUser.CooperativeBusinessId, nil
|
|||
|
}
|
|||
|
|
|||
|
func GetSysUserByCtx(c *gin.Context) (*SysUser, error) {
|
|||
|
//data, _ := c.Get(jwtauth.JwtPayloadKey)
|
|||
|
//sysUid, ok := data.(jwtauth.MapClaims)["identity"]
|
|||
|
//if !ok {
|
|||
|
// logger.Error("sys uid err")
|
|||
|
// app.Error(c, http.StatusInternalServerError, errors.New("sys uid err"), "查询失败")
|
|||
|
// return nil, errors.New("sys uid err")
|
|||
|
//}
|
|||
|
//sysUser, err := GetSysUser(sysUid)
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("sys user err:", err)
|
|||
|
// app.Error(c, http.StatusInternalServerError, err, "查询失败")
|
|||
|
// return nil, err
|
|||
|
//}
|
|||
|
//req.CooperativeBusinessId = sysUser.CooperativeBusinessId
|
|||
|
//return &sysUser, nil
|
|||
|
|
|||
|
data, _ := c.Get(jwtauth.JwtPayloadKey)
|
|||
|
mapClaims := data.(jwtauth.MapClaims)
|
|||
|
sysUid := float64(0)
|
|||
|
if v, ok := mapClaims["identity"]; ok {
|
|||
|
sysUid = v.(float64)
|
|||
|
}
|
|||
|
//fmt.Println("sysUid:", sysUid)
|
|||
|
|
|||
|
//req.SysUid = fmt.Sprintf("%.0f", sysUid)
|
|||
|
var sysUser SysUser
|
|||
|
err := orm.Eloquent.Table("sys_user").Where("user_id=?", uint32(sysUid)).Find(&sysUser).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("sys user err:", err)
|
|||
|
app.Error(c, http.StatusInternalServerError, err, "操作失败")
|
|||
|
return &sysUser, err
|
|||
|
}
|
|||
|
return &sysUser, nil
|
|||
|
}
|
|||
|
|
|||
|
//type CooperativeStockExportReq struct {
|
|||
|
// CooperativeBusinessId uint32 `json:"cooperative_business_id"`
|
|||
|
// StoreId uint32 `json:"store_id"` // 门店id
|
|||
|
//}
|
|||
|
//
|
|||
|
//func (r *CooperativeStockExportReq) Export() {
|
|||
|
//
|
|||
|
//}
|
|||
|
//OrderType: 1-物流支付 2-取消物流租卡 3-滞纳金 4-收回卡 5-退物流费 6-商城购物 7-购买商品取消订单 8-购买商品订单退货
|
|||
|
|
|||
|
// gen:qs
|
|||
|
type UserOpenMemberRecord struct {
|
|||
|
Model
|
|||
|
|
|||
|
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"`
|
|||
|
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
|
|||
|
|
|||
|
Order *Order `json:"order" gorm:"-"`
|
|||
|
ShareCardRetrieve *ShareCardRetrieve `json:"share_card_retrieve" gorm:"-"`
|
|||
|
GoodsOrder *GoodsOrder `json:"goods_order" gorm:"-"`
|
|||
|
//Attach string `json:"attach"`
|
|||
|
}
|
|||
|
|
|||
|
func (o *UserOpenMemberRecord) TableName() string {
|
|||
|
return "user_open_member_record"
|
|||
|
}
|
|||
|
|
|||
|
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 = orm.Eloquent.Create(m).Error
|
|||
|
//err = m.Insert()
|
|||
|
if err != nil {
|
|||
|
logger.Error("insert user open member record err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
orderRefund := pay.OrderRefund{
|
|||
|
OutTradeNo: outTradeNo,
|
|||
|
OutRefundNo: m.OpenNo,
|
|||
|
NotifyUrl: configInfo.RefundNotifyUrl,
|
|||
|
Amount: pay.OrderRefundAmount{
|
|||
|
Refund: amount,
|
|||
|
Total: amount,
|
|||
|
Currency: "CNY",
|
|||
|
},
|
|||
|
}
|
|||
|
err = pay.TransactionOrderRefund(orderRefund)
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
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
|
|||
|
}
|
|||
|
|
|||
|
func GetOrderSn() string {
|
|||
|
var orderSn string
|
|||
|
for {
|
|||
|
//orderSn = utils.GetSerialNo32HEXString()
|
|||
|
orderSn = utils.GenSerialNo()
|
|||
|
var count int64
|
|||
|
err := orm.Eloquent.Table("user_open_member_record").Where("open_no=?", orderSn).Count(&count)
|
|||
|
//count, err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(orderSn).Count()
|
|||
|
if err != nil {
|
|||
|
logger.Error("err:", err)
|
|||
|
}
|
|||
|
if count == 0 {
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
return orderSn
|
|||
|
}
|
|||
|
|
|||
|
func (m *OperationLog) AddLog() {
|
|||
|
defer func() {
|
|||
|
if err := recover(); err != nil {
|
|||
|
fmt.Println("recover err:", err)
|
|||
|
}
|
|||
|
}()
|
|||
|
go func() {
|
|||
|
err := orm.Eloquent.Create(m).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("create operation log err:")
|
|||
|
}
|
|||
|
}()
|
|||
|
}
|
|||
|
|
|||
|
func SendMessageMemberRenewal() {
|
|||
|
|
|||
|
//user.MemberExpire.Before(utils.Now().AddDate(0, 1, 0))
|
|||
|
//start := TodayZero().AddDate(0, 1, 0)
|
|||
|
////end := start.AddDate(0, 0, 1)
|
|||
|
//end := start
|
|||
|
//fmt.Println("end:", end.Format(TimeFormat))
|
|||
|
//var users []UserInfo
|
|||
|
//err := orm.Eloquent.Table("user").Where("member_level IN (2,4,5)").Where("member_expire < ?", end).Find(&users).Error
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("cooperative err:", err)
|
|||
|
// return
|
|||
|
//}
|
|||
|
fmt.Println("发送续费短息开始:")
|
|||
|
|
|||
|
start := TodayZero().AddDate(0, 0, GetActivityRenewalConfig().PopTrap)
|
|||
|
end := start.AddDate(0, 0, 1)
|
|||
|
var users []UserInfo
|
|||
|
err := orm.Eloquent.Table("user").Where("member_level IN (2,4,5)").
|
|||
|
Where("member_expire>?", start).Where("member_expire<?", end).Find(&users).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("cooperative err:", err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
tels := ""
|
|||
|
uids := make([]uint32, 0, len(users))
|
|||
|
for i, _ := range users {
|
|||
|
if users[i].Tel != "" {
|
|||
|
tels += users[i].Tel + ","
|
|||
|
fmt.Println("user:", users[i].Uid, users[i].Tel)
|
|||
|
uids = append(uids, users[i].Uid)
|
|||
|
}
|
|||
|
}
|
|||
|
if tels != "" {
|
|||
|
message := "【go2switch】提醒:您的租卡会员时长仅剩余一个月,现在续费最高立减200元!赶快进入小程序领取优惠吧~"
|
|||
|
err = SmsSend(tels[:len(tels)-1], message)
|
|||
|
if err != nil {
|
|||
|
logger.Errorf("SmsSend err:", err)
|
|||
|
return
|
|||
|
}
|
|||
|
//fmt.Println("tels:", tels)
|
|||
|
//fmt.Printf("uids:", uids)
|
|||
|
renewalLogs, err := GetActionUserRenewalLogMulti(uids, UserRenewalLogSendMessage)
|
|||
|
if err != nil {
|
|||
|
logger.Error("renewalLogs err:", err)
|
|||
|
}
|
|||
|
renewalLogMap := make(map[uint32]UserRenewalLog, 0)
|
|||
|
for i, _ := range renewalLogs {
|
|||
|
renewalLogMap[renewalLogs[i].Uid] = renewalLogs[i]
|
|||
|
}
|
|||
|
|
|||
|
for i, _ := range users {
|
|||
|
renewalLog := &UserRenewalLog{
|
|||
|
Uid: users[i].Uid,
|
|||
|
Action: UserRenewalLogSendMessage,
|
|||
|
MemberExpire: users[i].MemberExpire,
|
|||
|
Type: 0,
|
|||
|
Serial: uint32(users[i].MemberExpire.Unix()),
|
|||
|
}
|
|||
|
|
|||
|
v, _ := renewalLogMap[users[i].Uid]
|
|||
|
renewalLog.RenewalNum = v.RenewalNum + 1
|
|||
|
|
|||
|
err = orm.Eloquent.Create(renewalLog).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("create renewal log err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
fmt.Println("发送续费短息完成...")
|
|||
|
}
|
|||
|
|
|||
|
//func PayConfigInfo() (*PayConfig, error) {
|
|||
|
// payConfig := new(PayConfig)
|
|||
|
// var configAllocation Config
|
|||
|
// err := NewConfigQuerySet(DB).NameEq(ConfigNamePay).One(&configAllocation)
|
|||
|
// if err != nil {
|
|||
|
// logger.Error("err:", err)
|
|||
|
// return payConfig, err
|
|||
|
// }
|
|||
|
//
|
|||
|
// err = json.Unmarshal([]byte(configAllocation.Value), payConfig)
|
|||
|
// if err != nil {
|
|||
|
// logger.Error("err:", err)
|
|||
|
// return payConfig, err
|
|||
|
// }
|
|||
|
//
|
|||
|
// return payConfig, nil
|
|||
|
//}
|
|||
|
|
|||
|
//type PayConfig struct {
|
|||
|
// MemberFee uint32 `json:"member_fee"`
|
|||
|
// DepositFee uint32 `json:"deposit_fee"`
|
|||
|
// NotifyUrl string `json:"notify_url"`
|
|||
|
// RefundNotifyUrl string `json:"refund_notify_url"`
|
|||
|
//}
|
|||
|
|
|||
|
type MemberStatisticDaily struct {
|
|||
|
Model
|
|||
|
|
|||
|
MemberLevel uint32 `json:"member_level"`
|
|||
|
Date string `json:"date"`
|
|||
|
DateTime time.Time `json:"date_time"`
|
|||
|
Increase int64 `json:"increase"`
|
|||
|
Expire int64 `json:"expire"`
|
|||
|
Net int64 `json:"net"`
|
|||
|
Accumulative int64 `json:"accumulative"`
|
|||
|
// member_statistic_daily
|
|||
|
}
|
|||
|
|
|||
|
func IndexMemberStatistic() {
|
|||
|
fmt.Println("会员数据统计开始")
|
|||
|
levels := []uint32{2, 4, 5}
|
|||
|
today := TodayZero()
|
|||
|
//today, _ = time.Parse(TimeFormat, "2022-08-09 00:00:00")
|
|||
|
for i, _ := range levels {
|
|||
|
IndexMemberLevelStatistic(levels[i], today)
|
|||
|
}
|
|||
|
fmt.Println("会员数据统计完成...")
|
|||
|
}
|
|||
|
|
|||
|
func IndexMemberLevelStatistic(level uint32, date time.Time) {
|
|||
|
var (
|
|||
|
increase, expire, net, accumulative, origination int64
|
|||
|
)
|
|||
|
startDate := date.AddDate(0, 0, -1)
|
|||
|
endDate := date
|
|||
|
err := orm.Eloquent.Table("user").Where("member_level=?", level).
|
|||
|
Where("open_member_time>?", startDate).
|
|||
|
Where("open_member_time<?", endDate).Count(&increase).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("increase err:", err)
|
|||
|
}
|
|||
|
err = orm.Eloquent.Table("user").Where("member_level=?", level).
|
|||
|
Where("member_expire>?", startDate).
|
|||
|
Where("member_expire<?", endDate).Count(&expire).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("increase err:%#v", err)
|
|||
|
}
|
|||
|
//// TODO
|
|||
|
//var statisticDaily MemberStatisticDaily
|
|||
|
//err = orm.Eloquent.Table("member_statistic_daily").Where("member_level=?", level).
|
|||
|
// //Where("open_member_time>?", time.Time{}).
|
|||
|
// Where("date=?", startDate.AddDate(0, 0, -1).Format(DateFormat)).
|
|||
|
// Find(&statisticDaily).Error
|
|||
|
//if err != nil {
|
|||
|
// logger.Error("increase err:", err)
|
|||
|
//}
|
|||
|
//fmt.Println("increase:", increase)
|
|||
|
//fmt.Println("expire:", expire)
|
|||
|
memberRecordType := 0
|
|||
|
if level == 2 {
|
|||
|
memberRecordType = 4
|
|||
|
} else if level == 4 {
|
|||
|
memberRecordType = 5
|
|||
|
} else if level == 5 {
|
|||
|
memberRecordType = 6
|
|||
|
}
|
|||
|
if memberRecordType != 0 {
|
|||
|
err = orm.Eloquent.Table("user_member_record").Where("type=?", memberRecordType).
|
|||
|
Where("created_at>?", startDate).Where("created_at<?", endDate).Count(&origination).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("origination err:", err)
|
|||
|
}
|
|||
|
}
|
|||
|
increase += origination
|
|||
|
|
|||
|
net = increase - expire
|
|||
|
//accumulative = statisticDaily.Accumulative + increase
|
|||
|
|
|||
|
err = orm.Eloquent.Table("user").Where("member_level=?", level).
|
|||
|
Where("member_expire>?", time.Now()).Count(&accumulative).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("increase err:%#v", err)
|
|||
|
}
|
|||
|
|
|||
|
fmt.Println("net:", net)
|
|||
|
daily := &MemberStatisticDaily{
|
|||
|
MemberLevel: level,
|
|||
|
Date: startDate.Format(DateFormat),
|
|||
|
DateTime: startDate,
|
|||
|
Increase: increase,
|
|||
|
Expire: expire,
|
|||
|
Net: net,
|
|||
|
Accumulative: accumulative,
|
|||
|
}
|
|||
|
|
|||
|
err = orm.Eloquent.Create(&daily).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("create member statistic daily err:", err)
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
type MemberStatisticDailyListReq struct {
|
|||
|
MemberLevel uint32 `json:"member_level"`
|
|||
|
//StartDate string `json:"start_date"`
|
|||
|
//EndDate string `json:"end_date"`
|
|||
|
StartDate time.Time `json:"start_date"`
|
|||
|
EndDate time.Time `json:"end_date"`
|
|||
|
Days uint32 `json:"days"`
|
|||
|
IsExport uint32 `json:"is_export"` // 1-导出
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
PageSize int `json:"pageSize"`
|
|||
|
}
|
|||
|
|
|||
|
type MemberStatisticDailyListRsp struct {
|
|||
|
Count int64 `json:"count"`
|
|||
|
List []MemberStatisticDaily `json:"list"`
|
|||
|
PageIndex int `json:"pageIndex"`
|
|||
|
Url string `json:"url"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *MemberStatisticDailyListReq) List() (*MemberStatisticDailyListRsp, error) {
|
|||
|
rsp := &MemberStatisticDailyListRsp{
|
|||
|
PageIndex: m.PageNum,
|
|||
|
}
|
|||
|
m.PageNum = m.PageNum - 1
|
|||
|
if m.PageNum < 0 {
|
|||
|
m.PageNum = 0
|
|||
|
}
|
|||
|
if m.Days > 0 {
|
|||
|
m.PageSize = int(m.Days)
|
|||
|
}
|
|||
|
|
|||
|
qs := orm.Eloquent.Table("member_statistic_daily")
|
|||
|
//if m.StartDate != "" {
|
|||
|
// start, _ := time.Parse(DateTimeFormat, m.StartDate)
|
|||
|
// qs = qs.Where("date_time>=?", start)
|
|||
|
//}
|
|||
|
//if m.EndDate != "" {
|
|||
|
// end, _ := time.Parse(DateTimeFormat, m.EndDate)
|
|||
|
// qs = qs.Where("date_time<=?", end)
|
|||
|
//}
|
|||
|
if !m.StartDate.IsZero() {
|
|||
|
qs = qs.Where("date_time>=?", m.StartDate)
|
|||
|
}
|
|||
|
if !m.EndDate.IsZero() {
|
|||
|
qs = qs.Where("date_time<=?", m.EndDate)
|
|||
|
}
|
|||
|
if m.Days > 0 {
|
|||
|
//end := TodayZero()
|
|||
|
//start := end.AddDate(0, 0, int(m.Days)*(-1))
|
|||
|
qs = qs.Where("date_time>=?", m.StartDate)
|
|||
|
qs = qs.Where("date_time<=?", m.EndDate)
|
|||
|
}
|
|||
|
if m.MemberLevel != 0 {
|
|||
|
qs = qs.Where("member_level=?", m.MemberLevel)
|
|||
|
}
|
|||
|
var dailys []MemberStatisticDaily
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", err)
|
|||
|
return rsp, err
|
|||
|
}
|
|||
|
rsp.Count = count
|
|||
|
//err = qs.Order("id DESC").Offset(m.PageNum * m.PageSize).Limit(m.PageSize).Find(&dailys).Error
|
|||
|
if m.IsExport == 1 {
|
|||
|
err = qs.Order("date_time DESC").Find(&dailys).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("dailys err:", err)
|
|||
|
return rsp, err
|
|||
|
}
|
|||
|
listExport, err := MemberStatisticDailyListExport(dailys)
|
|||
|
if err != nil {
|
|||
|
logger.Error("list export err:", err)
|
|||
|
}
|
|||
|
rsp.Url = listExport
|
|||
|
} else {
|
|||
|
err = qs.Order("date_time DESC").Offset(m.PageNum * m.PageSize).Limit(m.PageSize).Find(&dailys).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("dailys err:", err)
|
|||
|
return rsp, err
|
|||
|
}
|
|||
|
rsp.List = dailys
|
|||
|
}
|
|||
|
|
|||
|
return rsp, nil
|
|||
|
}
|
|||
|
|
|||
|
func MemberStatisticDailyListExport(dailys []MemberStatisticDaily) (string, error) {
|
|||
|
file := excelize.NewFile()
|
|||
|
streamWriter, err := file.NewStreamWriter("Sheet1")
|
|||
|
if err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
|
|||
|
//url := "http://39.108.188.218:8000/img/export/"
|
|||
|
|
|||
|
fileName := "会员统计" + time.Now().Format("2006-01-02 15:04:05") + ".xlsx"
|
|||
|
|
|||
|
title := []interface{}{"时间", "新增会员数", "会员过期数", "净增会员数", "累计会员数"}
|
|||
|
cell, _ := excelize.CoordinatesToCellName(1, 1)
|
|||
|
if err = streamWriter.SetRow(cell, title); err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
var row []interface{}
|
|||
|
for rowId := 0; rowId < len(dailys); rowId++ {
|
|||
|
row = []interface{}{dailys[rowId].Date, dailys[rowId].Increase, dailys[rowId].Expire, dailys[rowId].Net, dailys[rowId].Accumulative}
|
|||
|
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/" + fileName); err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
return ExportUrl + fileName, nil
|
|||
|
}
|
|||
|
|
|||
|
func UserInviteRecordListSetAssistantName(records []UserInviteRecord) {
|
|||
|
uids := make([]uint32, 0, len(records))
|
|||
|
for i, _ := range records {
|
|||
|
if records[i].ShopAssistantName == "" {
|
|||
|
uids = append(uids, records[i].FromUid)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
infoMap, err := GetUserInfoMap(uids)
|
|||
|
if err != nil {
|
|||
|
logger.Error("info map err:", err)
|
|||
|
}
|
|||
|
|
|||
|
for i, _ := range records {
|
|||
|
v, ok := infoMap[records[i].FromUid]
|
|||
|
if ok && records[i].ShopAssistantName == "" {
|
|||
|
records[i].ShopAssistantName = v.ShopAssistantName
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
type ExpireMemberSmsSendListReq struct {
|
|||
|
Status uint32 `json:"status"` // 1-待发送 2-已发送
|
|||
|
Tel string `json:"tel"`
|
|||
|
//StartTime string `json:"start_time"` // 开始时间
|
|||
|
//EndTime string `json:"end_time"` // 结束时间
|
|||
|
StartTime time.Time `json:"start_time"` // 开始时间
|
|||
|
EndTime time.Time `json:"end_time"` // 结束时间
|
|||
|
PageNum int `json:"page_num"`
|
|||
|
PageSize int `json:"page_size"`
|
|||
|
}
|
|||
|
type ExpireMemberSmsSendListResp struct {
|
|||
|
List []ExpireMemberSmsSend `json:"list"`
|
|||
|
Count uint32 `json:"count"`
|
|||
|
PageNum int `json:"pageIndex"`
|
|||
|
}
|
|||
|
|
|||
|
func (m *ExpireMemberSmsSendListReq) List() (*ExpireMemberSmsSendListResp, error) {
|
|||
|
resp := &ExpireMemberSmsSendListResp{PageNum: m.PageNum}
|
|||
|
qs := orm.Eloquent.Table("expire_member_sms_send")
|
|||
|
if m.Status != 0 {
|
|||
|
qs = qs.Where("status=?", m.Status)
|
|||
|
}
|
|||
|
if m.Tel != "" {
|
|||
|
qs = qs.Where("tel LIKE '%" + m.Tel + "%'")
|
|||
|
}
|
|||
|
//if m.StartTime != "" {
|
|||
|
// parse, err := time.Parse(DateTimeFormat, m.StartTime)
|
|||
|
// if err != nil {
|
|||
|
// logger.Errorf("err:", err)
|
|||
|
// return resp, err
|
|||
|
// }
|
|||
|
// qs = qs.Where("send_time > ?", parse)
|
|||
|
//}
|
|||
|
//if m.EndTime != "" {
|
|||
|
// parse, err := time.Parse(DateTimeFormat, m.EndTime)
|
|||
|
// if err != nil {
|
|||
|
// logger.Errorf("err:", err)
|
|||
|
// return resp, err
|
|||
|
// }
|
|||
|
// parse = parse.AddDate(0, 0, 1)
|
|||
|
// qs = qs.Where("send_time < ?", parse)
|
|||
|
//}
|
|||
|
if !m.StartTime.IsZero() {
|
|||
|
qs = qs.Where("send_time > ?", m.StartTime)
|
|||
|
}
|
|||
|
if !m.EndTime.IsZero() {
|
|||
|
parse := m.EndTime.AddDate(0, 0, 1)
|
|||
|
qs = qs.Where("send_time < ?", parse)
|
|||
|
}
|
|||
|
page := m.PageNum - 1
|
|||
|
if page < 0 {
|
|||
|
page = 0
|
|||
|
}
|
|||
|
if m.PageSize == 0 {
|
|||
|
m.PageSize = 10
|
|||
|
}
|
|||
|
|
|||
|
var count int64
|
|||
|
err := qs.Count(&count).Error
|
|||
|
if err != nil {
|
|||
|
logger.Error("count err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.Count = uint32(count)
|
|||
|
|
|||
|
var smsSends []ExpireMemberSmsSend
|
|||
|
err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&smsSends).Error
|
|||
|
if err != nil && err != RecordNotFound {
|
|||
|
logger.Error("err:", err)
|
|||
|
return resp, err
|
|||
|
}
|
|||
|
resp.List = smsSends
|
|||
|
|
|||
|
return resp, nil
|
|||
|
}
|
|||
|
|
|||
|
//func (m *MemberStatisticDailyListReq) Export() (string, error) {
|
|||
|
// qs := orm.Eloquent.Table("member_statistic_daily")
|
|||
|
// if !m.StartDate.IsZero() {
|
|||
|
// qs = qs.Where("date_time>=?", m.StartDate)
|
|||
|
// }
|
|||
|
// if !m.EndDate.IsZero() {
|
|||
|
// qs = qs.Where("date_time<=?", m.EndDate)
|
|||
|
// }
|
|||
|
// if m.Days > 0 {
|
|||
|
// qs = qs.Where("date_time>=?", m.StartDate)
|
|||
|
// qs = qs.Where("date_time<=?", m.EndDate)
|
|||
|
// }
|
|||
|
// if m.MemberLevel != 0 {
|
|||
|
// qs = qs.Where("member_level=?", m.MemberLevel)
|
|||
|
// }
|
|||
|
// var dailys []MemberStatisticDaily
|
|||
|
// err := qs.Order("date_time DESC").Find(&dailys).Error
|
|||
|
// if err != nil && err != RecordNotFound {
|
|||
|
// logger.Error("dailys err:", err)
|
|||
|
// return "", err
|
|||
|
// }
|
|||
|
//
|
|||
|
// file := excelize.NewFile()
|
|||
|
// streamWriter, err := file.NewStreamWriter("Sheet1")
|
|||
|
// if err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
// }
|
|||
|
//
|
|||
|
// url := "http://39.108.188.218:8000/img/export/"
|
|||
|
// fileName := "/www/server/images/export/" + "会员统计" + time.Now().Format("2006-01-02 15:04:05") + ".xlsx"
|
|||
|
//
|
|||
|
// title := []interface{}{"时间", "新增会员数", "会员过期数", "净增会员数", "累计会员数"}
|
|||
|
// cell, _ := excelize.CoordinatesToCellName(1, 1)
|
|||
|
// if err = streamWriter.SetRow(cell, title); err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
// }
|
|||
|
// var row []interface{}
|
|||
|
// for rowId := 0; rowId < len(dailys); rowId++ {
|
|||
|
// row = []interface{}{dailys[rowId].Date, dailys[rowId].Increase, dailys[rowId].Expire, dailys[rowId].Net, dailys[rowId].Accumulative}
|
|||
|
// 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(fileName); err != nil {
|
|||
|
// fmt.Println(err)
|
|||
|
// }
|
|||
|
// return url + fileName, nil
|
|||
|
//}
|