base_from_predict_calculate.go 22 KB

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