base_from_ths_hf.go 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  1. package data_manage
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/data_manage"
  7. dataSourceModel "eta/eta_api/models/data_source"
  8. "eta/eta_api/models/mgo"
  9. "eta/eta_api/services/data"
  10. "eta/eta_api/services/elastic"
  11. "eta/eta_api/utils"
  12. "fmt"
  13. "github.com/rdlucklib/rdluck_tools/paging"
  14. "github.com/shopspring/decimal"
  15. "go.mongodb.org/mongo-driver/bson"
  16. "sort"
  17. "strconv"
  18. "strings"
  19. "time"
  20. )
  21. // BaseFromThsHfController 同花顺高频数据
  22. type BaseFromThsHfController struct {
  23. controllers.BaseAuthController
  24. }
  25. // Search
  26. // @Title 新增指标-查询指标信息接口
  27. // @Description 新增指标-查询指标信息接口
  28. // @Param request body data_manage.ThsHfSearchEdbReq true "type json string"
  29. // @Success 200 {object} data_manage.ThsHfSearchEdbResp
  30. // @router /ths_hf/index/search [get]
  31. func (this *BaseFromThsHfController) Search() {
  32. br := new(models.BaseResponse).Init()
  33. defer func() {
  34. if br.ErrMsg == "" {
  35. br.IsSendEmail = false
  36. }
  37. this.Data["json"] = br
  38. this.ServeJSON()
  39. }()
  40. sysUser := this.SysUser
  41. if sysUser == nil {
  42. br.Msg = "请登录"
  43. br.ErrMsg = "请登录,SysUser Is Empty"
  44. br.Ret = 408
  45. return
  46. }
  47. var params data_manage.ThsHfSearchEdbReq
  48. if e := this.ParseForm(&params); e != nil {
  49. br.Msg = "参数解析失败"
  50. br.ErrMsg = fmt.Sprintf("参数解析失败, err: %v", e)
  51. return
  52. }
  53. params.StockCode = strings.TrimSpace(params.StockCode)
  54. if params.StockCode == "" {
  55. br.Msg = "请输入证券代码"
  56. return
  57. }
  58. stockCodes := strings.Split(params.StockCode, ",")
  59. if len(stockCodes) == 0 {
  60. br.Msg = "请输入证券代码"
  61. return
  62. }
  63. if len(stockCodes) > 10 {
  64. br.Msg = "最多输入10个证券代码"
  65. return
  66. }
  67. params.EdbCode = strings.TrimSpace(params.EdbCode)
  68. if params.EdbCode == "" {
  69. br.Msg = "请输入指标代码"
  70. return
  71. }
  72. edbCodes := strings.Split(params.EdbCode, ",")
  73. if len(edbCodes) == 0 {
  74. br.Msg = "请输入指标代码"
  75. return
  76. }
  77. if len(edbCodes) > 20 {
  78. br.Msg = "最多选择/输入20个指标代码"
  79. return
  80. }
  81. if params.StartTime == "" {
  82. br.Msg = "请选择起始时间"
  83. return
  84. }
  85. _, e := time.ParseInLocation(utils.FormatDateTime, params.StartTime, time.Local)
  86. if e != nil {
  87. br.Msg = "起始时间格式有误"
  88. br.ErrMsg = fmt.Sprintf("起始时间格式有误, %v", e)
  89. return
  90. }
  91. // 结束时间选填, 不填则为当前时间
  92. if params.EndTime != "" {
  93. _, e := time.ParseInLocation(utils.FormatDateTime, params.EndTime, time.Local)
  94. if e != nil {
  95. br.Msg = "截止时间格式有误"
  96. br.ErrMsg = fmt.Sprintf("截止时间格式有误, %v", e)
  97. return
  98. }
  99. }
  100. if params.EndTime == "" {
  101. params.EndTime = time.Now().Local().Format(utils.FormatDateTime)
  102. }
  103. if !utils.InArrayByInt(data_manage.ThsHfPeriodArr, params.Interval) {
  104. br.Msg = "时间周期有误"
  105. br.ErrMsg = fmt.Sprintf("时间周期有误, Interval: %d", params.Interval)
  106. return
  107. }
  108. if params.CPS != "" && !utils.InArrayByStr(data_manage.ThsHfCPSArr, params.CPS) {
  109. br.Msg = "复权方式有误"
  110. br.ErrMsg = fmt.Sprintf("复权方式有误, CPS: %s", params.CPS)
  111. return
  112. }
  113. if params.BaseDate != "" {
  114. _, e = time.ParseInLocation(utils.FormatDate, params.BaseDate, time.Local)
  115. if e != nil {
  116. br.Msg = "复权基点格式有误"
  117. br.ErrMsg = fmt.Sprintf("复权基点格式有误, %v", e)
  118. return
  119. }
  120. }
  121. if params.Fill != "" && !utils.InArrayByStr(data_manage.ThsHfFillArr, params.Fill) {
  122. br.Msg = "非交易间隔处理有误"
  123. br.ErrMsg = fmt.Sprintf("非交易间隔处理有误, Fill: %s", params.Fill)
  124. return
  125. }
  126. // 校验已入库的指标
  127. checkResp, indexExists, e := data.CheckExistThsHfEdb(stockCodes, edbCodes)
  128. if e != nil {
  129. br.Msg = "获取失败"
  130. br.ErrMsg = fmt.Sprintf("校验已存在的高频指标失败, %v", e)
  131. return
  132. }
  133. if len(checkResp.ExistIndex) > 0 && checkResp.ExistAll {
  134. br.Msg = "指标均已存在"
  135. return
  136. }
  137. resp := make([]*data_manage.ThsHfSearchEdbResp, 0)
  138. // 请求API获取数据
  139. indexes, e := data.GetEdbDataThsHf(params)
  140. if e != nil {
  141. br.Msg = "未搜索到指标"
  142. br.ErrMsg = fmt.Sprintf("获取高频指标失败, %v", e)
  143. return
  144. }
  145. if len(indexes) == 0 {
  146. br.Msg = "未搜索到指标"
  147. return
  148. }
  149. for _, v := range indexes {
  150. // 忽略掉校验出来的已入库指标
  151. k := fmt.Sprintf("%s-%s", v.StockCode, v.EdbCode)
  152. if indexExists[k] {
  153. continue
  154. }
  155. // 默认指标名称
  156. suffix := data_manage.ThsHfEdbCodeCn[v.EdbCode]
  157. if suffix == "" {
  158. suffix = v.EdbCode
  159. }
  160. indexName := fmt.Sprintf("%s%dm%s", v.StockCode, params.Interval, suffix)
  161. item := new(data_manage.ThsHfSearchEdbResp)
  162. item.StockCode = v.StockCode
  163. item.EdbCode = v.EdbCode
  164. item.IndexName = indexName
  165. item.Frequency = params.Interval
  166. // 搜索只展示100条数据
  167. var limit int
  168. sort.Slice(v.IndexData, func(i, j int) bool {
  169. return v.IndexData[i].DataTime.After(v.IndexData[j].DataTime)
  170. })
  171. for _, d := range v.IndexData {
  172. if limit > 100 {
  173. break
  174. }
  175. limit += 1
  176. strVal := decimal.NewFromFloat(d.Value).Round(4).String()
  177. item.IndexData = append(item.IndexData, data_manage.ThsHfSearchEdbData{
  178. DataTime: d.DataTime.Format(utils.FormatDateTime),
  179. Value: strVal,
  180. })
  181. }
  182. resp = append(resp, item)
  183. }
  184. br.Data = resp
  185. br.Ret = 200
  186. br.Success = true
  187. br.Msg = "获取成功"
  188. }
  189. // ExistCheck
  190. // @Title 新增指标-指标存在校验
  191. // @Description 新增指标-指标存在校验
  192. // @Param request body data_manage.ThsHfSearchEdbReq true "type json string"
  193. // @Success 200 {object} data_manage.ThsHfExistCheckResp
  194. // @router /ths_hf/index/exist_check [get]
  195. func (this *BaseFromThsHfController) ExistCheck() {
  196. br := new(models.BaseResponse).Init()
  197. defer func() {
  198. if br.ErrMsg == "" {
  199. br.IsSendEmail = false
  200. }
  201. this.Data["json"] = br
  202. this.ServeJSON()
  203. }()
  204. sysUser := this.SysUser
  205. if sysUser == nil {
  206. br.Msg = "请登录"
  207. br.ErrMsg = "请登录,SysUser Is Empty"
  208. br.Ret = 408
  209. return
  210. }
  211. var params data_manage.ThsHfSearchEdbReq
  212. if e := this.ParseForm(&params); e != nil {
  213. br.Msg = "参数解析失败"
  214. br.ErrMsg = fmt.Sprintf("参数解析失败, err: %v", e)
  215. return
  216. }
  217. params.StockCode = strings.TrimSpace(params.StockCode)
  218. if params.StockCode == "" {
  219. br.Msg = "请输入证券代码"
  220. return
  221. }
  222. stockCodes := strings.Split(params.StockCode, ",")
  223. if len(stockCodes) == 0 {
  224. br.Msg = "请输入证券代码"
  225. return
  226. }
  227. params.EdbCode = strings.TrimSpace(params.EdbCode)
  228. if params.EdbCode == "" {
  229. br.Msg = "请输入指标代码"
  230. return
  231. }
  232. edbCodes := strings.Split(params.EdbCode, ",")
  233. if len(edbCodes) == 0 {
  234. br.Msg = "请输入指标代码"
  235. return
  236. }
  237. // 校验已存在的高频指标
  238. resp, _, e := data.CheckExistThsHfEdb(stockCodes, edbCodes)
  239. if e != nil {
  240. br.Msg = "获取失败"
  241. br.ErrMsg = fmt.Sprintf("校验已存在的高频指标失败, %v", e)
  242. return
  243. }
  244. br.Data = resp
  245. br.Ret = 200
  246. br.Success = true
  247. br.Msg = "获取成功"
  248. }
  249. // List
  250. // @Title 列表
  251. // @Description 列表
  252. // @Param request body data_manage.ThsHfIndexListForm true "type json string"
  253. // @Success 200 {object} data_manage.ThsHfIndexPageListResp
  254. // @router /ths_hf/index/list [get]
  255. func (this *BaseFromThsHfController) List() {
  256. br := new(models.BaseResponse).Init()
  257. defer func() {
  258. if br.ErrMsg == "" {
  259. br.IsSendEmail = false
  260. }
  261. this.Data["json"] = br
  262. this.ServeJSON()
  263. }()
  264. sysUser := this.SysUser
  265. if sysUser == nil {
  266. br.Msg = "请登录"
  267. br.ErrMsg = "请登录,SysUser Is Empty"
  268. br.Ret = 408
  269. return
  270. }
  271. var params data_manage.ThsHfIndexListForm
  272. if e := this.ParseForm(&params); e != nil {
  273. br.Msg = "参数解析失败"
  274. br.ErrMsg = fmt.Sprintf("参数解析失败, err: %v", e)
  275. return
  276. }
  277. if params.SortField > 0 && !utils.InArrayByInt([]int{1, 2, 3, 4}, params.SortField) {
  278. br.Msg = "参数有误"
  279. br.ErrMsg = fmt.Sprintf("参数有误, SortField: %d", params.SortField)
  280. return
  281. }
  282. if params.SortType > 0 && !utils.InArrayByInt([]int{1, 2}, params.SortType) {
  283. br.Msg = "参数有误"
  284. br.ErrMsg = fmt.Sprintf("参数有误, SortType: %d", params.SortType)
  285. return
  286. }
  287. resp := new(data_manage.ThsHfIndexPageListResp)
  288. resp.List = make([]*data_manage.BaseFromThsHfIndexItem, 0)
  289. // 查询所有分类-分类查询/分类完整路径用
  290. classifyOb := new(data_manage.BaseFromThsHfClassify)
  291. //classifies := make([]*data_manage.BaseFromThsHfClassify, 0)
  292. classifyIdItem := make(map[int]*data_manage.BaseFromThsHfClassify)
  293. {
  294. list, e := classifyOb.GetItemsByCondition(``, make([]interface{}, 0), []string{classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName, classifyOb.Cols().ClassifyNameEn, classifyOb.Cols().LevelPath}, "")
  295. if e != nil {
  296. br.Msg = "获取失败"
  297. br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
  298. return
  299. }
  300. for _, v := range list {
  301. classifyIdItem[v.BaseFromThsHfClassifyId] = v
  302. }
  303. //classifies = list
  304. }
  305. // 分页查询
  306. var startSize int
  307. if params.PageSize <= 0 {
  308. params.PageSize = utils.PageSize20
  309. }
  310. if params.CurrentIndex <= 0 {
  311. params.CurrentIndex = 1
  312. }
  313. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  314. // 筛选项
  315. var (
  316. cond string
  317. pars []interface{}
  318. listOrder string
  319. classifyIds []int
  320. adminIds []int
  321. //frequencyArr []string
  322. )
  323. indexOb := new(data_manage.BaseFromThsHfIndex)
  324. {
  325. // 分类
  326. if params.ClassifyId != "" {
  327. classifyIdArr := strings.Split(params.ClassifyId, ",")
  328. //classifyIds := make([]int, 0)
  329. for _, v := range classifyIdArr {
  330. t, _ := strconv.Atoi(v)
  331. if t > 0 {
  332. classifyIds = append(classifyIds, t)
  333. }
  334. }
  335. if len(classifyIds) == 0 {
  336. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  337. resp.Paging = page
  338. br.Ret = 200
  339. br.Success = true
  340. br.Msg = "获取成功"
  341. return
  342. }
  343. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
  344. pars = append(pars, classifyIds)
  345. //// 不包含子分类
  346. //if len(classifyIds) > 0 && !params.IncludeChild {
  347. // cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
  348. // pars = append(pars, classifyIds)
  349. //}
  350. //
  351. //// 包含子分类
  352. //if len(classifyIds) > 0 && params.IncludeChild {
  353. // queryClassifyIds := make([]int, 0)
  354. // queryClassifyExist := make(map[int]bool)
  355. //
  356. // for _, v := range classifyIds {
  357. // // 遍历所有分类从LevelPath中找含有查询分类ID的...=_=!
  358. // for _, cv := range classifies {
  359. // if queryClassifyExist[cv.BaseFromThsHfClassifyId] {
  360. // continue
  361. // }
  362. // if cv.LevelPath == "" {
  363. // continue
  364. // }
  365. // strArr := strings.Split(cv.LevelPath, ",")
  366. // if len(strArr) == 0 {
  367. // continue
  368. // }
  369. // for _, sv := range strArr {
  370. // tv, _ := strconv.Atoi(sv)
  371. // if tv == v {
  372. // queryClassifyIds = append(queryClassifyIds, cv.BaseFromThsHfClassifyId)
  373. // queryClassifyExist[cv.BaseFromThsHfClassifyId] = true
  374. // break
  375. // }
  376. // }
  377. // }
  378. // }
  379. //
  380. // if len(queryClassifyIds) == 0 {
  381. // page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  382. // resp.Paging = page
  383. // br.Ret = 200
  384. // br.Success = true
  385. // br.Msg = "获取成功"
  386. // return
  387. // }
  388. // cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(queryClassifyIds)))
  389. // pars = append(pars, queryClassifyIds)
  390. //}
  391. }
  392. if params.Frequency != "" {
  393. frequencyArr := strings.Split(params.Frequency, ",")
  394. if len(frequencyArr) > 0 {
  395. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().Frequency, utils.GetOrmInReplace(len(frequencyArr)))
  396. pars = append(pars, frequencyArr)
  397. } else {
  398. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  399. resp.Paging = page
  400. br.Ret = 200
  401. br.Success = true
  402. br.Msg = "获取成功"
  403. return
  404. }
  405. frequencyArr = strings.Split(params.Frequency, ",")
  406. }
  407. if params.SysAdminId != "" {
  408. adminIdArr := strings.Split(params.SysAdminId, ",")
  409. //adminIds := make([]int, 0)
  410. for _, v := range adminIdArr {
  411. t, _ := strconv.Atoi(v)
  412. if t > 0 {
  413. adminIds = append(adminIds, t)
  414. }
  415. }
  416. if len(adminIds) > 0 {
  417. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
  418. pars = append(pars, adminIds)
  419. } else {
  420. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  421. resp.Paging = page
  422. br.Ret = 200
  423. br.Success = true
  424. br.Msg = "获取成功"
  425. return
  426. }
  427. }
  428. params.Keywords = strings.TrimSpace(params.Keywords)
  429. // 关键词空格拆分
  430. if params.Keywords != "" {
  431. indexCodeCol := indexOb.Cols().IndexCode
  432. indexNameCol := indexOb.Cols().IndexName
  433. keywordArr := strings.Split(params.Keywords, " ")
  434. if len(keywordArr) > 1 {
  435. sliceArr := make([]string, 0)
  436. sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
  437. pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
  438. for _, v := range keywordArr {
  439. if v == ` ` || v == `` {
  440. continue
  441. }
  442. sliceArr = append(sliceArr, fmt.Sprintf(` %s LIKE ? OR %s LIKE ? `, indexCodeCol, indexNameCol))
  443. pars = utils.GetLikeKeywordPars(pars, v, 2)
  444. }
  445. cond += ` AND (` + strings.Join(sliceArr, " OR ") + `)`
  446. } else {
  447. cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, indexCodeCol, indexNameCol)
  448. pars = utils.GetLikeKeywordPars(pars, params.Keywords, 2)
  449. }
  450. }
  451. // 排序
  452. if params.SortField > 0 && params.SortType > 0 {
  453. fieldMap := map[int]string{1: indexOb.Cols().StartDate, 2: indexOb.Cols().EndDate, 3: indexOb.Cols().ModifyTime, 4: indexOb.Cols().LatestValue}
  454. typeMap := map[int]string{1: "ASC", 2: "DESC"}
  455. listOrder = fmt.Sprintf("%s %s", fieldMap[params.SortField], typeMap[params.SortType])
  456. }
  457. }
  458. // 先ES搜索出IndexIds, 再去查mysql
  459. //_, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, params.Keywords, utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, classifyIds, adminIds, frequencyArr, startSize, params.PageSize)
  460. //if e != nil {
  461. // br.Msg = "获取失败"
  462. // br.ErrMsg = fmt.Sprintf("搜索表格失败, %v", e)
  463. // return
  464. //}
  465. //if len(list) == 0 {
  466. // page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  467. // resp.Paging = page
  468. // br.Ret = 200
  469. // br.Success = true
  470. // br.Msg = "获取成功"
  471. // return
  472. //}
  473. //var indexIds []int
  474. //for _, v := range list {
  475. // indexIds = append(indexIds, v.PrimaryId)
  476. //}
  477. //cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(indexIds)))
  478. //pars = append(pars, indexIds)
  479. // 列表总计
  480. total, e := indexOb.GetCountByCondition(cond, pars)
  481. if e != nil {
  482. br.Msg = "获取失败"
  483. br.ErrMsg = fmt.Sprintf("获取指标总数失败, %v", e)
  484. return
  485. }
  486. if total <= 0 {
  487. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  488. resp.Paging = page
  489. br.Data = resp
  490. br.Ret = 200
  491. br.Success = true
  492. br.Msg = "获取成功"
  493. return
  494. }
  495. items, e := indexOb.GetPageItemsByCondition(cond, pars, []string{}, listOrder, startSize, params.PageSize)
  496. if e != nil {
  497. br.Msg = "获取失败"
  498. br.ErrMsg = fmt.Sprintf("获取指标列表失败, %v", e)
  499. return
  500. }
  501. for _, v := range items {
  502. t := v.Format2Item()
  503. // 分类完整路径
  504. classify := classifyIdItem[v.BaseFromThsHfClassifyId]
  505. levelArr := make([]string, 0)
  506. if classify != nil && classify.LevelPath != "" {
  507. arr := strings.Split(classify.LevelPath, ",")
  508. for _, a := range arr {
  509. i, _ := strconv.Atoi(a)
  510. if classifyIdItem[i] != nil {
  511. if this.Lang == utils.EnLangVersion {
  512. levelArr = append(levelArr, classifyIdItem[i].ClassifyNameEn)
  513. } else {
  514. levelArr = append(levelArr, classifyIdItem[i].ClassifyName)
  515. }
  516. }
  517. }
  518. }
  519. t.ClassifyPath = strings.Join(levelArr, "/")
  520. resp.List = append(resp.List, t)
  521. }
  522. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  523. resp.Paging = page
  524. br.Data = resp
  525. br.Ret = 200
  526. br.Success = true
  527. br.Msg = "获取成功"
  528. }
  529. // Add
  530. // @Title 新增指标
  531. // @Description 新增指标
  532. // @Param request body data_manage.ThsHfAddEdbReq true "type json string"
  533. // @Success 200 string "操作成功"
  534. // @router /ths_hf/index/add [post]
  535. func (this *BaseFromThsHfController) Add() {
  536. br := new(models.BaseResponse).Init()
  537. defer func() {
  538. if br.ErrMsg == "" {
  539. br.IsSendEmail = false
  540. }
  541. this.Data["json"] = br
  542. this.ServeJSON()
  543. }()
  544. sysUser := this.SysUser
  545. if sysUser == nil {
  546. br.Msg = "请登录"
  547. br.ErrMsg = "请登录,SysUser Is Empty"
  548. br.Ret = 408
  549. return
  550. }
  551. var params data_manage.ThsHfAddEdbReq
  552. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  553. br.Msg = "参数解析异常"
  554. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  555. return
  556. }
  557. if params.StartTime == "" {
  558. br.Msg = "请选择起始时间"
  559. return
  560. }
  561. _, e := time.ParseInLocation(utils.FormatDateTime, params.StartTime, time.Local)
  562. if e != nil {
  563. br.Msg = "起始时间格式有误"
  564. br.ErrMsg = fmt.Sprintf("起始时间格式有误, %v", e)
  565. return
  566. }
  567. if params.EndTime != "" {
  568. _, e := time.ParseInLocation(utils.FormatDateTime, params.EndTime, time.Local)
  569. if e != nil {
  570. br.Msg = "截止时间格式有误"
  571. br.ErrMsg = fmt.Sprintf("截止时间格式有误, %v", e)
  572. return
  573. }
  574. }
  575. if !utils.InArrayByInt(data_manage.ThsHfPeriodArr, params.Interval) {
  576. br.Msg = "时间周期有误"
  577. br.ErrMsg = fmt.Sprintf("时间周期有误, Interval: %d", params.Interval)
  578. return
  579. }
  580. if params.CPS != "" && !utils.InArrayByStr(data_manage.ThsHfCPSArr, params.CPS) {
  581. br.Msg = "复权方式有误"
  582. br.ErrMsg = fmt.Sprintf("复权方式有误, CPS: %s", params.CPS)
  583. return
  584. }
  585. if params.BaseDate != "" {
  586. _, e = time.ParseInLocation(utils.FormatDate, params.BaseDate, time.Local)
  587. if e != nil {
  588. br.Msg = "复权基点格式有误"
  589. br.ErrMsg = fmt.Sprintf("复权基点格式有误, %v", e)
  590. return
  591. }
  592. }
  593. if params.Fill != "" && !utils.InArrayByStr(data_manage.ThsHfFillArr, params.Fill) {
  594. br.Msg = "非交易间隔处理有误"
  595. br.ErrMsg = fmt.Sprintf("非交易间隔处理有误, Fill: %s", params.Fill)
  596. return
  597. }
  598. if len(params.IndexList) == 0 {
  599. br.Msg = "请选择指标"
  600. return
  601. }
  602. formExist := make(map[string]bool)
  603. indexNames := make([]string, 0)
  604. classifyIds := make([]int, 0)
  605. for _, v := range params.IndexList {
  606. if v.ClassifyId <= 0 {
  607. br.Msg = "请选择分类"
  608. return
  609. }
  610. if !utils.InArrayByInt(classifyIds, v.ClassifyId) {
  611. classifyIds = append(classifyIds, v.ClassifyId)
  612. }
  613. if v.Unit == "" {
  614. br.Msg = "请输入单位"
  615. return
  616. }
  617. v.IndexName = strings.TrimSpace(v.IndexName)
  618. if v.IndexName == "" {
  619. br.Msg = "请输入指标名称"
  620. return
  621. }
  622. if formExist[v.IndexName] {
  623. br.Msg = "指标名称重复, 请重新输入"
  624. return
  625. }
  626. formExist[v.IndexName] = true
  627. indexNames = append(indexNames, v.IndexName)
  628. }
  629. // 校验指标分类
  630. classifyOb := new(data_manage.BaseFromThsHfClassify)
  631. {
  632. cond := fmt.Sprintf(` AND %s IN (%s)`, classifyOb.Cols().PrimaryId, utils.GetOrmInReplace(len(classifyIds)))
  633. pars := make([]interface{}, 0)
  634. pars = append(pars, classifyIds)
  635. list, e := classifyOb.GetItemsByCondition(cond, pars, []string{classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName}, "")
  636. if e != nil {
  637. br.Msg = "操作失败"
  638. br.ErrMsg = fmt.Sprintf("查询分类失败, %v", e)
  639. return
  640. }
  641. classifyMap := make(map[int]*data_manage.BaseFromThsHfClassify)
  642. for _, v := range list {
  643. classifyMap[v.BaseFromThsHfClassifyId] = v
  644. }
  645. for _, v := range params.IndexList {
  646. t := classifyMap[v.ClassifyId]
  647. if t == nil {
  648. br.Msg = fmt.Sprintf("%s分类不存在, 请重新选择或刷新页面", t.ClassifyName)
  649. return
  650. }
  651. }
  652. }
  653. // 校验指标名称
  654. indexOb := new(data_manage.BaseFromThsHfIndex)
  655. {
  656. cond := fmt.Sprintf(` AND %s IN (%s)`, indexOb.Cols().IndexName, utils.GetOrmInReplace(len(indexNames)))
  657. pars := make([]interface{}, 0)
  658. pars = append(pars, indexNames)
  659. list, e := indexOb.GetItemsByCondition(cond, pars, []string{indexOb.Cols().IndexName}, "")
  660. if e != nil {
  661. br.Msg = "操作失败"
  662. br.ErrMsg = fmt.Sprintf("查询指标名称失败, %v", e)
  663. return
  664. }
  665. if len(list) > 0 {
  666. tips := "以下指标名称重复, 请重新输入: \n"
  667. for _, v := range list {
  668. tips += fmt.Sprintf("%s\n", v.IndexName)
  669. }
  670. br.Msg = tips
  671. return
  672. }
  673. }
  674. // 新增指标
  675. for _, v := range params.IndexList {
  676. var req data_manage.ThsHfBaseAddReq
  677. req.StartTime = params.StartTime
  678. req.EndTime = params.EndTime
  679. req.Interval = params.Interval
  680. req.Fill = params.Fill
  681. req.CPS = params.CPS
  682. req.BaseDate = params.BaseDate
  683. req.SysAdminId = sysUser.AdminId
  684. req.SysAdminName = sysUser.RealName
  685. req.ClassifyId = v.ClassifyId
  686. req.Unit = v.Unit
  687. req.IndexName = v.IndexName
  688. req.Frequency = v.Frequency
  689. req.StockCode = v.StockCode
  690. req.EdbCode = v.EdbCode
  691. _, e = data.BaseAddThsHf(req)
  692. if e != nil {
  693. utils.FileLog.Info(fmt.Sprintf("BaseAddThsHf err: %v", e))
  694. continue
  695. }
  696. }
  697. br.Ret = 200
  698. br.Success = true
  699. br.Msg = "操作成功"
  700. }
  701. // Edit
  702. // @Title 编辑指标
  703. // @Description 编辑指标
  704. // @Param request body data_manage.ThsHfIndexEditReq true "type json string"
  705. // @Success 200 string "操作成功"
  706. // @router /ths_hf/index/edit [post]
  707. func (this *BaseFromThsHfController) Edit() {
  708. br := new(models.BaseResponse).Init()
  709. defer func() {
  710. if br.ErrMsg == "" {
  711. br.IsSendEmail = false
  712. }
  713. this.Data["json"] = br
  714. this.ServeJSON()
  715. }()
  716. sysUser := this.SysUser
  717. if sysUser == nil {
  718. br.Msg = "请登录"
  719. br.ErrMsg = "请登录,SysUser Is Empty"
  720. br.Ret = 408
  721. return
  722. }
  723. var params data_manage.ThsHfIndexEditReq
  724. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  725. br.Msg = "参数解析异常"
  726. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  727. return
  728. }
  729. if params.IndexId <= 0 {
  730. br.Msg = "参数有误"
  731. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  732. return
  733. }
  734. params.IndexName = strings.TrimSpace(params.IndexName)
  735. if params.IndexName == "" {
  736. br.Msg = "请输入指标名称"
  737. return
  738. }
  739. if params.ClassifyId <= 0 {
  740. br.Msg = "请选择分类"
  741. return
  742. }
  743. params.Unit = strings.TrimSpace(params.Unit)
  744. if params.Unit == "" {
  745. br.Msg = "请输入单位"
  746. return
  747. }
  748. indexOb := new(data_manage.BaseFromThsHfIndex)
  749. item, e := indexOb.GetItemById(params.IndexId)
  750. if e != nil {
  751. if e.Error() == utils.ErrNoRow() {
  752. br.Msg = "指标不存在, 请刷新页面"
  753. return
  754. }
  755. br.Msg = "操作失败"
  756. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  757. return
  758. }
  759. classifyOb := new(data_manage.BaseFromThsHfClassify)
  760. _, e = classifyOb.GetItemById(params.ClassifyId)
  761. if e != nil {
  762. br.Msg = "分类有误"
  763. br.ErrMsg = fmt.Sprintf("分类信息有误, %v", e)
  764. return
  765. }
  766. // 重名验证
  767. {
  768. cond := fmt.Sprintf(" AND %s = ? AND %s <> ?", indexOb.Cols().IndexName, indexOb.Cols().PrimaryId)
  769. pars := make([]interface{}, 0)
  770. pars = append(pars, params.IndexName, params.IndexId)
  771. count, e := indexOb.GetCountByCondition(cond, pars)
  772. if e != nil {
  773. br.Msg = "操作失败"
  774. br.ErrMsg = fmt.Sprintf("获取重名指标失败, %v", e)
  775. return
  776. }
  777. if count > 0 {
  778. br.Msg = "指标名称已存在, 请重新输入"
  779. return
  780. }
  781. }
  782. item.IndexName = params.IndexName
  783. item.BaseFromThsHfClassifyId = params.ClassifyId
  784. item.Unit = params.Unit
  785. item.ModifyTime = time.Now().Local()
  786. updateCols := []string{item.Cols().IndexName, item.Cols().BaseFromThsHfClassifyId, item.Cols().Unit, item.Cols().ModifyTime}
  787. if e = item.Update(updateCols); e != nil {
  788. br.Msg = "操作失败"
  789. br.ErrMsg = fmt.Sprintf("更新指标信息失败, %v", e)
  790. return
  791. }
  792. br.Ret = 200
  793. br.Success = true
  794. br.Msg = "操作成功"
  795. }
  796. // Detail
  797. // @Title 详情
  798. // @Description 详情
  799. // @Param IndexId query int true "指标ID"
  800. // @Param DataDate query string false "数据日期"
  801. // @Success 200 {object} data_manage.ThsHfSearchEdbResp
  802. // @router /ths_hf/index/detail [get]
  803. func (this *BaseFromThsHfController) Detail() {
  804. br := new(models.BaseResponse).Init()
  805. defer func() {
  806. if br.ErrMsg == "" {
  807. br.IsSendEmail = false
  808. }
  809. this.Data["json"] = br
  810. this.ServeJSON()
  811. }()
  812. sysUser := this.SysUser
  813. if sysUser == nil {
  814. br.Msg = "请登录"
  815. br.ErrMsg = "请登录,SysUser Is Empty"
  816. br.Ret = 408
  817. return
  818. }
  819. indexId, _ := this.GetInt("IndexId")
  820. if indexId <= 0 {
  821. br.Msg = "参数有误"
  822. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", indexId)
  823. return
  824. }
  825. dataDate := this.GetString("DataDate")
  826. if dataDate != "" {
  827. _, e := time.Parse(utils.FormatDate, dataDate)
  828. if e != nil {
  829. br.Msg = "数据日期格式有误"
  830. br.ErrMsg = fmt.Sprintf("数据日期格式有误, DataDate: %s", dataDate)
  831. return
  832. }
  833. }
  834. indexOb := new(data_manage.BaseFromThsHfIndex)
  835. item, e := indexOb.GetItemById(indexId)
  836. if e != nil {
  837. if e.Error() == utils.ErrNoRow() {
  838. br.Msg = "指标不存在, 请刷新页面"
  839. return
  840. }
  841. br.Msg = "获取失败"
  842. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  843. return
  844. }
  845. indexItem := item.Format2Item()
  846. if item.EndDate.IsZero() {
  847. item.EndDate = time.Now()
  848. }
  849. // 默认取有数据的最新日期
  850. if dataDate == "" {
  851. dataDate = item.EndDate.Format(utils.FormatDate)
  852. }
  853. startTime := fmt.Sprintf("%s 00:00:00", dataDate)
  854. endTime := fmt.Sprintf("%s 23:59:59", dataDate)
  855. // 获取数据
  856. dataList, e := data.GetThsHfBaseIndexData(indexItem.IndexCode, startTime, endTime)
  857. if e != nil {
  858. br.Msg = "获取失败"
  859. br.ErrMsg = fmt.Sprintf("获取指标数据失败, %v", e)
  860. return
  861. }
  862. type DetailResp struct {
  863. Index *data_manage.BaseFromThsHfIndexItem
  864. DataDate string `description:"数据日期"`
  865. DataList []*data_manage.BaseFromThsHfDataItem
  866. }
  867. resp := new(DetailResp)
  868. resp.Index = indexItem
  869. resp.DataDate = dataDate
  870. resp.DataList = dataList
  871. br.Data = resp
  872. br.Ret = 200
  873. br.Success = true
  874. br.Msg = "获取成功"
  875. }
  876. // Refresh
  877. // @Title 刷新指标
  878. // @Description 刷新指标
  879. // @Param request body data_manage.ThsHfIndexOptReq true "type json string"
  880. // @Success 200 string "操作成功"
  881. // @router /ths_hf/index/refresh [post]
  882. func (this *BaseFromThsHfController) Refresh() {
  883. br := new(models.BaseResponse).Init()
  884. defer func() {
  885. if br.ErrMsg == "" {
  886. br.IsSendEmail = false
  887. }
  888. this.Data["json"] = br
  889. this.ServeJSON()
  890. }()
  891. sysUser := this.SysUser
  892. if sysUser == nil {
  893. br.Msg = "请登录"
  894. br.ErrMsg = "请登录,SysUser Is Empty"
  895. br.Ret = 408
  896. return
  897. }
  898. var params data_manage.ThsHfIndexOptReq
  899. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  900. br.Msg = "参数解析异常"
  901. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  902. return
  903. }
  904. if params.IndexId <= 0 {
  905. br.Msg = "参数有误"
  906. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  907. return
  908. }
  909. indexOb := new(data_manage.BaseFromThsHfIndex)
  910. _, e := indexOb.GetItemById(params.IndexId)
  911. if e != nil {
  912. if e.Error() == utils.ErrNoRow() {
  913. br.Msg = "指标不存在, 请刷新页面"
  914. return
  915. }
  916. br.Msg = "操作失败"
  917. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  918. return
  919. }
  920. // 指标刷新逻辑
  921. indexIds := []int{params.IndexId}
  922. _, e = data.RefreshBaseThsHfIndex(indexIds, 1)
  923. if e != nil {
  924. br.Msg = "刷新失败"
  925. br.ErrMsg = fmt.Sprintf("刷新指标失败, %v", e)
  926. return
  927. }
  928. br.Ret = 200
  929. br.Success = true
  930. br.Msg = "操作成功"
  931. }
  932. // Remove
  933. // @Title 删除指标
  934. // @Description 删除指标
  935. // @Param request body data_manage.ThsHfIndexOptReq true "type json string"
  936. // @Success 200 string "操作成功"
  937. // @router /ths_hf/index/remove [post]
  938. func (this *BaseFromThsHfController) Remove() {
  939. br := new(models.BaseResponse).Init()
  940. defer func() {
  941. if br.ErrMsg == "" {
  942. br.IsSendEmail = false
  943. }
  944. this.Data["json"] = br
  945. this.ServeJSON()
  946. }()
  947. sysUser := this.SysUser
  948. if sysUser == nil {
  949. br.Msg = "请登录"
  950. br.ErrMsg = "请登录,SysUser Is Empty"
  951. br.Ret = 408
  952. return
  953. }
  954. var params data_manage.ThsHfIndexOptReq
  955. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  956. br.Msg = "参数解析异常"
  957. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  958. return
  959. }
  960. if params.IndexId <= 0 {
  961. br.Msg = "参数有误"
  962. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  963. return
  964. }
  965. indexOb := new(data_manage.BaseFromThsHfIndex)
  966. item, e := indexOb.GetItemById(params.IndexId)
  967. if e != nil {
  968. if e.Error() == utils.ErrNoRow() {
  969. br.Ret = 200
  970. br.Success = true
  971. br.Msg = "操作成功"
  972. return
  973. }
  974. br.Msg = "操作失败"
  975. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  976. return
  977. }
  978. // 删除校验, 指标库存在不可删除
  979. edbMappingOb := new(data_manage.BaseFromEdbMapping)
  980. {
  981. cond := fmt.Sprintf(" AND %s = ?", edbMappingOb.Cols().BaseIndexCode)
  982. pars := make([]interface{}, 0)
  983. pars = append(pars, item.IndexCode)
  984. count, e := edbMappingOb.GetCountByCondition(cond, pars)
  985. if e != nil {
  986. br.Msg = "操作失败"
  987. br.ErrMsg = fmt.Sprintf("获取源指标关联失败, %v", e)
  988. return
  989. }
  990. if count > 0 {
  991. br.Msg = "指标已被引用, 不允许删除"
  992. return
  993. }
  994. }
  995. if e = item.Remove(); e != nil {
  996. br.Msg = "操作失败"
  997. br.ErrMsg = fmt.Sprintf("删除指标失败, %v", e)
  998. return
  999. }
  1000. if utils.UseMongo {
  1001. mogDataObj := mgo.BaseFromThsHfData{}
  1002. if e = mogDataObj.RemoveMany(bson.M{"index_code": item.IndexCode}); e != nil {
  1003. br.Msg = "操作失败"
  1004. br.ErrMsg = fmt.Sprintf("删除指标数据失败-Mgo, %v", e)
  1005. return
  1006. }
  1007. } else {
  1008. dataOb := new(data_manage.BaseFromThsHfData)
  1009. cond := fmt.Sprintf(" %s = ?", dataOb.Cols().BaseFromThsHfIndexId)
  1010. pars := make([]interface{}, 0)
  1011. pars = append(pars, params.IndexId)
  1012. if e = dataOb.RemoveByCondition(cond, pars); e != nil {
  1013. br.Msg = "操作失败"
  1014. br.ErrMsg = fmt.Sprintf("删除指标数据失败, %v", e)
  1015. return
  1016. }
  1017. }
  1018. // ES标记删除
  1019. go func() {
  1020. indexItem := new(dataSourceModel.SearchDataSource)
  1021. indexItem.PrimaryId = item.BaseFromThsHfIndexId
  1022. indexItem.IndexName = item.IndexName
  1023. indexItem.IndexCode = item.IndexCode
  1024. indexItem.ClassifyId = item.BaseFromThsHfClassifyId
  1025. indexItem.Source = utils.DATA_SOURCE_THS
  1026. indexItem.SubSource = utils.DATA_SUB_SOURCE_HIGH_FREQUENCY
  1027. indexItem.SourceName = "同花顺高频"
  1028. indexItem.IsDeleted = 1
  1029. indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  1030. indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, item.ModifyTime)
  1031. docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
  1032. if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
  1033. utils.FileLog.Info("同花顺高频-标记删除es失败, %v", e)
  1034. return
  1035. }
  1036. }()
  1037. br.Ret = 200
  1038. br.Success = true
  1039. br.Msg = "操作成功"
  1040. }
  1041. // ListChoice
  1042. // @Title 列表选择
  1043. // @Description 列表选择
  1044. // @Param request body data_manage.ThsHfIndexMultiOptReq true "type json string"
  1045. // @Success 200 string "获取成功"
  1046. // @router /ths_hf/index/list_choice [get]
  1047. func (this *BaseFromThsHfController) ListChoice() {
  1048. br := new(models.BaseResponse).Init()
  1049. defer func() {
  1050. if br.ErrMsg == "" {
  1051. br.IsSendEmail = false
  1052. }
  1053. this.Data["json"] = br
  1054. this.ServeJSON()
  1055. }()
  1056. sysUser := this.SysUser
  1057. if sysUser == nil {
  1058. br.Msg = "请登录"
  1059. br.ErrMsg = "请登录,SysUser Is Empty"
  1060. br.Ret = 408
  1061. return
  1062. }
  1063. var params data_manage.ThsHfIndexListChoiceReq
  1064. if e := this.ParseForm(&params); e != nil {
  1065. br.Msg = "参数解析失败"
  1066. br.ErrMsg = fmt.Sprintf("参数解析失败, err: %v", e)
  1067. return
  1068. }
  1069. var listIds []int
  1070. if params.ListIds != "" {
  1071. strArr := strings.Split(params.ListIds, ",")
  1072. for _, v := range strArr {
  1073. t, _ := strconv.Atoi(v)
  1074. if t > 0 {
  1075. listIds = append(listIds, t)
  1076. }
  1077. }
  1078. }
  1079. var (
  1080. cond string
  1081. pars []interface{}
  1082. )
  1083. indexOb := new(data_manage.BaseFromThsHfIndex)
  1084. resp := make([]*data_manage.ThsHfIndexListChoiceItem, 0)
  1085. // 非列表全选
  1086. if !params.SelectAll {
  1087. if len(listIds) > 0 {
  1088. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(listIds)))
  1089. pars = append(pars, listIds)
  1090. }
  1091. }
  1092. // 列表全选, 根据条件筛选列表并过滤params.ListIds中选择的ID
  1093. if params.SelectAll {
  1094. // 查询所有分类-分类查询用
  1095. classifyOb := new(data_manage.BaseFromThsHfClassify)
  1096. classifies := make([]*data_manage.BaseFromThsHfClassify, 0)
  1097. classifyIdItem := make(map[int]*data_manage.BaseFromThsHfClassify)
  1098. {
  1099. list, e := classifyOb.GetItemsByCondition(``, make([]interface{}, 0), []string{classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName, classifyOb.Cols().ClassifyNameEn, classifyOb.Cols().LevelPath}, "")
  1100. if e != nil {
  1101. br.Msg = "获取失败"
  1102. br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
  1103. return
  1104. }
  1105. for _, v := range list {
  1106. classifyIdItem[v.BaseFromThsHfClassifyId] = v
  1107. }
  1108. classifies = list
  1109. }
  1110. // 筛选项
  1111. if params.ClassifyId != "" {
  1112. classifyIdArr := strings.Split(params.ClassifyId, ",")
  1113. classifyIds := make([]int, 0)
  1114. for _, v := range classifyIdArr {
  1115. t, _ := strconv.Atoi(v)
  1116. if t > 0 {
  1117. classifyIds = append(classifyIds, t)
  1118. }
  1119. }
  1120. // 不包含子分类
  1121. if len(classifyIds) > 0 && !params.IncludeChild {
  1122. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
  1123. pars = append(pars, classifyIds)
  1124. }
  1125. // 包含子分类
  1126. if len(classifyIds) > 0 && params.IncludeChild {
  1127. queryClassifyIds := make([]int, 0)
  1128. queryClassifyExist := make(map[int]bool)
  1129. for _, v := range classifyIds {
  1130. // 遍历所有分类从LevelPath中找含有查询分类ID的...=_=!
  1131. for _, cv := range classifies {
  1132. if queryClassifyExist[cv.BaseFromThsHfClassifyId] {
  1133. continue
  1134. }
  1135. if cv.LevelPath == "" {
  1136. continue
  1137. }
  1138. strArr := strings.Split(cv.LevelPath, ",")
  1139. if len(strArr) == 0 {
  1140. continue
  1141. }
  1142. for _, sv := range strArr {
  1143. tv, _ := strconv.Atoi(sv)
  1144. if tv == v {
  1145. queryClassifyIds = append(queryClassifyIds, cv.BaseFromThsHfClassifyId)
  1146. queryClassifyExist[cv.BaseFromThsHfClassifyId] = true
  1147. break
  1148. }
  1149. }
  1150. }
  1151. }
  1152. if len(queryClassifyIds) == 0 {
  1153. br.Data = resp
  1154. br.Ret = 200
  1155. br.Success = true
  1156. br.Msg = "获取成功"
  1157. return
  1158. }
  1159. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(queryClassifyIds)))
  1160. pars = append(pars, queryClassifyIds)
  1161. }
  1162. }
  1163. if params.Frequency != "" {
  1164. frequencyArr := strings.Split(params.Frequency, ",")
  1165. if len(frequencyArr) > 0 {
  1166. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().Frequency, utils.GetOrmInReplace(len(frequencyArr)))
  1167. pars = append(pars, frequencyArr)
  1168. }
  1169. }
  1170. if params.SysAdminId != "" {
  1171. adminIdArr := strings.Split(params.SysAdminId, ",")
  1172. adminIds := make([]int, 0)
  1173. for _, v := range adminIdArr {
  1174. t, _ := strconv.Atoi(v)
  1175. if t > 0 {
  1176. adminIds = append(adminIds, t)
  1177. }
  1178. }
  1179. if len(adminIds) > 0 {
  1180. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
  1181. pars = append(pars, adminIds)
  1182. }
  1183. }
  1184. params.Keywords = strings.TrimSpace(params.Keywords)
  1185. if params.Keywords != "" {
  1186. cond += fmt.Sprintf(" AND (%s LIKE ? OR %s LIKE ?)", indexOb.Cols().IndexCode, indexOb.Cols().IndexName)
  1187. kw := fmt.Sprint("%", params.Keywords, "%")
  1188. pars = append(pars, kw, kw)
  1189. }
  1190. // 过滤掉选择的指标
  1191. if len(listIds) > 0 {
  1192. cond += fmt.Sprintf(" AND %s NOT IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(listIds)))
  1193. pars = append(pars, listIds)
  1194. }
  1195. }
  1196. fields := []string{indexOb.Cols().PrimaryId, indexOb.Cols().IndexCode, indexOb.Cols().IndexName}
  1197. list, e := indexOb.GetItemsByCondition(cond, pars, fields, "")
  1198. if e != nil {
  1199. br.Msg = "获取失败"
  1200. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  1201. return
  1202. }
  1203. if len(list) > 500 {
  1204. br.Msg = "选择指标超过500个, 请重新选择"
  1205. return
  1206. }
  1207. for _, v := range list {
  1208. resp = append(resp, &data_manage.ThsHfIndexListChoiceItem{
  1209. IndexId: v.BaseFromThsHfIndexId,
  1210. IndexCode: v.IndexCode,
  1211. IndexName: v.IndexName,
  1212. })
  1213. }
  1214. br.Data = resp
  1215. br.Ret = 200
  1216. br.Success = true
  1217. br.Msg = "获取成功"
  1218. }
  1219. // MultiOpt
  1220. // @Title 批量操作-移动分类/删除/刷新
  1221. // @Description 批量操作-移动分类/删除/刷新
  1222. // @Param request body data_manage.ThsHfIndexMultiOptReq true "type json string"
  1223. // @Success 200 string "操作成功"
  1224. // @router /ths_hf/index/multi_opt [post]
  1225. func (this *BaseFromThsHfController) MultiOpt() {
  1226. br := new(models.BaseResponse).Init()
  1227. defer func() {
  1228. if br.ErrMsg == "" {
  1229. br.IsSendEmail = false
  1230. }
  1231. this.Data["json"] = br
  1232. this.ServeJSON()
  1233. }()
  1234. sysUser := this.SysUser
  1235. if sysUser == nil {
  1236. br.Msg = "请登录"
  1237. br.ErrMsg = "请登录,SysUser Is Empty"
  1238. br.Ret = 408
  1239. return
  1240. }
  1241. var params data_manage.ThsHfIndexMultiOptReq
  1242. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1243. br.Msg = "参数解析异常"
  1244. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1245. return
  1246. }
  1247. if !utils.InArrayByInt([]int{1, 2, 3}, params.OptType) {
  1248. br.Msg = "请选择操作类型"
  1249. return
  1250. }
  1251. if len(params.IndexIds) == 0 {
  1252. br.Msg = "请选择指标"
  1253. return
  1254. }
  1255. if params.OptType == 1 && params.MoveClassifyId <= 0 {
  1256. br.Msg = "请选择分类"
  1257. return
  1258. }
  1259. if params.OptType == 3 && !utils.InArrayByInt([]int{1, 2}, params.RefreshType) {
  1260. br.Msg = "请选择刷新方式"
  1261. return
  1262. }
  1263. resp := new(data_manage.ThsHfIndexMultiOptResp)
  1264. // 指标名称
  1265. indexOb := new(data_manage.BaseFromThsHfIndex)
  1266. indexMap := make(map[int]*data_manage.BaseFromThsHfIndex)
  1267. {
  1268. cond := fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(params.IndexIds)))
  1269. pars := make([]interface{}, 0)
  1270. pars = append(pars, params.IndexIds)
  1271. list, e := indexOb.GetItemsByCondition(cond, pars, []string{indexOb.Cols().PrimaryId, indexOb.Cols().IndexCode, indexOb.Cols().IndexName}, "")
  1272. if e != nil {
  1273. br.Msg = "删除失败"
  1274. br.ErrMsg = fmt.Sprintf("获取源指标列表失败, %v", e)
  1275. return
  1276. }
  1277. for _, v := range list {
  1278. indexMap[v.BaseFromThsHfIndexId] = v
  1279. }
  1280. }
  1281. // 批量移动
  1282. if params.OptType == 1 {
  1283. if e := indexOb.UpdateClassifyMulti(params.IndexIds, params.MoveClassifyId); e != nil {
  1284. br.Msg = "移动失败"
  1285. br.ErrMsg = fmt.Sprintf("批量移动分类失败, %v", e)
  1286. return
  1287. }
  1288. }
  1289. // 批量删除
  1290. if params.OptType == 2 {
  1291. // 被引用的指标需要提示出来, 未被引用的直接删除
  1292. usedIndexIds := make([]int, 0)
  1293. {
  1294. edbMappingOb := new(data_manage.BaseFromEdbMapping)
  1295. cond := fmt.Sprintf(" AND %s IN (%s)", edbMappingOb.Cols().BaseFromIndexId, utils.GetOrmInReplace(len(params.IndexIds)))
  1296. pars := make([]interface{}, 0)
  1297. pars = append(pars, params.IndexIds)
  1298. list, e := edbMappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  1299. if e != nil {
  1300. br.Msg = "删除失败"
  1301. br.ErrMsg = fmt.Sprintf("获取源指标关联失败, %v", e)
  1302. return
  1303. }
  1304. for _, v := range list {
  1305. if !utils.InArrayByInt(usedIndexIds, v.BaseFromIndexId) {
  1306. usedIndexIds = append(usedIndexIds, v.BaseFromIndexId)
  1307. }
  1308. }
  1309. }
  1310. // 可删除的指标
  1311. removeIndexIds := params.IndexIds
  1312. if len(usedIndexIds) > 0 {
  1313. removeIndexIds = utils.MinusInt(params.IndexIds, usedIndexIds)
  1314. // 标记不允许删除的
  1315. for _, v := range usedIndexIds {
  1316. t := indexMap[v]
  1317. if t == nil {
  1318. continue
  1319. }
  1320. resp.Fail = append(resp.Fail, &data_manage.ThsHfIndexBaseInfo{
  1321. IndexId: v,
  1322. IndexCode: t.IndexCode,
  1323. IndexName: t.IndexName,
  1324. })
  1325. }
  1326. }
  1327. if len(removeIndexIds) > 0 {
  1328. if e := indexOb.MultiRemove(removeIndexIds); e != nil {
  1329. br.Msg = "删除失败"
  1330. br.ErrMsg = fmt.Sprintf("批量删除指标失败, %v", e)
  1331. return
  1332. }
  1333. if utils.UseMongo {
  1334. mogDataObj := mgo.BaseFromThsHfData{}
  1335. for _, v := range removeIndexIds {
  1336. if e := mogDataObj.RemoveMany(bson.M{"base_from_ths_hf_index_id": v}); e != nil {
  1337. br.Msg = "操作失败"
  1338. br.ErrMsg = fmt.Sprintf("批量删除指标数据失败-Mgo, %v", e)
  1339. return
  1340. }
  1341. }
  1342. } else {
  1343. dataOb := new(data_manage.BaseFromThsHfData)
  1344. cond := fmt.Sprintf(" %s IN (%s)", dataOb.Cols().BaseFromThsHfIndexId, utils.GetOrmInReplace(len(removeIndexIds)))
  1345. pars := make([]interface{}, 0)
  1346. pars = append(pars, removeIndexIds)
  1347. if e := dataOb.RemoveByCondition(cond, pars); e != nil {
  1348. br.Msg = "删除失败"
  1349. br.ErrMsg = fmt.Sprintf("批量删除指标数据失败, %v", e)
  1350. return
  1351. }
  1352. }
  1353. // 标记删除成功的
  1354. for _, v := range removeIndexIds {
  1355. t := indexMap[v]
  1356. if t == nil {
  1357. continue
  1358. }
  1359. resp.Success = append(resp.Success, &data_manage.ThsHfIndexBaseInfo{
  1360. IndexId: v,
  1361. IndexCode: t.IndexCode,
  1362. IndexName: t.IndexName,
  1363. })
  1364. }
  1365. }
  1366. }
  1367. // 批量刷新
  1368. if params.OptType == 3 {
  1369. isAsync, e := data.RefreshBaseThsHfIndex(params.IndexIds, params.RefreshType)
  1370. if e != nil {
  1371. br.Msg = "刷新失败"
  1372. br.ErrMsg = fmt.Sprintf("批量刷新指标失败, %v", e)
  1373. return
  1374. }
  1375. if isAsync {
  1376. br.Ret = 200
  1377. br.Success = true
  1378. br.Msg = "操作成功, 刷新指标较多, 请10分钟后查看"
  1379. return
  1380. }
  1381. }
  1382. br.Data = resp
  1383. br.Ret = 200
  1384. br.Success = true
  1385. br.Msg = "操作成功"
  1386. }
  1387. // Save2EdbPre
  1388. // @Title 批量新增指标库-前置
  1389. // @Description 批量新增指标库-前置
  1390. // @Param request body data_manage.ThsHfIndexMultiSave2EdbReq true "type json string"
  1391. // @Success 200 string "操作成功"
  1392. // @router /ths_hf/index/save2edb_pre [post]
  1393. func (this *BaseFromThsHfController) Save2EdbPre() {
  1394. br := new(models.BaseResponse).Init()
  1395. defer func() {
  1396. if br.ErrMsg == "" {
  1397. br.IsSendEmail = false
  1398. }
  1399. this.Data["json"] = br
  1400. this.ServeJSON()
  1401. }()
  1402. sysUser := this.SysUser
  1403. if sysUser == nil {
  1404. br.Msg = "请登录"
  1405. br.ErrMsg = "请登录,SysUser Is Empty"
  1406. br.Ret = 408
  1407. return
  1408. }
  1409. var params data_manage.ThsHfIndexMultiSave2EdbPreReq
  1410. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1411. br.Msg = "参数解析异常"
  1412. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1413. return
  1414. }
  1415. if len(params.IndexIds) == 0 {
  1416. br.Msg = "请选择指标"
  1417. return
  1418. }
  1419. convertRule := params.ConvertRule
  1420. if convertRule.ConvertType != 1 && convertRule.ConvertType != 2 {
  1421. br.Msg = "请选择数据转换方式"
  1422. return
  1423. }
  1424. // 生成的指标名称后缀
  1425. var (
  1426. suffixName string
  1427. startTimeCn string
  1428. endTimeCn string
  1429. calculateCn string
  1430. )
  1431. dayMap := map[int]string{1: "当日", 2: "前日"}
  1432. calculateMap := map[int]string{1: "均值", 2: "最大值", 3: "最小值"}
  1433. if convertRule.ConvertType == 1 {
  1434. if convertRule.ConvertFixed.FixedDay != 1 && convertRule.ConvertFixed.FixedDay != 2 {
  1435. br.Msg = "请选择指定时间"
  1436. return
  1437. }
  1438. if convertRule.ConvertFixed.FixedTime == "" {
  1439. br.Msg = "请选择指定时间"
  1440. return
  1441. }
  1442. timePrefix := time.Now().Local().Format(utils.FormatDate)
  1443. st := fmt.Sprintf("%s %s", timePrefix, convertRule.ConvertFixed.FixedTime)
  1444. startTime, e := time.Parse(utils.FormatDateTime, st)
  1445. if e != nil {
  1446. br.Msg = "指定时间格式有误"
  1447. return
  1448. }
  1449. startTimeCn = fmt.Sprintf("%s%s", dayMap[convertRule.ConvertFixed.FixedDay], startTime.Format("15点04"))
  1450. }
  1451. if convertRule.ConvertType == 2 {
  1452. if convertRule.ConvertArea.StartDay != 1 && convertRule.ConvertArea.StartDay != 2 {
  1453. br.Msg = "请选择起始时间"
  1454. return
  1455. }
  1456. if convertRule.ConvertArea.StartTime == "" {
  1457. br.Msg = "请选择起始时间"
  1458. return
  1459. }
  1460. var startTimePre string
  1461. if convertRule.ConvertArea.StartDay == 1 {
  1462. startTimePre = time.Now().Local().Format(utils.FormatDate)
  1463. }
  1464. if convertRule.ConvertArea.StartDay == 2 {
  1465. startTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1466. }
  1467. st := fmt.Sprintf("%s %s", startTimePre, convertRule.ConvertArea.StartTime)
  1468. startTime, e := time.Parse(utils.FormatDateTime, st)
  1469. if e != nil {
  1470. br.Msg = "起始时间格式有误"
  1471. return
  1472. }
  1473. startTimeCn = fmt.Sprintf("%s%s", dayMap[convertRule.ConvertArea.StartDay], startTime.Format("15点04"))
  1474. if convertRule.ConvertArea.EndDay != 1 && convertRule.ConvertArea.EndDay != 2 {
  1475. br.Msg = "请选择截止时间"
  1476. return
  1477. }
  1478. if convertRule.ConvertArea.EndTime == "" {
  1479. br.Msg = "请选择截止时间"
  1480. return
  1481. }
  1482. var endTimePre string
  1483. if convertRule.ConvertArea.EndDay == 1 {
  1484. endTimePre = time.Now().Local().Format(utils.FormatDate)
  1485. }
  1486. if convertRule.ConvertArea.EndDay == 2 {
  1487. endTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1488. }
  1489. ed := fmt.Sprintf("%s %s", endTimePre, convertRule.ConvertArea.EndTime)
  1490. endTime, e := time.Parse(utils.FormatDateTime, ed)
  1491. if e != nil {
  1492. br.Msg = "截止时间格式有误"
  1493. return
  1494. }
  1495. endTimeCn = fmt.Sprintf("至%s%s", dayMap[convertRule.ConvertArea.EndDay], endTime.Format("15点04"))
  1496. if startTime.After(endTime) {
  1497. br.Msg = "起始日期不可早于截止日期"
  1498. return
  1499. }
  1500. calculateCn = calculateMap[convertRule.ConvertArea.CalculateType]
  1501. }
  1502. suffixName = fmt.Sprint(startTimeCn, endTimeCn, calculateCn)
  1503. // 查询指标
  1504. indexOb := new(data_manage.BaseFromThsHfIndex)
  1505. cond := fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(params.IndexIds)))
  1506. pars := make([]interface{}, 0)
  1507. pars = append(pars, params.IndexIds)
  1508. list, e := indexOb.GetItemsByCondition(cond, pars, []string{}, "")
  1509. if e != nil {
  1510. br.Msg = "获取失败"
  1511. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  1512. return
  1513. }
  1514. resp := make([]*data_manage.ThsHfIndexMultiSave2EdbPreItem, 0)
  1515. for _, v := range list {
  1516. t := new(data_manage.ThsHfIndexMultiSave2EdbPreItem)
  1517. t.IndexId = v.BaseFromThsHfIndexId
  1518. t.IndexCode = v.IndexCode
  1519. t.IndexName = v.IndexName
  1520. edbCn := data_manage.ThsHfEdbCodeCn[v.Indicator]
  1521. if edbCn == "" {
  1522. edbCn = v.Indicator
  1523. }
  1524. t.NewIndexName = fmt.Sprint(v.StockCode, v.Frequency, edbCn, suffixName)
  1525. t.StockCode = v.StockCode
  1526. t.EdbCode = v.Indicator
  1527. t.Unit = v.Unit
  1528. t.Frequency = v.Frequency
  1529. t.NewFrequency = "日度"
  1530. resp = append(resp, t)
  1531. }
  1532. br.Data = resp
  1533. br.Ret = 200
  1534. br.Success = true
  1535. br.Msg = "获取成功"
  1536. }
  1537. // Save2Edb
  1538. // @Title 批量新增指标库
  1539. // @Description 批量新增指标库
  1540. // @Param request body data_manage.ThsHfIndexMultiSave2EdbReq true "type json string"
  1541. // @Success 200 string "操作成功"
  1542. // @router /ths_hf/index/save2edb [post]
  1543. func (this *BaseFromThsHfController) Save2Edb() {
  1544. br := new(models.BaseResponse).Init()
  1545. defer func() {
  1546. if br.ErrMsg == "" {
  1547. br.IsSendEmail = false
  1548. }
  1549. this.Data["json"] = br
  1550. this.ServeJSON()
  1551. }()
  1552. sysUser := this.SysUser
  1553. if sysUser == nil {
  1554. br.Msg = "请登录"
  1555. br.ErrMsg = "请登录,SysUser Is Empty"
  1556. br.Ret = 408
  1557. return
  1558. }
  1559. var params data_manage.ThsHfIndexMultiSave2EdbReq
  1560. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1561. br.Msg = "参数解析异常"
  1562. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1563. return
  1564. }
  1565. if len(params.NewIndexes) == 0 {
  1566. br.Msg = "请选择指标"
  1567. return
  1568. }
  1569. convertRule := params.ConvertRule
  1570. if convertRule.ConvertType != 1 && convertRule.ConvertType != 2 {
  1571. br.Msg = "请选择数据转换方式"
  1572. return
  1573. }
  1574. if convertRule.ConvertType == 1 {
  1575. if convertRule.ConvertFixed.FixedDay != 1 && convertRule.ConvertFixed.FixedDay != 2 {
  1576. br.Msg = "请选择指定时间"
  1577. return
  1578. }
  1579. if convertRule.ConvertFixed.FixedTime == "" {
  1580. br.Msg = "请选择指定时间"
  1581. return
  1582. }
  1583. timePrefix := time.Now().Local().Format(utils.FormatDate)
  1584. st := fmt.Sprintf("%s %s", timePrefix, convertRule.ConvertFixed.FixedTime)
  1585. _, e := time.Parse(utils.FormatDateTime, st)
  1586. if e != nil {
  1587. br.Msg = "指定时间格式有误"
  1588. return
  1589. }
  1590. }
  1591. if convertRule.ConvertType == 2 {
  1592. if convertRule.ConvertArea.StartDay != 1 && convertRule.ConvertArea.StartDay != 2 {
  1593. br.Msg = "请选择起始时间"
  1594. return
  1595. }
  1596. if convertRule.ConvertArea.StartTime == "" {
  1597. br.Msg = "请选择起始时间"
  1598. return
  1599. }
  1600. var startTimePre string
  1601. if convertRule.ConvertArea.StartDay == 1 {
  1602. startTimePre = time.Now().Local().Format(utils.FormatDate)
  1603. }
  1604. if convertRule.ConvertArea.StartDay == 2 {
  1605. startTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1606. }
  1607. st := fmt.Sprintf("%s %s", startTimePre, convertRule.ConvertArea.StartTime)
  1608. startTime, e := time.Parse(utils.FormatDateTime, st)
  1609. if e != nil {
  1610. br.Msg = "起始时间格式有误"
  1611. return
  1612. }
  1613. if convertRule.ConvertArea.EndDay != 1 && convertRule.ConvertArea.EndDay != 2 {
  1614. br.Msg = "请选择截止时间"
  1615. return
  1616. }
  1617. if convertRule.ConvertArea.EndTime == "" {
  1618. br.Msg = "请选择截止时间"
  1619. return
  1620. }
  1621. var endTimePre string
  1622. if convertRule.ConvertArea.EndDay == 1 {
  1623. endTimePre = time.Now().Local().Format(utils.FormatDate)
  1624. }
  1625. if convertRule.ConvertArea.EndDay == 2 {
  1626. endTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1627. }
  1628. ed := fmt.Sprintf("%s %s", endTimePre, convertRule.ConvertArea.EndTime)
  1629. endTime, e := time.Parse(utils.FormatDateTime, ed)
  1630. if e != nil {
  1631. br.Msg = "截止时间格式有误"
  1632. return
  1633. }
  1634. if startTime.After(endTime) {
  1635. br.Msg = "起始日期不可早于截止日期"
  1636. return
  1637. }
  1638. }
  1639. resp := new(data_manage.ThsHfIndexMultiSave2EdbResp)
  1640. // 判断指标名称是否重复
  1641. edbNameExist := make(map[string]bool)
  1642. {
  1643. items, e := data_manage.GetEdbInfoFieldList(``, make([]interface{}, 0), []string{"edb_name"})
  1644. if e != nil {
  1645. br.Msg = "操作失败"
  1646. br.ErrMsg = fmt.Sprintf("获取指标名称列表失败, %v", e)
  1647. return
  1648. }
  1649. for _, v := range items {
  1650. edbNameExist[v.EdbName] = true
  1651. }
  1652. }
  1653. for _, v := range params.NewIndexes {
  1654. if edbNameExist[v.NewIndexName] {
  1655. resp.Exist = append(resp.Exist, v)
  1656. }
  1657. }
  1658. if len(resp.Exist) > 0 {
  1659. br.Data = resp
  1660. br.Ret = 200
  1661. br.Success = true
  1662. br.Msg = "含重复指标名称"
  1663. return
  1664. }
  1665. // 请求指标库新增
  1666. for _, v := range params.NewIndexes {
  1667. var r data_manage.ThsHfIndexMultiSave2EdbLibReq
  1668. r.ConvertRule = convertRule
  1669. v.SysAdminId = sysUser.AdminId
  1670. v.SysAdminName = sysUser.RealName
  1671. r.NewIndex = v
  1672. b, e := json.Marshal(r)
  1673. if e != nil {
  1674. v.Tips = "新增失败"
  1675. v.ErrMsg = e.Error()
  1676. resp.Fail = append(resp.Fail, v)
  1677. continue
  1678. }
  1679. res, e := data.AddBaseEdbInfo(string(b), utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, this.Lang)
  1680. if e != nil {
  1681. v.Tips = "新增失败"
  1682. v.ErrMsg = fmt.Sprintf("AddBaseEdbInfo, err: %v", e)
  1683. resp.Fail = append(resp.Fail, v)
  1684. continue
  1685. }
  1686. if res.Ret != 200 {
  1687. v.Tips = res.Msg
  1688. v.ErrMsg = fmt.Sprintf("AddBaseEdbInfo, Ret: %d, ErrMsg: %s", res.Ret, res.ErrMsg)
  1689. resp.Fail = append(resp.Fail, v)
  1690. continue
  1691. }
  1692. v.Tips = "新增成功"
  1693. resp.Success = append(resp.Success, v)
  1694. }
  1695. br.Data = resp
  1696. br.Ret = 200
  1697. br.Success = true
  1698. br.Msg = "操作成功"
  1699. }