yongyi_data.go 30 KB

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