update current project state

This commit is contained in:
gqc
2026-07-03 20:55:15 +08:00
parent 6056b1fdc5
commit 13c4d03055
13 changed files with 1084 additions and 185 deletions
+93 -27
View File
@@ -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
}