zhangqian
2023-08-19 94a8c84e8d29300644a689ce2cd6f537f1993224
plc查询和修改接口
1个文件已删除
3个文件已添加
7个文件已修改
876 ■■■■ 已修改文件
api/v1/config.go 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/config2.go 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/device_plc.go 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/index.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/plc_brand.go 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/request/plc.go 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/index.go 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/device_plc.go 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/config.go
@@ -2,6 +2,7 @@
import (
    "apsClient/model"
    "apsClient/model/request"
    _ "apsClient/model/response"
    "apsClient/pkg/contextx"
    "apsClient/pkg/ecode"
@@ -40,7 +41,7 @@
// @Produce   application/json
// @Param      object    body  model.NetConfig    true    "参数"
// @Success   200   {object}  contextx.Response{data=[]response.ProcessParams}  "成功"
// @Router    /v1/config/net [put]
// @Router    /v1/config/net [post]
func (slf *ConfigApi) SetNetConfig(c *gin.Context) {
    var params model.NetConfig
    ctx, ok := contextx.NewContext(c, &params)
@@ -64,3 +65,46 @@
    }
    ctx.Ok()
}
// PlcGet
// @Tags      Config
// @Summary   获取plc配置
// @Produce   application/json
// @Success   200   {object}  contextx.Response{data=model.DevicePlc}  "成功"
// @Router    /v1/config/plc [get]
func (slf *ConfigApi) PlcGet(c *gin.Context) {
    ctx, ok := contextx.NewContext(c, nil)
    if !ok {
        return
    }
    plcData, code := service.NewDevicePlcService().GetDevicePlc()
    if code != ecode.OK {
        ctx.Fail(code)
        return
    }
    ctx.OkWithDetailed(plcData)
}
// PlcUpdate
// @Tags    Config
// @Summary     更新plc配置
// @Produce    application/json
// @Param        object    body    request.UpdatePlc    true    "查询参数"
// @Success    200        {object}    contextx.Response{}
// @Router        /v1/config/plc [post]
func (slf *ConfigApi) PlcUpdate(c *gin.Context) {
    var params request.UpdatePlc
    ctx, ok := contextx.NewContext(c, &params)
    if !ok {
        return
    }
    errCode := service.NewDevicePlcService().UpdateDevicePlc(&params)
    if errCode != ecode.OK {
        ctx.Fail(errCode)
        return
    }
    ctx.Ok()
}
api/v1/config2.go
File was deleted
docs/docs.go
@@ -16,7 +16,7 @@
    "host": "{{.Host}}",
    "basePath": "{{.BasePath}}",
    "paths": {
        "/v1/cc/nn": {
        "/v1/config/net": {
            "get": {
                "produces": [
                    "application/json"
@@ -49,7 +49,7 @@
                    }
                }
            },
            "put": {
            "post": {
                "produces": [
                    "application/json"
                ],
@@ -93,7 +93,7 @@
                }
            }
        },
        "/v1/config/net": {
        "/v1/config/plc": {
            "get": {
                "produces": [
                    "application/json"
@@ -101,7 +101,7 @@
                "tags": [
                    "Config"
                ],
                "summary": "获取网络配置",
                "summary": "获取plc配置",
                "responses": {
                    "200": {
                        "description": "成功",
@@ -114,10 +114,7 @@
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/definitions/model.NetConfig"
                                            }
                                            "$ref": "#/definitions/model.DevicePlc"
                                        }
                                    }
                                }
@@ -126,45 +123,30 @@
                    }
                }
            },
            "put": {
            "post": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Config"
                ],
                "summary": "设置网络配置",
                "summary": "更新plc配置",
                "parameters": [
                    {
                        "description": "参数",
                        "description": "查询参数",
                        "name": "object",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/model.NetConfig"
                            "$ref": "#/definitions/request.UpdatePlc"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "成功",
                        "description": "OK",
                        "schema": {
                            "allOf": [
                                {
                                    "$ref": "#/definitions/contextx.Response"
                                },
                                {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/definitions/response.ProcessParams"
                                            }
                                        }
                                    }
                                }
                            ]
                            "$ref": "#/definitions/contextx.Response"
                        }
                    }
                }
