base_from_predict_calculate.go 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328
  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. randStr := utils.GetRandDigit(4)
  546. edbCode := `C` + time.Now().Format("060102") + randStr
  547. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  548. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  549. adminId := req.AdminId
  550. adminName := req.AdminName
  551. var sourName string
  552. var errMsg string
  553. var edbInfo *models.EdbInfo
  554. var latestDateStr string // 最近实际数据的日期
  555. var latestValue float64 // 最近实际数据的值
  556. var formulaInt int
  557. var nhccDate models.NhccDate // 拟合残差的日期
  558. switch req.Source {
  559. 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:
  560. if req.Formula == "" {
  561. br.Msg = "请填写N值"
  562. return
  563. }
  564. formulaInt, _ = strconv.Atoi(req.Formula)
  565. if formulaInt <= 0 {
  566. br.Msg = "N值输入错误,请重新输入"
  567. return
  568. }
  569. /*case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ:
  570. //直接拼接指标
  571. //校验时间格式
  572. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  573. if err != nil {
  574. br.Msg = "拼接日期有误,请重新输入"
  575. return
  576. }*/
  577. case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //拟合残差指标
  578. //指标校验
  579. if len(req.EdbInfoIdArr) != 2 {
  580. br.Msg = "选择的指标异常,请重新选择"
  581. return
  582. }
  583. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  584. //校验时间格式
  585. //数据格式:2022-11-01,2022-11-10
  586. timeList := strings.Split(req.Formula, ",")
  587. if len(timeList) != 2 {
  588. br.Msg = "选择时间有误,请重新输入"
  589. return
  590. }
  591. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  592. if err != nil {
  593. br.Msg = "开始日期有误,请重新输入"
  594. return
  595. }
  596. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  597. if err != nil {
  598. br.Msg = "结束日期有误,请重新输入"
  599. return
  600. }
  601. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  602. br.Msg = "日期间隔不得少于两天"
  603. return
  604. }
  605. nhccDate.StartDate = startDate
  606. nhccDate.EndDate = endDate
  607. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  608. if req.Formula == "" {
  609. br.Msg = "请填写alpha值"
  610. return
  611. }
  612. a, e := strconv.ParseFloat(req.Formula, 64)
  613. if e != nil {
  614. br.Msg = "alpha值输入错误, 请重新输入"
  615. return
  616. }
  617. if a <= 0 || a >= 1 {
  618. br.Msg = "alpha值输入错误, 请重新输入"
  619. return
  620. }
  621. }
  622. if err != nil {
  623. br.Msg = "获取指标信息失败"
  624. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  625. return
  626. }
  627. // 来源预测指标信息
  628. var fromEdbInfo *models.EdbInfo
  629. if fromEdbInfoId > 0 {
  630. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  631. if err != nil {
  632. br.Msg = "获取指标信息失败"
  633. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  634. return
  635. }
  636. if fromEdbInfo.EdbInfoType != 1 {
  637. br.Msg = "来源指标不是预测指标"
  638. br.ErrMsg = "来源指标不是预测指标"
  639. return
  640. }
  641. }
  642. var baseEdbInfoModel models.BasePredictEdbInfoInterface
  643. saveParams := models.BatchSaveCalculateBatchParams{
  644. Req: req,
  645. FromEdbInfo: fromEdbInfo,
  646. EdbCode: edbCode,
  647. UniqueCode: uniqueCode,
  648. SysUserId: req.AdminId,
  649. SysUserRealName: req.AdminName,
  650. Lang: this.Lang,
  651. }
  652. if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ {
  653. if req.EdbInfoId <= 0 {
  654. if req.Frequency != fromEdbInfo.Frequency {
  655. br.Msg = "当前频度和原指标频度不一致"
  656. return
  657. }
  658. if req.Unit != "无" {
  659. br.Msg = "单位只允许为无,禁止选择其他单位"
  660. return
  661. }
  662. }
  663. }
  664. if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ {
  665. if req.EdbInfoId <= 0 {
  666. if req.Frequency != fromEdbInfo.Frequency {
  667. br.Msg = "当前频度和原指标频度不一致"
  668. return
  669. }
  670. if req.Unit != fromEdbInfo.Unit {
  671. br.Msg = "当前单位和原指标单位不一致"
  672. return
  673. }
  674. }
  675. sourName = "预测同差"
  676. 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)
  677. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS {
  678. sourName = "预测N数值移动平均计算"
  679. 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)
  680. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_BP {
  681. sourName = "预测变频"
  682. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, this.Lang)
  683. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ {
  684. checkDataList, tmpErr := models.GetPredictEdbDataListAllByStartDate(fromEdbInfo, 0, "")
  685. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  686. br.Msg = "判断环比值是否可计算失败"
  687. br.ErrMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  688. return
  689. }
  690. for _, v := range checkDataList {
  691. if v.Value <= 0 {
  692. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  693. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  694. return
  695. }
  696. }
  697. sourName = "预测环比值"
  698. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt, this.Lang)
  699. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ {
  700. sourName = "预测环差值"
  701. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt, this.Lang)
  702. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY {
  703. sourName = "预测累计值转月值"
  704. if fromEdbInfo.Frequency != "月度" {
  705. br.Msg = "请选择月度指标"
  706. return
  707. }
  708. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, this.Lang)
  709. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT {
  710. sourName = "预测时间移位"
  711. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, this.Lang)
  712. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX {
  713. sourName = "预测超季节性"
  714. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, adminId, adminName, formulaInt, this.Lang)
  715. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC {
  716. sourName = "预测拟合残差"
  717. secondEdbInfoReq := req.EdbInfoIdArr[1]
  718. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  719. if tmpErr != nil {
  720. br.Msg = "获取因变量的指标信息失败"
  721. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  722. return
  723. }
  724. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  725. br.Msg = "两个指标不允许为同一个"
  726. br.ErrMsg = "两个指标不允许为同一个"
  727. return
  728. }
  729. edbInfo, latestDateStr, latestValue, err = models.SavePredictCalculateNhcc(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, nhccDate, adminId, adminName, this.Lang)
  730. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_JP {
  731. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_JP
  732. 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)
  733. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_NH {
  734. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_NH
  735. 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)
  736. } else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS {
  737. sourName = utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_KSZS
  738. 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)
  739. } else {
  740. // 获取通用的数据源处理服务
  741. baseEdbInfoModel = models.GetBasePredictEdbInfoModel(req.Source)
  742. // 没有找到的话,那么就直接返回报错吧
  743. if baseEdbInfoModel == nil {
  744. br.Msg = "无效计算方式"
  745. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  746. return
  747. }
  748. sourName = baseEdbInfoModel.GetSourceName()
  749. if req.EdbInfoId <= 0 {
  750. edbInfo, latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Add(saveParams)
  751. } else {
  752. edbInfo, err = models.GetEdbInfoById(req.EdbInfoId)
  753. if err != nil {
  754. if err.Error() == utils.ErrNoRow() {
  755. br.Msg = "指标已被删除,请刷新页面"
  756. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  757. return
  758. }
  759. br.Msg = "获取指标信息失败"
  760. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  761. return
  762. }
  763. saveParams.EdbInfo = edbInfo
  764. latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Edit(saveParams)
  765. }
  766. }
  767. if err != nil {
  768. br.Msg = "生成" + sourName + "失败"
  769. if errMsg != `` {
  770. br.Msg = errMsg
  771. }
  772. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  773. return
  774. }
  775. if edbInfo == nil {
  776. br.Msg = "生成" + sourName + "失败"
  777. br.ErrMsg = "生成" + sourName + "失败,edbInfo is nil"
  778. return
  779. }
  780. //处理同名指标
  781. {
  782. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  783. if err != nil {
  784. br.Msg = "保存失败"
  785. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  786. return
  787. }
  788. if len(edbNameList) >= 2 {
  789. for _, v := range edbNameList {
  790. edbName := v.EdbName + "(" + v.SourceName + ")"
  791. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  792. if err != nil {
  793. br.Msg = "保存失败"
  794. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  795. return
  796. }
  797. }
  798. }
  799. }
  800. // 更新指标最大最小值
  801. err, errMsg = models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  802. if err != nil {
  803. br.Msg = errMsg
  804. br.ErrMsg = err.Error()
  805. return
  806. }
  807. resp := models.AddEdbInfoResp{
  808. EdbInfoId: edbInfo.EdbInfoId,
  809. UniqueCode: uniqueCode,
  810. }
  811. br.Ret = 200
  812. br.Success = true
  813. br.Msg = "保存成功"
  814. br.Data = resp
  815. br.IsAddLog = true
  816. }
  817. // Refresh
  818. // @Title 刷新计算指标接口
  819. // @Description 刷新计算指标接口
  820. // @Success 200 {object} models.RefreshEdbInfoReq
  821. // @router /refresh [post]
  822. func (this *PredictCalculateController) Refresh() {
  823. br := new(models.BaseResponse).Init()
  824. var cacheKey string
  825. defer func() {
  826. this.Data["json"] = br
  827. this.ServeJSON()
  828. }()
  829. var req models.RefreshEdbInfoReq
  830. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  831. if err != nil {
  832. br.Msg = "参数解析异常!"
  833. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  834. return
  835. }
  836. if req.EdbCode == "" {
  837. br.Msg = "请输入指标编码!"
  838. br.ErrMsg = "请输入指标编码,指标编码为空"
  839. return
  840. }
  841. if req.EdbInfoId <= 0 {
  842. br.Msg = "请输入指标ID!"
  843. br.ErrMsg = "请输入指标ID"
  844. return
  845. }
  846. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  847. if err != nil {
  848. br.Msg = "指标不存在!"
  849. br.ErrMsg = "指标不存在"
  850. return
  851. }
  852. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  853. if utils.Rc.IsExist(cacheKey) {
  854. br.Ret = 501
  855. br.Success = true
  856. br.Msg = "系统处理中,请稍后重试"
  857. br.IsSendEmail = false
  858. return
  859. }
  860. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  861. defer func() {
  862. _ = utils.Rc.Delete(cacheKey)
  863. }()
  864. startDate := req.StartDate
  865. var errMsg string
  866. endDate := time.Now().Format(utils.FormatDate)
  867. edbInfoId := edbInfo.EdbInfoId
  868. source := edbInfo.Source
  869. var latestDateStr string // 最近实际数据的日期
  870. var latestValue float64 // 最近实际数据的值
  871. var baseEdbInfoModel models.BasePredictEdbInfoInterface
  872. refreshParams := models.RefreshParams{
  873. EdbInfo: edbInfo,
  874. }
  875. switch source {
  876. case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ: //刷新同比值
  877. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  878. if err != nil {
  879. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  880. break
  881. }
  882. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  883. if err != nil {
  884. errMsg = "GetEdbInfoById Err:" + err.Error()
  885. break
  886. }
  887. refreshParams.FromEdbInfo = fromEdbInfo
  888. refreshParams.StartDate = edbInfo.StartDate
  889. }
  890. switch source {
  891. case utils.DATA_SOURCE_PREDICT_CALCULATE:
  892. //startDate = edbInfo.StartDate
  893. //sTime, err := time.ParseInLocation(utils.FormatDate, edbInfo.EndDate, time.Local)
  894. //if err != nil {
  895. // return
  896. //}
  897. //startDate = sTime.Format(utils.FormatDate)
  898. startDate = ""
  899. var edbInfoIdBytes []string
  900. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  901. if err != nil {
  902. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  903. break
  904. }
  905. var formulaStr string
  906. edbInfoList := make([]*models.EdbInfo, 0)
  907. edbInfoTag := make(map[string]int)
  908. for _, v := range calculateMap {
  909. edbInfoTag[v.FromTag] = v.FromEdbInfoId
  910. formulaStr += v.FromTag + ","
  911. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  912. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  913. edbInfoList = append(edbInfoList, edbInfo)
  914. }
  915. latestDateStr, latestValue, err = models.RefreshAllPredictCalculate(edbInfoList, edbInfoTag, edbInfo.EdbInfoId, source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, edbInfoIdBytes, edbInfo.EmptyType, edbInfo.MaxEmptyType, edbInfo.Extra)
  916. if err != nil && err.Error() != utils.ErrNoRow() {
  917. errMsg = "RefreshCalculate Err:" + err.Error()
  918. break
  919. }
  920. case utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ: //同差值
  921. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  922. if err != nil {
  923. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  924. break
  925. }
  926. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  927. if err != nil {
  928. errMsg = "GetEdbInfoById Err:" + err.Error()
  929. break
  930. }
  931. startDate = edbInfo.StartDate
  932. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTcz(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateTcz.EdbCode, startDate)
  933. if err != nil && err.Error() != utils.ErrNoRow() {
  934. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  935. break
  936. }
  937. case utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  938. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  939. if err != nil {
  940. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  941. break
  942. }
  943. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  944. if err != nil {
  945. errMsg = "GetEdbInfoById Err:" + err.Error()
  946. break
  947. }
  948. var formulaInt int
  949. formulaInt, _ = strconv.Atoi(calculateInfo.CalculateFormula)
  950. if formulaInt <= 0 {
  951. errMsg = "N值输入错误,请重新输入"
  952. break
  953. }
  954. startDate = edbInfo.StartDate
  955. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNszydpjjs(edbInfoId, source, edbInfo.SubSource, formulaInt, fromEdbInfo, calculateInfo.EdbCode, startDate)
  956. if err != nil && err.Error() != utils.ErrNoRow() {
  957. errMsg = "RefreshAllPredictCalculateNszydpjjs Err:" + err.Error()
  958. break
  959. }
  960. case utils.DATA_SOURCE_PREDICT_CALCULATE_BP: //刷新变频
  961. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  962. if err != nil {
  963. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  964. break
  965. }
  966. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  967. if err != nil {
  968. errMsg = "GetEdbInfoById Err:" + err.Error()
  969. break
  970. }
  971. endDate = time.Now().Format(utils.FormatDate)
  972. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateBp(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  973. if err != nil && err.Error() != utils.ErrNoRow() {
  974. errMsg = "RefreshAllPredictCalculateBp Err:" + err.Error()
  975. break
  976. }
  977. case utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ: //刷新环比值
  978. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  979. if err != nil {
  980. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  981. break
  982. }
  983. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  984. if err != nil {
  985. errMsg = "GetEdbInfoById Err:" + err.Error()
  986. break
  987. }
  988. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  989. endDate = time.Now().Format(utils.FormatDate)
  990. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  991. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateHbz(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  992. if err != nil && err.Error() != utils.ErrNoRow() {
  993. errMsg = "RefreshAllPredictCalculateHbz Err:" + err.Error()
  994. break
  995. }
  996. case utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ: //刷新环差值
  997. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  998. if err != nil {
  999. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  1000. break
  1001. }
  1002. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1003. if err != nil {
  1004. errMsg = "GetEdbInfoById Err:" + err.Error()
  1005. break
  1006. }
  1007. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1008. endDate = time.Now().Format(utils.FormatDate)
  1009. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1010. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateHcz(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  1011. if err != nil && err.Error() != utils.ErrNoRow() {
  1012. errMsg = "RefreshAllPredictCalculateHcz Err:" + err.Error()
  1013. break
  1014. }
  1015. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY: //刷新累计值转月值
  1016. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1017. if err != nil {
  1018. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  1019. break
  1020. }
  1021. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  1022. if err != nil {
  1023. errMsg = "GetEdbInfoById Err:" + err.Error()
  1024. break
  1025. }
  1026. endDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1027. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1028. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateLjzzy(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  1029. if err != nil && err.Error() != utils.ErrNoRow() {
  1030. errMsg = "RefreshAllPredictCalculateLjzzy Err:" + err.Error()
  1031. break
  1032. }
  1033. case utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
  1034. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1035. if err != nil {
  1036. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1037. break
  1038. }
  1039. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  1040. if err != nil {
  1041. errMsg = "GetEdbInfoById Err:" + err.Error()
  1042. break
  1043. }
  1044. //startDate = edbInfo.StartDate
  1045. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1046. endDate = time.Now().Format(utils.FormatDate)
  1047. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  1048. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTimeShift(edbInfoId, source, edbInfo.SubSource, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  1049. if err != nil && err.Error() != utils.ErrNoRow() {
  1050. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  1051. }
  1052. case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  1053. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateLjztbpj(edbInfo)
  1054. if err != nil && err.Error() != utils.ErrNoRow() {
  1055. errMsg = "RefreshAllPredictCalculateLjztbpj Err:" + err.Error()
  1056. break
  1057. }
  1058. case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ: //刷新直接拼接
  1059. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateZjpj(edbInfo)
  1060. if err != nil && err.Error() != utils.ErrNoRow() {
  1061. errMsg = "RefreshAllPredictCalculateZjpj Err:" + err.Error()
  1062. break
  1063. }
  1064. case utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX: //超季节性
  1065. calculateCjjx, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1066. if err != nil {
  1067. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1068. break
  1069. }
  1070. fromEdbInfo, err := models.GetEdbInfoById(calculateCjjx.FromEdbInfoId)
  1071. if err != nil {
  1072. errMsg = "GetEdbInfoById Err:" + err.Error()
  1073. break
  1074. }
  1075. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1076. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1077. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateCjjx(edbInfoId, edbInfo.Source, edbInfo.SubSource, fromEdbInfo, calculateCjjx.EdbCode, startDate, "", edbInfo.Calendar, formulaInt)
  1078. if err != nil && err.Error() != utils.ErrNoRow() {
  1079. errMsg = "RefreshAllPredictCalculateCjjx Err:" + err.Error()
  1080. break
  1081. }
  1082. case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //nhcc
  1083. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNhcc(edbInfo)
  1084. if err != nil && err.Error() != utils.ErrNoRow() {
  1085. errMsg = "RefreshAllPredictCalculateNhcc Err:" + err.Error()
  1086. break
  1087. }
  1088. case utils.DATA_SOURCE_PREDICT_CALCULATE_JP: //降频
  1089. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1090. if err != nil {
  1091. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1092. break
  1093. }
  1094. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  1095. if err != nil {
  1096. errMsg = "GetEdbInfoById Err:" + err.Error()
  1097. break
  1098. }
  1099. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateJp(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateInfo.EdbCode, edbInfo.Frequency, edbInfo.CalculateFormula)
  1100. if err != nil && err.Error() != utils.ErrNoRow() {
  1101. errMsg = "RefreshAllPredictCalculateJp Err:" + err.Error()
  1102. break
  1103. }
  1104. case utils.DATA_SOURCE_PREDICT_CALCULATE_NH: //年化
  1105. calculateInfo, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1106. if err != nil {
  1107. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1108. break
  1109. }
  1110. fromEdbInfo, err := models.GetEdbInfoById(calculateInfo.FromEdbInfoId)
  1111. if err != nil {
  1112. errMsg = "GetEdbInfoById Err:" + err.Error()
  1113. break
  1114. }
  1115. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateNh(edbInfoId, source, edbInfo.SubSource, fromEdbInfo, calculateInfo.EdbCode, edbInfo.Frequency, edbInfo.CalculateFormula)
  1116. if err != nil && err.Error() != utils.ErrNoRow() {
  1117. errMsg = "RefreshAllPredictCalculateNh Err:" + err.Error()
  1118. break
  1119. }
  1120. case utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS: //扩散指数
  1121. latestDateStr, latestValue, err = models.RefreshAllPredictCalculateKszs(edbInfo)
  1122. if err != nil && err.Error() != utils.ErrNoRow() {
  1123. errMsg = "RefreshAllPredictCalculateKszs Err:" + err.Error()
  1124. break
  1125. }
  1126. default:
  1127. // 获取通用的数据源处理服务
  1128. baseEdbInfoModel = models.GetBasePredictEdbInfoModel(source)
  1129. // 没有找到的话,那么就直接返回报错吧
  1130. if baseEdbInfoModel == nil {
  1131. br.Msg = "来源异常,请联系相关开发!"
  1132. br.ErrMsg = "来源异常,请联系相关开发"
  1133. return
  1134. }
  1135. latestDateStr, latestValue, err, errMsg = baseEdbInfoModel.Refresh(refreshParams)
  1136. }
  1137. if errMsg != `` {
  1138. br.Msg = "刷新指标失败!"
  1139. br.ErrMsg = "刷新指标失败,err:" + errMsg
  1140. return
  1141. }
  1142. // 更新指标最大最小值
  1143. err, errMsg = models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
  1144. if err != nil {
  1145. br.Msg = errMsg
  1146. br.ErrMsg = err.Error()
  1147. return
  1148. }
  1149. // 更新ES
  1150. go logic.UpdateEs(edbInfo.EdbInfoId)
  1151. br.Ret = 200
  1152. br.Success = true
  1153. br.Msg = "获取成功"
  1154. }
  1155. // CalculateComputeCorrelation
  1156. // @Title 拟合残差计算相关性接口
  1157. // @Description 拟合残差计算相关性接口
  1158. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  1159. // @Success Ret=200 返回指标id
  1160. // @router /compute_correlation [post]
  1161. func (this *PredictCalculateController) CalculateComputeCorrelation() {
  1162. br := new(models.BaseResponse).Init()
  1163. defer func() {
  1164. this.Data["json"] = br
  1165. this.ServeJSON()
  1166. }()
  1167. var req models.EdbInfoCalculateBatchSaveReq
  1168. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1169. if err != nil {
  1170. br.Msg = "参数解析异常!"
  1171. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1172. return
  1173. }
  1174. if len(req.EdbInfoIdArr) != 2 {
  1175. br.Msg = "选择的指标异常,请重新选择"
  1176. return
  1177. }
  1178. //校验时间格式
  1179. //数据格式:2022-11-01,2022-11-10
  1180. timeList := strings.Split(req.Formula, ",")
  1181. if len(timeList) != 2 {
  1182. br.Msg = "选择时间有误,请重新输入"
  1183. return
  1184. }
  1185. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  1186. if err != nil {
  1187. br.Msg = "开始日期有误,请重新输入"
  1188. return
  1189. }
  1190. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  1191. if err != nil {
  1192. br.Msg = "结束日期有误,请重新输入"
  1193. return
  1194. }
  1195. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  1196. br.Msg = "日期间隔不得少于两天"
  1197. return
  1198. }
  1199. var nhccDate models.NhccDate // 拟合残差的日期
  1200. nhccDate.StartDate = startDate
  1201. nhccDate.EndDate = endDate
  1202. // 来源预测指标信息
  1203. fromEdbInfoId := req.EdbInfoIdArr[0].EdbInfoId
  1204. if fromEdbInfoId <= 0 {
  1205. br.Msg = "请选择指标"
  1206. return
  1207. }
  1208. // 来源指标(自变量指标)
  1209. fromEdbInfo, err := models.GetEdbInfoById(fromEdbInfoId)
  1210. if err != nil {
  1211. br.Msg = "获取指标信息失败"
  1212. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  1213. return
  1214. }
  1215. if fromEdbInfo.EdbInfoType != 1 {
  1216. br.Msg = "来源指标不是预测指标"
  1217. br.ErrMsg = "来源指标不是预测指标"
  1218. return
  1219. }
  1220. // 因变量指标
  1221. secondEdbInfoReq := req.EdbInfoIdArr[1]
  1222. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1223. if tmpErr != nil {
  1224. br.Msg = "获取因变量的指标信息失败"
  1225. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  1226. return
  1227. }
  1228. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  1229. br.Msg = "两个指标不允许为同一个"
  1230. br.ErrMsg = "两个指标不允许为同一个"
  1231. return
  1232. }
  1233. rVal, err := models.CalculatePredictComputeCorrelation(&req, fromEdbInfo, secondEdbInfo, nhccDate)
  1234. if err != nil {
  1235. br.Msg = "计算失败"
  1236. br.ErrMsg = "计算失败,ERR:" + err.Error()
  1237. return
  1238. }
  1239. br.Ret = 200
  1240. br.Success = true
  1241. br.Msg = "计算成功"
  1242. br.Data = rVal
  1243. br.IsAddLog = true
  1244. }