base_from_ths_hf.go 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755
  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. //}
  398. frequencyArr = strings.Split(params.Frequency, ",")
  399. }
  400. if params.SysAdminId != "" {
  401. adminIdArr := strings.Split(params.SysAdminId, ",")
  402. //adminIds := make([]int, 0)
  403. for _, v := range adminIdArr {
  404. t, _ := strconv.Atoi(v)
  405. if t > 0 {
  406. adminIds = append(adminIds, t)
  407. }
  408. }
  409. //if len(adminIds) > 0 {
  410. // cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
  411. // pars = append(pars, adminIds)
  412. //}
  413. }
  414. params.Keywords = strings.TrimSpace(params.Keywords)
  415. //if params.Keywords != "" {
  416. // cond += fmt.Sprintf(" AND (%s LIKE ? OR %s LIKE ?)", indexOb.Cols().IndexCode, indexOb.Cols().IndexName)
  417. // kw := fmt.Sprint("%", params.Keywords, "%")
  418. // pars = append(pars, kw, kw)
  419. //}
  420. // 排序
  421. if params.SortField > 0 && params.SortType > 0 {
  422. fieldMap := map[int]string{1: indexOb.Cols().StartDate, 2: indexOb.Cols().EndDate, 3: indexOb.Cols().ModifyTime, 4: indexOb.Cols().LatestValue}
  423. typeMap := map[int]string{1: "ASC", 2: "DESC"}
  424. listOrder = fmt.Sprintf("%s %s", fieldMap[params.SortField], typeMap[params.SortType])
  425. }
  426. }
  427. // 先ES搜索出IndexIds, 再去查mysql(别问为啥要这么干,因为强行要es分词搜=_=!)
  428. _, list, e := elastic.SearchDataSourceIndex(utils.EsDataSourceIndexName, params.Keywords, utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, classifyIds, adminIds, frequencyArr, startSize, params.PageSize)
  429. if e != nil {
  430. br.Msg = "获取失败"
  431. br.ErrMsg = fmt.Sprintf("搜索表格失败, %v", e)
  432. return
  433. }
  434. if len(list) == 0 {
  435. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  436. resp.Paging = page
  437. br.Ret = 200
  438. br.Success = true
  439. br.Msg = "获取成功"
  440. return
  441. }
  442. var indexIds []int
  443. for _, v := range list {
  444. indexIds = append(indexIds, v.PrimaryId)
  445. }
  446. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(indexIds)))
  447. pars = append(pars, indexIds)
  448. // 列表总计
  449. total, e := indexOb.GetCountByCondition(cond, pars)
  450. if e != nil {
  451. br.Msg = "获取失败"
  452. br.ErrMsg = fmt.Sprintf("获取指标总数失败, %v", e)
  453. return
  454. }
  455. if total <= 0 {
  456. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  457. resp.Paging = page
  458. br.Data = resp
  459. br.Ret = 200
  460. br.Success = true
  461. br.Msg = "获取成功"
  462. return
  463. }
  464. items, e := indexOb.GetPageItemsByCondition(cond, pars, []string{}, listOrder, startSize, params.PageSize)
  465. if e != nil {
  466. br.Msg = "获取失败"
  467. br.ErrMsg = fmt.Sprintf("获取指标列表失败, %v", e)
  468. return
  469. }
  470. for _, v := range items {
  471. t := v.Format2Item()
  472. // 分类完整路径
  473. classify := classifyIdItem[v.BaseFromThsHfClassifyId]
  474. levelArr := make([]string, 0)
  475. if classify != nil && classify.LevelPath != "" {
  476. arr := strings.Split(classify.LevelPath, ",")
  477. for _, a := range arr {
  478. i, _ := strconv.Atoi(a)
  479. if classifyIdItem[i] != nil {
  480. if this.Lang == utils.EnLangVersion {
  481. levelArr = append(levelArr, classifyIdItem[i].ClassifyNameEn)
  482. } else {
  483. levelArr = append(levelArr, classifyIdItem[i].ClassifyName)
  484. }
  485. }
  486. }
  487. }
  488. t.ClassifyPath = strings.Join(levelArr, "/")
  489. resp.List = append(resp.List, t)
  490. }
  491. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  492. resp.Paging = page
  493. br.Data = resp
  494. br.Ret = 200
  495. br.Success = true
  496. br.Msg = "获取成功"
  497. }
  498. // Add
  499. // @Title 新增指标
  500. // @Description 新增指标
  501. // @Param request body data_manage.ThsHfAddEdbReq true "type json string"
  502. // @Success 200 string "操作成功"
  503. // @router /ths_hf/index/add [post]
  504. func (this *BaseFromThsHfController) Add() {
  505. br := new(models.BaseResponse).Init()
  506. defer func() {
  507. if br.ErrMsg == "" {
  508. br.IsSendEmail = false
  509. }
  510. this.Data["json"] = br
  511. this.ServeJSON()
  512. }()
  513. sysUser := this.SysUser
  514. if sysUser == nil {
  515. br.Msg = "请登录"
  516. br.ErrMsg = "请登录,SysUser Is Empty"
  517. br.Ret = 408
  518. return
  519. }
  520. var params data_manage.ThsHfAddEdbReq
  521. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  522. br.Msg = "参数解析异常"
  523. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  524. return
  525. }
  526. if params.StartTime == "" {
  527. br.Msg = "请选择起始时间"
  528. return
  529. }
  530. _, e := time.ParseInLocation(utils.FormatDateTime, params.StartTime, time.Local)
  531. if e != nil {
  532. br.Msg = "起始时间格式有误"
  533. br.ErrMsg = fmt.Sprintf("起始时间格式有误, %v", e)
  534. return
  535. }
  536. if params.EndTime != "" {
  537. _, e := time.ParseInLocation(utils.FormatDateTime, params.EndTime, time.Local)
  538. if e != nil {
  539. br.Msg = "截止时间格式有误"
  540. br.ErrMsg = fmt.Sprintf("截止时间格式有误, %v", e)
  541. return
  542. }
  543. }
  544. if !utils.InArrayByInt(data_manage.ThsHfPeriodArr, params.Interval) {
  545. br.Msg = "时间周期有误"
  546. br.ErrMsg = fmt.Sprintf("时间周期有误, Interval: %d", params.Interval)
  547. return
  548. }
  549. if params.CPS != "" && !utils.InArrayByStr(data_manage.ThsHfCPSArr, params.CPS) {
  550. br.Msg = "复权方式有误"
  551. br.ErrMsg = fmt.Sprintf("复权方式有误, CPS: %s", params.CPS)
  552. return
  553. }
  554. if params.BaseDate != "" {
  555. _, e = time.ParseInLocation(utils.FormatDate, params.BaseDate, time.Local)
  556. if e != nil {
  557. br.Msg = "复权基点格式有误"
  558. br.ErrMsg = fmt.Sprintf("复权基点格式有误, %v", e)
  559. return
  560. }
  561. }
  562. if params.Fill != "" && !utils.InArrayByStr(data_manage.ThsHfFillArr, params.Fill) {
  563. br.Msg = "非交易间隔处理有误"
  564. br.ErrMsg = fmt.Sprintf("非交易间隔处理有误, Fill: %s", params.Fill)
  565. return
  566. }
  567. if len(params.IndexList) == 0 {
  568. br.Msg = "请选择指标"
  569. return
  570. }
  571. formExist := make(map[string]bool)
  572. indexNames := make([]string, 0)
  573. classifyIds := make([]int, 0)
  574. for _, v := range params.IndexList {
  575. if v.ClassifyId <= 0 {
  576. br.Msg = "请选择分类"
  577. return
  578. }
  579. if !utils.InArrayByInt(classifyIds, v.ClassifyId) {
  580. classifyIds = append(classifyIds, v.ClassifyId)
  581. }
  582. if v.Unit == "" {
  583. br.Msg = "请输入单位"
  584. return
  585. }
  586. v.IndexName = strings.TrimSpace(v.IndexName)
  587. if v.IndexName == "" {
  588. br.Msg = "请输入指标名称"
  589. return
  590. }
  591. if formExist[v.IndexName] {
  592. br.Msg = "指标名称重复, 请重新输入"
  593. return
  594. }
  595. formExist[v.IndexName] = true
  596. indexNames = append(indexNames, v.IndexName)
  597. }
  598. // 校验指标分类
  599. classifyOb := new(data_manage.BaseFromThsHfClassify)
  600. {
  601. cond := fmt.Sprintf(` AND %s IN (%s)`, classifyOb.Cols().PrimaryId, utils.GetOrmInReplace(len(classifyIds)))
  602. pars := make([]interface{}, 0)
  603. pars = append(pars, classifyIds)
  604. list, e := classifyOb.GetItemsByCondition(cond, pars, []string{classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName}, "")
  605. if e != nil {
  606. br.Msg = "操作失败"
  607. br.ErrMsg = fmt.Sprintf("查询分类失败, %v", e)
  608. return
  609. }
  610. classifyMap := make(map[int]*data_manage.BaseFromThsHfClassify)
  611. for _, v := range list {
  612. classifyMap[v.BaseFromThsHfClassifyId] = v
  613. }
  614. for _, v := range params.IndexList {
  615. t := classifyMap[v.ClassifyId]
  616. if t == nil {
  617. br.Msg = fmt.Sprintf("%s分类不存在, 请重新选择或刷新页面", t.ClassifyName)
  618. return
  619. }
  620. }
  621. }
  622. // 校验指标名称
  623. indexOb := new(data_manage.BaseFromThsHfIndex)
  624. {
  625. cond := fmt.Sprintf(` AND %s IN (%s)`, indexOb.Cols().IndexName, utils.GetOrmInReplace(len(indexNames)))
  626. pars := make([]interface{}, 0)
  627. pars = append(pars, indexNames)
  628. list, e := indexOb.GetItemsByCondition(cond, pars, []string{indexOb.Cols().IndexName}, "")
  629. if e != nil {
  630. br.Msg = "操作失败"
  631. br.ErrMsg = fmt.Sprintf("查询指标名称失败, %v", e)
  632. return
  633. }
  634. if len(list) > 0 {
  635. tips := "以下指标名称重复, 请重新输入: \n"
  636. for _, v := range list {
  637. tips += fmt.Sprintf("%s\n", v.IndexName)
  638. }
  639. br.Msg = tips
  640. return
  641. }
  642. }
  643. // 新增指标
  644. for _, v := range params.IndexList {
  645. var req data_manage.ThsHfBaseAddReq
  646. req.StartTime = params.StartTime
  647. req.EndTime = params.EndTime
  648. req.Interval = params.Interval
  649. req.Fill = params.Fill
  650. req.CPS = params.CPS
  651. req.BaseDate = params.BaseDate
  652. req.SysAdminId = sysUser.AdminId
  653. req.SysAdminName = sysUser.RealName
  654. req.ClassifyId = v.ClassifyId
  655. req.Unit = v.Unit
  656. req.IndexName = v.IndexName
  657. req.Frequency = v.Frequency
  658. req.StockCode = v.StockCode
  659. req.EdbCode = v.EdbCode
  660. _, e = data.BaseAddThsHf(req)
  661. if e != nil {
  662. utils.FileLog.Info(fmt.Sprintf("BaseAddThsHf err: %v", e))
  663. continue
  664. }
  665. }
  666. br.Ret = 200
  667. br.Success = true
  668. br.Msg = "操作成功"
  669. }
  670. // Edit
  671. // @Title 编辑指标
  672. // @Description 编辑指标
  673. // @Param request body data_manage.ThsHfIndexEditReq true "type json string"
  674. // @Success 200 string "操作成功"
  675. // @router /ths_hf/index/edit [post]
  676. func (this *BaseFromThsHfController) Edit() {
  677. br := new(models.BaseResponse).Init()
  678. defer func() {
  679. if br.ErrMsg == "" {
  680. br.IsSendEmail = false
  681. }
  682. this.Data["json"] = br
  683. this.ServeJSON()
  684. }()
  685. sysUser := this.SysUser
  686. if sysUser == nil {
  687. br.Msg = "请登录"
  688. br.ErrMsg = "请登录,SysUser Is Empty"
  689. br.Ret = 408
  690. return
  691. }
  692. var params data_manage.ThsHfIndexEditReq
  693. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  694. br.Msg = "参数解析异常"
  695. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  696. return
  697. }
  698. if params.IndexId <= 0 {
  699. br.Msg = "参数有误"
  700. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  701. return
  702. }
  703. params.IndexName = strings.TrimSpace(params.IndexName)
  704. if params.IndexName == "" {
  705. br.Msg = "请输入指标名称"
  706. return
  707. }
  708. if params.ClassifyId <= 0 {
  709. br.Msg = "请选择分类"
  710. return
  711. }
  712. params.Unit = strings.TrimSpace(params.Unit)
  713. if params.Unit == "" {
  714. br.Msg = "请输入单位"
  715. return
  716. }
  717. indexOb := new(data_manage.BaseFromThsHfIndex)
  718. item, e := indexOb.GetItemById(params.IndexId)
  719. if e != nil {
  720. if e.Error() == utils.ErrNoRow() {
  721. br.Msg = "指标不存在, 请刷新页面"
  722. return
  723. }
  724. br.Msg = "操作失败"
  725. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  726. return
  727. }
  728. classifyOb := new(data_manage.BaseFromThsHfClassify)
  729. _, e = classifyOb.GetItemById(params.ClassifyId)
  730. if e != nil {
  731. br.Msg = "分类有误"
  732. br.ErrMsg = fmt.Sprintf("分类信息有误, %v", e)
  733. return
  734. }
  735. // 重名验证
  736. {
  737. cond := fmt.Sprintf(" AND %s = ? AND %s <> ?", indexOb.Cols().IndexName, indexOb.Cols().PrimaryId)
  738. pars := make([]interface{}, 0)
  739. pars = append(pars, params.IndexName, params.IndexId)
  740. count, e := indexOb.GetCountByCondition(cond, pars)
  741. if e != nil {
  742. br.Msg = "操作失败"
  743. br.ErrMsg = fmt.Sprintf("获取重名指标失败, %v", e)
  744. return
  745. }
  746. if count > 0 {
  747. br.Msg = "指标名称已存在, 请重新输入"
  748. return
  749. }
  750. }
  751. item.IndexName = params.IndexName
  752. item.BaseFromThsHfClassifyId = params.ClassifyId
  753. item.Unit = params.Unit
  754. item.ModifyTime = time.Now().Local()
  755. updateCols := []string{item.Cols().IndexName, item.Cols().BaseFromThsHfClassifyId, item.Cols().Unit, item.Cols().ModifyTime}
  756. if e = item.Update(updateCols); e != nil {
  757. br.Msg = "操作失败"
  758. br.ErrMsg = fmt.Sprintf("更新指标信息失败, %v", e)
  759. return
  760. }
  761. br.Ret = 200
  762. br.Success = true
  763. br.Msg = "操作成功"
  764. }
  765. // Detail
  766. // @Title 详情
  767. // @Description 详情
  768. // @Param IndexId query int true "指标ID"
  769. // @Param DataDate query string false "数据日期"
  770. // @Success 200 {object} data_manage.ThsHfSearchEdbResp
  771. // @router /ths_hf/index/detail [get]
  772. func (this *BaseFromThsHfController) Detail() {
  773. br := new(models.BaseResponse).Init()
  774. defer func() {
  775. if br.ErrMsg == "" {
  776. br.IsSendEmail = false
  777. }
  778. this.Data["json"] = br
  779. this.ServeJSON()
  780. }()
  781. sysUser := this.SysUser
  782. if sysUser == nil {
  783. br.Msg = "请登录"
  784. br.ErrMsg = "请登录,SysUser Is Empty"
  785. br.Ret = 408
  786. return
  787. }
  788. indexId, _ := this.GetInt("IndexId")
  789. if indexId <= 0 {
  790. br.Msg = "参数有误"
  791. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", indexId)
  792. return
  793. }
  794. dataDate := this.GetString("DataDate")
  795. if dataDate != "" {
  796. _, e := time.Parse(utils.FormatDate, dataDate)
  797. if e != nil {
  798. br.Msg = "数据日期格式有误"
  799. br.ErrMsg = fmt.Sprintf("数据日期格式有误, DataDate: %s", dataDate)
  800. return
  801. }
  802. }
  803. indexOb := new(data_manage.BaseFromThsHfIndex)
  804. item, e := indexOb.GetItemById(indexId)
  805. if e != nil {
  806. if e.Error() == utils.ErrNoRow() {
  807. br.Msg = "指标不存在, 请刷新页面"
  808. return
  809. }
  810. br.Msg = "获取失败"
  811. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  812. return
  813. }
  814. indexItem := item.Format2Item()
  815. if item.EndDate.IsZero() {
  816. item.EndDate = time.Now()
  817. }
  818. // 默认取有数据的最新日期
  819. if dataDate == "" {
  820. dataDate = item.EndDate.Format(utils.FormatDate)
  821. }
  822. startTime := fmt.Sprintf("%s 00:00:00", dataDate)
  823. endTime := fmt.Sprintf("%s 23:59:59", dataDate)
  824. // 获取数据
  825. dataList, e := data.GetThsHfBaseIndexData(indexItem.IndexCode, startTime, endTime)
  826. if e != nil {
  827. br.Msg = "获取失败"
  828. br.ErrMsg = fmt.Sprintf("获取指标数据失败, %v", e)
  829. return
  830. }
  831. type DetailResp struct {
  832. Index *data_manage.BaseFromThsHfIndexItem
  833. DataDate string `description:"数据日期"`
  834. DataList []*data_manage.BaseFromThsHfDataItem
  835. }
  836. resp := new(DetailResp)
  837. resp.Index = indexItem
  838. resp.DataDate = dataDate
  839. resp.DataList = dataList
  840. br.Data = resp
  841. br.Ret = 200
  842. br.Success = true
  843. br.Msg = "获取成功"
  844. }
  845. // Refresh
  846. // @Title 刷新指标
  847. // @Description 刷新指标
  848. // @Param request body data_manage.ThsHfIndexOptReq true "type json string"
  849. // @Success 200 string "操作成功"
  850. // @router /ths_hf/index/refresh [post]
  851. func (this *BaseFromThsHfController) Refresh() {
  852. br := new(models.BaseResponse).Init()
  853. defer func() {
  854. if br.ErrMsg == "" {
  855. br.IsSendEmail = false
  856. }
  857. this.Data["json"] = br
  858. this.ServeJSON()
  859. }()
  860. sysUser := this.SysUser
  861. if sysUser == nil {
  862. br.Msg = "请登录"
  863. br.ErrMsg = "请登录,SysUser Is Empty"
  864. br.Ret = 408
  865. return
  866. }
  867. var params data_manage.ThsHfIndexOptReq
  868. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  869. br.Msg = "参数解析异常"
  870. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  871. return
  872. }
  873. if params.IndexId <= 0 {
  874. br.Msg = "参数有误"
  875. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  876. return
  877. }
  878. indexOb := new(data_manage.BaseFromThsHfIndex)
  879. _, e := indexOb.GetItemById(params.IndexId)
  880. if e != nil {
  881. if e.Error() == utils.ErrNoRow() {
  882. br.Msg = "指标不存在, 请刷新页面"
  883. return
  884. }
  885. br.Msg = "操作失败"
  886. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  887. return
  888. }
  889. // 指标刷新逻辑
  890. indexIds := []int{params.IndexId}
  891. _, e = data.RefreshBaseThsHfIndex(indexIds, 1)
  892. if e != nil {
  893. br.Msg = "刷新失败"
  894. br.ErrMsg = fmt.Sprintf("刷新指标失败, %v", e)
  895. return
  896. }
  897. br.Ret = 200
  898. br.Success = true
  899. br.Msg = "操作成功"
  900. }
  901. // Remove
  902. // @Title 删除指标
  903. // @Description 删除指标
  904. // @Param request body data_manage.ThsHfIndexOptReq true "type json string"
  905. // @Success 200 string "操作成功"
  906. // @router /ths_hf/index/remove [post]
  907. func (this *BaseFromThsHfController) Remove() {
  908. br := new(models.BaseResponse).Init()
  909. defer func() {
  910. if br.ErrMsg == "" {
  911. br.IsSendEmail = false
  912. }
  913. this.Data["json"] = br
  914. this.ServeJSON()
  915. }()
  916. sysUser := this.SysUser
  917. if sysUser == nil {
  918. br.Msg = "请登录"
  919. br.ErrMsg = "请登录,SysUser Is Empty"
  920. br.Ret = 408
  921. return
  922. }
  923. var params data_manage.ThsHfIndexOptReq
  924. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  925. br.Msg = "参数解析异常"
  926. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  927. return
  928. }
  929. if params.IndexId <= 0 {
  930. br.Msg = "参数有误"
  931. br.ErrMsg = fmt.Sprintf("参数有误, IndexId: %d", params.IndexId)
  932. return
  933. }
  934. indexOb := new(data_manage.BaseFromThsHfIndex)
  935. item, e := indexOb.GetItemById(params.IndexId)
  936. if e != nil {
  937. if e.Error() == utils.ErrNoRow() {
  938. br.Ret = 200
  939. br.Success = true
  940. br.Msg = "操作成功"
  941. return
  942. }
  943. br.Msg = "操作失败"
  944. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  945. return
  946. }
  947. // 删除校验, 指标库存在不可删除
  948. edbMappingOb := new(data_manage.BaseFromEdbMapping)
  949. {
  950. cond := fmt.Sprintf(" AND %s = ?", edbMappingOb.Cols().BaseIndexCode)
  951. pars := make([]interface{}, 0)
  952. pars = append(pars, item.IndexCode)
  953. count, e := edbMappingOb.GetCountByCondition(cond, pars)
  954. if e != nil {
  955. br.Msg = "操作失败"
  956. br.ErrMsg = fmt.Sprintf("获取源指标关联失败, %v", e)
  957. return
  958. }
  959. if count > 0 {
  960. br.Msg = "指标已被引用, 不允许删除"
  961. return
  962. }
  963. }
  964. if e = item.Remove(); e != nil {
  965. br.Msg = "操作失败"
  966. br.ErrMsg = fmt.Sprintf("删除指标失败, %v", e)
  967. return
  968. }
  969. if utils.UseMongo {
  970. mogDataObj := mgo.BaseFromThsHfData{}
  971. if e = mogDataObj.RemoveMany(bson.M{"index_code": item.IndexCode}); e != nil {
  972. br.Msg = "操作失败"
  973. br.ErrMsg = fmt.Sprintf("删除指标数据失败-Mgo, %v", e)
  974. return
  975. }
  976. } else {
  977. dataOb := new(data_manage.BaseFromThsHfData)
  978. cond := fmt.Sprintf(" %s = ?", dataOb.Cols().BaseFromThsHfIndexId)
  979. pars := make([]interface{}, 0)
  980. pars = append(pars, params.IndexId)
  981. if e = dataOb.RemoveByCondition(cond, pars); e != nil {
  982. br.Msg = "操作失败"
  983. br.ErrMsg = fmt.Sprintf("删除指标数据失败, %v", e)
  984. return
  985. }
  986. }
  987. // ES标记删除
  988. go func() {
  989. indexItem := new(dataSourceModel.SearchDataSource)
  990. indexItem.PrimaryId = item.BaseFromThsHfIndexId
  991. indexItem.IndexName = item.IndexName
  992. indexItem.IndexCode = item.IndexCode
  993. indexItem.ClassifyId = item.BaseFromThsHfClassifyId
  994. indexItem.Source = utils.DATA_SOURCE_THS
  995. indexItem.SubSource = utils.DATA_SUB_SOURCE_HIGH_FREQUENCY
  996. indexItem.SourceName = "同花顺高频"
  997. indexItem.IsDeleted = 1
  998. indexItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  999. indexItem.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, item.ModifyTime)
  1000. docId := fmt.Sprintf("%d-%d", indexItem.Source, indexItem.PrimaryId)
  1001. if e := elastic.EsAddOrEditDataSourceIndex(utils.EsDataSourceIndexName, docId, indexItem); e != nil {
  1002. utils.FileLog.Info("同花顺高频-标记删除es失败, %v", e)
  1003. return
  1004. }
  1005. }()
  1006. br.Ret = 200
  1007. br.Success = true
  1008. br.Msg = "操作成功"
  1009. }
  1010. // ListChoice
  1011. // @Title 列表选择
  1012. // @Description 列表选择
  1013. // @Param request body data_manage.ThsHfIndexMultiOptReq true "type json string"
  1014. // @Success 200 string "获取成功"
  1015. // @router /ths_hf/index/list_choice [get]
  1016. func (this *BaseFromThsHfController) ListChoice() {
  1017. br := new(models.BaseResponse).Init()
  1018. defer func() {
  1019. if br.ErrMsg == "" {
  1020. br.IsSendEmail = false
  1021. }
  1022. this.Data["json"] = br
  1023. this.ServeJSON()
  1024. }()
  1025. sysUser := this.SysUser
  1026. if sysUser == nil {
  1027. br.Msg = "请登录"
  1028. br.ErrMsg = "请登录,SysUser Is Empty"
  1029. br.Ret = 408
  1030. return
  1031. }
  1032. var params data_manage.ThsHfIndexListChoiceReq
  1033. if e := this.ParseForm(&params); e != nil {
  1034. br.Msg = "参数解析失败"
  1035. br.ErrMsg = fmt.Sprintf("参数解析失败, err: %v", e)
  1036. return
  1037. }
  1038. var listIds []int
  1039. if params.ListIds != "" {
  1040. strArr := strings.Split(params.ListIds, ",")
  1041. for _, v := range strArr {
  1042. t, _ := strconv.Atoi(v)
  1043. if t > 0 {
  1044. listIds = append(listIds, t)
  1045. }
  1046. }
  1047. }
  1048. var (
  1049. cond string
  1050. pars []interface{}
  1051. )
  1052. indexOb := new(data_manage.BaseFromThsHfIndex)
  1053. resp := make([]*data_manage.ThsHfIndexListChoiceItem, 0)
  1054. // 非列表全选
  1055. if !params.SelectAll {
  1056. if len(listIds) > 0 {
  1057. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(listIds)))
  1058. pars = append(pars, listIds)
  1059. }
  1060. }
  1061. // 列表全选, 根据条件筛选列表并过滤params.ListIds中选择的ID
  1062. if params.SelectAll {
  1063. // 查询所有分类-分类查询用
  1064. classifyOb := new(data_manage.BaseFromThsHfClassify)
  1065. classifies := make([]*data_manage.BaseFromThsHfClassify, 0)
  1066. classifyIdItem := make(map[int]*data_manage.BaseFromThsHfClassify)
  1067. {
  1068. list, e := classifyOb.GetItemsByCondition(``, make([]interface{}, 0), []string{classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName, classifyOb.Cols().ClassifyNameEn, classifyOb.Cols().LevelPath}, "")
  1069. if e != nil {
  1070. br.Msg = "获取失败"
  1071. br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
  1072. return
  1073. }
  1074. for _, v := range list {
  1075. classifyIdItem[v.BaseFromThsHfClassifyId] = v
  1076. }
  1077. classifies = list
  1078. }
  1079. // 筛选项
  1080. if params.ClassifyId != "" {
  1081. classifyIdArr := strings.Split(params.ClassifyId, ",")
  1082. classifyIds := make([]int, 0)
  1083. for _, v := range classifyIdArr {
  1084. t, _ := strconv.Atoi(v)
  1085. if t > 0 {
  1086. classifyIds = append(classifyIds, t)
  1087. }
  1088. }
  1089. // 不包含子分类
  1090. if len(classifyIds) > 0 && !params.IncludeChild {
  1091. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(classifyIds)))
  1092. pars = append(pars, classifyIds)
  1093. }
  1094. // 包含子分类
  1095. if len(classifyIds) > 0 && params.IncludeChild {
  1096. queryClassifyIds := make([]int, 0)
  1097. queryClassifyExist := make(map[int]bool)
  1098. for _, v := range classifyIds {
  1099. // 遍历所有分类从LevelPath中找含有查询分类ID的...=_=!
  1100. for _, cv := range classifies {
  1101. if queryClassifyExist[cv.BaseFromThsHfClassifyId] {
  1102. continue
  1103. }
  1104. if cv.LevelPath == "" {
  1105. continue
  1106. }
  1107. strArr := strings.Split(cv.LevelPath, ",")
  1108. if len(strArr) == 0 {
  1109. continue
  1110. }
  1111. for _, sv := range strArr {
  1112. tv, _ := strconv.Atoi(sv)
  1113. if tv == v {
  1114. queryClassifyIds = append(queryClassifyIds, cv.BaseFromThsHfClassifyId)
  1115. queryClassifyExist[cv.BaseFromThsHfClassifyId] = true
  1116. break
  1117. }
  1118. }
  1119. }
  1120. }
  1121. if len(queryClassifyIds) == 0 {
  1122. br.Data = resp
  1123. br.Ret = 200
  1124. br.Success = true
  1125. br.Msg = "获取成功"
  1126. return
  1127. }
  1128. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().BaseFromThsHfClassifyId, utils.GetOrmInReplace(len(queryClassifyIds)))
  1129. pars = append(pars, queryClassifyIds)
  1130. }
  1131. }
  1132. if params.Frequency != "" {
  1133. frequencyArr := strings.Split(params.Frequency, ",")
  1134. if len(frequencyArr) > 0 {
  1135. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().Frequency, utils.GetOrmInReplace(len(frequencyArr)))
  1136. pars = append(pars, frequencyArr)
  1137. }
  1138. }
  1139. if params.SysAdminId != "" {
  1140. adminIdArr := strings.Split(params.SysAdminId, ",")
  1141. adminIds := make([]int, 0)
  1142. for _, v := range adminIdArr {
  1143. t, _ := strconv.Atoi(v)
  1144. if t > 0 {
  1145. adminIds = append(adminIds, t)
  1146. }
  1147. }
  1148. if len(adminIds) > 0 {
  1149. cond += fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().SysUserId, utils.GetOrmInReplace(len(adminIds)))
  1150. pars = append(pars, adminIds)
  1151. }
  1152. }
  1153. params.Keywords = strings.TrimSpace(params.Keywords)
  1154. if params.Keywords != "" {
  1155. cond += fmt.Sprintf(" AND (%s LIKE ? OR %s LIKE ?)", indexOb.Cols().IndexCode, indexOb.Cols().IndexName)
  1156. kw := fmt.Sprint("%", params.Keywords, "%")
  1157. pars = append(pars, kw, kw)
  1158. }
  1159. // 过滤掉选择的指标
  1160. if len(listIds) > 0 {
  1161. cond += fmt.Sprintf(" AND %s NOT IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(listIds)))
  1162. pars = append(pars, listIds)
  1163. }
  1164. }
  1165. fields := []string{indexOb.Cols().PrimaryId, indexOb.Cols().IndexCode, indexOb.Cols().IndexName}
  1166. list, e := indexOb.GetItemsByCondition(cond, pars, fields, "")
  1167. if e != nil {
  1168. br.Msg = "获取失败"
  1169. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  1170. return
  1171. }
  1172. if len(list) > 500 {
  1173. br.Msg = "选择指标超过500个, 请重新选择"
  1174. return
  1175. }
  1176. for _, v := range list {
  1177. resp = append(resp, &data_manage.ThsHfIndexListChoiceItem{
  1178. IndexId: v.BaseFromThsHfIndexId,
  1179. IndexCode: v.IndexCode,
  1180. IndexName: v.IndexName,
  1181. })
  1182. }
  1183. br.Data = resp
  1184. br.Ret = 200
  1185. br.Success = true
  1186. br.Msg = "获取成功"
  1187. }
  1188. // MultiOpt
  1189. // @Title 批量操作-移动分类/删除/刷新
  1190. // @Description 批量操作-移动分类/删除/刷新
  1191. // @Param request body data_manage.ThsHfIndexMultiOptReq true "type json string"
  1192. // @Success 200 string "操作成功"
  1193. // @router /ths_hf/index/multi_opt [post]
  1194. func (this *BaseFromThsHfController) MultiOpt() {
  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 params data_manage.ThsHfIndexMultiOptReq
  1211. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1212. br.Msg = "参数解析异常"
  1213. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1214. return
  1215. }
  1216. if !utils.InArrayByInt([]int{1, 2, 3}, params.OptType) {
  1217. br.Msg = "请选择操作类型"
  1218. return
  1219. }
  1220. if len(params.IndexIds) == 0 {
  1221. br.Msg = "请选择指标"
  1222. return
  1223. }
  1224. if params.OptType == 1 && params.MoveClassifyId <= 0 {
  1225. br.Msg = "请选择分类"
  1226. return
  1227. }
  1228. if params.OptType == 3 && !utils.InArrayByInt([]int{1, 2}, params.RefreshType) {
  1229. br.Msg = "请选择刷新方式"
  1230. return
  1231. }
  1232. resp := new(data_manage.ThsHfIndexMultiOptResp)
  1233. // 指标名称
  1234. indexOb := new(data_manage.BaseFromThsHfIndex)
  1235. indexMap := make(map[int]*data_manage.BaseFromThsHfIndex)
  1236. {
  1237. cond := fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(params.IndexIds)))
  1238. pars := make([]interface{}, 0)
  1239. pars = append(pars, params.IndexIds)
  1240. list, e := indexOb.GetItemsByCondition(cond, pars, []string{indexOb.Cols().PrimaryId, indexOb.Cols().IndexCode, indexOb.Cols().IndexName}, "")
  1241. if e != nil {
  1242. br.Msg = "删除失败"
  1243. br.ErrMsg = fmt.Sprintf("获取源指标列表失败, %v", e)
  1244. return
  1245. }
  1246. for _, v := range list {
  1247. indexMap[v.BaseFromThsHfIndexId] = v
  1248. }
  1249. }
  1250. // 批量移动
  1251. if params.OptType == 1 {
  1252. if e := indexOb.UpdateClassifyMulti(params.IndexIds, params.MoveClassifyId); e != nil {
  1253. br.Msg = "移动失败"
  1254. br.ErrMsg = fmt.Sprintf("批量移动分类失败, %v", e)
  1255. return
  1256. }
  1257. }
  1258. // 批量删除
  1259. if params.OptType == 2 {
  1260. // 被引用的指标需要提示出来, 未被引用的直接删除
  1261. usedIndexIds := make([]int, 0)
  1262. {
  1263. edbMappingOb := new(data_manage.BaseFromEdbMapping)
  1264. cond := fmt.Sprintf(" AND %s IN (%s)", edbMappingOb.Cols().BaseFromIndexId, utils.GetOrmInReplace(len(params.IndexIds)))
  1265. pars := make([]interface{}, 0)
  1266. pars = append(pars, params.IndexIds)
  1267. list, e := edbMappingOb.GetItemsByCondition(cond, pars, []string{}, "")
  1268. if e != nil {
  1269. br.Msg = "删除失败"
  1270. br.ErrMsg = fmt.Sprintf("获取源指标关联失败, %v", e)
  1271. return
  1272. }
  1273. for _, v := range list {
  1274. if !utils.InArrayByInt(usedIndexIds, v.BaseFromIndexId) {
  1275. usedIndexIds = append(usedIndexIds, v.BaseFromIndexId)
  1276. }
  1277. }
  1278. }
  1279. // 可删除的指标
  1280. removeIndexIds := params.IndexIds
  1281. if len(usedIndexIds) > 0 {
  1282. removeIndexIds = utils.MinusInt(params.IndexIds, usedIndexIds)
  1283. // 标记不允许删除的
  1284. for _, v := range usedIndexIds {
  1285. t := indexMap[v]
  1286. if t == nil {
  1287. continue
  1288. }
  1289. resp.Fail = append(resp.Fail, &data_manage.ThsHfIndexBaseInfo{
  1290. IndexId: v,
  1291. IndexCode: t.IndexCode,
  1292. IndexName: t.IndexName,
  1293. })
  1294. }
  1295. }
  1296. if len(removeIndexIds) > 0 {
  1297. if e := indexOb.MultiRemove(removeIndexIds); e != nil {
  1298. br.Msg = "删除失败"
  1299. br.ErrMsg = fmt.Sprintf("批量删除指标失败, %v", e)
  1300. return
  1301. }
  1302. if utils.UseMongo {
  1303. mogDataObj := mgo.BaseFromThsHfData{}
  1304. for _, v := range removeIndexIds {
  1305. if e := mogDataObj.RemoveMany(bson.M{"base_from_ths_hf_index_id": v}); e != nil {
  1306. br.Msg = "操作失败"
  1307. br.ErrMsg = fmt.Sprintf("批量删除指标数据失败-Mgo, %v", e)
  1308. return
  1309. }
  1310. }
  1311. } else {
  1312. dataOb := new(data_manage.BaseFromThsHfData)
  1313. cond := fmt.Sprintf(" %s IN (%s)", dataOb.Cols().BaseFromThsHfIndexId, utils.GetOrmInReplace(len(removeIndexIds)))
  1314. pars := make([]interface{}, 0)
  1315. pars = append(pars, removeIndexIds)
  1316. if e := dataOb.RemoveByCondition(cond, pars); e != nil {
  1317. br.Msg = "删除失败"
  1318. br.ErrMsg = fmt.Sprintf("批量删除指标数据失败, %v", e)
  1319. return
  1320. }
  1321. }
  1322. // 标记删除成功的
  1323. for _, v := range removeIndexIds {
  1324. t := indexMap[v]
  1325. if t == nil {
  1326. continue
  1327. }
  1328. resp.Success = append(resp.Success, &data_manage.ThsHfIndexBaseInfo{
  1329. IndexId: v,
  1330. IndexCode: t.IndexCode,
  1331. IndexName: t.IndexName,
  1332. })
  1333. }
  1334. }
  1335. }
  1336. // 批量刷新
  1337. if params.OptType == 3 {
  1338. isAsync, e := data.RefreshBaseThsHfIndex(params.IndexIds, params.RefreshType)
  1339. if e != nil {
  1340. br.Msg = "刷新失败"
  1341. br.ErrMsg = fmt.Sprintf("批量刷新指标失败, %v", e)
  1342. return
  1343. }
  1344. if isAsync {
  1345. br.Ret = 200
  1346. br.Success = true
  1347. br.Msg = "操作成功, 刷新指标较多, 请10分钟后查看"
  1348. return
  1349. }
  1350. }
  1351. br.Data = resp
  1352. br.Ret = 200
  1353. br.Success = true
  1354. br.Msg = "操作成功"
  1355. }
  1356. // Save2EdbPre
  1357. // @Title 批量新增指标库-前置
  1358. // @Description 批量新增指标库-前置
  1359. // @Param request body data_manage.ThsHfIndexMultiSave2EdbReq true "type json string"
  1360. // @Success 200 string "操作成功"
  1361. // @router /ths_hf/index/save2edb_pre [post]
  1362. func (this *BaseFromThsHfController) Save2EdbPre() {
  1363. br := new(models.BaseResponse).Init()
  1364. defer func() {
  1365. if br.ErrMsg == "" {
  1366. br.IsSendEmail = false
  1367. }
  1368. this.Data["json"] = br
  1369. this.ServeJSON()
  1370. }()
  1371. sysUser := this.SysUser
  1372. if sysUser == nil {
  1373. br.Msg = "请登录"
  1374. br.ErrMsg = "请登录,SysUser Is Empty"
  1375. br.Ret = 408
  1376. return
  1377. }
  1378. var params data_manage.ThsHfIndexMultiSave2EdbPreReq
  1379. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1380. br.Msg = "参数解析异常"
  1381. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1382. return
  1383. }
  1384. if len(params.IndexIds) == 0 {
  1385. br.Msg = "请选择指标"
  1386. return
  1387. }
  1388. convertRule := params.ConvertRule
  1389. if convertRule.ConvertType != 1 && convertRule.ConvertType != 2 {
  1390. br.Msg = "请选择数据转换方式"
  1391. return
  1392. }
  1393. // 生成的指标名称后缀
  1394. var (
  1395. suffixName string
  1396. startTimeCn string
  1397. endTimeCn string
  1398. calculateCn string
  1399. )
  1400. dayMap := map[int]string{1: "当日", 2: "前日"}
  1401. calculateMap := map[int]string{1: "均值", 2: "最大值", 3: "最小值"}
  1402. if convertRule.ConvertType == 1 {
  1403. if convertRule.ConvertFixed.FixedDay != 1 && convertRule.ConvertFixed.FixedDay != 2 {
  1404. br.Msg = "请选择指定时间"
  1405. return
  1406. }
  1407. if convertRule.ConvertFixed.FixedTime == "" {
  1408. br.Msg = "请选择指定时间"
  1409. return
  1410. }
  1411. timePrefix := time.Now().Local().Format(utils.FormatDate)
  1412. st := fmt.Sprintf("%s %s", timePrefix, convertRule.ConvertFixed.FixedTime)
  1413. startTime, e := time.Parse(utils.FormatDateTime, st)
  1414. if e != nil {
  1415. br.Msg = "指定时间格式有误"
  1416. return
  1417. }
  1418. startTimeCn = fmt.Sprintf("%s%s", dayMap[convertRule.ConvertFixed.FixedDay], startTime.Format("15点04"))
  1419. }
  1420. if convertRule.ConvertType == 2 {
  1421. if convertRule.ConvertArea.StartDay != 1 && convertRule.ConvertArea.StartDay != 2 {
  1422. br.Msg = "请选择起始时间"
  1423. return
  1424. }
  1425. if convertRule.ConvertArea.StartTime == "" {
  1426. br.Msg = "请选择起始时间"
  1427. return
  1428. }
  1429. var startTimePre string
  1430. if convertRule.ConvertArea.StartDay == 1 {
  1431. startTimePre = time.Now().Local().Format(utils.FormatDate)
  1432. }
  1433. if convertRule.ConvertArea.StartDay == 2 {
  1434. startTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1435. }
  1436. st := fmt.Sprintf("%s %s", startTimePre, convertRule.ConvertArea.StartTime)
  1437. startTime, e := time.Parse(utils.FormatDateTime, st)
  1438. if e != nil {
  1439. br.Msg = "起始时间格式有误"
  1440. return
  1441. }
  1442. startTimeCn = fmt.Sprintf("%s%s", dayMap[convertRule.ConvertArea.StartDay], startTime.Format("15点04"))
  1443. if convertRule.ConvertArea.EndDay != 1 && convertRule.ConvertArea.EndDay != 2 {
  1444. br.Msg = "请选择截止时间"
  1445. return
  1446. }
  1447. if convertRule.ConvertArea.EndTime == "" {
  1448. br.Msg = "请选择截止时间"
  1449. return
  1450. }
  1451. var endTimePre string
  1452. if convertRule.ConvertArea.EndDay == 1 {
  1453. endTimePre = time.Now().Local().Format(utils.FormatDate)
  1454. }
  1455. if convertRule.ConvertArea.EndDay == 2 {
  1456. endTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1457. }
  1458. ed := fmt.Sprintf("%s %s", endTimePre, convertRule.ConvertArea.EndTime)
  1459. endTime, e := time.Parse(utils.FormatDateTime, ed)
  1460. if e != nil {
  1461. br.Msg = "截止时间格式有误"
  1462. return
  1463. }
  1464. endTimeCn = fmt.Sprintf("至%s%s", dayMap[convertRule.ConvertArea.EndDay], endTime.Format("15点04"))
  1465. if startTime.After(endTime) {
  1466. br.Msg = "起始日期不可早于截止日期"
  1467. return
  1468. }
  1469. calculateCn = calculateMap[convertRule.ConvertArea.CalculateType]
  1470. }
  1471. suffixName = fmt.Sprint(startTimeCn, endTimeCn, calculateCn)
  1472. // 查询指标
  1473. indexOb := new(data_manage.BaseFromThsHfIndex)
  1474. cond := fmt.Sprintf(" AND %s IN (%s)", indexOb.Cols().PrimaryId, utils.GetOrmInReplace(len(params.IndexIds)))
  1475. pars := make([]interface{}, 0)
  1476. pars = append(pars, params.IndexIds)
  1477. list, e := indexOb.GetItemsByCondition(cond, pars, []string{}, "")
  1478. if e != nil {
  1479. br.Msg = "获取失败"
  1480. br.ErrMsg = fmt.Sprintf("获取指标失败, %v", e)
  1481. return
  1482. }
  1483. resp := make([]*data_manage.ThsHfIndexMultiSave2EdbPreItem, 0)
  1484. for _, v := range list {
  1485. t := new(data_manage.ThsHfIndexMultiSave2EdbPreItem)
  1486. t.IndexId = v.BaseFromThsHfIndexId
  1487. t.IndexCode = v.IndexCode
  1488. t.IndexName = v.IndexName
  1489. edbCn := data_manage.ThsHfEdbCodeCn[v.Indicator]
  1490. if edbCn == "" {
  1491. edbCn = v.Indicator
  1492. }
  1493. t.NewIndexName = fmt.Sprint(v.StockCode, v.Frequency, edbCn, suffixName)
  1494. t.StockCode = v.StockCode
  1495. t.EdbCode = v.Indicator
  1496. t.Unit = v.Unit
  1497. t.Frequency = v.Frequency
  1498. t.NewFrequency = "日度"
  1499. resp = append(resp, t)
  1500. }
  1501. br.Data = resp
  1502. br.Ret = 200
  1503. br.Success = true
  1504. br.Msg = "获取成功"
  1505. }
  1506. // Save2Edb
  1507. // @Title 批量新增指标库
  1508. // @Description 批量新增指标库
  1509. // @Param request body data_manage.ThsHfIndexMultiSave2EdbReq true "type json string"
  1510. // @Success 200 string "操作成功"
  1511. // @router /ths_hf/index/save2edb [post]
  1512. func (this *BaseFromThsHfController) Save2Edb() {
  1513. br := new(models.BaseResponse).Init()
  1514. defer func() {
  1515. if br.ErrMsg == "" {
  1516. br.IsSendEmail = false
  1517. }
  1518. this.Data["json"] = br
  1519. this.ServeJSON()
  1520. }()
  1521. sysUser := this.SysUser
  1522. if sysUser == nil {
  1523. br.Msg = "请登录"
  1524. br.ErrMsg = "请登录,SysUser Is Empty"
  1525. br.Ret = 408
  1526. return
  1527. }
  1528. var params data_manage.ThsHfIndexMultiSave2EdbReq
  1529. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &params); e != nil {
  1530. br.Msg = "参数解析异常"
  1531. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1532. return
  1533. }
  1534. if len(params.NewIndexes) == 0 {
  1535. br.Msg = "请选择指标"
  1536. return
  1537. }
  1538. convertRule := params.ConvertRule
  1539. if convertRule.ConvertType != 1 && convertRule.ConvertType != 2 {
  1540. br.Msg = "请选择数据转换方式"
  1541. return
  1542. }
  1543. if convertRule.ConvertType == 1 {
  1544. if convertRule.ConvertFixed.FixedDay != 1 && convertRule.ConvertFixed.FixedDay != 2 {
  1545. br.Msg = "请选择指定时间"
  1546. return
  1547. }
  1548. if convertRule.ConvertFixed.FixedTime == "" {
  1549. br.Msg = "请选择指定时间"
  1550. return
  1551. }
  1552. timePrefix := time.Now().Local().Format(utils.FormatDate)
  1553. st := fmt.Sprintf("%s %s", timePrefix, convertRule.ConvertFixed.FixedTime)
  1554. _, e := time.Parse(utils.FormatDateTime, st)
  1555. if e != nil {
  1556. br.Msg = "指定时间格式有误"
  1557. return
  1558. }
  1559. }
  1560. if convertRule.ConvertType == 2 {
  1561. if convertRule.ConvertArea.StartDay != 1 && convertRule.ConvertArea.StartDay != 2 {
  1562. br.Msg = "请选择起始时间"
  1563. return
  1564. }
  1565. if convertRule.ConvertArea.StartTime == "" {
  1566. br.Msg = "请选择起始时间"
  1567. return
  1568. }
  1569. var startTimePre string
  1570. if convertRule.ConvertArea.StartDay == 1 {
  1571. startTimePre = time.Now().Local().Format(utils.FormatDate)
  1572. }
  1573. if convertRule.ConvertArea.StartDay == 2 {
  1574. startTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1575. }
  1576. st := fmt.Sprintf("%s %s", startTimePre, convertRule.ConvertArea.StartTime)
  1577. startTime, e := time.Parse(utils.FormatDateTime, st)
  1578. if e != nil {
  1579. br.Msg = "起始时间格式有误"
  1580. return
  1581. }
  1582. if convertRule.ConvertArea.EndDay != 1 && convertRule.ConvertArea.EndDay != 2 {
  1583. br.Msg = "请选择截止时间"
  1584. return
  1585. }
  1586. if convertRule.ConvertArea.EndTime == "" {
  1587. br.Msg = "请选择截止时间"
  1588. return
  1589. }
  1590. var endTimePre string
  1591. if convertRule.ConvertArea.EndDay == 1 {
  1592. endTimePre = time.Now().Local().Format(utils.FormatDate)
  1593. }
  1594. if convertRule.ConvertArea.EndDay == 2 {
  1595. endTimePre = time.Now().Local().AddDate(0, 0, -1).Format(utils.FormatDate)
  1596. }
  1597. ed := fmt.Sprintf("%s %s", endTimePre, convertRule.ConvertArea.EndTime)
  1598. endTime, e := time.Parse(utils.FormatDateTime, ed)
  1599. if e != nil {
  1600. br.Msg = "截止时间格式有误"
  1601. return
  1602. }
  1603. if startTime.After(endTime) {
  1604. br.Msg = "起始日期不可早于截止日期"
  1605. return
  1606. }
  1607. }
  1608. resp := new(data_manage.ThsHfIndexMultiSave2EdbResp)
  1609. // 判断指标名称是否重复
  1610. edbNameExist := make(map[string]bool)
  1611. {
  1612. items, e := data_manage.GetEdbInfoFieldList(``, make([]interface{}, 0), []string{"edb_name"})
  1613. if e != nil {
  1614. br.Msg = "操作失败"
  1615. br.ErrMsg = fmt.Sprintf("获取指标名称列表失败, %v", e)
  1616. return
  1617. }
  1618. for _, v := range items {
  1619. edbNameExist[v.EdbName] = true
  1620. }
  1621. }
  1622. for _, v := range params.NewIndexes {
  1623. if edbNameExist[v.NewIndexName] {
  1624. resp.Exist = append(resp.Exist, v)
  1625. }
  1626. }
  1627. if len(resp.Exist) > 0 {
  1628. br.Data = resp
  1629. br.Ret = 200
  1630. br.Success = true
  1631. br.Msg = "含重复指标名称"
  1632. return
  1633. }
  1634. // 请求指标库新增
  1635. for _, v := range params.NewIndexes {
  1636. var r data_manage.ThsHfIndexMultiSave2EdbLibReq
  1637. r.ConvertRule = convertRule
  1638. v.SysAdminId = sysUser.AdminId
  1639. v.SysAdminName = sysUser.RealName
  1640. r.NewIndex = v
  1641. b, e := json.Marshal(r)
  1642. if e != nil {
  1643. v.Tips = "新增失败"
  1644. v.ErrMsg = e.Error()
  1645. resp.Fail = append(resp.Fail, v)
  1646. continue
  1647. }
  1648. res, e := data.AddBaseEdbInfo(string(b), utils.DATA_SOURCE_THS, utils.DATA_SUB_SOURCE_HIGH_FREQUENCY, this.Lang)
  1649. if e != nil {
  1650. v.Tips = "新增失败"
  1651. v.ErrMsg = fmt.Sprintf("AddBaseEdbInfo, err: %v", e)
  1652. resp.Fail = append(resp.Fail, v)
  1653. continue
  1654. }
  1655. if res.Ret != 200 {
  1656. v.Tips = res.Msg
  1657. v.ErrMsg = fmt.Sprintf("AddBaseEdbInfo, Ret: %d, ErrMsg: %s", res.Ret, res.ErrMsg)
  1658. resp.Fail = append(resp.Fail, v)
  1659. continue
  1660. }
  1661. v.Tips = "新增成功"
  1662. resp.Success = append(resp.Success, v)
  1663. }
  1664. br.Data = resp
  1665. br.Ret = 200
  1666. br.Success = true
  1667. br.Msg = "操作成功"
  1668. }