@@ -520,6 +502,62 @@
                }
            }
        },
        "model.DevicePlc": {
            "type": "object",
            "properties": {
                "address": {
                    "type": "string"
                },
                "brand": {
                    "type": "string"
                },
                "details": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/model.DevicePlcAddress"
                    }
                },
                "frequency": {
                    "type": "integer"
                },
                "id": {
                    "type": "integer"
                },
                "isOpen": {
                    "type": "boolean"
                },
                "method": {
                    "type": "string"
                },
                "port": {
                    "type": "integer"
                },
                "portName": {
                    "type": "string"
                }
            }
        },
        "model.DevicePlcAddress": {
            "type": "object",
            "properties": {
                "fieldName": {
                    "description": "对应系统字段",
                    "type": "string"
                },
                "length": {
                    "description": "数据长度",
                    "type": "integer"
                },
                "startAddress": {
                    "description": "数据起始地址",
                    "type": "integer"
                },
                "type": {
                    "description": "数据类型",
                    "type": "string"
                }
            }
        },
        "model.NetConfig": {
            "type": "object",
            "required": [
@@ -691,6 +729,41 @@
                }
            }
        },
        "request.UpdatePlc": {
            "type": "object",
            "properties": {
                "address": {
                    "type": "string"
                },
                "brand": {
                    "type": "string"
                },
                "details": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/model.DevicePlcAddress"
                    }
                },
                "frequency": {
                    "type": "integer"
                },
                "id": {
                    "type": "integer"
                },
                "isOpen": {
                    "type": "boolean"
                },
                "method": {
                    "type": "string"
                },
                "port": {
                    "type": "integer"
                },
                "portName": {
                    "type": "string"
                }
            }
        },
        "request.UpdatePlcBrand": {
            "type": "object",
            "properties": {
docs/swagger.json
@@ -4,7 +4,7 @@
        "contact": {}
    },
    "paths": {
        "/v1/cc/nn": {
        "/v1/config/net": {
            "get": {
                "produces": [
                    "application/json"
@@ -37,7 +37,7 @@
                    }
                }
            },
            "put": {
            "post": {
                "produces": [
                    "application/json"
                ],
@@ -81,7 +81,7 @@
                }
            }
        },
        "/v1/config/net": {
        "/v1/config/plc": {
            "get": {
                "produces": [
                    "application/json"
@@ -89,7 +89,7 @@
                "tags": [
                    "Config"
                ],
                "summary": "获取网络配置",
                "summary": "获取plc配置",
                "responses": {
                    "200": {
                        "description": "成功",
@@ -102,10 +102,7 @@
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/definitions/model.NetConfig"
                                            }
                                            "$ref": "#/definitions/model.DevicePlc"
                                        }
                                    }
                                }
@@ -114,45 +111,30 @@
                    }
                }
            },
            "put": {
            "post": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Config"
                ],
                "summary": "设置网络配置",
                "summary": "更新plc配置",
                "parameters": [
                    {
                        "description": "参数",
                        "description": "查询参数",
                        "name": "object",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/model.NetConfig"
                            "$ref": "#/definitions/request.UpdatePlc"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "成功",
                        "description": "OK",
                        "schema": {
                            "allOf": [
                                {
                                    "$ref": "#/definitions/contextx.Response"
                                },
                                {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/definitions/response.ProcessParams"
                                            }
                                        }
                                    }
                                }
                            ]
                            "$ref": "#/definitions/contextx.Response"
                        }
                    }
                }
