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} } }