zhangqian
2023-11-28 778f7fbabb2ad5cdb8e203e1695ae2a8c7327edb
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
package service
 
import (
    "apsClient/conf"
    "apsClient/constvar"
    "apsClient/model"
    "fmt"
    "github.com/jinzhu/gorm"
    "github.com/spf13/cast"
    "sync"
    "time"
)
 
type CacheStore struct {
    cache map[string]interface{}
    mu    sync.Mutex
}
 
var defaultCacheStore *CacheStore
 
func init() {
    defaultCacheStore = newCacheManager()
}
func newCacheManager() *CacheStore {
    return &CacheStore{
        cache: make(map[string]interface{}),
    }
}
 
func (cm *CacheStore) Get(key string) (interface{}, bool) {
    cm.mu.Lock()
    defer cm.mu.Unlock()
 
    conn, ok := cm.cache[key]
    return conn, ok
}
 
func (cm *CacheStore) Add(key string, value interface{}) {
    cm.mu.Lock()
    defer cm.mu.Unlock()
    cm.cache[key] = value
}
 
func (cm *CacheStore) Remove(key string) {
    cm.mu.Lock()
    defer cm.mu.Unlock()
    delete(cm.cache, key)
}
 
const (
    PlcCacheKey             = "plc:%v:%v:%v"                    //plc:deviceID:channel:key 缓存加工数或目标数
    CurrentTaskCacheKey     = "current_task:%v:%v"              //current_task:deviceID:channel 缓存当前任务id
    CurrentProgressCacheKey = "current_progress:%v:%v"          //current_progress:deviceId:channel
    PlcCacheKeyUpdateTime   = "finish_number_update_time:%v:%v" //finish_number_update_time:deviceID:channel
    TaskStartTimeCache      = "task_start_time:%v:%v"           //task_start_time:deviceID:channel
    TaskEndTimeCache        = "task_end_time:%v:%v"             //task_end_time:deviceID:channel
)
 
func PlcCacheGet(deviceId string, channel int32, key string) (interface{}, bool) {
    return defaultCacheStore.Get(fmt.Sprintf(PlcCacheKey, deviceId, channel, key))
}
 
func PlcCacheSet(deviceId string, channel int32, key string, value interface{}) {
    if key == constvar.PlcCacheKeyFinishNumber {
        oldFinishNumber, exists := PlcCacheGet(deviceId, channel, key)
        if !exists || cast.ToInt(oldFinishNumber) != cast.ToInt(value) { //finishNumber有了变化,设置更新时间缓存
            FinishUpdateTimeSet(deviceId, channel, time.Now().Unix())
        }
    }
    defaultCacheStore.Add(fmt.Sprintf(PlcCacheKey, deviceId, channel, key), value)
}
 
// FinishUpdateTimeGet 用于判断plc状态,超过多少时间未更新视为待机
func FinishUpdateTimeGet(deviceId string, channel int32) interface{} {
    val, ok := defaultCacheStore.Get(fmt.Sprintf(PlcCacheKeyUpdateTime, deviceId, channel))
    if ok {
        return val
    }
    return 0
}
 
func FinishUpdateTimeSet(deviceId string, channel int32, value interface{}) {
    defaultCacheStore.Add(fmt.Sprintf(PlcCacheKeyUpdateTime, deviceId, channel), value)
}
 
func TaskStartTimeSet(deviceID string, channel int32, ts int64) {
    defaultCacheStore.Add(fmt.Sprintf(TaskStartTimeCache, deviceID, channel), ts)
}
 
// TaskStartTimeGet 用于前端展示工序运行时间
func TaskStartTimeGet(deviceId string, channel int32) int64 {
    if v, ok := defaultCacheStore.Get(fmt.Sprintf(TaskStartTimeCache, deviceId, channel)); ok {
        return v.(int64)
    }
    procedure, err := model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.CurrentDeviceID).SetStatus(model.ProcedureStatusProcessing).SetChannels([]int32{channel}).First() //进行中任务
    if err == gorm.ErrRecordNotFound {
        procedure, err = model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.CurrentDeviceID).
            SetStatus(model.ProcedureStatusFinished).SetChannels([]int32{channel}).SetOrder("real_end_time desc").First() //上一个结束的任务
        if err == gorm.ErrRecordNotFound { //进行中和结束的都没有,开始时间和结束时间都设置0
            TaskStartTimeSet(deviceId, channel, int64(0))
            TaskEndTimeSet(deviceId, channel, int64(0))
            return 0
        } else {
            TaskStartTimeSet(deviceId, channel, procedure.RealStartTime)
            TaskEndTimeSet(deviceId, channel, procedure.RealEndTime)
            return 0
        }
    } else {
        TaskStartTimeSet(deviceId, channel, procedure.RealStartTime)
        TaskEndTimeSet(deviceId, channel, int64(0))
        return procedure.RealStartTime
    }
}
 
func TaskEndTimeSet(deviceID string, channel int32, ts int64) {
    defaultCacheStore.Add(fmt.Sprintf(TaskEndTimeCache, deviceID, channel), ts)
}
 
func TaskEndTimeGet(deviceID string, channel int32) int64 {
    if v, ok := defaultCacheStore.Get(fmt.Sprintf(TaskEndTimeCache, deviceID, channel)); ok {
        return v.(int64)
    }
    return 0
}
 
func TaskFlagSet(deviceID string, channel int32, taskId int) {
    defaultCacheStore.Add(fmt.Sprintf(CurrentTaskCacheKey, deviceID, channel), taskId)
}
 
func TaskFlagUnset(deviceID string, channel int32) {
    defaultCacheStore.Add(fmt.Sprintf(CurrentTaskCacheKey, deviceID, channel), 0)
}
 
func TaskFlagGet(deviceID string, channel int32) bool {
    if v, ok := defaultCacheStore.Get(fmt.Sprintf(CurrentTaskCacheKey, deviceID, channel)); ok {
        return v.(int) > 0
    }
    procedure, err := model.NewProceduresSearch(nil).SetDeviceId(conf.Conf.CurrentDeviceID).SetStatus(model.ProcedureStatusProcessing).SetChannels([]int32{channel}).First()
    if err == gorm.ErrRecordNotFound {
        defaultCacheStore.Add(fmt.Sprintf(CurrentTaskCacheKey, deviceID, channel), 0)
        return false
    } else {
        defaultCacheStore.Add(fmt.Sprintf(CurrentTaskCacheKey, deviceID, channel), int(procedure.ID))
        return true
    }
}
 
func ProgressCacheGet(deviceID string, channel int32) (*model.ProductionProgress, bool) {
    if v, ok := defaultCacheStore.Get(fmt.Sprintf(CurrentProgressCacheKey, deviceID, channel)); ok {
        return v.(*model.ProductionProgress), ok
    }
    return nil, false
}
 
func ProgressCacheSet(deviceID string, channel int32, value *model.ProductionProgress) {
    defaultCacheStore.Add(fmt.Sprintf(CurrentProgressCacheKey, deviceID, channel), value)
}
 
func ProgressCacheUnset(deviceID string, channel int32) {
    defaultCacheStore.Remove(fmt.Sprintf(CurrentProgressCacheKey, deviceID, channel))
}