@@ -508,6 +490,62 @@
                }
            }
        },
        "model.DevicePlc": {
            "type": "object",
            "properties": {
                "address": {
                    "type": "string"
                },
                "brand": {
                    "type": "string"
                },
                "details": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/model.DevicePlcAddress"
                    }
                },
                "frequency": {
                    "type": "integer"
                },
                "id": {
                    "type": "integer"
                },
                "isOpen": {
                    "type": "boolean"
                },
                "method": {
                    "type": "string"
                },
                "port": {
                    "type": "integer"
                },
                "portName": {
                    "type": "string"
                }
            }
        },
        "model.DevicePlcAddress": {
            "type": "object",
            "properties": {
                "fieldName": {
                    "description": "对应系统字段",
                    "type": "string"
                },
                "length": {
                    "description": "数据长度",
                    "type": "integer"
                },
                "startAddress": {
                    "description": "数据起始地址",
                    "type": "integer"
                },
                "type": {
                    "description": "数据类型",
                    "type": "string"
                }
            }
        },
        "model.NetConfig": {
            "type": "object",
            "required": [
@@ -679,6 +717,41 @@
                }
            }
        },
        "request.UpdatePlc": {
            "type": "object",
            "properties": {
                "address": {
                    "type": "string"
                },
                "brand": {
                    "type": "string"
                },
                "details": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/model.DevicePlcAddress"
                    }
                },
                "frequency": {
                    "type": "integer"
                },
                "id": {
                    "type": "integer"
                },
                "isOpen": {
                    "type": "boolean"
                },
                "method": {
                    "type": "string"
                },
                "port": {
                    "type": "integer"
                },
                "portName": {
                    "type": "string"
                }
            }
        },
        "request.UpdatePlcBrand": {
            "type": "object",
            "properties": {
docs/swagger.yaml
@@ -63,6 +63,44 @@
      msg:
        type: string
    type: object
  model.DevicePlc:
    properties:
      address:
        type: string
      brand:
        type: string
      details:
        items:
          $ref: '#/definitions/model.DevicePlcAddress'
        type: array
      frequency:
        type: integer
      id:
        type: integer
      isOpen:
        type: boolean
      method:
        type: string
      port:
        type: integer
      portName:
        type: string
    type: object
  model.DevicePlcAddress:
    properties:
      fieldName:
        description: 对应系统字段
        type: string
      length:
        description: 数据长度
        type: integer
      startAddress:
        description: 数据起始地址
        type: integer
      type:
        description: 数据类型
        type: string
    type: object
  model.NetConfig:
    properties:
      dns:
@@ -178,6 +216,29 @@
      name:
        type: string
    type: object
  request.UpdatePlc:
    properties:
      address:
        type: string
      brand:
        type: string
      details:
        items:
          $ref: '#/definitions/model.DevicePlcAddress'
        type: array
      frequency:
        type: integer
      id:
        type: integer
      isOpen:
        type: boolean
      method:
        type: string
      port:
        type: integer
      portName:
        type: string
    type: object
  request.UpdatePlcBrand:
    properties:
      id:
@@ -217,50 +278,6 @@
info:
  contact: {}
paths:
  /v1/cc/nn:
    get:
      produces:
      - application/json
      responses:
        "200":
          description: 成功
          schema:
            allOf:
            - $ref: '#/definitions/contextx.Response'
            - properties:
                data:
                  items:
                    $ref: '#/definitions/model.NetConfig'
                  type: array
              type: object
      summary: 获取网络配置
      tags:
      - Config
    put:
      parameters:
      - description: 参数
        in: body
        name: object
        required: true
        schema:
          $ref: '#/definitions/model.NetConfig'
      produces:
      - application/json
      responses:
        "200":
          description: 成功
          schema:
            allOf:
            - $ref: '#/definitions/contextx.Response'
            - properties:
                data:
                  items:
                    $ref: '#/definitions/response.ProcessParams'
                  type: array
              type: object
      summary: 设置网络配置
      tags:
      - Config
  /v1/config/net:
    get:
      produces:
@@ -280,7 +297,7 @@
      summary: 获取网络配置
      tags:
      - Config
    put:
    post:
      parameters:
      - description: 参数
        in: body
@@ -305,6 +322,41 @@
      summary: 设置网络配置
      tags:
      - Config
  /v1/config/plc:
    get:
      produces:
      - application/json
      responses:
        "200":
          description: 成功
          schema:
            allOf:
            - $ref: '#/definitions/contextx.Response'
            - properties:
                data:
                  $ref: '#/definitions/model.DevicePlc'
              type: object
      summary: 获取plc配置
      tags:
      - Config
    post:
      parameters:
      - description: 查询参数
        in: body
        name: object
        required: true
        schema:
          $ref: '#/definitions/request.UpdatePlc'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/contextx.Response'
      summary: 更新plc配置
      tags:
      - Config
  /v1/plcBrand/add:
    post:
      parameters:
model/device_plc.go
New file
@@ -0,0 +1,247 @@
package model
import (
    "apsClient/pkg/sqlitex"
    "encoding/json"
    "fmt"
    "gorm.io/gorm"
)
type (
    // DevicePlc 设备的PLC配置
    DevicePlc struct {
        gorm.Model `json:"-"`
        Id         int    `gorm:"primarykey;type:int;"`
        Brand      string `gorm:"type:varchar(191);comment:PLC品牌" json:"brand"`
        Method     string `gorm:"type:varchar(191);comment:接口方式" json:"method"`
        PortName   string `gorm:"type:varchar(191);comment:端口名称" json:"portName"`
        Frequency  int    `gorm:"type:int(11);comment:数据更新频率 0-实时更新 1-1次/秒" json:"frequency"`
        Address    string `gorm:"type:varchar(191);comment:PLC地址" json:"address"`
        Port       int    `gorm:"type:int(11);comment:端口" json:"port"`
        IsOpen     bool   `gorm:"type:tinyint(1);comment:是否开启" json:"isOpen"`
        Detail     string `gorm:"type:varchar(2048);comment:数据详情" json:"-"`
        Details []*DevicePlcAddress `gorm:"-" json:"details"`
    }
    DevicePlcAddress struct {
        StartAddress int    `json:"startAddress"` // 数据起始地址
        Length       int    `json:"length"`       // 数据长度
        Type         string `json:"type"`         // 数据类型
        FieldName    string `json:"fieldName"`    // 对应系统字段
    }
    DevicePlcSearch struct {
        DevicePlc
        Order    string
        PageNum  int
        PageSize int
        Orm      *gorm.DB
    }
)
func (slf *DevicePlc) TableName() string {
    return "device_plc"
}
func (slf *DevicePlc) AfterFind(tx *gorm.DB) error {
    details := make([]*DevicePlcAddress, 0)
    err := json.Unmarshal([]byte(slf.Detail), &details)
    if err != nil {
        return err
    }
    slf.Details = details
    return nil
}
func NewDevicePlcSearch() *DevicePlcSearch {
    return &DevicePlcSearch{Orm: sqlitex.GetDB()}
}
func (slf *DevicePlcSearch) SetOrm(tx *gorm.DB) *DevicePlcSearch {
    slf.Orm = tx
    return slf
}
func (slf *DevicePlcSearch) SetPage(page, size int) *DevicePlcSearch {
    slf.PageNum, slf.PageSize = page, size
    return slf
}
func (slf *DevicePlcSearch) SetOrder(order string) *DevicePlcSearch {
    slf.Order = order
    return slf
}
func (slf *DevicePlcSearch) SetId(id int) *DevicePlcSearch {
    slf.Id = id
    return slf
}
func (slf *DevicePlcSearch) build() *gorm.DB {
    var db = slf.Orm.Table(slf.TableName())
    if slf.Id > 0 {
        db = db.Where("id = ?", slf.Id)
    }
    if slf.Order != "" {
        db = db.Order(slf.Order)
    }
    return db
}
// Create 单条插入
func (slf *DevicePlcSearch) Create(record *DevicePlc) error {
    var db = slf.build()
    if err := db.Create(record).Error; err != nil {
        return fmt.Errorf("create err: %v, record: %+v", err, record)
    }
    return nil
}
// CreateBatch 批量插入
func (slf *DevicePlcSearch) CreateBatch(records []*DevicePlc) error {
    var db = slf.build()
    if err := db.Create(&records).Error; err != nil {
        return fmt.Errorf("create batch err: %v, records: %+v", err, records)
    }
    return nil
}
func (slf *DevicePlcSearch) Save(record *DevicePlc) error {
    var db = slf.build()
    if err := db.Omit("CreatedAt").Save(record).Error; err != nil {
        return fmt.Errorf("save err: %v, record: %+v", err, record)
    }
    return nil
}
func (slf *DevicePlcSearch) UpdateByMap(upMap map[string]interface{}) error {
    var (
        db = slf.build()
    )
    if err := db.Updates(upMap).Error; err != nil {
        return fmt.Errorf("update by map err: %v, upMap: %+v", err, upMap)
    }
    return nil
}
func (slf *DevicePlcSearch) UpdateByQuery(query string, args []interface{}, upMap map[string]interface{}) error {
    var (
        db = slf.Orm.Table(slf.TableName()).Where(query, args...)
    )
    if err := db.Updates(upMap).Error; err != nil {
        return fmt.Errorf("update by query err: %v, query: %s, args: %+v, upMap: %+v", err, query, args, upMap)
    }
    return nil
}
func (slf *DevicePlcSearch) Delete() error {
    var db = slf.build()
    if err := db.Unscoped().Delete(&DevicePlc{}).Error; err != nil {
        return err
    }
    return nil
}
func (slf *DevicePlcSearch) First() (*DevicePlc, error) {
    var (
        record = new(DevicePlc)
        db     = slf.build()
    )
    if err := db.First(record).Error; err != nil {
        return record, err
    }
    return record, nil
}
func (slf *DevicePlcSearch) Find() ([]*DevicePlc, int64, error) {
    var (
        records = make([]*DevicePlc, 0)
        total   int64
        db      = slf.build()
    )
    if err := db.Count(&total).Error; err != nil {
        return records, total, fmt.Errorf("find count err: %v", err)
    }
    if slf.PageNum*slf.PageSize > 0 {
        db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
    }
    if err := db.Find(&records).Error; err != nil {
        return records, total, fmt.Errorf("find records err: %v", err)
    }
    return records, total, nil
}
func (slf *DevicePlcSearch) FindNotTotal() ([]*DevicePlc, error) {
    var (
        records = make([]*DevicePlc, 0)
        db      = slf.build()
    )
    if slf.PageNum*slf.PageSize > 0 {
        db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
    }
    if err := db.Find(&records).Error; err != nil {
        return records, fmt.Errorf("find records err: %v", err)
    }
    return records, nil
}
// FindByQuery 指定条件查询.
func (slf *DevicePlcSearch) FindByQuery(query string, args []interface{}) ([]*DevicePlc, int64, error) {
    var (
        records = make([]*DevicePlc, 0)
        total   int64
        db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
    )
    if err := db.Count(&total).Error; err != nil {
        return records, total, fmt.Errorf("find by query count err: %v", err)
    }
    if slf.PageNum*slf.PageSize > 0 {
        db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
    }
    if err := db.Find(&records).Error; err != nil {
        return records, total, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
    }
    return records, total, nil
}
// FindByQueryNotTotal 指定条件查询&不查询总条数.
func (slf *DevicePlcSearch) FindByQueryNotTotal(query string, args []interface{}) ([]*DevicePlc, error) {
    var (
        records = make([]*DevicePlc, 0)
        db      = slf.Orm.Table(slf.TableName()).Where(query, args...)
    )
    if slf.PageNum*slf.PageSize > 0 {
        db = db.Offset((slf.PageNum - 1) * slf.PageSize).Limit(slf.PageSize)
    }
    if err := db.Find(&records).Error; err != nil {
        return records, fmt.Errorf("find by query records err: %v, query: %s, args: %+v", err, query, args)
    }
    return records, nil
}
model/index.go
@@ -26,6 +26,7 @@
        Procedures{},
        NetConfig{},
        PlcBrand{},
        DevicePlc{},
    )
    return err
}
@@ -40,6 +41,7 @@
    models := []interface{}{
        NewNetConfigSearch(nil),
        NewPlcBrandSearch(),
    }
    for _, model := range models {
model/plc_brand.go
@@ -6,6 +6,7 @@
    "errors"
    "fmt"
    "gorm.io/gorm"
    "sync"
)
type (
@@ -129,17 +130,28 @@
}
// InitDefaultData 初始化数据
func (slf *PlcBrandSearch) InitDefaultData() error {
func (slf *PlcBrandSearch) InitDefaultData(errCh chan<- error, wg *sync.WaitGroup) {
    var (
        db          = slf.Orm.Table(slf.TableName())
        total int64 = 0
    )
    defer wg.Done()
    if err := db.Count(&total).Error; err != nil {
        return err
        errCh <- err
        return
    }
    if total != 0 {
        return nil
        return
    }
    records := []*PlcBrand{}
    return slf.CreateBatch(records)
    records := []*PlcBrand{
        {1, "欧姆龙"},
        {2, "西门子"},
        {3, "松下"},
    }
    err := slf.CreateBatch(records)
    if err != nil {
        errCh <- err
        return
    }
}
model/request/plc.go
New file
@@ -0,0 +1,14 @@
package request
import (
    "apsClient/model"
)
type AddPlc struct {
    model.DevicePlc
}
type UpdatePlc struct {
    Id int `json:"id"`
    model.DevicePlc
}
router/index.go
@@ -46,13 +46,8 @@
    {
        configGroup.GET("net", configApi.GetNetConfig)  // 获取网络配置
        configGroup.POST("net", configApi.SetNetConfig) // 设置网络
    }
    configApi1 := new(v1.ConfigApi2)
    configGroup1 := v1Group.Group("cc")
    {
        configGroup1.GET("nn", configApi1.GetNetConfig)  // 获取网络配置
        configGroup1.POST("nn", configApi1.SetNetConfig) // 设置网络
        configGroup.GET("plc", configApi.PlcGet)        // 获取plc配置
        configGroup.POST("plc", configApi.PlcUpdate)    // 设置plc
    }
    InitPlcBrandRouter(v1Group)
service/device_plc.go
New file
@@ -0,0 +1,66 @@
package service
import (
    "apsClient/model"
    "apsClient/model/request"
    "apsClient/pkg/ecode"
    "apsClient/pkg/logx"
    "apsClient/pkg/structx"
    "encoding/json"
    "gorm.io/gorm"
)
type DevicePlcService struct{}
func NewDevicePlcService() DevicePlcService {
    return DevicePlcService{}
}
func (DevicePlcService) GetDevicePlc() (*model.DevicePlc, int) {
    DevicePlc, err := model.NewDevicePlcSearch().SetOrder("id desc").First()
    if err == gorm.ErrRecordNotFound {
        return &model.DevicePlc{
            Brand:     "",
            Method:    "",
            PortName:  "",
            Frequency: 0,
            Address:   "",
            Port:      0,
            IsOpen:    false,
            Detail:    "",
            Details:   make([]*model.DevicePlcAddress, 0),
        }, ecode.OK
    }
    if err != nil {
        return nil, ecode.DBErr
    }
    return DevicePlc, ecode.OK
}
func (DevicePlcService) UpdateDevicePlc(plc *request.UpdatePlc) int {
    var record model.DevicePlc
    err := structx.AssignTo(plc, &record)
    if err != nil {
        logx.Errorf("UpdateDevicePlc err: %v", err.Error())
        return ecode.UnknownErr
    }
    detail, err := json.Marshal(plc.Details)
    if err != nil {
        return ecode.ParamsErr
    }
    record.Detail = string(detail)
    if plc.Id == 0 {
        err = model.NewDevicePlcSearch().Create(&record)
    } else {
        err = model.NewDevicePlcSearch().SetId(plc.Id).Save(&record)
    }
    if err != nil {
        logx.Errorf("UpdateDevicePlc err: %v", err.Error())
        return ecode.DBErr
    }
    return ecode.OK
}