yongyi_data.go 30 KB

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