index.go 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414
  1. package ai_predict_model
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. aiPredictModel "eta/eta_api/models/ai_predict_model"
  7. "eta/eta_api/models/ai_predict_model/request"
  8. "eta/eta_api/models/ai_predict_model/response"
  9. "eta/eta_api/models/data_manage"
  10. dataSourceModel "eta/eta_api/models/data_source"
  11. "eta/eta_api/models/system"
  12. "eta/eta_api/services"
  13. "eta/eta_api/services/data"
  14. "eta/eta_api/services/elastic"
  15. "eta/eta_api/utils"
  16. "fmt"
  17. "os"
  18. "strconv"
  19. "strings"
  20. "time"
  21. "github.com/rdlucklib/rdluck_tools/paging"
  22. "github.com/tealeg/xlsx"
  23. )
  24. // AiPredictModelIndexController AI预测模型标的
  25. type AiPredictModelIndexController struct {
  26. controllers.BaseAuthController
  27. }
  28. // List
  29. // @Title 标的列表
  30. // @Description 标的列表
  31. // @Param PageSize query int true "每页数据条数"
  32. // @Param CurrentIndex query int true "当前页页码,从1开始"
  33. // @Param ClassifyId query int false "分类id"
  34. // @Param IndexId query int false "模型标的ID"
  35. // @Param Keyword query string false "搜索关键词"
  36. // @Success 200 {object} data_manage.ChartListResp
  37. // @router /index/list [get]
  38. func (this *AiPredictModelIndexController) List() {
  39. br := new(models.BaseResponse).Init()
  40. defer func() {
  41. this.Data["json"] = br
  42. this.ServeJSON()
  43. }()
  44. sysUser := this.SysUser
  45. if sysUser == nil {
  46. br.Msg = "请登录"
  47. br.ErrMsg = "请登录,SysUser Is Empty"
  48. br.Ret = 408
  49. return
  50. }
  51. pageSize, _ := this.GetInt("PageSize")
  52. currentIndex, _ := this.GetInt("CurrentIndex")
  53. classifyId, _ := this.GetInt("ClassifyId")
  54. indexId, _ := this.GetInt("IndexId")
  55. keyword := this.GetString("KeyWord")
  56. if keyword == "" {
  57. keyword = this.GetString("Keyword")
  58. }
  59. keyword = strings.TrimSpace(keyword)
  60. resp := new(aiPredictModel.AiPredictModelIndexPageListResp)
  61. // 分页
  62. var startSize int
  63. if pageSize <= 0 {
  64. pageSize = utils.PageSize20
  65. }
  66. if currentIndex <= 0 {
  67. currentIndex = 1
  68. }
  69. startSize = paging.StartIndex(currentIndex, pageSize)
  70. // 分类
  71. classifyIdName := make(map[int]string)
  72. {
  73. classifyOb := new(aiPredictModel.AiPredictModelClassify)
  74. list, e := classifyOb.GetItemsByCondition("", make([]interface{}, 0), []string{}, "")
  75. if e != nil {
  76. br.Msg = "获取失败"
  77. br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
  78. return
  79. }
  80. for _, v := range list {
  81. classifyIdName[v.AiPredictModelClassifyId] = v.ClassifyName
  82. }
  83. }
  84. // 筛选条件
  85. highlightMap := make(map[int]string)
  86. indexOb := new(aiPredictModel.AiPredictModelIndex)
  87. var cond string
  88. var pars []interface{}
  89. {
  90. if indexId > 0 {
  91. cond += fmt.Sprintf(" AND %s = ?", indexOb.Cols().PrimaryId)
  92. pars = append(pars, indexId)
  93. }
  94. if classifyId > 0 {
  95. cond += fmt.Sprintf(" AND %s = ?", indexOb.Cols().ClassifyId)
  96. pars = append(pars, classifyId)
  97. }
  98. //if keyword != "" {
  99. // cond += fmt.Sprintf(" AND %s LIKE ?", indexOb.Cols().IndexName)
  100. // pars = append(pars, fmt.Sprint("%", keyword, "%"))
  101. //}
  102. // 有关键词从es中搜索
  103. if keyword != "" {
  104. _, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_AI_PREDICT_MODEL, 0, []int{}, []int{}, []string{}, startSize, pageSize)
  105. if e != nil {
  106. br.Msg = "获取失败"
  107. br.ErrMsg = fmt.Sprintf("ES-搜索AI预测模型列表失败, %v", e)
  108. return
  109. }
  110. if len(list) == 0 {
  111. resp.List = make([]*aiPredictModel.AiPredictModelIndexItem, 0)
  112. br.Ret = 200
  113. br.Success = true
  114. br.Msg = "获取成功"
  115. br.Data = resp
  116. return
  117. }
  118. var ids []int
  119. for _, v := range list {
  120. ids = append(ids, v.PrimaryId)
  121. highlightMap[v.PrimaryId] = v.SearchText
  122. }
  123. cond += fmt.Sprintf(` AND %s IN (%s)`, indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
  124. pars = append(pars, ids)
  125. }
  126. }
  127. // 获取列表
  128. total, e := indexOb.GetCountByCondition(cond, pars)
  129. if e != nil {
  130. br.Msg = "获取失败"
  131. br.ErrMsg = fmt.Sprintf("获取标的总数失败, %v", e)
  132. return
  133. }
  134. list, e := indexOb.GetPageItemsByCondition(cond, pars, []string{}, "", startSize, pageSize)
  135. if e != nil {
  136. br.Msg = "获取失败"
  137. br.ErrMsg = fmt.Sprintf("获取分页列表失败, %v", e)
  138. return
  139. }
  140. pageList := make([]*aiPredictModel.AiPredictModelIndexItem, 0)
  141. for _, v := range list {
  142. t := v.Format2Item()
  143. t.ClassifyName = classifyIdName[v.ClassifyId]
  144. // 搜索高亮
  145. t.SearchText = v.IndexName
  146. s := highlightMap[v.AiPredictModelIndexId]
  147. if s != "" {
  148. t.SearchText = s
  149. }
  150. pageList = append(pageList, t)
  151. }
  152. page := paging.GetPaging(currentIndex, pageSize, total)
  153. resp.Paging = page
  154. resp.List = pageList
  155. br.Data = resp
  156. br.Ret = 200
  157. br.Success = true
  158. br.Msg = "获取成功"
  159. }
  160. // GetAll
  161. // @Title 获取标的全量数据
  162. // @Description 获取标的全量数据
  163. // @Param ClassifyId query int false "分类id"
  164. // @Param IndexId query int false "模型标的ID"
  165. // @Param Keyword query string false "搜索关键词"
  166. // @Success 200 {object} data_manage.ChartListResp
  167. // @router /index/all [get]
  168. func (this *AiPredictModelIndexController) GetAll() {
  169. br := new(models.BaseResponse).Init()
  170. defer func() {
  171. this.Data["json"] = br
  172. this.ServeJSON()
  173. }()
  174. sysUser := this.SysUser
  175. if sysUser == nil {
  176. br.Msg = "请登录"
  177. br.ErrMsg = "请登录,SysUser Is Empty"
  178. br.Ret = 408
  179. return
  180. }
  181. classifyId, _ := this.GetInt("ClassifyId")
  182. indexId, _ := this.GetInt("IndexId")
  183. keyword := this.GetString("KeyWord")
  184. if keyword == "" {
  185. keyword = this.GetString("Keyword")
  186. }
  187. keyword = strings.TrimSpace(keyword)
  188. resp := new(aiPredictModel.AiPredictModelIndexPageListResp)
  189. // 分类
  190. classifyIdName := make(map[int]string)
  191. {
  192. classifyOb := new(aiPredictModel.AiPredictModelClassify)
  193. list, e := classifyOb.GetItemsByCondition("", make([]interface{}, 0), []string{}, "")
  194. if e != nil {
  195. br.Msg = "获取失败"
  196. br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
  197. return
  198. }
  199. for _, v := range list {
  200. classifyIdName[v.AiPredictModelClassifyId] = v.ClassifyName
  201. }
  202. }
  203. // 筛选条件
  204. highlightMap := make(map[int]string)
  205. indexOb := new(aiPredictModel.AiPredictModelIndex)
  206. var cond string
  207. var pars []interface{}
  208. {
  209. if indexId > 0 {
  210. cond += fmt.Sprintf(" AND %s = ?", indexOb.Cols().PrimaryId)
  211. pars = append(pars, indexId)
  212. }
  213. if classifyId > 0 {
  214. cond += fmt.Sprintf(" AND %s = ?", indexOb.Cols().ClassifyId)
  215. pars = append(pars, classifyId)
  216. }
  217. // 有关键词从es中搜索
  218. if keyword != "" {
  219. // 使用scroll API获取所有匹配的数据
  220. scrollId, list, e := elastic.SearchDataSourceIndexWithScroll(utils.EsDataSourceIndexName, keyword, utils.DATA_SOURCE_AI_PREDICT_MODEL, 0, []int{}, []int{}, []string{}, 1000)
  221. if e != nil {
  222. br.Msg = "获取失败"
  223. br.ErrMsg = fmt.Sprintf("ES-搜索AI预测模型列表失败, %v", e)
  224. return
  225. }
  226. // 如果scrollId不为空,说明还有更多数据,继续获取
  227. for scrollId != "" {
  228. nextScrollId, nextList, e := elastic.ScrollDataSourceIndex(utils.EsDataSourceIndexName, scrollId)
  229. if e != nil {
  230. br.Msg = "获取失败"
  231. br.ErrMsg = fmt.Sprintf("ES-获取更多数据失败, %v", e)
  232. return
  233. }
  234. if len(nextList) > 0 {
  235. list = append(list, nextList...)
  236. }
  237. scrollId = nextScrollId
  238. }
  239. if len(list) == 0 {
  240. resp.List = make([]*aiPredictModel.AiPredictModelIndexItem, 0)
  241. br.Ret = 200
  242. br.Success = true
  243. br.Msg = "获取成功"
  244. br.Data = resp
  245. return
  246. }
  247. var ids []int
  248. for _, v := range list {
  249. ids = append(ids, v.PrimaryId)
  250. highlightMap[v.PrimaryId] = v.SearchText
  251. }
  252. cond += fmt.Sprintf(` AND %s IN (%s)`, indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
  253. pars = append(pars, ids)
  254. }
  255. }
  256. // 获取列表
  257. list, e := indexOb.GetItemsByCondition(cond, pars, []string{}, "")
  258. if e != nil {
  259. br.Msg = "获取失败"
  260. br.ErrMsg = fmt.Sprintf("获取列表失败, %v", e)
  261. return
  262. }
  263. pageList := make([]*aiPredictModel.AiPredictModelIndexItem, 0)
  264. for _, v := range list {
  265. t := v.Format2Item()
  266. t.ClassifyName = classifyIdName[v.ClassifyId]
  267. // 搜索高亮
  268. t.SearchText = v.IndexName
  269. s := highlightMap[v.AiPredictModelIndexId]
  270. if s != "" {
  271. t.SearchText = s
  272. }
  273. pageList = append(pageList, t)
  274. }
  275. resp.List = pageList
  276. br.Data = resp
  277. br.Ret = 200
  278. br.Success = true
  279. br.Msg = "获取成功"
  280. }
  281. // Import
  282. // @Title 导入标的和数据
  283. // @Description 导入标的和数据
  284. // @Param IndexFile query file true "标的文件"
  285. // @Success 200 Ret=200 录入成功
  286. // @router /index/import [post]
  287. func (this *AiPredictModelIndexController) Import() {
  288. br := new(models.BaseResponse).Init()
  289. defer func() {
  290. if br.ErrMsg == "" {
  291. br.IsSendEmail = false
  292. }
  293. this.Data["json"] = br
  294. this.ServeJSON()
  295. }()
  296. sysUser := this.SysUser
  297. if sysUser == nil {
  298. br.Msg = "请登录"
  299. br.ErrMsg = "请登录,SysUser Is Empty"
  300. br.Ret = 408
  301. return
  302. }
  303. file, _, e := this.GetFile("IndexFile")
  304. if e != nil {
  305. br.Msg = "导入失败"
  306. br.ErrMsg = fmt.Sprintf("获取文件失败, %v", e)
  307. return
  308. }
  309. path := "./static/ai_predict_model_temp_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  310. defer func() {
  311. _ = file.Close()
  312. _ = os.Remove(path)
  313. }()
  314. if e = this.SaveToFile("IndexFile", path); e != nil {
  315. br.Msg = "导入失败"
  316. br.ErrMsg = fmt.Sprintf("保存文件失败, %v", e)
  317. return
  318. }
  319. xlFile, e := xlsx.OpenFile(path)
  320. if e != nil {
  321. br.Msg = "导入失败"
  322. br.ErrMsg = fmt.Sprintf("打开excel文件失败, %v", e)
  323. return
  324. }
  325. // 获取分类和用户,遍历时校验
  326. classifyNameId := make(map[string]int)
  327. adminNameId := make(map[string]int)
  328. {
  329. classifyOb := new(aiPredictModel.AiPredictModelClassify)
  330. classifyCond := fmt.Sprintf(` AND %s = ?`, classifyOb.Cols().ParentId)
  331. classifyPars := make([]interface{}, 0)
  332. classifyPars = append(classifyPars, 0) // 只取一级分类(临时过渡方案,业务端只会加一级)
  333. classifies, e := classifyOb.GetItemsByCondition(classifyCond, classifyPars, []string{}, "")
  334. if e != nil {
  335. br.Msg = "导入失败"
  336. br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
  337. return
  338. }
  339. for _, v := range classifies {
  340. classifyNameId[v.ClassifyName] = v.AiPredictModelClassifyId
  341. }
  342. admins, e := system.GetSysAdminList(``, make([]interface{}, 0), []string{}, "")
  343. if e != nil {
  344. br.Msg = "导入失败"
  345. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  346. return
  347. }
  348. for _, v := range admins {
  349. adminNameId[v.RealName] = v.AdminId
  350. }
  351. }
  352. // 遍历sheet页
  353. // 列表页:预测标的|分类|模型框架|创建人|预测日期|预测值|预测频度|方向准确率|绝对偏差
  354. type ImportDataColKey struct {
  355. IndexName string
  356. ColKey int
  357. DataDate time.Time
  358. }
  359. imports := make(map[string]*aiPredictModel.AiPredictModelImportData)
  360. importsData := make(map[string]map[time.Time]*aiPredictModel.AiPredictModelData)
  361. importsDailyData := make(map[string]map[time.Time]*aiPredictModel.AiPredictModelData)
  362. for sheetKey, sheet := range xlFile.Sheets {
  363. maxRow := sheet.MaxRow
  364. // 列表页
  365. if sheetKey == 0 {
  366. for i := 0; i < maxRow; i++ {
  367. // 忽略首行标题
  368. if i < 1 {
  369. continue
  370. }
  371. row := sheet.Row(i)
  372. cells := row.Cells
  373. if len(cells) < 9 {
  374. continue
  375. }
  376. // 标的名称
  377. indexName := strings.TrimSpace(cells[0].String())
  378. if indexName == "" {
  379. continue
  380. }
  381. if imports[indexName] == nil {
  382. imports[indexName] = new(aiPredictModel.AiPredictModelImportData)
  383. imports[indexName].Index = new(aiPredictModel.AiPredictModelIndex)
  384. imports[indexName].Data = make([]*aiPredictModel.AiPredictModelData, 0)
  385. }
  386. imports[indexName].Index.IndexName = indexName
  387. imports[indexName].Index.CreateTime = time.Now()
  388. imports[indexName].Index.ModifyTime = time.Now()
  389. imports[indexName].Index.TrainStatus = `训练成功`
  390. imports[indexName].Index.RunStatus = `运行成功`
  391. // 分类
  392. classifyName := strings.TrimSpace(cells[1].String())
  393. if classifyNameId[classifyName] <= 0 {
  394. br.Msg = fmt.Sprintf("分类:%s不存在", classifyName)
  395. return
  396. }
  397. imports[indexName].Index.ClassifyId = classifyNameId[classifyName]
  398. // 创建人
  399. adminName := strings.TrimSpace(cells[3].String())
  400. if adminNameId[adminName] <= 0 {
  401. br.Msg = fmt.Sprintf("创建人:%s不存在", adminName)
  402. return
  403. }
  404. imports[indexName].Index.SysUserId = adminNameId[adminName]
  405. imports[indexName].Index.SysUserRealName = adminName
  406. // 其余信息
  407. imports[indexName].Index.ModelFramework = strings.TrimSpace(cells[2].String())
  408. strDate := strings.TrimSpace(cells[4].String())
  409. predictDate, _ := utils.GetExcelDate(strDate)
  410. imports[indexName].Index.PredictDate = predictDate
  411. strVal := strings.TrimSpace(cells[5].String())
  412. if strVal == "" {
  413. continue
  414. }
  415. predictVal, _ := strconv.ParseFloat(strVal, 64)
  416. imports[indexName].Index.PredictValue = predictVal
  417. imports[indexName].Index.PredictFrequency = strings.TrimSpace(cells[6].String())
  418. imports[indexName].Index.DirectionAccuracy = strings.TrimSpace(cells[7].String())
  419. imports[indexName].Index.AbsoluteDeviation = strings.TrimSpace(cells[8].String())
  420. }
  421. }
  422. // 月度数据页
  423. if sheetKey == 1 {
  424. // 每五列为一个指标的数据
  425. colKeys := make(map[int]*ImportDataColKey) // 每一列对应的指标名称以及对应的字段序号
  426. for i := 0; i < maxRow; i++ {
  427. // 首行为指标名称
  428. if i == 0 {
  429. nameCol := 0
  430. row := sheet.Row(i)
  431. for ck, cell := range row.Cells {
  432. nameCol += 1
  433. if nameCol > 5 {
  434. nameCol = 1
  435. }
  436. if nameCol == 1 {
  437. // nameCol=1时为指标/数据行则为日期
  438. indexName := strings.TrimSpace(cell.String())
  439. if indexName == "" {
  440. continue
  441. }
  442. importsData[indexName] = make(map[time.Time]*aiPredictModel.AiPredictModelData)
  443. colKeys[ck] = &ImportDataColKey{
  444. ColKey: 1,
  445. IndexName: indexName,
  446. }
  447. // 后面四列分别对应: 实际值|预测值|方向|偏差率, 这里直接加无须考虑是否会越界
  448. colKeys[ck+1] = &ImportDataColKey{
  449. ColKey: 2,
  450. IndexName: indexName,
  451. }
  452. colKeys[ck+2] = &ImportDataColKey{
  453. ColKey: 3,
  454. IndexName: indexName,
  455. }
  456. colKeys[ck+3] = &ImportDataColKey{
  457. ColKey: 4,
  458. IndexName: indexName,
  459. }
  460. colKeys[ck+4] = &ImportDataColKey{
  461. ColKey: 5,
  462. IndexName: indexName,
  463. }
  464. continue
  465. }
  466. }
  467. continue
  468. }
  469. // 第二行为标题,跳过
  470. if i == 1 {
  471. continue
  472. }
  473. // 剩余为数据行
  474. row := sheet.Row(i)
  475. for ck, cell := range row.Cells {
  476. if colKeys[ck] == nil {
  477. continue
  478. }
  479. if colKeys[ck].IndexName == "" {
  480. continue
  481. }
  482. switch colKeys[ck].ColKey {
  483. case 1:
  484. // 日期列
  485. strDate := strings.TrimSpace(cell.String())
  486. dataDate, _ := utils.GetExcelDate(strDate)
  487. if dataDate.IsZero() {
  488. continue
  489. }
  490. colKeys[ck].DataDate = dataDate
  491. colKeys[ck+1].DataDate = dataDate
  492. colKeys[ck+2].DataDate = dataDate
  493. colKeys[ck+3].DataDate = dataDate
  494. colKeys[ck+4].DataDate = dataDate
  495. importRow := imports[colKeys[ck].IndexName]
  496. if importRow == nil {
  497. continue
  498. }
  499. // 新增当前日期数据
  500. importsData[colKeys[ck].IndexName][dataDate] = new(aiPredictModel.AiPredictModelData)
  501. importsData[colKeys[ck].IndexName][dataDate].DataTime = dataDate
  502. importsData[colKeys[ck].IndexName][dataDate].CreateTime = time.Now()
  503. importsData[colKeys[ck].IndexName][dataDate].ModifyTime = time.Now()
  504. importsData[colKeys[ck].IndexName][dataDate].Source = aiPredictModel.ModelDataSourceMonthly
  505. case 2, 3:
  506. // 实际值和预测值, 可能为空
  507. dataDate := colKeys[ck].DataDate
  508. if importsData[colKeys[ck].IndexName][dataDate] == nil {
  509. continue
  510. }
  511. strVal := strings.TrimSpace(cell.String())
  512. if strVal == "" {
  513. continue
  514. }
  515. val, _ := strconv.ParseFloat(strVal, 64)
  516. if colKeys[ck].ColKey == 2 {
  517. importsData[colKeys[ck].IndexName][dataDate].Value.Valid = true
  518. importsData[colKeys[ck].IndexName][dataDate].Value.Float64 = val
  519. } else {
  520. importsData[colKeys[ck].IndexName][dataDate].PredictValue.Valid = true
  521. importsData[colKeys[ck].IndexName][dataDate].PredictValue.Float64 = val
  522. }
  523. case 4, 5:
  524. // 方向/偏差率
  525. dataDate := colKeys[ck].DataDate
  526. if importsData[colKeys[ck].IndexName][dataDate] == nil {
  527. continue
  528. }
  529. str := strings.TrimSpace(cell.String())
  530. if str == "" {
  531. continue
  532. }
  533. if colKeys[ck].ColKey == 4 {
  534. importsData[colKeys[ck].IndexName][dataDate].Direction = str
  535. } else {
  536. importsData[colKeys[ck].IndexName][dataDate].DeviationRate = str
  537. }
  538. default:
  539. continue
  540. }
  541. }
  542. }
  543. }
  544. // 日度数据页
  545. if sheetKey == 2 {
  546. // 每3列为一个指标的数据
  547. colKeys := make(map[int]*ImportDataColKey) // 每一列对应的指标名称以及对应的字段序号
  548. for i := 0; i < maxRow; i++ {
  549. // 首行为指标名称
  550. if i == 0 {
  551. nameCol := 0
  552. row := sheet.Row(i)
  553. for ck, cell := range row.Cells {
  554. nameCol += 1
  555. if nameCol > 3 {
  556. nameCol = 1
  557. }
  558. if nameCol == 1 {
  559. // nameCol=1时为指标/数据行则为日期
  560. indexName := strings.TrimSpace(cell.String())
  561. if indexName == "" {
  562. continue
  563. }
  564. importsDailyData[indexName] = make(map[time.Time]*aiPredictModel.AiPredictModelData)
  565. colKeys[ck] = &ImportDataColKey{
  566. ColKey: 1,
  567. IndexName: indexName,
  568. }
  569. // 后面两列分别对应: 实际值|预测值, 这里直接加无须考虑是否会越界
  570. colKeys[ck+1] = &ImportDataColKey{
  571. ColKey: 2,
  572. IndexName: indexName,
  573. }
  574. colKeys[ck+2] = &ImportDataColKey{
  575. ColKey: 3,
  576. IndexName: indexName,
  577. }
  578. continue
  579. }
  580. }
  581. continue
  582. }
  583. // 第二行为标题,遇到"预测值"单元格,需要取出其中的值作为预测图例名称
  584. if i == 1 {
  585. row := sheet.Row(i)
  586. for ck, cell := range row.Cells {
  587. if colKeys[ck] == nil {
  588. continue
  589. }
  590. if colKeys[ck].IndexName == "" {
  591. continue
  592. }
  593. if colKeys[ck].ColKey != 3 {
  594. continue
  595. }
  596. if imports[colKeys[ck].IndexName] != nil && imports[colKeys[ck].IndexName].Index != nil {
  597. var extraConfig aiPredictModel.AiPredictModelIndexExtraConfig
  598. extraConfig.DailyChart.PredictLegendName = strings.TrimSpace(cell.String())
  599. b, _ := json.Marshal(extraConfig)
  600. imports[colKeys[ck].IndexName].Index.ExtraConfig = string(b)
  601. }
  602. }
  603. continue
  604. }
  605. // 剩余为数据行
  606. row := sheet.Row(i)
  607. for ck, cell := range row.Cells {
  608. if colKeys[ck] == nil {
  609. continue
  610. }
  611. if colKeys[ck].IndexName == "" {
  612. continue
  613. }
  614. switch colKeys[ck].ColKey {
  615. case 1:
  616. // 日期列
  617. strDate := strings.TrimSpace(cell.String())
  618. dataDate, _ := utils.GetExcelDate(strDate)
  619. if dataDate.IsZero() {
  620. continue
  621. }
  622. colKeys[ck].DataDate = dataDate
  623. colKeys[ck+1].DataDate = dataDate
  624. colKeys[ck+2].DataDate = dataDate
  625. importRow := imports[colKeys[ck].IndexName]
  626. if importRow == nil {
  627. continue
  628. }
  629. // 新增当前日期数据
  630. importsDailyData[colKeys[ck].IndexName][dataDate] = new(aiPredictModel.AiPredictModelData)
  631. importsDailyData[colKeys[ck].IndexName][dataDate].DataTime = dataDate
  632. importsDailyData[colKeys[ck].IndexName][dataDate].CreateTime = time.Now()
  633. importsDailyData[colKeys[ck].IndexName][dataDate].ModifyTime = time.Now()
  634. importsDailyData[colKeys[ck].IndexName][dataDate].Source = aiPredictModel.ModelDataSourceDaily
  635. case 2, 3:
  636. // 实际值和预测值, 可能为空
  637. dataDate := colKeys[ck].DataDate
  638. if importsDailyData[colKeys[ck].IndexName][dataDate] == nil {
  639. continue
  640. }
  641. strVal := strings.TrimSpace(cell.String())
  642. if strVal == "" {
  643. continue
  644. }
  645. val, _ := strconv.ParseFloat(strVal, 64)
  646. if colKeys[ck].ColKey == 2 {
  647. importsDailyData[colKeys[ck].IndexName][dataDate].Value.Valid = true
  648. importsDailyData[colKeys[ck].IndexName][dataDate].Value.Float64 = val
  649. } else {
  650. importsDailyData[colKeys[ck].IndexName][dataDate].PredictValue.Valid = true
  651. importsDailyData[colKeys[ck].IndexName][dataDate].PredictValue.Float64 = val
  652. }
  653. default:
  654. continue
  655. }
  656. }
  657. }
  658. }
  659. }
  660. for indexName, v := range importsData {
  661. if imports[indexName] == nil {
  662. continue
  663. }
  664. for _, dateData := range v {
  665. imports[indexName].Data = append(imports[indexName].Data, dateData)
  666. }
  667. }
  668. for indexName, v := range importsDailyData {
  669. if imports[indexName] == nil {
  670. continue
  671. }
  672. for _, dateData := range v {
  673. imports[indexName].Data = append(imports[indexName].Data, dateData)
  674. }
  675. }
  676. importIndexes := make([]*aiPredictModel.AiPredictModelImportData, 0)
  677. for _, v := range imports {
  678. importIndexes = append(importIndexes, v)
  679. }
  680. // 导入指标
  681. if e = services.ImportAiPredictModelIndexAndData(importIndexes, sysUser.AdminId, sysUser.RealName); e != nil {
  682. br.Msg = "操作失败"
  683. br.ErrMsg = fmt.Sprintf("导入指标数据失败, %v", e)
  684. return
  685. }
  686. // 写入es
  687. go func() {
  688. for _, v := range importIndexes {
  689. indexItem := new(dataSourceModel.SearchDataSource)
  690. indexItem.PrimaryId = v.Index.AiPredictModelIndexId
  691. indexItem.IndexName = v.Index.IndexName
  692. indexItem.IndexCode = v.Index.IndexCode
  693. indexItem.ClassifyId = v.Index.ClassifyId
  694. indexItem.Source = utils.DATA_SOURCE_AI_PREDICT_MODEL
  695. indexItem.SourceName = "AI预测模型"
  696. indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, v.Index.CreateTime)
  697. indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, v.Index.ModifyTime)
  698. docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
  699. if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
  700. utils.FileLog.Info("AI预测模型-写入es失败, %v", e)
  701. continue
  702. }
  703. }
  704. }()
  705. br.Ret = 200
  706. br.Success = true
  707. br.Msg = "操作成功"
  708. }
  709. // Detail
  710. // @Title 标的详情
  711. // @Description 标的详情
  712. // @Param IndexId query int true "标的ID"
  713. // @Success 200 {object} data_manage.ChartListResp
  714. // @router /index/detail [get]
  715. func (this *AiPredictModelIndexController) Detail() {
  716. br := new(models.BaseResponse).Init()
  717. defer func() {
  718. if br.ErrMsg == "" {
  719. br.IsSendEmail = false
  720. }
  721. this.Data["json"] = br
  722. this.ServeJSON()
  723. }()
  724. sysUser := this.SysUser
  725. if sysUser == nil {
  726. br.Msg = "请登录"
  727. br.ErrMsg = "请登录,SysUser Is Empty"
  728. br.Ret = 408
  729. return
  730. }
  731. indexId, _ := this.GetInt("IndexId")
  732. if indexId <= 0 {
  733. br.Msg = "参数有误"
  734. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", indexId)
  735. return
  736. }
  737. resp := new(aiPredictModel.AiPredictModelDetailResp)
  738. indexOb := new(aiPredictModel.AiPredictModelIndex)
  739. indexItem, e := indexOb.GetItemById(indexId)
  740. if e != nil {
  741. if utils.IsErrNoRow(e) {
  742. br.Msg = "标的已被删除,请刷新页面"
  743. return
  744. }
  745. br.Msg = "获取失败"
  746. br.ErrMsg = fmt.Sprintf("获取标的失败, %v", e)
  747. return
  748. }
  749. // 获取标的数据
  750. monthData, dailyData := make([]*aiPredictModel.AiPredictModelData, 0), make([]*aiPredictModel.AiPredictModelData, 0)
  751. {
  752. tableData := make([]*aiPredictModel.AiPredictModelDataItem, 0)
  753. dataOb := new(aiPredictModel.AiPredictModelData)
  754. dataCond := fmt.Sprintf(` AND %s = ?`, dataOb.Cols().IndexCode)
  755. dataPars := make([]interface{}, 0)
  756. dataPars = append(dataPars, indexItem.IndexCode)
  757. list, e := dataOb.GetItemsByCondition(dataCond, dataPars, []string{}, fmt.Sprintf("%s DESC", dataOb.Cols().DataTime))
  758. if e != nil {
  759. br.Msg = "获取失败"
  760. br.ErrMsg = fmt.Sprintf("获取标的数据失败, %v", e)
  761. return
  762. }
  763. // tableData取月度数据,最多显示10条
  764. count, limit := 0, 10
  765. for _, v := range list {
  766. // 日度数据
  767. if v.Source == aiPredictModel.ModelDataSourceDaily {
  768. dailyData = append(dailyData, v)
  769. continue
  770. }
  771. // 月度数据
  772. if count < limit {
  773. tableData = append(tableData, v.Format2Item())
  774. count += 1
  775. }
  776. monthData = append(monthData, v)
  777. }
  778. resp.TableData = tableData
  779. }
  780. // 月度图表
  781. if len(monthData) > 0 {
  782. chartDetail, e := services.GetAiPredictChartDetailByData(indexItem, monthData, aiPredictModel.ModelDataSourceMonthly)
  783. if e != nil {
  784. br.Msg = "获取失败"
  785. br.ErrMsg = fmt.Sprintf("获取月度图表失败, %v", e)
  786. return
  787. }
  788. resp.ChartView = chartDetail
  789. }
  790. // 日度图表
  791. if len(dailyData) > 0 {
  792. dailyChartDetail, e := services.GetAiPredictChartDetailByData(indexItem, dailyData, aiPredictModel.ModelDataSourceDaily)
  793. if e != nil {
  794. br.Msg = "获取失败"
  795. br.ErrMsg = fmt.Sprintf("获取日度图表失败, %v", e)
  796. return
  797. }
  798. resp.DailyChartView = dailyChartDetail
  799. }
  800. br.Data = resp
  801. br.Ret = 200
  802. br.Success = true
  803. br.Msg = "获取成功"
  804. }
  805. // Save
  806. // @Title 保存标的
  807. // @Description 保存标的
  808. // @Param request body aiPredictModel.AiPredictModelIndexSaveReq true "type json string"
  809. // @Success 200 Ret=200 保存成功
  810. // @router /index/save [post]
  811. func (this *AiPredictModelIndexController) Save() {
  812. br := new(models.BaseResponse).Init()
  813. defer func() {
  814. if br.ErrMsg == "" {
  815. br.IsSendEmail = false
  816. }
  817. this.Data["json"] = br
  818. this.ServeJSON()
  819. }()
  820. sysUser := this.SysUser
  821. if sysUser == nil {
  822. br.Msg = "请登录"
  823. br.ErrMsg = "请登录,SysUser Is Empty"
  824. br.Ret = 408
  825. return
  826. }
  827. var req aiPredictModel.AiPredictModelIndexSaveReq
  828. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  829. br.Msg = "参数解析异常"
  830. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  831. return
  832. }
  833. if req.IndexId < 0 {
  834. br.Msg = "参数有误"
  835. br.ErrMsg = fmt.Sprintf("标的ID有误, IndexId: %d", req.IndexId)
  836. return
  837. }
  838. indexOb := new(aiPredictModel.AiPredictModelIndex)
  839. indexItem, e := indexOb.GetItemById(req.IndexId)
  840. if e != nil {
  841. if utils.IsErrNoRow(e) {
  842. br.Msg = "标的已被删除,请刷新页面"
  843. return
  844. }
  845. br.Msg = "操作失败"
  846. br.ErrMsg = fmt.Sprintf("获取标的失败, %v", e)
  847. return
  848. }
  849. var extraConfig aiPredictModel.AiPredictModelIndexExtraConfig
  850. if indexItem.ExtraConfig != "" {
  851. if e = json.Unmarshal([]byte(indexItem.ExtraConfig), &extraConfig); e != nil {
  852. br.Msg = "操作失败"
  853. br.ErrMsg = fmt.Sprintf("标的配置解析失败, %v", e)
  854. return
  855. }
  856. }
  857. if req.MonthlyChart != nil {
  858. extraConfig.MonthlyChart.LeftMin = req.MonthlyChart.LeftMin
  859. extraConfig.MonthlyChart.LeftMax = req.MonthlyChart.LeftMax
  860. extraConfig.MonthlyChart.Unit = req.MonthlyChart.Unit
  861. }
  862. if req.DailyChart != nil {
  863. extraConfig.DailyChart.LeftMin = req.DailyChart.LeftMin
  864. extraConfig.DailyChart.LeftMax = req.DailyChart.LeftMax
  865. extraConfig.DailyChart.Unit = req.DailyChart.Unit
  866. }
  867. configByte, _ := json.Marshal(extraConfig)
  868. indexItem.ExtraConfig = string(configByte)
  869. indexItem.ModifyTime = time.Now()
  870. updateCols := []string{indexOb.Cols().ExtraConfig, indexOb.Cols().ModifyTime}
  871. if e = indexItem.Update(updateCols); e != nil {
  872. br.Msg = "操作失败"
  873. br.ErrMsg = fmt.Sprintf("保存标的失败, %v", e)
  874. return
  875. }
  876. br.Ret = 200
  877. br.Msg = "操作成功"
  878. br.Success = true
  879. }
  880. // DashboardSave
  881. // @Title 保存看板
  882. // @Description 保存看板
  883. // @Param request body aiPredictModel.AiPredictModelDashboardSaveReq true "type json string"
  884. // @Success 200 Ret=200 新增成功
  885. // @router /index/dashboard/save [post]
  886. func (this *AiPredictModelIndexController) DashboardSave() {
  887. br := new(models.BaseResponse).Init()
  888. defer func() {
  889. if br.ErrMsg == "" {
  890. br.IsSendEmail = false
  891. }
  892. this.Data["json"] = br
  893. this.ServeJSON()
  894. }()
  895. sysUser := this.SysUser
  896. if sysUser == nil {
  897. br.Msg = "请登录"
  898. br.ErrMsg = "请登录,SysUser Is Empty"
  899. br.Ret = 408
  900. return
  901. }
  902. var req aiPredictModel.AiPredictModelDashboardSaveReq
  903. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  904. br.Msg = "参数解析异常"
  905. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  906. return
  907. }
  908. if req.IndexId <= 0 {
  909. br.Msg = "参数有误"
  910. br.ErrMsg = fmt.Sprintf("参数有误, %d", req.IndexId)
  911. return
  912. }
  913. req.DashboardName = strings.TrimSpace(req.DashboardName)
  914. indexOb := new(aiPredictModel.AiPredictModelIndex)
  915. _, e := indexOb.GetItemById(req.IndexId)
  916. if e != nil {
  917. if utils.IsErrNoRow(e) {
  918. br.Msg = "标的已被删除,请刷新页面"
  919. return
  920. }
  921. br.Msg = "操作失败"
  922. br.ErrMsg = fmt.Sprintf("获取标的失败, %v", e)
  923. return
  924. }
  925. // 获取看板
  926. var isUpdate bool
  927. var updateCols []string
  928. dashboardItem := new(aiPredictModel.AiPredictModelDashboard)
  929. if req.IndexId > 0 {
  930. cond := fmt.Sprintf(" AND %s = ?", dashboardItem.Cols().AiPredictModelIndexId)
  931. pars := make([]interface{}, 0)
  932. pars = append(pars, req.IndexId)
  933. item, e := dashboardItem.GetItemByCondition(cond, pars, "")
  934. if e != nil && !utils.IsErrNoRow(e) {
  935. br.Msg = "操作失败"
  936. br.ErrMsg = fmt.Sprintf("获取标的看板失败, %v", e)
  937. return
  938. }
  939. if item != nil && item.AiPredictModelIndexId > 0 {
  940. isUpdate = true
  941. dashboardItem = item
  942. dashboardItem.DashboardName = req.DashboardName
  943. dashboardItem.ModifyTime = time.Now()
  944. updateCols = append(updateCols, dashboardItem.Cols().DashboardName, dashboardItem.Cols().ModifyTime)
  945. }
  946. }
  947. if !isUpdate {
  948. dashboardItem.AiPredictModelIndexId = req.IndexId
  949. dashboardItem.DashboardName = req.DashboardName
  950. dashboardItem.SysUserId = sysUser.AdminId
  951. dashboardItem.SysUserRealName = sysUser.RealName
  952. dashboardItem.CreateTime = time.Now()
  953. dashboardItem.ModifyTime = time.Now()
  954. }
  955. // 详情
  956. dashboardDetails := make([]*aiPredictModel.AiPredictModelDashboardDetail, 0)
  957. for i, v := range req.List {
  958. t := &aiPredictModel.AiPredictModelDashboardDetail{
  959. Type: v.Type,
  960. UniqueCode: v.UniqueCode,
  961. Sort: i + 1,
  962. CreateTime: time.Now(),
  963. ModifyTime: time.Now(),
  964. }
  965. dashboardDetails = append(dashboardDetails, t)
  966. }
  967. // 保存
  968. if e := dashboardItem.SaveIndexDashboard(dashboardItem, dashboardDetails, isUpdate, updateCols); e != nil {
  969. br.Msg = "操作失败"
  970. br.ErrMsg = fmt.Sprintf("保存标的看板失败, %v", e)
  971. return
  972. }
  973. br.Ret = 200
  974. br.Success = true
  975. br.Msg = "操作成功"
  976. }
  977. // DashboardDetail
  978. // @Title 看板详情
  979. // @Description 看板详情
  980. // @Param IndexId query int true "标的ID"
  981. // @Success 200 {object} aiPredictModel.AiPredictModelDashboardDetailResp
  982. // @router /index/dashboard/detail [get]
  983. func (this *AiPredictModelIndexController) DashboardDetail() {
  984. br := new(models.BaseResponse).Init()
  985. defer func() {
  986. if br.ErrMsg == "" {
  987. br.IsSendEmail = false
  988. }
  989. this.Data["json"] = br
  990. this.ServeJSON()
  991. }()
  992. sysUser := this.SysUser
  993. if sysUser == nil {
  994. br.Msg = "请登录"
  995. br.ErrMsg = "请登录,SysUser Is Empty"
  996. br.Ret = 408
  997. return
  998. }
  999. indexId, _ := this.GetInt("IndexId")
  1000. resp := new(aiPredictModel.AiPredictModelDashboardDetailResp)
  1001. indexOb := new(aiPredictModel.AiPredictModelIndex)
  1002. indexItem, e := indexOb.GetItemById(indexId)
  1003. if e != nil {
  1004. if utils.IsErrNoRow(e) {
  1005. br.Msg = "标的已被删除,请刷新页面"
  1006. return
  1007. }
  1008. br.Msg = "获取失败"
  1009. br.ErrMsg = fmt.Sprintf("获取标的失败, %v", e)
  1010. return
  1011. }
  1012. resp.CreateUserId = indexItem.SysUserId
  1013. resp.CreateUserRealName = indexItem.SysUserRealName
  1014. // 获取标的看板
  1015. dashboardOb := new(aiPredictModel.AiPredictModelDashboard)
  1016. dashboardItem := new(aiPredictModel.AiPredictModelDashboardItem)
  1017. {
  1018. cond := fmt.Sprintf(" AND %s = ?", dashboardOb.Cols().AiPredictModelIndexId)
  1019. pars := make([]interface{}, 0)
  1020. pars = append(pars, indexId)
  1021. item, e := dashboardOb.GetItemByCondition(cond, pars, "")
  1022. if e != nil && !utils.IsErrNoRow(e) {
  1023. br.Msg = "操作失败"
  1024. br.ErrMsg = fmt.Sprintf("获取标的看板失败, %v", e)
  1025. return
  1026. }
  1027. if item != nil {
  1028. dashboardItem = item.Format2Item()
  1029. }
  1030. }
  1031. // 获取看板详情
  1032. dashboardDetails := make([]*aiPredictModel.AiPredictModelDashboardDetailItem, 0)
  1033. if dashboardItem.DashboardId > 0 {
  1034. detailOb := new(aiPredictModel.AiPredictModelDashboardDetail)
  1035. cond := fmt.Sprintf(" AND %s = ?", detailOb.Cols().AiPredictModelDashboardId)
  1036. pars := make([]interface{}, 0)
  1037. pars = append(pars, dashboardItem.DashboardId)
  1038. list, e := detailOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", detailOb.Cols().Sort))
  1039. if e != nil {
  1040. br.Msg = "获取失败"
  1041. br.ErrMsg = fmt.Sprintf("获取看板详情失败, %v", e)
  1042. return
  1043. }
  1044. for _, v := range list {
  1045. dashboardDetails = append(dashboardDetails, v.Format2Item())
  1046. }
  1047. }
  1048. resp.AiPredictModelDashboardItem = dashboardItem
  1049. resp.List = dashboardDetails
  1050. br.Data = resp
  1051. br.Ret = 200
  1052. br.Success = true
  1053. br.Msg = "获取成功"
  1054. }
  1055. // SearchByEs
  1056. // @Title 图表模糊搜索(从es获取)
  1057. // @Description 图表模糊搜索(从es获取)
  1058. // @Param Keyword query string true "图表名称"
  1059. // @Param IsShowMe query bool true "是否只看我的,true、false"
  1060. // @Param Source query int true "来源,14:日度预测,15:月度预测,默认0:全部14+15"
  1061. // @Success 200 {object} data_manage.ChartInfo
  1062. // @router /chart/search_by_es [get]
  1063. func (this *AiPredictModelIndexController) SearchByEs() {
  1064. br := new(models.BaseResponse).Init()
  1065. defer func() {
  1066. if br.ErrMsg == "" {
  1067. br.IsSendEmail = false
  1068. }
  1069. this.Data["json"] = br
  1070. this.ServeJSON()
  1071. }()
  1072. sysUser := this.SysUser
  1073. if sysUser == nil {
  1074. br.Msg = "请登录"
  1075. br.ErrMsg = "请登录,SysUser Is Empty"
  1076. br.Ret = 408
  1077. return
  1078. }
  1079. pageSize, _ := this.GetInt("PageSize")
  1080. currentIndex, _ := this.GetInt("CurrentIndex")
  1081. var startSize int
  1082. if pageSize <= 0 {
  1083. pageSize = utils.PageSize20
  1084. }
  1085. if currentIndex <= 0 {
  1086. currentIndex = 1
  1087. }
  1088. startSize = paging.StartIndex(currentIndex, pageSize)
  1089. keyword := this.GetString("Keyword")
  1090. keyword = strings.TrimSpace(keyword)
  1091. if keyword == "" {
  1092. keyword = this.GetString("KeyWord")
  1093. keyword = strings.TrimSpace(keyword)
  1094. }
  1095. //只看我的
  1096. isShowMe, _ := this.GetBool("IsShowMe")
  1097. showSysId := 0
  1098. if isShowMe {
  1099. showSysId = sysUser.AdminId
  1100. }
  1101. source, _ := this.GetInt("Source")
  1102. sourceList := make([]int, 0)
  1103. if source <= 0 {
  1104. sourceList = append(sourceList, utils.CHART_SOURCE_AI_PREDICT_MODEL_MONTHLY, utils.CHART_SOURCE_AI_PREDICT_MODEL_DAILY)
  1105. } else {
  1106. sourceList = append(sourceList, source)
  1107. }
  1108. var searchList []*data_manage.ChartInfoMore
  1109. var total int64
  1110. var err error
  1111. // 获取当前账号的不可见指标(AI预测的指标为标的均可见)
  1112. noPermissionChartIdList := make([]int, 0)
  1113. //{
  1114. // obj := data_manage.EdbInfoNoPermissionAdmin{}
  1115. // confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
  1116. // if err != nil && !utils.IsErrNoRow(err) {
  1117. // br.Msg = "获取失败"
  1118. // br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
  1119. // return
  1120. // }
  1121. // for _, v := range confList {
  1122. // noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
  1123. // }
  1124. //}
  1125. if keyword != "" {
  1126. searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, sourceList, noPermissionChartIdList, startSize, pageSize)
  1127. } else {
  1128. total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, sourceList, noPermissionChartIdList, startSize, pageSize)
  1129. if err != nil && !utils.IsErrNoRow(err) {
  1130. br.Msg = "获取失败"
  1131. br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
  1132. return
  1133. }
  1134. }
  1135. finalList := make([]*data_manage.ChartInfoMore, 0)
  1136. if len(searchList) > 0 {
  1137. chartInfoIds := ""
  1138. chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
  1139. for _, v := range searchList {
  1140. chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
  1141. }
  1142. if chartInfoIds != "" {
  1143. chartInfoIds = strings.Trim(chartInfoIds, ",")
  1144. //判断是否需要展示英文标识
  1145. edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
  1146. if e != nil {
  1147. br.Msg = "获取失败"
  1148. br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
  1149. return
  1150. }
  1151. for _, v := range edbList {
  1152. chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
  1153. }
  1154. }
  1155. for _, v := range searchList {
  1156. tmp := new(data_manage.ChartInfoMore)
  1157. tmp.ChartInfo = v.ChartInfo
  1158. // 图表数据权限
  1159. tmp.HaveOperaAuth = true
  1160. //判断是否需要展示英文标识
  1161. if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
  1162. tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
  1163. }
  1164. tmp.SearchText = v.SearchText
  1165. if tmp.SearchText == "" {
  1166. tmp.SearchText = v.ChartName
  1167. }
  1168. finalList = append(finalList, tmp)
  1169. }
  1170. }
  1171. //新增搜索词记录
  1172. {
  1173. searchKeyword := new(data_manage.SearchKeyword)
  1174. searchKeyword.KeyWord = keyword
  1175. searchKeyword.CreateTime = time.Now()
  1176. go data_manage.AddSearchKeyword(searchKeyword)
  1177. }
  1178. page := paging.GetPaging(currentIndex, pageSize, int(total))
  1179. resp := data_manage.ChartInfoListByEsResp{
  1180. Paging: page,
  1181. List: finalList,
  1182. }
  1183. br.Ret = 200
  1184. br.Success = true
  1185. br.Msg = "获取成功"
  1186. br.Data = resp
  1187. }
  1188. // ScriptPathSave
  1189. // @Title 保存标的关联脚本路径
  1190. // @Description 保存标的关联脚本路径
  1191. // @Param request body request.AiPredictModelIndexSaveScriptPathReq true "type json string"
  1192. // @Success 200 Ret=200 保存成功
  1193. // @router /index/script_path/save [post]
  1194. func (this *AiPredictModelIndexController) ScriptPathSave() {
  1195. br := new(models.BaseResponse).Init()
  1196. defer func() {
  1197. if br.ErrMsg == "" {
  1198. br.IsSendEmail = false
  1199. }
  1200. this.Data["json"] = br
  1201. this.ServeJSON()
  1202. }()
  1203. sysUser := this.SysUser
  1204. if sysUser == nil {
  1205. br.Msg = "请登录"
  1206. br.ErrMsg = "请登录,SysUser Is Empty"
  1207. br.Ret = 408
  1208. return
  1209. }
  1210. var req request.AiPredictModelIndexSaveScriptPathReq
  1211. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  1212. br.Msg = "参数解析异常"
  1213. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1214. return
  1215. }
  1216. if req.IndexId < 0 {
  1217. br.Msg = "参数有误"
  1218. br.ErrMsg = fmt.Sprintf("标的ID有误, IndexId: %d", req.IndexId)
  1219. return
  1220. }
  1221. req.ScriptPath = strings.TrimSpace(req.ScriptPath)
  1222. if req.ScriptPath == "" {
  1223. br.Msg = "标的路径不能为空"
  1224. br.ErrMsg = fmt.Sprintf("标的路径有误, ScriptPath: %s", req.ScriptPath)
  1225. return
  1226. }
  1227. indexOb := new(aiPredictModel.AiPredictModelIndex)
  1228. indexItem, e := indexOb.GetItemById(req.IndexId)
  1229. if e != nil {
  1230. if utils.IsErrNoRow(e) {
  1231. br.Msg = "标的已被删除,请刷新页面"
  1232. return
  1233. }
  1234. br.Msg = "操作失败"
  1235. br.ErrMsg = fmt.Sprintf("获取标的失败, %v", e)
  1236. return
  1237. }
  1238. indexItem.ScriptPath = req.ScriptPath
  1239. indexItem.ModifyTime = time.Now()
  1240. updateCols := []string{indexOb.Cols().ScriptPath, indexOb.Cols().ModifyTime}
  1241. if e = indexItem.Update(updateCols); e != nil {
  1242. br.Msg = "操作失败"
  1243. br.ErrMsg = fmt.Sprintf("保存标的失败, %v", e)
  1244. return
  1245. }
  1246. br.Ret = 200
  1247. br.Msg = "操作成功"
  1248. br.Success = true
  1249. }
  1250. // GetCurrentRunningAiPredictModelIndexCount
  1251. // @Title 获取当前正在运行中的模型数量
  1252. // @Description 获取当前正在运行中的模型数量
  1253. // @Success 200 Ret=200 保存成功
  1254. // @Success 200 {object} response.CurrentRunningCountResp
  1255. // @router /index/running/count [get]
  1256. func (this *AiPredictModelIndexController) GetCurrentRunningAiPredictModelIndexCount() {
  1257. br := new(models.BaseResponse).Init()
  1258. defer func() {
  1259. if br.ErrMsg == "" {
  1260. br.IsSendEmail = false
  1261. }
  1262. this.Data["json"] = br
  1263. this.ServeJSON()
  1264. }()
  1265. sysUser := this.SysUser
  1266. if sysUser == nil {
  1267. br.Msg = "请登录"
  1268. br.ErrMsg = "请登录,SysUser Is Empty"
  1269. br.Ret = 408
  1270. return
  1271. }
  1272. // 查找当前标的是否存在待训练/训练中的模型
  1273. count, err := services.GetCurrentRunningAiPredictModelIndexCount()
  1274. if err != nil {
  1275. br.Msg = "训练失败"
  1276. br.ErrMsg = "训练失败,查找待训练的模型失败,Err:" + err.Error()
  1277. return
  1278. }
  1279. resp := response.CurrentRunningCountResp{
  1280. Total: count,
  1281. }
  1282. br.Data = resp
  1283. br.Ret = 200
  1284. br.Success = true
  1285. br.Msg = "获取成功"
  1286. }
  1287. // Run
  1288. // @Title 获取当前正在运行中的模型数量
  1289. // @Description 获取当前正在运行中的模型数量
  1290. // @Success 200 Ret=200 保存成功
  1291. // @Success 200 {object} response.CurrentRunningCountResp
  1292. // @router /index/run [get]
  1293. func (this *AiPredictModelIndexController) Run() {
  1294. br := new(models.BaseResponse).Init()
  1295. defer func() {
  1296. if br.ErrMsg == "" {
  1297. br.IsSendEmail = false
  1298. }
  1299. this.Data["json"] = br
  1300. this.ServeJSON()
  1301. }()
  1302. sysUser := this.SysUser
  1303. if sysUser == nil {
  1304. br.Msg = "请登录"
  1305. br.ErrMsg = "请登录,SysUser Is Empty"
  1306. br.Ret = 408
  1307. return
  1308. }
  1309. // 查找当前标的是否存在待训练/训练中的模型
  1310. count, err := services.GetCurrentRunningAiPredictModelIndexCount()
  1311. if err != nil {
  1312. br.Msg = "训练失败"
  1313. br.ErrMsg = "训练失败,查找待训练的模型失败,Err:" + err.Error()
  1314. return
  1315. }
  1316. resp := response.CurrentRunningCountResp{
  1317. Total: count,
  1318. }
  1319. br.Data = resp
  1320. br.Ret = 200
  1321. br.Success = true
  1322. br.Msg = "获取成功"
  1323. }