Files
2022-02-23 15:18:55 +08:00

164 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"SciencesServer/app/api/website/model"
config2 "SciencesServer/app/basic/config"
"SciencesServer/app/basic/controller"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/config"
"errors"
"fmt"
"strings"
"time"
)
type Activity struct {
*session.Enterprise
tenantID uint64
}
type ActivityHandle func(session *session.Enterprise, tenantID uint64) *Activity
type (
// ActivityInfo 活动信息
ActivityInfo struct {
ID string `json:"id"`
*model.ActivityInstanceInfo
Amount float64 `json:"amount"`
IsJoin bool `json:"is_join"`
Status int `json:"status"` // 状态1未开始2进行中3已结束
}
// ActivityDetail 详细信息
ActivityDetail struct {
ID string `json:"id"`
*model.ActivityInstanceDetail
Industry string `json:"industry"`
IsJoin bool `json:"is_join"`
}
)
// Instance 活动信息
func (c *Activity) Instance(title, industry string, status, page, pageSize int) (*controller.ReturnPages, error) {
mActivityInstance := model.NewActivityInstance()
now := time.Now()
where := []*model2.ModelWhere{model2.NewWhere("a.tenant_id", c.tenantID)}
if title != "" {
where = append(where, model2.NewWhereLike("a.title", title))
}
if industry != "" {
where = append(where, model2.NewWhereCondition("a.industry", "LIKE", "%"+fmt.Sprintf(`"%v`, industry)+"%"))
}
if status > 0 {
if status == 1 {
where = append(where, model2.NewWhereCondition("a.begin_at", ">", now))
} else if status == 2 {
where = append(where, model2.NewWhereCondition("a.begin_at", "<=", now),
model2.NewWhereCondition("a.finish_at", ">=", now))
} else {
where = append(where, model2.NewWhereCondition("a.finish_at", "<", now))
}
}
var count int64
out, err := mActivityInstance.Activity(c.UID, c.SelectIdentity, page, pageSize, &count, where...)
if err != nil {
return nil, err
}
list := make([]*ActivityInfo, 0)
for _, v := range out {
v.Image.Image = v.Image.Analysis(config.SystemConfig[config.SysImageDomain])
data := &ActivityInfo{
ID: v.GetEncodeID(), Amount: v.Amount, ActivityInstanceInfo: v, IsJoin: v.JoinID > 0, Status: 2,
}
if now.Before(v.BeginAt) {
data.Status = 1
goto CONTINUE
}
if now.After(v.FinishAt) {
data.Status = 3
goto CONTINUE
}
CONTINUE:
list = append(list, data)
}
return &controller.ReturnPages{Data: list, Count: count}, nil
}
// Detail 详细信息
func (c *Activity) Detail(id uint64) (*ActivityDetail, error) {
mActivityInstance := model.NewActivityInstance()
out, err := mActivityInstance.Detail(id, c.UID, c.SelectIdentity)
if err != nil {
return nil, err
}
out.Image.Image = out.Image.Analysis(config.SystemConfig[config.SysImageDomain])
industrys := make([]string, 0)
for _, v := range out.GetIndustryAttribute() {
industrys = append(industrys, config2.GetIndustryInfo(v, "-", "-").Value)
}
return &ActivityDetail{
ID: out.GetEncodeID(),
ActivityInstanceDetail: out,
Industry: strings.Join(industrys, ""),
IsJoin: out.JoinID > 0.,
}, nil
}
// Join 加入活动
func (c *Activity) Join(id uint64) error {
mActivityInstance := model.NewActivityInstance()
isExist, err := model2.FirstField(mActivityInstance.ActivityInstance, []string{"id", "amount", "join_deadline"},
model2.NewWhere("id", id), model2.NewWhere("tenant_id", c.tenantID),
model2.NewWhere("status", model2.ActivityInstanceStatusForShow))
if err != nil {
return err
} else if !isExist {
return errors.New("操作错误,活动信息不存在或已被删除")
}
if !mActivityInstance.IsCanJoin() {
return errors.New("操作错误,当前活动信息不可报名")
}
if c.SelectIdentity <= 0 {
return errors.New("操作错误,当前未选择任何身份信息")
}
// 查看当前活动是否报名
var count int64
if err = model2.Count(model.NewActivityJoin().ActivityJoin, &count, model2.NewWhere("id", c.UID),
model2.NewWhere("identity", c.SelectIdentity), model2.NewWhere("activity_id", id),
model2.NewWhere("status", model2.ActivityJoinStatusForSuccess)); err != nil {
return err
}
if count > 0 {
return errors.New("操作错误,不可重复报名")
}
if mActivityInstance.Amount <= 0 {
service.Publish(config.EventForActivityJoinProduce, id, c.UID, c.SelectIdentity)
}
return nil
}
func NewActivity() ActivityHandle {
return func(session *session.Enterprise, tenantID uint64) *Activity {
return &Activity{Enterprise: session, tenantID: tenantID}
}
}