mixed_table.go 12 KB

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