mixed_table.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. date, _, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
  41. if err != nil {
  42. br.Msg = "获取系统日期失败"
  43. if errMsg != `` {
  44. br.Msg = errMsg
  45. }
  46. br.ErrMsg = "获取系统日期失败,Err:" + err.Error()
  47. return
  48. }
  49. type resp struct {
  50. Date string
  51. }
  52. br.Ret = 200
  53. br.Success = true
  54. br.Msg = "获取系统日期成功"
  55. br.Data = resp{
  56. Date: date,
  57. }
  58. }
  59. // CalculateData
  60. // @Title 公式计算(混合表格)
  61. // @Description 公式计算(混合表格)
  62. // @Param request body request.CalculateConf true "type json string"
  63. // @router /excel_info/mixed/calculate [post]
  64. func (c *ExcelInfoController) CalculateData() {
  65. br := new(models.BaseResponse).Init()
  66. defer func() {
  67. c.Data["json"] = br
  68. c.ServeJSON()
  69. }()
  70. sysUser := c.SysUser
  71. if sysUser == nil {
  72. br.Msg = "请登录"
  73. br.ErrMsg = "请登录,SysUser Is Empty"
  74. br.Ret = 408
  75. return
  76. }
  77. requestBody := string(c.Ctx.Input.RequestBody)
  78. var req request.CalculateConf
  79. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  80. if err != nil {
  81. br.Msg = "参数解析异常!"
  82. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  83. return
  84. }
  85. edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
  86. if err != nil {
  87. br.Msg = "获取指标信息失败!"
  88. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  89. return
  90. }
  91. dataList := make([]*data_manage.EdbDataList, 0)
  92. switch edbInfo.EdbInfoType {
  93. case 0:
  94. dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
  95. case 1:
  96. _, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  97. default:
  98. br.Msg = "指标类型异常!"
  99. br.ErrMsg = "指标类型异常,Err:" + strconv.Itoa(edbInfo.EdbInfoType)
  100. return
  101. }
  102. //获取所有数据,计算所有数据
  103. //获取部分数据,计算部分数据
  104. // BaseCalculate 数据计算的结构体
  105. type BaseCalculate struct {
  106. DataList []*data_manage.EdbDataList
  107. Frequency string `description:"需要转换的频度"`
  108. Formula interface{}
  109. Calendar string `description:"公历/农历"`
  110. MoveType int `description:"移动方式:1:领先(默认),2:滞后"`
  111. MoveFrequency string `description:"移动频度"`
  112. FromFrequency string `description:"来源的频度"`
  113. Source int `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
  114. }
  115. req2 := &BaseCalculate{
  116. DataList: dataList,
  117. Frequency: req.Frequency,
  118. Formula: req.Formula,
  119. Calendar: req.Calendar,
  120. MoveType: req.MoveType,
  121. MoveFrequency: req.MoveFrequency,
  122. FromFrequency: edbInfo.Frequency,
  123. Source: req.Source,
  124. }
  125. // 调用指标库去更新
  126. reqJson, tmpErr := json.Marshal(req2)
  127. if tmpErr != nil {
  128. err = tmpErr
  129. return
  130. }
  131. respItem, tmpErr := data.BaseCalculate(string(reqJson))
  132. if tmpErr != nil {
  133. err = tmpErr
  134. return
  135. }
  136. if respItem.Ret != 200 {
  137. br.Msg = respItem.Msg
  138. br.ErrMsg = respItem.ErrMsg
  139. return
  140. }
  141. // 数据处理成需要返回的样式
  142. num := 5
  143. lenDate := len(respItem.Data.DateList)
  144. if lenDate < 5 {
  145. num = lenDate
  146. }
  147. dataListResp := make([]*data_manage.EdbDataList, 0)
  148. var newDate string
  149. if req.DataTime == `` { //选择前移几期数
  150. newDate, err = excel2.GetEdbDateByMoveForwardByDateList(requestBody, respItem.Data.DateList)
  151. if err != nil {
  152. return
  153. }
  154. } else {
  155. newDate = req.DataTime //选择表格中的日期
  156. }
  157. // 开始做日期变换
  158. newDate, err = excel2.HandleMixTableDateChange(newDate, requestBody)
  159. if err != nil {
  160. return
  161. }
  162. var finalVal float64
  163. if req.DataTime == `` {
  164. for i := 1; i <= num; i++ {
  165. date := respItem.Data.DateList[lenDate-i]
  166. val, ok := respItem.Data.DataMap[date]
  167. if !ok {
  168. continue
  169. }
  170. if date == newDate {
  171. finalVal = val
  172. }
  173. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  174. Value: val,
  175. DataTime: date,
  176. })
  177. }
  178. } else {
  179. // todo 如果选择了表格中的日期应该如何处理
  180. if val, ok := respItem.Data.DataMap[newDate]; ok {
  181. finalVal = val
  182. for i, tmpDate := range respItem.Data.DateList {
  183. if tmpDate == newDate {
  184. if i+3 <= lenDate {
  185. t1Date := respItem.Data.DateList[i+2]
  186. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  187. // 当前日期
  188. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  189. Value: tmpVal,
  190. DataTime: t1Date,
  191. })
  192. }
  193. }
  194. if i+2 <= lenDate {
  195. t1Date := respItem.Data.DateList[i+1]
  196. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  197. // 当前日期
  198. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  199. Value: tmpVal,
  200. DataTime: t1Date,
  201. })
  202. }
  203. }
  204. // 当前日期
  205. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  206. Value: val,
  207. DataTime: newDate,
  208. })
  209. if i >= 1 {
  210. t1Date := respItem.Data.DateList[i-1]
  211. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  212. // 当前日期
  213. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  214. Value: tmpVal,
  215. DataTime: t1Date,
  216. })
  217. }
  218. }
  219. if i >= 2 {
  220. t1Date := respItem.Data.DateList[i-2]
  221. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  222. // 当前日期
  223. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  224. Value: tmpVal,
  225. DataTime: t1Date,
  226. })
  227. }
  228. }
  229. }
  230. }
  231. }
  232. }
  233. resp := data_manage.BeforeAndAfterDateDataResp{
  234. List: dataListResp,
  235. Date: newDate,
  236. ShowValue: utils.FormatTableDataShowValue(finalVal),
  237. }
  238. br.Ret = 200
  239. br.Success = true
  240. br.Msg = "计算成功"
  241. br.Data = resp
  242. }
  243. // GetMixDateCalculate
  244. // @Title 获取混合表格日期计算
  245. // @Description 获取混合表格日期计算
  246. // @Param request body request.MixedTableCellDataReq true "type json string"
  247. // @router /excel_info/mixed/date_calculate [post]
  248. func (c *ExcelInfoController) GetMixDateCalculate() {
  249. br := new(models.BaseResponse).Init()
  250. defer func() {
  251. c.Data["json"] = br
  252. c.ServeJSON()
  253. }()
  254. sysUser := c.SysUser
  255. if sysUser == nil {
  256. br.Msg = "请登录"
  257. br.ErrMsg = "请登录,SysUser Is Empty"
  258. br.Ret = 408
  259. return
  260. }
  261. var req request.MixedDateCalculateReq
  262. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  263. if err != nil {
  264. br.Msg = "参数解析异常!"
  265. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  266. return
  267. }
  268. valMap := make(map[string]int)
  269. for _, v := range req.DateList {
  270. // 查找单元格数据
  271. // 如果不是基础计算单元格,直接返回
  272. _, err = time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
  273. if err != nil {
  274. br.Msg = "日期计算失败!"
  275. br.ErrMsg = fmt.Sprintf("%s 的单元格非日期类型, Err: %s", v.Date, err.Error())
  276. return
  277. }
  278. // todo 把日期转换成excel里的天数
  279. realDiffDay := utils.GetDaysDiff1900(v.Date)
  280. valMap[strings.ToUpper(v.Tag)] = realDiffDay
  281. }
  282. // 计算
  283. val, errMsg, err := excel2.DateCalculateFormula(valMap, strings.ToUpper(req.Formula))
  284. if err != nil {
  285. br.Msg = "日期计算失败"
  286. br.ErrMsg = errMsg
  287. return
  288. }
  289. showValue := utils.FormatTableDataShowValue(val)
  290. type resp struct {
  291. ShowValue string
  292. }
  293. br.Ret = 200
  294. br.Success = true
  295. br.Msg = "操作成功"
  296. br.Data = resp{
  297. ShowValue: showValue,
  298. }
  299. }