base_from_predict_calculate.go 43 KB

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