@@ -0,0 +1,109 @@
|
||||
package activityser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/common/stderr"
|
||||
"91porn-server/models/v/activitymod"
|
||||
"91porn-server/web/webg"
|
||||
)
|
||||
|
||||
// 新增活动
|
||||
func Add(in activitymod.AddCond) stderr.Code {
|
||||
result, err := activitymod.Add(in)
|
||||
if err != nil {
|
||||
return stderr.ErrDbInsertError
|
||||
}
|
||||
log.Info(fmt.Sprintf("新增活动[%v]成功", result))
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 修改活动
|
||||
func Modify(in *activitymod.ModifyCond) stderr.Code {
|
||||
var jobStatus bool
|
||||
now := time.Now()
|
||||
// 获取活动信息
|
||||
activityDetail, err := activitymod.Get(in.ID)
|
||||
if err != nil {
|
||||
return stderr.ErrDbQueryError
|
||||
}
|
||||
// 活动开启限制
|
||||
if in.Status != nil {
|
||||
// 时间限制
|
||||
if *in.Status && (in.StartTime.After(now) || !in.EndTime.After(now)) {
|
||||
return stderr.ActivityDateError
|
||||
}
|
||||
// 开启/关闭任务
|
||||
if (*in.Status && !activityDetail.Status) || (!*in.Status && activityDetail.Status) {
|
||||
jobStatus = true
|
||||
}
|
||||
}
|
||||
if err = webg.VideoDB.Trans(func(t *db.MongoTool) error {
|
||||
if err = activitymod.Modify(t, in.Cond(), in.Bson()); err != nil {
|
||||
return stderr.ErrDbUpdateError
|
||||
}
|
||||
if jobStatus {
|
||||
if err = OpenBotDraw(in.ID, *in.Status); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}); err != nil {
|
||||
return stderr.ErrDbTransError
|
||||
}
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 查询列表
|
||||
func QueryAll(in *activitymod.QueryAllCond) (interface{}, stderr.Code) {
|
||||
var data map[string]interface{} = map[string]interface{}{
|
||||
"list": []interface{}{},
|
||||
"count": 0,
|
||||
}
|
||||
count, err := activitymod.Count(in.Query())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
if count == 0 {
|
||||
return data, stderr.Success
|
||||
}
|
||||
list, err := activitymod.QueryAll(in.Query(), in.Options())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data["count"] = count
|
||||
data["list"] = list
|
||||
return data, stderr.Success
|
||||
}
|
||||
|
||||
func QueryDropDownBox() (interface{}, stderr.Code) {
|
||||
list, err := activitymod.QueryDropDownBox()
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data := make([]map[string]interface{}, len(list))
|
||||
for i, v := range list {
|
||||
data[i] = map[string]interface{}{
|
||||
"label": v.Title,
|
||||
"value": v.ID.Hex(),
|
||||
}
|
||||
}
|
||||
return data, stderr.Success
|
||||
}
|
||||
|
||||
func LoadingJob() error {
|
||||
// 获取所有开启中活动
|
||||
activityList, err := activitymod.QueryDropDownBox()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, v := range activityList {
|
||||
if err = OpenBotDraw(v.ID, v.Status); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
package activityser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models/v/activitymod"
|
||||
"91porn-server/models/v/prizemod"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
var job JobCron
|
||||
|
||||
type JobCron struct {
|
||||
cron *cron.Cron
|
||||
cache map[primitive.ObjectID]cron.EntryID
|
||||
mutex sync.Mutex
|
||||
}
|
||||
|
||||
func init() {
|
||||
job = JobCron{
|
||||
cron: cron.New(cron.WithSeconds()),
|
||||
cache: make(map[primitive.ObjectID]cron.EntryID, 1),
|
||||
}
|
||||
job.cron.Start()
|
||||
}
|
||||
|
||||
type BotDraw struct {
|
||||
ActivityID primitive.ObjectID
|
||||
}
|
||||
|
||||
func (b BotDraw) Run() {
|
||||
var now time.Time = time.Now()
|
||||
// 随机种子
|
||||
randInt := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
// 随机获取n个马甲号
|
||||
names := GetFullName(randInt)
|
||||
// 获取大奖列表
|
||||
prizes, err := prizemod.GetHighPrizeListByActivityID(b.ActivityID)
|
||||
if err != nil {
|
||||
log.Error(fmt.Sprintf("获取大奖列表失败 [%v]", err))
|
||||
return
|
||||
}
|
||||
// 获取奖池信息
|
||||
prizePool, err := activitymod.GetPrizePool(b.ActivityID)
|
||||
if err != nil {
|
||||
log.Error(fmt.Sprintf("获取奖池信息失败 [%v]", err))
|
||||
return
|
||||
}
|
||||
// 增加抽奖记录
|
||||
records := make([]activitymod.UserRecord, len(names))
|
||||
for i, v := range names {
|
||||
p := prizes[randInt.Intn(len(prizes))]
|
||||
records[i] = activitymod.UserRecord{
|
||||
ActivityID: b.ActivityID,
|
||||
VIPCardID: p.VIPCardID,
|
||||
UserName: v,
|
||||
Name: p.Name,
|
||||
Type: p.Type,
|
||||
Price: p.Price,
|
||||
Count: p.Count,
|
||||
Value: p.Value,
|
||||
Level: p.Level,
|
||||
DrawPrice: prizePool.Price,
|
||||
CreateTime: now.Add(-time.Duration(randInt.Int63n(3600)) * time.Second),
|
||||
}
|
||||
}
|
||||
// 插入中奖信息
|
||||
if err := activitymod.AddMany(records); err != nil {
|
||||
log.Error(fmt.Sprintf("插入中奖信息失败 [%v]", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func GetFullName(randInt *rand.Rand) []string {
|
||||
var lastName = []string{
|
||||
"赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋",
|
||||
"沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏",
|
||||
"陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭",
|
||||
"郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "任", "袁", "柳", "鲍", "史", "唐", "费", "薛",
|
||||
"雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "安", "常", "傅", "卞", "齐", "元", "顾", "孟",
|
||||
"平", "黄", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "狄", "米", "伏", "成", "戴", "谈",
|
||||
"宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "季", "贾",
|
||||
"路", "娄", "江", "童", "颜", "郭", "梅", "盛", "林", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田",
|
||||
"樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "管", "卢", "莫", "柯", "房", "裘", "缪", "解", "应",
|
||||
"宗", "丁", "宣", "邓", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "龚", "程", "嵇", "邢",
|
||||
"裴", "陆", "荣", "翁", "荀", "于", "惠", "甄", "曲", "封", "储", "仲", "伊", "宁", "仇", "甘", "武",
|
||||
"符", "刘", "景", "詹", "龙", "叶", "幸", "司", "黎", "溥", "印", "怀", "蒲", "邰", "从", "索", "赖",
|
||||
"卓", "屠", "池", "乔", "胥", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵",
|
||||
"冉", "宰", "雍", "桑", "寿", "通", "燕", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎",
|
||||
"连", "习", "容", "向", "古", "易", "廖", "庾", "终", "步", "都", "耿", "满", "弘", "匡", "国", "文",
|
||||
"寇", "广", "禄", "阙", "东", "欧", "利", "师", "巩", "聂", "关", "荆", "司马", "上官", "欧阳", "夏侯",
|
||||
"诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于",
|
||||
"太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "徐离", "宇文", "长孙", "慕容", "司徒", "司空"}
|
||||
var firstName = []string{
|
||||
"伟", "刚", "勇", "毅", "俊", "峰", "强", "军", "平", "保", "东", "文", "辉", "力", "明", "永", "健", "世", "广", "志", "义",
|
||||
"兴", "良", "海", "山", "仁", "波", "宁", "贵", "福", "生", "龙", "元", "全", "国", "胜", "学", "祥", "才", "发", "武", "新",
|
||||
"利", "清", "飞", "彬", "富", "顺", "信", "子", "杰", "涛", "昌", "成", "康", "星", "光", "天", "达", "安", "岩", "中", "茂",
|
||||
"进", "林", "有", "坚", "和", "彪", "博", "诚", "先", "敬", "震", "振", "壮", "会", "思", "群", "豪", "心", "邦", "承", "乐",
|
||||
"绍", "功", "松", "善", "厚", "庆", "磊", "民", "友", "裕", "河", "哲", "江", "超", "浩", "亮", "政", "谦", "亨", "奇", "固",
|
||||
"之", "轮", "翰", "朗", "伯", "宏", "言", "若", "鸣", "朋", "斌", "梁", "栋", "维", "启", "克", "伦", "翔", "旭", "鹏", "泽",
|
||||
"晨", "辰", "士", "以", "建", "家", "致", "树", "炎", "德", "行", "时", "泰", "盛", "雄", "琛", "钧", "冠", "策", "腾", "楠",
|
||||
"榕", "风", "航", "弘", "秀", "娟", "英", "华", "慧", "巧", "美", "娜", "静", "淑", "惠", "珠", "翠", "雅", "芝", "玉", "萍",
|
||||
"红", "娥", "玲", "芬", "芳", "燕", "彩", "春", "菊", "兰", "凤", "洁", "梅", "琳", "素", "云", "莲", "真", "环", "雪", "荣",
|
||||
"爱", "妹", "霞", "香", "月", "莺", "媛", "艳", "瑞", "凡", "佳", "嘉", "琼", "勤", "珍", "贞", "莉", "桂", "娣", "叶", "璧",
|
||||
"璐", "娅", "琦", "晶", "妍", "茜", "秋", "珊", "莎", "锦", "黛", "青", "倩", "婷", "姣", "婉", "娴", "瑾", "颖", "露", "瑶",
|
||||
"怡", "婵", "雁", "蓓", "纨", "仪", "荷", "丹", "蓉", "眉", "君", "琴", "蕊", "薇", "菁", "梦", "岚", "苑", "婕", "馨", "瑗",
|
||||
"琰", "韵", "融", "园", "艺", "咏", "卿", "聪", "澜", "纯", "毓", "悦", "昭", "冰", "爽", "琬", "茗", "羽", "希", "欣", "飘",
|
||||
"育", "滢", "馥", "筠", "柔", "竹", "霭", "凝", "晓", "欢", "霄", "枫", "芸", "菲", "寒", "伊", "亚", "宜", "可", "姬", "舒",
|
||||
"影", "荔", "枝", "丽", "阳", "妮", "宝", "贝", "初", "程", "梵", "罡", "恒", "鸿", "桦", "骅", "剑", "娇", "纪", "宽", "苛",
|
||||
"灵", "玛", "媚", "琪", "晴", "容", "睿", "烁", "堂", "唯", "威", "韦", "雯", "苇", "萱", "阅", "彦", "宇", "雨", "洋", "忠",
|
||||
"宗", "曼", "紫", "逸", "贤", "蝶", "菡", "绿", "蓝", "儿", "翠", "烟", "小", "轩"}
|
||||
var lastNameLen = len(lastName)
|
||||
var firstNameLen = len(firstName)
|
||||
total := randInt.Intn(10)
|
||||
names := make([]string, total+1)
|
||||
// 随机产生1-10位
|
||||
for i := 0; i <= total; i++ {
|
||||
var first string
|
||||
for i := 0; i <= rand.Intn(2); i++ { //随机产生2位或者3位的名
|
||||
first = fmt.Sprint(firstName[rand.Intn(firstNameLen-1)])
|
||||
}
|
||||
names[i] = fmt.Sprintf("%s%s", fmt.Sprint(lastName[rand.Intn(lastNameLen-1)]), first)
|
||||
}
|
||||
return names
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package activityser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/common/stderr"
|
||||
"91porn-server/models/commod"
|
||||
"91porn-server/models/v/prizemod"
|
||||
"91porn-server/models/v/productmod"
|
||||
)
|
||||
|
||||
// 新增活动
|
||||
func AddPrize(in prizemod.AddPrizeCond) stderr.Code {
|
||||
result, err := prizemod.AddPrize(in)
|
||||
if err != nil {
|
||||
return stderr.ErrDbInsertError
|
||||
}
|
||||
log.Info(fmt.Sprintf("新增活动[%v]成功", result))
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 修改活动
|
||||
func ModifyPrize(in *prizemod.ModifyPrizeCond) stderr.Code {
|
||||
if err := prizemod.ModifyPrize(in.Cond(), in.Bson()); err != nil {
|
||||
return stderr.ErrDbUpdateError
|
||||
}
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 查询列表
|
||||
func QueryAllPrize(in *prizemod.QueryAllPrizeCond) (interface{}, stderr.Code) {
|
||||
var data map[string]interface{} = map[string]interface{}{
|
||||
"list": []interface{}{},
|
||||
"count": 0,
|
||||
}
|
||||
count, err := prizemod.CountPrize(in.Query())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
if count == 0 {
|
||||
return data, stderr.Success
|
||||
}
|
||||
list, err := prizemod.QueryAllPrize(in.Query(), in.Options())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data["count"] = count
|
||||
data["list"] = list
|
||||
return data, stderr.Success
|
||||
}
|
||||
|
||||
func QueryVipDropDownBox() (interface{}, stderr.Code) {
|
||||
list, err := productmod.FindByProductType(commod.VIP)
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data := make([]map[string]interface{}, len(list))
|
||||
for i, v := range list {
|
||||
data[i] = map[string]interface{}{
|
||||
"label": v.Name,
|
||||
"value": v.ID.Hex(),
|
||||
}
|
||||
}
|
||||
return data, stderr.Success
|
||||
}
|
||||
|
||||
func QueryPrizeDropDownBox() (interface{}, stderr.Code) {
|
||||
list, err := prizemod.QueryDropDownBox()
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data := make([]map[string]interface{}, len(list))
|
||||
for i, v := range list {
|
||||
data[i] = map[string]interface{}{
|
||||
"label": v.Name + fmt.Sprintf("[数量:%d]", v.Count),
|
||||
"value": v.ID.Hex(),
|
||||
}
|
||||
}
|
||||
return data, stderr.Success
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package activityser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/common/stderr"
|
||||
"91porn-server/models/v/activitymod"
|
||||
)
|
||||
|
||||
// 新增活动奖池
|
||||
func AddPrizePool(in activitymod.AddPrizePoolCond) stderr.Code {
|
||||
result, err := activitymod.AddPrizePool(in)
|
||||
if err != nil {
|
||||
return stderr.ErrDbInsertError
|
||||
}
|
||||
log.Info(fmt.Sprintf("新增活动奖池[%v]成功", result))
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 修改活动奖池
|
||||
func ModifyPrizePool(in *activitymod.ModifyPrizePoolCond) stderr.Code {
|
||||
if err := activitymod.ModifyPrizePool(in.Cond(), in.Bson()); err != nil {
|
||||
return stderr.ErrDbUpdateError
|
||||
}
|
||||
return stderr.Success
|
||||
}
|
||||
|
||||
// 查询活动奖池列表
|
||||
func QueryAllPrizePool(in *activitymod.QueryAllPrizePoolCond) (interface{}, stderr.Code) {
|
||||
var data map[string]interface{} = map[string]interface{}{
|
||||
"list": []interface{}{},
|
||||
"count": 0,
|
||||
}
|
||||
count, err := activitymod.CountPrizePool(in.Query())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
if count == 0 {
|
||||
return data, stderr.Success
|
||||
}
|
||||
list, err := activitymod.QueryAllPrizePool(in.Query(), in.Options())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data["count"] = count
|
||||
data["list"] = list
|
||||
return data, stderr.Success
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package activityser
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"91porn-server/common/stderr"
|
||||
"91porn-server/models/v/activitymod"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
func QueryAllRecord(in *activitymod.QueryAllRecordCond) (interface{}, stderr.Code) {
|
||||
var data map[string]interface{} = map[string]interface{}{
|
||||
"list": []interface{}{},
|
||||
"count": 0,
|
||||
}
|
||||
count, err := activitymod.CountRecord(in.Query())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
if count == 0 {
|
||||
return data, stderr.Success
|
||||
}
|
||||
list, err := activitymod.QueryAllRecord(in.Query(), in.Options())
|
||||
if err != nil {
|
||||
return nil, stderr.ErrDbQueryError
|
||||
}
|
||||
data["count"] = count
|
||||
data["list"] = list
|
||||
return data, stderr.Success
|
||||
}
|
||||
|
||||
// 开启机器人抽奖
|
||||
func OpenBotDraw(activityID primitive.ObjectID, status bool) error {
|
||||
job.mutex.Lock()
|
||||
defer job.mutex.Unlock()
|
||||
if entryID, ok := job.cache[activityID]; ok {
|
||||
if !status {
|
||||
// 移除任务
|
||||
job.cron.Remove(entryID)
|
||||
delete(job.cache, activityID)
|
||||
return nil
|
||||
}
|
||||
return errors.New("任务已开启")
|
||||
}
|
||||
if status {
|
||||
// 加入任务(每小时执行一次)
|
||||
entryID, err := job.cron.AddJob("@hourly", BotDraw{ActivityID: activityID})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
job.cache[activityID] = entryID
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user