base_from_predict_calculate.go 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_index_lib/logic"
  5. "eta/eta_index_lib/models"
  6. "eta/eta_index_lib/utils"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // PredictCalculateController 预测计算指标
  13. type PredictCalculateController struct {
  14. BaseAuthController
  15. }
  16. // Save
  17. // @Title 新增/编辑预测指标运算接口
  18. // @Description 新增预测指标运算接口
  19. // @Success 200 {object} models.EdbInfoCalculateSaveReq
  20. // @router /save [post]
  21. func (this *PredictCalculateController) Save() {
  22. br := new(models.BaseResponse).Init()
  23. defer func() {
  24. this.Data["json"] = br
  25. this.ServeJSON()
  26. }()
  27. var req models.EdbInfoCalculateSaveReq
  28. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  29. if err != nil {
  30. br.Msg = "参数解析异常!"
  31. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  32. return
  33. }
  34. if req.EdbInfoId <= 0 {
  35. addPredictCalculate(br, req)
  36. } else {
  37. editPredictCalculate(br, req)
  38. }
  39. }
  40. // AddPredictCalculate 添加预测指标运算
  41. func addPredictCalculate(br *models.BaseResponse, req models.EdbInfoCalculateSaveReq) {
  42. req.EdbName = strings.Trim(req.EdbName, " ")
  43. if req.EdbName == "" {
  44. br.Msg = "指标名称不能为空"
  45. return
  46. }
  47. if req.Frequency == "" {
  48. br.Msg = "频率不能为空"
  49. return
  50. }
  51. if req.Unit == "" {
  52. br.Msg = "单位不能为空"
  53. return
  54. }
  55. if req.ClassifyId <= 0 {
  56. br.Msg = "请选择分类"
  57. return
  58. }
  59. if len(req.EdbInfoIdArr) <= 0 {
  60. br.Msg = "请选择指标"
  61. return
  62. }
  63. if req.CalculateFormula == "" {
  64. br.Msg = "请填写指标"
  65. return
  66. }
  67. //加入缓存机制,避免创建同一个名称的指标 start
  68. redisKey := fmt.Sprint("predict_edb_info:calculate:batch:save:", utils.DATA_SOURCE_PREDICT_CALCULATE, ":", req.EdbName)
  69. isExist := utils.Rc.IsExist(redisKey)
  70. if isExist {
  71. br.Msg = "指标正在处理,请勿重复提交"
  72. return
  73. } else {
  74. //设置3分钟缓存
  75. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  76. defer func() {
  77. _ = utils.Rc.Delete(redisKey)
  78. }()
  79. }
  80. calculateFormula := req.CalculateFormula
  81. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  82. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  83. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  84. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  85. if strings.Contains(req.CalculateFormula, "%") {
  86. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  87. }
  88. req.CalculateFormula = calculateFormula
  89. //检验公式
  90. var formulaStr string
  91. var edbInfoIdBytes []string
  92. for _, v := range req.EdbInfoIdArr {
  93. formulaStr += v.FromTag + ","
  94. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  95. }
  96. formulaSlice, err := utils.CheckFormulaJson(req.CalculateFormula)
  97. if err != nil {
  98. br.Msg = "公式格式错误,请重新填写"
  99. return
  100. }
  101. for _, formula := range formulaSlice {
  102. formulaMap := utils.CheckFormula(formula)
  103. for _, v := range formulaMap {
  104. if !strings.Contains(formulaStr, v) {
  105. br.Msg = "公式错误,请重新填写"
  106. return
  107. }
  108. }
  109. }
  110. // 判断指标名称是否存在
  111. {
  112. var condition string
  113. var pars []interface{}
  114. // 指标类型,0:普通指标,1:预测指标
  115. condition += " AND edb_info_type=? AND edb_name=? "
  116. pars = append(pars, 1, req.EdbName)
  117. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  118. if err != nil {
  119. br.Msg = "判断指标名称是否存在失败"
  120. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  121. return
  122. }
  123. if count > 0 {
  124. br.Msg = "指标名称已存在,请重新填写"
  125. br.ErrMsg = "指标名称已存在,请重新填写"
  126. return
  127. }
  128. }
  129. // 关联指标信息
  130. edbInfoList := make([]*models.EdbInfo, 0)
  131. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  132. for k, v := range req.EdbInfoIdArr {
  133. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  134. if err != nil {
  135. if err.Error() == utils.ErrNoRow() {
  136. br.Msg = "生成计算指标失败"
  137. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  138. return
  139. }
  140. br.Msg = "生成计算指标失败"
  141. br.Msg = "获取指标失败:Err:" + err.Error()
  142. return
  143. }
  144. edbInfoList = append(edbInfoList, fromEdbInfo)
  145. //关联关系表
  146. {
  147. calculateMappingItem := &models.EdbInfoCalculateMapping{
  148. CreateTime: time.Now(),
  149. ModifyTime: time.Now(),
  150. Sort: k + 1,
  151. //EdbCode: edbCode,
  152. //EdbInfoId: int(edbInfoId),
  153. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  154. FromEdbCode: fromEdbInfo.EdbCode,
  155. FromEdbName: fromEdbInfo.EdbName,
  156. FromSource: fromEdbInfo.Source,
  157. FromSourceName: fromEdbInfo.SourceName,
  158. FromTag: v.FromTag,
  159. Source: utils.DATA_SOURCE_PREDICT_CALCULATE,
  160. SourceName: "预测指标运算",
  161. }
  162. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  163. }
  164. }
  165. for _, v := range formulaSlice {
  166. formulaMap := utils.CheckFormula(v)
  167. //预先计算,判断公式是否正常
  168. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, v, edbInfoIdBytes)
  169. if !ok {
  170. br.Msg = "生成计算指标失败,请使用正确的计算公式"
  171. return
  172. }
  173. }
  174. // 指标入库
  175. randStr := utils.GetRandDigit(4)
  176. edbCode := `C2` + time.Now().Format("060102") + randStr
  177. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  178. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  179. edbInfo := &models.EdbInfo{
  180. EdbInfoType: 1,
  181. Source: utils.DATA_SOURCE_PREDICT_CALCULATE,
  182. SourceName: "预测指标运算",
  183. EdbCode: edbCode,
  184. EdbName: req.EdbName,
  185. EdbNameSource: req.EdbName,
  186. Frequency: req.Frequency,
  187. Unit: req.Unit,
  188. ClassifyId: req.ClassifyId,
  189. SysUserId: req.AdminId,
  190. SysUserRealName: req.AdminName,
  191. CreateTime: time.Now(),
  192. ModifyTime: time.Now(),
  193. UniqueCode: uniqueCode,
  194. CalculateFormula: req.CalculateFormula,
  195. EdbType: 2,
  196. EmptyType: req.EmptyType,
  197. }
  198. edbInfoId, err := models.AddEdbInfo(edbInfo)
  199. if err != nil {
  200. br.Msg = "生成计算指标失败"
  201. br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  202. return
  203. }
  204. edbInfo.EdbInfoId = int(edbInfoId)
  205. //处理同名指标
  206. {
  207. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  208. if err != nil {
  209. br.Msg = "保存失败"
  210. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  211. return
  212. }
  213. if len(edbNameList) >= 2 {
  214. for _, v := range edbNameList {
  215. edbName := v.EdbName + "(" + v.SourceName + ")"
  216. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  217. if err != nil {
  218. br.Msg = "保存失败"
  219. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  220. return
  221. }
  222. }
  223. }
  224. }
  225. //关联关系表入库
  226. {
  227. if len(calculateMappingList) > 0 {
  228. for k, v := range calculateMappingList {
  229. v.EdbCode = edbInfo.EdbCode
  230. v.EdbInfoId = edbInfo.EdbInfoId
  231. calculateMappingList[k] = v
  232. }
  233. go models.AddEdbInfoCalculateMappingMulti(calculateMappingList)
  234. }
  235. }
  236. // 开始添加预测指标
  237. latestDateStr, latestValue, err := models.AddPredictCalculateData(edbInfoList, edbInfo, edbCode, req.CalculateFormula, edbInfoIdBytes)
  238. if err != nil {
  239. br.Msg = "生成计算指标失败"
  240. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  241. return
  242. }
  243. // 更新指标最大最小值
  244. err, errMsg := models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  245. if err != nil {
  246. br.Msg = errMsg
  247. br.ErrMsg = err.Error()
  248. return
  249. }
  250. resp := models.AddEdbInfoResp{
  251. EdbInfoId: int(edbInfoId),
  252. UniqueCode: uniqueCode,
  253. }
  254. br.Ret = 200
  255. br.Success = true
  256. br.Msg = "保存成功"
  257. br.Data = resp
  258. br.IsAddLog = true
  259. }
  260. // editPredictCalculate 编辑预测指标运算
  261. func editPredictCalculate(br *models.BaseResponse, req models.EdbInfoCalculateSaveReq) {
  262. req.EdbName = strings.Trim(req.EdbName, " ")
  263. if req.EdbName == "" {
  264. br.Msg = "指标名称不能为空"
  265. return
  266. }
  267. if req.Frequency == "" {
  268. br.Msg = "频率不能为空"
  269. return
  270. }
  271. if req.Unit == "" {
  272. br.Msg = "单位不能为空"
  273. return
  274. }
  275. if req.ClassifyId <= 0 {
  276. br.Msg = "请选择分类"
  277. return
  278. }
  279. if len(req.EdbInfoIdArr) <= 0 {
  280. br.Msg = "请选择指标"
  281. return
  282. }
  283. if req.CalculateFormula == "" {
  284. br.Msg = "请填写指标"
  285. return
  286. }
  287. //加入缓存机制,避免创建同一个名称的指标 start
  288. redisKey := fmt.Sprint("predict_edb_info:calculate:batch:save:", utils.DATA_SOURCE_PREDICT_CALCULATE, ":", 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. calculateFormula := req.CalculateFormula
  301. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  302. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  303. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  304. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  305. if strings.Contains(req.CalculateFormula, "%") {
  306. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  307. }
  308. req.CalculateFormula = calculateFormula
  309. //检验公式
  310. var formulaStr string
  311. var edbInfoIdBytes []string
  312. for _, v := range req.EdbInfoIdArr {
  313. formulaStr += v.FromTag + ","
  314. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  315. }
  316. formulaSlice, err := utils.CheckFormulaJson(req.CalculateFormula)
  317. if err != nil {
  318. br.Msg = "公式格式错误,请重新填写"
  319. return
  320. }
  321. for _, formula := range formulaSlice {
  322. formulaMap := utils.CheckFormula(formula)
  323. for _, v := range formulaMap {
  324. if !strings.Contains(formulaStr, v) {
  325. br.Msg = "公式错误,请重新填写"
  326. return
  327. }
  328. }
  329. }
  330. // 获取计算指标信息
  331. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  332. if err != nil {
  333. br.Msg = "获取指标信息失败"
  334. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  335. return
  336. }
  337. // 判断指标名称是否存在
  338. {
  339. var condition string
  340. var pars []interface{}
  341. // 指标类型,0:普通指标,1:预测指标
  342. condition += " AND edb_info_id !=? AND edb_info_type=? AND edb_name=? "
  343. pars = append(pars, edbInfo.EdbInfoId, edbInfo.EdbInfoType, req.EdbName)
  344. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  345. if err != nil {
  346. br.Msg = "判断指标名称是否存在失败"
  347. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  348. return
  349. }
  350. if count > 0 {
  351. br.Msg = "指标名称已存在,请重新填写"
  352. br.ErrMsg = "指标名称已存在,请重新填写"
  353. return
  354. }
  355. }
  356. // 关联指标信息
  357. edbInfoList := make([]*models.EdbInfo, 0)
  358. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  359. for k, v := range req.EdbInfoIdArr {
  360. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  361. if err != nil {
  362. if err.Error() == utils.ErrNoRow() {
  363. br.Msg = "生成计算指标失败"
  364. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  365. return
  366. }
  367. br.Msg = "生成计算指标失败"
  368. br.Msg = "获取指标失败:Err:" + err.Error()
  369. return
  370. }
  371. edbInfoList = append(edbInfoList, fromEdbInfo)
  372. //关联关系表
  373. {
  374. calculateMappingItem := &models.EdbInfoCalculateMapping{
  375. CreateTime: time.Now(),
  376. ModifyTime: time.Now(),
  377. Sort: k + 1,
  378. EdbCode: edbInfo.EdbCode,
  379. EdbInfoId: edbInfo.EdbInfoId,
  380. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  381. FromEdbCode: fromEdbInfo.EdbCode,
  382. FromEdbName: fromEdbInfo.EdbName,
  383. FromSource: fromEdbInfo.Source,
  384. FromSourceName: fromEdbInfo.SourceName,
  385. FromTag: v.FromTag,
  386. Source: utils.DATA_SOURCE_PREDICT_CALCULATE,
  387. SourceName: "预测指标运算",
  388. }
  389. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  390. }
  391. }
  392. for _, v := range formulaSlice {
  393. formulaMap := utils.CheckFormula(v)
  394. //预先计算,判断公式是否正常
  395. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, v, edbInfoIdBytes)
  396. if !ok {
  397. br.Msg = "生成计算指标失败,请使用正确的计算公式"
  398. return
  399. }
  400. }
  401. //处理同名指标
  402. {
  403. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  404. if err != nil {
  405. br.Msg = "保存失败"
  406. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  407. return
  408. }
  409. if len(edbNameList) >= 2 {
  410. for _, v := range edbNameList {
  411. edbName := v.EdbName + "(" + v.SourceName + ")"
  412. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  413. if err != nil {
  414. br.Msg = "保存失败"
  415. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  416. return
  417. }
  418. }
  419. }
  420. }
  421. edbInfo.EdbName = req.EdbName
  422. edbInfo.Frequency = req.Frequency
  423. edbInfo.Unit = req.Unit
  424. edbInfo.ClassifyId = req.ClassifyId
  425. edbInfo.CalculateFormula = req.CalculateFormula
  426. err = models.EditPredictCalculate(edbInfo, calculateMappingList)
  427. if err != nil {
  428. br.Msg = "修改计算指标失败"
  429. br.Msg = "修改计算指标失败,Calculate Err:" + err.Error()
  430. return
  431. }
  432. // 开始添加预测指标
  433. latestDateStr, latestValue, err := models.AddPredictCalculateData(edbInfoList, edbInfo, edbInfo.EdbCode, req.CalculateFormula, edbInfoIdBytes)
  434. if err != nil {
  435. br.Msg = "生成计算指标失败"
  436. br.Msg = "生成计算指标失败,Calculate Err:" + err.Error()
  437. return
  438. }
  439. // 更新指标最大最小值
  440. err, errMsg := models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  441. if err != nil {
  442. br.Msg = errMsg
  443. br.ErrMsg = err.Error()
  444. return
  445. }
  446. resp := models.AddEdbInfoResp{
  447. EdbInfoId: edbInfo.EdbInfoId,
  448. UniqueCode: edbInfo.UniqueCode,
  449. }
  450. br.Ret = 200
  451. br.Success = true
  452. br.Msg = "保存成功"
  453. br.Data = resp
  454. br.IsAddLog = true
  455. }
  456. // CalculateBatchSave
  457. // @Title 累计值转月-同比值-同差等计算新增
  458. // @Description 累计值转月-同比值-同差等计算新增接口
  459. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  460. // @Success Ret=200 返回指标id
  461. // @router /batch/save [post]
  462. func (this *PredictCalculateController) CalculateBatchSave() {
  463. br := new(models.BaseResponse).Init()
  464. defer func() {
  465. this.Data["json"] = br
  466. this.ServeJSON()
  467. }()
  468. var req models.EdbInfoCalculateBatchSaveReq
  469. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  470. if err != nil {
  471. br.Msg = "参数解析异常!"
  472. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  473. return
  474. }
  475. req.EdbName = strings.Trim(req.EdbName, " ")
  476. if req.EdbName == "" {
  477. br.Msg = "指标名称不能为空"
  478. return
  479. }
  480. if req.Frequency == "" {
  481. br.Msg = "频率不能为空"
  482. return
  483. }
  484. if req.Unit == "" {
  485. br.Msg = "单位不能为空"
  486. return
  487. }
  488. if req.ClassifyId <= 0 {
  489. br.Msg = "请选择分类"
  490. return
  491. }
  492. // 基础指标id
  493. fromEdbInfoId := req.FromEdbInfoId
  494. notNeedFromEdbSourceList := []int{utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS, utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC} // 不需要传入来源指标id的 指标类型
  495. if fromEdbInfoId <= 0 && !utils.InArrayByInt(notNeedFromEdbSourceList, req.Source) {
  496. br.Msg = "请选择指标"
  497. return
  498. }
  499. //加入缓存机制,避免创建同一个名称的指标 start
  500. redisKey := fmt.Sprint("edb_lib:predict_calculate:batch:save:", req.Source, ":", req.EdbName)
  501. isExist := utils.Rc.IsExist(redisKey)
  502. if isExist {
  503. br.Msg = "指标正在处理,请勿重复提交"
  504. return
  505. } else {
  506. //设置3分钟缓存
  507. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  508. defer func() {
  509. _ = utils.Rc.Delete(redisKey)
  510. }()
  511. }
  512. //加入缓存机制,避免创建同一个名称的指标 end
  513. var condition string
  514. var pars []interface{}
  515. condition += " AND edb_name=? "
  516. pars = append(pars, req.EdbName)
  517. if req.EdbInfoId > 0 {
  518. condition += " AND edb_info_id !=? "
  519. pars = append(pars, req.EdbInfoId)
  520. }
  521. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  522. if err != nil {
  523. br.Msg = "判断指标名称是否存在失败"
  524. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  525. return
  526. }
  527. if count > 0 {
  528. br.Msg = "指标名称已存在,请重新填写"
  529. br.ErrMsg = "指标名称已存在,请重新填写"
  530. return
  531. }
  532. //生成指标编码
  533. randStr := utils.GetRandDigit(4)
  534. edbCode := `C` + time.Now().Format("060102") + randStr
  535. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  536. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  537. adminId := req.AdminId
  538. adminName := req.AdminName
  539. var sourName string
  540. var errMsg string
  541. var edbInfo *models.EdbInfo
  542. var latestDateStr string // 最近实际数据的日期
  543. var latestValue float64 // 最近实际数据的值
  544. var formulaInt int
  545. var nhccDate models.NhccDate // 拟合残差的日期
  546. switch req.Source {
  547. case utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ, utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ, utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX:
  548. if req.Formula == "" {
  549. br.Msg = "请填写N值"
  550. return
  551. }
  552. formulaInt, _ = strconv.Atoi(req.Formula)
  553. if formulaInt <= 0 {
  554. br.Msg = "N值输入错误,请重新输入"
  555. return
  556. }
  557. /*case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ:
  558. //直接拼接指标
  559. //校验时间格式
  560. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  561. if err != nil {
  562. br.Msg = "拼接日期有误,请重新输入"
  563. return
  564. }*/
  565. case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //拟合残差指标
  566. //指标校验
  567. if len(req.EdbInfoIdArr) != 2 {
  568. br.Msg = "选择的指标异常,请重新选择"
  569. return
  570. }
  571. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  572. //校验时间格式
  573. //数据格式:2022-11-01,2022-11-10
  574. timeList := strings.Split(req.Formula, ",")
  575. if len(timeList) != 2 {
  576. br.Msg = "选择时间有误,请重新输入"
  577. return
  578. }
  579. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  580. if err != nil {
  581. br.Msg = "开始日期有误,请重新输入"
  582. return
  583. }
  584. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  585. if err != nil {
  586. br.Msg = "结束日期有误,请重新输入"
  587. return
  588. }
  589. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  590. br.Msg = "日期间隔不得少于两天"
  591. return
  592. }
  593. nhccDate.StartDate = startDate
  594. nhccDate.EndDate = endDate
  595. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  596. if req.Formula == "" {
  597. br.Msg = "请填写alpha值"
  598. return
  599. }
  600. a, e := strconv.ParseFloat(req.Formula, 64)
  601. if e != nil {
  602. br.Msg = "alpha值输入错误, 请重新输入"
  603. return
  604. }
  605. if a <= 0 || a >= 1 {
  606. br.Msg = "alpha值输入错误, 请重新输入"
  607. return
  608. }
  609. }
  610. if err != nil {
  611. br.Msg = "获取指标信息失败"
  612. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  613. return
  614. }
  615. // 来源预测指标信息
  616. var fromEdbInfo *models.EdbInfo
  617. if fromEdbInfoId > 0 {
  618. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  619. if err != nil {
  620. br.Msg = "获取指标信息失败"
  621. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  622. return
  623. }
  624. if fromEdbInfo.EdbInfoType != 1 {
  625. br.Msg = "来源指标不是预测指标"
  626. br.ErrMsg = "来源指标不是预测指标"
  627. return
  628. }
  629. }
  630. var baseEdbInfoModel models.BasePredictEdbInfoInterface
  631. saveParams := models.BatchSaveCalculateBatchParams{
  632. Req: req,
  633. FromEdbInfo: fromEdbInfo,
  634. EdbCode: edbCode,
  635. UniqueCode: uniqueCode,
  636. SysUserId: req.AdminId,
  637. SysUserRealName: req.AdminName,
  638. }
  639. if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ {
  640. if req.EdbInfoId <= 0 {
  641. if req.Frequency != fromEdbInfo.Frequency {
  642. br.Msg = "当前频度和原指标频度不一致"
  643. return
  644. }
  645. if req.Unit != "无" {
  646. br.Msg = "单位只允许为无,禁止选择其他单位"
  647. return
  648. }
  649. }
  650. }
  651. if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ {
  652. if req.EdbInfoId <= 0 {
  653. if req.Frequency != fromEdbInfo.Frequency {
  654. br.Msg = "当前频度和原指标频度不一致"
  655. return
  656. }
  657. if req.Unit != fromEdbInfo.Unit {
  658. br.Msg = "当前单位和原指标单位不一致"
  659. return
  660. }
  661. }
  662. sourName = "预测同差"
  663. edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateTcz(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  664. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS {
  665. sourName = "预测N数值移动平均计算"
  666. edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateNszydpjjs(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  667. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_BP {
  668. sourName = "预测变频"
  669. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  670. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ {
  671. checkDataList, tmpErr := models.GetPredictEdbDataListAllByStartDate(fromEdbInfo, 0, "")
  672. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  673. br.Msg = "判断环比值是否可计算失败"
  674. br.ErrMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  675. return
  676. }
  677. for _, v := range checkDataList {
  678. if v.Value <= 0 {
  679. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  680. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  681. return
  682. }
  683. }
  684. sourName = "预测环比值"
  685. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  686. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ {
  687. sourName = "预测环差值"
  688. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  689. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY {
  690. sourName = "预测累计值转月值"
  691. if fromEdbInfo.Frequency != "月度" {
  692. br.Msg = "请选择月度指标"
  693. return
  694. }
  695. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  696. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT {
  697. sourName = "预测时间移位"
  698. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  699. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX {
  700. sourName = "预测超季节性"
  701. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt)
  702. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC {
  703. sourName = "预测拟合残差"
  704. secondEdbInfoReq := req.EdbInfoIdArr[1]
  705. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  706. if tmpErr != nil {
  707. br.Msg = "获取因变量的指标信息失败"
  708. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  709. return
  710. }
  711. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  712. br.Msg = "两个指标不允许为同一个"
  713. br.ErrMsg = "两个指标不允许为同一个"
  714. return
  715. }
  716. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateNhcc(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, nhccDate, adminId, adminName)
  717. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_JP {
  718. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_JP
  719. edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateJp(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  720. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NH {
  721. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_NH
  722. edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateNh(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
  723. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS {
  724. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_KSZS
  725. edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateKszs(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, req.EdbInfoIdArr, edbCode, uniqueCode, adminId, adminName)
  726. } else {
  727. // 获取通用的数据源处理服务
  728. baseEdbInfoModel = models.GetBasePredictEdbInfoModel(req.Source)
  729. // 没有找到的话,那么就直接返回报错吧
  730. if baseEdbInfoModel == nil {
  731. br.Msg = "无效计算方式"
  732. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  733. return
  734. }
  735. sourName = baseEdbInfoModel.GetSourceName()
  736. if req.EdbInfoId <= 0 {
  737. edbInfo, latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Add(saveParams)
  738. } else {
  739. edbInfo, err = models.GetEdbInfoById(req.EdbInfoId)
  740. if err != nil {
  741. if err.Error() == utils.ErrNoRow() {
  742. br.Msg = "指标已被删除,请刷新页面"
  743. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  744. return
  745. }
  746. br.Msg = "获取指标信息失败"
  747. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  748. return
  749. }
  750. saveParams.EdbInfo = edbInfo
  751. latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Edit(saveParams)
  752. }
  753. }
  754. if err != nil {
  755. br.Msg = "生成" + sourName + "失败"
  756. if errMsg != `` {
  757. br.Msg = errMsg
  758. }
  759. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  760. return
  761. }
  762. if edbInfo == nil {
  763. br.Msg = "生成" + sourName + "失败"
  764. br.ErrMsg = "生成" + sourName + "失败,edbInfo is nil"
  765. return
  766. }
  767. //处理同名指标
  768. {
  769. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  770. if err != nil {
  771. br.Msg = "保存失败"
  772. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  773. return
  774. }
  775. if len(edbNameList) >= 2 {
  776. for _, v := range edbNameList {
  777. edbName := v.EdbName + "(" + v.SourceName + ")"
  778. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  779. if err != nil {
  780. br.Msg = "保存失败"
  781. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  782. return
  783. }
  784. }
  785. }
  786. }
  787. // 更新指标最大最小值
  788. err, errMsg = models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  789. if err != nil {
  790. br.Msg = errMsg
  791. br.ErrMsg = err.Error()
  792. return
  793. }
  794. resp := models.AddEdbInfoResp{
  795. EdbInfoId: edbInfo.EdbInfoId,
  796. UniqueCode: uniqueCode,
  797. }
  798. br.Ret = 200
  799. br.Success = true
  800. br.Msg = "保存成功"
  801. br.Data = resp
  802. br.IsAddLog = true
  803. }
  804. // Refresh
  805. // @Title 刷新计算指标接口
  806. // @Description 刷新计算指标接口
  807. // @Success 200 {object} models.RefreshEdbInfoReq
  808. // @router /refresh [post]
  809. func (this *PredictCalculateController) Refresh() {
  810. br := new(models.BaseResponse).Init()
  811. var cacheKey string
  812. defer func() {
  813. this.Data["json"] = br
  814. this.ServeJSON()
  815. }()
  816. var req models.RefreshEdbInfoReq
  817. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  818. if err != nil {
  819. br.Msg = "参数解析异常!"
  820. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  821. return
  822. }
  823. if req.EdbCode == "" {
  824. br.Msg = "请输入指标编码!"
  825. br.ErrMsg = "请输入指标编码,指标编码为空"
  826. return
  827. }
  828. if req.EdbInfoId <= 0 {
  829. br.Msg = "请输入指标ID!"
  830. br.ErrMsg = "请输入指标ID"
  831. return
  832. }
  833. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  834. if err != nil {
  835. br.Msg = "指标不存在!"
  836. br.ErrMsg = "指标不存在"
  837. return
  838. }
  839. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  840. if utils.Rc.IsExist(cacheKey) {
  841. br.Ret = 501
  842. br.Success = true
  843. br.Msg = "系统处理中,请稍后重试"
  844. br.IsSendEmail = false
  845. return
  846. }
  847. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  848. defer func() {
  849. _ = utils.Rc.Delete(cacheKey)
  850. }()
  851. startDate := req.StartDate
  852. var errMsg string
  853. endDate := time.Now().Format(utils.FormatDate)
  854. edbInfoId := edbInfo.EdbInfoId
  855. source := edbInfo.Source
  856. var latestDateStr string // 最近实际数据的日期
  857. var latestValue float64 // 最近实际数据的值
  858. var baseEdbInfoModel models.BasePredictEdbInfoInterface
  859. refreshParams := models.RefreshParams{
  860. EdbInfo: edbInfo,
  861. }
  862. switch source {
  863. case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ: //刷新同比值
  864. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  865. if err != nil {
  866. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  867. break
  868. }
  869. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  870. if err != nil {
  871. errMsg = "GetEdbInfoById Err:" + err.Error()
  872. break
  873. }
  874. refreshParams.FromEdbInfo = fromEdbInfo
  875. refreshParams.StartDate = edbInfo.StartDate
  876. }
  877. switch source {
  878. case utils.DATA_SOURCE_PREDICT_CALCULATE:
  879. //startDate = edbInfo.StartDate
  880. //sTime, err := time.ParseInLocation(utils.FormatDate, edbInfo.EndDate, time.Local)
  881. //if err != nil {
  882. // return
  883. //}
  884. //startDate = sTime.Format(utils.FormatDate)
  885. startDate = ""
  886. var edbInfoIdBytes []string
  887. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  888. if err != nil {
  889. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  890. break
  891. }
  892. var formulaStr string
  893. edbInfoList := make([]*models.EdbInfo, 0)
  894. for _, v := range calculateMap {
  895. formulaStr += v.FromTag + ","
  896. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  897. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  898. edbInfoList = append(edbInfoList, edbInfo)
  899. }
  900. latestDateStr, latestValue, err = models.RefreshAllPredictCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, edbInfoIdBytes, edbInfo.EmptyType, edbInfo.MaxEmptyType)
  901. if err != nil && err.Error() != utils.ErrNoRow() {
  902. errMsg = "RefreshCalculate Err:" + err.Error()
  903. break
  904. }
  905. case utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ: //同差值
  906. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  907. if err != nil {
  908. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  909. break
  910. }
  911. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  912. if err != nil {
  913. errMsg = "GetEdbInfoById Err:" + err.Error()
  914. break
  915. }
  916. startDate = edbInfo.StartDate
  917. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate)
  918. if err != nil && err.Error() != utils.ErrNoRow() {
  919. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  920. break
  921. }
  922. case utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  923. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  924. if err != nil {
  925. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  926. break
  927. }
  928. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  929. if err != nil {
  930. errMsg = "GetEdbInfoById Err:" + err.Error()
  931. break
  932. }
  933. var formulaInt int
  934. formulaInt, _ = strconv.Atoi(calculateInfo.CalculateFormula)
  935. if formulaInt <= 0 {
  936. errMsg = "N值输入错误,请重新输入"
  937. break
  938. }
  939. startDate = edbInfo.StartDate
  940. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNszydpjjs(edbInfoId, source, formulaInt, fromEdbInfo, calculateInfo.EdbCode, startDate)
  941. if err != nil && err.Error() != utils.ErrNoRow() {
  942. errMsg = "RefreshAllPredictCalculateNszydpjjs Err:" + err.Error()
  943. break
  944. }
  945. case utils.DATA_SOURCE_PREDICT_CALCULATE_BP: //刷新变频
  946. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  947. if err != nil {
  948. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  949. break
  950. }
  951. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  952. if err != nil {
  953. errMsg = "GetEdbInfoById Err:" + err.Error()
  954. break
  955. }
  956. endDate = time.Now().Format(utils.FormatDate)
  957. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  958. if err != nil && err.Error() != utils.ErrNoRow() {
  959. errMsg = "RefreshAllPredictCalculateBp Err:" + err.Error()
  960. break
  961. }
  962. case utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ: //刷新环比值
  963. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  964. if err != nil {
  965. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  966. break
  967. }
  968. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  969. if err != nil {
  970. errMsg = "GetEdbInfoById Err:" + err.Error()
  971. break
  972. }
  973. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  974. endDate = time.Now().Format(utils.FormatDate)
  975. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  976. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  977. if err != nil && err.Error() != utils.ErrNoRow() {
  978. errMsg = "RefreshAllPredictCalculateHbz Err:" + err.Error()
  979. break
  980. }
  981. case utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ: //刷新环差值
  982. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  983. if err != nil {
  984. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  985. break
  986. }
  987. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  988. if err != nil {
  989. errMsg = "GetEdbInfoById Err:" + err.Error()
  990. break
  991. }
  992. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  993. endDate = time.Now().Format(utils.FormatDate)
  994. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  995. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  996. if err != nil && err.Error() != utils.ErrNoRow() {
  997. errMsg = "RefreshAllPredictCalculateHcz Err:" + err.Error()
  998. break
  999. }
  1000. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY: //刷新累计值转月值
  1001. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1002. if err != nil {
  1003. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  1004. break
  1005. }
  1006. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  1007. if err != nil {
  1008. errMsg = "GetEdbInfoById Err:" + err.Error()
  1009. break
  1010. }
  1011. endDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1012. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1013. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  1014. if err != nil && err.Error() != utils.ErrNoRow() {
  1015. errMsg = "RefreshAllPredictCalculateLjzzy Err:" + err.Error()
  1016. break
  1017. }
  1018. case utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
  1019. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1020. if err != nil {
  1021. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1022. break
  1023. }
  1024. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  1025. if err != nil {
  1026. errMsg = "GetEdbInfoById Err:" + err.Error()
  1027. break
  1028. }
  1029. //startDate = edbInfo.StartDate
  1030. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1031. endDate = time.Now().Format(utils.FormatDate)
  1032. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  1033. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  1034. if err != nil && err.Error() != utils.ErrNoRow() {
  1035. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  1036. }
  1037. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  1038. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateLjztbpj(edbInfo)
  1039. if err != nil && err.Error() != utils.ErrNoRow() {
  1040. errMsg = "RefreshAllPredictCalculateLjztbpj Err:" + err.Error()
  1041. break
  1042. }
  1043. case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ: //刷新直接拼接
  1044. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateZjpj(edbInfo)
  1045. if err != nil && err.Error() != utils.ErrNoRow() {
  1046. errMsg = "RefreshAllPredictCalculateZjpj Err:" + err.Error()
  1047. break
  1048. }
  1049. case utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX: //超季节性
  1050. calculateCjjx, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1051. if err != nil {
  1052. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1053. break
  1054. }
  1055. fromEdbInfo, err := models.GetEdbInfoById(calculateCjjx.FromEdbInfoId)
  1056. if err != nil {
  1057. errMsg = "GetEdbInfoById Err:" + err.Error()
  1058. break
  1059. }
  1060. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1061. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1062. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateCjjx(edbInfoId, edbInfo.Source, fromEdbInfo, calculateCjjx.EdbCode, startDate, "", edbInfo.Calendar, formulaInt)
  1063. if err != nil && err.Error() != utils.ErrNoRow() {
  1064. errMsg = "RefreshAllPredictCalculateCjjx Err:" + err.Error()
  1065. break
  1066. }
  1067. case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //nhcc
  1068. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNhcc(edbInfo)
  1069. if err != nil && err.Error() != utils.ErrNoRow() {
  1070. errMsg = "RefreshAllPredictCalculateNhcc Err:" + err.Error()
  1071. break
  1072. }
  1073. case utils.DATA_SOURCE_PREDICT_CALCULATE_JP: //降频
  1074. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1075. if err != nil {
  1076. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1077. break
  1078. }
  1079. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  1080. if err != nil {
  1081. errMsg = "GetEdbInfoById Err:" + err.Error()
  1082. break
  1083. }
  1084. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateJp(edbInfoId, source, fromEdbInfo, calculateInfo.EdbCode, edbInfo.Frequency, edbInfo.CalculateFormula)
  1085. if err != nil && err.Error() != utils.ErrNoRow() {
  1086. errMsg = "RefreshAllPredictCalculateJp Err:" + err.Error()
  1087. break
  1088. }
  1089. case utils.DATA_SOURCE_PREDICT_CALCULATE_NH: //年化
  1090. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1091. if err != nil {
  1092. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1093. break
  1094. }
  1095. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  1096. if err != nil {
  1097. errMsg = "GetEdbInfoById Err:" + err.Error()
  1098. break
  1099. }
  1100. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNh(edbInfoId, source, fromEdbInfo, calculateInfo.EdbCode, edbInfo.Frequency, edbInfo.CalculateFormula)
  1101. if err != nil && err.Error() != utils.ErrNoRow() {
  1102. errMsg = "RefreshAllPredictCalculateNh Err:" + err.Error()
  1103. break
  1104. }
  1105. case utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS: //扩散指数
  1106. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateKszs(edbInfo)
  1107. if err != nil && err.Error() != utils.ErrNoRow() {
  1108. errMsg = "RefreshAllPredictCalculateKszs Err:" + err.Error()
  1109. break
  1110. }
  1111. default:
  1112. // 获取通用的数据源处理服务
  1113. baseEdbInfoModel = models.GetBasePredictEdbInfoModel(source)
  1114. // 没有找到的话,那么就直接返回报错吧
  1115. if baseEdbInfoModel == nil {
  1116. br.Msg = "来源异常,请联系相关开发!"
  1117. br.ErrMsg = "来源异常,请联系相关开发"
  1118. return
  1119. }
  1120. latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Refresh(refreshParams)
  1121. }
  1122. if errMsg != `` {
  1123. br.Msg = "刷新指标失败!"
  1124. br.ErrMsg = "刷新指标失败,err:" + errMsg
  1125. return
  1126. }
  1127. // 更新指标最大最小值
  1128. err, errMsg = models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  1129. if err != nil {
  1130. br.Msg = errMsg
  1131. br.ErrMsg = err.Error()
  1132. return
  1133. }
  1134. // 更新ES
  1135. go logic.UpdateEs(edbInfo.EdbInfoId)
  1136. br.Ret = 200
  1137. br.Success = true
  1138. br.Msg = "获取成功"
  1139. }
  1140. // CalculateComputeCorrelation
  1141. // @Title 拟合残差计算相关性接口
  1142. // @Description 拟合残差计算相关性接口
  1143. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  1144. // @Success Ret=200 返回指标id
  1145. // @router /compute_correlation [post]
  1146. func (this *PredictCalculateController) CalculateComputeCorrelation() {
  1147. br := new(models.BaseResponse).Init()
  1148. defer func() {
  1149. this.Data["json"] = br
  1150. this.ServeJSON()
  1151. }()
  1152. var req models.EdbInfoCalculateBatchSaveReq
  1153. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1154. if err != nil {
  1155. br.Msg = "参数解析异常!"
  1156. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1157. return
  1158. }
  1159. if len(req.EdbInfoIdArr) != 2 {
  1160. br.Msg = "选择的指标异常,请重新选择"
  1161. return
  1162. }
  1163. //校验时间格式
  1164. //数据格式:2022-11-01,2022-11-10
  1165. timeList := strings.Split(req.Formula, ",")
  1166. if len(timeList) != 2 {
  1167. br.Msg = "选择时间有误,请重新输入"
  1168. return
  1169. }
  1170. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  1171. if err != nil {
  1172. br.Msg = "开始日期有误,请重新输入"
  1173. return
  1174. }
  1175. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  1176. if err != nil {
  1177. br.Msg = "结束日期有误,请重新输入"
  1178. return
  1179. }
  1180. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  1181. br.Msg = "日期间隔不得少于两天"
  1182. return
  1183. }
  1184. var nhccDate models.NhccDate // 拟合残差的日期
  1185. nhccDate.StartDate = startDate
  1186. nhccDate.EndDate = endDate
  1187. // 来源预测指标信息
  1188. fromEdbInfoId := req.EdbInfoIdArr[0].EdbInfoId
  1189. if fromEdbInfoId <= 0 {
  1190. br.Msg = "请选择指标"
  1191. return
  1192. }
  1193. // 来源指标(自变量指标)
  1194. fromEdbInfo, err := models.GetEdbInfoById(fromEdbInfoId)
  1195. if err != nil {
  1196. br.Msg = "获取指标信息失败"
  1197. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  1198. return
  1199. }
  1200. if fromEdbInfo.EdbInfoType != 1 {
  1201. br.Msg = "来源指标不是预测指标"
  1202. br.ErrMsg = "来源指标不是预测指标"
  1203. return
  1204. }
  1205. // 因变量指标
  1206. secondEdbInfoReq := req.EdbInfoIdArr[1]
  1207. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1208. if tmpErr != nil {
  1209. br.Msg = "获取因变量的指标信息失败"
  1210. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  1211. return
  1212. }
  1213. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  1214. br.Msg = "两个指标不允许为同一个"
  1215. br.ErrMsg = "两个指标不允许为同一个"
  1216. return
  1217. }
  1218. rVal, err := models.CalculatePredictComputeCorrelation(&req, fromEdbInfo, secondEdbInfo, nhccDate)
  1219. if err != nil {
  1220. br.Msg = "计算失败"
  1221. br.ErrMsg = "计算失败,ERR:" + err.Error()
  1222. return
  1223. }
  1224. br.Ret = 200
  1225. br.Success = true
  1226. br.Msg = "计算成功"
  1227. br.Data = rVal
  1228. br.IsAddLog = true
  1229. }