yongyi_data.go 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174
  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 && !utils.IsErrNoRow(err) {
  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 utils.IsErrNoRow(err) {
  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 && !utils.IsErrNoRow(err) {
  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.String(),
  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 && !utils.IsErrNoRow(err) {
  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 && !utils.IsErrNoRow(err) {
  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.EdbClassifyId = edb.ClassifyId
  729. v.EdbUniqueCode = edb.UniqueCode
  730. v.EdbExist = 1
  731. }
  732. resp = append(resp, v)
  733. }
  734. br.Data = resp
  735. br.Msg = "校验成功"
  736. br.Ret = 200
  737. br.Success = true
  738. }
  739. // YongyiEdbInfoAdd
  740. // @Title 新增指标接口
  741. // @Description 新增指标接口
  742. // @Param request body data_manage.AddEdbInfoReq true "type json string"
  743. // @Success Ret=200 保存成功
  744. // @router /yongyi/edb_info/add [post]
  745. func (this *EdbInfoController) YongyiEdbInfoAdd() {
  746. br := new(models.BaseResponse).Init()
  747. defer func() {
  748. this.Data["json"] = br
  749. this.ServeJSON()
  750. }()
  751. sysUser := this.SysUser
  752. if sysUser == nil {
  753. br.Msg = "请登录"
  754. br.ErrMsg = "请登录,SysUser Is Empty"
  755. br.Ret = 408
  756. return
  757. }
  758. deleteCache := true
  759. cacheKey := "CACHE_EDB_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  760. defer func() {
  761. if deleteCache {
  762. utils.Rc.Delete(cacheKey)
  763. }
  764. }()
  765. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  766. deleteCache = false
  767. br.Msg = "系统处理中,请稍后重试!"
  768. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  769. return
  770. }
  771. var req data_manage.AddEdbInfoReq
  772. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  773. if err != nil {
  774. br.Msg = "参数解析异常!"
  775. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  776. return
  777. }
  778. req.EdbName = strings.Trim(req.EdbName, " ")
  779. req.EdbCode = strings.Trim(req.EdbCode, " ")
  780. if req.EdbCode == "" {
  781. br.Msg = "指标ID不能为空"
  782. return
  783. }
  784. if req.EdbName == "" {
  785. br.Msg = "指标名称不能为空"
  786. return
  787. }
  788. if req.Frequency == "" {
  789. br.Msg = "频率不能为空"
  790. return
  791. }
  792. if req.Unit == "" {
  793. br.Msg = "单位不能为空"
  794. return
  795. }
  796. if req.ClassifyId <= 0 {
  797. br.Msg = "请选择分类"
  798. return
  799. }
  800. count, err := data_manage.GetYongyiIndexDataCount(req.EdbCode)
  801. if err != nil {
  802. br.Msg = "获取失败"
  803. br.ErrMsg = "获取失败,Err:" + err.Error()
  804. return
  805. }
  806. if count == 0 {
  807. br.Msg = "指标不存在"
  808. }
  809. // 指标入库
  810. 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)
  811. if err != nil {
  812. br.Msg = "保存失败"
  813. if errMsg != `` {
  814. br.Msg = errMsg
  815. }
  816. br.ErrMsg = err.Error()
  817. br.IsSendEmail = isSendEmail
  818. return
  819. }
  820. // 试用平台更新用户累计新增指标数
  821. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  822. if e != nil {
  823. br.Msg = "操作失败"
  824. br.ErrMsg = "获取系统用户数据失败,Err:" + e.Error()
  825. return
  826. }
  827. if utils.BusinessCode == utils.BusinessCodeSandbox && adminItem.DepartmentName == "ETA试用客户" {
  828. go func() {
  829. var r etaTrialService.EtaTrialUserReq
  830. r.Mobile = adminItem.Mobile
  831. _, _ = etaTrialService.UpdateUserIndexNum(r)
  832. }()
  833. }
  834. //新增操作日志
  835. {
  836. edbLog := new(data_manage.EdbInfoLog)
  837. edbLog.EdbInfoId = edbInfo.EdbInfoId
  838. edbLog.SourceName = edbInfo.SourceName
  839. edbLog.Source = edbInfo.Source
  840. edbLog.EdbCode = edbInfo.EdbCode
  841. edbLog.EdbName = edbInfo.EdbName
  842. edbLog.ClassifyId = edbInfo.ClassifyId
  843. edbLog.SysUserId = sysUser.AdminId
  844. edbLog.SysUserRealName = sysUser.RealName
  845. edbLog.CreateTime = time.Now()
  846. edbLog.Content = string(this.Ctx.Input.RequestBody)
  847. edbLog.Status = "新增指标"
  848. edbLog.Method = this.Ctx.Input.URI()
  849. go data_manage.AddEdbInfoLog(edbLog)
  850. }
  851. // 更新es
  852. go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
  853. resp := new(data_manage.AddEdbInfoResp)
  854. resp.EdbInfoId = edbInfo.EdbInfoId
  855. resp.UniqueCode = edbInfo.UniqueCode
  856. br.Ret = 200
  857. br.Success = true
  858. br.Msg = "保存成功"
  859. br.Data = resp
  860. br.IsAddLog = true
  861. }
  862. // ExportYongyiList
  863. // @Title 导出涌益数据
  864. // @Description 导出涌益数据
  865. // @Param ClassifyId query int true "关键字搜索"
  866. // @Param IndexCode query string true "指标编码"
  867. // @Success 200 导出成功
  868. // @router /yongyi/export [get]
  869. func (this *EdbInfoController) ExportYongyiList() {
  870. br := new(models.BaseResponse).Init()
  871. defer func() {
  872. this.Data["json"] = br
  873. this.ServeJSON()
  874. }()
  875. sysUser := this.SysUser
  876. if sysUser == nil {
  877. br.Msg = "请重新登录"
  878. return
  879. }
  880. classifyId, _ := this.GetInt("ClassifyId")
  881. indexCode := this.GetString("IndexCode")
  882. if classifyId < 0 {
  883. br.Msg = "请选择分类"
  884. return
  885. }
  886. dir, _ := os.Executable()
  887. exPath := filepath.Dir(dir)
  888. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  889. xlsxFile := xlsx.NewFile()
  890. var condition string
  891. var pars []interface{}
  892. var classifyName string
  893. if classifyId > 0 {
  894. classifyInfo, err := data_manage.GetBaseFromYongyiClassifyById(classifyId)
  895. if err != nil {
  896. if utils.IsErrNoRow(err) {
  897. br.Msg = "分类不存在"
  898. return
  899. }
  900. br.Msg = "下载失败"
  901. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  902. return
  903. }
  904. classifyName = classifyInfo.ClassifyName
  905. childClassify, err := data_manage.GetBaseFromYongyiClassifyByParentId(classifyId)
  906. if err != nil {
  907. br.Msg = "下载失败"
  908. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  909. return
  910. }
  911. if len(childClassify) > 0 {
  912. condition += `AND classify_id IN (` + utils.GetOrmInReplace(len(childClassify)) + `)`
  913. var classifyIdList []int
  914. for _, child := range childClassify {
  915. classifyIdList = append(classifyIdList, child.ClassifyId)
  916. }
  917. pars = append(pars, classifyIdList)
  918. } else {
  919. condition += ` AND classify_id=?`
  920. pars = append(pars, classifyId)
  921. }
  922. } else {
  923. condition += ` AND classify_id=?`
  924. pars = append(pars, classifyId)
  925. }
  926. if indexCode != "" {
  927. condition += ` AND index_code=? `
  928. pars = append(pars, indexCode)
  929. }
  930. indexList, err := data_manage.GetYongyiIndex(condition, pars)
  931. if err != nil {
  932. fmt.Println("获取数据失败,Err:" + err.Error())
  933. return
  934. }
  935. if len(indexList) <= 0 {
  936. fmt.Println("indexList 为空")
  937. br.Ret = 200
  938. br.Success = true
  939. br.Msg = "success"
  940. return
  941. }
  942. indexCodeList := make([]string, 0)
  943. frequenciesMap := make(map[string][]*data_manage.BaseFromYongyiIndexList)
  944. for _, v := range indexList {
  945. indexCodeList = append(indexCodeList, v.IndexCode)
  946. frequenciesMap[v.Frequency] = append(frequenciesMap[v.Frequency], v)
  947. }
  948. dataListMap := make(map[string][]*data_manage.BaseFromYongyiData)
  949. if len(indexList) > 0 {
  950. allDataList, e := data_manage.GetYongyiIndexDataByCodes(indexCodeList)
  951. if e != nil {
  952. br.Msg = "获取数据失败"
  953. br.ErrMsg = "获取数据失败,Err:" + e.Error()
  954. return
  955. }
  956. for _, v := range allDataList {
  957. dataListMap[v.IndexCode] = append(dataListMap[v.IndexCode], v)
  958. }
  959. }
  960. // 按照频率分组排序
  961. frequencies := []string{
  962. "日度", "周度", "旬度", "月度", "季度", "半年度", "年度",
  963. }
  964. for _, frequency := range frequencies {
  965. //获取指标
  966. indexCodeList, ok := frequenciesMap[frequency]
  967. if !ok {
  968. continue
  969. }
  970. if len(indexCodeList) <= 0 {
  971. fmt.Printf("sheet:%s, 不存在指标", frequency)
  972. return
  973. }
  974. var sheetName string
  975. switch frequency {
  976. case "日度":
  977. sheetName = "日度(Daily)"
  978. case "周度":
  979. sheetName = "周度(Weekly)"
  980. case "旬度":
  981. sheetName = "旬度(ten-day)"
  982. case "月度":
  983. sheetName = "月度(Monthly)"
  984. case "季度":
  985. sheetName = "季度(Quarterly)"
  986. case "半年度":
  987. sheetName = "半年度(Semi-annual)"
  988. case "年度":
  989. sheetName = "年度(Annual)"
  990. default:
  991. sheetName = "其他数据"
  992. }
  993. sheetNew, err := xlsxFile.AddSheet(sheetName)
  994. if err != nil {
  995. fmt.Println("新增Sheet失败", err.Error())
  996. return
  997. }
  998. secNameRow := sheetNew.AddRow()
  999. frequencyRow := sheetNew.AddRow()
  1000. unitRow := sheetNew.AddRow()
  1001. lastModifyDateRow := sheetNew.AddRow()
  1002. var indexIdList []int
  1003. for _, idx := range frequenciesMap[frequency] {
  1004. indexIdList = append(indexIdList, idx.YongyiIndexId)
  1005. }
  1006. dataTimeList, err := data_manage.GetYongyiDataDataTimeByIndexId(indexIdList)
  1007. if err != nil {
  1008. fmt.Println("获取数据时间失败", err.Error())
  1009. return
  1010. }
  1011. // 添加excel左侧指标日期
  1012. setRowIndex := 4
  1013. for rk, dv := range dataTimeList {
  1014. rowIndex := setRowIndex + rk
  1015. row := sheetNew.Row(rowIndex)
  1016. displayDate, _ := time.Parse(utils.FormatDate, dv)
  1017. displayDateCell := row.AddCell()
  1018. style := new(xlsx.Style)
  1019. style.ApplyAlignment = true
  1020. style.Alignment.WrapText = true
  1021. displayDateCell.SetStyle(style)
  1022. displayDateCell.SetDate(displayDate)
  1023. }
  1024. for k, icl := range indexCodeList {
  1025. // 获取数据
  1026. dataList, ok := dataListMap[icl.IndexCode]
  1027. if !ok {
  1028. continue
  1029. }
  1030. if k == 0 {
  1031. secNameRow.AddCell().SetValue("指标名称/Metric Name")
  1032. frequencyRow.AddCell().SetValue("频度/Frequency")
  1033. unitRow.AddCell().SetValue("单位/Unit")
  1034. lastModifyDateRow.AddCell().SetValue("更新时间/Update Time")
  1035. min := k * 3
  1036. sheetNew.SetColWidth(min, min, 15)
  1037. }
  1038. if len(dataList) == 0 {
  1039. continue
  1040. }
  1041. secNameRow.AddCell().SetValue(icl.IndexName)
  1042. frequencyRow.AddCell().SetValue(icl.Frequency)
  1043. unitRow.AddCell().SetValue(icl.Unit)
  1044. timeDate, err := time.Parse(utils.FormatDateTime, dataList[0].ModifyTime)
  1045. if err != nil {
  1046. continue
  1047. }
  1048. lastModifyDateRow.AddCell().SetValue(timeDate.Format(utils.FormatDate))
  1049. dataInfoMap := make(map[string]*data_manage.BaseFromYongyiData)
  1050. for _, v := range dataList {
  1051. dataInfoMap[v.DataTime] = v
  1052. }
  1053. for rk, dtv := range dataTimeList {
  1054. rowIndex := setRowIndex + rk
  1055. row := sheetNew.Row(rowIndex)
  1056. displayDateCell := row.AddCell()
  1057. tmpData, ok := dataInfoMap[dtv]
  1058. if ok {
  1059. displayDateCell.SetValue(tmpData.Value)
  1060. }
  1061. }
  1062. }
  1063. }
  1064. err = xlsxFile.Save(downLoadnFilePath)
  1065. if err != nil {
  1066. //有指标无数据时先导出一遍空表
  1067. sheet, err := xlsxFile.AddSheet("无数据")
  1068. if err != nil {
  1069. br.Msg = "新增Sheet失败"
  1070. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  1071. return
  1072. }
  1073. rowSecName := sheet.AddRow()
  1074. celSecName := rowSecName.AddCell()
  1075. celSecName.SetValue("")
  1076. err = xlsxFile.Save(downLoadnFilePath)
  1077. if err != nil {
  1078. br.Msg = "保存文件失败"
  1079. br.ErrMsg = "保存文件失败"
  1080. return
  1081. }
  1082. }
  1083. fileName := classifyName
  1084. if indexCode != "" && len(indexList) == 1 {
  1085. fileName = indexList[0].IndexName
  1086. }
  1087. fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
  1088. this.Ctx.Output.Download(downLoadnFilePath, fileName)
  1089. defer func() {
  1090. os.Remove(downLoadnFilePath)
  1091. }()
  1092. br.Ret = 200
  1093. br.Success = true
  1094. br.Msg = "success"
  1095. }