123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- package controllers
- import (
- "encoding/json"
- "errors"
- "fmt"
- "rtzh_elec_temperature/logger"
- "rtzh_elec_temperature/rtelec_app_public_lib/service"
- "rtzh_elec_temperature/tools"
- "strconv"
- "github.com/astaxie/beego/orm"
- )
- //数据优化相关服务
- type DataOptimizeController struct {
- BaseController
- }
- // 获取算法优化策略开启状态 godoc
- // @Summary 获取算法优化策略开启状态
- // @Description 获取算法优化策略开启状态。包括以下状态字典:deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示),以上状态字典值均为1或者0.
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /rule_state/list [get]
- func (c *DataOptimizeController) GetRuleState() {
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- list := obj.GetRuleStatus()
- c.Data["json"] = c.ApiOK(list)
- c.ServeJSON()
- }
- // 设置算法优化策略开启状态 godoc
- // @Summary 设置保存算法优化策略开启状态
- // @Description 设置保存算法优化策略开启状态。包括以下状态字典:deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示),以上状态字典值均为1或者0.
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Param rulecode query string true "规则代码。deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示配置)"
- // @Param value query string true "开启状态。仅支持1(启用)或0(禁用)"
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /rule_state/save [post]
- func (c *DataOptimizeController) SetRuleState() {
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- err := obj.SetRuleStatus(c.GetString("rulecode"), c.GetString("value"))
- if err != nil {
- logger.Logger.Error(err)
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- c.Data["json"] = c.ApiOK("")
- }
- c.ServeJSON()
- }
- // 获取数据优化配置测点列表 godoc
- // @Summary 获取数据优化配置测点列表
- // @Description 获取数据优化配置测点列表
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Param optimizetype query string true "填充规则类型。invalid:无效数据填充,其返回格式样例:{"data":{"Tem1":{"attrname":"Tem1","mpname":"测点温度1","value":["-10","20"]}},"msg":"操作成功","success":true} deletion:缺点数据填充,其返回格式样例:{"data":[{"attrname":"Tem1","mpname":"测点温度1","value":[{"attrname":"Tem2","mpname":"温度2"},{"attrname":"Tem3","mpname":"温度3"}]}],"msg":"操作成功","success":true}"
- // @Param deviceid query string false "设备ID"
- // @Param modelid query string false "模型ID"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /list [get]
- func (c *DataOptimizeController) OptimizeList() {
- optimizetype := c.GetString("optimizetype")
- deviceid := c.GetString("deviceid", "0")
- modelid := c.GetString("modelid", "0")
- if deviceid == "0" && modelid == "0" {
- c.Data["json"] = c.ApiError("设备ID和模型ID不能同时为空")
- c.ServeJSON()
- return
- }
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- list := []orm.Params{}
- var err error
- if optimizetype == "invalid" {
- list, err = obj.InvalidOptimizeCnfList()
- } else if optimizetype == "deletion" {
- list, err = obj.DeletionOptimizeCnfList()
- } else {
- err = errors.New("无效的数据优化类型")
- }
- deviceid32, _ := strconv.Atoi(deviceid)
- modelid64, _ := strconv.Atoi(modelid)
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- allmplist := []orm.Params{}
- if deviceid32 == 0 {
- //获取模型定义
- modSrv := new(service.ModelService)
- modattrlist := modSrv.GetModelAttrList(int64(modelid64))
- for _, tmpRow := range modattrlist {
- tmpRow2 := tmpRow.(map[string]interface{})
- allmplist = append(allmplist, orm.Params{
- "attrname": tools.IsEmpty(tmpRow2["attr_name"]),
- "mpname": tools.IsEmpty(tmpRow2["attr_name"]),
- })
- }
- } else {
- deviceObject := new(service.DeviceService)
- //获取设备测点
- allmplist, _, err = deviceObject.DeviceMpList(int32(deviceid32), 1, 1000, int64(modelid64))
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- c.ServeJSON()
- return
- }
- }
- cnfMap := map[string]orm.Params{}
- for _, row := range list {
- cnfMap[fmt.Sprintf("%v%v", row["model_id"], row["device_id"])] = row
- }
- if len(list) > 0 && "0" != deviceid && "0" != modelid {
- row := cnfMap[modelid+deviceid]
- cnfvalue := tools.IsEmpty(row["fill_cnf"])
- if cnfvalue != "" && optimizetype == "invalid" {
- cnfList := map[string]interface{}{}
- err = json.Unmarshal([]byte(cnfvalue), &cnfList)
- if err != nil {
- logger.Logger.Error(err)
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- //无效数据规则组装
- resultMap := map[string]interface{}{}
- for _, mpitem := range allmplist {
- mpAttrname := tools.IsEmpty(mpitem["attrname"])
- if v, h := cnfList[mpAttrname]; h {
- v.(map[string]interface{})["mpname"] = tools.IsEmpty(mpitem["mpname"])
- resultMap[mpAttrname] = v
- } else {
- resultMap[mpAttrname] = map[string]interface{}{
- "attrname": mpAttrname,
- "mpname": tools.IsEmpty(mpitem["mpname"]),
- "value": []string{},
- }
- }
- }
- c.Data["json"] = c.ApiOK(resultMap)
- }
- } else if cnfvalue != "" && optimizetype == "deletion" {
- cnfList := []map[string]interface{}{}
- err = json.Unmarshal([]byte(cnfvalue), &cnfList)
- if err != nil {
- logger.Logger.Error(err, cnfvalue)
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- deviceMpList := map[string]interface{}{}
- for _, row := range allmplist {
- attrname := tools.IsEmpty(row["attrname"])
- deviceMpList[attrname] = map[string]interface{}{
- "value": []string{},
- "attrname": attrname,
- "mpname": tools.IsEmpty(row["mpname"]),
- }
- }
- //缺点规则组装
- for _, mpitem := range cnfList {
- mpAttrname := tools.IsEmpty(mpitem["attrname"])
- if d1, h := deviceMpList[mpAttrname]; h {
- mpitem["mpname"] = tools.IsEmpty(d1.(map[string]interface{})["mpname"])
- filllist := mpitem["value"].([]interface{})
- for i2, tmpFillMp := range filllist {
- tmpFillMp2 := tmpFillMp.(map[string]interface{})
- attrname2 := tools.IsEmpty(tmpFillMp2["attrname"])
- tmpFillMp2["mpname"] = tools.IsEmpty(deviceMpList[attrname2].(map[string]interface{})["mpname"])
- filllist[i2] = tmpFillMp2
- }
- deviceMpList[mpAttrname] = mpitem
- }
- }
- fillResultList := []interface{}{}
- for _, tmpRow := range deviceMpList {
- fillResultList = append(fillResultList, tmpRow)
- }
- deviceMpList = nil
- c.Data["json"] = c.ApiOK(fillResultList)
- }
- }
- c.ServeJSON()
- return
- }
- //判断是否有模型规则设置,有则采用模型的测点规则设置
- if len(list) > 0 {
- row := cnfMap[modelid+"0"]
- if row != nil {
- cnfvalue := tools.IsEmpty(row["fill_cnf"])
- if optimizetype == "invalid" {
- cnfList := map[string]interface{}{}
- err = json.Unmarshal([]byte(cnfvalue), &cnfList)
- if err != nil {
- logger.Logger.Error(err)
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- //无效数据规则组装
- resultMap := map[string]interface{}{}
- for _, mpitem := range allmplist {
- mpAttrname := tools.IsEmpty(mpitem["attrname"])
- if v, h := cnfList[mpAttrname]; h {
- v.(map[string]interface{})["mpname"] = tools.IsEmpty(mpitem["mpname"])
- resultMap[mpAttrname] = v
- } else {
- resultMap[mpAttrname] = map[string]interface{}{
- "attrname": mpAttrname,
- "mpname": tools.IsEmpty(mpitem["mpname"]),
- "value": []string{},
- }
- }
- }
- c.Data["json"] = c.ApiOK(resultMap)
- }
- } else if optimizetype == "deletion" {
- cnfList := []map[string]interface{}{}
- err = json.Unmarshal([]byte(cnfvalue), &cnfList)
- if err != nil {
- logger.Logger.Error(err)
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- deviceMpList := map[string]interface{}{}
- for _, row := range allmplist {
- attrname := tools.IsEmpty(row["attrname"])
- deviceMpList[attrname] = map[string]interface{}{
- "value": []string{},
- "attrname": attrname,
- "mpname": tools.IsEmpty(row["mpname"]),
- }
- }
- //缺点规则组装
- for _, mpitem := range cnfList {
- mpAttrname := tools.IsEmpty(mpitem["attrname"])
- if d1, h := deviceMpList[mpAttrname]; h {
- mpitem["mpname"] = tools.IsEmpty(d1.(map[string]interface{})["mpname"])
- filllist := mpitem["value"].([]interface{})
- for i2, tmpFillMp := range filllist {
- tmpFillMp2 := tmpFillMp.(map[string]interface{})
- attrname2 := tools.IsEmpty(tmpFillMp2["attrname"])
- mpname := tools.IsEmpty(deviceMpList[attrname2].(map[string]interface{})["mpname"])
- tmpFillMp2["mpname"] = mpname
- filllist[i2] = tmpFillMp2
- }
- deviceMpList[mpAttrname] = mpitem
- }
- }
- fillResultList := []interface{}{}
- for _, tmpRow := range deviceMpList {
- fillResultList = append(fillResultList, tmpRow)
- }
- deviceMpList = nil
- c.Data["json"] = c.ApiOK(fillResultList)
- }
- }
- c.ServeJSON()
- return
- }
- }
- //未进行设置,采用模型或设备的测点
- if optimizetype == "invalid" {
- mpcnflist := map[string]interface{}{}
- for _, r := range allmplist {
- mpAttrname := tools.IsEmpty(r["attrname"])
- mpcnflist[mpAttrname] = map[string]interface{}{"attrname": mpAttrname, "mpname": tools.IsEmpty(r["mpname"]), "value": []string{"", ""}} //默认无效范围为未设置
- }
- c.Data["json"] = c.ApiOK(mpcnflist)
- } else if optimizetype == "deletion" {
- mpcnflist := []map[string]interface{}{}
- for _, r := range allmplist {
- mpAttrname := tools.IsEmpty(r["attrname"])
- mpcnflist = append(mpcnflist, map[string]interface{}{"attrname": mpAttrname, "mpname": tools.IsEmpty(r["mpname"]), "value": []interface{}{}}) //默认为未设置
- }
- c.Data["json"] = c.ApiOK(mpcnflist)
- }
- c.ServeJSON()
- return
- }
- c.ServeJSON()
- }
- // 编辑(添加或修改)算法优化
- // @Summary 添加或编辑数据优化规则
- // @Description 保存添加或编辑测点数据优化规则的提交数据
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Param optimizetype query int64 true "填充规则类型。invalid:无效数据填充,其cnf参数值格式样例:{"Tem1":{"attrname":"Tem1","value":["-10","55"]}} deletion:缺点数据填充,其cnf参数格式样例:[{"attrname":"Tem1","value":[{"attrname":"Tem2"},{"attrname":"Tem3"}]}]"
- // @Param cnf query string false "填充配置内容。JSON格式的序列化串."
- // @Param deviceid query string false "设备ID"
- // @Param modelid query string false "模型ID"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /edit [post]
- func (c *DataOptimizeController) EditOptimize() {
- optimizetype := c.GetString("optimizetype")
- deviceid, _ := c.GetInt32("deviceid")
- modelid, _ := c.GetInt64("modelid")
- cnf := c.GetString("cnf")
- if cnf == "" {
- c.Data["json"] = c.ApiError("配置内容不能为空")
- c.ServeJSON()
- return
- }
- if optimizetype == "invalid" {
- testObj := map[string]interface{}{}
- err := json.Unmarshal([]byte(cnf), &testObj)
- if err != nil {
- logger.Logger.Error(err, cnf)
- c.Data["json"] = c.ApiError("配置内容格式不正确")
- c.ServeJSON()
- return
- }
- } else {
- testObj := []interface{}{}
- err := json.Unmarshal([]byte(cnf), &testObj)
- if err != nil {
- logger.Logger.Error(err, cnf)
- c.Data["json"] = c.ApiError("配置内容格式不正确")
- c.ServeJSON()
- return
- }
- }
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- err := obj.EditOptimize(optimizetype, modelid, deviceid, cnf)
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- c.Data["json"] = c.ApiOK("编辑数据优化配置成功")
- }
- c.ServeJSON()
- }
- // 删除指定设备的无效数据优化规则
- // @Summary 删除指定设备的无效数据优化规则
- // @Description 删除指定设备的无效数据优化规则
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Param deviceid query int64 true "设备ID"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /delete/invalid_rule [post]
- func (c *DataOptimizeController) DeleteInvalidOptimize() {
- deviceid, _ := c.GetInt32("deviceid")
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- err := obj.DeleteOptimize("invalid", deviceid)
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- c.Data["json"] = c.ApiOK("")
- }
- c.ServeJSON()
- }
- // 删除指定设备的缺点数据优化规则
- // @Summary 删除指定设备的缺点数据优化规则
- // @Description 删除指定设备的缺点数据优化规则
- // @Tags api
- // @Accept x-www-form-urlencoded
- // @Produce json
- // @Param deviceid query int64 true "设备ID"
- // @Success 200 {object} ApiOK|ApiError 服务访问成功
- // @Failure 401 status 认证未通过,一般是未指定token或token已失效
- // @Failure 500 status 服务器|后台发生错误
- // @router /delete/deletion_rule [post]
- func (c *DataOptimizeController) DeleteDeletionOptimize() {
- deviceid, _ := c.GetInt32("deviceid")
- obj := new(service.DataoptimizeService)
- obj.UserInfo = c.GetCurrentUserInfo_rt()
- err := obj.DeleteOptimize("deletion", deviceid)
- if err != nil {
- c.Data["json"] = c.ApiError(err.Error())
- } else {
- c.Data["json"] = c.ApiOK("")
- }
- c.ServeJSON()
- }
|