dataOptimizeController.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "rtzh_elec_temperature/logger"
  7. "rtzh_elec_temperature/rtelec_app_public_lib/service"
  8. "rtzh_elec_temperature/tools"
  9. "strconv"
  10. "github.com/astaxie/beego/orm"
  11. )
  12. //数据优化相关服务
  13. type DataOptimizeController struct {
  14. BaseController
  15. }
  16. // 获取算法优化策略开启状态 godoc
  17. // @Summary 获取算法优化策略开启状态
  18. // @Description 获取算法优化策略开启状态。包括以下状态字典:deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示),以上状态字典值均为1或者0.
  19. // @Tags api
  20. // @Accept x-www-form-urlencoded
  21. // @Produce json
  22. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  23. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  24. // @Failure 500 status 服务器|后台发生错误
  25. // @router /rule_state/list [get]
  26. func (c *DataOptimizeController) GetRuleState() {
  27. obj := new(service.DataoptimizeService)
  28. obj.UserInfo = c.GetCurrentUserInfo_rt()
  29. list := obj.GetRuleStatus()
  30. c.Data["json"] = c.ApiOK(list)
  31. c.ServeJSON()
  32. }
  33. // 设置算法优化策略开启状态 godoc
  34. // @Summary 设置保存算法优化策略开启状态
  35. // @Description 设置保存算法优化策略开启状态。包括以下状态字典:deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示),以上状态字典值均为1或者0.
  36. // @Tags api
  37. // @Accept x-www-form-urlencoded
  38. // @Produce json
  39. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  40. // @Param rulecode query string true "规则代码。deletion_fill_rule(数据缺点填充规则)、deletion_fill_specifypoint(指定测点填充开启状态)、deletion_fill_randompoint(相邻测点填充开启状态)、invalid_fill_rule(无效数据填充规则)、invalid_show_rule(无效数据显示配置)"
  41. // @Param value query string true "开启状态。仅支持1(启用)或0(禁用)"
  42. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  43. // @Failure 500 status 服务器|后台发生错误
  44. // @router /rule_state/save [post]
  45. func (c *DataOptimizeController) SetRuleState() {
  46. obj := new(service.DataoptimizeService)
  47. obj.UserInfo = c.GetCurrentUserInfo_rt()
  48. err := obj.SetRuleStatus(c.GetString("rulecode"), c.GetString("value"))
  49. if err != nil {
  50. logger.Logger.Error(err)
  51. c.Data["json"] = c.ApiError(err.Error())
  52. } else {
  53. c.Data["json"] = c.ApiOK("")
  54. }
  55. c.ServeJSON()
  56. }
  57. // 获取数据优化配置测点列表 godoc
  58. // @Summary 获取数据优化配置测点列表
  59. // @Description 获取数据优化配置测点列表
  60. // @Tags api
  61. // @Accept x-www-form-urlencoded
  62. // @Produce json
  63. // @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}"
  64. // @Param deviceid query string false "设备ID"
  65. // @Param modelid query string false "模型ID"
  66. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  67. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  68. // @Failure 500 status 服务器|后台发生错误
  69. // @router /list [get]
  70. func (c *DataOptimizeController) OptimizeList() {
  71. optimizetype := c.GetString("optimizetype")
  72. deviceid := c.GetString("deviceid", "0")
  73. modelid := c.GetString("modelid", "0")
  74. if deviceid == "0" && modelid == "0" {
  75. c.Data["json"] = c.ApiError("设备ID和模型ID不能同时为空")
  76. c.ServeJSON()
  77. return
  78. }
  79. obj := new(service.DataoptimizeService)
  80. obj.UserInfo = c.GetCurrentUserInfo_rt()
  81. list := []orm.Params{}
  82. var err error
  83. if optimizetype == "invalid" {
  84. list, err = obj.InvalidOptimizeCnfList()
  85. } else if optimizetype == "deletion" {
  86. list, err = obj.DeletionOptimizeCnfList()
  87. } else {
  88. err = errors.New("无效的数据优化类型")
  89. }
  90. deviceid32, _ := strconv.Atoi(deviceid)
  91. modelid64, _ := strconv.Atoi(modelid)
  92. if err != nil {
  93. c.Data["json"] = c.ApiError(err.Error())
  94. } else {
  95. allmplist := []orm.Params{}
  96. if deviceid32 == 0 {
  97. //获取模型定义
  98. modSrv := new(service.ModelService)
  99. modattrlist := modSrv.GetModelAttrList(int64(modelid64))
  100. for _, tmpRow := range modattrlist {
  101. tmpRow2 := tmpRow.(map[string]interface{})
  102. allmplist = append(allmplist, orm.Params{
  103. "attrname": tools.IsEmpty(tmpRow2["attr_name"]),
  104. "mpname": tools.IsEmpty(tmpRow2["attr_name"]),
  105. })
  106. }
  107. } else {
  108. deviceObject := new(service.DeviceService)
  109. //获取设备测点
  110. allmplist, _, err = deviceObject.DeviceMpList(int32(deviceid32), 1, 1000, int64(modelid64))
  111. if err != nil {
  112. c.Data["json"] = c.ApiError(err.Error())
  113. c.ServeJSON()
  114. return
  115. }
  116. }
  117. cnfMap := map[string]orm.Params{}
  118. for _, row := range list {
  119. cnfMap[fmt.Sprintf("%v%v", row["model_id"], row["device_id"])] = row
  120. }
  121. if len(list) > 0 && "0" != deviceid && "0" != modelid {
  122. row := cnfMap[modelid+deviceid]
  123. cnfvalue := tools.IsEmpty(row["fill_cnf"])
  124. if cnfvalue != "" && optimizetype == "invalid" {
  125. cnfList := map[string]interface{}{}
  126. err = json.Unmarshal([]byte(cnfvalue), &cnfList)
  127. if err != nil {
  128. logger.Logger.Error(err)
  129. c.Data["json"] = c.ApiError(err.Error())
  130. } else {
  131. //无效数据规则组装
  132. resultMap := map[string]interface{}{}
  133. for _, mpitem := range allmplist {
  134. mpAttrname := tools.IsEmpty(mpitem["attrname"])
  135. if v, h := cnfList[mpAttrname]; h {
  136. v.(map[string]interface{})["mpname"] = tools.IsEmpty(mpitem["mpname"])
  137. resultMap[mpAttrname] = v
  138. } else {
  139. resultMap[mpAttrname] = map[string]interface{}{
  140. "attrname": mpAttrname,
  141. "mpname": tools.IsEmpty(mpitem["mpname"]),
  142. "value": []string{},
  143. }
  144. }
  145. }
  146. c.Data["json"] = c.ApiOK(resultMap)
  147. }
  148. } else if cnfvalue != "" && optimizetype == "deletion" {
  149. cnfList := []map[string]interface{}{}
  150. err = json.Unmarshal([]byte(cnfvalue), &cnfList)
  151. if err != nil {
  152. logger.Logger.Error(err, cnfvalue)
  153. c.Data["json"] = c.ApiError(err.Error())
  154. } else {
  155. deviceMpList := map[string]interface{}{}
  156. for _, row := range allmplist {
  157. attrname := tools.IsEmpty(row["attrname"])
  158. deviceMpList[attrname] = map[string]interface{}{
  159. "value": []string{},
  160. "attrname": attrname,
  161. "mpname": tools.IsEmpty(row["mpname"]),
  162. }
  163. }
  164. //缺点规则组装
  165. for _, mpitem := range cnfList {
  166. mpAttrname := tools.IsEmpty(mpitem["attrname"])
  167. if d1, h := deviceMpList[mpAttrname]; h {
  168. mpitem["mpname"] = tools.IsEmpty(d1.(map[string]interface{})["mpname"])
  169. filllist := mpitem["value"].([]interface{})
  170. for i2, tmpFillMp := range filllist {
  171. tmpFillMp2 := tmpFillMp.(map[string]interface{})
  172. attrname2 := tools.IsEmpty(tmpFillMp2["attrname"])
  173. tmpFillMp2["mpname"] = tools.IsEmpty(deviceMpList[attrname2].(map[string]interface{})["mpname"])
  174. filllist[i2] = tmpFillMp2
  175. }
  176. deviceMpList[mpAttrname] = mpitem
  177. }
  178. }
  179. fillResultList := []interface{}{}
  180. for _, tmpRow := range deviceMpList {
  181. fillResultList = append(fillResultList, tmpRow)
  182. }
  183. deviceMpList = nil
  184. c.Data["json"] = c.ApiOK(fillResultList)
  185. }
  186. }
  187. c.ServeJSON()
  188. return
  189. }
  190. //判断是否有模型规则设置,有则采用模型的测点规则设置
  191. if len(list) > 0 {
  192. row := cnfMap[modelid+"0"]
  193. if row != nil {
  194. cnfvalue := tools.IsEmpty(row["fill_cnf"])
  195. if optimizetype == "invalid" {
  196. cnfList := map[string]interface{}{}
  197. err = json.Unmarshal([]byte(cnfvalue), &cnfList)
  198. if err != nil {
  199. logger.Logger.Error(err)
  200. c.Data["json"] = c.ApiError(err.Error())
  201. } else {
  202. //无效数据规则组装
  203. resultMap := map[string]interface{}{}
  204. for _, mpitem := range allmplist {
  205. mpAttrname := tools.IsEmpty(mpitem["attrname"])
  206. if v, h := cnfList[mpAttrname]; h {
  207. v.(map[string]interface{})["mpname"] = tools.IsEmpty(mpitem["mpname"])
  208. resultMap[mpAttrname] = v
  209. } else {
  210. resultMap[mpAttrname] = map[string]interface{}{
  211. "attrname": mpAttrname,
  212. "mpname": tools.IsEmpty(mpitem["mpname"]),
  213. "value": []string{},
  214. }
  215. }
  216. }
  217. c.Data["json"] = c.ApiOK(resultMap)
  218. }
  219. } else if optimizetype == "deletion" {
  220. cnfList := []map[string]interface{}{}
  221. err = json.Unmarshal([]byte(cnfvalue), &cnfList)
  222. if err != nil {
  223. logger.Logger.Error(err)
  224. c.Data["json"] = c.ApiError(err.Error())
  225. } else {
  226. deviceMpList := map[string]interface{}{}
  227. for _, row := range allmplist {
  228. attrname := tools.IsEmpty(row["attrname"])
  229. deviceMpList[attrname] = map[string]interface{}{
  230. "value": []string{},
  231. "attrname": attrname,
  232. "mpname": tools.IsEmpty(row["mpname"]),
  233. }
  234. }
  235. //缺点规则组装
  236. for _, mpitem := range cnfList {
  237. mpAttrname := tools.IsEmpty(mpitem["attrname"])
  238. if d1, h := deviceMpList[mpAttrname]; h {
  239. mpitem["mpname"] = tools.IsEmpty(d1.(map[string]interface{})["mpname"])
  240. filllist := mpitem["value"].([]interface{})
  241. for i2, tmpFillMp := range filllist {
  242. tmpFillMp2 := tmpFillMp.(map[string]interface{})
  243. attrname2 := tools.IsEmpty(tmpFillMp2["attrname"])
  244. mpname := tools.IsEmpty(deviceMpList[attrname2].(map[string]interface{})["mpname"])
  245. tmpFillMp2["mpname"] = mpname
  246. filllist[i2] = tmpFillMp2
  247. }
  248. deviceMpList[mpAttrname] = mpitem
  249. }
  250. }
  251. fillResultList := []interface{}{}
  252. for _, tmpRow := range deviceMpList {
  253. fillResultList = append(fillResultList, tmpRow)
  254. }
  255. deviceMpList = nil
  256. c.Data["json"] = c.ApiOK(fillResultList)
  257. }
  258. }
  259. c.ServeJSON()
  260. return
  261. }
  262. }
  263. //未进行设置,采用模型或设备的测点
  264. if optimizetype == "invalid" {
  265. mpcnflist := map[string]interface{}{}
  266. for _, r := range allmplist {
  267. mpAttrname := tools.IsEmpty(r["attrname"])
  268. mpcnflist[mpAttrname] = map[string]interface{}{"attrname": mpAttrname, "mpname": tools.IsEmpty(r["mpname"]), "value": []string{"", ""}} //默认无效范围为未设置
  269. }
  270. c.Data["json"] = c.ApiOK(mpcnflist)
  271. } else if optimizetype == "deletion" {
  272. mpcnflist := []map[string]interface{}{}
  273. for _, r := range allmplist {
  274. mpAttrname := tools.IsEmpty(r["attrname"])
  275. mpcnflist = append(mpcnflist, map[string]interface{}{"attrname": mpAttrname, "mpname": tools.IsEmpty(r["mpname"]), "value": []interface{}{}}) //默认为未设置
  276. }
  277. c.Data["json"] = c.ApiOK(mpcnflist)
  278. }
  279. c.ServeJSON()
  280. return
  281. }
  282. c.ServeJSON()
  283. }
  284. // 编辑(添加或修改)算法优化
  285. // @Summary 添加或编辑数据优化规则
  286. // @Description 保存添加或编辑测点数据优化规则的提交数据
  287. // @Tags api
  288. // @Accept x-www-form-urlencoded
  289. // @Produce json
  290. // @Param optimizetype query int64 true "填充规则类型。invalid:无效数据填充,其cnf参数值格式样例:{"Tem1":{"attrname":"Tem1","value":["-10","55"]}} deletion:缺点数据填充,其cnf参数格式样例:[{"attrname":"Tem1","value":[{"attrname":"Tem2"},{"attrname":"Tem3"}]}]"
  291. // @Param cnf query string false "填充配置内容。JSON格式的序列化串."
  292. // @Param deviceid query string false "设备ID"
  293. // @Param modelid query string false "模型ID"
  294. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  295. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  296. // @Failure 500 status 服务器|后台发生错误
  297. // @router /edit [post]
  298. func (c *DataOptimizeController) EditOptimize() {
  299. optimizetype := c.GetString("optimizetype")
  300. deviceid, _ := c.GetInt32("deviceid")
  301. modelid, _ := c.GetInt64("modelid")
  302. cnf := c.GetString("cnf")
  303. if cnf == "" {
  304. c.Data["json"] = c.ApiError("配置内容不能为空")
  305. c.ServeJSON()
  306. return
  307. }
  308. if optimizetype == "invalid" {
  309. testObj := map[string]interface{}{}
  310. err := json.Unmarshal([]byte(cnf), &testObj)
  311. if err != nil {
  312. logger.Logger.Error(err, cnf)
  313. c.Data["json"] = c.ApiError("配置内容格式不正确")
  314. c.ServeJSON()
  315. return
  316. }
  317. } else {
  318. testObj := []interface{}{}
  319. err := json.Unmarshal([]byte(cnf), &testObj)
  320. if err != nil {
  321. logger.Logger.Error(err, cnf)
  322. c.Data["json"] = c.ApiError("配置内容格式不正确")
  323. c.ServeJSON()
  324. return
  325. }
  326. }
  327. obj := new(service.DataoptimizeService)
  328. obj.UserInfo = c.GetCurrentUserInfo_rt()
  329. err := obj.EditOptimize(optimizetype, modelid, deviceid, cnf)
  330. if err != nil {
  331. c.Data["json"] = c.ApiError(err.Error())
  332. } else {
  333. c.Data["json"] = c.ApiOK("编辑数据优化配置成功")
  334. }
  335. c.ServeJSON()
  336. }
  337. // 删除指定设备的无效数据优化规则
  338. // @Summary 删除指定设备的无效数据优化规则
  339. // @Description 删除指定设备的无效数据优化规则
  340. // @Tags api
  341. // @Accept x-www-form-urlencoded
  342. // @Produce json
  343. // @Param deviceid query int64 true "设备ID"
  344. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  345. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  346. // @Failure 500 status 服务器|后台发生错误
  347. // @router /delete/invalid_rule [post]
  348. func (c *DataOptimizeController) DeleteInvalidOptimize() {
  349. deviceid, _ := c.GetInt32("deviceid")
  350. obj := new(service.DataoptimizeService)
  351. obj.UserInfo = c.GetCurrentUserInfo_rt()
  352. err := obj.DeleteOptimize("invalid", deviceid)
  353. if err != nil {
  354. c.Data["json"] = c.ApiError(err.Error())
  355. } else {
  356. c.Data["json"] = c.ApiOK("")
  357. }
  358. c.ServeJSON()
  359. }
  360. // 删除指定设备的缺点数据优化规则
  361. // @Summary 删除指定设备的缺点数据优化规则
  362. // @Description 删除指定设备的缺点数据优化规则
  363. // @Tags api
  364. // @Accept x-www-form-urlencoded
  365. // @Produce json
  366. // @Param deviceid query int64 true "设备ID"
  367. // @Success 200 {object} ApiOK|ApiError 服务访问成功
  368. // @Failure 401 status 认证未通过,一般是未指定token或token已失效
  369. // @Failure 500 status 服务器|后台发生错误
  370. // @router /delete/deletion_rule [post]
  371. func (c *DataOptimizeController) DeleteDeletionOptimize() {
  372. deviceid, _ := c.GetInt32("deviceid")
  373. obj := new(service.DataoptimizeService)
  374. obj.UserInfo = c.GetCurrentUserInfo_rt()
  375. err := obj.DeleteOptimize("deletion", deviceid)
  376. if err != nil {
  377. c.Data["json"] = c.ApiError(err.Error())
  378. } else {
  379. c.Data["json"] = c.ApiOK("")
  380. }
  381. c.ServeJSON()
  382. }