base_from_calculate.go 28 KB

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