mixed_table.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. "strconv"
  10. )
  11. // GetSystemDate
  12. // @Title 获取系统日期(包含计算日期)
  13. // @Description 获取系统日期(包含计算日期)
  14. // @Param request body request.MixedTableCellDataReq true "type json string"
  15. // @router /excel_info/get_system_date [post]
  16. func (c *ExcelInfoController) GetSystemDate() {
  17. br := new(models.BaseResponse).Init()
  18. defer func() {
  19. c.Data["json"] = br
  20. c.ServeJSON()
  21. }()
  22. sysUser := c.SysUser
  23. if sysUser == nil {
  24. br.Msg = "请登录"
  25. br.ErrMsg = "请登录,SysUser Is Empty"
  26. br.Ret = 408
  27. return
  28. }
  29. var req request.MixedTableCellDataReq
  30. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  31. if err != nil {
  32. br.Msg = "参数解析异常!"
  33. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  34. return
  35. }
  36. date, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
  37. if err != nil {
  38. br.Msg = "获取系统日期失败"
  39. if errMsg != `` {
  40. br.Msg = errMsg
  41. }
  42. br.ErrMsg = "获取系统日期失败,Err:" + err.Error()
  43. return
  44. }
  45. type resp struct {
  46. Date string
  47. }
  48. br.Ret = 200
  49. br.Success = true
  50. br.Msg = "获取系统日期成功"
  51. br.Data = resp{
  52. Date: date,
  53. }
  54. }
  55. // CalculateData
  56. // @Title 公式计算(混合表格)
  57. // @Description 公式计算(混合表格)
  58. // @Param request body request.CalculateConf true "type json string"
  59. // @router /excel_info/mixed/calculate [post]
  60. func (c *ExcelInfoController) CalculateData() {
  61. br := new(models.BaseResponse).Init()
  62. defer func() {
  63. c.Data["json"] = br
  64. c.ServeJSON()
  65. }()
  66. sysUser := c.SysUser
  67. if sysUser == nil {
  68. br.Msg = "请登录"
  69. br.ErrMsg = "请登录,SysUser Is Empty"
  70. br.Ret = 408
  71. return
  72. }
  73. var req request.CalculateConf
  74. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  75. if err != nil {
  76. br.Msg = "参数解析异常!"
  77. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  78. return
  79. }
  80. edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
  81. if err != nil {
  82. br.Msg = "获取指标信息失败!"
  83. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  84. return
  85. }
  86. dataList := make([]*data_manage.EdbDataList, 0)
  87. switch edbInfo.EdbInfoType {
  88. case 0:
  89. dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
  90. case 1:
  91. _, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  92. default:
  93. br.Msg = "指标类型异常!"
  94. br.ErrMsg = "指标类型异常,Err:" + strconv.Itoa(edbInfo.EdbInfoType)
  95. return
  96. }
  97. //获取所有数据,计算所有数据
  98. //获取部分数据,计算部分数据
  99. // BaseCalculate 数据计算的结构体
  100. type BaseCalculate struct {
  101. DataList []*data_manage.EdbDataList
  102. Frequency string `description:"需要转换的频度"`
  103. Formula interface{}
  104. Calendar string `description:"公历/农历"`
  105. MoveType int `description:"移动方式:1:领先(默认),2:滞后"`
  106. MoveFrequency string `description:"移动频度"`
  107. FromFrequency string `description:"来源的频度"`
  108. Source int `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
  109. }
  110. req2 := &BaseCalculate{
  111. DataList: dataList,
  112. Frequency: req.Frequency,
  113. Formula: req.Formula,
  114. Calendar: req.Calendar,
  115. MoveType: req.MoveType,
  116. MoveFrequency: req.MoveFrequency,
  117. FromFrequency: edbInfo.Frequency,
  118. Source: req.Source,
  119. }
  120. // 调用指标库去更新
  121. reqJson, tmpErr := json.Marshal(req2)
  122. if tmpErr != nil {
  123. err = tmpErr
  124. return
  125. }
  126. respItem, tmpErr := data.BaseCalculate(string(reqJson))
  127. if tmpErr != nil {
  128. err = tmpErr
  129. return
  130. }
  131. if respItem.Ret != 200 {
  132. br.Msg = respItem.Msg
  133. br.ErrMsg = respItem.ErrMsg
  134. return
  135. }
  136. // 数据处理成需要返回的样式
  137. num := 5
  138. lenDate := len(respItem.Data.DateList)
  139. if lenDate < 5 {
  140. num = lenDate
  141. }
  142. var currDate string // 当前日期
  143. dataListResp := make([]*data_manage.EdbDataList, 0)
  144. if req.DataTime == `` {
  145. for i := 1; i <= num; i++ {
  146. date := respItem.Data.DateList[lenDate-i]
  147. val, ok := respItem.Data.DataMap[date]
  148. if !ok {
  149. continue
  150. }
  151. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  152. Value: val,
  153. DataTime: date,
  154. })
  155. }
  156. } else {
  157. if val, ok := respItem.Data.DataMap[req.DataTime]; ok {
  158. for i, tmpDate := range respItem.Data.DateList {
  159. if tmpDate == req.DataTime {
  160. if i+3 <= lenDate {
  161. t1Date := respItem.Data.DateList[i+2]
  162. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  163. // 当前日期
  164. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  165. Value: tmpVal,
  166. DataTime: t1Date,
  167. })
  168. }
  169. }
  170. if i+2 <= lenDate {
  171. t1Date := respItem.Data.DateList[i+1]
  172. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  173. // 当前日期
  174. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  175. Value: tmpVal,
  176. DataTime: t1Date,
  177. })
  178. }
  179. }
  180. // 当前日期
  181. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  182. Value: val,
  183. DataTime: req.DataTime,
  184. })
  185. if i >= 1 {
  186. t1Date := respItem.Data.DateList[i-1]
  187. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  188. // 当前日期
  189. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  190. Value: tmpVal,
  191. DataTime: t1Date,
  192. })
  193. }
  194. }
  195. if i >= 2 {
  196. t1Date := respItem.Data.DateList[i-2]
  197. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  198. // 当前日期
  199. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  200. Value: tmpVal,
  201. DataTime: t1Date,
  202. })
  203. }
  204. }
  205. }
  206. }
  207. }
  208. }
  209. resp := data_manage.BeforeAndAfterDateDataResp{
  210. List: dataListResp,
  211. Date: currDate,
  212. }
  213. br.Ret = 200
  214. br.Success = true
  215. br.Msg = "计算成功"
  216. br.Data = resp
  217. }