package service
|
|
import (
|
"encoding/json"
|
"errors"
|
"fmt"
|
"vamicro/extend/util"
|
"vamicro/scene-service/models"
|
|
"basic.com/pubsub/protomsg.git"
|
"basic.com/valib/bhomeclient.git"
|
"basic.com/valib/logger.git"
|
)
|
|
type TimeService struct {
|
Bk bhomeclient.Broker
|
}
|
|
func (sv *TimeService) Save(model models.CameraTimerule) error {
|
// 判断时间规则是否重复
|
// 如果是修改name,不用做去重校验
|
timeRule := models.CameraTimerule{}
|
if timeRule.Exists(model.Id) && timeRule.Name == model.Name {
|
var data []*models.DayCtl
|
if err := json.Unmarshal([]byte(model.TimeRule), &data); err != nil {
|
msg := fmt.Sprintf("比较时间规则 Unmarshal err=%v", err)
|
logger.Error(msg)
|
return errors.New(msg)
|
}
|
// 逻辑有误, 暂时屏蔽
|
//isRepeat, err := IsTimeRuleRepeat(data)
|
//logger.Debugf("IsTimeRuleRepeat result isRepeat=%v, err=%v", isRepeat, err)
|
//if err != nil {
|
// msg := fmt.Sprintf("比较时间规则 IsTimeRuleRepeat err=%v", err)
|
// logger.Error(msg)
|
// return errors.New(msg)
|
//}
|
//if isRepeat {
|
// logger.Debugf("timerule save id=%v, 时间规则重复", model.Id)
|
// return errors.New("时间规则重复")
|
//}
|
}
|
|
if model.Id != "" { //更新
|
if model.Update() {
|
datas, _ := json.Marshal(model)
|
pMsg := protomsg.DbChangeMessage{
|
Id: model.Id,
|
Table: protomsg.TableChanged_T_TimeRule,
|
Action: protomsg.DbAction_Update,
|
Info: string(datas),
|
}
|
pb, _ := json.Marshal(pMsg)
|
logger.Debugf("timerule Save Update model=%v", model)
|
sv.Bk.Publish(ProcName, pb)
|
return nil
|
}
|
} else { //新增
|
model.Id = util.PseudoUuid()
|
if model.Insert() {
|
datas, _ := json.Marshal(model)
|
pMsg := protomsg.DbChangeMessage{
|
Id: model.Id,
|
Table: protomsg.TableChanged_T_TimeRule,
|
Action: protomsg.DbAction_Insert,
|
Info: string(datas),
|
}
|
pb, _ := json.Marshal(pMsg)
|
logger.Debugf("timerule Save Insert model=%v", model)
|
sv.Bk.Publish(ProcName, pb)
|
return nil
|
}
|
}
|
return errors.New("unknow error!!!")
|
}
|
|
func (sv *TimeService) DeleteById(timeRuleId string, force bool) (bool, error) {
|
if !force { //非强制删除时,需要验证是否在使用中
|
var crg models.CameraRuleGroup
|
if timeRules, _ := crg.FindByTimeRuleId(timeRuleId); len(timeRules) > 0 {
|
return false, errors.New("场景使用中,不能删除")
|
}
|
}
|
|
var model models.CameraTimerule
|
rows, err := model.DeleteById(timeRuleId)
|
if err == nil && rows > 0 {
|
pMsg := protomsg.DbChangeMessage{
|
Id: timeRuleId,
|
Table: protomsg.TableChanged_T_TimeRule,
|
Action: protomsg.DbAction_Delete,
|
Info: fmt.Sprintf("{\"id\":\"%v\"}", timeRuleId),
|
}
|
pb, _ := json.Marshal(pMsg)
|
sv.Bk.Publish(ProcName, pb)
|
return true, nil
|
}
|
|
return false, errors.New("删除记录失败")
|
}
|
|
// 判断时间规则是否重复
|
func IsTimeRuleRepeat(srcData []*models.DayCtl) (bool, error) {
|
if len(srcData) != 7 {
|
logger.Errorf("IsTimeRuleRepeat 时间规则格式错误")
|
return false, errors.New("时间规则格式错误")
|
}
|
timeRule := models.CameraTimerule{}
|
records, err := timeRule.FindAll()
|
if err != nil {
|
logger.Errorf("IsTimeRuleRepeat FindAll err=%v", err)
|
return false, err
|
}
|
logger.Debugf("IsTimeRuleRepeat len(srcData)=%v, len(records)=%v", len(srcData), len(records))
|
for _, r := range records {
|
var listData []*models.DayCtl
|
if err := json.Unmarshal([]byte(r.TimeRule), &listData); err != nil {
|
logger.Errorf("IsTimeRuleRepeat Unmarshal err=%v", err)
|
return false, err
|
}
|
if len(listData) != 7 {
|
logger.Errorf("IsTimeRuleRepeat db里的数据时间规则格式错误")
|
return false, errors.New("db里的数据时间规则格式错误")
|
}
|
// 和db里的一条记录比较,如果相等就返回,否则继续比较下一条记录
|
var findEqual bool
|
for i := 0; i < 7; i++ {
|
b, err := EqualDays(listData[i].TimeRange, srcData[i].TimeRange)
|
if err != nil {
|
logger.Errorf("IsTimeRuleRepeat EqualDays err=%v", err)
|
return false, err
|
}
|
if b {
|
findEqual = true
|
continue
|
}
|
// 找到不相等
|
findEqual = false
|
break
|
}
|
|
if findEqual {
|
logger.Debugf("IsTimeRuleRepeat timerule is repeat id=%v, name=%v, timeRule=%v", r.Id, r.Name, r.TimeRule)
|
return true, nil
|
}
|
}
|
return false, nil
|
}
|
|
// 判断是否 d1 == d1: true, 否则返回false
|
func EqualDays(d1, d2 []models.TimeRange) (bool, error) {
|
if len(d1) != len(d2) {
|
logger.Errorf("IsTimeRuleRepeat EqualDays len(d1)=%v, len(d2)=%v, d1=%v, d2=%v", len(d1), len(d2), d1, d2)
|
return false, nil
|
}
|
|
if len(d1) == 0 || len(d2) == 0 {
|
return true, nil
|
}
|
|
for i := 0; i < 1; i++ {
|
if d1[i].Start != d2[i].Start || d1[i].End != d2[i].End {
|
return false, nil
|
}
|
}
|
return true, nil
|
}
|