predict_edb.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. package logic
  2. import (
  3. "errors"
  4. "eta_gn/eta_index_lib/models"
  5. "eta_gn/eta_index_lib/utils"
  6. "fmt"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, sysUserId int, sysUserName, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
  12. var sourceEdbInfo *models.EdbInfo
  13. {
  14. sourceEdbInfo, err = models.GetEdbInfoById(sourceEdbInfoId)
  15. if err != nil && err.Error() != utils.ErrNoRow() {
  16. errMsg = "新增失败"
  17. err = errors.New("获取来源指标失败,Err:" + err.Error())
  18. return
  19. }
  20. if sourceEdbInfo == nil {
  21. errMsg = "找不到该来源指标"
  22. err = errors.New(errMsg)
  23. return
  24. }
  25. if sourceEdbInfo.EdbInfoType != 0 {
  26. errMsg = "来源指标异常,不是普通的指标"
  27. err = errors.New(errMsg)
  28. return
  29. }
  30. }
  31. var classifyInfo *models.EdbClassify
  32. {
  33. classifyInfo, err = models.GetEdbClassifyById(classifyId)
  34. if err != nil && err.Error() != utils.ErrNoRow() {
  35. errMsg = "新增失败"
  36. err = errors.New("获取预测指标分类失败,Err:" + err.Error())
  37. return
  38. }
  39. if classifyInfo == nil {
  40. errMsg = "找不到该预测指标分类"
  41. err = errors.New(errMsg)
  42. return
  43. }
  44. if classifyInfo.ClassifyType != 1 {
  45. errMsg = "预测指标分类异常,不是预测指标分类"
  46. err = errors.New(errMsg)
  47. return
  48. }
  49. }
  50. edbName = strings.Trim(edbName, " ")
  51. edbCode := sourceEdbInfo.EdbCode + "_" + time.Now().Format(utils.FormatShortDateTimeUnSpace)
  52. existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, 0, edbName, lang)
  53. if err != nil {
  54. errMsg = "判断指标名称是否存在失败"
  55. err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
  56. return
  57. }
  58. if existEdbName {
  59. errMsg = "指标名称已存在,请重新填写"
  60. err = errors.New(errMsg)
  61. return
  62. }
  63. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  64. if dataDateType == `` {
  65. dataDateType = `自然日`
  66. }
  67. edbInfo = &models.EdbInfo{
  68. EdbInfoType: 1,
  69. SourceName: "预测指标",
  70. Source: utils.DATA_SOURCE_PREDICT,
  71. EdbCode: edbCode,
  72. EdbName: edbName,
  73. EdbNameSource: edbName,
  74. Frequency: sourceEdbInfo.Frequency,
  75. Unit: sourceEdbInfo.Unit,
  76. StartDate: sourceEdbInfo.StartDate,
  77. ClassifyId: classifyId,
  78. SysUserId: sysUserId,
  79. SysUserRealName: sysUserName,
  80. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  81. CreateTime: time.Now(),
  82. ModifyTime: time.Now(),
  83. MinValue: minValue,
  84. MaxValue: maxValue,
  85. CalculateFormula: sourceEdbInfo.CalculateFormula,
  86. EdbType: 1,
  87. LatestDate: sourceEdbInfo.LatestDate,
  88. LatestValue: sourceEdbInfo.LatestValue,
  89. MoveType: sourceEdbInfo.MoveType,
  90. MoveFrequency: sourceEdbInfo.MoveFrequency,
  91. NoUpdate: sourceEdbInfo.NoUpdate,
  92. ServerUrl: "",
  93. EdbNameEn: edbName,
  94. UnitEn: sourceEdbInfo.UnitEn,
  95. DataDateType: dataDateType,
  96. Sort: models.GetAddEdbMaxSortByClassifyId(classifyId, utils.PREDICT_EDB_INFO_TYPE),
  97. }
  98. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  99. fromEdbMap := make(map[int]int)
  100. calculateMappingItem := &models.EdbInfoCalculateMapping{
  101. Source: edbInfo.Source,
  102. SourceName: edbInfo.SourceName,
  103. EdbCode: edbInfo.EdbCode,
  104. FromEdbInfoId: sourceEdbInfo.EdbInfoId,
  105. FromEdbCode: sourceEdbInfo.EdbCode,
  106. FromEdbName: sourceEdbInfo.EdbName,
  107. FromSource: sourceEdbInfo.Source,
  108. FromSourceName: sourceEdbInfo.SourceName,
  109. Sort: 1,
  110. CreateTime: time.Now(),
  111. ModifyTime: time.Now(),
  112. }
  113. fromEdbMap[sourceEdbInfoId] = sourceEdbInfoId
  114. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  115. calculateRuleMap := make(map[int]models.CalculateRule, 0)
  116. predictEdbConfList := make([]*models.PredictEdbConf, 0)
  117. for ruleIndex, v := range ruleList {
  118. ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  119. if tmpErr != nil {
  120. errMsg = "规则配置的截止日期异常,请重新填写"
  121. err = errors.New(errMsg)
  122. return
  123. }
  124. if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) {
  125. errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标"
  126. err = errors.New(errMsg)
  127. return
  128. }
  129. switch v.RuleType {
  130. case 8: //N期段线性外推值
  131. valInt, tmpErr := strconv.Atoi(v.Value)
  132. if tmpErr != nil {
  133. errMsg = "N期段线性外推值的N值异常"
  134. err = errors.New(errMsg)
  135. return
  136. }
  137. if valInt <= 1 {
  138. errMsg = "N期段线性外推值的N值必须大于1"
  139. err = errors.New(errMsg)
  140. return
  141. }
  142. case 9: //9:动态环差
  143. if v.Value == "" {
  144. errMsg = "请填写计算规则"
  145. err = errors.New(errMsg)
  146. return
  147. }
  148. formula := v.Value
  149. formula = strings.Replace(formula, "(", "(", -1)
  150. formula = strings.Replace(formula, ")", ")", -1)
  151. formula = strings.Replace(formula, ",", ",", -1)
  152. formula = strings.Replace(formula, "。", ".", -1)
  153. formula = strings.Replace(formula, "%", "*0.01", -1)
  154. v.Value = formula
  155. var formulaStr string
  156. var edbInfoIdBytes []string
  157. for _, tmpEdbInfoId := range v.EdbInfoIdArr {
  158. formulaStr += tmpEdbInfoId.FromTag + ","
  159. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  160. }
  161. formulaSlice, tErr := utils.CheckFormulaJson(formula)
  162. if tErr != nil {
  163. errMsg = "公式格式错误,请重新填写"
  164. err = errors.New(errMsg)
  165. return
  166. }
  167. for _, fm := range formulaSlice {
  168. formulaMap, e := utils.CheckFormula(fm)
  169. if e != nil {
  170. err = fmt.Errorf("公式错误,请重新填写")
  171. return
  172. }
  173. for _, f := range formulaMap {
  174. if !strings.Contains(formulaStr, f) {
  175. errMsg = "公式错误,请重新填写"
  176. err = errors.New(errMsg)
  177. return
  178. }
  179. }
  180. }
  181. edbInfoList := make([]*models.EdbInfo, 0)
  182. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  183. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  184. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  185. if tmpErr != nil {
  186. err = tmpErr
  187. if err.Error() == utils.ErrNoRow() {
  188. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  189. err = errors.New(errMsg)
  190. return
  191. }
  192. errMsg = "获取指标失败:Err:" + err.Error()
  193. err = errors.New(errMsg)
  194. return
  195. }
  196. edbInfoList = append(edbInfoList, fromEdbInfo)
  197. {
  198. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  199. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  200. calculateMappingItem := &models.EdbInfoCalculateMapping{
  201. EdbInfoCalculateMappingId: 0,
  202. EdbInfoId: 0,
  203. Source: utils.DATA_SOURCE_CALCULATE,
  204. SourceName: "指标运算",
  205. EdbCode: "",
  206. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  207. FromEdbCode: fromEdbInfo.EdbCode,
  208. FromEdbName: fromEdbInfo.EdbName,
  209. FromSource: fromEdbInfo.Source,
  210. FromSourceName: fromEdbInfo.SourceName,
  211. Sort: k + 1,
  212. CreateTime: time.Now(),
  213. ModifyTime: time.Now(),
  214. }
  215. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  216. }
  217. }
  218. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  219. EdbInfoId: 0,
  220. ConfigId: 0,
  221. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  222. FromEdbCode: fromEdbInfo.EdbCode,
  223. FromEdbName: fromEdbInfo.EdbName,
  224. FromSource: fromEdbInfo.Source,
  225. FromSourceName: fromEdbInfo.SourceName,
  226. FromTag: tmpEdbInfoId.FromTag,
  227. Sort: k + 1,
  228. CreateTime: time.Now(),
  229. ModifyTime: time.Now(),
  230. }
  231. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  232. }
  233. for _, f := range formulaSlice {
  234. formulaMap, e := utils.CheckFormula(f)
  235. if e != nil {
  236. err = fmt.Errorf("公式错误,请重新填写")
  237. return
  238. }
  239. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes)
  240. if !ok {
  241. errMsg = "生成计算指标失败,请使用正确的计算公式"
  242. err = errors.New(errMsg)
  243. return
  244. }
  245. }
  246. calculateRuleMap[ruleIndex] = models.CalculateRule{
  247. TrendsCalculateMappingList: trendsMappingList,
  248. EdbInfoList: edbInfoList,
  249. EdbInfoIdBytes: edbInfoIdBytes,
  250. Formula: formula,
  251. RuleType: v.RuleType,
  252. EndDate: v.EndDate,
  253. EdbInfoIdArr: v.EdbInfoIdArr,
  254. }
  255. case 14: //14:根据 一元线性拟合 规则获取预测数据
  256. if v.Value == "" {
  257. errMsg = "请填写一元线性拟合规则"
  258. err = errors.New(errMsg)
  259. return
  260. }
  261. edbInfoList := make([]*models.EdbInfo, 0)
  262. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  263. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  264. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  265. if tmpErr != nil {
  266. err = tmpErr
  267. if err.Error() == utils.ErrNoRow() {
  268. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  269. err = errors.New(errMsg)
  270. return
  271. }
  272. errMsg = "获取指标失败:Err:" + err.Error()
  273. err = errors.New(errMsg)
  274. return
  275. }
  276. edbInfoList = append(edbInfoList, fromEdbInfo)
  277. {
  278. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  279. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  280. tmpCalculateMappingItem := &models.EdbInfoCalculateMapping{
  281. EdbInfoCalculateMappingId: 0,
  282. EdbInfoId: 0,
  283. Source: utils.DATA_SOURCE_CALCULATE,
  284. SourceName: "指标运算",
  285. EdbCode: "",
  286. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  287. FromEdbCode: fromEdbInfo.EdbCode,
  288. FromEdbName: fromEdbInfo.EdbName,
  289. FromSource: fromEdbInfo.Source,
  290. FromSourceName: fromEdbInfo.SourceName,
  291. Sort: k + 1,
  292. CreateTime: time.Now(),
  293. ModifyTime: time.Now(),
  294. }
  295. calculateMappingList = append(calculateMappingList, tmpCalculateMappingItem)
  296. }
  297. }
  298. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  299. EdbInfoId: 0,
  300. ConfigId: 0,
  301. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  302. FromEdbCode: fromEdbInfo.EdbCode,
  303. FromEdbName: fromEdbInfo.EdbName,
  304. FromSource: fromEdbInfo.Source,
  305. FromSourceName: fromEdbInfo.SourceName,
  306. FromTag: tmpEdbInfoId.FromTag,
  307. Sort: k + 1,
  308. CreateTime: time.Now(),
  309. ModifyTime: time.Now(),
  310. }
  311. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  312. }
  313. calculateRuleMap[ruleIndex] = models.CalculateRule{
  314. TrendsCalculateMappingList: trendsMappingList,
  315. EdbInfoList: edbInfoList,
  316. RuleType: v.RuleType,
  317. EndDate: v.EndDate,
  318. EdbInfoIdArr: v.EdbInfoIdArr,
  319. }
  320. }
  321. tmpPredictEdbConf := &models.PredictEdbConf{
  322. PredictEdbInfoId: 0,
  323. SourceEdbInfoId: sourceEdbInfoId,
  324. RuleType: v.RuleType,
  325. Value: v.Value,
  326. EndDate: ruleEndDate,
  327. ModifyTime: time.Now(),
  328. CreateTime: time.Now(),
  329. }
  330. edbInfo.EndDate = v.EndDate
  331. predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
  332. }
  333. err, errMsg = models.AddPredictEdb(edbInfo, calculateMappingList, predictEdbConfList, calculateRuleMap)
  334. return
  335. }
  336. func EditPredictEdbInfo(edbInfoId, classifyId int, edbName, dataDateType string, ruleList []models.RuleConfig, minValue, maxValue float64, lang string) (edbInfo *models.EdbInfo, err error, errMsg string) {
  337. {
  338. edbInfo, err = models.GetEdbInfoById(edbInfoId)
  339. if err != nil && err.Error() != utils.ErrNoRow() {
  340. errMsg = "修改失败"
  341. err = errors.New("获取预测指标失败,Err:" + err.Error())
  342. return
  343. }
  344. if edbInfo == nil {
  345. errMsg = "找不到该预测指标"
  346. err = errors.New(errMsg)
  347. return
  348. }
  349. if edbInfo.EdbInfoType != 1 {
  350. errMsg = "指标异常,不是预测指标"
  351. err = errors.New(errMsg)
  352. return
  353. }
  354. }
  355. var predictEdbConf *models.PredictEdbConf
  356. {
  357. predictEdbConfList, tmpErr := models.GetPredictEdbConfListById(edbInfo.EdbInfoId)
  358. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  359. errMsg = "修改失败"
  360. err = errors.New("获取预测指标配置信息失败,Err:" + tmpErr.Error())
  361. return
  362. }
  363. if len(predictEdbConfList) == 0 {
  364. errMsg = "找不到该预测指标配置"
  365. err = errors.New(errMsg)
  366. return
  367. }
  368. predictEdbConf = predictEdbConfList[0]
  369. }
  370. existEdbName, err := CheckExistByEdbNameAndEdbInfoId(utils.PREDICT_EDB_INFO_TYPE, edbInfoId, edbName, lang)
  371. if err != nil {
  372. errMsg = "判断指标名称是否存在失败"
  373. err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
  374. return
  375. }
  376. if existEdbName {
  377. errMsg = "指标名称已存在,请重新填写"
  378. err = errors.New(errMsg)
  379. return
  380. }
  381. if dataDateType == `` {
  382. dataDateType = `自然日`
  383. }
  384. switch lang {
  385. case utils.EnLangVersion:
  386. edbInfo.EdbNameEn = edbName
  387. default:
  388. edbInfo.EdbName = edbName
  389. }
  390. edbInfo.EdbNameSource = edbName
  391. edbInfo.ClassifyId = classifyId
  392. edbInfo.MinValue = minValue
  393. edbInfo.MaxValue = maxValue
  394. edbInfo.DataDateType = dataDateType
  395. edbInfo.ModifyTime = time.Now()
  396. updateEdbInfoCol := []string{"EdbName", "EdbNameEn", "EdbNameSource", "ClassifyId", "EndDate", "MinValue", "MaxValue", "DataDateType", "ModifyTime"}
  397. var sourceEdbInfo *models.EdbInfo
  398. {
  399. sourceEdbInfo, err = models.GetEdbInfoById(predictEdbConf.SourceEdbInfoId)
  400. if err != nil && err.Error() != utils.ErrNoRow() {
  401. errMsg = "新增失败"
  402. err = errors.New("获取来源指标失败,Err:" + err.Error())
  403. return
  404. }
  405. if sourceEdbInfo == nil {
  406. errMsg = "找不到该来源指标"
  407. err = errors.New(errMsg)
  408. return
  409. }
  410. if sourceEdbInfo.EdbInfoType != 0 {
  411. errMsg = "来源指标异常,不是普通的指标"
  412. err = errors.New(errMsg)
  413. return
  414. }
  415. }
  416. calculateMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  417. fromEdbMap := make(map[int]int)
  418. calculateMappingItem := &models.EdbInfoCalculateMapping{
  419. EdbInfoId: edbInfoId,
  420. Source: edbInfo.Source,
  421. SourceName: edbInfo.SourceName,
  422. EdbCode: edbInfo.EdbCode,
  423. FromEdbInfoId: sourceEdbInfo.EdbInfoId,
  424. FromEdbCode: sourceEdbInfo.EdbCode,
  425. FromEdbName: sourceEdbInfo.EdbName,
  426. FromSource: sourceEdbInfo.Source,
  427. FromSourceName: sourceEdbInfo.SourceName,
  428. Sort: 1,
  429. CreateTime: time.Now(),
  430. ModifyTime: time.Now(),
  431. }
  432. fromEdbMap[sourceEdbInfo.EdbInfoId] = sourceEdbInfo.EdbInfoId
  433. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  434. calculateRuleMap := make(map[int]models.CalculateRule, 0)
  435. predictEdbConfList := make([]*models.PredictEdbConf, 0)
  436. for ruleIndex, v := range ruleList {
  437. ruleEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.EndDate, time.Local)
  438. if tmpErr != nil {
  439. errMsg = "规则配置的截止日期异常,请重新填写"
  440. err = errors.New(errMsg)
  441. return
  442. }
  443. if sourceEdbInfo.Frequency == "年度" && utils.InArrayByInt([]int{5, 6, 11, 12}, v.RuleType) {
  444. errMsg = "环比、环差、动态环差、季节性、移动平均同比不支持年度指标"
  445. err = errors.New(errMsg)
  446. return
  447. }
  448. switch v.RuleType {
  449. case 8: //N期段线性外推值
  450. valInt, tmpErr := strconv.Atoi(v.Value)
  451. if tmpErr != nil {
  452. errMsg = "N期段线性外推值的N值异常"
  453. err = errors.New(errMsg)
  454. return
  455. }
  456. if valInt <= 1 {
  457. errMsg = "N期段线性外推值的N值必须大于1"
  458. err = errors.New(errMsg)
  459. return
  460. }
  461. case 9: //9:动态环差
  462. if v.Value == "" {
  463. errMsg = "请填写计算规则"
  464. err = errors.New(errMsg)
  465. return
  466. }
  467. formula := v.Value
  468. formula = strings.Replace(formula, "(", "(", -1)
  469. formula = strings.Replace(formula, ")", ")", -1)
  470. formula = strings.Replace(formula, ",", ",", -1)
  471. formula = strings.Replace(formula, "。", ".", -1)
  472. formula = strings.Replace(formula, "%", "*0.01", -1)
  473. v.Value = formula
  474. var formulaStr string
  475. var edbInfoIdBytes []string
  476. for _, tmpEdbInfoId := range v.EdbInfoIdArr {
  477. formulaStr += tmpEdbInfoId.FromTag + ","
  478. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  479. }
  480. formulaSlice, tErr := utils.CheckFormulaJson(formula)
  481. if tErr != nil {
  482. errMsg = "公式格式错误,请重新填写"
  483. err = errors.New(errMsg)
  484. return
  485. }
  486. for _, fm := range formulaSlice {
  487. formulaMap, e := utils.CheckFormula(fm)
  488. if e != nil {
  489. err = fmt.Errorf("公式错误,请重新填写")
  490. return
  491. }
  492. for _, f := range formulaMap {
  493. if !strings.Contains(formulaStr, f) {
  494. errMsg = "公式错误,请重新填写"
  495. err = errors.New(errMsg)
  496. return
  497. }
  498. }
  499. }
  500. edbInfoList := make([]*models.EdbInfo, 0)
  501. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  502. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  503. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  504. if tmpErr != nil {
  505. err = tmpErr
  506. if err.Error() == utils.ErrNoRow() {
  507. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  508. err = errors.New(errMsg)
  509. return
  510. }
  511. errMsg = "获取指标失败:Err:" + err.Error()
  512. err = errors.New(errMsg)
  513. return
  514. }
  515. edbInfoList = append(edbInfoList, fromEdbInfo)
  516. {
  517. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  518. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  519. calculateMappingItem := &models.EdbInfoCalculateMapping{
  520. EdbInfoCalculateMappingId: 0,
  521. EdbInfoId: edbInfoId,
  522. Source: utils.DATA_SOURCE_CALCULATE,
  523. SourceName: "指标运算",
  524. EdbCode: "",
  525. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  526. FromEdbCode: fromEdbInfo.EdbCode,
  527. FromEdbName: fromEdbInfo.EdbName,
  528. FromSource: fromEdbInfo.Source,
  529. FromSourceName: fromEdbInfo.SourceName,
  530. Sort: k + 1,
  531. CreateTime: time.Now(),
  532. ModifyTime: time.Now(),
  533. }
  534. calculateMappingList = append(calculateMappingList, calculateMappingItem)
  535. }
  536. }
  537. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  538. EdbInfoId: edbInfoId,
  539. ConfigId: 0,
  540. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  541. FromEdbCode: fromEdbInfo.EdbCode,
  542. FromEdbName: fromEdbInfo.EdbName,
  543. FromSource: fromEdbInfo.Source,
  544. FromSourceName: fromEdbInfo.SourceName,
  545. FromTag: tmpEdbInfoId.FromTag,
  546. Sort: k + 1,
  547. CreateTime: time.Now(),
  548. ModifyTime: time.Now(),
  549. }
  550. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  551. }
  552. for _, f := range formulaSlice {
  553. formulaMap, e := utils.CheckFormula(f)
  554. if e != nil {
  555. err = fmt.Errorf("公式错误,请重新填写")
  556. return
  557. }
  558. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, f, edbInfoIdBytes)
  559. if !ok {
  560. errMsg = "生成计算指标失败,请使用正确的计算公式"
  561. err = errors.New(errMsg)
  562. return
  563. }
  564. }
  565. calculateRuleMap[ruleIndex] = models.CalculateRule{
  566. TrendsCalculateMappingList: trendsMappingList,
  567. EdbInfoList: edbInfoList,
  568. EdbInfoIdBytes: edbInfoIdBytes,
  569. Formula: formula,
  570. RuleType: v.RuleType,
  571. EndDate: v.EndDate,
  572. EdbInfoIdArr: v.EdbInfoIdArr,
  573. }
  574. case 14: //14:根据 一元线性拟合 规则获取预测数据
  575. if v.Value == "" {
  576. errMsg = "请填写一元线性拟合规则"
  577. err = errors.New(errMsg)
  578. return
  579. }
  580. edbInfoList := make([]*models.EdbInfo, 0)
  581. trendsMappingList := make([]*models.PredictEdbConfCalculateMapping, 0)
  582. for k, tmpEdbInfoId := range v.EdbInfoIdArr {
  583. fromEdbInfo, tmpErr := models.GetEdbInfoById(tmpEdbInfoId.EdbInfoId)
  584. if tmpErr != nil {
  585. err = tmpErr
  586. if err.Error() == utils.ErrNoRow() {
  587. errMsg = "指标 " + strconv.Itoa(tmpEdbInfoId.EdbInfoId) + " 不存在"
  588. err = errors.New(errMsg)
  589. return
  590. }
  591. errMsg = "获取指标失败:Err:" + err.Error()
  592. err = errors.New(errMsg)
  593. return
  594. }
  595. edbInfoList = append(edbInfoList, fromEdbInfo)
  596. {
  597. if _, ok := fromEdbMap[tmpEdbInfoId.EdbInfoId]; !ok {
  598. fromEdbMap[tmpEdbInfoId.EdbInfoId] = tmpEdbInfoId.EdbInfoId
  599. tmpCalculateMappingItem := &models.EdbInfoCalculateMapping{
  600. EdbInfoCalculateMappingId: 0,
  601. EdbInfoId: 0,
  602. Source: utils.DATA_SOURCE_CALCULATE,
  603. SourceName: "指标运算",
  604. EdbCode: "",
  605. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  606. FromEdbCode: fromEdbInfo.EdbCode,
  607. FromEdbName: fromEdbInfo.EdbName,
  608. FromSource: fromEdbInfo.Source,
  609. FromSourceName: fromEdbInfo.SourceName,
  610. Sort: k + 1,
  611. CreateTime: time.Now(),
  612. ModifyTime: time.Now(),
  613. }
  614. calculateMappingList = append(calculateMappingList, tmpCalculateMappingItem)
  615. }
  616. }
  617. tmpPredictEdbConfCalculateMapping := &models.PredictEdbConfCalculateMapping{
  618. EdbInfoId: 0,
  619. ConfigId: 0,
  620. FromEdbInfoId: fromEdbInfo.EdbInfoId,
  621. FromEdbCode: fromEdbInfo.EdbCode,
  622. FromEdbName: fromEdbInfo.EdbName,
  623. FromSource: fromEdbInfo.Source,
  624. FromSourceName: fromEdbInfo.SourceName,
  625. FromTag: tmpEdbInfoId.FromTag,
  626. Sort: k + 1,
  627. CreateTime: time.Now(),
  628. ModifyTime: time.Now(),
  629. }
  630. trendsMappingList = append(trendsMappingList, tmpPredictEdbConfCalculateMapping)
  631. }
  632. calculateRuleMap[ruleIndex] = models.CalculateRule{
  633. TrendsCalculateMappingList: trendsMappingList,
  634. EdbInfoList: edbInfoList,
  635. RuleType: v.RuleType,
  636. EndDate: v.EndDate,
  637. EdbInfoIdArr: v.EdbInfoIdArr,
  638. }
  639. }
  640. tmpPredictEdbConf := &models.PredictEdbConf{
  641. PredictEdbInfoId: edbInfoId,
  642. SourceEdbInfoId: sourceEdbInfo.EdbInfoId,
  643. RuleType: v.RuleType,
  644. Value: v.Value,
  645. EndDate: ruleEndDate,
  646. ModifyTime: time.Now(),
  647. CreateTime: time.Now(),
  648. }
  649. edbInfo.EndDate = v.EndDate
  650. predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
  651. }
  652. err, errMsg = models.EditPredictEdb(edbInfo, updateEdbInfoCol, calculateMappingList, predictEdbConfList, calculateRuleMap)
  653. return
  654. }
  655. func RefreshPredictEdbInfo(edbInfoId int) (edbInfo *models.EdbInfo, err error, errMsg string) {
  656. {
  657. edbInfo, err = models.GetEdbInfoById(edbInfoId)
  658. if err != nil && err.Error() != utils.ErrNoRow() {
  659. errMsg = "刷新失败"
  660. err = errors.New("获取预测指标失败,Err:" + err.Error())
  661. return
  662. }
  663. if edbInfo == nil {
  664. errMsg = "找不到该预测指标"
  665. err = nil
  666. return
  667. }
  668. if edbInfo.EdbInfoType != 1 {
  669. errMsg = "指标异常,不是预测指标"
  670. return
  671. }
  672. }
  673. list, err := models.GetPredictEdbConfCalculateMappingListByEdbInfoId(edbInfoId)
  674. if err != nil {
  675. return
  676. }
  677. if len(list) <= 0 {
  678. return
  679. }
  680. predictEdbConfCalculateMappingListMap := make(map[int][]*models.PredictEdbConfCalculateMapping)
  681. configIdList := make([]int, 0) //关联配置id
  682. edbInfoIdList := make([]int, 0) //关联指标配置id
  683. edbInfoIdMap := make(map[int]int, 0) //关联指标配置map
  684. for _, v := range list {
  685. configList, ok := predictEdbConfCalculateMappingListMap[v.ConfigId]
  686. if !ok {
  687. configList = make([]*models.PredictEdbConfCalculateMapping, 0)
  688. configIdList = append(configIdList, v.ConfigId)
  689. }
  690. if _, ok := edbInfoIdMap[v.FromEdbInfoId]; !ok {
  691. edbInfoIdList = append(edbInfoIdList, v.FromEdbInfoId)
  692. }
  693. configList = append(configList, v)
  694. predictEdbConfCalculateMappingListMap[v.ConfigId] = configList
  695. }
  696. predictEdbConfList, err := models.GetPredictEdbConfListByConfigIdList(configIdList)
  697. if err != nil {
  698. errMsg = "刷新失败"
  699. err = errors.New("获取预测指标配置信息失败,Err:" + err.Error())
  700. return
  701. }
  702. if len(predictEdbConfList) == 0 {
  703. errMsg = "找不到该预测指标配置"
  704. err = nil
  705. return
  706. }
  707. edbInfoList, err := models.GetEdbInfoByIdList(edbInfoIdList)
  708. if err != nil {
  709. err = errors.New("获取关联指标失败,Err:" + err.Error())
  710. return
  711. }
  712. edbInfoListMap := make(map[int]*models.EdbInfo)
  713. for _, v := range edbInfoList {
  714. edbInfoListMap[v.EdbInfoId] = v
  715. }
  716. predictEdbConfAndDataList := make([]*models.PredictEdbConfAndData, 0)
  717. for _, v := range predictEdbConfList {
  718. resultDataList := make([]*models.EdbInfoSearchData, 0)
  719. switch v.RuleType {
  720. case 9: //动态环差值
  721. if v.Value == "" {
  722. errMsg = "请填写计算规则"
  723. return
  724. }
  725. formula := v.Value
  726. trendsMappingList := predictEdbConfCalculateMappingListMap[v.ConfigId]
  727. edbInfoIdArr := make([]models.EdbInfoFromTag, 0)
  728. edbInfoList := make([]*models.EdbInfo, 0)
  729. for _, trendsMapping := range trendsMappingList {
  730. tmpEdbInfo, ok := edbInfoListMap[trendsMapping.FromEdbInfoId]
  731. if ok {
  732. edbInfoList = append(edbInfoList, tmpEdbInfo)
  733. }
  734. edbInfoIdArr = append(edbInfoIdArr, models.EdbInfoFromTag{
  735. EdbInfoId: trendsMapping.FromEdbInfoId,
  736. FromTag: trendsMapping.FromTag,
  737. })
  738. }
  739. var formulaStr string
  740. var edbInfoIdBytes []string
  741. for _, tmpEdbInfoId := range edbInfoIdArr {
  742. formulaStr += tmpEdbInfoId.FromTag + ","
  743. edbInfoIdBytes = append(edbInfoIdBytes, tmpEdbInfoId.FromTag)
  744. }
  745. formulaSlice, tErr := utils.CheckFormulaJson(formula)
  746. if tErr != nil {
  747. errMsg = "公式格式错误,请重新填写"
  748. err = errors.New(errMsg)
  749. return
  750. }
  751. for _, fm := range formulaSlice {
  752. formulaMap, e := utils.CheckFormula(fm)
  753. if e != nil {
  754. err = fmt.Errorf("公式错误,请重新填写")
  755. return
  756. }
  757. for _, f := range formulaMap {
  758. if !strings.Contains(formulaStr, f) {
  759. errMsg = "公式错误,请重新填写"
  760. err = errors.New(errMsg)
  761. return
  762. }
  763. }
  764. ok, _ := models.CheckFormula2(edbInfoList, formulaMap, fm, edbInfoIdBytes)
  765. if !ok {
  766. errMsg = "生成计算指标失败,请使用正确的计算公式"
  767. return
  768. }
  769. }
  770. rule := models.CalculateRule{
  771. EdbInfoId: v.PredictEdbInfoId,
  772. ConfigId: v.ConfigId,
  773. TrendsCalculateMappingList: trendsMappingList,
  774. EdbInfoList: edbInfoList,
  775. EdbInfoIdBytes: edbInfoIdBytes,
  776. Formula: formula,
  777. RuleType: v.RuleType,
  778. EndDate: v.EndDate.Format(utils.FormatDate),
  779. EdbInfoIdArr: edbInfoIdArr,
  780. }
  781. resultDataList, err = models.RefreshCalculateByRuleBy9(rule)
  782. if err != nil {
  783. return
  784. }
  785. case 14: //14:根据 一元线性拟合 规则获取预测数据
  786. if v.Value == "" {
  787. errMsg = "一元线性拟合规则信息未配置"
  788. return
  789. }
  790. err, errMsg = models.RefreshCalculateByRuleByLineNh(*edbInfo, predictEdbConfAndDataList, *v)
  791. if err != nil {
  792. return
  793. }
  794. }
  795. tmpPredictEdbConfAndData := &models.PredictEdbConfAndData{
  796. ConfigId: 0,
  797. PredictEdbInfoId: 0,
  798. SourceEdbInfoId: v.SourceEdbInfoId,
  799. RuleType: v.RuleType,
  800. FixedValue: v.FixedValue,
  801. Value: v.Value,
  802. EndDate: v.EndDate,
  803. ModifyTime: v.ModifyTime,
  804. CreateTime: v.CreateTime,
  805. DataList: resultDataList,
  806. }
  807. predictEdbConfAndDataList = append(predictEdbConfAndDataList, tmpPredictEdbConfAndData)
  808. }
  809. return
  810. }
  811. func checkExistByEdbName(edbInfoType int, edbName, lang string) (has bool, err error) {
  812. var condition string
  813. var pars []interface{}
  814. condition += " AND edb_info_type=? "
  815. pars = append(pars, 0)
  816. switch lang {
  817. case utils.EnLangVersion:
  818. condition += " AND edb_name_en = ? "
  819. default:
  820. condition += " AND edb_name=? "
  821. }
  822. pars = append(pars, edbName)
  823. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  824. if err != nil {
  825. return
  826. }
  827. if count > 0 {
  828. has = true
  829. return
  830. }
  831. return
  832. }
  833. func checkExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId int, edbName, lang string) (has bool, err error) {
  834. var condition string
  835. var pars []interface{}
  836. condition += " AND edb_info_type=? "
  837. pars = append(pars, edbInfoType)
  838. condition += " AND edb_info_id<>? "
  839. pars = append(pars, edbInfoId)
  840. switch lang {
  841. case utils.EnLangVersion:
  842. condition += " AND edb_name_en = ? "
  843. default:
  844. condition += " AND edb_name=? "
  845. }
  846. pars = append(pars, edbName)
  847. count, err := models.GetEdbInfoCountByCondition(condition, pars)
  848. if err != nil {
  849. return
  850. }
  851. if count > 0 {
  852. has = true
  853. return
  854. }
  855. return
  856. }
  857. func CheckExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId int, edbName, lang string) (has bool, err error) {
  858. if edbInfoId == 0 {
  859. return checkExistByEdbName(edbInfoType, edbName, lang)
  860. }
  861. return checkExistByEdbNameAndEdbInfoId(edbInfoType, edbInfoId, edbName, lang)
  862. }