base_from_calculate.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  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 := models.UnifiedModifyEdbInfoMaxAndMinInfo(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 {
  338. fromEdbInfoList, tmpErr := models.GetEdbInfoCalculateDetailList(req.EdbInfoId)
  339. err = tmpErr
  340. if err != nil {
  341. br.Msg = "获取计算指标失败:err:" + err.Error()
  342. return
  343. }
  344. if len(fromEdbInfoList) <= 0 {
  345. br.Msg = "计算指标所依赖指标不存在"
  346. return
  347. }
  348. fromEdbInfoItem := fromEdbInfoList[0]
  349. if fromEdbInfoItem == nil {
  350. return
  351. }
  352. //检验公式
  353. var formulaStr string
  354. var edbInfoIdBytes []string
  355. for _, v := range fromEdbInfoList {
  356. formulaStr += v.FromTag + ","
  357. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  358. }
  359. formulaStr = strings.Trim(formulaStr, ",")
  360. formulaMap := services.CheckFormula(edbInfo.CalculateFormula)
  361. for _, v := range formulaMap {
  362. if !strings.Contains(formulaStr, v) {
  363. br.Msg = "公式错误,请重新填写"
  364. return
  365. }
  366. }
  367. edbInfoList := make([]*models.EdbInfo, 0)
  368. for _, v := range fromEdbInfoList {
  369. edbInfo, tmpErr := models.GetEdbInfoById(v.FromEdbInfoId)
  370. err = tmpErr
  371. if err != nil {
  372. if err.Error() == utils.ErrNoRow() {
  373. br.Msg = "指标 " + strconv.Itoa(v.FromEdbInfoId) + " 不存在"
  374. } else {
  375. br.Msg = "获取指标失败:Err:" + err.Error()
  376. }
  377. return
  378. }
  379. edbInfoList = append(edbInfoList, edbInfo)
  380. }
  381. //清除历史数据
  382. err = models.DeleteCalculateData(edbInfoId)
  383. if err != nil {
  384. br.Msg = "清空运算指标失败:Err:" + err.Error() + " edb_info_id:" + strconv.Itoa(edbInfoId)
  385. return
  386. }
  387. err = models.Calculate(edbInfoList, edbInfoId, edbCode, edbInfo.CalculateFormula, edbInfoIdBytes)
  388. if err != nil {
  389. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  390. return
  391. }
  392. } else if req.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
  393. sourName = "累计值转月值"
  394. if fromEdbInfo.Frequency != "月度" {
  395. br.Msg = "请选择月度指标"
  396. return
  397. }
  398. edbInfoId, err = models.AddCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  399. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
  400. sourName = "同比值"
  401. edbInfoId, err = models.AddCalculateTbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  402. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
  403. sourName = "同差值"
  404. edbInfoId, err = models.AddCalculateTcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  405. } else if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
  406. sourName = "N数值移动平均计算"
  407. edbInfoId, err = models.AddCalculateNszydpjjs(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  408. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HBZ { //环比值
  409. var condition string
  410. var pars []interface{}
  411. condition += " AND edb_info_id =? "
  412. pars = append(pars, req.FromEdbInfoId)
  413. condition += " AND value <=0 "
  414. checkCount, err := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source)
  415. if err != nil && err.Error() != utils.ErrNoRow() {
  416. br.Msg = "判断环比值是否可计算失败"
  417. br.ErrMsg = "判断环比值是否可计算失败,Err:" + err.Error()
  418. return
  419. }
  420. if checkCount > 0 {
  421. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  422. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  423. return
  424. }
  425. sourName = "环比值"
  426. edbInfoId, err = models.AddCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  427. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HCZ {
  428. sourName = "环差值"
  429. edbInfoId, err = models.AddCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  430. } else if req.Source == utils.DATA_SOURCE_CALCULATE_BP {
  431. if fromEdbInfo.Frequency == "日度" {
  432. br.Msg = "日度指标,无法进行变频操作"
  433. br.ErrMsg = "日度指标,无法进行变频操作:edbcode:" + fromEdbInfo.EdbCode
  434. return
  435. }
  436. sourName = "变频"
  437. edbInfoId, err = models.AddCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  438. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT { //时间移位
  439. sourName = "时间移位"
  440. edbInfoId, err = models.EditCalculateTimeShift(&req, fromEdbInfo, edbCode, edbInfo)
  441. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ { //直接拼接
  442. sourName = "直接拼接"
  443. if len(req.EdbInfoIdArr) != 1 {
  444. br.Msg = "请传入拼接日期之后的指标"
  445. br.ErrMsg = "请传入拼接日期之后的指标"
  446. return
  447. }
  448. secondEdbInfoReq := req.EdbInfoIdArr[0]
  449. secondEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  450. if err != nil {
  451. br.Msg = "获取拼接日期之后的指标信息失败"
  452. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
  453. return
  454. }
  455. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  456. br.Msg = "两个指标不允许为同一个"
  457. br.ErrMsg = "两个指标不允许为同一个"
  458. return
  459. }
  460. edbInfoId, err = models.EditCalculateZjpj(&req, edbInfo, fromEdbInfo, secondEdbInfo)
  461. } else if req.Source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
  462. sourName = "累计值同比拼接"
  463. if fromEdbInfo.Frequency != "月度" {
  464. br.Msg = "待拼接指标只能筛选月度指标"
  465. br.ErrMsg = "待拼接指标只能筛选月度指标"
  466. return
  467. }
  468. if len(req.EdbInfoIdArr) != 1 {
  469. br.Msg = "请传入同比值指标"
  470. br.ErrMsg = "请传入同比值指标"
  471. return
  472. }
  473. secondEdbInfoReq := req.EdbInfoIdArr[0]
  474. tbzEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  475. if err != nil {
  476. br.Msg = "获取同比值指标信息失败"
  477. br.ErrMsg = "获取同比值指标信息失败:Err:" + err.Error()
  478. return
  479. }
  480. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  481. br.Msg = "指标必须是传入同比值指标类型"
  482. br.ErrMsg = "指标必须是传入同比值指标类型"
  483. return
  484. }
  485. if tbzEdbInfo.Frequency != "月度" {
  486. br.Msg = "同比值指标只能筛选月度指标"
  487. br.ErrMsg = "同比值指标只能筛选月度指标"
  488. return
  489. }
  490. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  491. br.Msg = "两个指标不允许为同一个"
  492. br.ErrMsg = "两个指标不允许为同一个"
  493. return
  494. }
  495. edbInfoId, err = models.EditCalculateLjztbpj(&req, edbInfo, fromEdbInfo, tbzEdbInfo)
  496. } else if req.Source == utils.DATA_SOURCE_PYTHON {
  497. br.Ret = 200
  498. br.Success = true
  499. br.Msg = "保存成功"
  500. } else {
  501. br.Msg = "无效计算方式"
  502. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  503. return
  504. }
  505. if err != nil {
  506. br.Msg = "生成" + sourName + "失败"
  507. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  508. return
  509. }
  510. if edbInfoId <= 0 {
  511. br.Msg = "生成" + sourName + "失败"
  512. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  513. return
  514. }
  515. //处理同名指标
  516. {
  517. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  518. if err != nil {
  519. br.Msg = "保存失败"
  520. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  521. return
  522. }
  523. if len(edbNameList) >= 2 {
  524. for _, v := range edbNameList {
  525. edbName := v.EdbName + "(" + v.SourceName + ")"
  526. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  527. if err != nil {
  528. br.Msg = "保存失败"
  529. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  530. return
  531. }
  532. }
  533. }
  534. }
  535. // 更新指标最大最小值
  536. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  537. if err != nil {
  538. br.Msg = errMsg
  539. br.ErrMsg = err.Error()
  540. return
  541. }
  542. resp := models.AddEdbInfoResp{
  543. EdbInfoId: edbInfoId,
  544. UniqueCode: uniqueCode,
  545. }
  546. br.Ret = 200
  547. br.Success = true
  548. br.Msg = "保存成功"
  549. br.Data = resp
  550. br.IsAddLog = true
  551. }
  552. // Refresh
  553. // @Title 刷新计算指标接口
  554. // @Description 刷新计算指标接口
  555. // @Success 200 {object} models.RefreshEdbInfoReq
  556. // @router /refresh [post]
  557. func (this *CalculateController) Refresh() {
  558. br := new(models.BaseResponse).Init()
  559. var cacheKey string
  560. defer func() {
  561. this.Data["json"] = br
  562. this.ServeJSON()
  563. }()
  564. var req models.RefreshEdbInfoReq
  565. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  566. if err != nil {
  567. br.Msg = "参数解析异常!"
  568. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  569. return
  570. }
  571. if req.EdbCode == "" {
  572. br.Msg = "请输入指标编码!"
  573. br.ErrMsg = "请输入指标编码,指标编码为空"
  574. return
  575. }
  576. if req.EdbInfoId <= 0 {
  577. br.Msg = "请输入指标ID!"
  578. br.ErrMsg = "请输入指标ID"
  579. return
  580. }
  581. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  582. if err != nil {
  583. br.Msg = "指标不存在!"
  584. br.ErrMsg = "指标不存在"
  585. return
  586. }
  587. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  588. if !utils.Rc.IsExist(cacheKey) {
  589. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  590. defer func() {
  591. utils.Rc.Delete(cacheKey)
  592. }()
  593. startDate := req.StartDate
  594. var errMsg string
  595. endDate := time.Now().Format(utils.FormatDate)
  596. edbInfoId := edbInfo.EdbInfoId
  597. source := edbInfo.Source
  598. switch source {
  599. case utils.DATA_SOURCE_CALCULATE:
  600. //startDate = edbInfo.StartDate
  601. //sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
  602. //if err != nil {
  603. // return
  604. //}
  605. //startDate = sTime.Format(utils.FormatDate)
  606. startDate = ""
  607. var edbInfoIdBytes []string
  608. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  609. if err != nil {
  610. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  611. break
  612. }
  613. var formulaStr string
  614. edbInfoList := make([]*models.EdbInfo, 0)
  615. for _, v := range calculateMap {
  616. formulaStr += v.FromTag + ","
  617. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  618. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  619. edbInfoList = append(edbInfoList, edbInfo)
  620. }
  621. err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes)
  622. if err != nil && err.Error() != utils.ErrNoRow() {
  623. errMsg = "RefreshCalculate Err:" + err.Error()
  624. break
  625. }
  626. case utils.DATA_SOURCE_CALCULATE_LJZZY: //刷新累计值转月值
  627. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  628. if err != nil {
  629. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  630. break
  631. }
  632. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  633. if err != nil {
  634. errMsg = "GetEdbInfoById Err:" + err.Error()
  635. break
  636. }
  637. startDate = edbInfo.StartDate
  638. endDate = time.Now().Format(utils.FormatDate)
  639. err = models.RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  640. if err != nil && err.Error() != utils.ErrNoRow() {
  641. errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
  642. break
  643. }
  644. case utils.DATA_SOURCE_CALCULATE_TBZ: //刷新同比值
  645. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  646. if err != nil {
  647. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  648. break
  649. }
  650. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  651. if err != nil {
  652. errMsg = "GetEdbInfoById Err:" + err.Error()
  653. break
  654. }
  655. startDate = edbInfo.StartDate
  656. endDate = time.Now().Format(utils.FormatDate)
  657. err = models.RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  658. if err != nil && err.Error() != utils.ErrNoRow() {
  659. errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
  660. break
  661. }
  662. case utils.DATA_SOURCE_CALCULATE_TCZ: //同差值
  663. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  664. if err != nil {
  665. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  666. break
  667. }
  668. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  669. if err != nil {
  670. errMsg = "GetEdbInfoById Err:" + err.Error()
  671. break
  672. }
  673. startDate = edbInfo.StartDate
  674. endDate = time.Now().Format(utils.FormatDate)
  675. err = models.RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
  676. if err != nil && err.Error() != utils.ErrNoRow() {
  677. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  678. break
  679. }
  680. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  681. calculateNszydpjjs, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  682. if err != nil {
  683. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  684. break
  685. }
  686. fromEdbInfo, err := models.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
  687. if err != nil {
  688. errMsg = "GetEdbInfoById Err:" + err.Error()
  689. break
  690. }
  691. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  692. startDate = edbInfo.StartDate
  693. err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
  694. if err != nil && err.Error() != utils.ErrNoRow() {
  695. errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
  696. break
  697. }
  698. case utils.DATA_SOURCE_CALCULATE_HBZ: //刷新环比值
  699. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  700. if err != nil {
  701. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  702. break
  703. }
  704. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  705. if err != nil {
  706. errMsg = "GetEdbInfoById Err:" + err.Error()
  707. break
  708. }
  709. startDate = edbInfo.StartDate
  710. endDate = time.Now().Format(utils.FormatDate)
  711. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  712. err = models.RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  713. if err != nil && err.Error() != utils.ErrNoRow() {
  714. errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
  715. break
  716. }
  717. case utils.DATA_SOURCE_CALCULATE_HCZ: //刷新环差值
  718. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  719. if err != nil {
  720. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  721. break
  722. }
  723. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  724. if err != nil {
  725. errMsg = "GetEdbInfoById Err:" + err.Error()
  726. break
  727. }
  728. startDate = edbInfo.StartDate
  729. endDate = time.Now().Format(utils.FormatDate)
  730. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  731. err = models.RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  732. if err != nil && err.Error() != utils.ErrNoRow() {
  733. errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
  734. break
  735. }
  736. case utils.DATA_SOURCE_CALCULATE_BP: //刷新变频
  737. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  738. if err != nil {
  739. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  740. break
  741. }
  742. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  743. if err != nil {
  744. errMsg = "GetEdbInfoById Err:" + err.Error()
  745. break
  746. }
  747. startDate = edbInfo.StartDate
  748. endDate = time.Now().Format(utils.FormatDate)
  749. err = models.RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  750. if err != nil && err.Error() != utils.ErrNoRow() {
  751. errMsg = "RefreshAllCalculateBp Err:" + err.Error()
  752. break
  753. }
  754. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  755. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  756. if err != nil {
  757. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  758. break
  759. }
  760. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  761. if err != nil {
  762. errMsg = "GetEdbInfoById Err:" + err.Error()
  763. break
  764. }
  765. startDate = edbInfo.StartDate
  766. endDate = time.Now().Format(utils.FormatDate)
  767. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  768. err = models.RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  769. if err != nil && err.Error() != utils.ErrNoRow() {
  770. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  771. }
  772. case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
  773. err = models.RefreshAllCalculateZjpj(edbInfo)
  774. if err != nil && err.Error() != utils.ErrNoRow() {
  775. errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
  776. break
  777. }
  778. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  779. err = models.RefreshAllCalculateLjztbpj(edbInfo)
  780. if err != nil && err.Error() != utils.ErrNoRow() {
  781. errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
  782. break
  783. }
  784. case utils.DATA_SOURCE_PYTHON: //python代码运算
  785. edbPythonCode, err := models.GetEdbPythonCodeById(edbInfo.EdbInfoId)
  786. if err != nil {
  787. errMsg = "获取python代码失败 Err:" + err.Error()
  788. break
  789. }
  790. edbData, err, errMsg := services.ExecPythonCode(edbInfo.EdbCode, edbPythonCode.PythonCode)
  791. if err != nil {
  792. br.Msg = "获取数据失败"
  793. br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
  794. if errMsg != "" {
  795. br.ErrMsg = errMsg
  796. }
  797. return
  798. }
  799. err = models.RefreshAllPythonEdb(edbInfo, edbData)
  800. if err != nil && err.Error() != utils.ErrNoRow() {
  801. errMsg = "RefreshAllPythonEdb Err:" + err.Error()
  802. break
  803. }
  804. default:
  805. br.Msg = "来源异常,请联系相关开发!"
  806. br.ErrMsg = "来源异常,请联系相关开发"
  807. return
  808. }
  809. if errMsg != `` {
  810. br.Msg = "刷新指标失败!"
  811. br.ErrMsg = "刷新指标失败,err:" + errMsg
  812. return
  813. }
  814. // 更新指标最大最小值
  815. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  816. if err != nil {
  817. br.Msg = errMsg
  818. br.ErrMsg = err.Error()
  819. return
  820. }
  821. br.Ret = 200
  822. br.Success = true
  823. br.Msg = "获取成功"
  824. } else {
  825. br.Ret = 501
  826. br.Success = true
  827. br.Msg = "系统处理中,请稍后重试"
  828. }
  829. }