fenwei_data.go 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  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/system"
  7. "eta/eta_api/services/data"
  8. etaTrialService "eta/eta_api/services/eta_trial"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "github.com/rdlucklib/rdluck_tools/paging"
  12. "github.com/tealeg/xlsx"
  13. "os"
  14. "path/filepath"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. // FenweiClassify
  20. // @Title 汾渭数据分类
  21. // @Description 汾渭数据分类接口
  22. // @Success 200 {object} data_manage.BaseFromFenweiClassifyItem
  23. // @router /fenwei/classify [get]
  24. func (this *EdbInfoController) FenweiClassify() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. if br.ErrMsg == "" {
  28. br.IsSendEmail = false
  29. }
  30. this.Data["json"] = br
  31. this.ServeJSON()
  32. }()
  33. sysUser := this.SysUser
  34. if sysUser == nil {
  35. br.Msg = "请登录"
  36. br.ErrMsg = "请登录,SysUser Is Empty"
  37. br.Ret = 408
  38. return
  39. }
  40. classifies, e := data_manage.GetBaseFromFenweiClassify()
  41. if e != nil {
  42. br.Msg = "获取失败"
  43. br.ErrMsg = "获取汾渭数据分类失败, Err: " + e.Error()
  44. return
  45. }
  46. classifyOb := new(data_manage.BaseFromFenweiClassify)
  47. resp := make([]*data_manage.BaseFromFenweiClassifyItem, 0)
  48. parentMap := make(map[int][]*data_manage.BaseFromFenweiClassifyItem)
  49. for _, v := range classifies {
  50. t := classifyOb.Format2Item(v)
  51. if v.ParentId == 0 {
  52. resp = append(resp, t)
  53. }
  54. if v.ParentId > 0 {
  55. if parentMap[v.ParentId] == nil {
  56. parentMap[v.ParentId] = make([]*data_manage.BaseFromFenweiClassifyItem, 0)
  57. }
  58. parentMap[v.ParentId] = append(parentMap[v.ParentId], t)
  59. }
  60. }
  61. for _, v := range resp {
  62. v.Child = parentMap[v.ClassifyId]
  63. }
  64. br.Data = resp
  65. br.Ret = 200
  66. br.Success = true
  67. br.Msg = "获取成功"
  68. }
  69. // FenweiIndexData
  70. // @Title 获取汾渭数据
  71. // @Description 获取汾渭数据接口
  72. // @Param PageSize query int true "每页数据条数"
  73. // @Param CurrentIndex query int true "当前页页码,从1开始"
  74. // @Param ClassifyId query string true "分类id"
  75. // @Param Frequency query string true "频率"
  76. // @Success 200 {object} data_manage.LzFrequency
  77. // @router /fenwei/index/data [get]
  78. func (this *EdbInfoController) FenweiIndexData() {
  79. br := new(models.BaseResponse).Init()
  80. defer func() {
  81. if br.ErrMsg == "" {
  82. br.IsSendEmail = false
  83. }
  84. this.Data["json"] = br
  85. this.ServeJSON()
  86. }()
  87. sysUser := this.SysUser
  88. if sysUser == nil {
  89. br.Msg = "请登录"
  90. br.ErrMsg = "请登录,SysUser Is Empty"
  91. br.Ret = 408
  92. return
  93. }
  94. pageSize, _ := this.GetInt("PageSize")
  95. currentIndex, _ := this.GetInt("CurrentIndex")
  96. var startSize int
  97. if pageSize <= 0 {
  98. pageSize = utils.PageSize20
  99. }
  100. if currentIndex <= 0 {
  101. currentIndex = 1
  102. }
  103. startSize = utils.StartIndex(currentIndex, pageSize)
  104. classifyId, _ := this.GetInt("ClassifyId")
  105. if classifyId < 0 {
  106. br.Msg = "请选择分类"
  107. br.ErrMsg = "请选择分类"
  108. return
  109. }
  110. frequency := this.GetString("Frequency")
  111. // 获取指标
  112. var condition string
  113. var pars []interface{}
  114. if classifyId >= 0 {
  115. condition += ` AND classify_id=? `
  116. pars = append(pars, classifyId)
  117. }
  118. if frequency != "" {
  119. condition += ` AND frequency=? `
  120. pars = append(pars, frequency)
  121. }
  122. indexes, err := data_manage.GetFenweiIndex(condition, pars)
  123. if err != nil {
  124. br.Msg = "获取数据失败"
  125. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  126. return
  127. }
  128. indexCodes := make([]string, 0)
  129. for _, v := range indexes {
  130. indexCodes = append(indexCodes, v.IndexCode)
  131. }
  132. indexCounts, e := data_manage.GetFenweiIndexDataCountGroup(indexCodes)
  133. if e != nil {
  134. br.Msg = "获取失败"
  135. br.ErrMsg = "获取指标数据总量失败, Err:" + err.Error()
  136. return
  137. }
  138. countMap := make(map[string]int)
  139. for _, v := range indexCounts {
  140. countMap[v.IndexCode] = v.Count
  141. }
  142. // 判断是否存在于指标库
  143. edbCodeList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_FENWEI, indexCodes)
  144. if err != nil {
  145. return
  146. }
  147. edbCodeMap := make(map[string]*data_manage.EdbInfo)
  148. for _, v := range edbCodeList {
  149. edbCodeMap[v.EdbCode] = v
  150. }
  151. resultList := make([]*data_manage.BaseFromFenweiIndexList, 0)
  152. for _, v := range indexes {
  153. product := new(data_manage.BaseFromFenweiIndexList)
  154. product.FenweiIndexId = v.FenweiIndexId
  155. product.ClassifyId = v.ClassifyId
  156. product.Unit = v.Unit
  157. product.IndexCode = v.IndexCode
  158. product.IndexName = v.IndexName
  159. product.Frequency = v.Frequency
  160. product.CreateTime = v.CreateTime
  161. product.ModifyTime = v.ModifyTime
  162. edbInfo := edbCodeMap[v.IndexCode]
  163. if edbInfo != nil {
  164. product.EdbInfoId = edbInfo.EdbInfoId
  165. }
  166. total := countMap[v.IndexCode]
  167. page := paging.GetPaging(currentIndex, pageSize, total)
  168. dataList, e := data_manage.GetFenweiIndexData(v.IndexCode, startSize, pageSize)
  169. if e != nil {
  170. br.Msg = "获取数据失败"
  171. br.ErrMsg = "获取指标数据失败,Err:" + e.Error()
  172. return
  173. }
  174. if dataList == nil {
  175. dataList = make([]*data_manage.BaseFromFenweiData, 0)
  176. }
  177. product.DataList = dataList
  178. product.Paging = page
  179. resultList = append(resultList, product)
  180. }
  181. br.Ret = 200
  182. br.Success = true
  183. br.Msg = "获取成功"
  184. br.Data = resultList
  185. }
  186. // FenweiSearchList
  187. // @Title Fenwei模糊搜索
  188. // @Description Fenwei模糊搜索
  189. // @Param Keyword query string ture "关键字搜索"
  190. // @Success 200 {object} data_manage.BaseFromFenweiIndexSearchItem
  191. // @router /fenwei/search_list [get]
  192. func (this *EdbInfoController) FenweiSearchList() {
  193. br := new(models.BaseResponse).Init()
  194. defer func() {
  195. if br.ErrMsg == "" {
  196. br.IsSendEmail = false
  197. }
  198. this.Data["json"] = br
  199. this.ServeJSON()
  200. }()
  201. sysUser := this.SysUser
  202. if sysUser == nil {
  203. br.Msg = "请登录"
  204. br.ErrMsg = "请登录,SysUser Is Empty"
  205. br.Ret = 408
  206. return
  207. }
  208. list := make([]*data_manage.BaseFromFenweiIndexSearchItem, 0)
  209. var err error
  210. // 关键字
  211. keyword := this.GetString("Keyword")
  212. if keyword != "" {
  213. keyWordArr := strings.Split(keyword, " ")
  214. if len(keyWordArr) > 0 {
  215. condition := ""
  216. for _, v := range keyWordArr {
  217. condition += ` AND CONCAT(index_name,index_code) LIKE '%` + v + `%'`
  218. }
  219. list, err = data_manage.GetFenweiItemList(condition)
  220. if err != nil {
  221. br.ErrMsg = "获取失败,Err:" + err.Error()
  222. br.Msg = "获取失败"
  223. return
  224. }
  225. }
  226. } else {
  227. list, err = data_manage.GetFenweiItemList("")
  228. if err != nil {
  229. br.ErrMsg = "获取失败,Err:" + err.Error()
  230. br.Msg = "获取失败"
  231. return
  232. }
  233. }
  234. br.Ret = 200
  235. br.Success = true
  236. br.Msg = "获取成功"
  237. br.Data = list
  238. }
  239. // FenweiSingleData
  240. // @Title 获取Fenwei数据
  241. // @Description 获取Fenwei单条数据接口
  242. // @Param IndexCode query string true "指标唯一编码"
  243. // @Success 200 {object} models.BaseResponse
  244. // @router /fenwei/single_data [get]
  245. func (this *EdbInfoController) FenweiSingleData() {
  246. br := new(models.BaseResponse).Init()
  247. defer func() {
  248. if br.ErrMsg == "" {
  249. br.IsSendEmail = false
  250. }
  251. this.Data["json"] = br
  252. this.ServeJSON()
  253. }()
  254. sysUser := this.SysUser
  255. if sysUser == nil {
  256. br.Msg = "请登录"
  257. br.ErrMsg = "请登录,SysUser Is Empty"
  258. br.Ret = 408
  259. return
  260. }
  261. indexCode := this.GetString("IndexCode")
  262. indexInfo, err := data_manage.GetBaseFromFenweiIndexByIndexCode(indexCode)
  263. if err != nil {
  264. br.Msg = "获取指标信息失败"
  265. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  266. return
  267. }
  268. dataTmpList, err := data_manage.GetFenweiIndexDataByCode(indexCode)
  269. if err != nil {
  270. br.Msg = "获取数据失败"
  271. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  272. return
  273. }
  274. indexCodeList := []string{indexCode}
  275. edbCodeList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_FENWEI, indexCodeList)
  276. if err != nil {
  277. return
  278. }
  279. var ret data_manage.FenweiSingleDataResp
  280. var dataList []*data_manage.FenweiSingleData
  281. ret.ClassifyId = indexInfo.ClassifyId
  282. ret.FenweiIndexId = indexInfo.FenweiIndexId
  283. ret.IndexCode = indexInfo.IndexCode
  284. ret.IndexName = indexInfo.IndexName
  285. ret.Frequency = indexInfo.Frequency
  286. ret.CreateTime = indexInfo.CreateTime.Format(utils.FormatDateTime)
  287. ret.ModifyTime = indexInfo.ModifyTime.Format(utils.FormatDateTime)
  288. ret.Unit = indexInfo.Unit
  289. for _, v := range dataTmpList {
  290. tmp := &data_manage.FenweiSingleData{
  291. Value: v.Value,
  292. DataTime: v.DataTime,
  293. }
  294. dataList = append(dataList, tmp)
  295. }
  296. ret.Data = dataList
  297. if len(edbCodeList) > 0 {
  298. edbInfo := edbCodeList[0]
  299. ret.EdbInfoId = edbInfo.EdbInfoId
  300. }
  301. br.Ret = 200
  302. br.Success = true
  303. br.Msg = "获取成功"
  304. br.Data = ret
  305. }
  306. // ExportFenweiList
  307. // @Title 导出Fenwei数据
  308. // @Description 导出Fenwei数据
  309. // @Param IndexName query string false "名称关键词"
  310. // @Param IndexCode query string false "指标唯一编码"
  311. // @Param ClassifyId query string true "分类"
  312. // @Success 200 导出成功
  313. // @router /fenwei/export [get]
  314. func (this *EdbInfoController) ExportFenweiList() {
  315. br := new(models.BaseResponse).Init()
  316. defer func() {
  317. if br.ErrMsg == "" {
  318. br.IsSendEmail = false
  319. }
  320. this.Data["json"] = br
  321. this.ServeJSON()
  322. }()
  323. sysUser := this.SysUser
  324. if sysUser == nil {
  325. br.Msg = "请重新登录"
  326. return
  327. }
  328. indexCode := this.GetString("IndexCode") //指标唯一编码
  329. classifyId, _ := this.GetInt("ClassifyId")
  330. //secNameList := make([]*models.EdbdataExportList, 0)
  331. dir, _ := os.Executable()
  332. exPath := filepath.Dir(dir)
  333. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  334. xlsxFile := xlsx.NewFile()
  335. var pars []interface{}
  336. condition := ""
  337. if classifyId > 0 {
  338. //获取指标
  339. condition += " AND classify_id=?"
  340. pars = append(pars, classifyId)
  341. }
  342. if indexCode != "" {
  343. //获取指标
  344. condition += " AND index_code=?"
  345. pars = append(pars, indexCode)
  346. }
  347. indexList, err := data_manage.GetFenweiIndex(condition, pars)
  348. if err != nil {
  349. fmt.Println("获取数据失败,Err:" + err.Error())
  350. return
  351. }
  352. if len(indexList) <= 0 {
  353. fmt.Println("indexList 为空")
  354. br.Ret = 200
  355. br.Success = true
  356. br.Msg = "success"
  357. return
  358. }
  359. sheetNew := new(xlsx.Sheet)
  360. // todo 分类名称
  361. sheetNew, err = xlsxFile.AddSheet("汾渭数据")
  362. //sheetNew.SetColWidth()
  363. //获取指标数据
  364. windRow := sheetNew.AddRow()
  365. secNameRow := sheetNew.AddRow()
  366. indexCodeRow := sheetNew.AddRow()
  367. frequencyRow := sheetNew.AddRow()
  368. unitRow := sheetNew.AddRow()
  369. lastModifyDateRow := sheetNew.AddRow()
  370. //获取分类下指标最大数据量
  371. var dataMax int
  372. setRowIndex := 6
  373. indexCodeList := make([]string, 0)
  374. for _, v := range indexList {
  375. indexCodeList = append(indexCodeList, v.IndexCode)
  376. }
  377. dataListMap := make(map[string][]*data_manage.BaseFromFenweiData)
  378. if len(indexList) > 0 {
  379. allDataList, e := data_manage.GetFenweiIndexDataByCodes(indexCodeList)
  380. if e != nil {
  381. br.Msg = "获取数据失败"
  382. br.ErrMsg = "获取数据失败,Err:" + e.Error()
  383. return
  384. }
  385. for _, v := range allDataList {
  386. dataListMap[v.IndexCode] = append(dataListMap[v.IndexCode], v)
  387. }
  388. for _, v := range dataListMap {
  389. if len(v) > dataMax {
  390. dataMax = len(v)
  391. }
  392. }
  393. }
  394. for k, sv := range indexList {
  395. //获取数据
  396. dataList, ok := dataListMap[sv.IndexCode]
  397. if !ok {
  398. continue
  399. }
  400. if len(dataList) > 0 {
  401. windRow.AddCell().SetValue("汾渭数据")
  402. secNameRow.AddCell().SetValue("指标名称")
  403. indexCodeRow.AddCell().SetValue("指标ID")
  404. frequencyRow.AddCell().SetValue("频率")
  405. unitRow.AddCell().SetValue("单位")
  406. lastModifyDateRow.AddCell().SetValue("更新时间")
  407. secNameRow.AddCell().SetValue(sv.IndexName)
  408. indexCodeRow.AddCell().SetValue(sv.IndexCode)
  409. frequencyRow.AddCell().SetValue(sv.Frequency)
  410. unitRow.AddCell().SetValue(sv.Unit)
  411. lastModifyDateRow.AddCell().SetValue(sv.ModifyTime)
  412. windRow.AddCell()
  413. windRow.AddCell()
  414. secNameRow.AddCell()
  415. indexCodeRow.AddCell()
  416. frequencyRow.AddCell()
  417. unitRow.AddCell()
  418. lastModifyDateRow.AddCell()
  419. min := k * 3
  420. sheetNew.SetColWidth(min, min, 15)
  421. if len(dataList) <= 0 {
  422. for n := 0; n < dataMax; n++ {
  423. rowIndex := setRowIndex + n
  424. row := sheetNew.Row(rowIndex)
  425. row.AddCell()
  426. row.AddCell()
  427. row.AddCell()
  428. }
  429. } else {
  430. endRowIndex := 0
  431. for rk, dv := range dataList {
  432. rowIndex := setRowIndex + rk
  433. row := sheetNew.Row(rowIndex)
  434. displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
  435. displayDateCell := row.AddCell()
  436. style := new(xlsx.Style)
  437. style.ApplyAlignment = true
  438. style.Alignment.WrapText = true
  439. displayDateCell.SetStyle(style)
  440. displayDateCell.SetDate(displayDate)
  441. row.AddCell().SetValue(dv.Value)
  442. row.AddCell()
  443. endRowIndex = rowIndex
  444. }
  445. if len(dataList) < dataMax {
  446. dataLen := dataMax - len(dataList)
  447. for n := 0; n < dataLen; n++ {
  448. rowIndex := (endRowIndex + 1) + n
  449. row := sheetNew.Row(rowIndex)
  450. row.AddCell()
  451. row.AddCell()
  452. row.AddCell()
  453. }
  454. }
  455. }
  456. }
  457. }
  458. err = xlsxFile.Save(downLoadnFilePath)
  459. if err != nil {
  460. //有指标无数据时先导出一遍空表
  461. sheet, err := xlsxFile.AddSheet("无数据")
  462. if err != nil {
  463. br.Msg = "新增Sheet失败"
  464. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  465. return
  466. }
  467. rowSecName := sheet.AddRow()
  468. celSecName := rowSecName.AddCell()
  469. celSecName.SetValue("")
  470. err = xlsxFile.Save(downLoadnFilePath)
  471. if err != nil {
  472. br.Msg = "保存文件失败"
  473. br.ErrMsg = "保存文件失败"
  474. return
  475. }
  476. }
  477. fileName := `汾渭数据`
  478. if len(indexList) > 0 {
  479. fileName = indexList[0].IndexName
  480. }
  481. fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
  482. this.Ctx.Output.Download(downLoadnFilePath, fileName)
  483. defer func() {
  484. os.Remove(downLoadnFilePath)
  485. }()
  486. br.Ret = 200
  487. br.Success = true
  488. br.Msg = "success"
  489. }
  490. // GetFenWeiFrequencyList
  491. // @Title 查询频率列表
  492. // @Description 查询频率列表
  493. // @Param classifyId query int false "指标唯一编码"
  494. // @Success 200 {object} []string
  495. // @router /fenwei/frequency/list [get]
  496. func (this *EdbInfoController) GetFenWeiFrequencyList() {
  497. br := new(models.BaseResponse).Init()
  498. defer func() {
  499. if br.ErrMsg == "" {
  500. br.IsSendEmail = false
  501. }
  502. this.Data["json"] = br
  503. this.ServeJSON()
  504. }()
  505. sysUser := this.SysUser
  506. if sysUser == nil {
  507. br.Msg = "请登录"
  508. br.ErrMsg = "请登录,SysUser Is Empty"
  509. br.Ret = 408
  510. return
  511. }
  512. classifyId, _ := this.GetInt("ClassifyId")
  513. frequencyList, err := data_manage.GetFenWeiIndexFrequency(classifyId)
  514. if err != nil {
  515. return
  516. }
  517. br.Ret = 200
  518. br.Success = true
  519. br.Msg = "获取成功"
  520. br.Data = frequencyList
  521. }
  522. // FenWeiIndexAddValidate
  523. // @Title 新增加入到指标库校验
  524. // @Description 新增加入到指标库校验
  525. // @Param req body data_manage.BaseFromFenWeiIndexBatchAddCheckReq true "请求参数"
  526. // @Success 200 {object} []data_manage.IndexCheckData
  527. // @router /fenwei/index/add/validate [post]
  528. func (this *EdbInfoController) FenWeiIndexAddValidate() {
  529. br := new(models.BaseResponse).Init()
  530. defer func() {
  531. if br.ErrMsg == "" {
  532. br.IsSendEmail = false
  533. }
  534. this.Data["json"] = br
  535. this.ServeJSON()
  536. }()
  537. sysUser := this.SysUser
  538. if sysUser == nil {
  539. br.Msg = "请登录"
  540. br.ErrMsg = "请登录,SysUser Is Empty"
  541. br.Ret = 408
  542. return
  543. }
  544. var req *data_manage.BaseFromFenWeiIndexBatchAddCheckReq
  545. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  546. br.Msg = "参数解析异常!"
  547. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  548. return
  549. }
  550. codeLen := len(req.IndexCodes)
  551. var codeMax = 30
  552. if codeLen > codeMax {
  553. br.Msg = "批量添加指标数量不得超过" + strconv.Itoa(codeMax) + "个"
  554. br.ErrMsg = "批量添加指标数量不得超过" + strconv.Itoa(codeMax) + "个"
  555. return
  556. }
  557. // 校验指标编码是否存在
  558. addValidate, err := data.FenWeiIndexAddValidate(req.IndexCodes)
  559. if err != nil {
  560. return
  561. }
  562. br.Data = addValidate
  563. br.Ret = 200
  564. br.Success = true
  565. br.Msg = "操作成功"
  566. }
  567. // FenWeiIndexAdd
  568. // @Title 指标添加到指标库
  569. // @Description 指标添加到指标库
  570. // @Param req body []data_manage.AddEdbInfoReq true "请求参数"
  571. // @Success 200 string "操作成功"
  572. // @router /fenwei/index/add [post]
  573. func (this *EdbInfoController) FenWeiIndexAdd() {
  574. br := new(models.BaseResponse).Init()
  575. defer func() {
  576. if br.ErrMsg == "" {
  577. br.IsSendEmail = false
  578. }
  579. this.Data["json"] = br
  580. this.ServeJSON()
  581. }()
  582. sysUser := this.SysUser
  583. if sysUser == nil {
  584. br.Msg = "请登录"
  585. br.ErrMsg = "请登录,SysUser Is Empty"
  586. br.Ret = 408
  587. return
  588. }
  589. deleteCache := true
  590. cacheKey := "CACHE_EDB_INFO_BATCH_ADD_FENWEI_" + strconv.Itoa(sysUser.AdminId)
  591. defer func() {
  592. if deleteCache {
  593. _ = utils.Rc.Delete(cacheKey)
  594. }
  595. }()
  596. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  597. deleteCache = false
  598. br.Msg = "系统处理中,请稍后重试!"
  599. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  600. return
  601. }
  602. var req []*data_manage.AddEdbInfoReq
  603. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  604. br.Msg = "参数解析异常!"
  605. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  606. return
  607. }
  608. if len(req) == 0 {
  609. br.Msg = "请选择指标"
  610. return
  611. }
  612. codeMax := 30
  613. if len(req) > codeMax {
  614. br.Msg = "批量添加指标数量不得超过" + strconv.Itoa(codeMax) + "个"
  615. return
  616. }
  617. indexNames := make([]string, 0)
  618. resp := make([]*data_manage.FenWeiNameCheckResult, 0)
  619. for _, index := range req {
  620. index.EdbCode = strings.TrimSpace(index.EdbCode)
  621. if index.EdbCode == "" {
  622. br.Msg = "指标ID不可为空"
  623. return
  624. }
  625. index.EdbName = strings.TrimSpace(index.EdbName)
  626. if index.EdbName == "" {
  627. br.Msg = "请输入指标名称"
  628. return
  629. }
  630. index.Frequency = strings.TrimSpace(index.Frequency)
  631. if index.Frequency == "" {
  632. br.Msg = "请选择频度"
  633. return
  634. }
  635. index.Unit = strings.TrimSpace(index.Unit)
  636. if index.Unit == "" {
  637. br.Msg = "请输入单位"
  638. return
  639. }
  640. if index.ClassifyId <= 0 {
  641. br.Msg = "请选择分类"
  642. return
  643. }
  644. indexNames = append(indexNames, index.EdbName)
  645. resp = append(resp, &data_manage.FenWeiNameCheckResult{
  646. IndexCode: index.EdbCode,
  647. IndexName: index.EdbName,
  648. Exist: false,
  649. })
  650. }
  651. // 指标名称重复校验
  652. nameCheck, err := data.FenWeiIndexNameCheck(indexNames, resp)
  653. if err != nil {
  654. br.Msg = err.Error()
  655. br.ErrMsg = err.Error()
  656. return
  657. }
  658. for _, v := range nameCheck {
  659. if v.Exist {
  660. br.Msg = "指标名称重复"
  661. br.Data = nameCheck
  662. br.Ret = 200
  663. br.Success = true
  664. return
  665. }
  666. }
  667. for _, v := range req {
  668. var fenWeiIndexAddReq data_manage.FenWeiIndexAddReq
  669. fenWeiIndexAddReq.EdbCode = v.EdbCode
  670. fenWeiIndexAddReq.EdbName = v.EdbName
  671. fenWeiIndexAddReq.Frequency = v.Frequency
  672. fenWeiIndexAddReq.Unit = v.Unit
  673. fenWeiIndexAddReq.ClassifyId = v.ClassifyId
  674. fenWeiIndexAddReq.AdminId = sysUser.AdminId
  675. fenWeiIndexAddReq.AdminRealName = sysUser.RealName
  676. // 新增指标到指标库
  677. edbInfo, e, errMsg, skip := data.FenWeiIndexAdd(fenWeiIndexAddReq, this.Lang)
  678. if e != nil {
  679. br.Msg = "操作失败"
  680. if errMsg != "" {
  681. br.Msg = errMsg
  682. }
  683. br.ErrMsg = e.Error()
  684. return
  685. }
  686. if skip {
  687. continue
  688. }
  689. // todo 下面两段代码能否抽离出来???
  690. // 试用平台更新用户累计新增指标数
  691. if utils.BusinessCode == utils.BusinessCodeSandbox {
  692. go func() {
  693. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  694. if e != nil {
  695. tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
  696. utils.FileLog.Info(tips)
  697. return
  698. }
  699. if adminItem.DepartmentName != "ETA试用客户" {
  700. return
  701. }
  702. var ur etaTrialService.EtaTrialUserReq
  703. ur.Mobile = adminItem.Mobile
  704. _, _ = etaTrialService.UpdateUserIndexNum(ur)
  705. }()
  706. }
  707. // 新增操作日志
  708. {
  709. edbLog := new(data_manage.EdbInfoLog)
  710. edbLog.EdbInfoId = edbInfo.EdbInfoId
  711. edbLog.SourceName = edbInfo.SourceName
  712. edbLog.Source = edbInfo.Source
  713. edbLog.EdbCode = edbInfo.EdbCode
  714. edbLog.EdbName = edbInfo.EdbName
  715. edbLog.ClassifyId = edbInfo.ClassifyId
  716. edbLog.SysUserId = sysUser.AdminId
  717. edbLog.SysUserRealName = sysUser.RealName
  718. edbLog.CreateTime = time.Now()
  719. edbLog.Content = string(this.Ctx.Input.RequestBody)
  720. edbLog.Status = "新增指标"
  721. edbLog.Method = this.Ctx.Input.URI()
  722. go data_manage.AddEdbInfoLog(edbLog)
  723. }
  724. }
  725. br.Msg = "操作成功"
  726. br.Ret = 200
  727. br.Success = true
  728. br.IsAddLog = true
  729. }
  730. // FenWeiIndexDataExport
  731. // @Title 导出指标数据
  732. // @Description 导出指标数据
  733. // @Param IndexCode query string false "指标编码"
  734. // @Param ClassifyId query int false "分类ID"
  735. // @Success 200 string "操作成功"
  736. // @router /fenwei/index/data/export [get]
  737. func (this *EdbInfoController) FenWeiIndexDataExport() {
  738. br := new(models.BaseResponse).Init()
  739. defer func() {
  740. this.Data["json"] = br
  741. this.ServeJSON()
  742. }()
  743. sysUser := this.SysUser
  744. if sysUser == nil {
  745. br.Msg = "请重新登录"
  746. return
  747. }
  748. classifyId, _ := this.GetInt("ClassifyId") //分类
  749. indexCode := this.GetString("IndexCode") //指标唯一编码
  750. if classifyId <= 0 {
  751. br.Msg = "请选择分类"
  752. return
  753. }
  754. //userId := sysUser.AdminId
  755. //超管账号可以查看分类下的所有频度数据
  756. /*if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  757. userId = 0
  758. }*/
  759. //获取账户所拥有权限的分类id集合
  760. /*classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(userId))
  761. if err != nil {
  762. br.Msg = "获取分类数据失败"
  763. return
  764. }*/
  765. dir, _ := os.Executable()
  766. exPath := filepath.Dir(dir)
  767. downLoadFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  768. xlsxFile := xlsx.NewFile()
  769. frequencies, err := data_manage.GetFenWeiIndexFrequency(classifyId)
  770. if err != nil {
  771. br.Msg = "查询频度失败"
  772. br.ErrMsg = "查询频度失败"
  773. return
  774. }
  775. fileName := `汾渭网页数据`
  776. if classifyId > 0 && indexCode == "" {
  777. fenWeiClassify, err := data_manage.GetFenweiClassifyItemByClassifyId(classifyId)
  778. if err != nil {
  779. return
  780. }
  781. fileName = fenWeiClassify.ClassifyName
  782. }
  783. if frequencies == nil {
  784. sheet, err := xlsxFile.AddSheet("无数据")
  785. if err != nil {
  786. br.Msg = "新增Sheet失败"
  787. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  788. return
  789. }
  790. rowSecName := sheet.AddRow()
  791. celSecName := rowSecName.AddCell()
  792. celSecName.SetValue("")
  793. }
  794. for _, frequency := range frequencies {
  795. fenWeiIndices, err := data_manage.GetFenWeiIndexByCodeAndClassify(indexCode, classifyId, frequency)
  796. if err != nil {
  797. return
  798. }
  799. var sheet *xlsx.Sheet
  800. if len(fenWeiIndices) > 0 {
  801. sheetName := *frequency
  802. if sheetName == "" {
  803. sheetName = "无频度"
  804. }
  805. sheet, err = xlsxFile.AddSheet(sheetName)
  806. if err != nil {
  807. br.Msg = "新增Sheet失败"
  808. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  809. return
  810. }
  811. } else {
  812. continue
  813. }
  814. if indexCode != "" {
  815. fileName = fenWeiIndices[0].IndexName
  816. }
  817. //获取指标数据
  818. rowSecName := sheet.AddRow()
  819. celSecName := rowSecName.AddCell()
  820. celSecName.SetValue("指标名称")
  821. rowFrequency := sheet.AddRow()
  822. celFrequency := rowFrequency.AddCell()
  823. celFrequency.SetValue("频率")
  824. rowUnit := sheet.AddRow()
  825. celUnit := rowUnit.AddCell()
  826. celUnit.SetValue("单位")
  827. rowModifyDate := sheet.AddRow()
  828. rowModifyCell := rowModifyDate.AddCell()
  829. rowModifyCell.SetValue("更新时间")
  830. dataMap := make(map[string]map[string]*data_manage.BaseFromFenweiData)
  831. var tradeCodeList []string
  832. for _, v := range fenWeiIndices {
  833. cellSenName := rowSecName.AddCell()
  834. cellSenName.SetValue(v.IndexName)
  835. celFrequency := rowFrequency.AddCell()
  836. celFrequency.SetValue(v.Frequency)
  837. celUnit := rowUnit.AddCell()
  838. celUnit.SetValue(v.Unit)
  839. rowModifyCell := rowModifyDate.AddCell()
  840. updateTimeStr := utils.TimeToStr(v.ModifyTime, utils.FormatDate)
  841. rowModifyCell.SetValue(updateTimeStr)
  842. tradeCodeList = append(tradeCodeList, v.IndexCode)
  843. var dataList []*data_manage.BaseFromFenweiData
  844. dataList, err = data_manage.GetBaseFromFenWeiDataByIndexCode(v.IndexCode)
  845. if err != nil && err.Error() != utils.ErrNoRow() {
  846. br.ErrMsg = "GetBaseFromFenWeiDataByIndexCode,Err:" + err.Error()
  847. br.Msg = "获取数据失败"
  848. return
  849. }
  850. for _, item := range dataList {
  851. if dataMap[item.IndexCode] == nil {
  852. dataMap[item.IndexCode] = make(map[string]*data_manage.BaseFromFenweiData)
  853. }
  854. dataMap[item.IndexCode][item.DataTime] = item
  855. }
  856. }
  857. tradeCodeStr := strings.Join(tradeCodeList, "','")
  858. tradeCodeStr = "'" + tradeCodeStr + "'"
  859. dataTimeList, err := data_manage.GetFenWeiDataListByIndexCodes(tradeCodeStr)
  860. if err != nil {
  861. br.Msg = "获取数据失败"
  862. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  863. return
  864. }
  865. for _, dataTime := range dataTimeList {
  866. rowData := sheet.AddRow()
  867. celDate := rowData.AddCell()
  868. celDate.SetValue(dataTime)
  869. for _, m := range fenWeiIndices {
  870. celData := rowData.AddCell()
  871. if dataMap[m.IndexCode][dataTime] != nil {
  872. celData.SetValue(dataMap[m.IndexCode][dataTime].Value)
  873. }
  874. }
  875. }
  876. }
  877. err = xlsxFile.Save(downLoadFilePath)
  878. if err != nil {
  879. //有指标无数据时先导出一遍空表
  880. sheet, err := xlsxFile.AddSheet("无数据")
  881. if err != nil {
  882. br.Msg = "新增Sheet失败"
  883. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  884. return
  885. }
  886. rowSecName := sheet.AddRow()
  887. celSecName := rowSecName.AddCell()
  888. celSecName.SetValue("")
  889. err = xlsxFile.Save(downLoadFilePath)
  890. if err != nil {
  891. br.Msg = "保存文件失败"
  892. br.ErrMsg = "保存文件失败"
  893. return
  894. }
  895. }
  896. fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
  897. this.Ctx.Output.Download(downLoadFilePath, fileName)
  898. defer func() {
  899. os.Remove(downLoadFilePath)
  900. }()
  901. br.Ret = 200
  902. br.Success = true
  903. br.Msg = "success"
  904. }
  905. // GetFenWeiIndexInfo
  906. // @Title 添加指标-根据条件获取指标信息
  907. // @Description 添加指标-根据条件获取指标信息
  908. // @Param KeyWord query string false "关键字"
  909. // @Param ClassifyIds query string false "分类id"
  910. // @Param Frequencies query string false "频率"
  911. // @Param PageSize query int false "每页数据条数"
  912. // @Param CurrentIndex query int false "当前页页码,从1开始"
  913. // @Success 200 {object} data_manage.BaseFromFenWeiIndexPage
  914. // @router /fenwei/get/index/info [get]
  915. func (this *EdbInfoController) GetFenWeiIndexInfo() {
  916. br := new(models.BaseResponse).Init()
  917. defer func() {
  918. if br.ErrMsg == "" {
  919. br.IsSendEmail = false
  920. }
  921. this.Data["json"] = br
  922. this.ServeJSON()
  923. }()
  924. sysUser := this.SysUser
  925. if sysUser == nil {
  926. br.Msg = "请登录"
  927. br.ErrMsg = "请登录,SysUser Is Empty"
  928. br.Ret = 408
  929. return
  930. }
  931. pageSize, _ := this.GetInt("PageSize")
  932. currentIndex, _ := this.GetInt("CurrentIndex")
  933. if pageSize <= 0 {
  934. pageSize = utils.PageSize20
  935. }
  936. if currentIndex <= 0 {
  937. currentIndex = 1
  938. }
  939. keyWord := this.GetString("KeyWord")
  940. classifyIds := this.GetString("ClassifyIds")
  941. frequencies := this.GetString("Frequencies")
  942. classifyIdList := strings.Split(classifyIds, ",")
  943. frequencyList := strings.Split(frequencies, ",")
  944. indexInfoPage, err := data.GetFenWeiIndexInfo(keyWord, classifyIdList, frequencyList, currentIndex, pageSize)
  945. if err != nil {
  946. return
  947. }
  948. br.Ret = 200
  949. br.Success = true
  950. br.Msg = "获取成功"
  951. br.Data = indexInfoPage
  952. }