base_from_calculate.go 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_index_lib/logic"
  6. "eta/eta_index_lib/models"
  7. "eta/eta_index_lib/services"
  8. "eta/eta_index_lib/utils"
  9. "fmt"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // CalculateController 计算指标
  15. type CalculateController struct {
  16. BaseAuthController
  17. }
  18. // Add
  19. // @Title 新增计算指标接口
  20. // @Description 新增计算指标接口
  21. // @Success 200 {object} models.EdbInfoCalculateSaveReq
  22. // @router /add [post]
  23. func (this *CalculateController) Add() {
  24. br := new(models.BaseResponse).Init()
  25. defer func() {
  26. this.Data["json"] = br
  27. this.ServeJSON()
  28. }()
  29. var req models.EdbInfoCalculateSaveReq
  30. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  31. if err != nil {
  32. br.Msg = "参数解析异常!"
  33. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  34. return
  35. }
  36. req.EdbName = strings.Trim(req.EdbName, " ")
  37. if req.EdbName == "" {
  38. br.Msg = "指标名称不能为空"
  39. return
  40. }
  41. if req.Frequency == "" {
  42. br.Msg = "频率不能为空"
  43. return
  44. }
  45. if req.Unit == "" {
  46. br.Msg = "单位不能为空"
  47. return
  48. }
  49. if req.ClassifyId <= 0 {
  50. br.Msg = "请选择分类"
  51. return
  52. }
  53. if len(req.EdbInfoIdArr) <= 0 {
  54. br.Msg = "请选择指标"
  55. return
  56. }
  57. if req.CalculateFormula == "" {
  58. br.Msg = "请填写指标"
  59. return
  60. }
  61. calculateFormula := req.CalculateFormula
  62. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  63. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  64. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  65. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  66. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  67. req.CalculateFormula = calculateFormula
  68. //加入缓存机制,避免创建同一个名称的指标 start
  69. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:add:", utils.DATA_SOURCE_CALCULATE, ":", req.EdbName)
  70. isExist := utils.Rc.IsExist(redisKey)
  71. if isExist {
  72. br.Msg = "指标正在处理,请勿重复提交"
  73. return
  74. } else {
  75. //设置3分钟缓存
  76. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  77. defer func() {
  78. _ = utils.Rc.Delete(redisKey)
  79. }()
  80. }
  81. //判断是否重复指标
  82. edbInfoMap := make(map[int]string)
  83. //移除研究员选择指标中的未使用的指标
  84. {
  85. //转大写的计算公式
  86. upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
  87. //用到的指标
  88. newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  89. for _, tmpEdbInfo := range req.EdbInfoIdArr {
  90. _, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
  91. if ok {
  92. br.Msg = "选择指标失败,请勿选择重复指标!"
  93. return
  94. }
  95. edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
  96. upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
  97. if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
  98. newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
  99. }
  100. }
  101. req.EdbInfoIdArr = newEdbInfoIdArr
  102. }
  103. var condition string
  104. var pars []interface{}
  105. condition += " AND edb_name=? "
  106. pars = append(pars, req.EdbName)
  107. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  108. if err != nil {
  109. br.Msg = "判断指标名称是否存在失败"
  110. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  111. return
  112. }
  113. if count > 0 {
  114. br.Msg = "指标名称已存在,请重新填写"
  115. br.ErrMsg = "指标名称已存在,请重新填写"
  116. br.IsSendEmail = false
  117. return
  118. }
  119. //检验公式
  120. var formulaStr string
  121. var edbInfoIdBytes []string
  122. for _, v := range req.EdbInfoIdArr {
  123. formulaStr += v.FromTag + ","
  124. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  125. }
  126. formulaSlice, err := utils.CheckFormulaJson(req.CalculateFormula)
  127. if err != nil {
  128. br.Msg = "公式格式错误,请重新填写"
  129. return
  130. }
  131. for _, formula := range formulaSlice {
  132. formulaMap, e := utils.CheckFormula(formula)
  133. if e != nil {
  134. br.Msg = "公式错误,请重新填写"
  135. return
  136. }
  137. for _, v := range formulaMap {
  138. if !strings.Contains(formulaStr, v) {
  139. br.Msg = "公式错误,请重新填写"
  140. return
  141. }
  142. }
  143. }
  144. //关联的指标信息
  145. edbInfoList := make([]*models.EdbInfo, 0)
  146. //关联的指标数据表
  147. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  148. for k, v := range req.EdbInfoIdArr {
  149. fromEdbInfo, err := models.GetEdbInfoById(v.EdbInfoId)
  150. if err != nil {
  151. if err.Error() == utils.ErrNoRow() {
  152. br.Msg = "生成计算指标失败"
  153. br.Msg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  154. return
  155. }
  156. br.Msg = "生成计算指标失败"
  157. br.Msg = "获取指标失败:Err:" + err.Error()
  158. return
  159. }
  160. edbInfoList = append(edbInfoList, fromEdbInfo)
  161. //关联关系表
  162. {
  163. calculateMappingItem := &models.EdbInfoCalculateMapping{
  164. EdbInfoCalculateMappingId: 0,
  165. EdbInfoId: 0,
  166. Source: utils.DATA_SOURCE_CALCULATE,
  167. SourceName: "指标运算",
  168. EdbCode: "",
  169. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  170. FromEdbCode: fromEdbInfo.EdbCode,
  171. FromEdbName: fromEdbInfo.EdbName,
  172. FromSource: fromEdbInfo.Source,
  173. FromSourceName: fromEdbInfo.SourceName,
  174. FromTag: v.FromTag,
  175. Sort: k + 1,
  176. CreateTime: time.Now(),
  177. ModifyTime: time.Now(),
  178. }
  179. //calculateMappingItem.EdbCode = edbCode
  180. //calculateMappingItem.EdbInfoId = int(edbInfoId)
  181. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  182. }
  183. }
  184. for _, v := range formulaSlice {
  185. formulaMap, e := utils.CheckFormula(v)
  186. if e != nil {
  187. br.Msg = "公式错误,请重新填写"
  188. return
  189. }
  190. //预先计算,判断公式是否正常
  191. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, v, edbInfoIdBytes)
  192. if !ok {
  193. br.Msg = "生成计算指标失败,请使用正确的计算公式"
  194. return
  195. }
  196. }
  197. randStr := utils.GetRandDigit(4)
  198. edbCode := `C` + time.Now().Format("060102") + randStr
  199. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  200. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  201. // 新增计算指标
  202. edbInfo, err := models.AddCalculateInfo(req, calculateMappingList, edbInfoList, edbCode, uniqueCode, edbInfoIdBytes)
  203. if err != nil {
  204. br.Msg = "生成计算指标失败"
  205. br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  206. return
  207. }
  208. //处理同名指标
  209. {
  210. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  211. if err != nil {
  212. br.Msg = "保存失败"
  213. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  214. return
  215. }
  216. if len(edbNameList) >= 2 {
  217. for _, v := range edbNameList {
  218. edbName := v.EdbName + "(" + v.SourceName + ")"
  219. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  220. if err != nil {
  221. br.Msg = "保存失败"
  222. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  223. return
  224. }
  225. }
  226. }
  227. }
  228. // 更新指标最大最小值
  229. err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  230. if err != nil {
  231. br.Msg = errMsg
  232. br.ErrMsg = err.Error()
  233. return
  234. }
  235. resp := models.AddEdbInfoResp{
  236. EdbInfoId: edbInfo.EdbInfoId,
  237. UniqueCode: uniqueCode,
  238. }
  239. br.Ret = 200
  240. br.Success = true
  241. br.Msg = "保存成功"
  242. br.Data = resp
  243. br.IsAddLog = true
  244. }
  245. // Edit
  246. // @Title 编辑计算指标接口
  247. // @Description 编辑计算指标接口
  248. // @Success 200 {object} models.EdbInfoCalculateSaveReq
  249. // @router /edit [post]
  250. func (this *CalculateController) Edit() {
  251. br := new(models.BaseResponse).Init()
  252. defer func() {
  253. this.Data["json"] = br
  254. this.ServeJSON()
  255. }()
  256. var req models.EdbInfoCalculateSaveReq
  257. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  258. if err != nil {
  259. br.Msg = "参数解析异常!"
  260. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  261. return
  262. }
  263. if req.EdbInfoId <= 0 {
  264. br.Msg = "参数错误"
  265. br.ErrMsg = "指标ID:" + strconv.Itoa(req.EdbInfoId)
  266. return
  267. }
  268. req.EdbName = strings.Trim(req.EdbName, " ")
  269. if req.EdbName == "" {
  270. br.Msg = "指标名称不能为空"
  271. return
  272. }
  273. if req.Frequency == "" {
  274. br.Msg = "频率不能为空"
  275. return
  276. }
  277. if req.Unit == "" {
  278. br.Msg = "单位不能为空"
  279. return
  280. }
  281. if req.ClassifyId <= 0 {
  282. br.Msg = "请选择分类"
  283. return
  284. }
  285. if len(req.EdbInfoIdArr) <= 0 {
  286. br.Msg = "请选择指标"
  287. return
  288. }
  289. if req.CalculateFormula == "" {
  290. br.Msg = "请填写指标公式"
  291. return
  292. }
  293. //todo 校验空值类型,max、min空值类型
  294. //todo req.EdbInfoIdArr根据tag排序,排成A,B,AB,这种格式
  295. calculateFormula := req.CalculateFormula
  296. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  297. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  298. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  299. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  300. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  301. req.CalculateFormula = calculateFormula
  302. fmt.Println("calculateFormula:" + calculateFormula)
  303. //判断是否重复指标
  304. edbInfoMap := make(map[int]string)
  305. //移除研究员选择指标中的未使用的指标
  306. {
  307. //转大写的计算公式
  308. upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
  309. //用到的指标
  310. newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  311. for _, tmpEdbInfo := range req.EdbInfoIdArr {
  312. _, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
  313. if ok {
  314. br.Msg = "选择指标失败,请勿选择重复指标!"
  315. return
  316. }
  317. edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
  318. upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
  319. if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
  320. newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
  321. }
  322. }
  323. req.EdbInfoIdArr = newEdbInfoIdArr
  324. }
  325. var condition string
  326. var pars []interface{}
  327. condition += " AND edb_name=? "
  328. pars = append(pars, req.EdbName)
  329. condition += " AND edb_info_id<>? "
  330. pars = append(pars, req.EdbInfoId)
  331. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  332. if err != nil {
  333. br.Msg = "判断指标名称是否存在失败"
  334. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  335. return
  336. }
  337. if count > 0 {
  338. br.Msg = "指标名称已存在,请重新填写"
  339. br.ErrMsg = "指标名称已存在,请重新填写"
  340. br.IsSendEmail = false
  341. return
  342. }
  343. //判断公式,指标是否有改动
  344. edbInfoDetail, err := models.GetEdbInfoById(req.EdbInfoId)
  345. if err != nil {
  346. br.Msg = "修改失败"
  347. br.Msg = "获取指标信息失败,GetEdbInfoById Err:" + err.Error()
  348. return
  349. }
  350. if edbInfoDetail == nil {
  351. br.Msg = "修改失败"
  352. br.Msg = "指标信息不存在,EdbInfoId:" + strconv.Itoa(req.EdbInfoId)
  353. return
  354. }
  355. var needCalculate bool
  356. if edbInfoDetail.CalculateFormula != req.CalculateFormula || edbInfoDetail.EmptyType != req.EmptyType || edbInfoDetail.MaxEmptyType != req.MaxEmptyType || edbInfoDetail.Extra != req.Extra {
  357. needCalculate = true
  358. }
  359. //检验公式
  360. var formulaStr string
  361. var edbInfoIdBytes []string
  362. var edbInfoIdArr []string
  363. for _, v := range req.EdbInfoIdArr {
  364. formulaStr += v.FromTag + ","
  365. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  366. edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
  367. if v.EdbInfoId == req.EdbInfoId {
  368. br.Msg = "计算指标中包含此指标,不能修改"
  369. return
  370. }
  371. }
  372. if needCalculate == false {
  373. edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
  374. fromEdbInfoId, err := models.GetCalculateEdbInfo(req.EdbInfoId)
  375. if err != nil {
  376. br.Msg = "修改失败"
  377. br.Msg = "获取数据失败,GetCalculateEdbInfo:" + err.Error()
  378. return
  379. }
  380. if edbInfoIdStr != fromEdbInfoId {
  381. needCalculate = true
  382. }
  383. }
  384. formulaSlice, err := utils.CheckFormulaJson(req.CalculateFormula)
  385. if err != nil {
  386. br.Msg = "公式格式错误,请重新填写"
  387. return
  388. }
  389. for _, formula := range formulaSlice {
  390. formulaMap, e := utils.CheckFormula(formula)
  391. if e != nil {
  392. br.Msg = "公式错误,请重新填写"
  393. return
  394. }
  395. for _, v := range formulaMap {
  396. if !strings.Contains(formulaStr, v) {
  397. br.Msg = "公式错误,请重新填写"
  398. return
  399. }
  400. }
  401. }
  402. //重新计算
  403. err, errMsg := models.EditCalculateInfo(edbInfoDetail, req, formulaSlice, edbInfoIdBytes, needCalculate)
  404. if err != nil {
  405. br.Msg = "生成计算指标失败"
  406. if errMsg != `` {
  407. br.Msg = errMsg
  408. }
  409. br.Msg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  410. return
  411. }
  412. // 更新指标最大最小值
  413. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfoDetail)
  414. if err != nil {
  415. br.Msg = errMsg
  416. br.ErrMsg = err.Error()
  417. return
  418. }
  419. resp := models.AddEdbInfoResp{
  420. EdbInfoId: edbInfoDetail.EdbInfoId,
  421. UniqueCode: edbInfoDetail.UniqueCode,
  422. }
  423. br.Ret = 200
  424. br.Success = true
  425. br.Msg = "保存成功"
  426. br.Data = resp
  427. br.IsAddLog = true
  428. }
  429. // BatchSave
  430. // @Title 累计值转月-同比值-同差等计算新增
  431. // @Description 累计值转月-同比值-同差等计算新增接口
  432. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  433. // @Success Ret=200 返回指标id
  434. // @router /batch/save [post]
  435. func (this *CalculateController) BatchSave() {
  436. br := new(models.BaseResponse).Init()
  437. defer func() {
  438. if br.ErrMsg == "" {
  439. br.IsSendEmail = false
  440. }
  441. this.Data["json"] = br
  442. this.ServeJSON()
  443. }()
  444. var req models.EdbInfoCalculateBatchSaveReq
  445. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  446. if err != nil {
  447. br.Msg = "参数解析异常!"
  448. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  449. return
  450. }
  451. req.EdbName = strings.Trim(req.EdbName, " ")
  452. if req.EdbName == "" {
  453. br.Msg = "指标名称不能为空"
  454. return
  455. }
  456. if req.Frequency == "" {
  457. br.Msg = "频率不能为空"
  458. return
  459. }
  460. if req.Unit == "" {
  461. br.Msg = "单位不能为空"
  462. return
  463. }
  464. if req.ClassifyId <= 0 {
  465. br.Msg = "请选择分类"
  466. return
  467. }
  468. // 基础指标id
  469. fromEdbInfoId := req.FromEdbInfoId
  470. var formulaInt int
  471. var nhccDate models.NhccDate // 拟合残差的日期
  472. switch req.Source {
  473. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_CALCULATE_CJJX:
  474. if req.Formula == "" {
  475. br.Msg = "请填写N值"
  476. return
  477. }
  478. formulaInt, _ = strconv.Atoi(req.Formula)
  479. if formulaInt <= 0 {
  480. br.Msg = "N值输入错误,请重新输入"
  481. return
  482. }
  483. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  484. //直接拼接指标
  485. //校验时间格式
  486. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  487. if err != nil {
  488. br.Msg = "拼接日期有误,请重新输入"
  489. return
  490. }
  491. case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
  492. //指标校验
  493. if len(req.EdbInfoIdArr) != 2 {
  494. br.Msg = "选择的指标异常,请重新选择"
  495. return
  496. }
  497. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  498. //校验时间格式
  499. //数据格式:2022-11-01,2022-11-10
  500. timeList := strings.Split(req.Formula, ",")
  501. if len(timeList) != 2 {
  502. br.Msg = "选择时间有误,请重新输入"
  503. return
  504. }
  505. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  506. if err != nil {
  507. br.Msg = "开始日期有误,请重新输入"
  508. return
  509. }
  510. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  511. if err != nil {
  512. br.Msg = "结束日期有误,请重新输入"
  513. return
  514. }
  515. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  516. br.Msg = "日期间隔不得少于两天"
  517. return
  518. }
  519. nhccDate.StartDate = startDate
  520. nhccDate.EndDate = endDate
  521. case utils.DATA_SOURCE_CALCULATE_JP:
  522. if req.Formula != "期末值" && req.Formula != "平均值" {
  523. br.Msg = "数据取值类型错误:" + req.Formula
  524. return
  525. }
  526. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  527. if req.Formula == "" {
  528. br.Msg = "请填写alpha值"
  529. return
  530. }
  531. a, e := strconv.ParseFloat(req.Formula, 64)
  532. if e != nil {
  533. br.Msg = "alpha值输入错误, 请重新输入"
  534. return
  535. }
  536. if a <= 0 || a >= 1 {
  537. br.Msg = "alpha值输入错误, 请重新输入"
  538. return
  539. }
  540. }
  541. notNeedFromEdbSourceList := []int{utils.DATA_SOURCE_CALCULATE_KSZS, utils.DATA_SOURCE_CALCULATE_CORRELATION, utils.DATA_SOURCE_CALCULATE_ZDYFX} // 不需要传入来源指标id的 指标类型
  542. if fromEdbInfoId <= 0 && !utils.InArrayByInt(notNeedFromEdbSourceList, req.Source) {
  543. br.Msg = "请选择指标"
  544. return
  545. }
  546. //加入缓存机制,避免创建同一个名称的指标 start
  547. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:batch:save:", req.Source, ":", req.EdbName)
  548. isExist := utils.Rc.IsExist(redisKey)
  549. if isExist {
  550. br.Msg = "指标正在处理,请勿重复提交"
  551. return
  552. } else {
  553. //设置3分钟缓存
  554. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  555. defer func() {
  556. _ = utils.Rc.Delete(redisKey)
  557. }()
  558. }
  559. //加入缓存机制,避免创建同一个名称的指标 end
  560. var condition string
  561. var pars []interface{}
  562. condition += " AND edb_name=? "
  563. pars = append(pars, req.EdbName)
  564. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  565. if err != nil {
  566. br.Msg = "判断指标名称是否存在失败"
  567. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  568. return
  569. }
  570. if count > 0 {
  571. br.Msg = "指标名称已存在,请重新填写"
  572. br.ErrMsg = "指标名称已存在,请重新填写"
  573. br.IsSendEmail = false
  574. return
  575. }
  576. // 来源指标
  577. var fromEdbInfo *models.EdbInfo
  578. if fromEdbInfoId > 0 {
  579. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  580. if err != nil {
  581. br.Msg = "获取指标信息失败"
  582. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  583. return
  584. }
  585. }
  586. //生成指标编码
  587. randStr := utils.GetRandDigit(4)
  588. edbCode := `C` + time.Now().Format("060102") + randStr
  589. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  590. uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  591. sysUserId := req.AdminId
  592. sysUserName := req.AdminName
  593. var sourName string
  594. var edbInfoId int
  595. var edbInfo *models.EdbInfo
  596. var errMsg string
  597. var baseEdbInfoModel models.BaseEdbInfoInterface
  598. addParam := models.AddCalculateBatchParams{
  599. Req: &req,
  600. FromEdbInfo: fromEdbInfo,
  601. EdbCode: edbCode,
  602. UniqueCode: uniqueCode,
  603. SysUserId: sysUserId,
  604. SysUserRealName: sysUserName,
  605. }
  606. switch req.Source {
  607. case utils.DATA_SOURCE_CALCULATE_LJZZY:
  608. sourName = "累计值转月值"
  609. if fromEdbInfo.Frequency != "月度" {
  610. br.Msg = "请选择月度指标"
  611. return
  612. }
  613. edbInfo, err = models.AddCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  614. case utils.DATA_SOURCE_CALCULATE_TBZ:
  615. if req.Frequency != fromEdbInfo.Frequency {
  616. br.Msg = "当前频度和原指标频度不一致"
  617. return
  618. }
  619. if req.Unit != "无" {
  620. br.Msg = "单位只允许为无,禁止选择其他单位"
  621. return
  622. }
  623. sourName = "同比值"
  624. edbInfo, err = models.AddCalculateTbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  625. case utils.DATA_SOURCE_CALCULATE_TCZ:
  626. if req.Frequency != fromEdbInfo.Frequency {
  627. br.Msg = "当前频度和原指标频度不一致"
  628. return
  629. }
  630. if req.Unit != fromEdbInfo.Unit {
  631. br.Msg = "当前单位和原指标单位不一致"
  632. return
  633. }
  634. sourName = "同差值"
  635. edbInfo, err = models.AddCalculateTcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  636. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
  637. sourName = "N数值移动平均计算"
  638. edbInfo, err = models.AddCalculateNszydpjjs(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  639. case utils.DATA_SOURCE_CALCULATE_HBZ:
  640. var condition string
  641. var pars []interface{}
  642. condition += " AND edb_info_id =? "
  643. pars = append(pars, fromEdbInfoId)
  644. condition += " AND value <=0 "
  645. checkCount, tmpErr := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource)
  646. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  647. br.Msg = "判断环比值是否可计算失败"
  648. br.ErrMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  649. return
  650. }
  651. if checkCount > 0 {
  652. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  653. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  654. return
  655. }
  656. sourName = "环比值"
  657. edbInfo, err = models.AddCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  658. case utils.DATA_SOURCE_CALCULATE_HCZ:
  659. sourName = "环差值"
  660. edbInfo, err = models.AddCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  661. case utils.DATA_SOURCE_CALCULATE_BP:
  662. sourName = utils.DATA_SOURCE_NAME_CALCULATE_BP
  663. edbInfo, err = models.AddCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  664. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  665. sourName = "时间移位"
  666. edbInfo, err = models.AddCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  667. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  668. sourName = "直接拼接"
  669. if len(req.EdbInfoIdArr) != 1 {
  670. br.Msg = "请传入拼接日期之后的指标"
  671. br.ErrMsg = "请传入拼接日期之后的指标"
  672. return
  673. }
  674. secondEdbInfoReq := req.EdbInfoIdArr[0]
  675. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  676. if tmpErr != nil {
  677. br.Msg = "获取拼接日期之后的指标信息失败"
  678. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + tmpErr.Error()
  679. return
  680. }
  681. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  682. br.Msg = "两个指标不允许为同一个"
  683. br.ErrMsg = "两个指标不允许为同一个"
  684. return
  685. }
  686. edbInfo, err = models.AddCalculateZjpj(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  687. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
  688. sourName = "累计值同比拼接"
  689. if fromEdbInfo.Frequency != "月度" {
  690. br.Msg = "待拼接指标只能筛选月度指标"
  691. br.ErrMsg = "待拼接指标只能筛选月度指标"
  692. return
  693. }
  694. if len(req.EdbInfoIdArr) != 1 {
  695. br.Msg = "请传入同比值指标"
  696. br.ErrMsg = "请传入同比值指标"
  697. return
  698. }
  699. secondEdbInfoReq := req.EdbInfoIdArr[0]
  700. tbzEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  701. if tmpErr != nil {
  702. br.Msg = "获取同比值指标信息失败"
  703. br.ErrMsg = "获取同比值指标信息失败:Err:" + tmpErr.Error()
  704. return
  705. }
  706. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  707. br.Msg = "指标必须是传入同比值指标类型"
  708. br.ErrMsg = "指标必须是传入同比值指标类型"
  709. return
  710. }
  711. if tbzEdbInfo.Frequency != "月度" {
  712. br.Msg = "同比值指标只能筛选月度指标"
  713. br.ErrMsg = "同比值指标只能筛选月度指标"
  714. return
  715. }
  716. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  717. br.Msg = "两个指标不允许为同一个"
  718. br.ErrMsg = "两个指标不允许为同一个"
  719. return
  720. }
  721. edbInfo, err = models.AddCalculateLjztbpj(&req, fromEdbInfo, tbzEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  722. case utils.DATA_SOURCE_CALCULATE_CJJX:
  723. sourName = "超季节性"
  724. edbInfo, err = models.AddCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  725. case utils.DATA_SOURCE_CALCULATE_NHCC:
  726. sourName = "拟合残差"
  727. secondEdbInfoReq := req.EdbInfoIdArr[1]
  728. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  729. if tmpErr != nil {
  730. br.Msg = "获取因变量的指标信息失败"
  731. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  732. return
  733. }
  734. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  735. br.Msg = "两个指标不允许为同一个"
  736. br.ErrMsg = "两个指标不允许为同一个"
  737. return
  738. }
  739. edbInfo, err, errMsg = models.AddCalculateNhcc(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, nhccDate, sysUserId, sysUserName)
  740. case utils.DATA_SOURCE_CALCULATE_JP:
  741. if !models.CheckFrequency(fromEdbInfo.Frequency, req.Frequency) {
  742. br.Msg = "频度异常,不允许低频降频到高频"
  743. return
  744. }
  745. sourName = utils.DATA_SOURCE_NAME_CALCULATE_JP
  746. edbInfo, err = models.AddCalculateJp(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  747. case utils.DATA_SOURCE_CALCULATE_NH:
  748. sourName = utils.DATA_SOURCE_NAME_CALCULATE_NH
  749. edbInfo, err = models.AddCalculateNh(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  750. case utils.DATA_SOURCE_CALCULATE_KSZS:
  751. //关联的指标信息
  752. if len(req.EdbInfoIdArr) < 2 {
  753. br.Msg = "指标数量不能小于2个,请重新选择"
  754. br.ErrMsg = "指标数量不能小于2个,请重新选择"
  755. br.IsSendEmail = false
  756. return
  757. }
  758. sourName = utils.DATA_SOURCE_NAME_CALCULATE_KSZS
  759. edbInfo, err = models.AddCalculateKszs(&req, edbCode, uniqueCode, sysUserId, sysUserName)
  760. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  761. //关联的指标信息
  762. if len(req.EdbInfoIdArr) < 2 {
  763. br.Msg = "指标数量不能小于2个,请重新选择"
  764. br.ErrMsg = "指标数量不能小于2个,请重新选择"
  765. br.IsSendEmail = false
  766. return
  767. }
  768. sourName = utils.DATA_SOURCE_NAME_CALCULATE_CORRELATION
  769. edbInfo, err, errMsg = models.AddCalculateCorrelation(&req, edbCode, uniqueCode, sysUserId, sysUserName)
  770. case utils.DATA_SOURCE_CALCULATE_RJZ:
  771. if req.Frequency == "日度" {
  772. br.Msg = "日度指标无需进行日均值计算"
  773. return
  774. }
  775. if req.Frequency != fromEdbInfo.Frequency {
  776. br.Msg = "当前频度和原指标频度不一致"
  777. return
  778. }
  779. if req.Unit != fromEdbInfo.Unit {
  780. br.Msg = "单位只允许为和原指标频度保持一致,禁止选择其他单位"
  781. return
  782. }
  783. sourName = "日均值"
  784. edbInfo, err = models.AddCalculateRjz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  785. default:
  786. // 获取通用的数据源处理服务
  787. baseEdbInfoModel = models.GetBaseEdbInfoModel(req.Source)
  788. // 没有找到的话,那么就直接返回报错吧
  789. if baseEdbInfoModel == nil {
  790. br.Msg = "无效计算方式"
  791. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  792. return
  793. }
  794. sourName = baseEdbInfoModel.GetSourceName()
  795. edbInfo, err, errMsg = baseEdbInfoModel.Add(addParam)
  796. }
  797. if err != nil {
  798. br.Msg = "生成" + sourName + "失败"
  799. if errMsg != `` {
  800. br.Msg = errMsg
  801. }
  802. br.ErrMsg = "生成" + sourName + "失败 Err:" + err.Error()
  803. return
  804. }
  805. if edbInfo == nil {
  806. br.Msg = "生成" + sourName + "失败"
  807. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  808. return
  809. }
  810. edbInfoId = edbInfo.EdbInfoId
  811. //处理同名指标
  812. {
  813. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  814. if err != nil {
  815. br.Msg = "保存失败"
  816. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  817. return
  818. }
  819. if len(edbNameList) >= 2 {
  820. for _, v := range edbNameList {
  821. edbName := v.EdbName + "(" + v.SourceName + ")"
  822. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  823. if err != nil {
  824. br.Msg = "保存失败"
  825. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  826. return
  827. }
  828. }
  829. }
  830. }
  831. // 更新指标最大最小值
  832. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  833. if err != nil {
  834. br.Msg = errMsg
  835. br.ErrMsg = err.Error()
  836. return
  837. }
  838. resp := models.AddEdbInfoResp{
  839. EdbInfoId: edbInfo.EdbInfoId,
  840. UniqueCode: edbInfo.UniqueCode,
  841. }
  842. br.Ret = 200
  843. br.Success = true
  844. br.Msg = "保存成功"
  845. br.Data = resp
  846. br.IsAddLog = true
  847. }
  848. // BatchEdit
  849. // @Title 累计值转月-同比值-同差等计算新增
  850. // @Description 累计值转月-同比值-同差等计算新增接口
  851. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  852. // @Success Ret=200 返回指标id
  853. // @router /batch/edit [post]
  854. func (this *CalculateController) BatchEdit() {
  855. br := new(models.BaseResponse).Init()
  856. defer func() {
  857. this.Data["json"] = br
  858. this.ServeJSON()
  859. }()
  860. var req models.EdbInfoCalculateBatchEditReq
  861. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  862. if err != nil {
  863. br.Msg = "参数解析异常!"
  864. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  865. return
  866. }
  867. if req.EdbName == "" {
  868. br.Msg = "指标名称不能为空"
  869. return
  870. }
  871. if req.Frequency == "" {
  872. br.Msg = "频率不能为空"
  873. return
  874. }
  875. if req.Unit == "" {
  876. br.Msg = "单位不能为空"
  877. return
  878. }
  879. if req.ClassifyId <= 0 {
  880. br.Msg = "请选择分类"
  881. return
  882. }
  883. if req.EdbInfoId <= 0 {
  884. br.Msg = "请选择指标"
  885. return
  886. }
  887. var condition string
  888. var pars []interface{}
  889. condition += " AND edb_name=? "
  890. pars = append(pars, req.EdbName)
  891. condition += " AND edb_info_id<>? "
  892. pars = append(pars, req.EdbInfoId)
  893. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  894. if err != nil {
  895. br.Msg = "判断指标名称是否存在失败"
  896. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  897. return
  898. }
  899. if count > 0 {
  900. br.Msg = "指标名称已存在,请重新填写"
  901. br.ErrMsg = "指标名称已存在,请重新填写"
  902. br.IsSendEmail = false
  903. return
  904. }
  905. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  906. if err != nil {
  907. if err.Error() == utils.ErrNoRow() {
  908. br.Msg = "指标已被删除,请刷新页面"
  909. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  910. return
  911. }
  912. br.Msg = "获取指标信息失败"
  913. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  914. return
  915. }
  916. // 基础指标id
  917. fromEdbInfoId := req.FromEdbInfoId
  918. if req.Source <= 0 {
  919. req.Source = edbInfo.Source
  920. }
  921. var formulaInt int
  922. var nhccDate models.NhccDate // 拟合残差的日期
  923. // 初期的参数校验
  924. switch req.Source {
  925. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_CALCULATE_CJJX:
  926. if req.Formula == "" {
  927. br.Msg = "请填写N值"
  928. return
  929. }
  930. formulaInt, _ = strconv.Atoi(req.Formula)
  931. if formulaInt <= 0 {
  932. br.Msg = "N值输入错误,请重新输入"
  933. return
  934. }
  935. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  936. //直接拼接指标
  937. //校验时间格式
  938. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  939. if err != nil {
  940. br.Msg = "拼接日期有误,请重新输入"
  941. return
  942. }
  943. case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
  944. //指标校验
  945. if len(req.EdbInfoIdArr) != 2 {
  946. br.Msg = "选择的指标异常,请重新选择"
  947. return
  948. }
  949. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  950. //校验时间格式
  951. //数据格式:2022-11-01,2022-11-10
  952. timeList := strings.Split(req.Formula, ",")
  953. if len(timeList) != 2 {
  954. br.Msg = "选择时间有误,请重新输入"
  955. return
  956. }
  957. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  958. if err != nil {
  959. br.Msg = "开始日期有误,请重新输入"
  960. return
  961. }
  962. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  963. if err != nil {
  964. br.Msg = "结束日期有误,请重新输入"
  965. return
  966. }
  967. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  968. br.Msg = "日期间隔不得少于两天"
  969. return
  970. }
  971. nhccDate.StartDate = startDate
  972. nhccDate.EndDate = endDate
  973. case utils.DATA_SOURCE_CALCULATE_JP:
  974. if req.Formula != "期末值" && req.Formula != "平均值" {
  975. br.Msg = "数据取值类型错误:" + req.Formula
  976. return
  977. }
  978. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  979. if req.Formula == "" {
  980. br.Msg = "请填写alpha值"
  981. return
  982. }
  983. a, e := strconv.ParseFloat(req.Formula, 64)
  984. if e != nil {
  985. br.Msg = "alpha值输入错误, 请重新输入"
  986. return
  987. }
  988. if a <= 0 || a >= 1 {
  989. br.Msg = "alpha值输入错误, 请重新输入"
  990. return
  991. }
  992. }
  993. var fromEdbInfo *models.EdbInfo
  994. if fromEdbInfoId > 0 {
  995. // 获取基础指标信息
  996. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  997. if err != nil {
  998. if err.Error() == utils.ErrNoRow() {
  999. br.Msg = "指标已被删除,请刷新页面"
  1000. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  1001. return
  1002. }
  1003. br.Msg = "获取指标信息失败"
  1004. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  1005. return
  1006. }
  1007. }
  1008. //dataUpdateTime := time.Now().Format(utils.FormatDateTime)
  1009. var sourName, errMsg string
  1010. var edbInfoId int
  1011. var baseEdbInfoModel models.BaseEdbInfoInterface
  1012. editParams := models.EditCalculateBatchParams{
  1013. Req: &req,
  1014. EdbInfo: edbInfo,
  1015. FromEdbInfo: fromEdbInfo,
  1016. }
  1017. switch req.Source {
  1018. case utils.DATA_SOURCE_CALCULATE_LJZZY:
  1019. sourName = "累计值转月值"
  1020. if fromEdbInfo.Frequency != "月度" {
  1021. br.Msg = "请选择月度指标"
  1022. return
  1023. }
  1024. err = models.EditCalculateLjzzy(edbInfo, &req, fromEdbInfo)
  1025. case utils.DATA_SOURCE_CALCULATE_TBZ:
  1026. sourName = "同比值"
  1027. err = models.EditCalculateTbz(edbInfo, &req, fromEdbInfo)
  1028. case utils.DATA_SOURCE_CALCULATE_TCZ:
  1029. fmt.Println("start edit", time.Now())
  1030. sourName = "同差值"
  1031. err = models.EditCalculateTcz(edbInfo, &req, fromEdbInfo)
  1032. fmt.Println("end edit", time.Now())
  1033. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
  1034. sourName = "N数值移动平均计算"
  1035. err = models.EditCalculateNszydpjjs(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  1036. case utils.DATA_SOURCE_CALCULATE_HBZ:
  1037. var condition string
  1038. var pars []interface{}
  1039. condition += " AND edb_info_id =? "
  1040. pars = append(pars, req.FromEdbInfoId)
  1041. condition += " AND value <=0 "
  1042. checkCount, tmpErr := models.GetEdbDataCount(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource)
  1043. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  1044. br.Msg = "判断环比值是否可计算失败"
  1045. br.ErrMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  1046. return
  1047. }
  1048. if checkCount > 0 {
  1049. br.Msg = "原始数据中存在0或负数,该指标不能进行环比运算"
  1050. br.ErrMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  1051. return
  1052. }
  1053. sourName = "环比值"
  1054. err = models.EditCalculateHbz(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  1055. case utils.DATA_SOURCE_CALCULATE_HCZ:
  1056. sourName = "环差值"
  1057. err = models.EditCalculateHcz(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  1058. case utils.DATA_SOURCE_CALCULATE_BP:
  1059. sourName = utils.DATA_SOURCE_NAME_CALCULATE_BP
  1060. err = models.EditCalculateBp(edbInfo, &req, fromEdbInfo)
  1061. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  1062. sourName = "时间移位"
  1063. err = models.EditCalculateTimeShift(edbInfo, &req, fromEdbInfo)
  1064. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  1065. sourName = "直接拼接"
  1066. if len(req.EdbInfoIdArr) != 1 {
  1067. br.Msg = "请传入拼接日期之后的指标"
  1068. br.ErrMsg = "请传入拼接日期之后的指标"
  1069. return
  1070. }
  1071. secondEdbInfoReq := req.EdbInfoIdArr[0]
  1072. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1073. if tmpErr != nil {
  1074. br.Msg = "获取拼接日期之后的指标信息失败"
  1075. br.ErrMsg = "获取拼接日期之后的指标信息失败:Err:" + tmpErr.Error()
  1076. return
  1077. }
  1078. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  1079. br.Msg = "两个指标不允许为同一个"
  1080. br.ErrMsg = "两个指标不允许为同一个"
  1081. return
  1082. }
  1083. err = models.EditCalculateZjpj(&req, edbInfo, fromEdbInfo, secondEdbInfo)
  1084. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //累计值同比拼接
  1085. sourName = "累计值同比拼接"
  1086. if fromEdbInfo.Frequency != "月度" {
  1087. br.Msg = "待拼接指标只能筛选月度指标"
  1088. br.ErrMsg = "待拼接指标只能筛选月度指标"
  1089. return
  1090. }
  1091. if len(req.EdbInfoIdArr) != 1 {
  1092. br.Msg = "请传入同比值指标"
  1093. br.ErrMsg = "请传入同比值指标"
  1094. return
  1095. }
  1096. secondEdbInfoReq := req.EdbInfoIdArr[0]
  1097. tbzEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1098. if tmpErr != nil {
  1099. br.Msg = "获取同比值指标信息失败"
  1100. br.ErrMsg = "获取同比值指标信息失败:Err:" + tmpErr.Error()
  1101. return
  1102. }
  1103. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  1104. br.Msg = "指标必须是传入同比值指标类型"
  1105. br.ErrMsg = "指标必须是传入同比值指标类型"
  1106. return
  1107. }
  1108. if tbzEdbInfo.Frequency != "月度" {
  1109. br.Msg = "同比值指标只能筛选月度指标"
  1110. br.ErrMsg = "同比值指标只能筛选月度指标"
  1111. return
  1112. }
  1113. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  1114. br.Msg = "两个指标不允许为同一个"
  1115. br.ErrMsg = "两个指标不允许为同一个"
  1116. return
  1117. }
  1118. err = models.EditCalculateLjztbpj(&req, edbInfo, fromEdbInfo, tbzEdbInfo)
  1119. case utils.DATA_SOURCE_CALCULATE_CJJX:
  1120. sourName = "超季节性"
  1121. err = models.EditCalculateCjjx(&req, edbInfo, fromEdbInfo, formulaInt)
  1122. case utils.DATA_SOURCE_CALCULATE_NHCC:
  1123. sourName = "拟合残差"
  1124. secondEdbInfoReq := req.EdbInfoIdArr[1]
  1125. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1126. if tmpErr != nil {
  1127. br.Msg = "获取因变量的指标信息失败"
  1128. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  1129. return
  1130. }
  1131. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  1132. br.Msg = "两个指标不允许为同一个"
  1133. br.ErrMsg = "两个指标不允许为同一个"
  1134. return
  1135. }
  1136. err, errMsg = models.EditCalculateNhcc(&req, edbInfo, fromEdbInfo, secondEdbInfo, nhccDate)
  1137. case utils.DATA_SOURCE_CALCULATE_JP:
  1138. if !models.CheckFrequency(fromEdbInfo.Frequency, req.Frequency) {
  1139. br.Msg = "频度异常,不允许低频降频到高频"
  1140. return
  1141. }
  1142. sourName = utils.DATA_SOURCE_NAME_CALCULATE_JP
  1143. err = models.EditCalculateJp(edbInfo, &req, fromEdbInfo)
  1144. case utils.DATA_SOURCE_CALCULATE_NH:
  1145. sourName = utils.DATA_SOURCE_NAME_CALCULATE_NH
  1146. err = models.EditCalculateNh(edbInfo, &req, fromEdbInfo)
  1147. case utils.DATA_SOURCE_CALCULATE_KSZS:
  1148. //关联的指标信息
  1149. if len(req.EdbInfoIdArr) < 2 {
  1150. br.Msg = "指标数量不能小于2个,请重新选择"
  1151. br.ErrMsg = "指标数量不能小于2个,请重新选择"
  1152. br.IsSendEmail = false
  1153. return
  1154. }
  1155. sourName = utils.DATA_SOURCE_NAME_CALCULATE_KSZS
  1156. err = models.EditCalculateKszs(edbInfo, &req)
  1157. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  1158. //关联的指标信息
  1159. if len(req.EdbInfoIdArr) < 2 {
  1160. br.Msg = "指标数量不能小于2个,请重新选择"
  1161. br.ErrMsg = "指标数量不能小于2个,请重新选择"
  1162. br.IsSendEmail = false
  1163. return
  1164. }
  1165. sourName = utils.DATA_SOURCE_NAME_CALCULATE_CORRELATION
  1166. err, errMsg = models.EditCalculateCorrelation(edbInfo, &req)
  1167. case utils.DATA_SOURCE_CALCULATE_RJZ:
  1168. if req.Frequency == "日度" {
  1169. br.Msg = "日度指标无需进行日均值计算"
  1170. return
  1171. }
  1172. if req.Frequency != fromEdbInfo.Frequency {
  1173. br.Msg = "当前频度和原指标频度不一致"
  1174. return
  1175. }
  1176. if req.Unit != fromEdbInfo.Unit {
  1177. br.Msg = "单位只允许为和原指标频度保持一致,禁止选择其他单位"
  1178. return
  1179. }
  1180. sourName = "日均值"
  1181. err = models.EditCalculateRjz(edbInfo, &req, fromEdbInfo)
  1182. default:
  1183. // 获取通用的数据源处理服务
  1184. baseEdbInfoModel = models.GetBaseEdbInfoModel(req.Source)
  1185. // 没有找到的话,那么就直接返回报错吧
  1186. if baseEdbInfoModel == nil {
  1187. br.Msg = "无效计算方式"
  1188. br.ErrMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  1189. return
  1190. }
  1191. sourName = baseEdbInfoModel.GetSourceName()
  1192. err, errMsg = baseEdbInfoModel.Edit(editParams)
  1193. }
  1194. if err != nil {
  1195. br.Msg = "生成" + sourName + "失败"
  1196. if errMsg != `` {
  1197. br.Msg = errMsg
  1198. }
  1199. br.Msg = "生成" + sourName + "失败 Err:" + err.Error()
  1200. return
  1201. }
  1202. if edbInfo == nil {
  1203. br.Msg = "生成" + sourName + "失败"
  1204. br.ErrMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  1205. return
  1206. }
  1207. edbInfoId = edbInfo.EdbInfoId
  1208. //处理同名指标
  1209. {
  1210. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  1211. if err != nil {
  1212. br.Msg = "保存失败"
  1213. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  1214. return
  1215. }
  1216. if len(edbNameList) >= 2 {
  1217. for _, v := range edbNameList {
  1218. edbName := v.EdbName + "(" + v.SourceName + ")"
  1219. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  1220. if err != nil {
  1221. br.Msg = "保存失败"
  1222. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  1223. return
  1224. }
  1225. }
  1226. }
  1227. }
  1228. // 更新指标最大最小值
  1229. //err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfoTmp(edbInfo, dataUpdateTime)
  1230. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1231. if err != nil {
  1232. br.Msg = errMsg
  1233. br.ErrMsg = err.Error()
  1234. return
  1235. }
  1236. resp := models.AddEdbInfoResp{
  1237. EdbInfoId: edbInfo.EdbInfoId,
  1238. UniqueCode: edbInfo.UniqueCode,
  1239. }
  1240. br.Ret = 200
  1241. br.Success = true
  1242. br.Msg = "保存成功"
  1243. br.Data = resp
  1244. br.IsAddLog = true
  1245. }
  1246. // Refresh
  1247. // @Title 刷新计算指标接口
  1248. // @Description 刷新计算指标接口
  1249. // @Success 200 {object} models.RefreshEdbInfoReq
  1250. // @router /refresh [post]
  1251. func (this *CalculateController) Refresh() {
  1252. br := new(models.BaseResponse).Init()
  1253. var cacheKey string
  1254. defer func() {
  1255. this.Data["json"] = br
  1256. this.ServeJSON()
  1257. }()
  1258. var req models.RefreshEdbInfoReq
  1259. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1260. if err != nil {
  1261. br.Msg = "参数解析异常!"
  1262. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1263. return
  1264. }
  1265. if req.EdbCode == "" {
  1266. br.Msg = "请输入指标编码!"
  1267. br.ErrMsg = "请输入指标编码,指标编码为空"
  1268. return
  1269. }
  1270. if req.EdbInfoId <= 0 {
  1271. br.Msg = "请输入指标ID!"
  1272. br.ErrMsg = "请输入指标ID"
  1273. return
  1274. }
  1275. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  1276. if err != nil {
  1277. br.Msg = "指标不存在!"
  1278. br.ErrMsg = "指标不存在"
  1279. return
  1280. }
  1281. cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
  1282. if utils.Rc.IsExist(cacheKey) {
  1283. br.Ret = 501
  1284. br.Success = true
  1285. br.Msg = "系统处理中,请稍后重试"
  1286. return
  1287. }
  1288. // 刷新指标
  1289. utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
  1290. defer func() {
  1291. _ = utils.Rc.Delete(cacheKey)
  1292. }()
  1293. startDate := req.StartDate
  1294. var errMsg string
  1295. endDate := time.Now().Format(utils.FormatDate)
  1296. edbInfoId := edbInfo.EdbInfoId
  1297. source := edbInfo.Source
  1298. subSource := edbInfo.SubSource
  1299. var baseEdbInfoModel models.BaseEdbInfoInterface
  1300. refreshParams := models.RefreshParams{
  1301. EdbInfo: edbInfo,
  1302. StartDate: "", // 更新所有
  1303. EndDate: "", // 更新所有数据
  1304. }
  1305. switch source {
  1306. case utils.DATA_SOURCE_CALCULATE:
  1307. //startDate = edbInfo.StartDate
  1308. //sTime, err := time.ParseInLocation(utils.FormatDate, edbInfo.EndDate,time.Local)
  1309. //if err != nil {
  1310. // return
  1311. //}
  1312. //startDate = sTime.Format(utils.FormatDate)
  1313. startDate = ""
  1314. var edbInfoIdBytes []string
  1315. calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  1316. if err != nil {
  1317. errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
  1318. break
  1319. }
  1320. var formulaStr string
  1321. edbInfoList := make([]*models.EdbInfo, 0)
  1322. edbInfoTag := make(map[string]int)
  1323. for _, v := range calculateMap {
  1324. edbInfoTag[v.FromTag] = v.FromEdbInfoId
  1325. formulaStr += v.FromTag + ","
  1326. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  1327. edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
  1328. edbInfoList = append(edbInfoList, edbInfo)
  1329. }
  1330. err = models.RefreshAllCalculate(edbInfoList, edbInfoTag, edbInfo.EdbInfoId, source, subSource, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes, edbInfo.EmptyType, edbInfo.MaxEmptyType, edbInfo.Extra)
  1331. if err != nil && err.Error() != utils.ErrNoRow() {
  1332. errMsg = "RefreshCalculate Err:" + err.Error()
  1333. break
  1334. }
  1335. case utils.DATA_SOURCE_CALCULATE_LJZZY: //刷新累计值转月值
  1336. calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1337. if err != nil {
  1338. errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
  1339. break
  1340. }
  1341. fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
  1342. if err != nil {
  1343. errMsg = "GetEdbInfoById Err:" + err.Error()
  1344. break
  1345. }
  1346. //startDate = edbInfo.StartDate
  1347. //endDate = time.Now().Format(utils.FormatDate)
  1348. endDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1349. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1350. err = models.RefreshAllCalculateLjzzy(edbInfoId, source, subSource, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
  1351. if err != nil && err.Error() != utils.ErrNoRow() {
  1352. errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
  1353. break
  1354. }
  1355. case utils.DATA_SOURCE_CALCULATE_TBZ: //刷新同比值
  1356. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1357. if err != nil {
  1358. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1359. break
  1360. }
  1361. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1362. if err != nil {
  1363. errMsg = "GetEdbInfoById Err:" + err.Error()
  1364. break
  1365. }
  1366. //startDate = edbInfo.StartDate
  1367. endDate = time.Now().Format(utils.FormatDate)
  1368. err = models.RefreshAllCalculateTbz(edbInfoId, source, subSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  1369. if err != nil && err.Error() != utils.ErrNoRow() {
  1370. errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
  1371. break
  1372. }
  1373. case utils.DATA_SOURCE_CALCULATE_TCZ: //同差值
  1374. calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1375. if err != nil {
  1376. errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
  1377. break
  1378. }
  1379. fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
  1380. if err != nil {
  1381. errMsg = "GetEdbInfoById Err:" + err.Error()
  1382. break
  1383. }
  1384. //startDate = edbInfo.StartDate
  1385. endDate = time.Now().Format(utils.FormatDate)
  1386. err = models.RefreshAllCalculateTcz(edbInfoId, source, subSource, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
  1387. if err != nil && err.Error() != utils.ErrNoRow() {
  1388. errMsg = "RefreshCalculateTcz Err:" + err.Error()
  1389. break
  1390. }
  1391. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS: //N数值移动平均计算
  1392. calculateNszydpjjs, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1393. if err != nil {
  1394. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1395. break
  1396. }
  1397. fromEdbInfo, err := models.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
  1398. if err != nil {
  1399. errMsg = "GetEdbInfoById Err:" + err.Error()
  1400. break
  1401. }
  1402. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1403. //startDate = edbInfo.StartDate
  1404. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1405. err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, edbInfo.SubSource, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
  1406. if err != nil && err.Error() != utils.ErrNoRow() {
  1407. errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
  1408. break
  1409. }
  1410. case utils.DATA_SOURCE_CALCULATE_HBZ: //刷新环比值
  1411. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1412. if err != nil {
  1413. errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
  1414. break
  1415. }
  1416. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1417. if err != nil {
  1418. errMsg = "GetEdbInfoById Err:" + err.Error()
  1419. break
  1420. }
  1421. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1422. endDate = time.Now().Format(utils.FormatDate)
  1423. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1424. err = models.RefreshAllCalculateHbz(edbInfoId, source, subSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  1425. if err != nil && err.Error() != utils.ErrNoRow() {
  1426. errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
  1427. break
  1428. }
  1429. case utils.DATA_SOURCE_CALCULATE_HCZ: //刷新环差值
  1430. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1431. if err != nil {
  1432. errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
  1433. break
  1434. }
  1435. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1436. if err != nil {
  1437. errMsg = "GetEdbInfoById Err:" + err.Error()
  1438. break
  1439. }
  1440. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1441. endDate = time.Now().Format(utils.FormatDate)
  1442. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1443. err = models.RefreshAllCalculateHcz(edbInfoId, source, subSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
  1444. if err != nil && err.Error() != utils.ErrNoRow() {
  1445. errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
  1446. break
  1447. }
  1448. case utils.DATA_SOURCE_CALCULATE_BP: //刷新升频
  1449. calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1450. if err != nil {
  1451. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1452. break
  1453. }
  1454. fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
  1455. if err != nil {
  1456. errMsg = "GetEdbInfoById Err:" + err.Error()
  1457. break
  1458. }
  1459. //startDate = edbInfo.StartDate
  1460. endDate = time.Now().Format(utils.FormatDate)
  1461. err = models.RefreshAllCalculateBp(edbInfoId, source, subSource, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
  1462. if err != nil && err.Error() != utils.ErrNoRow() {
  1463. errMsg = "RefreshAllCalculateBp Err:" + err.Error()
  1464. break
  1465. }
  1466. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  1467. calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1468. if err != nil {
  1469. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1470. break
  1471. }
  1472. fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
  1473. if err != nil {
  1474. errMsg = "GetEdbInfoById Err:" + err.Error()
  1475. break
  1476. }
  1477. //startDate = edbInfo.StartDate
  1478. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1479. endDate = time.Now().Format(utils.FormatDate)
  1480. formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
  1481. err = models.RefreshAllCalculateTimeShift(edbInfoId, source, subSource, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
  1482. if err != nil && err.Error() != utils.ErrNoRow() {
  1483. errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
  1484. }
  1485. case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
  1486. err = models.RefreshAllCalculateZjpj(edbInfo)
  1487. if err != nil && err.Error() != utils.ErrNoRow() {
  1488. errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
  1489. break
  1490. }
  1491. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
  1492. err = models.RefreshAllCalculateLjztbpj(edbInfo)
  1493. if err != nil && err.Error() != utils.ErrNoRow() {
  1494. errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
  1495. break
  1496. }
  1497. case utils.DATA_SOURCE_PYTHON: //python代码运算
  1498. edbPythonCode, err := models.GetEdbPythonCodeById(edbInfo.EdbInfoId)
  1499. if err != nil {
  1500. errMsg = "获取python代码失败 Err:" + err.Error()
  1501. break
  1502. }
  1503. edbData, err, errMsg := services.ExecPythonCode(edbInfo.EdbCode, edbPythonCode.PythonCode)
  1504. if err != nil {
  1505. br.Msg = "获取数据失败"
  1506. br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
  1507. if errMsg != "" {
  1508. br.Msg = errMsg
  1509. }
  1510. return
  1511. }
  1512. err = models.RefreshAllPythonEdb(edbInfo, edbData)
  1513. if err != nil && err.Error() != utils.ErrNoRow() {
  1514. errMsg = "RefreshAllPythonEdb Err:" + err.Error()
  1515. break
  1516. }
  1517. case utils.DATA_SOURCE_CALCULATE_CJJX: //超季节性
  1518. calculateCjjx, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1519. if err != nil {
  1520. errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
  1521. break
  1522. }
  1523. fromEdbInfo, err := models.GetEdbInfoById(calculateCjjx.FromEdbInfoId)
  1524. if err != nil {
  1525. errMsg = "GetEdbInfoById Err:" + err.Error()
  1526. break
  1527. }
  1528. formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
  1529. startDate = `` //只要填写日期,就会出现问题,还是把日期给去掉吧
  1530. err = models.RefreshAllCalculateCjjx(edbInfoId, edbInfo.Source, edbInfo.SubSource, fromEdbInfo, calculateCjjx.EdbCode, startDate, "", edbInfo.Calendar, formulaInt)
  1531. if err != nil && err.Error() != utils.ErrNoRow() {
  1532. errMsg = "RefreshAllCalculateCjjx Err:" + err.Error()
  1533. break
  1534. }
  1535. case utils.DATA_SOURCE_CALCULATE_NHCC: //nhcc
  1536. err = models.RefreshAllCalculateNhcc(edbInfo)
  1537. if err != nil && err.Error() != utils.ErrNoRow() {
  1538. errMsg = "RefreshAllCalculateNhcc Err:" + err.Error()
  1539. break
  1540. }
  1541. case utils.DATA_SOURCE_CALCULATE_ADJUST:
  1542. calculateMapping, err := models.GetEdbInfoCalculateMappingDetail(edbInfo.EdbInfoId)
  1543. if err != nil {
  1544. br.Msg = "获取来源指标异常!"
  1545. br.ErrMsg = "获取来源指标异常,Err:" + err.Error()
  1546. return
  1547. }
  1548. fromEdbInfo, err := models.GetEdbInfoById(calculateMapping.FromEdbInfoId)
  1549. if err != nil {
  1550. br.Msg = "来源指标不存在!"
  1551. br.ErrMsg = "来源指标不存在"
  1552. return
  1553. }
  1554. err = models.RefreshAllAdjustEdb(edbInfo, fromEdbInfo)
  1555. if err != nil && err.Error() != utils.ErrNoRow() {
  1556. errMsg = "RefreshAllAdjustEdb Err:" + err.Error()
  1557. break
  1558. }
  1559. case utils.DATA_SOURCE_CALCULATE_JP: //刷新降频
  1560. calculateMapping, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1561. if err != nil {
  1562. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1563. break
  1564. }
  1565. fromEdbInfo, err := models.GetEdbInfoById(calculateMapping.FromEdbInfoId)
  1566. if err != nil {
  1567. errMsg = "GetEdbInfoById Err:" + err.Error()
  1568. break
  1569. }
  1570. //startDate = edbInfo.StartDate
  1571. endDate = time.Now().Format(utils.FormatDate)
  1572. err = models.RefreshAllCalculateJp(edbInfoId, source, subSource, fromEdbInfo, edbInfo.EdbCode, edbInfo.Frequency, edbInfo.CalculateFormula)
  1573. if err != nil && err.Error() != utils.ErrNoRow() {
  1574. errMsg = "RefreshAllCalculateJp Err:" + err.Error()
  1575. break
  1576. }
  1577. case utils.DATA_SOURCE_CALCULATE_NH: //刷新年化
  1578. calculateMapping, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1579. if err != nil {
  1580. errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
  1581. break
  1582. }
  1583. fromEdbInfo, err := models.GetEdbInfoById(calculateMapping.FromEdbInfoId)
  1584. if err != nil {
  1585. errMsg = "GetEdbInfoById Err:" + err.Error()
  1586. break
  1587. }
  1588. //startDate = edbInfo.StartDate
  1589. endDate = time.Now().Format(utils.FormatDate)
  1590. err = models.RefreshAllCalculateNh(edbInfoId, source, subSource, fromEdbInfo, edbInfo.EdbCode)
  1591. if err != nil && err.Error() != utils.ErrNoRow() {
  1592. errMsg = "RefreshAllCalculateNh Err:" + err.Error()
  1593. break
  1594. }
  1595. case utils.DATA_SOURCE_CALCULATE_KSZS: //刷新扩散指数
  1596. //startDate = edbInfo.StartDate
  1597. endDate = time.Now().Format(utils.FormatDate)
  1598. err = models.RefreshAllCalculateKszs(edbInfo)
  1599. if err != nil && err.Error() != utils.ErrNoRow() {
  1600. errMsg = "RefreshAllCalculateKszs Err:" + err.Error()
  1601. break
  1602. }
  1603. case utils.DATA_SOURCE_STOCK_PLANT: //存量装置
  1604. //startDate = edbInfo.StartDate
  1605. endDate = time.Now().Format(utils.FormatDate)
  1606. req.StartDate = `` // 开始日期也给过滤吧,万一研究员补充了之前的数据呢,还是过滤掉吧
  1607. err = models.RefreshEdbDataFromStockPlant(req.EdbInfoId, req.EdbCode, req.StartDate)
  1608. if err != nil && err.Error() != utils.ErrNoRow() {
  1609. errMsg = "RefreshEdbDataFromStockPlant Err:" + err.Error()
  1610. break
  1611. }
  1612. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  1613. err, errMsg = models.RefreshAllCalculateCorrelation(edbInfo)
  1614. case utils.DATA_SOURCE_CALCULATE_RJZ: //刷新日均值
  1615. calculateRjz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
  1616. if err != nil {
  1617. errMsg = "GetEdbInfoCalculateMappingDetail Err:" + err.Error()
  1618. break
  1619. }
  1620. fromEdbInfo, err := models.GetEdbInfoById(calculateRjz.FromEdbInfoId)
  1621. if err != nil {
  1622. errMsg = "GetEdbInfoById Err:" + err.Error()
  1623. break
  1624. }
  1625. //startDate = edbInfo.StartDate
  1626. endDate = time.Now().Format(utils.FormatDate)
  1627. err = models.RefreshAllCalculateRjz(edbInfoId, source, fromEdbInfo, calculateRjz.EdbCode, startDate, endDate)
  1628. if err != nil && err.Error() != utils.ErrNoRow() {
  1629. errMsg = "RefreshAllCalculateRjz Err:" + err.Error()
  1630. break
  1631. }
  1632. default:
  1633. // 获取通用的数据源处理服务
  1634. baseEdbInfoModel = models.GetBaseEdbInfoModel(source)
  1635. // 没有找到的话,那么就直接返回报错吧
  1636. if baseEdbInfoModel == nil {
  1637. br.Msg = "来源异常,请联系相关开发!"
  1638. br.ErrMsg = "来源异常,请联系相关开发"
  1639. return
  1640. }
  1641. err, errMsg = baseEdbInfoModel.Refresh(refreshParams)
  1642. }
  1643. if errMsg != `` {
  1644. br.Msg = "刷新指标失败!"
  1645. br.ErrMsg = "刷新指标失败,err:" + errMsg
  1646. return
  1647. }
  1648. // 更新指标最大最小值
  1649. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1650. if err != nil {
  1651. br.Msg = errMsg
  1652. br.ErrMsg = err.Error()
  1653. return
  1654. }
  1655. // 更新ES
  1656. go logic.UpdateEs(edbInfoId)
  1657. br.Ret = 200
  1658. br.Success = true
  1659. br.Msg = "获取成功"
  1660. }
  1661. // SaveAdjust
  1662. // @Title 保存数据调整指标接口
  1663. // @Description 保存数据调整指标接口
  1664. // @Success 200 {object} models.SaveAdjustEdbReq
  1665. // @router /adjust/save [post]
  1666. func (this *CalculateController) SaveAdjust() {
  1667. br := new(models.BaseResponse).Init()
  1668. defer func() {
  1669. this.Data["json"] = br
  1670. this.ServeJSON()
  1671. }()
  1672. var req models.SaveAdjustEdbReq
  1673. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1674. if err != nil {
  1675. br.Msg = "参数解析异常!"
  1676. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1677. return
  1678. }
  1679. req.EdbName = strings.Trim(req.EdbName, " ")
  1680. if req.EdbName == "" {
  1681. br.Msg = "指标名称不能为空"
  1682. return
  1683. }
  1684. if req.Frequency == "" {
  1685. br.Msg = "频率不能为空"
  1686. return
  1687. }
  1688. if req.Unit == "" {
  1689. br.Msg = "单位不能为空"
  1690. return
  1691. }
  1692. if req.ClassifyId <= 0 {
  1693. br.Msg = "请选择分类"
  1694. return
  1695. }
  1696. if len(req.DataList) == 0 {
  1697. br.Msg = "请填写数据"
  1698. return
  1699. }
  1700. //加入缓存机制,避免创建同一个名称的指标 start
  1701. redisKey := fmt.Sprint("edb_info:adjust:add:", utils.DATA_SOURCE_CALCULATE_ADJUST, ":", req.EdbName)
  1702. isExist := utils.Rc.IsExist(redisKey)
  1703. if isExist {
  1704. br.Msg = "指标正在处理,请勿重复提交"
  1705. return
  1706. } else {
  1707. //设置3分钟缓存
  1708. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  1709. defer func() {
  1710. _ = utils.Rc.Delete(redisKey)
  1711. }()
  1712. }
  1713. //获取指标数据
  1714. var condition string
  1715. var pars []interface{}
  1716. condition += " AND edb_name=? "
  1717. pars = append(pars, req.EdbName)
  1718. if req.EdbInfoId > 0 {
  1719. condition += " AND edb_info_id != ? "
  1720. pars = append(pars, req.EdbInfoId)
  1721. }
  1722. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  1723. if err != nil {
  1724. br.Msg = "判断指标名称是否存在失败"
  1725. br.ErrMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  1726. return
  1727. }
  1728. if count > 0 {
  1729. br.Msg = "指标名称已存在,请重新填写"
  1730. br.ErrMsg = "指标名称已存在,请重新填写"
  1731. return
  1732. }
  1733. edbInfo, err, errMsg := models.SaveAdjustEdb(req)
  1734. if err != nil {
  1735. br.Msg = errMsg
  1736. br.Msg = "添加指标失败,Err:" + err.Error()
  1737. return
  1738. }
  1739. //处理同名指标
  1740. {
  1741. edbNameList, err := models.GetEdbInfoByName(req.EdbName)
  1742. if err != nil {
  1743. br.Msg = "保存失败"
  1744. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  1745. return
  1746. }
  1747. if len(edbNameList) >= 2 {
  1748. for _, v := range edbNameList {
  1749. edbName := v.EdbName + "(" + v.SourceName + ")"
  1750. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  1751. if err != nil {
  1752. br.Msg = "保存失败"
  1753. br.ErrMsg = "修改指标名称失败,Err:" + err.Error()
  1754. return
  1755. }
  1756. }
  1757. }
  1758. }
  1759. // 更新指标最大最小值
  1760. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1761. if err != nil {
  1762. br.Msg = errMsg
  1763. br.ErrMsg = err.Error()
  1764. return
  1765. }
  1766. resp := models.AddEdbInfoResp{
  1767. EdbInfoId: edbInfo.EdbInfoId,
  1768. UniqueCode: edbInfo.UniqueCode,
  1769. }
  1770. br.Ret = 200
  1771. br.Success = true
  1772. br.Msg = "保存成功"
  1773. br.Data = resp
  1774. br.IsAddLog = true
  1775. }
  1776. // CalculateComputeCorrelation
  1777. // @Title 拟合残差计算相关性
  1778. // @Description 拟合残差计算相关性接口
  1779. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  1780. // @Success Ret=200 返回指标id
  1781. // @router /compute_correlation [post]
  1782. func (this *CalculateController) CalculateComputeCorrelation() {
  1783. br := new(models.BaseResponse).Init()
  1784. defer func() {
  1785. this.Data["json"] = br
  1786. this.ServeJSON()
  1787. }()
  1788. var req models.EdbInfoCalculateBatchSaveReq
  1789. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1790. if err != nil {
  1791. br.Msg = "参数解析异常!"
  1792. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1793. return
  1794. }
  1795. if len(req.EdbInfoIdArr) != 2 {
  1796. br.Msg = "选择的指标异常,请重新选择"
  1797. return
  1798. }
  1799. //校验时间格式
  1800. //数据格式:2022-11-01,2022-11-10
  1801. timeList := strings.Split(req.Formula, ",")
  1802. if len(timeList) != 2 {
  1803. br.Msg = "选择时间有误,请重新输入"
  1804. return
  1805. }
  1806. startDate, err := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  1807. if err != nil {
  1808. br.Msg = "开始日期有误,请重新输入"
  1809. return
  1810. }
  1811. endDate, err := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  1812. if err != nil {
  1813. br.Msg = "结束日期有误,请重新输入"
  1814. return
  1815. }
  1816. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  1817. br.Msg = "日期间隔不得少于两天"
  1818. return
  1819. }
  1820. var nhccDate models.NhccDate // 拟合残差的日期
  1821. nhccDate.StartDate = startDate
  1822. nhccDate.EndDate = endDate
  1823. // 基础指标id
  1824. fromEdbInfoId := req.EdbInfoIdArr[0].EdbInfoId
  1825. if fromEdbInfoId <= 0 {
  1826. br.Msg = "请选择指标"
  1827. return
  1828. }
  1829. // 来源指标(自变量指标)
  1830. fromEdbInfo, err := models.GetEdbInfoById(fromEdbInfoId)
  1831. if err != nil {
  1832. br.Msg = "获取指标信息失败"
  1833. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  1834. return
  1835. }
  1836. // 因变量指标
  1837. secondEdbInfoReq := req.EdbInfoIdArr[1]
  1838. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  1839. if tmpErr != nil {
  1840. br.Msg = "获取因变量的指标信息失败"
  1841. br.ErrMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  1842. return
  1843. }
  1844. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  1845. br.Msg = "两个指标不允许为同一个"
  1846. br.ErrMsg = "两个指标不允许为同一个"
  1847. return
  1848. }
  1849. aVal, bVal, rVal, err, errMsg := models.CalculateComputeCorrelation(&req, fromEdbInfo, secondEdbInfo, nhccDate)
  1850. if err != nil {
  1851. br.Msg = "计算失败"
  1852. if errMsg != `` {
  1853. br.Msg = errMsg
  1854. }
  1855. br.ErrMsg = "计算失败,ERR:" + err.Error()
  1856. return
  1857. }
  1858. connStr := ``
  1859. if bVal >= 0 {
  1860. connStr = `+`
  1861. }
  1862. valStr := fmt.Sprintf("y = %sx %s %s R²=%f", utils.SubFloatToString(aVal, 4), connStr, utils.SubFloatToString(bVal, 4), rVal)
  1863. br.Ret = 200
  1864. br.Success = true
  1865. br.Msg = "计算成功"
  1866. br.Data = valStr
  1867. br.IsAddLog = true
  1868. }
  1869. // ResetCustomAnalysisData
  1870. // @Title 自定义表格数据重置
  1871. // @Description 自定义表格数据重置
  1872. // @Param request body models.ResetCustomAnalysisData true "type json string"
  1873. // @Success Ret=200 返回指标id
  1874. // @router /custom_analysis/reset [post]
  1875. func (this *CalculateController) ResetCustomAnalysisData() {
  1876. br := new(models.BaseResponse).Init()
  1877. defer func() {
  1878. this.Data["json"] = br
  1879. this.ServeJSON()
  1880. }()
  1881. var req models.ResetCustomAnalysisData
  1882. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1883. if err != nil {
  1884. br.Msg = "参数解析异常!"
  1885. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1886. br.IsSendEmail = false
  1887. return
  1888. }
  1889. if req.EdbInfoId <= 0 {
  1890. br.Msg = "请选择指标"
  1891. br.ErrMsg = br.Msg
  1892. br.IsSendEmail = false
  1893. return
  1894. }
  1895. if len(req.DateList) <= 0 {
  1896. br.Msg = "请传入日期序列"
  1897. br.ErrMsg = br.Msg
  1898. br.IsSendEmail = false
  1899. return
  1900. }
  1901. if len(req.DataList) <= 0 {
  1902. br.Msg = "请传入数据序列"
  1903. br.ErrMsg = br.Msg
  1904. br.IsSendEmail = false
  1905. return
  1906. }
  1907. edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
  1908. if err != nil {
  1909. if err.Error() == utils.ErrNoRow() {
  1910. br.Msg = "指标已被删除,请刷新页面"
  1911. br.ErrMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  1912. return
  1913. }
  1914. br.Msg = "获取指标信息失败"
  1915. br.ErrMsg = "获取指标信息失败:Err:" + err.Error()
  1916. return
  1917. }
  1918. baseEdbInfoModel := models.CustomAnalysis{}
  1919. err, errMsg := baseEdbInfoModel.ResetData(edbInfo, req.DateList, req.DataList)
  1920. if err != nil {
  1921. br.Msg = "更新数据失败"
  1922. if errMsg != `` {
  1923. br.Msg = errMsg
  1924. }
  1925. br.ErrMsg = "更新数据失败 Err:" + err.Error()
  1926. return
  1927. }
  1928. if edbInfo == nil {
  1929. br.Msg = "更新数据失败"
  1930. br.ErrMsg = "更新数据失败,指标ID错误:"
  1931. return
  1932. }
  1933. // 更新指标最大最小值
  1934. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  1935. if err != nil {
  1936. br.Msg = errMsg
  1937. br.ErrMsg = err.Error()
  1938. return
  1939. }
  1940. resp := models.AddEdbInfoResp{
  1941. EdbInfoId: edbInfo.EdbInfoId,
  1942. UniqueCode: edbInfo.UniqueCode,
  1943. }
  1944. br.Ret = 200
  1945. br.Success = true
  1946. br.Msg = "处理成功"
  1947. br.Data = resp
  1948. br.IsAddLog = true
  1949. }
  1950. // Calculate
  1951. // @Title 基础数据计算
  1952. // @Description 拟合残差计算相关性接口
  1953. // @Param request body models.EdbInfoCalculateBatchSaveReq true "type json string"
  1954. // @Success Ret=200 返回指标id
  1955. // @router /base [post]
  1956. func (this *CalculateController) Calculate() {
  1957. br := new(models.BaseResponse).Init()
  1958. defer func() {
  1959. this.Data["json"] = br
  1960. this.ServeJSON()
  1961. }()
  1962. var req models.BaseCalculateBySearchData
  1963. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  1964. if err != nil {
  1965. br.Msg = "参数解析异常!"
  1966. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  1967. return
  1968. }
  1969. dateDataMap := make(map[time.Time]float64)
  1970. var errMsg string
  1971. dataList, err := models.EdbInfoSearchDataToData(req.DataList)
  1972. if err != nil {
  1973. br.Msg = "计算失败,数据异常!"
  1974. br.ErrMsg = "计算失败,数据异常,Err:" + err.Error()
  1975. return
  1976. }
  1977. baseCalculate := models.BaseCalculate{
  1978. DataList: dataList,
  1979. Frequency: req.Frequency,
  1980. Formula: req.Formula,
  1981. Calendar: req.Calendar,
  1982. MoveType: req.MoveType,
  1983. MoveFrequency: req.MoveFrequency,
  1984. FromFrequency: req.FromFrequency,
  1985. Source: req.Source,
  1986. }
  1987. //1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值
  1988. switch baseCalculate.Source {
  1989. case 1:
  1990. dateDataMap, err, errMsg = baseCalculate.Ljzzy()
  1991. case 2:
  1992. dateDataMap, err, errMsg = baseCalculate.Ljzzj()
  1993. case 3:
  1994. dateDataMap, err, errMsg = baseCalculate.Tbz()
  1995. case 4:
  1996. dateDataMap, err, errMsg = baseCalculate.Tcz()
  1997. case 5:
  1998. dateDataMap, err, errMsg = baseCalculate.Nszydpjjs()
  1999. case 6:
  2000. dateDataMap, err, errMsg = baseCalculate.Hbz()
  2001. case 7:
  2002. dateDataMap, err, errMsg = baseCalculate.Hcz()
  2003. case 8:
  2004. dateDataMap, err, errMsg = baseCalculate.UpFrequency()
  2005. case 9:
  2006. dateDataMap, err, errMsg = baseCalculate.DownFrequency()
  2007. case 10:
  2008. dateDataMap, err, errMsg = baseCalculate.TimeShift()
  2009. case 11:
  2010. dateDataMap, err, errMsg = baseCalculate.Cjjx()
  2011. case 12:
  2012. dateDataMap, err, errMsg = baseCalculate.Annualized()
  2013. case 13:
  2014. dateDataMap, err, errMsg = baseCalculate.Ljz()
  2015. case 14:
  2016. dateDataMap, err, errMsg = baseCalculate.LjzNczj()
  2017. case 15:
  2018. dateDataMap, err, errMsg = baseCalculate.ExponentialSmoothing()
  2019. case 16:
  2020. dateDataMap, err, errMsg = baseCalculate.Rjz()
  2021. default:
  2022. errMsg = "错误的计算类型"
  2023. err = errors.New(errMsg + ":" + strconv.Itoa(baseCalculate.Source))
  2024. }
  2025. if err != nil {
  2026. br.Msg = "计算失败"
  2027. if errMsg != `` {
  2028. br.Msg = errMsg
  2029. }
  2030. br.ErrMsg = err.Error()
  2031. return
  2032. }
  2033. dateStrDataMap, dateList := models.GetDateDataAndDateList(dateDataMap)
  2034. br.Ret = 200
  2035. br.Success = true
  2036. br.Msg = "计算成功"
  2037. br.Data = models.BaseCalculateResp{
  2038. DataMap: dateStrDataMap,
  2039. DateList: dateList,
  2040. }
  2041. br.IsAddLog = true
  2042. }