fenwei_data.go 28 KB

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