predict_edb.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. package logic
  2. import (
  3. "errors"
  4. "hongze/hongze_edb_lib/models"
  5. "hongze/hongze_edb_lib/services"
  6. "hongze/hongze_edb_lib/utils"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // AddPredictEdbInfo 新增预测指标
  12. func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName string, ruleList []models.RuleConfig, sysUserId int, sysUserName string) (edbInfo *models.EdbInfo, err error, errMsg string) {
  13. var sourceEdbInfo *models.EdbInfo
  14. // 来源指标信息校验
  15. {
  16. sourceEdbInfo, err = models.GetEdbInfoById(sourceEdbInfoId)
  17. if err != nil && err.Error() != utils.ErrNoRow() {
  18. errMsg = "新增失败"
  19. err = errors.New("获取来源指标失败,Err:" + err.Error())
  20. return
  21. }
  22. if sourceEdbInfo == nil {
  23. errMsg = "找不到该来源指标"
  24. err = errors.New(errMsg)
  25. return
  26. }
  27. //必须是普通的指标
  28. if sourceEdbInfo.EdbInfoType != 0 {
  29. errMsg = "来源指标异常,不是普通的指标"
  30. err = errors.New(errMsg)
  31. return
  32. }
  33. if !utils.InArrayByStr([]string{"日度", "周度", "月度", "年度"}, sourceEdbInfo.Frequency) {
  34. errMsg = "预测指标只支持选择日度、周度、月度、年度的指标"
  35. err = errors.New(errMsg)
  36. return
  37. }
  38. }
  39. var classifyInfo *models.EdbClassify
  40. // 来源分类信息校验
  41. {
  42. classifyInfo, err = models.GetEdbClassifyById(classifyId)
  43. if err != nil && err.Error() != utils.ErrNoRow() {
  44. errMsg = "新增失败"
  45. err = errors.New("获取预测指标分类失败,Err:" + err.Error())
  46. return
  47. }
  48. if classifyInfo == nil {
  49. errMsg = "找不到该预测指标分类"
  50. err = errors.New(errMsg)
  51. return
  52. }
  53. //必须是预测指标分类
  54. if classifyInfo.ClassifyType != 1 {
  55. errMsg = "预测指标分类异常,不是预测指标分类"
  56. err = errors.New(errMsg)
  57. return
  58. }
  59. }
  60. edbName = strings.Trim(edbName, " ")
  61. edbCode := sourceEdbInfo.EdbCode + "_" + time.Now().Format(utils.FormatShortDateTimeUnSpace)
  62. //判断指标名称是否存在
  63. var condition string
  64. var pars []interface{}
  65. condition += " AND edb_info_type=? "
  66. pars = append(pars, 1)
  67. condition += " AND edb_name=? "
  68. pars = append(pars, edbName)
  69. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  70. if err != nil {
  71. errMsg = "判断指标名称是否存在失败"
  72. err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
  73. return
  74. }
  75. if count > 0 {
  76. errMsg = "指标名称已存在,请重新填写"
  77. err = errors.New(errMsg)
  78. return
  79. }
  80. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  81. edbInfo = &models.EdbInfo{
  82. //EdbInfoId: 0,
  83. EdbInfoType: 1,
  84. SourceName: "预测指标",
  85. Source: utils.DATA_SOURCE_PREDICT,
  86. EdbCode: edbCode,
  87. EdbName: edbName,
  88. EdbNameSource: edbName,
  89. Frequency: sourceEdbInfo.Frequency,
  90. Unit: sourceEdbInfo.Unit,
  91. StartDate: sourceEdbInfo.StartDate,
  92. ClassifyId: classifyId,
  93. SysUserId: sysUserId,
  94. SysUserRealName: sysUserName,
  95. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  96. CreateTime: time.Now(),
  97. ModifyTime: time.Now(),
  98. MinValue: sourceEdbInfo.MinValue,
  99. MaxValue: sourceEdbInfo.MaxValue,
  100. CalculateFormula: sourceEdbInfo.CalculateFormula,
  101. EdbType: 1,
  102. //Sort: sourceEdbInfo.,
  103. LatestDate: sourceEdbInfo.LatestDate,
  104. LatestValue: sourceEdbInfo.LatestValue,
  105. MoveType: sourceEdbInfo.MoveType,
  106. MoveFrequency: sourceEdbInfo.MoveFrequency,
  107. NoUpdate: sourceEdbInfo.NoUpdate,
  108. ServerUrl: "",
  109. }
  110. // 关联关系表
  111. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  112. fromEdbMap := make(map[int]int)
  113. // 源指标关联关系表
  114. calculateMappingItem := &models.EdbInfoCalculateMapping{
  115. //EdbInfoCalculateMappingId: 0,
  116. //EdbInfoId: 0,
  117. Source: edbInfo.Source,
  118. SourceName: edbInfo.SourceName,
  119. EdbCode: edbInfo.EdbCode,
  120. FromEdbInfoId: sourceEdbInfo.EdbInfoId,
  121. FromEdbCode: sourceEdbInfo.EdbCode,
  122. FromEdbName: sourceEdbInfo.EdbName,
  123. FromSource: sourceEdbInfo.Source,
  124. FromSourceName: sourceEdbInfo.SourceName,
  125. //FromTag: "",
  126. Sort: 1,
  127. CreateTime: time.Now(),
  128. ModifyTime: time.Now(),
  129. }
  130. fromEdbMap[sourceEdbInfoId] = sourceEdbInfoId
  131. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  132. // 动态环差 计算列表
  133. calculateRuleList := make([]models.CalculateRule, 0)
  134. // 预测指标配置
  135. predictEdbConfList := make([]*models.PredictEdbConf, 0)
  136. for _, v := range ruleList {
  137. // 预测指标配置
  138. ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  139. if tmpErr != nil {
  140. errMsg = "规则配置的截止日期异常,请重新填写"
  141. err = errors.New(errMsg)
  142. return
  143. }
  144. //1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差,10:根据 给定终值后插值 规则获取预测数据,11:根据 季节性 规则获取预测数据,12:根据 移动平均同比 规则获取预测数据
  145. // 环比、环差、动态环差、季节性、移动平均同比不支持年度
  146. if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) {
  147. errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标"
  148. err = errors.New(errMsg)
  149. return
  150. }
  151. switch v.RuleType {
  152. case 8: //N期段线性外推值
  153. valInt, tmpErr := strconv.Atoi(v.Value)
  154. if tmpErr != nil {
  155. errMsg = "N期段线性外推值的N值异常"
  156. err = errors.New(errMsg)
  157. return
  158. }
  159. if valInt <= 1 {
  160. errMsg = "N期段线性外推值的N值必须大于1"
  161. err = errors.New(errMsg)
  162. return
  163. }
  164. case 9: //9:动态环差
  165. if v.Value == "" {
  166. errMsg = "请填写计算规则"
  167. err = errors.New(errMsg)
  168. return
  169. }
  170. formula := v.Value
  171. formula = strings.Replace(formula, "(", "(", -1)
  172. formula = strings.Replace(formula, ")", ")", -1)
  173. formula = strings.Replace(formula, ",", ",", -1)
  174. formula = strings.Replace(formula, "。", ".", -1)
  175. formula = strings.Replace(formula, "%", "*0.01", -1)
  176. v.Value = formula
  177. //检验公式
  178. var formulaStr string
  179. var edbInfoIdBytes []string
  180. for _, tmpEdbInfoId := range v.EdbInfoIdArr {
  181. formulaStr += tmpEdbInfoId.FromTag + ","
  182. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  183. }
  184. formulaMap := services.CheckFormula(formula)
  185. for _, formula := range formulaMap {
  186. if !strings.Contains(formulaStr, formula) {
  187. errMsg = "公式错误,请重新填写"
  188. err = errors.New(errMsg)
  189. return
  190. }
  191. }
  192. //关联的指标信息
  193. edbInfoList := make([]*models.EdbInfo, 0)
  194. // 动态环差规则 关系表
  195. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  196. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  197. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  198. if tmpErr != nil {
  199. err = tmpErr
  200. if err.Error() == utils.ErrNoRow() {
  201. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  202. err = errors.New(errMsg)
  203. return
  204. }
  205. errMsg = "获取指标失败:Err:" + err.Error()
  206. err = errors.New(errMsg)
  207. return
  208. }
  209. edbInfoList = append(edbInfoList, fromEdbInfo)
  210. //总的 预测指标与所有相关联指标的关系表(不仅仅该条规则)
  211. {
  212. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  213. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  214. calculateMappingItem := &models.EdbInfoCalculateMapping{
  215. EdbInfoCalculateMappingId: 0,
  216. EdbInfoId: 0,
  217. Source: utils.DATA_SOURCE_CALCULATE,
  218. SourceName: "指标运算",
  219. EdbCode: "",
  220. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  221. FromEdbCode: fromEdbInfo.EdbCode,
  222. FromEdbName: fromEdbInfo.EdbName,
  223. FromSource: fromEdbInfo.Source,
  224. FromSourceName: fromEdbInfo.SourceName,
  225. //FromTag: tmpEdbInfoId.FromTag,
  226. Sort: k + 1,
  227. CreateTime: time.Now(),
  228. ModifyTime: time.Now(),
  229. }
  230. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  231. }
  232. }
  233. // 动态环差规则 关系表
  234. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  235. //PredictEdbConfCalculateMappingId: 0,
  236. EdbInfoId: 0,
  237. ConfigId: 0,
  238. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  239. FromEdbCode: fromEdbInfo.EdbCode,
  240. FromEdbName: fromEdbInfo.EdbName,
  241. FromSource: fromEdbInfo.Source,
  242. FromSourceName: fromEdbInfo.SourceName,
  243. FromTag: tmpEdbInfoId.FromTag,
  244. Sort: k + 1,
  245. CreateTime: time.Now(),
  246. ModifyTime: time.Now(),
  247. }
  248. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  249. }
  250. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
  251. if !ok {
  252. errMsg = "生成计算指标失败,请使用正确的计算公式"
  253. err = errors.New(errMsg)
  254. return
  255. }
  256. calculateRuleList = append(calculateRuleList, models.CalculateRule{
  257. TrendsCalculateMappingList: trendsMappingList,
  258. EdbInfoList: edbInfoList,
  259. EdbInfoIdBytes: edbInfoIdBytes,
  260. Formula: formula,
  261. RuleType: v.RuleType,
  262. EndDate: v.EndDate,
  263. EdbInfoIdArr: v.EdbInfoIdArr,
  264. })
  265. }
  266. tmpPredictEdbConf := &models.PredictEdbConf{
  267. PredictEdbInfoId: 0,
  268. SourceEdbInfoId: sourceEdbInfoId,
  269. RuleType: v.RuleType,
  270. //FixedValue: v.Value,
  271. Value: v.Value,
  272. EndDate: ruleEndDate,
  273. ModifyTime: time.Now(),
  274. CreateTime: time.Now(),
  275. }
  276. edbInfo.EndDate = v.EndDate
  277. predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
  278. }
  279. err = models.AddPredictEdb(edbInfo, calculateMappingList, predictEdbConfList, calculateRuleList)
  280. return
  281. }
  282. // EditPredictEdbInfo 编辑预测指标
  283. func EditPredictEdbInfo(edbInfoId, classifyId int, edbName string, ruleList []models.RuleConfig) (edbInfo *models.EdbInfo, err error, errMsg string) {
  284. // 指标信息校验
  285. {
  286. edbInfo, err = models.GetEdbInfoById(edbInfoId)
  287. if err != nil && err.Error() != utils.ErrNoRow() {
  288. errMsg = "修改失败"
  289. err = errors.New("获取预测指标失败,Err:" + err.Error())
  290. return
  291. }
  292. if edbInfo == nil {
  293. errMsg = "找不到该预测指标"
  294. err = errors.New(errMsg)
  295. return
  296. }
  297. //必须是普通的指标
  298. if edbInfo.EdbInfoType != 1 {
  299. errMsg = "指标异常,不是预测指标"
  300. err = errors.New(errMsg)
  301. return
  302. }
  303. }
  304. var predictEdbConf *models.PredictEdbConf
  305. // 指标配置信息校验
  306. {
  307. // 查找该预测指标配置
  308. predictEdbConfList, tmpErr := models.GetPredictEdbConfListById(edbInfo.EdbInfoId)
  309. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  310. errMsg = "修改失败"
  311. err = errors.New("获取预测指标配置信息失败,Err:" + tmpErr.Error())
  312. return
  313. }
  314. if len(predictEdbConfList) == 0 {
  315. errMsg = "找不到该预测指标配置"
  316. err = errors.New(errMsg)
  317. return
  318. }
  319. predictEdbConf = predictEdbConfList[0]
  320. }
  321. //判断指标名称是否存在
  322. var condition string
  323. var pars []interface{}
  324. condition += " AND edb_info_id<>? "
  325. pars = append(pars, edbInfoId)
  326. condition += " AND edb_info_type=? "
  327. pars = append(pars, 1)
  328. condition += " AND edb_name=? "
  329. pars = append(pars, edbName)
  330. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  331. if err != nil {
  332. errMsg = "判断指标名称是否存在失败"
  333. err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
  334. return
  335. }
  336. if count > 0 {
  337. errMsg = "指标名称已存在,请重新填写"
  338. err = errors.New(errMsg)
  339. return
  340. }
  341. edbInfo.EdbName = edbName
  342. edbInfo.EdbNameSource = edbName
  343. edbInfo.ClassifyId = classifyId
  344. edbInfo.ModifyTime = time.Now()
  345. updateEdbInfoCol := []string{"EdbName", "EdbNameSource", "ClassifyId", "EndDate", "ModifyTime"}
  346. var sourceEdbInfo *models.EdbInfo
  347. // 来源指标信息校验
  348. {
  349. sourceEdbInfo, err = models.GetEdbInfoById(predictEdbConf.SourceEdbInfoId)
  350. if err != nil && err.Error() != utils.ErrNoRow() {
  351. errMsg = "新增失败"
  352. err = errors.New("获取来源指标失败,Err:" + err.Error())
  353. return
  354. }
  355. if sourceEdbInfo == nil {
  356. errMsg = "找不到该来源指标"
  357. err = errors.New(errMsg)
  358. return
  359. }
  360. //必须是普通的指标
  361. if sourceEdbInfo.EdbInfoType != 0 {
  362. errMsg = "来源指标异常,不是普通的指标"
  363. err = errors.New(errMsg)
  364. return
  365. }
  366. if !utils.InArrayByStr([]string{"日度", "周度", "月度", "年度"}, sourceEdbInfo.Frequency) {
  367. errMsg = "预测指标只支持选择日度、周度、月度、年度的指标"
  368. err = errors.New(errMsg)
  369. return
  370. }
  371. }
  372. // 预测指标配置
  373. // 关联关系表
  374. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  375. fromEdbMap := make(map[int]int)
  376. // 源指标关联关系表
  377. calculateMappingItem := &models.EdbInfoCalculateMapping{
  378. //EdbInfoCalculateMappingId: 0,
  379. EdbInfoId: edbInfoId,
  380. Source: edbInfo.Source,
  381. SourceName: edbInfo.SourceName,
  382. EdbCode: edbInfo.EdbCode,
  383. FromEdbInfoId: sourceEdbInfo.EdbInfoId,
  384. FromEdbCode: sourceEdbInfo.EdbCode,
  385. FromEdbName: sourceEdbInfo.EdbName,
  386. FromSource: sourceEdbInfo.Source,
  387. FromSourceName: sourceEdbInfo.SourceName,
  388. //FromTag: "",
  389. Sort: 1,
  390. CreateTime: time.Now(),
  391. ModifyTime: time.Now(),
  392. }
  393. fromEdbMap[sourceEdbInfo.EdbInfoId] = sourceEdbInfo.EdbInfoId
  394. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  395. // 动态环差 计算列表
  396. calculateRuleList := make([]models.CalculateRule, 0)
  397. // 预测指标配置
  398. predictEdbConfList := make([]*models.PredictEdbConf, 0)
  399. for _, v := range ruleList {
  400. // 预测指标配置
  401. ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  402. if tmpErr != nil {
  403. errMsg = "规则配置的截止日期异常,请重新填写"
  404. err = errors.New(errMsg)
  405. return
  406. }
  407. //1:最新,2:固定值,3:同比,4:同差,5:环比,6:环差,7:N期移动均值,8:N期段线性外推值,9:动态环差,10:根据 给定终值后插值 规则获取预测数据,11:根据 季节性 规则获取预测数据,12:根据 移动平均同比 规则获取预测数据
  408. // 环比、环差、动态环差、季节性、移动平均同比不支持年度
  409. if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) {
  410. errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标"
  411. err = errors.New(errMsg)
  412. return
  413. }
  414. switch v.RuleType {
  415. case 8: //N期段线性外推值
  416. valInt, tmpErr := strconv.Atoi(v.Value)
  417. if tmpErr != nil {
  418. errMsg = "N期段线性外推值的N值异常"
  419. err = errors.New(errMsg)
  420. return
  421. }
  422. if valInt <= 1 {
  423. errMsg = "N期段线性外推值的N值必须大于1"
  424. err = errors.New(errMsg)
  425. return
  426. }
  427. case 9: //9:动态环差
  428. if v.Value == "" {
  429. errMsg = "请填写计算规则"
  430. err = errors.New(errMsg)
  431. return
  432. }
  433. formula := v.Value
  434. formula = strings.Replace(formula, "(", "(", -1)
  435. formula = strings.Replace(formula, ")", ")", -1)
  436. formula = strings.Replace(formula, ",", ",", -1)
  437. formula = strings.Replace(formula, "。", ".", -1)
  438. formula = strings.Replace(formula, "%", "*0.01", -1)
  439. v.Value = formula
  440. //检验公式
  441. var formulaStr string
  442. var edbInfoIdBytes []string
  443. for _, tmpEdbInfoId := range v.EdbInfoIdArr {
  444. formulaStr += tmpEdbInfoId.FromTag + ","
  445. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  446. }
  447. formulaMap := services.CheckFormula(formula)
  448. for _, formula := range formulaMap {
  449. if !strings.Contains(formulaStr, formula) {
  450. errMsg = "公式错误,请重新填写"
  451. err = errors.New(errMsg)
  452. return
  453. }
  454. }
  455. //关联的指标信息
  456. edbInfoList := make([]*models.EdbInfo, 0)
  457. // 动态环差规则 关系表
  458. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  459. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  460. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  461. if tmpErr != nil {
  462. err = tmpErr
  463. if err.Error() == utils.ErrNoRow() {
  464. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  465. err = errors.New(errMsg)
  466. return
  467. }
  468. errMsg = "获取指标失败:Err:" + err.Error()
  469. err = errors.New(errMsg)
  470. return
  471. }
  472. edbInfoList = append(edbInfoList, fromEdbInfo)
  473. //总的 预测指标与所有相关联指标的关系表(不仅仅该条规则)
  474. {
  475. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  476. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  477. calculateMappingItem := &models.EdbInfoCalculateMapping{
  478. EdbInfoCalculateMappingId: 0,
  479. EdbInfoId: edbInfoId,
  480. Source: utils.DATA_SOURCE_CALCULATE,
  481. SourceName: "指标运算",
  482. EdbCode: "",
  483. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  484. FromEdbCode: fromEdbInfo.EdbCode,
  485. FromEdbName: fromEdbInfo.EdbName,
  486. FromSource: fromEdbInfo.Source,
  487. FromSourceName: fromEdbInfo.SourceName,
  488. //FromTag: tmpEdbInfoId.FromTag,
  489. Sort: k + 1,
  490. CreateTime: time.Now(),
  491. ModifyTime: time.Now(),
  492. }
  493. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  494. }
  495. }
  496. // 动态环差规则 关系表
  497. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  498. //PredictEdbConfCalculateMappingId: 0,
  499. EdbInfoId: edbInfoId,
  500. ConfigId: 0,
  501. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  502. FromEdbCode: fromEdbInfo.EdbCode,
  503. FromEdbName: fromEdbInfo.EdbName,
  504. FromSource: fromEdbInfo.Source,
  505. FromSourceName: fromEdbInfo.SourceName,
  506. FromTag: tmpEdbInfoId.FromTag,
  507. Sort: k + 1,
  508. CreateTime: time.Now(),
  509. ModifyTime: time.Now(),
  510. }
  511. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  512. }
  513. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
  514. if !ok {
  515. errMsg = "生成计算指标失败,请使用正确的计算公式"
  516. err = errors.New(errMsg)
  517. return
  518. }
  519. calculateRuleList = append(calculateRuleList, models.CalculateRule{
  520. TrendsCalculateMappingList: trendsMappingList,
  521. EdbInfoList: edbInfoList,
  522. EdbInfoIdBytes: edbInfoIdBytes,
  523. Formula: formula,
  524. RuleType: v.RuleType,
  525. EndDate: v.EndDate,
  526. EdbInfoIdArr: v.EdbInfoIdArr,
  527. })
  528. }
  529. tmpPredictEdbConf := &models.PredictEdbConf{
  530. PredictEdbInfoId: edbInfoId,
  531. SourceEdbInfoId: sourceEdbInfo.EdbInfoId,
  532. RuleType: v.RuleType,
  533. //FixedValue: v.Value,
  534. Value: v.Value,
  535. EndDate: ruleEndDate,
  536. ModifyTime: time.Now(),
  537. CreateTime: time.Now(),
  538. }
  539. edbInfo.EndDate = v.EndDate
  540. predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
  541. }
  542. err = models.EditPredictEdb(edbInfo, updateEdbInfoCol, calculateMappingList, predictEdbConfList, calculateRuleList)
  543. return
  544. }
  545. // RefreshPredictEdbInfo 更新基础预测指标规则中的动态数据
  546. func RefreshPredictEdbInfo(edbInfoId int) (edbInfo *models.EdbInfo, err error, errMsg string) {
  547. // 指标信息校验
  548. {
  549. edbInfo, err = models.GetEdbInfoById(edbInfoId)
  550. if err != nil && err.Error() != utils.ErrNoRow() {
  551. errMsg = "刷新失败"
  552. err = errors.New("获取预测指标失败,Err:" + err.Error())
  553. return
  554. }
  555. if edbInfo == nil {
  556. errMsg = "找不到该预测指标"
  557. err = nil
  558. return
  559. }
  560. //必须是普通的指标
  561. if edbInfo.EdbInfoType != 1 {
  562. errMsg = "指标异常,不是预测指标"
  563. return
  564. }
  565. }
  566. // 配置 与 指标的 关联关系表
  567. list, err := models.GetPredictEdbConfCalculateMappingListByEdbInfoId(edbInfoId)
  568. if err != nil {
  569. return
  570. }
  571. // 没有关联指标,不需要刷新
  572. if len(list) <= 0 {
  573. return
  574. }
  575. // 配置关联的指标信息
  576. predictEdbConfCalculateMappingListMap := make(map[int][]*models.PredictEdbConfCalculateMapping)
  577. configIdList := make([]int, 0) //关联配置id
  578. edbInfoIdList := make([]int, 0) //关联指标配置id
  579. edbInfoIdMap := make(map[int]int, 0) //关联指标配置map
  580. for _, v := range list {
  581. configList, ok := predictEdbConfCalculateMappingListMap[v.ConfigId]
  582. if !ok {
  583. configList = make([]*models.PredictEdbConfCalculateMapping, 0)
  584. configIdList = append(configIdList, v.ConfigId)
  585. }
  586. if _, ok := edbInfoIdMap[v.FromEdbInfoId]; !ok {
  587. edbInfoIdList = append(edbInfoIdList, v.FromEdbInfoId)
  588. }
  589. configList = append(configList, v)
  590. predictEdbConfCalculateMappingListMap[v.ConfigId] = configList
  591. }
  592. predictEdbConfList, err := models.GetPredictEdbConfListByConfigIdList(configIdList)
  593. if err != nil {
  594. errMsg = "刷新失败"
  595. err = errors.New("获取预测指标配置信息失败,Err:" + err.Error())
  596. return
  597. }
  598. if len(predictEdbConfList) == 0 {
  599. errMsg = "找不到该预测指标配置"
  600. err = nil
  601. return
  602. }
  603. // 指标信息
  604. edbInfoList, err := models.GetEdbInfoByIdList(edbInfoIdList)
  605. if err != nil {
  606. err = errors.New("获取关联指标失败,Err:" + err.Error())
  607. return
  608. }
  609. // 指标信息map
  610. edbInfoListMap := make(map[int]*models.EdbInfo)
  611. for _, v := range edbInfoList {
  612. edbInfoListMap[v.EdbInfoId] = v
  613. }
  614. // 刷新所有的规则
  615. for _, v := range predictEdbConfList {
  616. switch v.RuleType {
  617. case 9:
  618. if v.Value == "" {
  619. errMsg = "请填写计算规则"
  620. return
  621. }
  622. formula := v.Value
  623. // 动态环差规则 关系表
  624. trendsMappingList := predictEdbConfCalculateMappingListMap[v.ConfigId]
  625. // 关联标签
  626. edbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  627. //关联的指标信息
  628. edbInfoList := make([]*models.EdbInfo, 0)
  629. for _, trendsMapping := range trendsMappingList {
  630. tmpEdbInfo, ok := edbInfoListMap[trendsMapping.FromEdbInfoId]
  631. if ok {
  632. edbInfoList = append(edbInfoList, tmpEdbInfo)
  633. }
  634. // 关联标签
  635. edbInfoIdArr = append(edbInfoIdArr, models.EdbInfoFromTag{
  636. EdbInfoId: trendsMapping.FromEdbInfoId,
  637. FromTag: trendsMapping.FromTag,
  638. })
  639. }
  640. //检验公式
  641. var formulaStr string
  642. var edbInfoIdBytes []string
  643. for _, tmpEdbInfoId := range edbInfoIdArr {
  644. formulaStr += tmpEdbInfoId.FromTag + ","
  645. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  646. }
  647. formulaMap := services.CheckFormula(formula)
  648. for _, formula := range formulaMap {
  649. if !strings.Contains(formulaStr, formula) {
  650. errMsg = "公式错误,请重新填写"
  651. return
  652. }
  653. }
  654. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, formula, edbInfoIdBytes)
  655. if !ok {
  656. errMsg = "生成计算指标失败,请使用正确的计算公式"
  657. return
  658. }
  659. rule := models.CalculateRule{
  660. EdbInfoId: v.PredictEdbInfoId,
  661. ConfigId: v.ConfigId,
  662. TrendsCalculateMappingList: trendsMappingList,
  663. EdbInfoList: edbInfoList,
  664. EdbInfoIdBytes: edbInfoIdBytes,
  665. Formula: formula,
  666. RuleType: v.RuleType,
  667. EndDate: v.EndDate.Format(utils.FormatDate),
  668. EdbInfoIdArr: edbInfoIdArr,
  669. }
  670. err = models.RefreshCalculateByRuleBy9(rule)
  671. if err != nil {
  672. return
  673. }
  674. }
  675. }
  676. return
  677. }