Files
erp/service/data/schedule_service.go
2026-04-21 13:31:10 +08:00

231 lines
6.1 KiB
Go

package data
import (
"context"
consts "erp/consts/data"
dao "erp/dao/data"
dto "erp/model/dto/data"
entity "erp/model/entity/data"
"errors"
"time"
"github.com/gogf/gf/v2/util/gconv"
)
type scheduleService struct{}
// Schedule 排班服务
var Schedule = new(scheduleService)
// Create 创建排班
func (s *scheduleService) Create(ctx context.Context, req *dto.CreateScheduleReq) (res *dto.CreateScheduleRes, err error) {
// 检查开始时间是否小于结束时间
if req.StartTime.After(req.EndTime) || req.StartTime.Equal(req.EndTime) {
return nil, errors.New("开始时间必须早于结束时间")
}
// 检查主播是否存在
_, err = dao.Anchor.GetOne(ctx, &dto.GetAnchorReq{Id: int64(req.AnchorId)})
if err != nil {
return nil, errors.New("主播不存在")
}
// 检查直播账号是否存在
_, err = dao.LiveAccount.GetOne(ctx, &dto.GetLiveAccountReq{Id: int64(req.AccountId)})
if err != nil {
return nil, errors.New("直播账号不存在")
}
// 检查时间冲突
conflictCount, err := dao.Schedule.CheckTimeConflict(ctx, req.AnchorId, req.StartTime, req.EndTime)
if err != nil {
return nil, err
}
if conflictCount > 0 {
return nil, errors.New("该主播在此时间段已有排班")
}
// 插入数据库
id, err := dao.Schedule.Insert(ctx, req)
if err != nil {
return
}
res = &dto.CreateScheduleRes{
Id: id,
}
return
}
// List 获取排班列表
func (s *scheduleService) List(ctx context.Context, req *dto.ListScheduleReq) (res *dto.ListScheduleRes, err error) {
scheduleList, total, err := dao.Schedule.List(ctx, req)
if err != nil {
return
}
// 组装响应数据
list := make([]dto.ScheduleItem, 0, len(scheduleList))
for _, item := range scheduleList {
// 获取主播信息
anchorName := ""
if item.AnchorId > 0 {
anchor, _ := dao.Anchor.GetOne(ctx, &dto.GetAnchorReq{Id: int64(item.AnchorId)})
if anchor != nil {
anchorName = anchor.Name
}
}
// 获取账号信息
accountName := ""
platform := ""
if item.AccountId > 0 {
account, _ := dao.LiveAccount.GetOne(ctx, &dto.GetLiveAccountReq{Id: int64(item.AccountId)})
if account != nil {
accountName = account.AccountName
platform = account.Platform
}
}
list = append(list, dto.ScheduleItem{
Id: int64(item.Id),
AnchorId: item.AnchorId,
AnchorName: anchorName,
AccountId: item.AccountId,
AccountName: accountName,
Platform: platform,
StartTime: item.StartTime.Unix(),
EndTime: item.EndTime.Unix(),
Status: item.Status,
StatusName: consts.ScheduleStatus(item.Status).String(),
ProductId: item.ProductId,
OrderId: item.OrderId,
Remark: item.Remark,
CreatedAt: item.CreatedAt.Unix(),
UpdatedAt: item.UpdatedAt.Unix(),
})
}
res = &dto.ListScheduleRes{
List: list,
Total: total,
}
return
}
// GetOne 获取单个排班
func (s *scheduleService) GetOne(ctx context.Context, req *dto.GetScheduleReq) (res *dto.GetScheduleRes, err error) {
schedule, err := dao.Schedule.GetOne(ctx, req)
if err != nil {
return
}
var scheduleEntity *entity.Schedule
if err = gconv.Struct(schedule, &scheduleEntity); err != nil {
return
}
return &dto.GetScheduleRes{
Schedule: scheduleEntity,
}, nil
}
// Update 更新排班
func (s *scheduleService) Update(ctx context.Context, req *dto.UpdateScheduleReq) (err error) {
// 检查排班是否存在
exist, err := dao.Schedule.GetOne(ctx, &dto.GetScheduleReq{Id: req.Id})
if err != nil || exist == nil {
return errors.New("排班不存在")
}
// 如果修改了时间,检查时间合法性
startTime := exist.StartTime
endTime := exist.EndTime
if req.StartTime != nil {
startTime = *req.StartTime
}
if req.EndTime != nil {
endTime = *req.EndTime
}
if startTime.After(endTime) || startTime.Equal(endTime) {
return errors.New("开始时间必须早于结束时间")
}
// 如果修改了主播或时间,检查时间冲突
anchorId := exist.AnchorId
if req.AnchorId != nil {
anchorId = *req.AnchorId
// 检查主播是否存在
_, err = dao.Anchor.GetOne(ctx, &dto.GetAnchorReq{Id: int64(anchorId)})
if err != nil {
return errors.New("主播不存在")
}
}
conflictCount, err := dao.Schedule.CheckTimeConflict(ctx, anchorId, startTime, endTime, req.Id)
if err != nil {
return err
}
if conflictCount > 0 {
return errors.New("该主播在此时间段已有排班")
}
// 如果修改了账号,检查账号是否存在
if req.AccountId != nil {
_, err = dao.LiveAccount.GetOne(ctx, &dto.GetLiveAccountReq{Id: int64(*req.AccountId)})
if err != nil {
return errors.New("直播账号不存在")
}
}
_, err = dao.Schedule.Update(ctx, req)
return
}
// UpdateStatus 更新排班状态
func (s *scheduleService) UpdateStatus(ctx context.Context, req *dto.UpdateScheduleStatusReq) (err error) {
_, err = dao.Schedule.UpdateStatus(ctx, req.Id, int(req.Status))
return
}
// Delete 删除排班
func (s *scheduleService) Delete(ctx context.Context, req *dto.DeleteScheduleReq) (err error) {
// 检查排班是否存在且未开始
schedule, err := dao.Schedule.GetOne(ctx, &dto.GetScheduleReq{Id: req.Id})
if err != nil || schedule == nil {
return errors.New("排班不存在")
}
// 如果已经开始或结束,不允许删除
if schedule.Status != 0 {
return errors.New("只能删除待直播的排班")
}
_, err = dao.Schedule.Delete(ctx, req)
return
}
// GetTodaySchedules 获取今日排班
func (s *scheduleService) GetTodaySchedules(ctx context.Context) (res *dto.ListScheduleRes, err error) {
now := time.Now()
startOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
endOfDay := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
req := &dto.ListScheduleReq{
StartDate: startOfDay,
EndDate: endOfDay,
}
return s.List(ctx, req)
}
// GetAnchorSchedules 获取主播排班
func (s *scheduleService) GetAnchorSchedules(ctx context.Context, anchorId int, startDate, endDate time.Time) (res *dto.ListScheduleRes, err error) {
req := &dto.ListScheduleReq{
AnchorId: &anchorId,
StartDate: startDate,
EndDate: endDate,
}
return s.List(ctx, req)
}