mixed_table.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  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. var showValue string
  196. if req.DataTime == `` { //选择前移几期数
  197. newDate, err = excel2.GetEdbDateByMoveForwardByDateList(requestBody, respItem.Data.DateList)
  198. if err != nil {
  199. return
  200. }
  201. } else {
  202. newDate = req.DataTime //选择表格中的日期
  203. if strings.Count(newDate, "-") == 1 {
  204. newDate = newDate + "-01"
  205. // 查找这个月早的时间作为起始时间
  206. for _, v := range respItem.Data.DateList {
  207. if v >= newDate {
  208. newDate = v
  209. }
  210. }
  211. }
  212. }
  213. // 开始做日期变换
  214. newDate, err = excel2.HandleMixTableDateChange(newDate, requestBody)
  215. if err != nil {
  216. return
  217. }
  218. if req.DataTime == `` {
  219. canAdd := false
  220. for i := 1; i <= lenDate; i++ {
  221. date := respItem.Data.DateList[lenDate-i]
  222. val, ok := respItem.Data.DataMap[date]
  223. if !ok {
  224. continue
  225. }
  226. if date == newDate {
  227. showValue = utils.FormatMixTableDataShowValue(val)
  228. canAdd = true
  229. }
  230. if canAdd && len(dataListResp) <= num {
  231. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  232. Value: val,
  233. DataTime: date,
  234. })
  235. }
  236. }
  237. } else {
  238. // todo 如果选择了表格中的日期应该如何处理
  239. if val, ok := respItem.Data.DataMap[newDate]; ok {
  240. showValue = utils.FormatMixTableDataShowValue(val)
  241. for i, tmpDate := range respItem.Data.DateList {
  242. if tmpDate == newDate {
  243. if i+3 <= lenDate {
  244. t1Date := respItem.Data.DateList[i+2]
  245. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  246. // 当前日期
  247. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  248. Value: tmpVal,
  249. DataTime: t1Date,
  250. })
  251. }
  252. }
  253. if i+2 <= lenDate {
  254. t1Date := respItem.Data.DateList[i+1]
  255. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  256. // 当前日期
  257. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  258. Value: tmpVal,
  259. DataTime: t1Date,
  260. })
  261. }
  262. }
  263. // 当前日期
  264. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  265. Value: val,
  266. DataTime: newDate,
  267. })
  268. if i >= 1 {
  269. t1Date := respItem.Data.DateList[i-1]
  270. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  271. // 当前日期
  272. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  273. Value: tmpVal,
  274. DataTime: t1Date,
  275. })
  276. }
  277. }
  278. if i >= 2 {
  279. t1Date := respItem.Data.DateList[i-2]
  280. if tmpVal, ok2 := respItem.Data.DataMap[t1Date]; ok2 {
  281. // 当前日期
  282. dataListResp = append(dataListResp, &data_manage.EdbDataList{
  283. Value: tmpVal,
  284. DataTime: t1Date,
  285. })
  286. }
  287. }
  288. }
  289. }
  290. }
  291. }
  292. resp := data_manage.BeforeAndAfterDateDataResp{
  293. List: dataListResp,
  294. Date: newDate,
  295. ShowValue: showValue,
  296. }
  297. br.Ret = 200
  298. br.Success = true
  299. br.Msg = "计算成功"
  300. br.Data = resp
  301. }
  302. // GetMixDateCalculate
  303. // @Title 获取混合表格日期计算
  304. // @Description 获取混合表格日期计算
  305. // @Param request body request.MixedTableCellDataReq true "type json string"
  306. // @router /excel_info/mixed/date_calculate [post]
  307. func (c *ExcelInfoController) GetMixDateCalculate() {
  308. br := new(models.BaseResponse).Init()
  309. defer func() {
  310. c.Data["json"] = br
  311. c.ServeJSON()
  312. }()
  313. sysUser := c.SysUser
  314. if sysUser == nil {
  315. br.Msg = "请登录"
  316. br.ErrMsg = "请登录,SysUser Is Empty"
  317. br.Ret = 408
  318. return
  319. }
  320. var req request.MixedDateCalculateReq
  321. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  322. if err != nil {
  323. br.Msg = "参数解析异常!"
  324. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  325. return
  326. }
  327. valMap := make(map[string]int)
  328. for _, v := range req.DateList {
  329. // 查找单元格数据
  330. // 如果不是基础计算单元格,直接返回
  331. _, err = time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
  332. if err != nil {
  333. br.Msg = "日期计算失败!"
  334. br.ErrMsg = fmt.Sprintf("%s 的单元格非日期类型, Err: %s", v.Date, err.Error())
  335. return
  336. }
  337. // todo 把日期转换成excel里的天数
  338. realDiffDay := utils.GetDaysDiff1900(v.Date)
  339. valMap[strings.ToUpper(v.Tag)] = realDiffDay
  340. }
  341. // 计算
  342. val, errMsg, err := excel2.DateCalculateFormula(valMap, strings.ToUpper(req.Formula))
  343. if err != nil {
  344. br.Msg = errMsg
  345. br.ErrMsg = err.Error()
  346. return
  347. }
  348. showValue := utils.FormatMixTableDataShowValue(val)
  349. type resp struct {
  350. ShowValue string
  351. }
  352. br.Ret = 200
  353. br.Success = true
  354. br.Msg = "操作成功"
  355. br.Data = resp{
  356. ShowValue: showValue,
  357. }
  358. }
  359. // GetBaseEdbInfo
  360. // @Title 获取指标的基本信息
  361. // @Description 获取指标的基本信息
  362. // @Param EdbInfoIds string "指标ID用英文逗号分割"
  363. // @router /excel_info/base_edb_info [get]
  364. func (c *ExcelInfoController) GetBaseEdbInfo() {
  365. br := new(models.BaseResponse).Init()
  366. defer func() {
  367. c.Data["json"] = br
  368. c.ServeJSON()
  369. }()
  370. sysUser := c.SysUser
  371. if sysUser == nil {
  372. br.Msg = "请登录"
  373. br.ErrMsg = "请登录,SysUser Is Empty"
  374. br.Ret = 408
  375. return
  376. }
  377. edbInfoIds := c.GetString("EdbInfoIds")
  378. if edbInfoIds == "" {
  379. br.Msg = "请输入指标ID"
  380. return
  381. }
  382. ids := strings.Split(edbInfoIds, ",")
  383. edbIds := make([]int, 0)
  384. for _, v := range ids {
  385. id, err := strconv.Atoi(v)
  386. if err != nil {
  387. br.Msg = "指标ID格式错误"
  388. return
  389. }
  390. edbIds = append(edbIds, id)
  391. }
  392. edbInfoList, err := data_manage.GetEdbInfoByIdList(edbIds)
  393. if err != nil {
  394. br.Msg = "获取指标信息失败!"
  395. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  396. return
  397. }
  398. list := make([]*data_manage.BaseEdbNameItem, 0)
  399. for _, v := range edbInfoList {
  400. tmp := new(data_manage.BaseEdbNameItem)
  401. tmp.EdbInfoId = v.EdbInfoId
  402. tmp.EdbInfoType = v.EdbInfoType
  403. tmp.EdbCode = v.EdbCode
  404. tmp.EdbName = v.EdbName
  405. tmp.Source = v.Source
  406. tmp.SourceName = v.SourceName
  407. tmp.Frequency = v.Frequency
  408. tmp.Unit = v.Unit
  409. list = append(list, tmp)
  410. }
  411. resp := data_manage.BaseEdbInfoResp{
  412. List: list,
  413. }
  414. br.Ret = 200
  415. br.Success = true
  416. br.Msg = "查询成功"
  417. br.Data = resp
  418. }