update current project state
This commit is contained in:
+93
-27
@@ -165,12 +165,23 @@ var (
|
||||
ForbidTimeFile = "/data/cache/forbid_time_config.json"
|
||||
)
|
||||
|
||||
type ForbidTimeConfig struct {
|
||||
Minute string `json:"minute"`
|
||||
Minutr string `json:"minutr,omitempty"`
|
||||
StartTime int64 `json:"start_time"`
|
||||
EndTime int64 `json:"end_time"`
|
||||
}
|
||||
|
||||
// SaveForbidTimeConfig 保存禁止时间配置
|
||||
func SaveForbidTimeConfig(minutr string) error {
|
||||
config := struct {
|
||||
Minutr string `json:"minutr"`
|
||||
}{
|
||||
Minutr: minutr,
|
||||
func SaveForbidTimeConfig(minute string) error {
|
||||
return SaveForbidTimeWindow(minute, 0, 0)
|
||||
}
|
||||
|
||||
func SaveForbidTimeWindow(minute string, startTime, endTime int64) error {
|
||||
config := ForbidTimeConfig{
|
||||
Minute: minute,
|
||||
StartTime: startTime,
|
||||
EndTime: endTime,
|
||||
}
|
||||
|
||||
data, err := json.Marshal(config)
|
||||
@@ -186,6 +197,22 @@ func SaveForbidTimeConfig(minutr string) error {
|
||||
return os.WriteFile(ForbidTimeFile, data, 0644)
|
||||
}
|
||||
|
||||
func LoadForbidTimeConfig() (ForbidTimeConfig, error) {
|
||||
data, err := os.ReadFile(ForbidTimeFile)
|
||||
if err != nil {
|
||||
return ForbidTimeConfig{}, err
|
||||
}
|
||||
|
||||
var config ForbidTimeConfig
|
||||
if err := json.Unmarshal(data, &config); err != nil {
|
||||
return ForbidTimeConfig{}, err
|
||||
}
|
||||
if config.Minute == "" {
|
||||
config.Minute = config.Minutr
|
||||
}
|
||||
return config, nil
|
||||
}
|
||||
|
||||
// SaveEventCycleTimeoutConfig 保存事件周期时限配置
|
||||
func SaveEventCycleTimeoutConfig(fireLeaveTimeout, fireCheckTimeout time.Duration) error {
|
||||
config := CycleTimeoutConfig{
|
||||
@@ -208,25 +235,36 @@ func SaveEventCycleTimeoutConfig(fireLeaveTimeout, fireCheckTimeout time.Duratio
|
||||
|
||||
// GetForbidTimeConfig 获取禁止时间配置
|
||||
func GetForbidTimeConfig() string {
|
||||
// 读取缓存文件
|
||||
data, err := os.ReadFile(ForbidTimeFile)
|
||||
config, err := LoadForbidTimeConfig()
|
||||
if err != nil {
|
||||
// 缓存中没有值时,默认返回0
|
||||
return "0"
|
||||
}
|
||||
|
||||
var config struct {
|
||||
Minutr string `json:"minutr"`
|
||||
if config.Minute != "" {
|
||||
return config.Minute
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(data, &config); err != nil {
|
||||
// 解析失败时,默认返回0
|
||||
return "0"
|
||||
}
|
||||
|
||||
return config.Minutr
|
||||
}
|
||||
|
||||
func GetForbidDuration(defaultDuration time.Duration) time.Duration {
|
||||
return ParseForbidDuration(GetForbidTimeConfig(), defaultDuration)
|
||||
}
|
||||
|
||||
func ParseForbidDuration(value string, defaultDuration time.Duration) time.Duration {
|
||||
if value == "" || value == "0" {
|
||||
return defaultDuration
|
||||
}
|
||||
if duration, err := time.ParseDuration(value); err == nil && duration > 0 {
|
||||
return duration
|
||||
}
|
||||
var minutes int
|
||||
if _, err := fmt.Sscanf(value, "%d", &minutes); err == nil && minutes > 0 {
|
||||
return time.Duration(minutes) * time.Minute
|
||||
}
|
||||
return defaultDuration
|
||||
}
|
||||
|
||||
// ShouldReportBothEvents 判断是否应该同时上报两种事件
|
||||
func ShouldReportBothEvents() bool {
|
||||
// 注意:此逻辑已被修改,现在只在特定情况下使用
|
||||
@@ -246,6 +284,29 @@ func jsonString(v interface{}) string {
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func logJSON(logger *log.Logger, label string, v interface{}) {
|
||||
if logger == nil {
|
||||
return
|
||||
}
|
||||
b, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
logger.Printf("%s JSON编码失败: %v", label, err)
|
||||
return
|
||||
}
|
||||
logger.Printf("%s %s", label, string(b))
|
||||
}
|
||||
|
||||
func cleanupMergedFileAfterUpload(logger *log.Logger, mergedFile, deviceUUID string, uploadFailed bool) {
|
||||
if uploadFailed {
|
||||
logger.Printf("Nginx上传失败,保留临时文件用于排查: %s (DeviceUUID=%s)", mergedFile, deviceUUID)
|
||||
return
|
||||
}
|
||||
logger.Printf("清理临时文件: %s (DeviceUUID=%s)", mergedFile, deviceUUID)
|
||||
if err := os.Remove(mergedFile); err != nil {
|
||||
logger.Printf("清理临时文件失败: %v (DeviceUUID=%s, 文件=%s)", err, deviceUUID, mergedFile)
|
||||
}
|
||||
}
|
||||
|
||||
// UploadVideoAndReport 上传视频并上报事件
|
||||
func (r *Reporter) UploadVideoAndReport(deviceData connect.DeviceData, alarmTime int64, mergedFile string) error {
|
||||
// 异步执行视频上传和上报,避免阻塞主线程
|
||||
@@ -321,7 +382,9 @@ func (r *Reporter) UploadVideoAndReport(deviceData connect.DeviceData, alarmTime
|
||||
logger.Printf("开始上传视频到Nginx (DeviceUUID=%s, 文件=%s, URL=%s)", deviceData.DeviceUUID, mergedFile, deviceData.UploadURL)
|
||||
videoURL, err := video_server.UploadToNginx(mergedFile, nginxParams, deviceData.UploadURL)
|
||||
videoURLStr := ""
|
||||
uploadFailed := false
|
||||
if err != nil {
|
||||
uploadFailed = true
|
||||
logger.Printf("Nginx上传失败: %v (DeviceUUID=%s)", err, deviceData.DeviceUUID)
|
||||
} else {
|
||||
videoURLStr = videoURL
|
||||
@@ -336,14 +399,14 @@ func (r *Reporter) UploadVideoAndReport(deviceData connect.DeviceData, alarmTime
|
||||
r.wsClient = connect.GetWSClient()
|
||||
if r.wsClient == nil {
|
||||
logger.Printf("WebSocket客户端仍然为nil,无法上报事件 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if !r.wsClient.IsConnected() {
|
||||
logger.Printf("WS未就绪,延迟上报 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
logger.Printf("WebSocket客户端连接状态正常 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
@@ -365,8 +428,7 @@ func (r *Reporter) UploadVideoAndReport(deviceData connect.DeviceData, alarmTime
|
||||
}
|
||||
|
||||
// 清理临时文件
|
||||
logger.Printf("清理临时文件: %s (DeviceUUID=%s)", mergedFile, deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
logger.Printf("视频上传和事件上报完成 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
}()
|
||||
|
||||
@@ -405,7 +467,9 @@ func (r *Reporter) UploadVideoAndReportFireLeave(deviceData connect.DeviceData,
|
||||
logger.Printf("开始上传视频到Nginx (DeviceUUID=%s, 文件=%s, URL=%s)", deviceData.DeviceUUID, mergedFile, deviceData.UploadURL)
|
||||
videoURL, err := video_server.UploadToNginx(mergedFile, nginxParams, deviceData.UploadURL)
|
||||
videoURLStr := ""
|
||||
uploadFailed := false
|
||||
if err != nil {
|
||||
uploadFailed = true
|
||||
logger.Printf("Nginx上传失败: %v (DeviceUUID=%s)", err, deviceData.DeviceUUID)
|
||||
} else {
|
||||
videoURLStr = videoURL
|
||||
@@ -420,14 +484,14 @@ func (r *Reporter) UploadVideoAndReportFireLeave(deviceData connect.DeviceData,
|
||||
r.wsClient = connect.GetWSClient()
|
||||
if r.wsClient == nil {
|
||||
logger.Printf("WebSocket客户端仍然为nil,无法上报事件 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if !r.wsClient.IsConnected() {
|
||||
logger.Printf("WS未就绪,延迟上报 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
logger.Printf("WebSocket客户端连接状态正常 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
@@ -449,8 +513,7 @@ func (r *Reporter) UploadVideoAndReportFireLeave(deviceData connect.DeviceData,
|
||||
}
|
||||
|
||||
// 清理临时文件
|
||||
logger.Printf("清理临时文件: %s (DeviceUUID=%s)", mergedFile, deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
logger.Printf("温度报警视频上传和事件上报完成 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
}()
|
||||
|
||||
@@ -489,7 +552,9 @@ func (r *Reporter) UploadVideoAndReportFireCheck(deviceData connect.DeviceData,
|
||||
logger.Printf("开始上传视频到Nginx (DeviceUUID=%s, 文件=%s, URL=%s)", deviceData.DeviceUUID, mergedFile, deviceData.UploadURL)
|
||||
videoURL, err := video_server.UploadToNginx(mergedFile, nginxParams, deviceData.UploadURL)
|
||||
videoURLStr := ""
|
||||
uploadFailed := false
|
||||
if err != nil {
|
||||
uploadFailed = true
|
||||
logger.Printf("Nginx上传失败: %v (DeviceUUID=%s)", err, deviceData.DeviceUUID)
|
||||
} else {
|
||||
videoURLStr = videoURL
|
||||
@@ -504,14 +569,14 @@ func (r *Reporter) UploadVideoAndReportFireCheck(deviceData connect.DeviceData,
|
||||
r.wsClient = connect.GetWSClient()
|
||||
if r.wsClient == nil {
|
||||
logger.Printf("WebSocket客户端仍然为nil,无法上报事件 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if !r.wsClient.IsConnected() {
|
||||
logger.Printf("WS未就绪,延迟上报 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
return
|
||||
}
|
||||
logger.Printf("WebSocket客户端连接状态正常 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
@@ -533,8 +598,7 @@ func (r *Reporter) UploadVideoAndReportFireCheck(deviceData connect.DeviceData,
|
||||
}
|
||||
|
||||
// 清理临时文件
|
||||
logger.Printf("清理临时文件: %s (DeviceUUID=%s)", mergedFile, deviceData.DeviceUUID)
|
||||
os.Remove(mergedFile)
|
||||
cleanupMergedFileAfterUpload(logger, mergedFile, deviceData.DeviceUUID, uploadFailed)
|
||||
logger.Printf("火焰检测报警视频上传和事件上报完成 (DeviceUUID=%s)", deviceData.DeviceUUID)
|
||||
}()
|
||||
|
||||
@@ -729,6 +793,8 @@ func (r *Reporter) GenerateNginxParams(deviceData connect.DeviceData, alarmTime
|
||||
params["temperature"] = deviceData.Temperature
|
||||
}
|
||||
|
||||
logJSON(r.getLogger(), fmt.Sprintf("[Nginx Upload Params JSON] DeviceUUID=%s Level=%s", deviceData.DeviceUUID, level), params)
|
||||
|
||||
return params
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user