base_from_calculate.go 76 KB

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