chore: 同步本地 v9 整改与运营能力
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"silk-server-go/internal/middleware"
|
||||
"silk-server-go/internal/model"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// RegisterDeviceMaintenanceRoutes 注册设备校准/故障/维护/固件记录路由。
|
||||
func RegisterDeviceMaintenanceRoutes(rg *gin.RouterGroup, db *gorm.DB) {
|
||||
read := middleware.RequirePermission(db, "device:read")
|
||||
write := middleware.RequirePermission(db, "device:write")
|
||||
rg.GET("/device-maintenance", read, listDeviceMaintenance(db))
|
||||
rg.POST("/device-maintenance", write, createDeviceMaintenance(db))
|
||||
rg.PATCH("/device-maintenance/:id", write, updateDeviceMaintenance(db))
|
||||
rg.DELETE("/device-maintenance/:id", write, deleteDeviceMaintenance(db))
|
||||
}
|
||||
|
||||
func listDeviceMaintenance(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
q := db.Model(&model.DeviceMaintenanceRecord{}).
|
||||
Joins("JOIN devices d ON d.id = device_maintenance_records.device_id")
|
||||
q = applyRoomScope(q, c, "d.room_id")
|
||||
if deviceID := c.Query("deviceId"); deviceID != "" {
|
||||
q = q.Where("device_maintenance_records.device_id = ?", deviceID)
|
||||
}
|
||||
if kind := c.Query("kind"); kind != "" {
|
||||
q = q.Where("device_maintenance_records.kind = ?", kind)
|
||||
}
|
||||
var list []model.DeviceMaintenanceRecord
|
||||
q.Order("device_maintenance_records.created_at DESC").Limit(200).Find(&list)
|
||||
c.JSON(http.StatusOK, list)
|
||||
}
|
||||
}
|
||||
|
||||
func createDeviceMaintenance(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
var body struct {
|
||||
DeviceID string `json:"deviceId"`
|
||||
Kind string `json:"kind"`
|
||||
Title string `json:"title"`
|
||||
ScheduledAt *time.Time `json:"scheduledAt"`
|
||||
PerformedAt *time.Time `json:"performedAt"`
|
||||
PerformerID *string `json:"performerId"`
|
||||
Result *string `json:"result"`
|
||||
FirmwareFrom *string `json:"firmwareFrom"`
|
||||
FirmwareTo *string `json:"firmwareTo"`
|
||||
CostAmount *float64 `json:"costAmount"`
|
||||
CostUnit *string `json:"costUnit"`
|
||||
Note *string `json:"note"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&body); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
if !isUUID(body.DeviceID) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "deviceId 不是合法的 UUID"})
|
||||
return
|
||||
}
|
||||
if !requireObjectAccess(c, db, "device", body.DeviceID) {
|
||||
return
|
||||
}
|
||||
record := model.DeviceMaintenanceRecord{
|
||||
DeviceID: body.DeviceID, Kind: body.Kind, Title: body.Title,
|
||||
ScheduledAt: body.ScheduledAt, PerformedAt: body.PerformedAt,
|
||||
PerformerID: body.PerformerID, Result: body.Result,
|
||||
FirmwareFrom: body.FirmwareFrom, FirmwareTo: body.FirmwareTo,
|
||||
CostAmount: body.CostAmount, CostUnit: body.CostUnit, Note: body.Note,
|
||||
CreatedBy: currentUserID(c),
|
||||
}
|
||||
if err := model.ValidateDeviceMaintenanceRecord(record); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
if err := db.Create(&record).Error; err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "创建设备维护记录失败"})
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusCreated, record)
|
||||
}
|
||||
}
|
||||
|
||||
func updateDeviceMaintenance(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
if !requireObjectAccess(c, db, "device_maintenance_record", id) {
|
||||
return
|
||||
}
|
||||
var record model.DeviceMaintenanceRecord
|
||||
if db.Where("id = ?", id).First(&record).Error != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "device maintenance record not found"})
|
||||
return
|
||||
}
|
||||
var body struct {
|
||||
Kind *string `json:"kind"`
|
||||
Title *string `json:"title"`
|
||||
ScheduledAt *time.Time `json:"scheduledAt"`
|
||||
PerformedAt *time.Time `json:"performedAt"`
|
||||
PerformerID *string `json:"performerId"`
|
||||
Result *string `json:"result"`
|
||||
FirmwareFrom *string `json:"firmwareFrom"`
|
||||
FirmwareTo *string `json:"firmwareTo"`
|
||||
CostAmount *float64 `json:"costAmount"`
|
||||
CostUnit *string `json:"costUnit"`
|
||||
Note *string `json:"note"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&body); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
updates := map[string]interface{}{}
|
||||
if body.Kind != nil {
|
||||
if !model.ValidMaintenanceKind(*body.Kind) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "kind 仅支持 calibration/fault/maintenance/firmware"})
|
||||
return
|
||||
}
|
||||
updates["kind"] = *body.Kind
|
||||
}
|
||||
if body.Title != nil {
|
||||
updates["title"] = *body.Title
|
||||
}
|
||||
if body.ScheduledAt != nil {
|
||||
updates["scheduled_at"] = *body.ScheduledAt
|
||||
}
|
||||
if body.PerformedAt != nil {
|
||||
updates["performed_at"] = *body.PerformedAt
|
||||
}
|
||||
if body.PerformerID != nil {
|
||||
updates["performer_id"] = *body.PerformerID
|
||||
}
|
||||
if body.Result != nil {
|
||||
updates["result"] = *body.Result
|
||||
}
|
||||
if body.FirmwareFrom != nil {
|
||||
updates["firmware_from"] = *body.FirmwareFrom
|
||||
}
|
||||
if body.FirmwareTo != nil {
|
||||
updates["firmware_to"] = *body.FirmwareTo
|
||||
}
|
||||
if body.CostAmount != nil {
|
||||
updates["cost_amount"] = *body.CostAmount
|
||||
}
|
||||
if body.CostUnit != nil {
|
||||
updates["cost_unit"] = *body.CostUnit
|
||||
}
|
||||
if body.Note != nil {
|
||||
updates["note"] = *body.Note
|
||||
}
|
||||
if len(updates) > 0 {
|
||||
if err := db.Model(&model.DeviceMaintenanceRecord{}).Where("id = ?", id).Updates(updates).Error; err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "更新设备维护记录失败"})
|
||||
return
|
||||
}
|
||||
}
|
||||
db.Where("id = ?", id).First(&record)
|
||||
c.JSON(http.StatusOK, record)
|
||||
}
|
||||
}
|
||||
|
||||
func deleteDeviceMaintenance(db *gorm.DB) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
if !requireObjectAccess(c, db, "device_maintenance_record", id) {
|
||||
return
|
||||
}
|
||||
var record model.DeviceMaintenanceRecord
|
||||
if db.Where("id = ?", id).First(&record).Error != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "device maintenance record not found"})
|
||||
return
|
||||
}
|
||||
db.Where("id = ?", id).Delete(&model.DeviceMaintenanceRecord{})
|
||||
c.JSON(http.StatusOK, gin.H{"id": id})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user