base_from_python.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_index_lib/logic"
  5. "eta_gn/eta_index_lib/models"
  6. "eta_gn/eta_index_lib/services"
  7. "eta_gn/eta_index_lib/utils"
  8. "fmt"
  9. "net/url"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. type PythonController struct {
  15. BaseAuthController
  16. }
  17. // @router /exec [post]
  18. func (this *PythonController) ExcePython() {
  19. br := new(models.BaseResponse).Init()
  20. defer func() {
  21. this.Data["json"] = br
  22. this.ServeJSON()
  23. }()
  24. var req models.ExecPythonEdbReq
  25. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  26. if err != nil {
  27. br.Msg = "参数解析异常!"
  28. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  29. return
  30. }
  31. if req.PythonCode == "" {
  32. br.Msg = "请填写python代码"
  33. return
  34. }
  35. req.PythonCode, err = url.QueryUnescape(req.PythonCode)
  36. if err != nil {
  37. br.Msg = "python代码解析失败"
  38. return
  39. }
  40. edbData, err, errMsg := services.ExecPythonCode("test", req.PythonCode)
  41. if err != nil {
  42. br.Msg = "获取数据失败"
  43. br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
  44. if errMsg != "" {
  45. br.Msg = errMsg
  46. }
  47. return
  48. }
  49. br.Ret = 200
  50. br.Success = true
  51. br.Msg = "保存成功"
  52. br.Data = edbData
  53. br.IsAddLog = true
  54. }
  55. // @router /add [post]
  56. func (this *PythonController) Add() {
  57. br := new(models.BaseResponse).Init()
  58. defer func() {
  59. this.Data["json"] = br
  60. this.ServeJSON()
  61. }()
  62. var req models.AddPythonEdbReq
  63. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  64. if err != nil {
  65. br.Msg = "参数解析异常!"
  66. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  67. return
  68. }
  69. req.EdbName = strings.TrimSpace(req.EdbName)
  70. if req.EdbName == "" {
  71. br.Msg = "指标名称不能为空"
  72. return
  73. }
  74. if req.Frequency == "" {
  75. br.Msg = "频率不能为空"
  76. return
  77. }
  78. if req.Unit == "" {
  79. br.Msg = "单位不能为空"
  80. return
  81. }
  82. if req.ClassifyId <= 0 {
  83. br.Msg = "请选择分类"
  84. return
  85. }
  86. if req.PythonCode == "" {
  87. br.Msg = "请填写python代码"
  88. return
  89. }
  90. redisKey := fmt.Sprint("edb_info:python:add:", utils.DATA_SOURCE_PYTHON, ":", req.EdbName)
  91. isExist := utils.Rc.IsExist(redisKey)
  92. if isExist {
  93. br.Msg = "指标正在处理,请勿重复提交"
  94. return
  95. } else {
  96. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  97. defer func() {
  98. utils.Rc.Delete(redisKey)
  99. }()
  100. }
  101. req.PythonCode, err = url.QueryUnescape(req.PythonCode)
  102. if err != nil {
  103. br.Msg = "python代码解析失败"
  104. return
  105. }
  106. edbData, err, errMsg := services.ExecPythonCode(utils.MD5(req.EdbName), req.PythonCode)
  107. if err != nil {
  108. br.Msg = "获取数据失败"
  109. br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
  110. if errMsg != "" {
  111. br.ErrMsg = errMsg
  112. }
  113. return
  114. }
  115. var condition string
  116. var pars []interface{}
  117. condition += " AND edb_name=? "
  118. pars = append(pars, req.EdbName)
  119. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  120. if err != nil {
  121. br.Msg = "判断指标名称是否存在失败"
  122. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  123. return
  124. }
  125. if count > 0 {
  126. br.Msg = "指标名称已存在,请重新填写"
  127. br.ErrMsg = "指标名称已存在,请重新填写"
  128. return
  129. }
  130. edbCode, err := utils.GenerateEdbCode(1, "")
  131. if err != nil {
  132. br.Msg = "指标生成失败"
  133. br.ErrMsg = "指标编码生成失败,Err:" + err.Error()
  134. return
  135. }
  136. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  137. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  138. edbInfo := &models.EdbInfo{
  139. Source: utils.DATA_SOURCE_PYTHON,
  140. SourceName: "代码运算",
  141. EdbCode: edbCode,
  142. EdbName: req.EdbName,
  143. EdbNameSource: req.EdbName,
  144. Frequency: req.Frequency,
  145. Unit: req.Unit,
  146. ClassifyId: req.ClassifyId,
  147. SysUserId: req.AdminId,
  148. SysUserRealName: req.AdminName,
  149. CreateTime: time.Now(),
  150. ModifyTime: time.Now(),
  151. UniqueCode: uniqueCode,
  152. EdbType: 2,
  153. Sort: models.GetAddEdbMaxSortByClassifyId(req.ClassifyId, utils.EDB_INFO_TYPE),
  154. }
  155. edbInfoId, err := models.AddEdbInfo(edbInfo)
  156. if err != nil {
  157. br.Msg = "生成python运算指标失败"
  158. br.Msg = "生成python运算指标失败,AddEdbInfo Err:" + err.Error()
  159. return
  160. }
  161. edbInfo.EdbInfoId = int(edbInfoId)
  162. {
  163. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  164. if err != nil {
  165. br.Msg = "保存失败"
  166. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  167. return
  168. }
  169. if len(edbNameList) >= 2 {
  170. for _, v := range edbNameList {
  171. edbName := v.EdbName + "(" + v.SourceName + ")"
  172. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  173. if err != nil {
  174. br.Msg = "保存失败"
  175. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  176. return
  177. }
  178. }
  179. }
  180. }
  181. edbPythonCode := &models.EdbPythonCode{
  182. EdbInfoId: int(edbInfoId),
  183. EdbCode: edbInfo.EdbCode,
  184. PythonCode: req.PythonCode,
  185. ModifyTime: time.Now(),
  186. CreateTime: time.Now(),
  187. }
  188. _, err = models.AddEdbPythonCode(edbPythonCode)
  189. if err != nil {
  190. br.Msg = "生成python运算指标失败"
  191. br.Msg = "生成python运算指标失败,存储python代码失败,AddEdbPythonCode Err:" + err.Error()
  192. return
  193. }
  194. edbInfoList := models.AnalysisPythonCode(req.PythonCode, req.EdbName)
  195. err = models.AddPythonEdb(edbInfo, edbData, edbInfoList)
  196. if err != nil {
  197. br.Msg = "生成python指标失败"
  198. br.Msg = "生成python指标失败,AddPythonEdb Err:" + err.Error()
  199. return
  200. }
  201. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  202. if err != nil {
  203. br.Msg = errMsg
  204. br.ErrMsg = err.Error()
  205. return
  206. }
  207. resp := models.AddEdbInfoResp{
  208. EdbInfoId: int(edbInfoId),
  209. UniqueCode: uniqueCode,
  210. }
  211. br.Ret = 200
  212. br.Success = true
  213. br.Msg = "保存成功"
  214. br.Data = resp
  215. br.IsAddLog = true
  216. }
  217. // @router /edit [post]
  218. func (this *PythonController) Edit() {
  219. br := new(models.BaseResponse).Init()
  220. defer func() {
  221. this.Data["json"] = br
  222. this.ServeJSON()
  223. }()
  224. var req models.AddPythonEdbReq
  225. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  226. if err != nil {
  227. br.Msg = "参数解析异常!"
  228. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  229. return
  230. }
  231. req.EdbName = strings.TrimSpace(req.EdbName)
  232. if req.EdbInfoId <= 0 {
  233. br.Msg = "指标id不能为空"
  234. return
  235. }
  236. if req.EdbName == "" {
  237. br.Msg = "指标名称不能为空"
  238. return
  239. }
  240. if req.Frequency == "" {
  241. br.Msg = "频率不能为空"
  242. return
  243. }
  244. if req.Unit == "" {
  245. br.Msg = "单位不能为空"
  246. return
  247. }
  248. if req.ClassifyId <= 0 {
  249. br.Msg = "请选择分类"
  250. return
  251. }
  252. if req.PythonCode == "" {
  253. br.Msg = "请填写python代码"
  254. return
  255. }
  256. redisKey := fmt.Sprint("edb_info:python:edit:", utils.DATA_SOURCE_PYTHON, ":", req.EdbInfoId)
  257. isExist := utils.Rc.IsExist(redisKey)
  258. if isExist {
  259. br.Msg = "指标正在处理,请勿重复提交"
  260. return
  261. } else {
  262. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  263. defer func() {
  264. utils.Rc.Delete(redisKey)
  265. }()
  266. }
  267. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  268. if err != nil {
  269. br.Msg = "获取指标信息失败"
  270. br.ErrMsg = "获取指标信息失败,err:" + err.Error()
  271. return
  272. }
  273. req.PythonCode, err = url.QueryUnescape(req.PythonCode)
  274. if err != nil {
  275. br.Msg = "python代码解析失败"
  276. return
  277. }
  278. edbData, err, errMsg := services.ExecPythonCode(utils.MD5(req.EdbName), req.PythonCode)
  279. if err != nil {
  280. br.Msg = "执行python代码失败"
  281. br.ErrMsg = "执行python代码失败,err:" + err.Error()
  282. if errMsg != "" {
  283. br.ErrMsg = errMsg
  284. }
  285. return
  286. }
  287. {
  288. var condition string
  289. var pars []interface{}
  290. condition += " AND edb_name=? "
  291. pars = append(pars, req.EdbName)
  292. condition += " AND edb_info_id<>? "
  293. pars = append(pars, req.EdbInfoId)
  294. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  295. if err != nil {
  296. br.Msg = "判断指标名称是否存在失败"
  297. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  298. return
  299. }
  300. if count > 0 {
  301. br.Msg = "指标名称已存在,请重新填写"
  302. br.ErrMsg = "指标名称已存在,请重新填写"
  303. return
  304. }
  305. }
  306. edbInfo.EdbName = req.EdbName
  307. edbInfo.EdbNameSource = req.EdbName
  308. edbInfo.Unit = req.Unit
  309. edbInfo.ClassifyId = req.ClassifyId
  310. edbInfo.Frequency = req.Frequency
  311. err = edbInfo.Update([]string{"EdbName", "EdbNameSource", "Unit", "ClassifyId", "Frequency"})
  312. if err != nil {
  313. br.Msg = "修改python运算指标失败"
  314. br.Msg = "修改python运算指标失败,ModifyEdbInfo Err:" + err.Error()
  315. return
  316. }
  317. edbPythonCode, err := models.GetEdbPythonCodeById(edbInfo.EdbInfoId)
  318. edbPythonCode.PythonCode = req.PythonCode
  319. edbPythonCode.ModifyTime = time.Now()
  320. err = edbPythonCode.Update([]string{"PythonCode", "ModifyTime"})
  321. if err != nil {
  322. br.Msg = "修改python运算指标失败"
  323. br.Msg = "修改python运算指标失败,存储python代码失败,EditEdbPythonCode Err:" + err.Error()
  324. return
  325. }
  326. edbInfoList := models.AnalysisPythonCode(req.PythonCode, req.EdbName)
  327. err = models.EditEdbInfoCalculateMapping(edbInfo, edbInfoList)
  328. if err != nil {
  329. br.Msg = "修改python运算指标失败"
  330. br.Msg = "修改python运算指标失败,存储python代码失败,EditEdbPythonCode Err:" + err.Error()
  331. return
  332. }
  333. err = models.RefreshAllPythonEdb(edbInfo, edbData)
  334. if err != nil {
  335. br.Msg = "刷新python指标失败"
  336. br.Msg = "刷新python指标失败,EditPythonEdb Err:" + err.Error()
  337. return
  338. }
  339. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  340. if err != nil {
  341. br.Msg = errMsg
  342. br.ErrMsg = err.Error()
  343. return
  344. }
  345. go logic.UpdateEs(edbInfo.EdbInfoId)
  346. resp := models.AddEdbInfoResp{
  347. EdbInfoId: edbInfo.EdbInfoId,
  348. UniqueCode: edbInfo.UniqueCode,
  349. }
  350. br.Ret = 200
  351. br.Success = true
  352. br.Msg = "修改成功"
  353. br.Data = resp
  354. br.IsAddLog = true
  355. }