base_from_calculate.go 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. package services
  2. import (
  3. "eta_gn/eta_index_lib/logic"
  4. "eta_gn/eta_index_lib/models"
  5. "eta_gn/eta_index_lib/utils"
  6. "fmt"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. func EdbCalculateBatchSave(req models.EdbInfoCalculateBatchSaveReq, lang string) (edbInfo *models.EdbInfo, uniqueCode string, err error, errMsg string) {
  13. req.EdbName = strings.Trim(req.EdbName, " ")
  14. if req.EdbName == "" {
  15. err = fmt.Errorf("指标名称不能为空")
  16. return
  17. }
  18. if req.Frequency == "" {
  19. err = fmt.Errorf("频率不能为空")
  20. return
  21. }
  22. if req.Unit == "" {
  23. err = fmt.Errorf("单位不能为空")
  24. return
  25. }
  26. if req.ClassifyId <= 0 {
  27. err = fmt.Errorf("请选择分类")
  28. return
  29. }
  30. fromEdbInfoId := req.FromEdbInfoId
  31. var formulaInt int
  32. var nhccDate models.NhccDate // 拟合残差的日期
  33. switch req.Source {
  34. 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:
  35. if req.Formula == "" {
  36. err = fmt.Errorf("请填写N值")
  37. return
  38. }
  39. formulaInt, _ = strconv.Atoi(req.Formula)
  40. if formulaInt <= 0 {
  41. err = fmt.Errorf(" N值输入错误,请重新输入")
  42. return
  43. }
  44. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  45. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  46. if err != nil {
  47. err = fmt.Errorf("拼接日期有误,请重新输入")
  48. return
  49. }
  50. case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
  51. if len(req.EdbInfoIdArr) != 2 {
  52. err = fmt.Errorf("选择的指标异常,请重新选择")
  53. return
  54. }
  55. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  56. timeList := strings.Split(req.Formula, ",")
  57. if len(timeList) != 2 {
  58. err = fmt.Errorf("选择时间有误,请重新输入")
  59. return
  60. }
  61. startDate, e := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  62. if e != nil {
  63. err = fmt.Errorf("开始日期有误,请重新输入")
  64. return
  65. }
  66. endDate, e := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  67. if e != nil {
  68. err = fmt.Errorf("结束日期有误,请重新输入")
  69. return
  70. }
  71. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  72. err = fmt.Errorf("日期间隔不得少于两天")
  73. return
  74. }
  75. nhccDate.StartDate = startDate
  76. nhccDate.EndDate = endDate
  77. case utils.DATA_SOURCE_CALCULATE_JP:
  78. if req.Formula != "期末值" && req.Formula != "平均值" {
  79. err = fmt.Errorf("数据取值类型错误:" + req.Formula)
  80. return
  81. }
  82. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  83. if req.Formula == "" {
  84. err = fmt.Errorf("请填写alpha值")
  85. return
  86. }
  87. a, e := strconv.ParseFloat(req.Formula, 64)
  88. if e != nil {
  89. err = fmt.Errorf("alpha值输入错误, 请重新输入")
  90. return
  91. }
  92. if a <= 0 || a >= 1 {
  93. err = fmt.Errorf("alpha值输入错误, 请重新输入")
  94. return
  95. }
  96. }
  97. notNeedFromEdbSourceList := []int{utils.DATA_SOURCE_CALCULATE_KSZS, utils.DATA_SOURCE_CALCULATE_CORRELATION, utils.DATA_SOURCE_CALCULATE_ZDYFX, utils.DATA_SOURCE_CALCULATE_SUM, utils.DATA_SOURCE_CALCULATE_AVG} // 不需要传入来源指标id的 指标类型
  98. if fromEdbInfoId <= 0 && !utils.InArrayByInt(notNeedFromEdbSourceList, req.Source) {
  99. err = fmt.Errorf("请选择指标")
  100. return
  101. }
  102. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:batch:save:", req.Source, ":", req.EdbName)
  103. isExist := utils.Rc.IsExist(redisKey)
  104. if isExist {
  105. err = fmt.Errorf("指标正在处理,请勿重复提交")
  106. return
  107. } else {
  108. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  109. defer func() {
  110. _ = utils.Rc.Delete(redisKey)
  111. }()
  112. }
  113. var condition string
  114. var pars []interface{}
  115. condition += " AND edb_name=? "
  116. pars = append(pars, req.EdbName)
  117. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  118. if err != nil {
  119. err = fmt.Errorf("判断指标名称是否存在失败")
  120. errMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  121. return
  122. }
  123. if count > 0 {
  124. err = fmt.Errorf("指标名称已存在,请重新填写")
  125. errMsg = "指标名称已存在,请重新填写"
  126. return
  127. }
  128. var fromEdbInfo *models.EdbInfo
  129. if fromEdbInfoId > 0 {
  130. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  131. if err != nil {
  132. errMsg = "获取指标信息失败:Err:" + err.Error()
  133. err = fmt.Errorf("获取指标信息失败")
  134. return
  135. }
  136. }
  137. oldEdbName := fromEdbInfo.EdbName
  138. oldFrequency := fromEdbInfo.Frequency
  139. oldUnit := fromEdbInfo.Unit
  140. edbCode, err := utils.GenerateEdbCode(1, "")
  141. if err != nil {
  142. errMsg = "指标编码生成失败:Err:" + err.Error()
  143. err = fmt.Errorf("指标生成失败")
  144. return
  145. }
  146. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  147. uniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  148. sysUserId := req.AdminId
  149. sysUserName := req.AdminName
  150. var sourName string
  151. var edbInfoId int
  152. var baseEdbInfoModel models.BaseEdbInfoInterface
  153. addParam := models.AddCalculateBatchParams{
  154. Req: &req,
  155. FromEdbInfo: fromEdbInfo,
  156. EdbCode: edbCode,
  157. UniqueCode: uniqueCode,
  158. SysUserId: sysUserId,
  159. SysUserRealName: sysUserName,
  160. }
  161. switch req.Source {
  162. case utils.DATA_SOURCE_CALCULATE:
  163. sourName = "计算指标"
  164. req2 := models.EdbInfoCalculateSaveReq{
  165. AdminId: sysUserId,
  166. AdminName: sysUserName,
  167. EdbName: req.EdbName,
  168. Frequency: req.Frequency,
  169. Unit: req.Unit,
  170. ClassifyId: req.ClassifyId,
  171. CalculateFormula: req.CalculateFormula,
  172. EmptyType: req.EmptyType,
  173. MaxEmptyType: req.MaxEmptyType,
  174. Extra: req.Extra,
  175. }
  176. t := models.EdbInfoFromTag{
  177. EdbInfoId: req.FromEdbInfoId,
  178. FromTag: "A",
  179. }
  180. req2.EdbInfoIdArr = append(req2.EdbInfoIdArr, t)
  181. if len(req.EdbInfoIdArr) > 0 {
  182. t = models.EdbInfoFromTag{
  183. EdbInfoId: req.EdbInfoIdArr[0].EdbInfoId,
  184. FromTag: "B",
  185. }
  186. req2.EdbInfoIdArr = append(req2.EdbInfoIdArr, t)
  187. }
  188. edbInfo, _, err, errMsg = EdbCalculateAdd(req2, lang)
  189. case utils.DATA_SOURCE_CALCULATE_LJZZY:
  190. sourName = "累计值转月值"
  191. if fromEdbInfo.Frequency != "月度" {
  192. err = fmt.Errorf("请选择月度指标")
  193. return
  194. }
  195. edbInfo, err = models.AddCalculateLjzzy(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  196. case utils.DATA_SOURCE_CALCULATE_TBZ:
  197. if req.Frequency != fromEdbInfo.Frequency {
  198. err = fmt.Errorf("当前频度和原指标频度不一致")
  199. return
  200. }
  201. if req.Unit != "无" {
  202. err = fmt.Errorf("单位只允许为无,禁止选择其他单位")
  203. return
  204. }
  205. sourName = "同比值"
  206. edbInfo, err = models.AddCalculateTbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  207. case utils.DATA_SOURCE_CALCULATE_TCZ:
  208. if req.Frequency != fromEdbInfo.Frequency {
  209. err = fmt.Errorf("当前频度和原指标频度不一致")
  210. return
  211. }
  212. if req.Unit != fromEdbInfo.Unit {
  213. err = fmt.Errorf("当前单位和原指标单位不一致")
  214. return
  215. }
  216. sourName = "同差值"
  217. edbInfo, err = models.AddCalculateTcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  218. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
  219. sourName = "N数值移动平均计算"
  220. edbInfo, err = models.AddCalculateNszydpjjs(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  221. case utils.DATA_SOURCE_CALCULATE_HBZ:
  222. checkCount, tmpErr := models.GetLteZeroEdbDataCount(fromEdbInfo.Source, fromEdbInfo.SubSource, fromEdbInfoId)
  223. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  224. err = fmt.Errorf("判断环比值是否可计算失败")
  225. errMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  226. return
  227. }
  228. if checkCount > 0 {
  229. err = fmt.Errorf("原始数据中存在0或负数,该指标不能进行环比运算")
  230. errMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  231. return
  232. }
  233. sourName = "环比值"
  234. edbInfo, err = models.AddCalculateHbz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  235. case utils.DATA_SOURCE_CALCULATE_HCZ:
  236. sourName = "环差值"
  237. edbInfo, err = models.AddCalculateHcz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  238. case utils.DATA_SOURCE_CALCULATE_BP:
  239. sourName = utils.DATA_SOURCE_NAME_CALCULATE_BP
  240. edbInfo, err = models.AddCalculateBp(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  241. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  242. sourName = "时间移位"
  243. edbInfo, err = models.AddCalculateTimeShift(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  244. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  245. sourName = "直接拼接"
  246. if len(req.EdbInfoIdArr) != 1 {
  247. err = fmt.Errorf("请传入拼接日期之后的指标")
  248. errMsg = "请传入拼接日期之后的指标"
  249. return
  250. }
  251. secondEdbInfoReq := req.EdbInfoIdArr[0]
  252. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  253. if tmpErr != nil {
  254. err = fmt.Errorf("获取拼接日期之后的指标信息失败")
  255. errMsg = "获取拼接日期之后的指标信息失败:Err:" + tmpErr.Error()
  256. return
  257. }
  258. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  259. err = fmt.Errorf("两个指标不允许为同一个")
  260. errMsg = "两个指标不允许为同一个"
  261. return
  262. }
  263. edbInfo, err = models.AddCalculateZjpj(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  264. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
  265. sourName = "累计值同比拼接"
  266. if fromEdbInfo.Frequency != "月度" {
  267. err = fmt.Errorf("待拼接指标只能筛选月度指标")
  268. errMsg = "待拼接指标只能筛选月度指标"
  269. return
  270. }
  271. if len(req.EdbInfoIdArr) != 1 {
  272. err = fmt.Errorf("请传入同比值指标")
  273. errMsg = "请传入同比值指标"
  274. return
  275. }
  276. secondEdbInfoReq := req.EdbInfoIdArr[0]
  277. tbzEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  278. if tmpErr != nil {
  279. err = fmt.Errorf("获取同比值指标信息失败")
  280. errMsg = "获取同比值指标信息失败:Err:" + tmpErr.Error()
  281. return
  282. }
  283. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  284. err = fmt.Errorf("指标必须是传入同比值指标类型")
  285. errMsg = "指标必须是传入同比值指标类型"
  286. return
  287. }
  288. if tbzEdbInfo.Frequency != "月度" {
  289. err = fmt.Errorf("同比值指标只能筛选月度指标")
  290. errMsg = "同比值指标只能筛选月度指标"
  291. return
  292. }
  293. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  294. err = fmt.Errorf("两个指标不允许为同一个")
  295. errMsg = "两个指标不允许为同一个"
  296. return
  297. }
  298. edbInfo, err = models.AddCalculateLjztbpj(&req, fromEdbInfo, tbzEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  299. case utils.DATA_SOURCE_CALCULATE_CJJX:
  300. sourName = "超季节性"
  301. edbInfo, err = models.AddCalculateCjjx(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName, formulaInt)
  302. case utils.DATA_SOURCE_CALCULATE_NHCC:
  303. sourName = "拟合残差"
  304. secondEdbInfoReq := req.EdbInfoIdArr[1]
  305. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  306. if tmpErr != nil {
  307. err = fmt.Errorf("获取因变量的指标信息失败")
  308. errMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  309. return
  310. }
  311. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  312. err = fmt.Errorf("两个指标不允许为同一个")
  313. errMsg = "两个指标不允许为同一个"
  314. return
  315. }
  316. edbInfo, err, errMsg = models.AddCalculateNhcc(&req, fromEdbInfo, secondEdbInfo, edbCode, uniqueCode, nhccDate, sysUserId, sysUserName)
  317. case utils.DATA_SOURCE_CALCULATE_JP:
  318. if !models.CheckFrequency(fromEdbInfo.Frequency, req.Frequency) {
  319. err = fmt.Errorf("频度异常,不允许低频降频到高频")
  320. return
  321. }
  322. sourName = utils.DATA_SOURCE_NAME_CALCULATE_JP
  323. edbInfo, err = models.AddCalculateJp(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  324. case utils.DATA_SOURCE_CALCULATE_NH:
  325. sourName = utils.DATA_SOURCE_NAME_CALCULATE_NH
  326. edbInfo, err = models.AddCalculateNh(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  327. case utils.DATA_SOURCE_CALCULATE_KSZS:
  328. if len(req.EdbInfoIdArr) < 2 {
  329. err = fmt.Errorf("指标数量不能小于2个,请重新选择")
  330. errMsg = "指标数量不能小于2个,请重新选择"
  331. return
  332. }
  333. sourName = utils.DATA_SOURCE_NAME_CALCULATE_KSZS
  334. edbInfo, err = models.AddCalculateKszs(&req, edbCode, uniqueCode, sysUserId, sysUserName)
  335. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  336. if len(req.EdbInfoIdArr) < 2 {
  337. err = fmt.Errorf("指标数量不能小于2个,请重新选择")
  338. errMsg = "指标数量不能小于2个,请重新选择"
  339. return
  340. }
  341. sourName = utils.DATA_SOURCE_NAME_CALCULATE_CORRELATION
  342. edbInfo, err, errMsg = models.AddCalculateCorrelation(&req, edbCode, uniqueCode, sysUserId, sysUserName)
  343. case utils.DATA_SOURCE_CALCULATE_RJZ:
  344. if req.Frequency == "日度" {
  345. err = fmt.Errorf("日度指标无需进行日均值计算")
  346. return
  347. }
  348. if req.Frequency != fromEdbInfo.Frequency {
  349. err = fmt.Errorf("当前频度和原指标频度不一致")
  350. return
  351. }
  352. if req.Unit != fromEdbInfo.Unit {
  353. err = fmt.Errorf("单位只允许为和原指标频度保持一致,禁止选择其他单位")
  354. return
  355. }
  356. sourName = "日均值"
  357. edbInfo, err = models.AddCalculateRjz(&req, fromEdbInfo, edbCode, uniqueCode, sysUserId, sysUserName)
  358. default:
  359. baseEdbInfoModel = models.GetBaseEdbInfoModel(req.Source)
  360. if baseEdbInfoModel == nil {
  361. err = fmt.Errorf("无效计算方式")
  362. errMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  363. return
  364. }
  365. sourName = baseEdbInfoModel.GetSourceName()
  366. edbInfo, err, errMsg = baseEdbInfoModel.Add(addParam)
  367. }
  368. if err != nil {
  369. errMsg = "生成" + sourName + "失败 Err:" + err.Error() + errMsg
  370. err = fmt.Errorf("生成" + sourName + "失败")
  371. return
  372. }
  373. if edbInfo == nil {
  374. err = fmt.Errorf("生成" + sourName + "失败")
  375. errMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  376. return
  377. }
  378. edbInfoId = edbInfo.EdbInfoId
  379. {
  380. edbNameList, tErr := models.GetEdbInfoByName(req.EdbName)
  381. if tErr != nil {
  382. err = fmt.Errorf("保存失败")
  383. errMsg = "获取指标信息失败,Err:" + tErr.Error()
  384. return
  385. }
  386. if len(edbNameList) >= 2 {
  387. for _, v := range edbNameList {
  388. edbName := v.EdbName + "(" + v.SourceName + ")"
  389. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  390. if err != nil {
  391. errMsg = "修改指标名称失败,Err:" + err.Error()
  392. err = fmt.Errorf("保存失败")
  393. return
  394. }
  395. }
  396. }
  397. }
  398. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  399. if err != nil {
  400. return
  401. }
  402. oldEdbInfo := new(models.EdbInfo)
  403. oldEdbInfo.EdbInfoId = fromEdbInfoId
  404. oldEdbInfo.EdbName = oldEdbName
  405. oldEdbInfo.Frequency = oldFrequency
  406. oldEdbInfo.Unit = oldUnit
  407. newEdbInfoEditRecord := new(models.EdbInfoEditRecord)
  408. newEdbInfoEditRecord.EdbName = req.EdbName
  409. newEdbInfoEditRecord.Frequency = req.Frequency
  410. newEdbInfoEditRecord.Unit = req.Unit
  411. newEdbInfoEditRecord.OperateUserId = req.AdminId
  412. newEdbInfoEditRecord.OperateUserRealName = req.AdminName
  413. err = AddEditEdbInfoRcord(oldEdbInfo, newEdbInfoEditRecord)
  414. if err != nil {
  415. errMsg = "记录基础信息操作变更日志失败,Err:" + err.Error()
  416. err = fmt.Errorf("操作记录保存失败")
  417. return
  418. }
  419. go logic.UpdateEs(edbInfo.EdbInfoId)
  420. go DisableEdbInfoNoUpdate(edbInfo)
  421. return
  422. }
  423. func EdbCalculateBatchEdit(req models.EdbInfoCalculateBatchEditReq) (edbInfo *models.EdbInfo, uniqueCode string, err error, errMsg string) {
  424. req.EdbName = strings.Trim(req.EdbName, " ")
  425. if req.EdbName == "" {
  426. err = fmt.Errorf("指标名称不能为空")
  427. return
  428. }
  429. if req.Frequency == "" {
  430. err = fmt.Errorf("频率不能为空")
  431. return
  432. }
  433. if req.Unit == "" {
  434. err = fmt.Errorf("单位不能为空")
  435. return
  436. }
  437. if req.ClassifyId <= 0 {
  438. err = fmt.Errorf("请选择分类")
  439. return
  440. }
  441. if req.EdbInfoId <= 0 {
  442. err = fmt.Errorf("请选择指标")
  443. return
  444. }
  445. redisKey := fmt.Sprint("edb_lib:edb_info:calculate:batch:save:", req.Source, ":", req.EdbName)
  446. isExist := utils.Rc.IsExist(redisKey)
  447. if isExist {
  448. err = fmt.Errorf("指标正在处理,请勿重复提交")
  449. return
  450. } else {
  451. utils.Rc.SetNX(redisKey, 1, time.Second*300)
  452. defer func() {
  453. _ = utils.Rc.Delete(redisKey)
  454. }()
  455. }
  456. var condition string
  457. var pars []interface{}
  458. condition += " AND edb_name=? AND edb_info_id<>? "
  459. pars = append(pars, req.EdbName, req.EdbInfoId)
  460. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  461. if err != nil {
  462. err = fmt.Errorf("判断指标名称是否存在失败")
  463. errMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  464. return
  465. }
  466. if count > 0 {
  467. err = fmt.Errorf("指标名称已存在,请重新填写")
  468. errMsg = "指标名称已存在,请重新填写"
  469. return
  470. }
  471. edbInfo, err = models.GetEdbInfoById(req.EdbInfoId)
  472. if err != nil {
  473. if err.Error() == utils.ErrNoRow() {
  474. errMsg = "指标已被删除,请刷新页面:Err:" + err.Error()
  475. err = fmt.Errorf("指标已被删除,请刷新页面")
  476. return
  477. }
  478. errMsg = "获取指标信息失败:Err:" + err.Error()
  479. err = fmt.Errorf("获取指标信息失败")
  480. return
  481. }
  482. oldEdbName := edbInfo.EdbName
  483. oldFrequency := edbInfo.Frequency
  484. oldUnit := edbInfo.Unit
  485. fromEdbInfoId := req.FromEdbInfoId
  486. if req.Source <= 0 {
  487. req.Source = edbInfo.Source
  488. }
  489. var formulaInt int
  490. var nhccDate models.NhccDate // 拟合残差的日期
  491. switch req.Source {
  492. 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:
  493. if req.Formula == "" {
  494. err = fmt.Errorf("请填写N值")
  495. return
  496. }
  497. formulaInt, _ = strconv.Atoi(req.Formula)
  498. if formulaInt <= 0 {
  499. err = fmt.Errorf("N值输入错误,请重新输入")
  500. return
  501. }
  502. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  503. _, err = time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
  504. if err != nil {
  505. err = fmt.Errorf("拼接日期有误,请重新输入")
  506. return
  507. }
  508. case utils.DATA_SOURCE_CALCULATE_NHCC: //拟合残差指标
  509. if len(req.EdbInfoIdArr) != 2 {
  510. err = fmt.Errorf("选择的指标异常,请重新选择")
  511. return
  512. }
  513. fromEdbInfoId = req.EdbInfoIdArr[0].EdbInfoId
  514. timeList := strings.Split(req.Formula, ",")
  515. if len(timeList) != 2 {
  516. err = fmt.Errorf("选择时间有误,请重新输入")
  517. return
  518. }
  519. startDate, e := time.ParseInLocation(utils.FormatDate, timeList[0], time.Local)
  520. if e != nil {
  521. err = fmt.Errorf("开始日期有误,请重新输入")
  522. return
  523. }
  524. endDate, e := time.ParseInLocation(utils.FormatDate, timeList[1], time.Local)
  525. if e != nil {
  526. err = fmt.Errorf("结束日期有误,请重新输入")
  527. return
  528. }
  529. if utils.GetTimeSubDay(startDate, endDate) < 2 {
  530. err = fmt.Errorf("日期间隔不得少于两天")
  531. return
  532. }
  533. nhccDate.StartDate = startDate
  534. nhccDate.EndDate = endDate
  535. case utils.DATA_SOURCE_CALCULATE_JP:
  536. if req.Formula != "期末值" && req.Formula != "平均值" {
  537. err = fmt.Errorf("数据取值类型错误:" + req.Formula)
  538. return
  539. }
  540. case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
  541. if req.Formula == "" {
  542. err = fmt.Errorf("请填写alpha值")
  543. return
  544. }
  545. a, e := strconv.ParseFloat(req.Formula, 64)
  546. if e != nil {
  547. err = fmt.Errorf("alpha值输入错误, 请重新输入")
  548. return
  549. }
  550. if a <= 0 || a >= 1 {
  551. err = fmt.Errorf("alpha值输入错误, 请重新输入")
  552. return
  553. }
  554. }
  555. var fromEdbInfo *models.EdbInfo
  556. if fromEdbInfoId > 0 {
  557. fromEdbInfo, err = models.GetEdbInfoById(fromEdbInfoId)
  558. if err != nil {
  559. errMsg = "获取指标信息失败:Err:" + err.Error()
  560. err = fmt.Errorf("获取指标信息失败")
  561. return
  562. }
  563. }
  564. var sourName string
  565. var edbInfoId int
  566. var baseEdbInfoModel models.BaseEdbInfoInterface
  567. editParams := models.EditCalculateBatchParams{
  568. Req: &req,
  569. EdbInfo: edbInfo,
  570. FromEdbInfo: fromEdbInfo,
  571. }
  572. switch req.Source {
  573. case utils.DATA_SOURCE_CALCULATE_LJZZY:
  574. sourName = "累计值转月值"
  575. if fromEdbInfo.Frequency != "月度" {
  576. err = fmt.Errorf("请选择月度指标")
  577. return
  578. }
  579. err = models.EditCalculateLjzzy(edbInfo, &req, fromEdbInfo)
  580. case utils.DATA_SOURCE_CALCULATE_TBZ:
  581. sourName = "同比值"
  582. err = models.EditCalculateTbz(edbInfo, &req, fromEdbInfo)
  583. case utils.DATA_SOURCE_CALCULATE_TCZ:
  584. fmt.Println("start edit", time.Now())
  585. sourName = "同差值"
  586. err = models.EditCalculateTcz(edbInfo, &req, fromEdbInfo)
  587. fmt.Println("end edit", time.Now())
  588. case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
  589. sourName = "N数值移动平均计算"
  590. err = models.EditCalculateNszydpjjs(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  591. case utils.DATA_SOURCE_CALCULATE_HBZ:
  592. checkCount, tmpErr := models.GetLteZeroEdbDataCount(fromEdbInfo.Source, fromEdbInfo.SubSource, req.FromEdbInfoId)
  593. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  594. errMsg = "判断环比值是否可计算失败,Err:" + tmpErr.Error()
  595. err = fmt.Errorf("判断环比值是否可计算失败")
  596. return
  597. }
  598. if checkCount > 0 {
  599. err = fmt.Errorf("原始数据中存在0或负数,该指标不能进行环比运算")
  600. errMsg = "原始数据中出现0和负值时,提示该指标不能进行环比运算"
  601. return
  602. }
  603. sourName = "环比值"
  604. err = models.EditCalculateHbz(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  605. case utils.DATA_SOURCE_CALCULATE_HCZ:
  606. sourName = "环差值"
  607. err = models.EditCalculateHcz(edbInfo, &req, fromEdbInfo, formulaInt, edbInfo.CalculateFormula)
  608. case utils.DATA_SOURCE_CALCULATE_BP:
  609. sourName = utils.DATA_SOURCE_NAME_CALCULATE_BP
  610. err = models.EditCalculateBp(edbInfo, &req, fromEdbInfo)
  611. case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
  612. sourName = "时间移位"
  613. err = models.EditCalculateTimeShift(edbInfo, &req, fromEdbInfo)
  614. case utils.DATA_SOURCE_CALCULATE_ZJPJ:
  615. sourName = "直接拼接"
  616. if len(req.EdbInfoIdArr) != 1 {
  617. err = fmt.Errorf("请传入拼接日期之后的指标")
  618. errMsg = "请传入拼接日期之后的指标"
  619. return
  620. }
  621. secondEdbInfoReq := req.EdbInfoIdArr[0]
  622. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  623. if tmpErr != nil {
  624. errMsg = "获取拼接日期之后的指标信息失败:Err:" + tmpErr.Error()
  625. err = fmt.Errorf("获取拼接日期之后的指标信息失败")
  626. return
  627. }
  628. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  629. err = fmt.Errorf("两个指标不允许为同一个")
  630. errMsg = "两个指标不允许为同一个"
  631. return
  632. }
  633. err = models.EditCalculateZjpj(&req, edbInfo, fromEdbInfo, secondEdbInfo)
  634. case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //累计值同比拼接
  635. sourName = "累计值同比拼接"
  636. if fromEdbInfo.Frequency != "月度" {
  637. errMsg = "待拼接指标只能筛选月度指标"
  638. err = fmt.Errorf("待拼接指标只能筛选月度指标")
  639. return
  640. }
  641. if len(req.EdbInfoIdArr) != 1 {
  642. errMsg = "请传入同比值指标"
  643. err = fmt.Errorf("请传入同比值指标")
  644. return
  645. }
  646. secondEdbInfoReq := req.EdbInfoIdArr[0]
  647. tbzEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  648. if tmpErr != nil {
  649. errMsg = "获取同比值指标信息失败:Err:" + tmpErr.Error()
  650. err = fmt.Errorf("获取同比值指标信息失败")
  651. return
  652. }
  653. if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
  654. err = fmt.Errorf("指标必须是传入同比值指标类型")
  655. errMsg = "指标必须是传入同比值指标类型"
  656. return
  657. }
  658. if tbzEdbInfo.Frequency != "月度" {
  659. err = fmt.Errorf("同比值指标只能筛选月度指标")
  660. errMsg = "同比值指标只能筛选月度指标"
  661. return
  662. }
  663. if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
  664. err = fmt.Errorf("两个指标不允许为同一个")
  665. errMsg = "两个指标不允许为同一个"
  666. return
  667. }
  668. err = models.EditCalculateLjztbpj(&req, edbInfo, fromEdbInfo, tbzEdbInfo)
  669. case utils.DATA_SOURCE_CALCULATE_CJJX:
  670. sourName = "超季节性"
  671. err = models.EditCalculateCjjx(&req, edbInfo, fromEdbInfo, formulaInt)
  672. case utils.DATA_SOURCE_CALCULATE_NHCC:
  673. sourName = "拟合残差"
  674. secondEdbInfoReq := req.EdbInfoIdArr[1]
  675. secondEdbInfo, tmpErr := models.GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
  676. if tmpErr != nil {
  677. errMsg = "获取因变量的指标信息失败:Err:" + tmpErr.Error()
  678. err = fmt.Errorf("获取因变量的指标信息失败")
  679. return
  680. }
  681. if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
  682. err = fmt.Errorf("两个指标不允许为同一个")
  683. errMsg = "两个指标不允许为同一个"
  684. return
  685. }
  686. err, errMsg = models.EditCalculateNhcc(&req, edbInfo, fromEdbInfo, secondEdbInfo, nhccDate)
  687. case utils.DATA_SOURCE_CALCULATE_JP:
  688. if !models.CheckFrequency(fromEdbInfo.Frequency, req.Frequency) {
  689. err = fmt.Errorf("频度异常,不允许低频降频到高频")
  690. return
  691. }
  692. sourName = utils.DATA_SOURCE_NAME_CALCULATE_JP
  693. err = models.EditCalculateJp(edbInfo, &req, fromEdbInfo)
  694. case utils.DATA_SOURCE_CALCULATE_NH:
  695. sourName = utils.DATA_SOURCE_NAME_CALCULATE_NH
  696. err = models.EditCalculateNh(edbInfo, &req, fromEdbInfo)
  697. case utils.DATA_SOURCE_CALCULATE_KSZS:
  698. if len(req.EdbInfoIdArr) < 2 {
  699. err = fmt.Errorf("指标数量不能小于2个,请重新选择")
  700. errMsg = "指标数量不能小于2个,请重新选择"
  701. return
  702. }
  703. sourName = utils.DATA_SOURCE_NAME_CALCULATE_KSZS
  704. err = models.EditCalculateKszs(edbInfo, &req)
  705. case utils.DATA_SOURCE_CALCULATE_CORRELATION:
  706. if len(req.EdbInfoIdArr) < 2 {
  707. err = fmt.Errorf("指标数量不能小于2个,请重新选择")
  708. errMsg = "指标数量不能小于2个,请重新选择"
  709. return
  710. }
  711. sourName = utils.DATA_SOURCE_NAME_CALCULATE_CORRELATION
  712. err, errMsg = models.EditCalculateCorrelation(edbInfo, &req)
  713. case utils.DATA_SOURCE_CALCULATE_RJZ:
  714. if req.Frequency == "日度" {
  715. err = fmt.Errorf("日度指标无需进行日均值计算")
  716. return
  717. }
  718. if req.Frequency != fromEdbInfo.Frequency {
  719. err = fmt.Errorf("当前频度和原指标频度不一致")
  720. return
  721. }
  722. if req.Unit != fromEdbInfo.Unit {
  723. err = fmt.Errorf("单位只允许为和原指标频度保持一致,禁止选择其他单位")
  724. return
  725. }
  726. sourName = "日均值"
  727. err = models.EditCalculateRjz(edbInfo, &req, fromEdbInfo)
  728. default:
  729. baseEdbInfoModel = models.GetBaseEdbInfoModel(req.Source)
  730. if baseEdbInfoModel == nil {
  731. err = fmt.Errorf("无效计算方式")
  732. errMsg = "无效计算方式,source:" + strconv.Itoa(req.Source)
  733. return
  734. }
  735. sourName = baseEdbInfoModel.GetSourceName()
  736. err, errMsg = baseEdbInfoModel.Edit(editParams)
  737. }
  738. if err != nil {
  739. errMsg = "生成" + sourName + "失败 Err:" + err.Error() + errMsg
  740. err = fmt.Errorf("生成" + sourName + "失败")
  741. return
  742. }
  743. if edbInfo == nil {
  744. err = fmt.Errorf("生成" + sourName + "失败")
  745. errMsg = "生成" + sourName + "失败,指标ID错误:" + strconv.Itoa(edbInfoId)
  746. return
  747. }
  748. edbInfoId = edbInfo.EdbInfoId
  749. uniqueCode = edbInfo.UniqueCode
  750. {
  751. edbNameList, tErr := models.GetEdbInfoByName(req.EdbName)
  752. if tErr != nil {
  753. err = fmt.Errorf("保存失败")
  754. errMsg = "获取指标信息失败,Err:" + tErr.Error()
  755. return
  756. }
  757. if len(edbNameList) >= 2 {
  758. for _, v := range edbNameList {
  759. edbName := v.EdbName + "(" + v.SourceName + ")"
  760. err = models.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
  761. if err != nil {
  762. errMsg = "修改指标名称失败,Err:" + err.Error()
  763. err = fmt.Errorf("保存失败")
  764. return
  765. }
  766. }
  767. }
  768. }
  769. err, errMsg = models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
  770. if err != nil {
  771. return
  772. }
  773. oldEdbInfo := new(models.EdbInfo)
  774. oldEdbInfo.EdbInfoId = edbInfoId
  775. oldEdbInfo.EdbName = oldEdbName
  776. oldEdbInfo.Frequency = oldFrequency
  777. oldEdbInfo.Unit = oldUnit
  778. newEdbInfoEditRecord := new(models.EdbInfoEditRecord)
  779. newEdbInfoEditRecord.EdbName = req.EdbName
  780. newEdbInfoEditRecord.Frequency = req.Frequency
  781. newEdbInfoEditRecord.Unit = req.Unit
  782. newEdbInfoEditRecord.OperateUserId = req.AdminId
  783. newEdbInfoEditRecord.OperateUserRealName = req.AdminName
  784. err = AddEditEdbInfoRcord(oldEdbInfo, newEdbInfoEditRecord)
  785. if err != nil {
  786. errMsg = "记录基础信息操作变更日志失败,Err:" + err.Error()
  787. err = fmt.Errorf("操作记录保存失败")
  788. return
  789. }
  790. go logic.UpdateEs(edbInfo.EdbInfoId)
  791. go ResetEdbRelation(edbInfoId)
  792. return
  793. }
  794. func EdbCalculateAdd(req models.EdbInfoCalculateSaveReq, lang string) (edbInfo *models.EdbInfo, uniqueCode string, err error, errMsg string) {
  795. calculateFormula := req.CalculateFormula
  796. calculateFormula = strings.Replace(calculateFormula, "(", "(", -1)
  797. calculateFormula = strings.Replace(calculateFormula, ")", ")", -1)
  798. calculateFormula = strings.Replace(calculateFormula, ",", ",", -1)
  799. calculateFormula = strings.Replace(calculateFormula, "。", ".", -1)
  800. calculateFormula = strings.Replace(calculateFormula, "%", "*0.01", -1)
  801. req.CalculateFormula = calculateFormula
  802. edbInfoMap := make(map[int]string)
  803. {
  804. upperCalculateFormulaStr := strings.ToUpper(req.CalculateFormula)
  805. newEdbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  806. for _, tmpEdbInfo := range req.EdbInfoIdArr {
  807. _, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
  808. if ok {
  809. err = fmt.Errorf("选择指标失败,请勿选择重复指标!")
  810. return
  811. }
  812. edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag
  813. upperFromTag := strings.ToUpper(tmpEdbInfo.FromTag)
  814. if strings.Contains(upperCalculateFormulaStr, upperFromTag) {
  815. newEdbInfoIdArr = append(newEdbInfoIdArr, tmpEdbInfo)
  816. }
  817. }
  818. req.EdbInfoIdArr = newEdbInfoIdArr
  819. }
  820. existEdbName, err := logic.CheckExistByEdbNameAndEdbInfoId(utils.EDB_INFO_TYPE, 0, req.EdbName, lang)
  821. if err != nil {
  822. errMsg = "判断指标名称是否存在失败,Err:" + err.Error()
  823. err = fmt.Errorf("判断指标名称是否存在失败")
  824. return
  825. }
  826. if existEdbName {
  827. errMsg = "指标名称已存在,请重新填写"
  828. err = fmt.Errorf(errMsg)
  829. return
  830. }
  831. var formulaStr string
  832. var edbInfoIdBytes []string
  833. for _, v := range req.EdbInfoIdArr {
  834. formulaStr += v.FromTag + ","
  835. edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
  836. }
  837. formulaSlice, err := utils.CheckFormulaJson(req.CalculateFormula)
  838. if err != nil {
  839. err = fmt.Errorf("公式格式错误,请重新填写")
  840. return
  841. }
  842. for _, formula := range formulaSlice {
  843. formulaMap, e := utils.CheckFormula(formula)
  844. if e != nil {
  845. err = fmt.Errorf("公式错误,请重新填写")
  846. return
  847. }
  848. for _, v := range formulaMap {
  849. if !strings.Contains(formulaStr, v) {
  850. err = fmt.Errorf("公式错误,请重新填写")
  851. return
  852. }
  853. }
  854. }
  855. edbInfoList := make([]*models.EdbInfo, 0)
  856. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  857. for k, v := range req.EdbInfoIdArr {
  858. fromEdbInfo, e := models.GetEdbInfoById(v.EdbInfoId)
  859. if e != nil {
  860. if e.Error() == utils.ErrNoRow() {
  861. err = fmt.Errorf("生成计算指标失败")
  862. errMsg = "指标 " + strconv.Itoa(v.EdbInfoId) + " 不存在"
  863. return
  864. }
  865. err = fmt.Errorf("生成计算指标失败")
  866. errMsg = "获取指标失败:Err:" + e.Error()
  867. return
  868. }
  869. edbInfoList = append(edbInfoList, fromEdbInfo)
  870. {
  871. calculateMappingItem := &models.EdbInfoCalculateMapping{
  872. EdbInfoCalculateMappingId: 0,
  873. EdbInfoId: 0,
  874. Source: utils.DATA_SOURCE_CALCULATE,
  875. SourceName: "指标运算",
  876. EdbCode: "",
  877. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  878. FromEdbCode: fromEdbInfo.EdbCode,
  879. FromEdbName: fromEdbInfo.EdbName,
  880. FromSource: fromEdbInfo.Source,
  881. FromSourceName: fromEdbInfo.SourceName,
  882. FromTag: v.FromTag,
  883. Sort: k + 1,
  884. CreateTime: time.Now(),
  885. ModifyTime: time.Now(),
  886. }
  887. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  888. }
  889. }
  890. for _, v := range formulaSlice {
  891. formulaMap, e := utils.CheckFormula(v)
  892. if e != nil {
  893. err = fmt.Errorf("公式错误,请重新填写")
  894. return
  895. }
  896. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, v, edbInfoIdBytes)
  897. if !ok {
  898. err = fmt.Errorf("生成计算指标失败,请使用正确的计算公式")
  899. return
  900. }
  901. }
  902. edbCode, err := utils.GenerateEdbCode(1, "")
  903. if err != nil {
  904. errMsg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  905. err = fmt.Errorf("指标编码生成失败,Err:" + err.Error())
  906. return
  907. }
  908. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  909. uniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
  910. edbInfo, err = models.AddCalculateInfo(req, calculateMappingList, edbInfoList, edbCode, uniqueCode, edbInfoIdBytes)
  911. if err != nil {
  912. errMsg = "生成计算指标失败,AddEdbInfo Err:" + err.Error()
  913. err = fmt.Errorf("生成计算指标失败")
  914. return
  915. }
  916. go DisableEdbInfoNoUpdate(edbInfo)
  917. return
  918. }
  919. func StepCalculate(dataList []*models.EdbInfoSearchData, calculates []models.CalculatesReq) (resultData map[string]float64, dates []string, errMsg string, err error) {
  920. sort.Slice(calculates, func(i, j int) bool {
  921. return calculates[i].Sort < calculates[j].Sort
  922. })
  923. originData, e := models.EdbInfoSearchDataToData(dataList)
  924. if e != nil {
  925. err = fmt.Errorf("基础数据转换异常, err: %v", e)
  926. return
  927. }
  928. calculateData := originData
  929. dateDataMap := make(map[time.Time]float64)
  930. for _, v := range calculates {
  931. baseCalculate := models.BaseCalculate{
  932. DataList: calculateData,
  933. Frequency: v.Frequency,
  934. Formula: v.Formula,
  935. Calendar: v.Calendar,
  936. MoveType: v.MoveType,
  937. MoveFrequency: v.MoveFrequency,
  938. FromFrequency: v.FromFrequency,
  939. Source: v.Source,
  940. }
  941. switch baseCalculate.Source {
  942. case utils.EdbBaseCalculateLjzzy:
  943. dateDataMap, e, errMsg = baseCalculate.Ljzzy()
  944. case utils.EdbBaseCalculateLjzzj:
  945. dateDataMap, e, errMsg = baseCalculate.Ljzzj()
  946. case utils.EdbBaseCalculateTbz:
  947. dateDataMap, e, errMsg = baseCalculate.Tbz()
  948. case utils.EdbBaseCalculateTcz:
  949. dateDataMap, e, errMsg = baseCalculate.Tcz()
  950. case utils.EdbBaseCalculateNszydpjjs:
  951. dateDataMap, e, errMsg = baseCalculate.Nszydpjjs()
  952. case utils.EdbBaseCalculateHbz:
  953. dateDataMap, e, errMsg = baseCalculate.Hbz()
  954. case utils.EdbBaseCalculateHcz:
  955. dateDataMap, e, errMsg = baseCalculate.Hcz()
  956. case utils.EdbBaseCalculateUpFrequency:
  957. dateDataMap, e, errMsg = baseCalculate.UpFrequency()
  958. case utils.EdbBaseCalculateDownFrequency:
  959. dateDataMap, e, errMsg = baseCalculate.DownFrequency()
  960. case utils.EdbBaseCalculateTimeShift:
  961. dateDataMap, e, errMsg = baseCalculate.TimeShift()
  962. case utils.EdbBaseCalculateCjjx:
  963. dateDataMap, e, errMsg = baseCalculate.Cjjx()
  964. case utils.EdbBaseCalculateAnnualized:
  965. dateDataMap, e, errMsg = baseCalculate.Annualized()
  966. case utils.EdbBaseCalculateLjz:
  967. dateDataMap, e, errMsg = baseCalculate.Ljz()
  968. case utils.EdbBaseCalculateLjzNczj:
  969. dateDataMap, e, errMsg = baseCalculate.LjzNczj()
  970. case utils.EdbBaseCalculateExponentialSmoothing:
  971. dateDataMap, e, errMsg = baseCalculate.ExponentialSmoothing()
  972. case utils.EdbBaseCalculateRjz:
  973. dateDataMap, e, errMsg = baseCalculate.Rjz()
  974. default:
  975. errMsg = "计算方式无效"
  976. e = fmt.Errorf("%s:%d", errMsg, baseCalculate.Source)
  977. }
  978. if e != nil {
  979. err = fmt.Errorf("计算失败, err: %v", e)
  980. return
  981. }
  982. calculateData = models.TransDateData2EdbData(dateDataMap)
  983. }
  984. resultData, dates = models.GetDateDataAndDateList(dateDataMap)
  985. return
  986. }