base_from_calculate.go 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  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.EdbInfoCalculateSaveReq
  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. 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. req.EdbName = strings.Trim(req.EdbName, " ")
  35. if req.EdbName == "" {
  36. br.Msg = "指标名称不能为空"
  37. return
  38. }
  39. if req.Frequency == "" {
  40. br.Msg = "频率不能为空"
  41. return
  42. }
  43. if req.Unit == "" {
  44. br.Msg = "单位不能为空"
  45. return
  46. }
  47. if req.ClassifyId <= 0 {
  48. br.Msg = "请选择分类"
  49. return
  50. }
  51. if len(req.EdbInfoIdArr) <= 0 {
  52. br.Msg = "请选择指标"
  53. return
  54. }
  55. if req.CalculateFormula == "" {
  56. br.Msg = "请填写指标"
  57. return
  58. }
  59. calculateFormula := req.CalculateFormula
  60. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  61. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  62. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  63. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  64. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  65. req.CalculateFormula = calculateFormula
  66. //加入缓存机制,避免创建同一个名称的指标 start
  67. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:add:", utils.DATA_SOURCE_CALCULATE, ":", req.EdbName)
  68. isExist := utils.Rc.IsExist(redisKey)
  69. if isExist {
  70. br.Msg = "指标正在处理,请勿重复提交"
  71. return
  72. } else {
  73. //设置3分钟缓存
  74. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  75. defer func() {
  76. utils.Rc.Delete(redisKey)
  77. }()
  78. }
  79. //判断是否重复指标
  80. edbInfoMap := make(map[int]string)
  81. //移除研究员选择指标中的未使用的指标
  82. {
  83. //转大写的计算公式
  84. upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
  85. //用到的指标
  86. newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  87. for _, tmpEdbInfo := range req.EdbInfoIdArr {
  88. _, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
  89. if ok {
  90. br.Msg = "选择指标失败,请勿选择重复指标!"
  91. return
  92. }
  93. edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
  94. upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
  95. if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
  96. newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
  97. }
  98. }
  99. req.EdbInfoIdArr = newEdbInfoIdArr
  100. }
  101. var condition string
  102. var pars []interface{}
  103. condition += " AND edb_name=? "
  104. pars = append(pars, req.EdbName)
  105. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  106. if err != nil {
  107. br.Msg = "判断指标名称是否存在失败"
  108. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  109. return
  110. }
  111. if count > 0 {
  112. br.Msg = "指标名称已存在,请重新填写"
  113. br.ErrMsg = "指标名称已存在,请重新填写"
  114. br.IsSendEmail = false
  115. return
  116. }
  117. //检验公式
  118. var formulaStr string
  119. var edbInfoIdBytes []string
  120. for _, v := range req.EdbInfoIdArr {
  121. formulaStr += v.FromTag + ","
  122. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  123. }
  124. formulaMap := services.CheckFormula(req.CalculateFormula)
  125. for _, v := range formulaMap {
  126. if !strings.Contains(formulaStr, v) {
  127. br.Msg = "公式错误,请重新填写"
  128. return
  129. }
  130. }
  131. //关联的指标信息
  132. edbInfoList := make([]*models.EdbInfo, 0)
  133. //关联的指标数据表
  134. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  135. for k, v := range req.EdbInfoIdArr {
  136. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  137. if err != nil {
  138. if err.Error() == utils.ErrNoRow() {
  139. br.Msg = "生成计算指标失败"
  140. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  141. return
  142. }
  143. br.Msg = "生成计算指标失败"
  144. br.Msg = "获取指标失败:Err:" + err.Error()
  145. return
  146. }
  147. edbInfoList = append(edbInfoList, fromEdbInfo)
  148. //关联关系表
  149. {
  150. calculateMappingItem := &models.EdbInfoCalculateMapping{
  151. EdbInfoCalculateMappingId: 0,
  152. EdbInfoId: 0,
  153. Source: utils.DATA_SOURCE_CALCULATE,
  154. SourceName: "指标运算",
  155. EdbCode: "",
  156. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  157. FromEdbCode: fromEdbInfo.EdbCode,
  158. FromEdbName: fromEdbInfo.EdbName,
  159. FromSource: fromEdbInfo.Source,
  160. FromSourceName: fromEdbInfo.SourceName,
  161. FromTag: v.FromTag,
  162. Sort: k + 1,
  163. CreateTime: time.Now(),
  164. ModifyTime: time.Now(),
  165. }
  166. //calculateMappingItem.EdbCode = edbCode
  167. //calculateMappingItem.EdbInfoId = int(edbInfoId)
  168. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  169. }
  170. }
  171. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, calculateFormula, edbInfoIdBytes)
  172. if !ok {
  173. br.Msg = "生成计算指标失败,请使用正确的计算公式"
  174. return
  175. }
  176. randStr := utils.GetRandDigit(4)
  177. edbCode := `C` + time.Now().Format("060102") + randStr
  178. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  179. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  180. edbInfo := &models.EdbInfo{
  181. EdbInfoId: 0,
  182. SourceName: "指标运算",
  183. Source: utils.DATA_SOURCE_CALCULATE,
  184. EdbCode: edbCode,
  185. EdbName: req.EdbName,
  186. EdbNameSource: req.EdbName,
  187. Frequency: req.Frequency,
  188. Unit: req.Unit,
  189. StartDate: "",
  190. EndDate: "",
  191. ClassifyId: req.ClassifyId,
  192. SysUserId: req.AdminId,
  193. SysUserRealName: req.AdminName,
  194. UniqueCode: uniqueCode,
  195. CreateTime: time.Now(),
  196. ModifyTime: time.Now(),
  197. MinValue: 0,
  198. MaxValue: 0,
  199. CalculateFormula: req.CalculateFormula,
  200. EdbType: 2,
  201. Sort: 0,
  202. MoveType: 0,
  203. MoveFrequency: "",
  204. NoUpdate: 0,
  205. ServerUrl: "",
  206. EdbInfoType: 0,
  207. EdbNameEn: "",
  208. UnitEn: "",
  209. LatestDate: "",
  210. LatestValue: 0,
  211. ChartImage: "",
  212. }
  213. edbInfoId, err := models.AddEdbInfo(edbInfo)
  214. if err != nil {
  215. br.Msg = "生成计算指标失败"
  216. br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  217. return
  218. }
  219. //处理同名指标
  220. {
  221. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  222. if err != nil {
  223. br.Msg = "保存失败"
  224. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  225. return
  226. }
  227. if len(edbNameList) >= 2 {
  228. for _, v := range edbNameList {
  229. edbName := v.EdbName + "(" + v.SourceName + ")"
  230. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  231. if err != nil {
  232. br.Msg = "保存失败"
  233. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  234. return
  235. }
  236. }
  237. }
  238. }
  239. //关联关系表
  240. {
  241. //处理关联指标
  242. for _, v := range calculateMappingList {
  243. v.EdbCode = edbCode
  244. v.EdbInfoId = int(edbInfoId)
  245. }
  246. if len(calculateMappingList) > 0 {
  247. go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
  248. }
  249. }
  250. // 指标数据入库
  251. err = models.AddCalculate(edbInfoList, int(edbInfoId), edbCode, req.CalculateFormula, edbInfoIdBytes)
  252. if err != nil {
  253. br.Msg = "生成计算指标失败"
  254. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  255. return
  256. }
  257. // 更新指标最大最小值
  258. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  259. if err != nil {
  260. br.Msg = errMsg
  261. br.ErrMsg = err.Error()
  262. return
  263. }
  264. resp := models.AddEdbInfoResp{
  265. EdbInfoId: int(edbInfoId),
  266. UniqueCode: uniqueCode,
  267. }
  268. br.Ret = 200
  269. br.Success = true
  270. br.Msg = "保存成功"
  271. br.Data = resp
  272. br.IsAddLog = true
  273. }
  274. // Edit
  275. // @Title 编辑计算指标接口
  276. // @Description 编辑计算指标接口
  277. // @Success 200 {object} models.EdbInfoCalculateSaveReq
  278. // @router /edit [post]
  279. func (this *CalculateController) Edit() {
  280. br := new(models.BaseResponse).Init()
  281. defer func() {
  282. this.Data["json"] = br
  283. this.ServeJSON()
  284. }()
  285. var req models.EdbInfoCalculateSaveReq
  286. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  287. if err != nil {
  288. br.Msg = "参数解析异常!"
  289. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  290. return
  291. }
  292. if req.EdbInfoId <= 0 {
  293. br.Msg = "参数错误"
  294. br.ErrMsg = "指标ID:" + strconv.Itoa(req.EdbInfoId)
  295. return
  296. }
  297. req.EdbName = strings.Trim(req.EdbName, " ")
  298. if req.EdbName == "" {
  299. br.Msg = "指标名称不能为空"
  300. return
  301. }
  302. if req.Frequency == "" {
  303. br.Msg = "频率不能为空"
  304. return
  305. }
  306. if req.Unit == "" {
  307. br.Msg = "单位不能为空"
  308. return
  309. }
  310. if req.ClassifyId <= 0 {
  311. br.Msg = "请选择分类"
  312. return
  313. }
  314. if len(req.EdbInfoIdArr) <= 0 {
  315. br.Msg = "请选择指标"
  316. return
  317. }
  318. if req.CalculateFormula == "" {
  319. br.Msg = "请填写指标"
  320. return
  321. }
  322. calculateFormula := req.CalculateFormula
  323. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  324. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  325. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  326. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  327. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  328. req.CalculateFormula = calculateFormula
  329. fmt.Println("calculateFormula:" + calculateFormula)
  330. //判断是否重复指标
  331. edbInfoMap := make(map[int]string)
  332. //移除研究员选择指标中的未使用的指标
  333. {
  334. //转大写的计算公式
  335. upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
  336. //用到的指标
  337. newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  338. for _, tmpEdbInfo := range req.EdbInfoIdArr {
  339. _, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
  340. if ok {
  341. br.Msg = "选择指标失败,请勿选择重复指标!"
  342. return
  343. }
  344. edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
  345. upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
  346. if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
  347. newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
  348. }
  349. }
  350. req.EdbInfoIdArr = newEdbInfoIdArr
  351. }
  352. var condition string
  353. var pars []interface{}
  354. condition += " AND edb_name=? "
  355. pars = append(pars, req.EdbName)
  356. condition += " AND edb_info_id<>? "
  357. pars = append(pars, req.EdbInfoId)
  358. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  359. if err != nil {
  360. br.Msg = "判断指标名称是否存在失败"
  361. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  362. return
  363. }
  364. if count > 0 {
  365. br.Msg = "指标名称已存在,请重新填写"
  366. br.ErrMsg = "指标名称已存在,请重新填写"
  367. br.IsSendEmail = false
  368. return
  369. }
  370. //判断公式,指标是否有改动
  371. edbInfoDetail, err := models.GetEdbInfoById(req.EdbInfoId)
  372. if err != nil {
  373. br.Msg = "修改失败"
  374. br.Msg = "获取指标信息失败,GetEdbInfoById Err:" + err.Error()
  375. return
  376. }
  377. if edbInfoDetail == nil {
  378. br.Msg = "修改失败"
  379. br.Msg = "指标信息不存在,EdbInfoId:" + strconv.Itoa(req.EdbInfoId)
  380. return
  381. }
  382. var needCalculate bool
  383. if edbInfoDetail.CalculateFormula != req.CalculateFormula {
  384. needCalculate = true
  385. }
  386. //检验公式
  387. var formulaStr string
  388. var edbInfoIdBytes []string
  389. var edbInfoIdArr []string
  390. for _, v := range req.EdbInfoIdArr {
  391. formulaStr += v.FromTag + ","
  392. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  393. edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
  394. if v.EdbInfoId == req.EdbInfoId {
  395. br.Msg = "计算指标中包含此指标,不能修改"
  396. return
  397. }
  398. }
  399. if needCalculate == false {
  400. edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
  401. fromEdbInfoId, err := models.GetCalculateEdbInfo(req.EdbInfoId)
  402. if err != nil {
  403. br.Msg = "修改失败"
  404. br.Msg = "获取数据失败,GetCalculateEdbInfo:" + err.Error()
  405. return
  406. }
  407. if edbInfoIdStr != fromEdbInfoId {
  408. needCalculate = true
  409. }
  410. }
  411. formulaMap := services.CheckFormula(req.CalculateFormula)
  412. for _, v := range formulaMap {
  413. if !strings.Contains(formulaStr, v) {
  414. br.Msg = "公式错误,请重新填写"
  415. return
  416. }
  417. }
  418. //重新计算
  419. if needCalculate {
  420. err = models.DeleteCalculateEdbInfo(req.EdbInfoId)
  421. if err != nil {
  422. br.Msg = "修改失败"
  423. br.Msg = "修改失败,DeleteCalculateEdbInfo Err:" + err.Error()
  424. return
  425. }
  426. //calculateList := make([]*data_manage.EdbInfoCalculate, 0)
  427. edbInfoList := make([]*models.EdbInfo, 0)
  428. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  429. for k, v := range req.EdbInfoIdArr {
  430. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  431. if err != nil {
  432. if err.Error() == utils.ErrNoRow() {
  433. br.Msg = "生成计算指标失败"
  434. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  435. return
  436. }
  437. br.Msg = "生成计算指标失败"
  438. br.Msg = "获取指标失败:Err:" + err.Error()
  439. return
  440. }
  441. edbInfoList = append(edbInfoList, fromEdbInfo)
  442. //关联关系表
  443. {
  444. calculateMappingItem := &models.EdbInfoCalculateMapping{
  445. EdbInfoCalculateMappingId: 0,
  446. EdbInfoId: req.EdbInfoId,
  447. Source: edbInfoDetail.Source,
  448. SourceName: edbInfoDetail.SourceName,
  449. EdbCode: edbInfoDetail.EdbCode,
  450. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  451. FromEdbCode: fromEdbInfo.EdbCode,
  452. FromEdbName: fromEdbInfo.EdbName,
  453. FromSource: fromEdbInfo.Source,
  454. FromSourceName: fromEdbInfo.SourceName,
  455. FromTag: v.FromTag,
  456. Sort: k + 1,
  457. CreateTime: time.Now(),
  458. ModifyTime: time.Now(),
  459. }
  460. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  461. }
  462. }
  463. //预先计算,判断公式是否正常
  464. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, calculateFormula, edbInfoIdBytes)
  465. if !ok {
  466. br.Msg = "生成计算指标失败,请使用正确的计算公式"
  467. return
  468. }
  469. //关联关系表
  470. {
  471. if len(calculateMappingList) > 0 {
  472. go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
  473. }
  474. }
  475. err = models.AddCalculate(edbInfoList, edbInfoDetail.EdbInfoId, edbInfoDetail.EdbCode, req.CalculateFormula, edbInfoIdBytes)
  476. if err != nil {
  477. br.Msg = "生成计算指标失败"
  478. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  479. return
  480. }
  481. // 更新指标最大最小值
  482. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfoDetail)
  483. if err != nil {
  484. br.Msg = errMsg
  485. br.ErrMsg = err.Error()
  486. return
  487. }
  488. }
  489. // 修改指标信息
  490. err = models.ModifyCalculateEdbInfo(req.EdbName, req.Frequency, req.Unit, req.CalculateFormula, req.ClassifyId, req.EdbInfoId)
  491. if err != nil {
  492. br.Msg = "修改失败"
  493. br.Msg = "修改失败,ModifyEdbInfo Err:" + err.Error()
  494. return
  495. }
  496. resp := models.AddEdbInfoResp{
  497. EdbInfoId: edbInfoDetail.EdbInfoId,
  498. UniqueCode: edbInfoDetail.UniqueCode,
  499. }
  500. br.Ret = 200
  501. br.Success = true
  502. br.Msg = "保存成功"
  503. br.Data = resp
  504. br.IsAddLog = true
  505. }
  506. // BatchSave
  507. // @Title 累计值转月-同比值-同差等计算新增
  508. // @Description 累计值转月-同比值-同差等计算新增接口
  509. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  510. // @Success Ret=200 返回指标id
  511. // @router /batch/save [post]
  512. func (this *CalculateController) BatchSave() {
  513. br := new(models.BaseResponse).Init()
  514. defer func() {
  515. this.Data["json"] = br
  516. this.ServeJSON()
  517. }()
  518. var req models.EdbInfoCalculateBatchSaveReq
  519. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  520. if err != nil {
  521. br.Msg = "参数解析异常!"
  522. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  523. return
  524. }
  525. req.EdbName = strings.Trim(req.EdbName, " ")
  526. if req.EdbName == "" {
  527. br.Msg = "指标名称不能为空"
  528. return
  529. }
  530. if req.Frequency == "" {
  531. br.Msg = "频率不能为空"
  532. return
  533. }
  534. if req.Unit == "" {
  535. br.Msg = "单位不能为空"
  536. return
  537. }
  538. if req.ClassifyId <= 0 {
  539. br.Msg = "请选择分类"
  540. return
  541. }
  542. if req.FromEdbInfoId <= 0 {
  543. br.Msg = "请选择指标"
  544. return
  545. }
  546. var formulaInt int
  547. if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS ||
  548. req.Source == utils.DATA_SOURCE_CALCULATE_HBZ ||
  549. req.Source == utils.DATA_SOURCE_CALCULATE_HCZ ||
  550. req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT ||
  551. req.Source == utils.DATA_SOURCE_CALCULATE_CJJX {
  552. if req.Formula == "" {
  553. br.Msg = "请填写N值"
  554. return
  555. }
  556. formulaInt, _ = strconv.Atoi(req.Formula)
  557. if formulaInt <= 0 {
  558. br.Msg = "N值输入错误,请重新输入"
  559. return
  560. }
  561. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
  562. //直接拼接指标
  563. //校验时间格式
  564. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  565. if err != nil {
  566. br.Msg = "拼接日期有误,请重新输入"
  567. return
  568. }
  569. }
  570. //加入缓存机制,避免创建同一个名称的指标 start
  571. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:batch:save:", req.Source, ":", req.EdbName)
  572. isExist := utils.Rc.IsExist(redisKey)
  573. if isExist {
  574. br.Msg = "指标正在处理,请勿重复提交"
  575. return
  576. } else {
  577. //设置3分钟缓存
  578. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  579. defer func() {
  580. utils.Rc.Delete(redisKey)
  581. }()
  582. }
  583. //加入缓存机制,避免创建同一个名称的指标 end
  584. var condition string
  585. var pars []interface{}
  586. condition += " AND edb_name=? "
  587. pars = append(pars, req.EdbName)
  588. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  589. if err != nil {
  590. br.Msg = "判断指标名称是否存在失败"
  591. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  592. return
  593. }
  594. if count > 0 {
  595. br.Msg = "指标名称已存在,请重新填写"
  596. br.ErrMsg = "指标名称已存在,请重新填写"
  597. br.IsSendEmail = false
  598. return
  599. }
  600. fromEdbInfo, err := models.GetEdbInfoById(req.FromEdbInfoId)
  601. if err != nil {
  602. br.Msg = "获取指标信息失败"
  603. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  604. return
  605. }
  606. //生成指标编码
  607. randStr := utils.GetRandDigit(4)
  608. edbCode := `C` + time.Now().Format("060102") + randStr
  609. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  610. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  611. sysUserId := req.AdminId
  612. sysUserName := req.AdminName
  613. var sourName string
  614. var edbInfoId int
  615. var edbInfo *models.EdbInfo
  616. if req.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
  617. sourName = "累计值转月值"
  618. if fromEdbInfo.Frequency != "月度" {
  619. br.Msg = "请选择月度指标"
  620. return
  621. }
  622. edbInfo, err = models.AddCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  623. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
  624. sourName = "同比值"
  625. edbInfo, err = models.AddCalculateTbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  626. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
  627. sourName = "同差值"
  628. edbInfo, err = models.AddCalculateTcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  629. } else if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
  630. sourName = "N数值移动平均计算"
  631. edbInfo, err = models.AddCalculateNszydpjjs(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  632. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HBZ {
  633. var condition string
  634. var pars []interface{}
  635. condition += " AND edb_info_id =? "
  636. pars = append(pars, req.FromEdbInfoId)
  637. condition += " AND value <=0 "
  638. checkCount, err := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source)
  639. if err != nil && err.Error() != utils.ErrNoRow() {
  640. br.Msg = "判断环比值是否可计算失败"
  641. br.ErrMsg = "判断环比值是否可计算失败,Err:" + err.Error()
  642. return
  643. }
  644. if checkCount > 0 {
  645. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  646. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  647. return
  648. }
  649. sourName = "环比值"
  650. edbInfo, err = models.AddCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  651. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HCZ {
  652. sourName = "环差值"
  653. edbInfo, err = models.AddCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  654. } else if req.Source == utils.DATA_SOURCE_CALCULATE_BP {
  655. //if fromEdbInfo.Frequency == "日度" {
  656. // br.Msg = "日度指标,无法进行变频操作"
  657. // br.ErrMsg = "日度指标,无法进行变频操作:edbcode:" + fromEdbInfo.EdbCode
  658. // return
  659. //}
  660. sourName = "变频"
  661. edbInfo, err = models.AddCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  662. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT { //时间移位
  663. sourName = "时间移位"
  664. edbInfo, err = models.AddCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  665. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ { //直接拼接
  666. sourName = "直接拼接"
  667. if len(req.EdbInfoIdArr) != 1 {
  668. br.Msg = "请传入拼接日期之后的指标"
  669. br.ErrMsg = "请传入拼接日期之后的指标"
  670. return
  671. }
  672. secondEdbInfoReq := req.EdbInfoIdArr[0]
  673. secondEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  674. if err != nil {
  675. br.Msg = "获取拼接日期之后的指标信息失败"
  676. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
  677. return
  678. }
  679. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  680. br.Msg = "两个指标不允许为同一个"
  681. br.ErrMsg = "两个指标不允许为同一个"
  682. return
  683. }
  684. edbInfo, err = models.AddCalculateZjpj(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  685. } else if req.Source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
  686. sourName = "累计值同比拼接"
  687. if fromEdbInfo.Frequency != "月度" {
  688. br.Msg = "待拼接指标只能筛选月度指标"
  689. br.ErrMsg = "待拼接指标只能筛选月度指标"
  690. return
  691. }
  692. if len(req.EdbInfoIdArr) != 1 {
  693. br.Msg = "请传入同比值指标"
  694. br.ErrMsg = "请传入同比值指标"
  695. return
  696. }
  697. secondEdbInfoReq := req.EdbInfoIdArr[0]
  698. tbzEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  699. if err != nil {
  700. br.Msg = "获取同比值指标信息失败"
  701. br.ErrMsg = "获取同比值指标信息失败:Err:" + err.Error()
  702. return
  703. }
  704. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  705. br.Msg = "指标必须是传入同比值指标类型"
  706. br.ErrMsg = "指标必须是传入同比值指标类型"
  707. return
  708. }
  709. if tbzEdbInfo.Frequency != "月度" {
  710. br.Msg = "同比值指标只能筛选月度指标"
  711. br.ErrMsg = "同比值指标只能筛选月度指标"
  712. return
  713. }
  714. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  715. br.Msg = "两个指标不允许为同一个"
  716. br.ErrMsg = "两个指标不允许为同一个"
  717. return
  718. }
  719. edbInfo, err = models.AddCalculateLjztbpj(&req, fromEdbInfo, tbzEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  720. } else if req.Source == utils.DATA_SOURCE_CALCULATE_CJJX {
  721. sourName = "超季节性"
  722. edbInfo, err = models.AddCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  723. } else {
  724. br.Msg = "无效计算方式"
  725. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  726. return
  727. }
  728. if err != nil {
  729. br.Msg = "生成" + sourName + "失败"
  730. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  731. return
  732. }
  733. if edbInfo == nil {
  734. br.Msg = "生成" + sourName + "失败"
  735. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  736. return
  737. }
  738. edbInfoId = edbInfo.EdbInfoId
  739. //处理同名指标
  740. {
  741. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  742. if err != nil {
  743. br.Msg = "保存失败"
  744. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  745. return
  746. }
  747. if len(edbNameList) >= 2 {
  748. for _, v := range edbNameList {
  749. edbName := v.EdbName + "(" + v.SourceName + ")"
  750. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  751. if err != nil {
  752. br.Msg = "保存失败"
  753. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  754. return
  755. }
  756. }
  757. }
  758. }
  759. // 更新指标最大最小值
  760. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  761. if err != nil {
  762. br.Msg = errMsg
  763. br.ErrMsg = err.Error()
  764. return
  765. }
  766. resp := models.AddEdbInfoResp{
  767. EdbInfoId: edbInfo.EdbInfoId,
  768. UniqueCode: edbInfo.UniqueCode,
  769. }
  770. br.Ret = 200
  771. br.Success = true
  772. br.Msg = "保存成功"
  773. br.Data = resp
  774. br.IsAddLog = true
  775. }
  776. // BatchEdit
  777. // @Title 累计值转月-同比值-同差等计算新增
  778. // @Description 累计值转月-同比值-同差等计算新增接口
  779. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  780. // @Success Ret=200 返回指标id
  781. // @router /batch/edit [post]
  782. func (this *CalculateController) BatchEdit() {
  783. br := new(models.BaseResponse).Init()
  784. defer func() {
  785. this.Data["json"] = br
  786. this.ServeJSON()
  787. }()
  788. var req models.EdbInfoCalculateBatchEditReq
  789. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  790. if err != nil {
  791. br.Msg = "参数解析异常!"
  792. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  793. return
  794. }
  795. if req.EdbName == "" {
  796. br.Msg = "指标名称不能为空"
  797. return
  798. }
  799. if req.Frequency == "" {
  800. br.Msg = "频率不能为空"
  801. return
  802. }
  803. if req.Unit == "" {
  804. br.Msg = "单位不能为空"
  805. return
  806. }
  807. if req.ClassifyId <= 0 {
  808. br.Msg = "请选择分类"
  809. return
  810. }
  811. if req.EdbInfoId <= 0 {
  812. br.Msg = "请选择指标"
  813. return
  814. }
  815. var condition string
  816. var pars []interface{}
  817. condition += " AND edb_name=? "
  818. pars = append(pars, req.EdbName)
  819. condition += " AND edb_info_id<>? "
  820. pars = append(pars, req.EdbInfoId)
  821. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  822. if err != nil {
  823. br.Msg = "判断指标名称是否存在失败"
  824. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  825. return
  826. }
  827. if count > 0 {
  828. br.Msg = "指标名称已存在,请重新填写"
  829. br.ErrMsg = "指标名称已存在,请重新填写"
  830. br.IsSendEmail = false
  831. return
  832. }
  833. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  834. if err != nil {
  835. if err.Error() == utils.ErrNoRow() {
  836. br.Msg = "指标已被删除,请刷新页面"
  837. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  838. return
  839. }
  840. br.Msg = "获取指标信息失败"
  841. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  842. return
  843. }
  844. fromEdbInfo, err := models.GetEdbInfoById(req.FromEdbInfoId)
  845. if err != nil {
  846. if err.Error() == utils.ErrNoRow() {
  847. br.Msg = "指标已被删除,请刷新页面"
  848. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  849. return
  850. }
  851. br.Msg = "获取指标信息失败"
  852. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  853. return
  854. }
  855. if req.Source <= 0 {
  856. req.Source = edbInfo.Source
  857. }
  858. var formulaInt int
  859. if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS ||
  860. req.Source == utils.DATA_SOURCE_CALCULATE_HBZ ||
  861. req.Source == utils.DATA_SOURCE_CALCULATE_HCZ ||
  862. req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT ||
  863. req.Source == utils.DATA_SOURCE_CALCULATE_CJJX {
  864. if req.Formula == "" {
  865. br.Msg = "请填写N值"
  866. return
  867. }
  868. formulaInt, _ = strconv.Atoi(req.Formula)
  869. if formulaInt <= 0 {
  870. br.Msg = "N值输入错误,请重新输入"
  871. return
  872. }
  873. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
  874. //直接拼接指标
  875. //校验时间格式
  876. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  877. if err != nil {
  878. br.Msg = "拼接日期有误,请重新输入"
  879. return
  880. }
  881. }
  882. var sourName string
  883. var edbInfoId int
  884. if req.Source == utils.DATA_SOURCE_CALCULATE_LJZZY {
  885. sourName = "累计值转月值"
  886. if fromEdbInfo.Frequency != "月度" {
  887. br.Msg = "请选择月度指标"
  888. return
  889. }
  890. err = models.EditCalculateLjzzy(edbInfo, &req, fromEdbInfo)
  891. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TBZ {
  892. sourName = "同比值"
  893. err = models.EditCalculateTbz(edbInfo, &req, fromEdbInfo)
  894. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TCZ {
  895. fmt.Println("start edit", time.Now())
  896. sourName = "同差值"
  897. err = models.EditCalculateTcz(edbInfo, &req, fromEdbInfo)
  898. fmt.Println("end edit", time.Now())
  899. } else if req.Source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
  900. sourName = "N数值移动平均计算"
  901. err = models.EditCalculateNszydpjjs(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  902. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HBZ {
  903. var condition string
  904. var pars []interface{}
  905. condition += " AND edb_info_id =? "
  906. pars = append(pars, req.FromEdbInfoId)
  907. condition += " AND value <=0 "
  908. checkCount, err := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source)
  909. if err != nil && err.Error() != utils.ErrNoRow() {
  910. br.Msg = "判断环比值是否可计算失败"
  911. br.ErrMsg = "判断环比值是否可计算失败,Err:" + err.Error()
  912. return
  913. }
  914. if checkCount > 0 {
  915. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  916. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  917. return
  918. }
  919. sourName = "环比值"
  920. err = models.EditCalculateHbz(edbInfo, &req, fromEdbInfo, formulaInt)
  921. } else if req.Source == utils.DATA_SOURCE_CALCULATE_HCZ {
  922. sourName = "环差值"
  923. err = models.EditCalculateHcz(edbInfo, &req, fromEdbInfo, formulaInt)
  924. } else if req.Source == utils.DATA_SOURCE_CALCULATE_BP {
  925. sourName = "变频"
  926. err = models.EditCalculateBp(edbInfo, &req, fromEdbInfo)
  927. } else if req.Source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT {
  928. sourName = "时间移位"
  929. err = models.EditCalculateTimeShift(edbInfo, &req, fromEdbInfo)
  930. } else if req.Source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
  931. sourName = "直接拼接"
  932. if len(req.EdbInfoIdArr) != 1 {
  933. br.Msg = "请传入拼接日期之后的指标"
  934. br.ErrMsg = "请传入拼接日期之后的指标"
  935. return
  936. }
  937. secondEdbInfoReq := req.EdbInfoIdArr[0]
  938. secondEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  939. if err != nil {
  940. br.Msg = "获取拼接日期之后的指标信息失败"
  941. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
  942. return
  943. }
  944. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  945. br.Msg = "两个指标不允许为同一个"
  946. br.ErrMsg = "两个指标不允许为同一个"
  947. return
  948. }
  949. err = models.EditCalculateZjpj(&req, edbInfo, fromEdbInfo, secondEdbInfo)
  950. } else if req.Source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
  951. sourName = "累计值同比拼接"
  952. if fromEdbInfo.Frequency != "月度" {
  953. br.Msg = "待拼接指标只能筛选月度指标"
  954. br.ErrMsg = "待拼接指标只能筛选月度指标"
  955. return
  956. }
  957. if len(req.EdbInfoIdArr) != 1 {
  958. br.Msg = "请传入同比值指标"
  959. br.ErrMsg = "请传入同比值指标"
  960. return
  961. }
  962. secondEdbInfoReq := req.EdbInfoIdArr[0]
  963. tbzEdbInfo, err := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  964. if err != nil {
  965. br.Msg = "获取同比值指标信息失败"
  966. br.ErrMsg = "获取同比值指标信息失败:Err:" + err.Error()
  967. return
  968. }
  969. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  970. br.Msg = "指标必须是传入同比值指标类型"
  971. br.ErrMsg = "指标必须是传入同比值指标类型"
  972. return
  973. }
  974. if tbzEdbInfo.Frequency != "月度" {
  975. br.Msg = "同比值指标只能筛选月度指标"
  976. br.ErrMsg = "同比值指标只能筛选月度指标"
  977. return
  978. }
  979. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  980. br.Msg = "两个指标不允许为同一个"
  981. br.ErrMsg = "两个指标不允许为同一个"
  982. return
  983. }
  984. err = models.EditCalculateLjztbpj(&req, edbInfo, fromEdbInfo, tbzEdbInfo)
  985. } else if req.Source == utils.DATA_SOURCE_CALCULATE_CJJX {
  986. sourName = "超季节性"
  987. err = models.EditCalculateCjjx(&req, edbInfo, fromEdbInfo, formulaInt)
  988. } else {
  989. br.Msg = "无效计算方式"
  990. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  991. return
  992. }
  993. if err != nil {
  994. br.Msg = "生成" + sourName + "失败"
  995. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  996. return
  997. }
  998. if edbInfo == nil {
  999. br.Msg = "生成" + sourName + "失败"
  1000. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  1001. return
  1002. }
  1003. edbInfoId = edbInfo.EdbInfoId
  1004. //处理同名指标
  1005. {
  1006. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  1007. if err != nil {
  1008. br.Msg = "保存失败"
  1009. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  1010. return
  1011. }
  1012. if len(edbNameList) >= 2 {
  1013. for _, v := range edbNameList {
  1014. edbName := v.EdbName + "(" + v.SourceName + ")"
  1015. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  1016. if err != nil {
  1017. br.Msg = "保存失败"
  1018. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  1019. return
  1020. }
  1021. }
  1022. }
  1023. }
  1024. // 更新指标最大最小值
  1025. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1026. if err != nil {
  1027. br.Msg = errMsg
  1028. br.ErrMsg = err.Error()
  1029. return
  1030. }
  1031. resp := models.AddEdbInfoResp{
  1032. EdbInfoId: edbInfo.EdbInfoId,
  1033. UniqueCode: edbInfo.UniqueCode,
  1034. }
  1035. br.Ret = 200
  1036. br.Success = true
  1037. br.Msg = "保存成功"
  1038. br.Data = resp
  1039. br.IsAddLog = true
  1040. }
  1041. // Refresh
  1042. // @Title 刷新计算指标接口
  1043. // @Description 刷新计算指标接口
  1044. // @Success 200 {object} models.RefreshEdbInfoReq
  1045. // @router /refresh [post]
  1046. func (this *CalculateController) Refresh() {
  1047. br := new(models.BaseResponse).Init()
  1048. var cacheKey string
  1049. defer func() {
  1050. this.Data["json"] = br
  1051. this.ServeJSON()
  1052. }()
  1053. var req models.RefreshEdbInfoReq
  1054. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1055. if err != nil {
  1056. br.Msg = "参数解析异常!"
  1057. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1058. return
  1059. }
  1060. if req.EdbCode == "" {
  1061. br.Msg = "请输入指标编码!"
  1062. br.ErrMsg = "请输入指标编码,指标编码为空"
  1063. return
  1064. }
  1065. if req.EdbInfoId <= 0 {
  1066. br.Msg = "请输入指标ID!"
  1067. br.ErrMsg = "请输入指标ID"
  1068. return
  1069. }
  1070. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  1071. if err != nil {
  1072. br.Msg = "指标不存在!"
  1073. br.ErrMsg = "指标不存在"
  1074. return
  1075. }
  1076. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  1077. if !utils.Rc.IsExist(cacheKey) {
  1078. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  1079. defer func() {
  1080. utils.Rc.Delete(cacheKey)
  1081. }()
  1082. startDate := req.StartDate
  1083. var errMsg string
  1084. endDate := time.Now().Format(utils.FormatDate)
  1085. edbInfoId := edbInfo.EdbInfoId
  1086. source := edbInfo.Source
  1087. switch source {
  1088. case utils.DATA_SOURCE_CALCULATE:
  1089. //startDate = edbInfo.StartDate
  1090. //sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
  1091. //if err != nil {
  1092. // return
  1093. //}
  1094. //startDate = sTime.Format(utils.FormatDate)
  1095. startDate = ""
  1096. var edbInfoIdBytes []string
  1097. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  1098. if err != nil {
  1099. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  1100. break
  1101. }
  1102. var formulaStr string
  1103. edbInfoList := make([]*models.EdbInfo, 0)
  1104. for _, v := range calculateMap {
  1105. formulaStr += v.FromTag + ","
  1106. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  1107. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  1108. edbInfoList = append(edbInfoList, edbInfo)
  1109. }
  1110. err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes)
  1111. if err != nil && err.Error() != utils.ErrNoRow() {
  1112. errMsg = "RefreshCalculate Err:" + err.Error()
  1113. break
  1114. }
  1115. case utils.DATA_SOURCE_CALCULATE_LJZZY: //刷新累计值转月值
  1116. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1117. if err != nil {
  1118. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  1119. break
  1120. }
  1121. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  1122. if err != nil {
  1123. errMsg = "GetEdbInfoById Err:" + err.Error()
  1124. break
  1125. }
  1126. startDate = edbInfo.StartDate
  1127. endDate = time.Now().Format(utils.FormatDate)
  1128. err = models.RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  1129. if err != nil && err.Error() != utils.ErrNoRow() {
  1130. errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
  1131. break
  1132. }
  1133. case utils.DATA_SOURCE_CALCULATE_TBZ: //刷新同比值
  1134. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1135. if err != nil {
  1136. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1137. break
  1138. }
  1139. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1140. if err != nil {
  1141. errMsg = "GetEdbInfoById Err:" + err.Error()
  1142. break
  1143. }
  1144. startDate = edbInfo.StartDate
  1145. endDate = time.Now().Format(utils.FormatDate)
  1146. err = models.RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  1147. if err != nil && err.Error() != utils.ErrNoRow() {
  1148. errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
  1149. break
  1150. }
  1151. case utils.DATA_SOURCE_CALCULATE_TCZ: //同差值
  1152. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1153. if err != nil {
  1154. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1155. break
  1156. }
  1157. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  1158. if err != nil {
  1159. errMsg = "GetEdbInfoById Err:" + err.Error()
  1160. break
  1161. }
  1162. startDate = edbInfo.StartDate
  1163. endDate = time.Now().Format(utils.FormatDate)
  1164. err = models.RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
  1165. if err != nil && err.Error() != utils.ErrNoRow() {
  1166. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  1167. break
  1168. }
  1169. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  1170. calculateNszydpjjs, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1171. if err != nil {
  1172. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1173. break
  1174. }
  1175. fromEdbInfo, err := models.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
  1176. if err != nil {
  1177. errMsg = "GetEdbInfoById Err:" + err.Error()
  1178. break
  1179. }
  1180. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1181. startDate = edbInfo.StartDate
  1182. err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
  1183. if err != nil && err.Error() != utils.ErrNoRow() {
  1184. errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
  1185. break
  1186. }
  1187. case utils.DATA_SOURCE_CALCULATE_HBZ: //刷新环比值
  1188. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1189. if err != nil {
  1190. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  1191. break
  1192. }
  1193. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1194. if err != nil {
  1195. errMsg = "GetEdbInfoById Err:" + err.Error()
  1196. break
  1197. }
  1198. startDate = edbInfo.StartDate
  1199. endDate = time.Now().Format(utils.FormatDate)
  1200. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1201. err = models.RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  1202. if err != nil && err.Error() != utils.ErrNoRow() {
  1203. errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
  1204. break
  1205. }
  1206. case utils.DATA_SOURCE_CALCULATE_HCZ: //刷新环差值
  1207. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1208. if err != nil {
  1209. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  1210. break
  1211. }
  1212. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1213. if err != nil {
  1214. errMsg = "GetEdbInfoById Err:" + err.Error()
  1215. break
  1216. }
  1217. startDate = edbInfo.StartDate
  1218. endDate = time.Now().Format(utils.FormatDate)
  1219. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1220. err = models.RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  1221. if err != nil && err.Error() != utils.ErrNoRow() {
  1222. errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
  1223. break
  1224. }
  1225. case utils.DATA_SOURCE_CALCULATE_BP: //刷新变频
  1226. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1227. if err != nil {
  1228. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1229. break
  1230. }
  1231. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1232. if err != nil {
  1233. errMsg = "GetEdbInfoById Err:" + err.Error()
  1234. break
  1235. }
  1236. startDate = edbInfo.StartDate
  1237. endDate = time.Now().Format(utils.FormatDate)
  1238. err = models.RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  1239. if err != nil && err.Error() != utils.ErrNoRow() {
  1240. errMsg = "RefreshAllCalculateBp Err:" + err.Error()
  1241. break
  1242. }
  1243. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  1244. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1245. if err != nil {
  1246. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1247. break
  1248. }
  1249. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  1250. if err != nil {
  1251. errMsg = "GetEdbInfoById Err:" + err.Error()
  1252. break
  1253. }
  1254. startDate = edbInfo.StartDate
  1255. endDate = time.Now().Format(utils.FormatDate)
  1256. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  1257. err = models.RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  1258. if err != nil && err.Error() != utils.ErrNoRow() {
  1259. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  1260. }
  1261. case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
  1262. err = models.RefreshAllCalculateZjpj(edbInfo)
  1263. if err != nil && err.Error() != utils.ErrNoRow() {
  1264. errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
  1265. break
  1266. }
  1267. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  1268. err = models.RefreshAllCalculateLjztbpj(edbInfo)
  1269. if err != nil && err.Error() != utils.ErrNoRow() {
  1270. errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
  1271. break
  1272. }
  1273. case utils.DATA_SOURCE_PYTHON: //python代码运算
  1274. edbPythonCode, err := models.GetEdbPythonCodeById(edbInfo.EdbInfoId)
  1275. if err != nil {
  1276. errMsg = "获取python代码失败 Err:" + err.Error()
  1277. break
  1278. }
  1279. edbData, err, errMsg := services.ExecPythonCode(edbInfo.EdbCode, edbPythonCode.PythonCode)
  1280. if err != nil {
  1281. br.Msg = "获取数据失败"
  1282. br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
  1283. if errMsg != "" {
  1284. br.ErrMsg = errMsg
  1285. }
  1286. return
  1287. }
  1288. err = models.RefreshAllPythonEdb(edbInfo, edbData)
  1289. if err != nil && err.Error() != utils.ErrNoRow() {
  1290. errMsg = "RefreshAllPythonEdb Err:" + err.Error()
  1291. break
  1292. }
  1293. case utils.DATA_SOURCE_CALCULATE_CJJX: //超季节性
  1294. calculateCjjx, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1295. if err != nil {
  1296. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1297. break
  1298. }
  1299. fromEdbInfo, err := models.GetEdbInfoById(calculateCjjx.FromEdbInfoId)
  1300. if err != nil {
  1301. errMsg = "GetEdbInfoById Err:" + err.Error()
  1302. break
  1303. }
  1304. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1305. startDate = edbInfo.StartDate
  1306. err = models.RefreshAllCalculateCjjx(edbInfoId, edbInfo.Source, fromEdbInfo, calculateCjjx.EdbCode, startDate, "", formulaInt)
  1307. if err != nil && err.Error() != utils.ErrNoRow() {
  1308. errMsg = "RefreshAllCalculateCjjx Err:" + err.Error()
  1309. break
  1310. }
  1311. default:
  1312. br.Msg = "来源异常,请联系相关开发!"
  1313. br.ErrMsg = "来源异常,请联系相关开发"
  1314. return
  1315. }
  1316. if errMsg != `` {
  1317. br.Msg = "刷新指标失败!"
  1318. br.ErrMsg = "刷新指标失败,err:" + errMsg
  1319. return
  1320. }
  1321. // 更新指标最大最小值
  1322. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1323. if err != nil {
  1324. br.Msg = errMsg
  1325. br.ErrMsg = err.Error()
  1326. return
  1327. }
  1328. br.Ret = 200
  1329. br.Success = true
  1330. br.Msg = "获取成功"
  1331. } else {
  1332. br.Ret = 501
  1333. br.Success = true
  1334. br.Msg = "系统处理中,请稍后重试"
  1335. }
  1336. }