qixiaoning
2025-08-21 e38654fe9eff4562da4f18f8f018aed7879d493c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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
}