限制故障12小时内重复入库

main
wangqiyang 2 weeks ago
parent 7d8ef4f128
commit 2271619ae1

@ -21,7 +21,8 @@ var historyLock sync.Mutex
var filePath = system.GetPathOfProgram() + "data/data.json" var filePath = system.GetPathOfProgram() + "data/data.json"
const ( const (
maxItems = 50 maxItems = 50
faultDuplicateWindow = 12 * time.Hour
) )
func ScanM9z() { func ScanM9z() {
@ -105,19 +106,15 @@ func addData(newItem M9zFaultHistory) error {
return gerror.Wrap(err, "readData") return gerror.Wrap(err, "readData")
} }
if newItem.FaultTime.IsZero() {
newItem.FaultTime = time.Now()
}
for _, item := range items { for _, item := range items {
if item.CommUid == newItem.CommUid && if isDuplicateFaultWithinWindow(item, newItem) {
item.LoopIdx == newItem.LoopIdx &&
item.FaultCode == newItem.FaultCode &&
item.FaultMsg == newItem.FaultMsg &&
item.OperateStatus == 0 {
return nil return nil
} }
} }
if newItem.FaultTime.IsZero() {
newItem.FaultTime = time.Now()
}
items = append(items, newItem) items = append(items, newItem)
if len(items) > maxItems { if len(items) > maxItems {
@ -136,6 +133,23 @@ func addData(newItem M9zFaultHistory) error {
return nil return nil
} }
func isDuplicateFaultWithinWindow(item, newItem M9zFaultHistory) bool {
if item.CommUid != newItem.CommUid ||
item.LoopIdx != newItem.LoopIdx ||
item.FaultCode != newItem.FaultCode ||
item.FaultMsg != newItem.FaultMsg {
return false
}
if item.FaultTime.IsZero() || newItem.FaultTime.IsZero() {
return false
}
diff := newItem.FaultTime.Sub(item.FaultTime)
if diff < 0 {
diff = -diff
}
return diff < faultDuplicateWindow
}
func deleteById(id int) error { func deleteById(id int) error {
historyLock.Lock() historyLock.Lock()
defer historyLock.Unlock() defer historyLock.Unlock()

@ -0,0 +1,81 @@
package m9zApi
import (
"path/filepath"
"testing"
"time"
)
func useTempFaultHistoryFile(t *testing.T) {
t.Helper()
oldFilePath := filePath
filePath = filepath.Join(t.TempDir(), "data.json")
t.Cleanup(func() {
filePath = oldFilePath
})
}
func TestAddDataSkipsDuplicateFaultWithin12Hours(t *testing.T) {
useTempFaultHistoryFile(t)
now := time.Date(2026, 7, 29, 8, 0, 0, 0, time.UTC)
item := M9zFaultHistory{
CommUid: "device-1",
LoopIdx: 1,
FaultCode: "01",
FaultMsg: "short circuit",
FaultTime: now,
}
if err := addData(item); err != nil {
t.Fatalf("addData first item error = %v", err)
}
duplicate := item
duplicate.Voltage = 230
duplicate.FaultTime = now.Add(faultDuplicateWindow - time.Second)
if err := addData(duplicate); err != nil {
t.Fatalf("addData duplicate item error = %v", err)
}
items, err := readData()
if err != nil {
t.Fatalf("readData error = %v", err)
}
if len(items) != 1 {
t.Fatalf("len(items) = %d, want 1", len(items))
}
if !items[0].FaultTime.Equal(now) {
t.Fatalf("FaultTime = %v, want %v", items[0].FaultTime, now)
}
}
func TestAddDataAllowsDuplicateFaultAfter12Hours(t *testing.T) {
useTempFaultHistoryFile(t)
now := time.Date(2026, 7, 29, 8, 0, 0, 0, time.UTC)
item := M9zFaultHistory{
CommUid: "device-1",
LoopIdx: 1,
FaultCode: "01",
FaultMsg: "short circuit",
FaultTime: now,
}
if err := addData(item); err != nil {
t.Fatalf("addData first item error = %v", err)
}
duplicate := item
duplicate.FaultTime = now.Add(faultDuplicateWindow)
if err := addData(duplicate); err != nil {
t.Fatalf("addData after window error = %v", err)
}
items, err := readData()
if err != nil {
t.Fatalf("readData error = %v", err)
}
if len(items) != 2 {
t.Fatalf("len(items) = %d, want 2", len(items))
}
}
Loading…
Cancel
Save