base_from_calculate.go 25 KB

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