base_from_calculate.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "hongze/hongze_edb_lib/models"
  6. "hongze/hongze_edb_lib/services"
  7. "hongze/hongze_edb_lib/utils"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // CalculateController 计算指标
  13. type CalculateController struct {
  14. BaseAuthController
  15. }
  16. // Add
  17. // @Title 编辑指标接口
  18. // @Description 编辑指标接口
  19. // @Success 200 {object} models.EditEdbInfoReq
  20. // @router /add [post]
  21. func (this *CalculateController) Add() {
  22. br := new(models.BaseResponse).Init()
  23. defer func() {
  24. this.Data["json"] = br
  25. this.ServeJSON()
  26. }()
  27. //source := utils.DATA_SOURCE_WIND
  28. var req models.EdbInfoCalculateSaveReq
  29. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  30. if err != nil {
  31. br.Msg = "参数解析异常!"
  32. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  33. return
  34. }
  35. req.EdbName = strings.Trim(req.EdbName, " ")
  36. if req.EdbName == "" {
  37. br.Msg = "指标名称不能为空"
  38. return
  39. }
  40. if req.Frequency == "" {
  41. br.Msg = "频率不能为空"
  42. return
  43. }
  44. if req.Unit == "" {
  45. br.Msg = "单位不能为空"
  46. return
  47. }
  48. if req.ClassifyId <= 0 {
  49. br.Msg = "请选择分类"
  50. return
  51. }
  52. if len(req.EdbInfoIdArr) <= 0 {
  53. br.Msg = "请选择指标"
  54. return
  55. }
  56. if req.CalculateFormula == "" {
  57. br.Msg = "请填写指标"
  58. return
  59. }
  60. //加入缓存机制,避免创建同一个名称的指标 start
  61. redisKey := fmt.Sprint("edb_info:calculate:batch:save:", utils.DATA_SOURCE_CALCULATE, ":", req.EdbName)
  62. isExist := utils.Rc.IsExist(redisKey)
  63. if isExist {
  64. br.Msg = "指标正在处理,请勿重复提交"
  65. return
  66. } else {
  67. //设置3分钟缓存
  68. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  69. defer func() {
  70. utils.Rc.Delete(redisKey)
  71. }()
  72. }
  73. calculateFormula := req.CalculateFormula
  74. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  75. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  76. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  77. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  78. if strings.Contains(req.CalculateFormula, "%") {
  79. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  80. }
  81. req.CalculateFormula = calculateFormula
  82. var condition string
  83. var pars []interface{}
  84. condition += " AND edb_name=? "
  85. pars = append(pars, req.EdbName)
  86. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  87. if err != nil {
  88. br.Msg = "判断指标名称是否存在失败"
  89. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  90. return
  91. }
  92. if count > 0 {
  93. br.Msg = "指标名称已存在,请重新填写"
  94. br.ErrMsg = "指标名称已存在,请重新填写"
  95. return
  96. }
  97. //检验公式
  98. var formulaStr string
  99. var edbInfoIdBytes []string
  100. for _, v := range req.EdbInfoIdArr {
  101. formulaStr += v.FromTag + ","
  102. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  103. }
  104. formulaMap := services.CheckFormula(req.CalculateFormula)
  105. for _, v := range formulaMap {
  106. if !strings.Contains(formulaStr, v) {
  107. br.Msg = "公式错误,请重新填写"
  108. return
  109. }
  110. }
  111. randStr := utils.GetRandDigit(4)
  112. edbCode := `C` + time.Now().Format("060102") + randStr
  113. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  114. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  115. edbInfo := &models.EdbInfo{
  116. Source: utils.DATA_SOURCE_CALCULATE,
  117. SourceName: "指标运算",
  118. EdbCode: edbCode,
  119. EdbName: req.EdbName,
  120. EdbNameSource: req.EdbName,
  121. Frequency: req.Frequency,
  122. Unit: req.Unit,
  123. ClassifyId: req.ClassifyId,
  124. SysUserId: req.AdminId,
  125. SysUserRealName: req.AdminName,
  126. CreateTime: time.Now(),
  127. ModifyTime: time.Now(),
  128. UniqueCode: uniqueCode,
  129. CalculateFormula: req.CalculateFormula,
  130. EdbType: 2,
  131. }
  132. edbInfoId, err := models.AddEdbInfo(edbInfo)
  133. if err != nil {
  134. br.Msg = "生成计算指标失败"
  135. br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  136. return
  137. }
  138. //处理同名指标
  139. {
  140. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  141. if err != nil {
  142. br.Msg = "保存失败"
  143. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  144. return
  145. }
  146. if len(edbNameList) >= 2 {
  147. for _, v := range edbNameList {
  148. edbName := v.EdbName + "(" + v.SourceName + ")"
  149. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  150. if err != nil {
  151. br.Msg = "保存失败"
  152. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  153. return
  154. }
  155. }
  156. }
  157. }
  158. edbInfoList := make([]*models.EdbInfo, 0)
  159. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  160. for k, v := range req.EdbInfoIdArr {
  161. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  162. if err != nil {
  163. if err.Error() == utils.ErrNoRow() {
  164. br.Msg = "生成计算指标失败"
  165. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  166. return
  167. }
  168. br.Msg = "生成计算指标失败"
  169. br.Msg = "获取指标失败:Err:" + err.Error()
  170. return
  171. }
  172. edbInfoList = append(edbInfoList, fromEdbInfo)
  173. //关联关系表
  174. {
  175. calculateMappingItem := &models.EdbInfoCalculateMapping{
  176. CreateTime: time.Now(),
  177. ModifyTime: time.Now(),
  178. Sort: k + 1,
  179. EdbCode: edbCode,
  180. EdbInfoId: int(edbInfoId),
  181. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  182. FromEdbCode: fromEdbInfo.EdbCode,
  183. FromEdbName: fromEdbInfo.EdbName,
  184. FromSource: fromEdbInfo.Source,
  185. FromSourceName: fromEdbInfo.SourceName,
  186. FromTag: v.FromTag,
  187. Source: utils.DATA_SOURCE_CALCULATE,
  188. SourceName: "指标运算",
  189. }
  190. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  191. }
  192. }
  193. //关联关系表
  194. {
  195. if len(calculateMappingList) > 0 {
  196. go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
  197. }
  198. }
  199. err = models.AddCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
  200. if err != nil {
  201. br.Msg = "生成计算指标失败"
  202. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  203. return
  204. }
  205. maxAndMinItem, err := models.GetEdbInfoMaxAndMinInfo(utils.DATA_SOURCE_CALCULATE, edbCode)
  206. if err != nil && err.Error() != utils.ErrNoRow() {
  207. br.Msg = "生成计算指标失败"
  208. br.Msg = "生成计算指标失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
  209. return
  210. }
  211. if maxAndMinItem != nil {
  212. err = models.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
  213. }
  214. resp := models.AddEdbInfoResp{
  215. EdbInfoId: int(edbInfoId),
  216. UniqueCode: uniqueCode,
  217. }
  218. br.Ret = 200
  219. br.Success = true
  220. br.Msg = "保存成功"
  221. br.Data = resp
  222. br.IsAddLog = true
  223. }
  224. // CalculateBatchSave
  225. // @Title 累计值转月-同比值-同差等计算新增
  226. // @Description 累计值转月-同比值-同差等计算新增接口
  227. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  228. // @Success Ret=200 返回指标id
  229. // @router /batch/save [post]
  230. func (this *CalculateController) CalculateBatchSave() {
  231. br := new(models.BaseResponse).Init()
  232. defer func() {
  233. this.Data["json"] = br
  234. this.ServeJSON()
  235. }()
  236. var req models.EdbInfoCalculateBatchSaveReq
  237. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  238. if err != nil {
  239. br.Msg = "参数解析异常!"
  240. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  241. return
  242. }
  243. req.EdbName = strings.Trim(req.EdbName, " ")
  244. if req.EdbName == "" {
  245. br.Msg = "指标名称不能为空"
  246. return
  247. }
  248. if req.Frequency == "" {
  249. br.Msg = "频率不能为空"
  250. return
  251. }
  252. if req.Unit == "" {
  253. br.Msg = "单位不能为空"
  254. return
  255. }
  256. if req.ClassifyId <= 0 {
  257. br.Msg = "请选择分类"
  258. return
  259. }
  260. if req.FromEdbInfoId <= 0 {
  261. br.Msg = "请选择指标"
  262. return
  263. }
  264. var formulaInt int
  265. if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS ||
  266. req.Source == utils.DATA_SOURCE_CALCULATE_HBZ ||
  267. req.Source == utils.DATA_SOURCE_CALCULATE_HCZ ||
  268. req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT {
  269. if req.Formula == "" {
  270. br.Msg = "请填写N值"
  271. return
  272. }
  273. formulaInt, _ = strconv.Atoi(req.Formula)
  274. if formulaInt <= 0 {
  275. br.Msg = "N值输入错误,请重新输入"
  276. return
  277. }
  278. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
  279. //直接拼接指标
  280. //校验时间格式
  281. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  282. if err != nil {
  283. br.Msg = "拼接日期有误,请重新输入"
  284. return
  285. }
  286. }
  287. //加入缓存机制,避免创建同一个名称的指标 start
  288. redisKey := fmt.Sprint("edb_info:calculate:batch:save:", req.Source, ":", req.EdbName)
  289. isExist := utils.Rc.IsExist(redisKey)
  290. if isExist {
  291. br.Msg = "指标正在处理,请勿重复提交"
  292. return
  293. } else {
  294. //设置3分钟缓存
  295. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  296. defer func() {
  297. utils.Rc.Delete(redisKey)
  298. }()
  299. }
  300. //加入缓存机制,避免创建同一个名称的指标 end
  301. var condition string
  302. var pars []interface{}
  303. condition += " AND edb_name=? "
  304. pars = append(pars, req.EdbName)
  305. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  306. if err != nil {
  307. br.Msg = "判断指标名称是否存在失败"
  308. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  309. return
  310. }
  311. if count > 0 {
  312. br.Msg = "指标名称已存在,请重新填写"
  313. br.ErrMsg = "指标名称已存在,请重新填写"
  314. return
  315. }
  316. fromEdbInfo, err := models.GetEdbInfoById(req.FromEdbInfoId)
  317. if err != nil {
  318. br.Msg = "获取指标信息失败"
  319. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  320. return
  321. }
  322. //生成指标编码
  323. randStr := utils.GetRandDigit(4)
  324. edbCode := `C` + time.Now().Format("060102") + randStr
  325. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  326. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  327. adminId := req.AdminId
  328. adminName := req.AdminName
  329. var sourName string
  330. var edbInfoId int
  331. if req.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
  332. sourName = "累计值转月值"
  333. if fromEdbInfo.Frequency != "月度" {
  334. br.Msg = "请选择月度指标"
  335. return
  336. }
  337. edbInfoId, err = models.AddCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  338. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
  339. sourName = "同比值"
  340. edbInfoId, err = models.AddCalculateTbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  341. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
  342. sourName = "同差值"
  343. edbInfoId, err = models.AddCalculateTcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  344. } else if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
  345. sourName = "N数值移动平均计算"
  346. edbInfoId, err = models.AddCalculateNszydpjjs(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  347. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HBZ { //环比值
  348. var condition string
  349. var pars []interface{}
  350. condition += " AND edb_info_id =? "
  351. pars = append(pars, req.FromEdbInfoId)
  352. condition += " AND value <=0 "
  353. checkCount, err := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source)
  354. if err != nil && err.Error() != utils.ErrNoRow() {
  355. br.Msg = "判断环比值是否可计算失败"
  356. br.ErrMsg = "判断环比值是否可计算失败,Err:" + err.Error()
  357. return
  358. }
  359. if checkCount > 0 {
  360. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  361. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  362. return
  363. }
  364. sourName = "环比值"
  365. edbInfoId, err = models.AddCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  366. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HCZ {
  367. sourName = "环差值"
  368. edbInfoId, err = models.AddCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  369. } else if req.Source == utils.DATA_SOURCE_CALCULATE_BP {
  370. if fromEdbInfo.Frequency == "日度" {
  371. br.Msg = "日度指标,无法进行变频操作"
  372. br.ErrMsg = "日度指标,无法进行变频操作:edbcode:" + fromEdbInfo.EdbCode
  373. return
  374. }
  375. sourName = "变频"
  376. edbInfoId, err = models.AddCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  377. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT { //时间移位
  378. sourName = "时间移位"
  379. edbInfoId, err = models.AddCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  380. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ { //直接拼接
  381. sourName = "直接拼接"
  382. if len(req.EdbInfoIdArr) != 1 {
  383. br.Msg = "请传入拼接日期之后的指标"
  384. br.ErrMsg = "请传入拼接日期之后的指标"
  385. return
  386. }
  387. secondEdbInfoReq := req.EdbInfoIdArr[0]
  388. secondEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  389. if err != nil {
  390. br.Msg = "获取拼接日期之后的指标信息失败"
  391. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
  392. return
  393. }
  394. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  395. br.Msg = "两个指标不允许为同一个"
  396. br.ErrMsg = "两个指标不允许为同一个"
  397. return
  398. }
  399. edbInfoId, err = models.AddCalculateZjpj(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, adminId, adminName)
  400. } else if req.Source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
  401. sourName = "累计值同比拼接"
  402. if fromEdbInfo.Frequency != "月度" {
  403. br.Msg = "待拼接指标只能筛选月度指标"
  404. br.ErrMsg = "待拼接指标只能筛选月度指标"
  405. return
  406. }
  407. if len(req.EdbInfoIdArr) != 1 {
  408. br.Msg = "请传入同比值指标"
  409. br.ErrMsg = "请传入同比值指标"
  410. return
  411. }
  412. secondEdbInfoReq := req.EdbInfoIdArr[0]
  413. tbzEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  414. if err != nil {
  415. br.Msg = "获取同比值指标信息失败"
  416. br.ErrMsg = "获取同比值指标信息失败:Err:" + err.Error()
  417. return
  418. }
  419. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  420. br.Msg = "指标必须是传入同比值指标类型"
  421. br.ErrMsg = "指标必须是传入同比值指标类型"
  422. return
  423. }
  424. if tbzEdbInfo.Frequency != "月度" {
  425. br.Msg = "同比值指标只能筛选月度指标"
  426. br.ErrMsg = "同比值指标只能筛选月度指标"
  427. return
  428. }
  429. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  430. br.Msg = "两个指标不允许为同一个"
  431. br.ErrMsg = "两个指标不允许为同一个"
  432. return
  433. }
  434. edbInfoId, err = models.AddCalculateLjztbpj(&req, fromEdbInfo, tbzEdbInfo, edbCode, uniqueCode, adminId, adminName)
  435. } else {
  436. br.Msg = "无效计算方式"
  437. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  438. return
  439. }
  440. if err != nil {
  441. br.Msg = "生成" + sourName + "失败"
  442. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  443. return
  444. }
  445. if edbInfoId <= 0 {
  446. br.Msg = "生成" + sourName + "失败"
  447. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  448. return
  449. }
  450. //处理同名指标
  451. {
  452. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  453. if err != nil {
  454. br.Msg = "保存失败"
  455. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  456. return
  457. }
  458. if len(edbNameList) >= 2 {
  459. for _, v := range edbNameList {
  460. edbName := v.EdbName + "(" + v.SourceName + ")"
  461. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  462. if err != nil {
  463. br.Msg = "保存失败"
  464. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  465. return
  466. }
  467. }
  468. }
  469. }
  470. maxAndMinItem, err := models.GetEdbInfoMaxAndMinInfo(req.Source, edbCode)
  471. if err != nil && err.Error() != utils.ErrNoRow() {
  472. br.Msg = "生成" + sourName + "失败"
  473. br.Msg = "生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
  474. return
  475. }
  476. if maxAndMinItem != nil {
  477. err = models.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  478. }
  479. resp := models.AddEdbInfoResp{
  480. EdbInfoId: edbInfoId,
  481. UniqueCode: uniqueCode,
  482. }
  483. br.Ret = 200
  484. br.Success = true
  485. br.Msg = "保存成功"
  486. br.Data = resp
  487. br.IsAddLog = true
  488. }
  489. // Refresh
  490. // @Title 刷新计算指标接口
  491. // @Description 刷新计算指标接口
  492. // @Success 200 {object} models.RefreshEdbInfoReq
  493. // @router /refresh [post]
  494. func (this *CalculateController) Refresh() {
  495. br := new(models.BaseResponse).Init()
  496. var cacheKey string
  497. defer func() {
  498. utils.Rc.Delete(cacheKey)
  499. this.Data["json"] = br
  500. this.ServeJSON()
  501. }()
  502. source := utils.DATA_SOURCE_LT
  503. var req models.RefreshEdbInfoReq
  504. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  505. if err != nil {
  506. br.Msg = "参数解析异常!"
  507. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  508. return
  509. }
  510. if req.EdbCode == "" {
  511. br.Msg = "请输入指标编码!"
  512. br.ErrMsg = "请输入指标编码,指标编码为空"
  513. return
  514. }
  515. if req.EdbInfoId <= 0 {
  516. br.Msg = "请输入指标ID!"
  517. br.ErrMsg = "请输入指标ID"
  518. return
  519. }
  520. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  521. if err != nil {
  522. br.Msg = "指标不存在!"
  523. br.ErrMsg = "指标不存在"
  524. return
  525. }
  526. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  527. if !utils.Rc.IsExist(cacheKey) {
  528. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  529. startDate := req.StartDate
  530. var errMsg string
  531. endDate := time.Now().Format(utils.FormatDate)
  532. edbInfoId := edbInfo.EdbInfoId
  533. switch edbInfo.Source {
  534. case utils.DATA_SOURCE_CALCULATE:
  535. startDate = edbInfo.StartDate
  536. sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
  537. if err != nil {
  538. return
  539. }
  540. startDate = sTime.Format(utils.FormatDate)
  541. var edbInfoIdBytes []string
  542. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  543. if err != nil {
  544. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  545. break
  546. }
  547. var formulaStr string
  548. edbInfoList := make([]*models.EdbInfo, 0)
  549. for _, v := range calculateMap {
  550. formulaStr += v.FromTag + ","
  551. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  552. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  553. edbInfoList = append(edbInfoList, edbInfo)
  554. }
  555. err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes)
  556. if err != nil {
  557. errMsg = "RefreshCalculate Err:" + err.Error()
  558. break
  559. }
  560. case utils.DATA_SOURCE_CALCULATE_LJZZY: //刷新累计值转月值
  561. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  562. if err != nil {
  563. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  564. break
  565. }
  566. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  567. if err != nil {
  568. errMsg = "GetEdbInfoById Err:" + err.Error()
  569. break
  570. }
  571. startDate = edbInfo.StartDate
  572. endDate = time.Now().Format(utils.FormatDate)
  573. err = models.RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  574. if err != nil {
  575. errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
  576. break
  577. }
  578. case utils.DATA_SOURCE_CALCULATE_TBZ: //刷新同比值
  579. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  580. if err != nil {
  581. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  582. break
  583. }
  584. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  585. if err != nil {
  586. errMsg = "GetEdbInfoById Err:" + err.Error()
  587. break
  588. }
  589. startDate = edbInfo.StartDate
  590. endDate = time.Now().Format(utils.FormatDate)
  591. err = models.RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  592. if err != nil {
  593. errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
  594. break
  595. }
  596. case utils.DATA_SOURCE_CALCULATE_TCZ: //同差值
  597. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  598. if err != nil {
  599. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  600. break
  601. }
  602. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  603. if err != nil {
  604. errMsg = "GetEdbInfoById Err:" + err.Error()
  605. break
  606. }
  607. startDate = edbInfo.StartDate
  608. endDate = time.Now().Format(utils.FormatDate)
  609. err = models.RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
  610. if err != nil {
  611. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  612. break
  613. }
  614. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  615. calculateNszydpjjs, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  616. if err != nil {
  617. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  618. break
  619. }
  620. fromEdbInfo, err := models.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
  621. if err != nil {
  622. errMsg = "GetEdbInfoById Err:" + err.Error()
  623. break
  624. }
  625. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  626. startDate = edbInfo.StartDate
  627. err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
  628. if err != nil {
  629. errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
  630. break
  631. }
  632. case utils.DATA_SOURCE_CALCULATE_HBZ: //刷新环比值
  633. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  634. if err != nil {
  635. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  636. break
  637. }
  638. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  639. if err != nil {
  640. errMsg = "GetEdbInfoById Err:" + err.Error()
  641. break
  642. }
  643. startDate = edbInfo.StartDate
  644. endDate = time.Now().Format(utils.FormatDate)
  645. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  646. err = models.RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  647. if err != nil {
  648. errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
  649. break
  650. }
  651. case utils.DATA_SOURCE_CALCULATE_HCZ: //刷新环差值
  652. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  653. if err != nil {
  654. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  655. break
  656. }
  657. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  658. if err != nil {
  659. errMsg = "GetEdbInfoById Err:" + err.Error()
  660. break
  661. }
  662. startDate = edbInfo.StartDate
  663. endDate = time.Now().Format(utils.FormatDate)
  664. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  665. err = models.RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  666. if err != nil {
  667. errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
  668. break
  669. }
  670. case utils.DATA_SOURCE_CALCULATE_BP: //刷新变频
  671. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  672. if err != nil {
  673. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  674. break
  675. }
  676. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  677. if err != nil {
  678. errMsg = "GetEdbInfoById Err:" + err.Error()
  679. break
  680. }
  681. startDate = edbInfo.StartDate
  682. endDate = time.Now().Format(utils.FormatDate)
  683. err = models.RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  684. if err != nil {
  685. errMsg = "RefreshAllCalculateBp Err:" + err.Error()
  686. break
  687. }
  688. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  689. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  690. if err != nil {
  691. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  692. break
  693. }
  694. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  695. if err != nil {
  696. errMsg = "GetEdbInfoById Err:" + err.Error()
  697. break
  698. }
  699. startDate = edbInfo.StartDate
  700. endDate = time.Now().Format(utils.FormatDate)
  701. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  702. err = models.RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  703. if err != nil {
  704. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  705. }
  706. case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
  707. err = models.RefreshAllCalculateZjpj(edbInfo)
  708. if err != nil {
  709. errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
  710. break
  711. }
  712. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  713. err = models.RefreshAllCalculateLjztbpj(edbInfo)
  714. if err != nil {
  715. errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
  716. break
  717. }
  718. default:
  719. br.Msg = "来源异常,请联系相关开发!"
  720. br.ErrMsg = "来源异常,请联系相关开发"
  721. return
  722. }
  723. if errMsg != `` {
  724. br.Msg = "刷新指标失败!"
  725. br.ErrMsg = "刷新指标失败,err:" + errMsg
  726. return
  727. }
  728. maxAndMinItem, err := models.GetEdbInfoMaxAndMinInfo(source, edbInfo.EdbCode)
  729. if err != nil {
  730. br.Msg = "刷新指标失败!"
  731. br.ErrMsg = "获取指标最大最小值失败,err:" + errMsg
  732. return
  733. }
  734. if maxAndMinItem != nil {
  735. err = models.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  736. if err != nil {
  737. br.Msg = "刷新指标失败!"
  738. br.ErrMsg = "修改指标最大最小值失败,err:" + errMsg
  739. return
  740. }
  741. }
  742. br.Ret = 200
  743. br.Success = true
  744. br.Msg = "获取成功"
  745. } else {
  746. br.Ret = 501
  747. br.Success = true
  748. br.Msg = "系统处理中,请稍后重试"
  749. }
  750. }