package domain import ( "time" proto "fwh-toolbox-server/function/FaultRecordProtocol" "go.mongodb.org/mongo-driver/bson/primitive" ) // FaultRecordOpKind 故障录波 MQTT 操作类型 type FaultRecordOpKind string const ( FaultRecordOpDeviceInfo FaultRecordOpKind = "device_info" // cmd=0 FaultRecordOpRecordFetch FaultRecordOpKind = "record_fetch" // cmd=2 FaultRecordOpParamRead FaultRecordOpKind = "param_read" // cmd=3 FaultRecordOpParamWrite FaultRecordOpKind = "param_write" // cmd=1 ) // Cmd 操作对应的业务层 cmd func (k FaultRecordOpKind) Cmd() int { switch k { case FaultRecordOpDeviceInfo: return proto.CmdRealtime case FaultRecordOpRecordFetch: return proto.CmdGetRecord case FaultRecordOpParamRead: return proto.CmdQueryParam case FaultRecordOpParamWrite: return proto.CmdSetParam } return -1 } // FaultRecordOpStatus 操作状态 type FaultRecordOpStatus string const ( // 进行中 FaultRecordStatusPending FaultRecordOpStatus = "pending" // 已创建,未发送 FaultRecordStatusSent FaultRecordOpStatus = "sent" // 已发送 377 FaultRecordStatusAccepted FaultRecordOpStatus = "accepted" // 收到 378 FaultRecordStatusReady FaultRecordOpStatus = "ready" // 收到 379(record_fetch 继续等待上传) FaultRecordStatusUploading FaultRecordOpStatus = "uploading" // 收到 607 FaultRecordStatusUploaded FaultRecordOpStatus = "uploaded" // 收到 609 成功 FaultRecordStatusDownloaded FaultRecordOpStatus = "downloaded" // 文件已存 MinIO // 终止 FaultRecordStatusDone FaultRecordOpStatus = "done" FaultRecordStatusItemFailed FaultRecordOpStatus = "item_failed" // 379 中有子项失败 FaultRecordStatusBusy FaultRecordOpStatus = "busy" // 设备正在处理其他命令 FaultRecordStatusRejected FaultRecordOpStatus = "rejected" // 378 失败或 379 错误回复 FaultRecordStatusTimeout FaultRecordOpStatus = "timeout" // 某阶段等待超时,见 TimeoutStage FaultRecordStatusUploadFailed FaultRecordOpStatus = "upload_failed" // 609 失败 FaultRecordStatusDownloadFailed FaultRecordOpStatus = "download_failed" // 下载或存储失败 FaultRecordStatusParseFailed FaultRecordOpStatus = "parse_failed" // 文件已保存但解析失败 FaultRecordStatusCancelled FaultRecordOpStatus = "cancelled" FaultRecordStatusInterrupted FaultRecordOpStatus = "interrupted" // 服务重启时处于无法安全恢复的阶段 FaultRecordStatusGatewayLocked FaultRecordOpStatus = "gateway_locked" // 本工具内该网关已有操作进行中 FaultRecordStatusError FaultRecordOpStatus = "error" // 其他错误(MQTT 不可用等) ) var faultRecordTerminal = map[FaultRecordOpStatus]bool{ FaultRecordStatusDone: true, FaultRecordStatusItemFailed: true, FaultRecordStatusBusy: true, FaultRecordStatusRejected: true, FaultRecordStatusTimeout: true, FaultRecordStatusUploadFailed: true, FaultRecordStatusDownloadFailed: true, FaultRecordStatusParseFailed: true, FaultRecordStatusCancelled: true, FaultRecordStatusInterrupted: true, FaultRecordStatusGatewayLocked: true, FaultRecordStatusError: true, } func (s FaultRecordOpStatus) Terminal() bool { return faultRecordTerminal[s] } // CanRetryDownload 上传已完成(收到 609)但下载失败或超时,且有文件名时,可手动重试下载 func (op *FaultRecordOperation) CanRetryDownload() bool { if op.Kind != FaultRecordOpRecordFetch || op.FileName == "" { return false } if _, uploaded := op.StageTimes[string(FaultRecordStatusUploaded)]; !uploaded { return false } return op.Status == FaultRecordStatusDownloadFailed || op.Status == FaultRecordStatusTimeout } // FaultRecordTerminalStatuses 全部终止状态 func FaultRecordTerminalStatuses() []FaultRecordOpStatus { list := make([]FaultRecordOpStatus, 0, len(faultRecordTerminal)) for s := range faultRecordTerminal { list = append(list, s) } return list } // FaultRecordOpRequest 操作请求参数 type FaultRecordOpRequest struct { CodeList []int `bson:"codeList,omitempty" json:"codeList,omitempty"` // device_info RecordIndex int `bson:"recordIndex,omitempty" json:"recordIndex,omitempty"` // record_fetch(旧记录,单条) RecordIndexes []int `bson:"recordIndexes,omitempty" json:"recordIndexes,omitempty"` // record_fetch,可多条 IdList []int `bson:"idList,omitempty" json:"idList,omitempty"` // param_read ParaList []proto.ParaItem `bson:"paraList,omitempty" json:"paraList,omitempty"` // param_write } // Indexes 本次获取的记录序号(兼容只有 RecordIndex 的旧记录) func (r FaultRecordOpRequest) Indexes() []int { if len(r.RecordIndexes) > 0 { return r.RecordIndexes } if r.RecordIndex > 0 { return []int{r.RecordIndex} } return nil } // FaultRecordOpMessage 收发的原始报文 type FaultRecordOpMessage struct { Direction string `bson:"direction" json:"direction"` // send / recv / http(文件下载)/ action(用户操作,如手动重试下载) Topic string `bson:"topic" json:"topic"` CmdType uint `bson:"cmdType" json:"cmdType"` At time.Time `bson:"at" json:"at"` Raw string `bson:"raw" json:"raw"` } // FaultRecordOperation 一次故障录波 MQTT 操作(MongoDB 文档) type FaultRecordOperation struct { ID primitive.ObjectID `bson:"_id" json:"id"` Env string `bson:"env" json:"env"` GatewaySn string `bson:"gatewaySn" json:"gatewaySn"` DeviceType string `bson:"deviceType" json:"deviceType"` // pe / aGate DeviceSn string `bson:"deviceSn" json:"deviceSn"` Kind FaultRecordOpKind `bson:"kind" json:"kind"` Cmd int `bson:"cmd" json:"cmd"` Request FaultRecordOpRequest `bson:"request" json:"request"` Operator string `bson:"operator" json:"operator"` Status FaultRecordOpStatus `bson:"status" json:"status"` TimeoutStage FaultRecordOpStatus `bson:"timeoutStage,omitempty" json:"timeoutStage,omitempty"` // 超时时所等待的阶段 Error string `bson:"error,omitempty" json:"error,omitempty"` StageTimes map[string]time.Time `bson:"stageTimes" json:"stageTimes"` CancelReq bool `bson:"cancelRequested" json:"cancelRequested"` ExitSent bool `bson:"exitSent" json:"exitSent"` // 取消时已向设备发送 cmd=4 Messages []FaultRecordOpMessage `bson:"messages" json:"messages,omitempty"` Reply *proto.Reply `bson:"reply,omitempty" json:"reply,omitempty"` // 379 原文结构 // record_fetch FileName string `bson:"fileName,omitempty" json:"fileName,omitempty"` // 609.fileName FaultRecordID int64 `bson:"faultRecordId,omitempty" json:"faultRecordId,omitempty"` UploadEquipNo string `bson:"uploadEquipNo,omitempty" json:"-"` // 下载路径中的 equipNo MinioObject string `bson:"minioObject,omitempty" json:"-"` FileSize int64 `bson:"fileSize,omitempty" json:"fileSize,omitempty"` // 手动重试下载:上传已完成(收到 609)但下载失败时,由用户触发重新下载 DownloadRetryAt *time.Time `bson:"downloadRetryAt,omitempty" json:"downloadRetryAt,omitempty"` DownloadRetryCount int `bson:"downloadRetryCount,omitempty" json:"downloadRetryCount,omitempty"` CreatedAt time.Time `bson:"createdAt" json:"createdAt"` UpdatedAt time.Time `bson:"updatedAt" json:"updatedAt"` }