mixed_table.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. package excel
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/excel/request"
  7. "eta/eta_api/services/data"
  8. excel2 "eta/eta_api/services/data/excel"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // GetSystemDate
  16. // @Title 获取系统日期(包含计算日期)
  17. // @Description 获取系统日期(包含计算日期)
  18. // @Param request body request.MixedTableCellDataReq true "type json string"
  19. // @router /excel_info/get_system_date [post]
  20. func (c *ExcelInfoController) GetSystemDate() {
  21. br := new(models.BaseResponse).Init()
  22. defer func() {
  23. c.Data["json"] = br
  24. c.ServeJSON()
  25. }()
  26. sysUser := c.SysUser
  27. if sysUser == nil {
  28. br.Msg = "请登录"
  29. br.ErrMsg = "请登录,SysUser Is Empty"
  30. br.Ret = 408
  31. return
  32. }
  33. var req request.MixedTableCellDataReq
  34. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  35. if err != nil {
  36. br.Msg = "参数解析异常!"
  37. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  38. return
  39. }
  40. var config request.EdbDateConf
  41. err = json.Unmarshal([]byte(req.Value), &config)
  42. if err != nil {
  43. br.Msg = "参数解析异常!"
  44. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  45. return
  46. }
  47. date, _, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
  48. if err != nil {
  49. br.Msg = "获取系统日期失败"
  50. if errMsg != `` {
  51. br.Msg = errMsg
  52. }
  53. br.ErrMsg = "获取系统日期失败,Err:" + err.Error()
  54. return
  55. }
  56. if req.DataTimeType == request.EdbDateDT {
  57. edbInfo, err := data_manage.GetEdbInfoById(config.EdbInfoId)
  58. if err != nil {
  59. br.Msg = "获取指标信息失败!"
  60. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  61. return
  62. }
  63. dataList := make([]*data_manage.EdbDataList, 0)
  64. switch edbInfo.EdbInfoType {
  65. case 0:
  66. dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
  67. case 1:
  68. _, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  69. default:
  70. br.Msg = "指标类型异常!"
  71. br.ErrMsg = "指标类型异常,Err:" + strconv.Itoa(edbInfo.EdbInfoType)
  72. return
  73. }
  74. if req.DataTime == `` { //选择前移几期数
  75. date, err = excel2.GetEdbDateByMoveForward(req.Value, dataList)
  76. if err != nil {
  77. br.Msg = "查询指标前移日期失败!"
  78. br.ErrMsg = "查询指标前移日期失败,Err:" + err.Error()
  79. return
  80. }
  81. } else {
  82. date = req.DataTime //选择表格中的日期
  83. }
  84. if date != "" {
  85. // 开始做日期变换
  86. date, err = excel2.HandleMixTableDateChange(date, req.Value)
  87. if err != nil {
  88. br.Msg = "日期变换失败!"
  89. br.ErrMsg = "日期变换失败,Err:" + err.Error()
  90. return
  91. }
  92. }
  93. }
  94. type resp struct {
  95. Date string
  96. }
  97. br.Ret = 200
  98. br.Success = true
  99. br.Msg = "获取系统日期成功"
  100. br.Data = resp{
  101. Date: date,
  102. }
  103. }
  104. // CalculateData
  105. // @Title 公式计算(混合表格)
  106. // @Description 公式计算(混合表格)
  107. // @Param request body request.CalculateConf true "type json string"
  108. // @router /excel_info/mixed/calculate [post]
  109. func (c *ExcelInfoController) CalculateData() {
  110. br := new(models.BaseResponse).Init()
  111. defer func() {
  112. c.Data["json"] = br
  113. c.ServeJSON()
  114. }()
  115. sysUser := c.SysUser
  116. if sysUser == nil {
  117. br.Msg = "请登录"
  118. br.ErrMsg = "请登录,SysUser Is Empty"
  119. br.Ret = 408
  120. return
  121. }
  122. requestBody := string(c.Ctx.Input.RequestBody)
  123. var req request.CalculateConf
  124. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  125. if err != nil {
  126. br.Msg = "参数解析异常!"
  127. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  128. return
  129. }
  130. edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
  131. if err != nil {
  132. br.Msg = "获取指标信息失败!"
  133. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  134. return
  135. }
  136. dataList := make([]*data_manage.EdbDataList, 0)
  137. switch edbInfo.EdbInfoType {
  138. case 0:
  139. dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
  140. case 1:
  141. _, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  142. default:
  143. br.Msg = "指标类型异常!"
  144. br.ErrMsg = "指标类型异常,Err:" + strconv.Itoa(edbInfo.EdbInfoType)
  145. return
  146. }
  147. //获取所有数据,计算所有数据
  148. //获取部分数据,计算部分数据
  149. // BaseCalculate 数据计算的结构体
  150. type BaseCalculate struct {
  151. DataList []*data_manage.EdbDataList
  152. Frequency string `description:"需要转换的频度"`
  153. Formula interface{}
  154. Calendar string `description:"公历/农历"`
  155. MoveType int `description:"移动方式:1:领先(默认),2:滞后"`
  156. MoveFrequency string `description:"移动频度"`
  157. FromFrequency string `description:"来源的频度"`
  158. Source int `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
  159. }
  160. req2 := &BaseCalculate{
  161. DataList: dataList,
  162. Frequency: req.Frequency,
  163. Formula: req.Formula,
  164. Calendar: req.Calendar,
  165. MoveType: req.MoveType,
  166. MoveFrequency: req.MoveFrequency,
  167. FromFrequency: edbInfo.Frequency,
  168. Source: req.Source,
  169. }
  170. // 调用指标库去更新
  171. reqJson, tmpErr := json.Marshal(req2)
  172. if tmpErr != nil {
  173. err = tmpErr
  174. return
  175. }
  176. respItem, tmpErr := data.BaseCalculate(string(reqJson))
  177. if tmpErr != nil {
  178. br.Msg = "计算指标失败"
  179. br.ErrMsg = tmpErr.Error()
  180. return
  181. }
  182. if respItem.Ret != 200 {
  183. br.Msg = respItem.Msg
  184. br.ErrMsg = respItem.ErrMsg
  185. return
  186. }
  187. // 数据处理成需要返回的样式
  188. num := 5
  189. lenDate := len(respItem.Data.DateList)
  190. if lenDate < 5 {
  191. num = lenDate
  192. }
  193. dataListResp := make([]*data_manage.EdbDataList, 0)
  194. var newDate string
  195. if req.DataTime == `` { //选择前移几期数
  196. newDate, err = excel2.GetEdbDateByMoveForwardByDateList(requestBody, respItem.Data.DateList)
  197. if err != nil {
  198. return
  199. }
  200. } else {
  201. newDate = req.DataTime //选择表格中的日期
  202. if strings.Count(newDate, "-") == 1 {
  203. newDate = newDate + "-01"
  204. // 查找这个月早的时间作为起始时间
  205. for _, v := range respItem.Data.DateList {
  206. if v >= newDate {
  207. newDate = v
  208. }
  209. }
  210. }
  211. }
  212. // 开始做日期变换
  213. newDate, err = excel2.HandleMixTableDateChange(newDate, requestBody)
  214. if err != nil {
  215. return
  216. }
  217. var finalVal float64
  218. if req.DataTime == `` {
  219. for i := 1; i <= num; i++ {
  220. date := respItem.Data.DateList[lenDate-i]
  221. val, ok := respItem.Data.DataMap[date]
  222. if !ok {
  223. continue
  224. }
  225. if date == newDate {
  226. finalVal = val
  227. }
  228. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  229. Value: val,
  230. DataTime: date,
  231. })
  232. }
  233. } else {
  234. // todo 如果选择了表格中的日期应该如何处理
  235. if val, ok := respItem.Data.DataMap[newDate]; ok {
  236. finalVal = val
  237. for i, tmpDate := range respItem.Data.DateList {
  238. if tmpDate == newDate {
  239. if i+3 <= lenDate {
  240. t1Date := respItem.Data.DateList[i+2]
  241. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  242. // 当前日期
  243. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  244. Value: tmpVal,
  245. DataTime: t1Date,
  246. })
  247. }
  248. }
  249. if i+2 <= lenDate {
  250. t1Date := respItem.Data.DateList[i+1]
  251. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  252. // 当前日期
  253. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  254. Value: tmpVal,
  255. DataTime: t1Date,
  256. })
  257. }
  258. }
  259. // 当前日期
  260. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  261. Value: val,
  262. DataTime: newDate,
  263. })
  264. if i >= 1 {
  265. t1Date := respItem.Data.DateList[i-1]
  266. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  267. // 当前日期
  268. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  269. Value: tmpVal,
  270. DataTime: t1Date,
  271. })
  272. }
  273. }
  274. if i >= 2 {
  275. t1Date := respItem.Data.DateList[i-2]
  276. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  277. // 当前日期
  278. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  279. Value: tmpVal,
  280. DataTime: t1Date,
  281. })
  282. }
  283. }
  284. }
  285. }
  286. }
  287. }
  288. resp := data_manage.BeforeAndAfterDateDataResp{
  289. List: dataListResp,
  290. Date: newDate,
  291. ShowValue: utils.FormatTableDataShowValue(finalVal),
  292. }
  293. br.Ret = 200
  294. br.Success = true
  295. br.Msg = "计算成功"
  296. br.Data = resp
  297. }
  298. // GetMixDateCalculate
  299. // @Title 获取混合表格日期计算
  300. // @Description 获取混合表格日期计算
  301. // @Param request body request.MixedTableCellDataReq true "type json string"
  302. // @router /excel_info/mixed/date_calculate [post]
  303. func (c *ExcelInfoController) GetMixDateCalculate() {
  304. br := new(models.BaseResponse).Init()
  305. defer func() {
  306. c.Data["json"] = br
  307. c.ServeJSON()
  308. }()
  309. sysUser := c.SysUser
  310. if sysUser == nil {
  311. br.Msg = "请登录"
  312. br.ErrMsg = "请登录,SysUser Is Empty"
  313. br.Ret = 408
  314. return
  315. }
  316. var req request.MixedDateCalculateReq
  317. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  318. if err != nil {
  319. br.Msg = "参数解析异常!"
  320. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  321. return
  322. }
  323. valMap := make(map[string]int)
  324. for _, v := range req.DateList {
  325. // 查找单元格数据
  326. // 如果不是基础计算单元格,直接返回
  327. _, err = time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
  328. if err != nil {
  329. br.Msg = "日期计算失败!"
  330. br.ErrMsg = fmt.Sprintf("%s 的单元格非日期类型, Err: %s", v.Date, err.Error())
  331. return
  332. }
  333. // todo 把日期转换成excel里的天数
  334. realDiffDay := utils.GetDaysDiff1900(v.Date)
  335. valMap[strings.ToUpper(v.Tag)] = realDiffDay
  336. }
  337. // 计算
  338. val, errMsg, err := excel2.DateCalculateFormula(valMap, strings.ToUpper(req.Formula))
  339. if err != nil {
  340. br.Msg = errMsg
  341. br.ErrMsg = err.Error()
  342. return
  343. }
  344. showValue := utils.FormatTableDataShowValue(val)
  345. type resp struct {
  346. ShowValue string
  347. }
  348. br.Ret = 200
  349. br.Success = true
  350. br.Msg = "操作成功"
  351. br.Data = resp{
  352. ShowValue: showValue,
  353. }
  354. }
  355. // GetBaseEdbInfo
  356. // @Title 获取指标的基本信息
  357. // @Description 获取指标的基本信息
  358. // @Param EdbInfoIds string "指标ID用英文逗号分割"
  359. // @router /excel_info/base_edb_info [get]
  360. func (c *ExcelInfoController) GetBaseEdbInfo() {
  361. br := new(models.BaseResponse).Init()
  362. defer func() {
  363. c.Data["json"] = br
  364. c.ServeJSON()
  365. }()
  366. sysUser := c.SysUser
  367. if sysUser == nil {
  368. br.Msg = "请登录"
  369. br.ErrMsg = "请登录,SysUser Is Empty"
  370. br.Ret = 408
  371. return
  372. }
  373. edbInfoIds := c.GetString("EdbInfoIds")
  374. if edbInfoIds == "" {
  375. br.Msg = "请输入指标ID"
  376. return
  377. }
  378. ids := strings.Split(edbInfoIds, ",")
  379. edbIds := make([]int, 0)
  380. for _, v := range ids {
  381. id, err := strconv.Atoi(v)
  382. if err != nil {
  383. br.Msg = "指标ID格式错误"
  384. return
  385. }
  386. edbIds = append(edbIds, id)
  387. }
  388. edbInfoList, err := data_manage.GetEdbInfoByIdList(edbIds)
  389. if err != nil {
  390. br.Msg = "获取指标信息失败!"
  391. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  392. return
  393. }
  394. list := make([]*data_manage.BaseEdbNameItem, 0)
  395. for _, v := range edbInfoList {
  396. tmp := new(data_manage.BaseEdbNameItem)
  397. tmp.EdbInfoId = v.EdbInfoId
  398. tmp.EdbInfoType = v.EdbInfoType
  399. tmp.EdbCode = v.EdbCode
  400. tmp.EdbName = v.EdbName
  401. tmp.Source = v.Source
  402. tmp.SourceName = v.SourceName
  403. tmp.Frequency = v.Frequency
  404. tmp.Unit = v.Unit
  405. list = append(list, tmp)
  406. }
  407. resp := data_manage.BaseEdbInfoResp{
  408. List: list,
  409. }
  410. br.Ret = 200
  411. br.Success = true
  412. br.Msg = "查询成功"
  413. br.Data = resp
  414. }