bsi_activity.go 5.6 KB
package domain

import (
	"context"
	"fmt"
	"github.com/zeromicro/go-zero/core/collection"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc/pkg/transaction"
	"math/rand"
	"time"
)

type BsiActivity struct {
	Id             int64          `json:"id,optional"`             // 唯一标识
	CompanyId      int64          `json:"companyId,optional"`      // 公司ID
	Issue          string         `json:"issue"`                   // 活动主题
	Remark         string         `json:"remark,optional"`         // 活动备注
	ActivateType   int            `json:"activateType"`            // 激活类型 1:手动 2:指定日期
	BeginAt        int64          `json:"beginAt,optional"`        // 活动开始时间(激活类型:2有效)
	EndAt          int64          `json:"endAt,optional"`          // 活动结束时间(激活类型:2有效)
	Status         int            `json:"status,optional"`         // 活动状态 0:未开始 1:已开始 2:结束
	ActivityConfig ActivityConfig `json:"activityConfig,optional"` // 活动配置
	CreatedAt      int64
	UpdatedAt      int64
	DeletedAt      int64
	Version        int
}

const (
	ActivityWaiting = 0
	ActivityOpening = 1
	ActivityClosed  = 2
)

const (
	OpenByManual       = 1 // 手动开启
	OpenBySpecificTime = 2 // 特定时间
)

type BsiActivityRepository interface {
	Insert(ctx context.Context, conn transaction.Conn, dm *BsiActivity) (*BsiActivity, error)
	Update(ctx context.Context, conn transaction.Conn, dm *BsiActivity) (*BsiActivity, error)
	UpdateWithVersion(ctx context.Context, conn transaction.Conn, dm *BsiActivity) (*BsiActivity, error)
	Delete(ctx context.Context, conn transaction.Conn, dm *BsiActivity) (*BsiActivity, error)
	FindOne(ctx context.Context, conn transaction.Conn, id int64) (*BsiActivity, error)
	Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*BsiActivity, error)
}

func (m *BsiActivity) Identify() interface{} {
	if m.Id == 0 {
		return nil
	}
	return m.Id
}

func (m *BsiActivity) ResolveActivityStatus() int {
	if m.Status == ActivityClosed {
		return m.Status
	}
	if m.IsOpen() {
		return ActivityOpening
	}
	if m.IsClosed() {
		return ActivityClosed
	}
	return m.Status
}

func (m *BsiActivity) IsOpen() bool {
	if m.ActivateType == OpenByManual {
		if m.Status == ActivityOpening {
			return true
		}
	}
	if m.ActivateType == OpenBySpecificTime {
		if m.BeginAt <= time.Now().Unix() && m.EndAt > time.Now().Unix() {
			return true
		}
	}
	return false
}

func (m *BsiActivity) IsClosed() bool {
	if m.NeedClose() {
		return true
	}
	if m.Status == ActivityClosed {
		return false
	}
	return false
}

func (m *BsiActivity) NeedClose() bool {
	if m.Status == ActivityClosed {
		return false
	}
	if m.ActivateType == OpenBySpecificTime {
		if m.EndAt < time.Now().Unix() {
			return true
		}
	}
	return false
}

func (m *BsiActivity) RandomGreeting() string {
	if m.ActivityConfig.ScreenConfig == nil {
		return ""
	}
	if len(m.ActivityConfig.ScreenConfig.Greetings) == 0 {
		return ""
	}
	idx := rand.Intn(len(m.ActivityConfig.ScreenConfig.Greetings))
	return m.ActivityConfig.ScreenConfig.Greetings[idx]
}

type ActivityConfig struct {
	H5Config            *H5Config            `json:"h5Config"`            // H5页面配置
	Products            []Product            `json:"products,optional"`   // 产品列表
	QuestionnaireConfig *QuestionnaireConfig `json:"questionnaireConfig"` // 问卷配置
	ScreenConfig        *ScreenConfig        `json:"screenConfig"`        // 大屏配置
	DefaultUsers        []UserInfo           `json:"defaultUsers"`        // 预设用户(名字不允许重复)
}

func (item ActivityConfig) Valid() error {
	usersDup := collection.NewSet()
	for _, u := range item.DefaultUsers {
		if !usersDup.Contains(u.Name) {
			usersDup.Add(u.Name)
			continue
		}
		return fmt.Errorf("预设用户名重复`%v`", u.Name)
	}

	productDup := collection.NewSet()
	for _, u := range item.Products {
		if !productDup.Contains(u.Name) {
			productDup.Add(u.Name)
			continue
		}
		return fmt.Errorf("商品名重复`%v`", u.Name)
	}
	return nil
}

type H5Config struct {
	WebPageTitle string `json:"webPageTitle"`          // 网页标题配置
	Announcement string `json:"announcement,optional"` // 公告内容
}

type Product struct {
	// Id    string `json:"id,optional"`    // 标识
	Name  string `json:"name,optional"`  // 产品名称
	Cover string `json:"cover,optional"` // 产品封面图片
	Desc  string `json:"desc,optional"`  // 产品简介
}

type QuestionnaireConfig struct {
	WebPageTitle string         `json:"webPageTitle"`          // 网页标题配置
	Announcement string         `json:"announcement,optional"` // 公告内容
	Questions    []QuestionItem `json:"questions,optional"`    // 问题列表
}

type QuestionItem struct {
	Label     string      `json:"label"`            // 字段名称
	Product   string      `json:"product,optional"` // 商品(非必填)
	Type      int         `json:"type"`             // 0:文本 1:单选
	CheckList []CheckItem `json:"checkList"`
}

type CheckItem struct {
	Value     string `json:"value"`              // 值 例如:500
	ValueType int    `json:"valueType,optional"` // 0.人民币
}

type ScreenConfig struct {
	Background           string   `json:"background"`           // 背景图片
	IsShowInteractiveNum bool     `json:"isShowInteractiveNum"` // 是否展示互动数 true:展示 false:不展示
	Greetings            []string `json:"greetings"`            // 祝福语
}

type UserInfo struct {
	Name   string `json:"name"`            // 名称
	Avatar string `json:"avatar,optional"` // 头像
	Title  string `json:"title,optional"`  // 称谓
}