You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.7 KiB
142 lines
3.7 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"go-common/app/admin/main/reply/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
// ListNotice ListNotice |
|
func (s *Service) ListNotice(c context.Context, page, pageSize int64) (nts []*model.Notice, total int64, err error) { |
|
offset := (page - 1) * pageSize |
|
total, err = s.dao.CountNotice(c) |
|
if err != nil { |
|
return |
|
} |
|
nts, err = s.dao.ListNotice(c, offset, pageSize) |
|
if err != nil { |
|
return |
|
} |
|
return nts, total, err |
|
} |
|
|
|
// GetNotice GetNotice |
|
func (s *Service) GetNotice(c context.Context, id uint32) (nt *model.Notice, err error) { |
|
return s.dao.Notice(c, id) |
|
} |
|
|
|
// UpdateNotice UpdateNotice |
|
func (s *Service) UpdateNotice(c context.Context, nt *model.Notice) (err error) { |
|
var ntGet *model.Notice |
|
ntGet, err = s.dao.Notice(c, nt.ID) |
|
if err != nil || ntGet == nil { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
if ntGet.Status == model.StatusOnline { |
|
err = s.checkConflict(c, nt) |
|
if err != nil { |
|
return |
|
} |
|
} |
|
_, err = s.dao.UpdateNotice(c, nt) |
|
return |
|
} |
|
|
|
// CreateNotice CreateNotice |
|
func (s *Service) CreateNotice(c context.Context, nt *model.Notice) (lastID int64, err error) { |
|
lastID, err = s.dao.CreateNotice(c, nt) |
|
if lastID <= 0 { |
|
log.Error("create notice failed!last_id not found") |
|
err = fmt.Errorf("create notice failed!last_id not found") |
|
return |
|
} |
|
return |
|
} |
|
|
|
// DeleteNotice DeleteNotice |
|
func (s *Service) DeleteNotice(c context.Context, id uint32) (err error) { |
|
_, err = s.dao.DeleteNotice(c, id) |
|
return err |
|
} |
|
|
|
func (s *Service) checkConflict(c context.Context, nt *model.Notice) error { |
|
var nts []*model.Notice |
|
var err error |
|
nts, err = s.dao.RangeNotice(c, nt.Plat, nt.StartTime, nt.EndTime) |
|
if err != nil { |
|
return err |
|
} |
|
for _, data := range nts { |
|
//如果ID相同说明是自己 |
|
if data.ID == nt.ID { |
|
continue |
|
} |
|
//如果为web平台则必然冲突 |
|
if data.Plat == model.PlatWeb { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
//如果客户端类型不同则跳过检查 |
|
if data.ClientType != "" && nt.ClientType != "" && data.ClientType != nt.ClientType { |
|
continue |
|
} |
|
//为每一种版本情况检查 |
|
if data.Condition == model.ConditionEQ { |
|
if nt.Condition == model.ConditionEQ && nt.Build == data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
if nt.Condition == model.ConditionGT && nt.Build <= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
if nt.Condition == model.ConditionLT && nt.Build >= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else if data.Condition == model.ConditionGT { |
|
if nt.Condition == model.ConditionEQ { |
|
if nt.Build >= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else if nt.Condition == model.ConditionLT { |
|
if nt.Build >= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else if data.Condition == model.ConditionLT { |
|
if nt.Condition == model.ConditionEQ { |
|
if nt.Build <= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else if nt.Condition == model.ConditionGT { |
|
if nt.Build <= data.Build { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} else { |
|
return ecode.ReplyNoticeConflict |
|
} |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
// UpdateNoticeStatus UpdateNoticeStatus |
|
func (s *Service) UpdateNoticeStatus(c context.Context, status model.NoticeStatus, id uint32) (err error) { |
|
//检测客户端在同一时间内是否存在另外一条已发布的公告,如果存在则不允许发布 |
|
if status == model.StatusOnline { |
|
var nt *model.Notice |
|
nt, err = s.dao.Notice(c, id) |
|
if err != nil || nt == nil { |
|
return |
|
} |
|
err = s.checkConflict(c, nt) |
|
if err != nil { |
|
return |
|
} |
|
} |
|
|
|
_, err = s.dao.UpdateNoticeStatus(c, status, id) |
|
return err |
|
}
|
|
|