| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- 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"`
- }
|