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"` Mark int8 `json:"mark"` //标记 Store *Store `json:"store" gorm:"-"` OrderCards []OrderCard `json:"order_cards" gorm:"foreignKey:uid;references:uid"` ForfeitPenalty int `json:"forfeit_penalty" gorm:"-"` //滞纳金 } func (m *UserInfo) TableName() string { return "user" } const ( UserTypeConsumer = 1 // 普通用户 UserTypeShopAssistant = 2 // 店员 ) const ( UNMARK = iota MARK ) 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"` // 备注 } type U struct { UserInfo MemberExpireDays uint32 `json:"member_expire_days"` //会员过期天数 } func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativeBusinessId int, tel, startTime, endTime, nameKey, sortFiled, sortType string, filter bool) ([]U, uint32, uint32, error) { var ( users = make([]U, 0) totalPage uint32 ) fmt.Println("tel:", tel) fmt.Println("nameKey:", nameKey) page -= 1 if page < 0 { page = 0 } if sortFiled == "" { sortFiled = "id" } if sortType == "" { sortType = "DESC" } 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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) return users, 0, 0, err } currentTime := time.Now() //计算过期天数 qs = qs.Select("*, CASE WHEN (member_level IN (2, 4, 5) AND member_expire < ?) THEN DATEDIFF(?,member_expire) ELSE 0 END AS member_expire_days", currentTime, currentTime) if filter { qs = orm.Eloquent.Table("(?) as a", qs) //qs = qs.Preload("OrderCards", func(db *gorm.DB) *gorm.DB { // return db.Where("pay_status = ? AND card_status IN (?)", 2, []int{1, 2, 3}). // Group("uid"). // Having("count(uid) > 0") //}) qs = qs.Select("a.*"). Joins("inner join order_card as oc on a.uid=oc.uid"). Where("pay_status = ? AND card_status IN (?)", 2, []int{1, 2, 3}). Group("oc.uid"). Having("count(oc.uid) > 0") qs = qs.Where("member_expire_days > 0").Where("mark = ?", UNMARK) } err = qs.Order(fmt.Sprintf("%s %s", sortFiled, sortType)).Offset(page * pageSize).Limit(pageSize).Find(&users).Error if err != nil && err != RecordNotFound { logger.Errorf("err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) return "" } qs = qs.Where("member_open_time > ?", parse) } if endTime != "" { parse, err := time.Parse(DateTimeFormat, endTime) if err != nil { logger.Errorf("err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", 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:", logger.Field("err", 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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("err",err)) // return "" // } // qs = qs.Where("member_open_time > ?", parse) // } // if endTime != "" { // parse, err := time.Parse(DateTimeFormat, endTime) // if err != nil { // logger.Errorf("err:",logger.Field("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:",logger.Field("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:",logger.Field("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:",logger.Field("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:",logger.Field("err",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:",logger.Field("err",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:", logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) } styleFillId1, err := file.NewStyle(styleFill1) if err != nil { logger.Error("err:", logger.Field("err", err)) } styleFillId2, err := file.NewStyle(styleFill2) if err != nil { logger.Error("err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) } } else { err = file.SetCellStyle(fSheet, cell, cell, styleBorderId) if err != nil { logger.Error("file set value err:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) } } else { err = file.SetCellStyle(fSheet, cell, cell, styleBorderId) if err != nil { logger.Error("file set value err:", logger.Field("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:", logger.Field("err", err)) } err = file.SetCellStyle(fSheet, cell, cell, styleBorderId) if err != nil { logger.Error("file set value err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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 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:", logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) } if count == 0 { break } } return orderSn } func (m *OperationLog) AddLog() { defer func() { if err := recover(); err != nil { fmt.Println("recover err:", logger.Field("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:",logger.Field("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 0 { message := "【go2switch】提醒:您的租卡会员时长仅剩余一个月,现在续费最高立减200元!赶快进入小程序领取优惠吧~" err = GtSendMessage(tels, message) if err != nil { logger.Errorf("SmsSend err:", logger.Field("err", err)) return } //fmt.Println("tels:", tels) //fmt.Printf("uids:", uids) renewalLogs, err := GetActionUserRenewalLogMulti(uids, UserRenewalLogSendMessage) if err != nil { logger.Error("renewalLogs err:", logger.Field("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:", logger.Field("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:",logger.Field("err",err)) // return payConfig, err // } // // err = json.Unmarshal([]byte(configAllocation.Value), payConfig) // if err != nil { // logger.Error("err:",logger.Field("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?", startDate). Where("member_expire?", time.Time{}). // Where("date=?", startDate.AddDate(0, 0, -1).Format(DateFormat)). // Find(&statisticDaily).Error //if err != nil { // logger.Error("increase err:",logger.Field("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?", time.Now()).Count(&accumulative).Error if err != nil { logger.Error("increase err:%#v", logger.Field("err", 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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err)) return rsp, err } listExport, err := MemberStatisticDailyListExport(dailys) if err != nil { logger.Error("list export err:", logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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:",logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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 //} func MarkUser(uid []uint32, mark int8) error { return orm.Eloquent.Table("user"). Where("uid in (?)", uid). Update("mark", mark).Error } // CheckPhoneExt 检测手机尾号是否一致 func (m *UserInfo) CheckPhoneExt(ext string, length int) bool { if ext == "" || m.Tel == "" { return false } total := len(m.Tel) if total >= length { sub := m.Tel[total-4:] return sub == ext } else { return false } }