yongyi_data.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. package data_manage
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/request"
  7. "eta/eta_api/models/system"
  8. "eta/eta_api/services/data"
  9. etaTrialService "eta/eta_api/services/eta_trial"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "os"
  13. "path/filepath"
  14. "strconv"
  15. "strings"
  16. "time"
  17. "github.com/rdlucklib/rdluck_tools/paging"
  18. "github.com/tealeg/xlsx"
  19. )
  20. // YongyiClassify
  21. // @Title 涌益咨询数据分类
  22. // @Description 涌益咨询数据分类接口
  23. // @Success 200 {object} data_manage.BaseFromYongyiClassify
  24. // @router /yongyi/classify [get]
  25. func (this *EdbInfoController) YongyiClassify() {
  26. br := new(models.BaseResponse).Init()
  27. defer func() {
  28. this.Data["json"] = br
  29. this.ServeJSON()
  30. }()
  31. sysUser := this.SysUser
  32. if sysUser == nil {
  33. br.Msg = "请登录"
  34. br.ErrMsg = "请登录,SysUser Is Empty"
  35. br.Ret = 408
  36. return
  37. }
  38. classifyAll, err := data_manage.GetAllBaseFromYongyiClassify()
  39. if err != nil && err.Error() != utils.ErrNoRow() {
  40. br.Msg = "获取失败"
  41. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  42. return
  43. }
  44. //组装一级分类
  45. rootMap := make(map[int][]*data_manage.BaseFromYongyiClassifyItems)
  46. list := make([]*data_manage.BaseFromYongyiClassifyItems, 0)
  47. for _, classify := range classifyAll {
  48. classify.UniqueCode = strconv.Itoa(classify.ClassifyId)
  49. if classify.ParentId == 0 {
  50. if _, ok := rootMap[classify.ClassifyId]; !ok {
  51. rootMap[classify.ClassifyId] = make([]*data_manage.BaseFromYongyiClassifyItems, 0)
  52. list = append(list, classify)
  53. }
  54. } else {
  55. child, ok := rootMap[classify.ParentId]
  56. if ok {
  57. child = append(child, classify)
  58. rootMap[classify.ParentId] = child
  59. }
  60. }
  61. }
  62. for k, v := range list {
  63. child, ok := rootMap[v.ClassifyId]
  64. if ok {
  65. list[k].Children = child
  66. }
  67. }
  68. //组装二级分类
  69. var ret data_manage.BaseFromYongyiClassifyResp
  70. ret.List = list
  71. br.Ret = 200
  72. br.Success = true
  73. br.Msg = "获取成功"
  74. br.Data = ret
  75. }
  76. // YongyiIndexData
  77. // @Title 获取涌益咨询数据
  78. // @Description 获取涌益咨询数据接口
  79. // @Param PageSize query int true "每页数据条数"
  80. // @Param CurrentIndex query int true "当前页页码,从1开始"
  81. // @Param ClassifyId query string true "分类id"
  82. // @Success 200 {object} data_manage.LzFrequency
  83. // @router /yongyi/index/data [get]
  84. func (this *EdbInfoController) YongyiIndexData() {
  85. br := new(models.BaseResponse).Init()
  86. defer func() {
  87. this.Data["json"] = br
  88. this.ServeJSON()
  89. }()
  90. sysUser := this.SysUser
  91. if sysUser == nil {
  92. br.Msg = "请登录"
  93. br.ErrMsg = "请登录,SysUser Is Empty"
  94. br.Ret = 408
  95. return
  96. }
  97. pageSize, _ := this.GetInt("PageSize")
  98. currentIndex, _ := this.GetInt("CurrentIndex")
  99. var startSize int
  100. if pageSize <= 0 {
  101. pageSize = utils.PageSize20
  102. }
  103. if currentIndex <= 0 {
  104. currentIndex = 1
  105. }
  106. startSize = utils.StartIndex(currentIndex, pageSize)
  107. classifyId, _ := this.GetInt("ClassifyId")
  108. if classifyId < 0 {
  109. br.Msg = "请选择分类"
  110. br.ErrMsg = "请选择分类"
  111. return
  112. }
  113. //获取指标
  114. var condition string
  115. var pars []interface{}
  116. if classifyId >= 0 {
  117. classifyInfo, err := data_manage.GetBaseFromYongyiClassifyById(classifyId)
  118. if err != nil {
  119. if err.Error() == utils.ErrNoRow() {
  120. br.Msg = "分类不存在"
  121. return
  122. }
  123. br.Msg = "获取分类信息失败"
  124. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  125. return
  126. }
  127. if classifyInfo.Level == 2 || classifyInfo.ParentId > 0 {
  128. condition += ` AND classify_id=? `
  129. pars = append(pars, classifyId)
  130. } else if classifyInfo.Level == 1 {
  131. childClassify, err := data_manage.GetBaseFromYongyiClassifyByParentId(classifyId)
  132. if err != nil {
  133. br.Msg = "获取分类信息失败"
  134. br.ErrMsg = "获取子分类信息失败,Err:" + err.Error()
  135. return
  136. }
  137. var classifyList []int
  138. for _, v := range childClassify {
  139. classifyList = append(classifyList, v.ClassifyId)
  140. }
  141. condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyList)) + `) `
  142. pars = append(pars, classifyList)
  143. }
  144. }
  145. yongyiList, err := data_manage.GetYongyiIndex(condition, pars)
  146. if err != nil {
  147. br.Msg = "获取数据失败"
  148. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  149. return
  150. }
  151. edbCodeList := make([]string, 0)
  152. for _, v := range yongyiList {
  153. edbCodeList = append(edbCodeList, v.IndexCode)
  154. }
  155. edbInfoList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_YONYI, edbCodeList)
  156. if err != nil {
  157. br.Msg = "获取数据源失败"
  158. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  159. return
  160. }
  161. edbInfoMap := make(map[string]*data_manage.EdbInfo)
  162. for _, v := range edbInfoList {
  163. edbInfoMap[v.EdbCode] = v
  164. }
  165. resultList := make([]*data_manage.BaseFromYongyiIndexList, 0)
  166. for _, v := range yongyiList {
  167. product := new(data_manage.BaseFromYongyiIndexList)
  168. product.YongyiIndexId = v.YongyiIndexId
  169. product.Unit = v.Unit
  170. product.IndexCode = v.IndexCode
  171. product.IndexName = v.IndexName
  172. product.Frequency = v.Frequency
  173. product.ModifyTime = v.ModifyTime
  174. if edb, ok := edbInfoMap[v.IndexCode]; ok {
  175. product.EdbInfoId = edb.EdbInfoId
  176. product.EdbExist = 1
  177. }
  178. total, err := data_manage.GetYongyiIndexDataCount(v.IndexCode)
  179. if err != nil {
  180. br.Msg = "获取数据失败"
  181. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  182. }
  183. page := paging.GetPaging(currentIndex, pageSize, total)
  184. dataList, err := data_manage.GetYongyiIndexData(v.IndexCode, startSize, pageSize)
  185. if err != nil {
  186. br.Msg = "获取数据失败"
  187. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  188. return
  189. }
  190. if dataList == nil {
  191. dataList = make([]*data_manage.BaseFromYongyiData, 0)
  192. }
  193. product.DataList = dataList
  194. product.Paging = page
  195. resultList = append(resultList, product)
  196. }
  197. br.Ret = 200
  198. br.Success = true
  199. br.Msg = "获取成功"
  200. br.Data = resultList
  201. }
  202. // YongyiSearchList
  203. // @Title Yongyi模糊搜索
  204. // @Description Yongyi模糊搜索
  205. // @Param Keyword query string ture "关键字搜索"
  206. // @Success 200 {object} models.BaseResponse
  207. // @router /yongyi/search_list [get]
  208. func (this *EdbInfoController) YongyiSearchList() {
  209. br := new(models.BaseResponse).Init()
  210. defer func() {
  211. this.Data["json"] = br
  212. this.ServeJSON()
  213. }()
  214. sysUser := this.SysUser
  215. if sysUser == nil {
  216. br.Msg = "请重新登录"
  217. return
  218. }
  219. list := make([]*data_manage.BaseFromYongyiIndexSearchItem, 0)
  220. var err error
  221. //关键字
  222. keyword := this.GetString("Keyword")
  223. if keyword != "" {
  224. keyWordArr := strings.Split(keyword, " ")
  225. if len(keyWordArr) > 0 {
  226. condition := ""
  227. for _, v := range keyWordArr {
  228. condition += ` AND CONCAT(index_name,index_code) LIKE '%` + v + `%'`
  229. }
  230. list, err = data_manage.GetYongyiItemList(condition)
  231. if err != nil {
  232. br.ErrMsg = "获取失败,Err:" + err.Error()
  233. br.Msg = "获取失败"
  234. return
  235. }
  236. }
  237. } else {
  238. // todo es 模糊搜索
  239. list, err = data_manage.GetYongyiItemList("")
  240. if err != nil {
  241. br.ErrMsg = "获取失败,Err:" + err.Error()
  242. br.Msg = "获取失败"
  243. return
  244. }
  245. }
  246. classifyIds := make([]int, 0)
  247. for _, v := range list {
  248. classifyIds = append(classifyIds, v.ClassifyId)
  249. }
  250. classifyList, err := data_manage.GetBaseFromYongyiClassifyByIds(classifyIds)
  251. if err != nil {
  252. br.Msg = "搜索失败"
  253. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  254. return
  255. }
  256. classifyMap := make(map[int]int)
  257. for _, v := range classifyList {
  258. classifyMap[v.ClassifyId] = v.ParentId
  259. }
  260. for _, v := range list {
  261. v.ParentClassifyId = classifyMap[v.ClassifyId]
  262. }
  263. br.Ret = 200
  264. br.Success = true
  265. br.Msg = "获取成功"
  266. br.Data = list
  267. }
  268. // YongyiSingleData
  269. // @Title 获取Yongyi数据
  270. // @Description 获取Yongyi单条数据接口
  271. // @Param IndexCode query string true "指标唯一编码"
  272. // @Success 200 {object} models.BaseResponse
  273. // @router /yongyi/single_data [get]
  274. func (this *EdbInfoController) YongyiSingleData() {
  275. br := new(models.BaseResponse).Init()
  276. defer func() {
  277. this.Data["json"] = br
  278. this.ServeJSON()
  279. }()
  280. sysUser := this.SysUser
  281. if sysUser == nil {
  282. br.Msg = "请登录"
  283. br.ErrMsg = "请登录,SysUser Is Empty"
  284. br.Ret = 408
  285. return
  286. }
  287. indexCode := this.GetString("IndexCode")
  288. indexInfo, err := data_manage.GetBaseFromYongyiIndexByIndexCode(indexCode)
  289. if err != nil {
  290. br.Msg = "获取指标信息失败"
  291. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  292. return
  293. }
  294. dataTmpList, err := data_manage.GetYongyiIndexDataByCode(indexCode)
  295. if err != nil {
  296. br.Msg = "获取数据失败"
  297. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  298. return
  299. }
  300. edbInfo, err := data_manage.GetEdbInfoByEdbCode(utils.DATA_SOURCE_YONYI, indexCode)
  301. if err != nil && err.Error() != utils.ErrNoRow() {
  302. br.Msg = "获取数据源失败"
  303. br.ErrMsg = "获取数据源失败,Err:" + err.Error()
  304. return
  305. }
  306. var ret data_manage.YongyiSingleDataResp
  307. var dataList []*data_manage.YongyiSingleData
  308. if edbInfo != nil {
  309. ret.EdbInfoId = edbInfo.EdbInfoId
  310. ret.EdbExist = 1
  311. }
  312. ret.ClassifyId = indexInfo.ClassifyId
  313. ret.YongyiIndexId = indexInfo.YongyiIndexId
  314. ret.IndexCode = indexInfo.IndexCode
  315. ret.IndexName = indexInfo.IndexName
  316. ret.Frequency = indexInfo.Frequency
  317. ret.CreateTime = indexInfo.CreateTime.Format(utils.FormatDateTime)
  318. ret.ModifyTime = indexInfo.ModifyTime.Format(utils.FormatDateTime)
  319. ret.Unit = indexInfo.Unit
  320. for _, v := range dataTmpList {
  321. tmp := &data_manage.YongyiSingleData{
  322. Value: v.Value,
  323. DataTime: v.DataTime,
  324. }
  325. dataList = append(dataList, tmp)
  326. }
  327. ret.Data = dataList
  328. br.Ret = 200
  329. br.Success = true
  330. br.Msg = "获取成功"
  331. br.Data = ret
  332. }
  333. // YongyiIndexList
  334. // @Title 涌益咨询指标列表
  335. // @Description 涌益咨询指标列表
  336. // @Param ClassifyId query int true "分类id"
  337. // @Success 200 {object} data_manage.BaseFromMysteelChemicalIndexResp
  338. // @router /yongyi/classify/index/list [get]
  339. func (this *EdbInfoController) YongyiIndexList() {
  340. br := new(models.BaseResponse).Init()
  341. defer func() {
  342. this.Data["json"] = br
  343. this.ServeJSON()
  344. }()
  345. classifyId, _ := this.GetInt("ClassifyId", 0)
  346. indexList, err := data_manage.GetYongyiIndexByClassifyId(classifyId)
  347. if err != nil && err.Error() != utils.ErrNoRow() {
  348. br.Msg = "获取失败"
  349. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  350. return
  351. }
  352. var ret data_manage.BaseFromYongyiClassifyResp
  353. list := make([]*data_manage.BaseFromYongyiClassifyItems, 0)
  354. for _, v := range indexList {
  355. classify := new(data_manage.BaseFromYongyiClassifyItems)
  356. classify.ClassifyId = classifyId
  357. classify.YongyiIndexId = v.YongyiIndexId
  358. classify.YongyiIndexCode = v.IndexCode
  359. classify.ClassifyName = v.IndexName
  360. classify.UniqueCode = fmt.Sprintf("%d_%d", classifyId, v.YongyiIndexId)
  361. list = append(list, classify)
  362. }
  363. ret.List = list
  364. br.Ret = 200
  365. br.Success = true
  366. br.Msg = "获取成功"
  367. br.Data = ret
  368. }
  369. // YongyiBatchSearch
  370. // @Title 涌益咨询指标查询
  371. // @Description 涌益咨询指标查询
  372. // @Param ClassifyIds query string true "分类id, 多个分类用英文"
  373. // @Param Keyword query string true "关键词, 指标ID/指标名称"
  374. // @Success 200 {object} data_manage.LzFrequency
  375. // @router /yongyi/batch_search [get]
  376. func (this *EdbInfoController) YongyiBatchSearch() {
  377. br := new(models.BaseResponse).Init()
  378. defer func() {
  379. this.Data["json"] = br
  380. this.ServeJSON()
  381. }()
  382. sysUser := this.SysUser
  383. if sysUser == nil {
  384. br.Msg = "请登录"
  385. br.ErrMsg = "请登录,SysUser Is Empty"
  386. br.Ret = 408
  387. return
  388. }
  389. classifyIdStr := this.GetString("ClassifyIds")
  390. var condition string
  391. var pars []interface{}
  392. classifyIds := strings.Split(classifyIdStr, ",")
  393. if len(classifyIds) > 0 && classifyIds[0] != `` {
  394. condition += " AND classify_id IN (" + utils.GetOrmInReplace(len(classifyIds)) + " ) "
  395. pars = append(pars, classifyIds)
  396. }
  397. keyword := this.GetString("Keyword")
  398. if keyword != `` {
  399. condition += " AND (index_name like ? OR index_code like ?) "
  400. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  401. }
  402. if classifyIdStr == `` && keyword == `` {
  403. var list = make([]*data_manage.BaseFromYongyiIndexList, 0)
  404. br.Ret = 200
  405. br.Success = true
  406. br.Msg = "获取成功"
  407. br.Data = list
  408. return
  409. }
  410. list, err := data_manage.GetYongyiIndex(condition, pars)
  411. if err != nil {
  412. br.Msg = "获取失败"
  413. br.ErrMsg = "获取失败,Err:" + err.Error()
  414. return
  415. }
  416. br.Ret = 200
  417. br.Success = true
  418. br.Msg = "获取成功"
  419. br.Data = list
  420. }
  421. // YongyiBatchAdd
  422. // @Title 涌益批量新增
  423. // @Description 涌益批量新增
  424. // @Param request body data_manage.AddEdbInfoReq true "type json string"
  425. // @Success 200 string "操作成功"
  426. // @router /yongyi/batch_add [post]
  427. func (this *EdbInfoController) YongyiBatchAdd() {
  428. br := new(models.BaseResponse).Init()
  429. defer func() {
  430. if br.ErrMsg == "" {
  431. br.IsSendEmail = false
  432. }
  433. this.Data["json"] = br
  434. this.ServeJSON()
  435. }()
  436. sysUser := this.SysUser
  437. if sysUser == nil {
  438. br.Msg = "请登录"
  439. br.ErrMsg = "请登录,SysUser Is Empty"
  440. br.Ret = 408
  441. return
  442. }
  443. deleteCache := true
  444. cacheKey := "CACHE_EDB_INFO_BATCH_ADD_YONGYI_" + strconv.Itoa(sysUser.AdminId)
  445. defer func() {
  446. if deleteCache {
  447. _ = utils.Rc.Delete(cacheKey)
  448. }
  449. }()
  450. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  451. deleteCache = false
  452. br.Msg = "系统处理中,请稍后重试!"
  453. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  454. return
  455. }
  456. var req []*data_manage.AddEdbInfoReq
  457. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  458. br.Msg = "参数解析异常!"
  459. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  460. return
  461. }
  462. if len(req) == 0 {
  463. br.Msg = "请选择指标"
  464. return
  465. }
  466. if len(req) > 30 {
  467. br.Msg = "批量添加指标数量不得超过30个"
  468. return
  469. }
  470. for _, v := range req {
  471. v.EdbCode = strings.TrimSpace(v.EdbCode)
  472. if v.EdbCode == "" {
  473. br.Msg = "指标ID不可为空"
  474. return
  475. }
  476. v.EdbName = strings.TrimSpace(v.EdbName)
  477. if v.EdbName == "" {
  478. br.Msg = "请输入指标名称"
  479. return
  480. }
  481. v.Frequency = strings.TrimSpace(v.Frequency)
  482. if v.Frequency == "" {
  483. br.Msg = "请选择频度"
  484. return
  485. }
  486. v.Unit = strings.TrimSpace(v.Unit)
  487. if v.Unit == "" {
  488. br.Msg = "请输入单位"
  489. return
  490. }
  491. if v.ClassifyId <= 0 {
  492. br.Msg = "请选择分类"
  493. return
  494. }
  495. }
  496. // 限定同一时间最多批量新增30个指标
  497. for _, v := range req {
  498. var r request.YongyiIndexSource2EdbReq
  499. r.EdbCode = v.EdbCode
  500. r.EdbName = v.EdbName
  501. r.Frequency = v.Frequency
  502. r.Unit = v.Unit
  503. r.ClassifyId = v.ClassifyId
  504. r.AdminId = sysUser.AdminId
  505. r.AdminRealName = sysUser.RealName
  506. edbInfo, e, errMsg, skip := data.YongyiIndexSource2Edb(r, this.Lang)
  507. if e != nil {
  508. br.Msg = "操作失败"
  509. if errMsg != "" {
  510. br.Msg = errMsg
  511. }
  512. br.ErrMsg = e.Error()
  513. return
  514. }
  515. if skip {
  516. continue
  517. }
  518. // 试用平台更新用户累计新增指标数
  519. if utils.BusinessCode == utils.BusinessCodeSandbox {
  520. go func() {
  521. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  522. if e != nil {
  523. tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
  524. utils.FileLog.Info(tips)
  525. return
  526. }
  527. if adminItem.DepartmentName != "ETA试用客户" {
  528. return
  529. }
  530. var ur etaTrialService.EtaTrialUserReq
  531. ur.Mobile = adminItem.Mobile
  532. _, _ = etaTrialService.UpdateUserIndexNum(ur)
  533. }()
  534. }
  535. // 新增操作日志
  536. {
  537. edbLog := new(data_manage.EdbInfoLog)
  538. edbLog.EdbInfoId = edbInfo.EdbInfoId
  539. edbLog.SourceName = edbInfo.SourceName
  540. edbLog.Source = edbInfo.Source
  541. edbLog.EdbCode = edbInfo.EdbCode
  542. edbLog.EdbName = edbInfo.EdbName
  543. edbLog.ClassifyId = edbInfo.ClassifyId
  544. edbLog.SysUserId = sysUser.AdminId
  545. edbLog.SysUserRealName = sysUser.RealName
  546. edbLog.CreateTime = time.Now()
  547. edbLog.Content = string(this.Ctx.Input.RequestBody)
  548. edbLog.Status = "新增指标"
  549. edbLog.Method = this.Ctx.Input.URI()
  550. go data_manage.AddEdbInfoLog(edbLog)
  551. }
  552. }
  553. br.Msg = "操作成功"
  554. br.Ret = 200
  555. br.Success = true
  556. br.IsAddLog = true
  557. }
  558. // YongyiNameCheck
  559. // @Title 加入指标库的重名检测
  560. // @Description 加入指标库的重名检测
  561. // @Param ClassifyIds query string true "分类id, 多个分类用英文"
  562. // @Param Keyword query string true "关键词, 指标ID/指标名称"
  563. // @Success 200 {object} NameCheckResult
  564. // @router /yongyi/edb_info/name_check [post]
  565. func (this *EdbInfoController) YongyiNameCheck() {
  566. br := new(models.BaseResponse).Init()
  567. defer func() {
  568. if br.ErrMsg == "" {
  569. br.IsSendEmail = false
  570. }
  571. this.Data["json"] = br
  572. this.ServeJSON()
  573. }()
  574. sysUser := this.SysUser
  575. if sysUser == nil {
  576. br.Msg = "请登录"
  577. br.ErrMsg = "请登录,SysUser Is Empty"
  578. br.Ret = 408
  579. return
  580. }
  581. var req []*data_manage.NameCheckEdbInfoReq
  582. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  583. br.Msg = "参数解析异常!"
  584. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  585. return
  586. }
  587. if len(req) == 0 {
  588. br.Msg = "请选择指标"
  589. return
  590. }
  591. codeMax := 30
  592. codeLen := len(req)
  593. if codeLen > codeMax {
  594. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  595. return
  596. }
  597. type NameCheckResult struct {
  598. EdbCode string
  599. EdbName string
  600. Exist bool
  601. }
  602. indexNames := make([]string, 0)
  603. resp := make([]*NameCheckResult, 0)
  604. for _, v := range req {
  605. v.EdbCode = strings.TrimSpace(v.EdbCode)
  606. if v.EdbCode == "" {
  607. br.Msg = "指标ID不可为空"
  608. return
  609. }
  610. v.EdbName = strings.TrimSpace(v.EdbName)
  611. if v.EdbName == "" {
  612. br.Msg = "请输入指标名称"
  613. return
  614. }
  615. indexNames = append(indexNames, v.EdbName)
  616. resp = append(resp, &NameCheckResult{
  617. EdbCode: v.EdbCode,
  618. EdbName: v.EdbName,
  619. })
  620. dataItems, err := data_manage.GetEdbDataAllByEdbCode(v.EdbCode, utils.DATA_SOURCE_YONYI, 0, utils.EDB_DATA_LIMIT)
  621. if err != nil && err.Error() != utils.ErrNoRow() {
  622. br.Msg = "获取失败"
  623. br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
  624. return
  625. }
  626. if len(dataItems) <= 0 {
  627. respItem, err := data.AddEdbData(utils.DATA_SOURCE_YONYI, v.EdbCode, v.Frequency)
  628. if err != nil {
  629. br.Msg = "获取失败"
  630. br.ErrMsg = "获取失败,Err:" + err.Error()
  631. return
  632. }
  633. if respItem.Ret != 200 {
  634. br.Msg = "未搜索到该指标"
  635. br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + v.EdbCode
  636. return
  637. }
  638. }
  639. }
  640. // 重名校验
  641. edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
  642. if e != nil {
  643. br.Msg = "操作失败"
  644. br.ErrMsg = "获取重名指标失败, Err: " + e.Error()
  645. return
  646. }
  647. nameExists := make(map[string]bool)
  648. for _, v := range edbList {
  649. nameExists[v.EdbName] = true
  650. }
  651. if len(nameExists) > 0 {
  652. for _, v := range resp {
  653. v.Exist = nameExists[v.EdbName]
  654. }
  655. }
  656. br.Data = resp
  657. br.Msg = "校验成功"
  658. br.Ret = 200
  659. br.Success = true
  660. }
  661. // YongyiAddCheck
  662. // @Title 加入指标库指标Id检测
  663. // @Description 加入指标库指标Id检测
  664. // @Param request body request.BatchAddCheckReq true "type json string"
  665. // @Success 200 string "操作成功"
  666. // @router /yongyi/edb_info/add_check [post]
  667. func (c *EdbInfoController) YongyiAddCheck() {
  668. br := new(models.BaseResponse).Init()
  669. defer func() {
  670. if br.ErrMsg == "" {
  671. br.IsSendEmail = false
  672. }
  673. c.Data["json"] = br
  674. c.ServeJSON()
  675. }()
  676. sysUser := c.SysUser
  677. if sysUser == nil {
  678. br.Msg = "请登录"
  679. br.ErrMsg = "请登录,SysUser Is Empty"
  680. br.Ret = 408
  681. return
  682. }
  683. var req data_manage.BatchAddCheckReq
  684. if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
  685. br.Msg = "参数解析异常!"
  686. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  687. return
  688. }
  689. codeMax := 30
  690. codeLen := len(req.IndexCodes)
  691. // 获取指标库已有指标
  692. existsEdb, e := data_manage.GetEdbCodesBySource(utils.DATA_SOURCE_YONYI)
  693. if e != nil {
  694. br.Msg = "获取失败"
  695. br.ErrMsg = "获取自有数据已添加的指标失败, Err: " + e.Error()
  696. return
  697. }
  698. existMap := make(map[string]*data_manage.EdbInfo)
  699. for _, v := range existsEdb {
  700. existMap[v.EdbCode] = v
  701. }
  702. if codeLen == 0 {
  703. br.Msg = "请选择指标"
  704. return
  705. }
  706. if codeLen > codeMax {
  707. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  708. return
  709. }
  710. // 查询选中的指标
  711. cond := fmt.Sprintf(` AND index_code IN (%s)`, utils.GetOrmInReplace(codeLen))
  712. pars := make([]interface{}, 0)
  713. pars = append(pars, req.IndexCodes)
  714. list, err := data_manage.GetYongyiIndex(cond, pars)
  715. if err != nil {
  716. br.Msg = "获取失败"
  717. br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
  718. return
  719. }
  720. if len(list) > codeMax {
  721. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  722. return
  723. }
  724. resp := make([]*data_manage.BaseFromYongyiIndexList, 0)
  725. for _, v := range list {
  726. if edb, ok := existMap[v.IndexCode]; ok {
  727. v.EdbInfoId = edb.EdbInfoId
  728. v.EdbExist = 1
  729. }
  730. resp = append(resp, v)
  731. }
  732. br.Data = resp
  733. br.Msg = "校验成功"
  734. br.Ret = 200
  735. br.Success = true
  736. }
  737. // YongyiEdbInfoAdd
  738. // @Title 新增指标接口
  739. // @Description 新增指标接口
  740. // @Param request body data_manage.AddEdbInfoReq true "type json string"
  741. // @Success Ret=200 保存成功
  742. // @router /yongyi/edb_info/add [post]
  743. func (this *EdbInfoController) YongyiEdbInfoAdd() {
  744. br := new(models.BaseResponse).Init()
  745. defer func() {
  746. this.Data["json"] = br
  747. this.ServeJSON()
  748. }()
  749. sysUser := this.SysUser
  750. if sysUser == nil {
  751. br.Msg = "请登录"
  752. br.ErrMsg = "请登录,SysUser Is Empty"
  753. br.Ret = 408
  754. return
  755. }
  756. deleteCache := true
  757. cacheKey := "CACHE_EDB_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  758. defer func() {
  759. if deleteCache {
  760. utils.Rc.Delete(cacheKey)
  761. }
  762. }()
  763. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  764. deleteCache = false
  765. br.Msg = "系统处理中,请稍后重试!"
  766. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  767. return
  768. }
  769. var req data_manage.AddEdbInfoReq
  770. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  771. if err != nil {
  772. br.Msg = "参数解析异常!"
  773. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  774. return
  775. }
  776. req.EdbName = strings.Trim(req.EdbName, " ")
  777. req.EdbCode = strings.Trim(req.EdbCode, " ")
  778. if req.EdbCode == "" {
  779. br.Msg = "指标ID不能为空"
  780. return
  781. }
  782. if req.EdbName == "" {
  783. br.Msg = "指标名称不能为空"
  784. return
  785. }
  786. if req.Frequency == "" {
  787. br.Msg = "频率不能为空"
  788. return
  789. }
  790. if req.Unit == "" {
  791. br.Msg = "单位不能为空"
  792. return
  793. }
  794. if req.ClassifyId <= 0 {
  795. br.Msg = "请选择分类"
  796. return
  797. }
  798. count, err := data_manage.GetYongyiIndexDataCount(req.EdbCode)
  799. if err != nil {
  800. br.Msg = "获取失败"
  801. br.ErrMsg = "获取失败,Err:" + err.Error()
  802. return
  803. }
  804. if count == 0 {
  805. br.Msg = "指标不存在"
  806. }
  807. // 指标入库
  808. edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_YONYI, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName, this.Lang)
  809. if err != nil {
  810. br.Msg = "保存失败"
  811. if errMsg != `` {
  812. br.Msg = errMsg
  813. }
  814. br.ErrMsg = err.Error()
  815. br.IsSendEmail = isSendEmail
  816. return
  817. }
  818. // 试用平台更新用户累计新增指标数
  819. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  820. if e != nil {
  821. br.Msg = "操作失败"
  822. br.ErrMsg = "获取系统用户数据失败,Err:" + e.Error()
  823. return
  824. }
  825. if utils.BusinessCode == utils.BusinessCodeSandbox && adminItem.DepartmentName == "ETA试用客户" {
  826. go func() {
  827. var r etaTrialService.EtaTrialUserReq
  828. r.Mobile = adminItem.Mobile
  829. _, _ = etaTrialService.UpdateUserIndexNum(r)
  830. }()
  831. }
  832. //新增操作日志
  833. {
  834. edbLog := new(data_manage.EdbInfoLog)
  835. edbLog.EdbInfoId = edbInfo.EdbInfoId
  836. edbLog.SourceName = edbInfo.SourceName
  837. edbLog.Source = edbInfo.Source
  838. edbLog.EdbCode = edbInfo.EdbCode
  839. edbLog.EdbName = edbInfo.EdbName
  840. edbLog.ClassifyId = edbInfo.ClassifyId
  841. edbLog.SysUserId = sysUser.AdminId
  842. edbLog.SysUserRealName = sysUser.RealName
  843. edbLog.CreateTime = time.Now()
  844. edbLog.Content = string(this.Ctx.Input.RequestBody)
  845. edbLog.Status = "新增指标"
  846. edbLog.Method = this.Ctx.Input.URI()
  847. go data_manage.AddEdbInfoLog(edbLog)
  848. }
  849. // 更新es
  850. go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
  851. resp := new(data_manage.AddEdbInfoResp)
  852. resp.EdbInfoId = edbInfo.EdbInfoId
  853. resp.UniqueCode = edbInfo.UniqueCode
  854. br.Ret = 200
  855. br.Success = true
  856. br.Msg = "保存成功"
  857. br.Data = resp
  858. br.IsAddLog = true
  859. }
  860. // ExportYongyiList
  861. // @Title 导出涌益数据
  862. // @Description 导出涌益数据
  863. // @Param ClassifyId query int true "关键字搜索"
  864. // @Param IndexCode query string true "指标编码"
  865. // @Success 200 导出成功
  866. // @router /yongyi/export [get]
  867. func (this *EdbInfoController) ExportYongyiList() {
  868. br := new(models.BaseResponse).Init()
  869. defer func() {
  870. this.Data["json"] = br
  871. this.ServeJSON()
  872. }()
  873. sysUser := this.SysUser
  874. if sysUser == nil {
  875. br.Msg = "请重新登录"
  876. return
  877. }
  878. classifyId, _ := this.GetInt("ClassifyId")
  879. indexCode := this.GetString("IndexCode")
  880. if classifyId < 0 {
  881. br.Msg = "请选择分类"
  882. return
  883. }
  884. dir, _ := os.Executable()
  885. exPath := filepath.Dir(dir)
  886. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  887. xlsxFile := xlsx.NewFile()
  888. var condition string
  889. var pars []interface{}
  890. var classifyName string
  891. if classifyId > 0 {
  892. classifyInfo, err := data_manage.GetBaseFromYongyiClassifyById(classifyId)
  893. if err != nil {
  894. if err.Error() == utils.ErrNoRow() {
  895. br.Msg = "分类不存在"
  896. return
  897. }
  898. br.Msg = "下载失败"
  899. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  900. return
  901. }
  902. classifyName = classifyInfo.ClassifyName
  903. childClassify, err := data_manage.GetBaseFromYongyiClassifyByParentId(classifyId)
  904. if err != nil {
  905. br.Msg = "下载失败"
  906. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  907. return
  908. }
  909. if len(childClassify) > 0 {
  910. condition += `AND classify_id IN (` + utils.GetOrmInReplace(len(childClassify)) + `)`
  911. for _, child := range childClassify {
  912. pars = append(pars, child.ClassifyId)
  913. }
  914. } else {
  915. condition += ` AND classify_id=?`
  916. pars = append(pars, classifyId)
  917. }
  918. } else {
  919. condition += ` AND classify_id=?`
  920. pars = append(pars, classifyId)
  921. }
  922. if indexCode != "" {
  923. condition += ` AND index_code=? `
  924. pars = append(pars, indexCode)
  925. }
  926. indexList, err := data_manage.GetYongyiIndex(condition, pars)
  927. if err != nil {
  928. fmt.Println("获取数据失败,Err:" + err.Error())
  929. return
  930. }
  931. if len(indexList) <= 0 {
  932. fmt.Println("indexList 为空")
  933. br.Ret = 200
  934. br.Success = true
  935. br.Msg = "success"
  936. return
  937. }
  938. indexCodeList := make([]string, 0)
  939. frequenciesMap := make(map[string][]*data_manage.BaseFromYongyiIndexList)
  940. for _, v := range indexList {
  941. indexCodeList = append(indexCodeList, v.IndexCode)
  942. frequenciesMap[v.Frequency] = append(frequenciesMap[v.Frequency], v)
  943. }
  944. dataListMap := make(map[string][]*data_manage.BaseFromYongyiData)
  945. if len(indexList) > 0 {
  946. allDataList, e := data_manage.GetYongyiIndexDataByCodes(indexCodeList)
  947. if e != nil {
  948. br.Msg = "获取数据失败"
  949. br.ErrMsg = "获取数据失败,Err:" + e.Error()
  950. return
  951. }
  952. for _, v := range allDataList {
  953. dataListMap[v.IndexCode] = append(dataListMap[v.IndexCode], v)
  954. }
  955. }
  956. // 按照频率分组排序
  957. frequencies := []string{
  958. "日度", "周度", "旬度", "月度", "季度", "半年度", "年度",
  959. }
  960. for _, frequency := range frequencies {
  961. //获取指标
  962. indexCodeList, ok := frequenciesMap[frequency]
  963. if !ok {
  964. continue
  965. }
  966. if len(indexCodeList) <= 0 {
  967. fmt.Printf("sheet:%s, 不存在指标", frequency)
  968. return
  969. }
  970. var sheetName string
  971. switch frequency {
  972. case "日度":
  973. sheetName = "日度(Daily)"
  974. case "周度":
  975. sheetName = "周度(Weekly)"
  976. case "旬度":
  977. sheetName = "旬度(ten-day)"
  978. case "月度":
  979. sheetName = "月度(Monthly)"
  980. case "季度":
  981. sheetName = "季度(Quarterly)"
  982. case "半年度":
  983. sheetName = "半年度(Semi-annual)"
  984. case "年度":
  985. sheetName = "年度(Annual)"
  986. default:
  987. sheetName = "其他数据"
  988. }
  989. sheetNew, err := xlsxFile.AddSheet(sheetName)
  990. if err != nil {
  991. fmt.Println("新增Sheet失败", err.Error())
  992. return
  993. }
  994. secNameRow := sheetNew.AddRow()
  995. frequencyRow := sheetNew.AddRow()
  996. unitRow := sheetNew.AddRow()
  997. lastModifyDateRow := sheetNew.AddRow()
  998. var indexIdList []int
  999. for _, idx := range frequenciesMap[frequency] {
  1000. indexIdList = append(indexIdList, idx.YongyiIndexId)
  1001. }
  1002. dataTimeList, err := data_manage.GetYongyiDataDataTimeByIndexId(indexIdList)
  1003. if err != nil {
  1004. fmt.Println("获取数据时间失败", err.Error())
  1005. return
  1006. }
  1007. // 添加excel左侧指标日期
  1008. setRowIndex := 4
  1009. for rk, dv := range dataTimeList {
  1010. rowIndex := setRowIndex + rk
  1011. row := sheetNew.Row(rowIndex)
  1012. displayDate, _ := time.Parse(utils.FormatDate, dv)
  1013. displayDateCell := row.AddCell()
  1014. style := new(xlsx.Style)
  1015. style.ApplyAlignment = true
  1016. style.Alignment.WrapText = true
  1017. displayDateCell.SetStyle(style)
  1018. displayDateCell.SetDate(displayDate)
  1019. }
  1020. for k, icl := range indexCodeList {
  1021. // 获取数据
  1022. dataList, ok := dataListMap[icl.IndexCode]
  1023. if !ok {
  1024. continue
  1025. }
  1026. if k == 0 {
  1027. secNameRow.AddCell().SetValue("指标名称/Metric Name")
  1028. frequencyRow.AddCell().SetValue("频度/Frequency")
  1029. unitRow.AddCell().SetValue("单位/Unit")
  1030. lastModifyDateRow.AddCell().SetValue("更新时间/Update Time")
  1031. min := k * 3
  1032. sheetNew.SetColWidth(min, min, 15)
  1033. }
  1034. if len(dataList) == 0 {
  1035. continue
  1036. }
  1037. secNameRow.AddCell().SetValue(icl.IndexName)
  1038. frequencyRow.AddCell().SetValue(icl.Frequency)
  1039. unitRow.AddCell().SetValue(icl.Unit)
  1040. timeDate, err := time.Parse(utils.FormatDateTime, dataList[0].ModifyTime)
  1041. if err != nil {
  1042. continue
  1043. }
  1044. lastModifyDateRow.AddCell().SetValue(timeDate.Format(utils.FormatDate))
  1045. dataInfoMap := make(map[string]*data_manage.BaseFromYongyiData)
  1046. for _, v := range dataList {
  1047. dataInfoMap[v.DataTime] = v
  1048. }
  1049. for rk, dtv := range dataTimeList {
  1050. rowIndex := setRowIndex + rk
  1051. row := sheetNew.Row(rowIndex)
  1052. displayDateCell := row.AddCell()
  1053. tmpData, ok := dataInfoMap[dtv]
  1054. if ok {
  1055. displayDateCell.SetValue(tmpData.Value)
  1056. }
  1057. }
  1058. }
  1059. }
  1060. err = xlsxFile.Save(downLoadnFilePath)
  1061. if err != nil {
  1062. //有指标无数据时先导出一遍空表
  1063. sheet, err := xlsxFile.AddSheet("无数据")
  1064. if err != nil {
  1065. br.Msg = "新增Sheet失败"
  1066. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  1067. return
  1068. }
  1069. rowSecName := sheet.AddRow()
  1070. celSecName := rowSecName.AddCell()
  1071. celSecName.SetValue("")
  1072. err = xlsxFile.Save(downLoadnFilePath)
  1073. if err != nil {
  1074. br.Msg = "保存文件失败"
  1075. br.ErrMsg = "保存文件失败"
  1076. return
  1077. }
  1078. }
  1079. fileName := classifyName
  1080. if indexCode != "" && len(indexList) == 1 {
  1081. fileName = indexList[0].IndexName
  1082. }
  1083. fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
  1084. this.Ctx.Output.Download(downLoadnFilePath, fileName)
  1085. defer func() {
  1086. os.Remove(downLoadnFilePath)
  1087. }()
  1088. br.Ret = 200
  1089. br.Success = true
  1090. br.Msg = "success"
  1091. }