edb_info_calculate.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package data
  2. import (
  3. "fmt"
  4. "hongze/hongze_task/models/data_manage"
  5. "strings"
  6. )
  7. type CalculateItems struct {
  8. EdbInfoId int
  9. DataMap map[string]float64
  10. }
  11. func CheckFormula(formula string) map[string]string {
  12. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG"}
  13. str := strings.ToUpper(formula)
  14. for _, v := range mathFormula {
  15. str = strings.Replace(str, v, "", -1)
  16. }
  17. str = strings.Replace(str, "(", "", -1)
  18. str = strings.Replace(str, ")", "", -1)
  19. byteMap := make(map[string]string)
  20. for i := 0; i < len(str); i++ {
  21. byteInt := str[i]
  22. if byteInt >= 65 && byteInt <= 90 {
  23. byteStr := string(byteInt)
  24. if _, ok := byteMap[byteStr]; !ok {
  25. byteMap[byteStr] = byteStr
  26. }
  27. }
  28. }
  29. return byteMap
  30. }
  31. func ReplaceFormula(edbInfoIdArr []*data_manage.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
  32. funMap := GetFormulaMap()
  33. for k, v := range funMap {
  34. formulaStr = strings.Replace(formulaStr, k, v, -1)
  35. }
  36. replaceCount := 0
  37. for dk, dv := range edbInfoIdArr {
  38. if dk == 0 {
  39. dKey := edbInfoIdBytes[dk]
  40. if _, ok := formulaMap[dKey]; ok { //公式中存在
  41. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  42. dvStr := fmt.Sprintf("%v", val)
  43. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  44. replaceCount++
  45. }
  46. }
  47. }
  48. if dk == 1 {
  49. dKey := edbInfoIdBytes[dk]
  50. if _, ok := formulaMap[dKey]; ok { //公式中存在
  51. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  52. dvStr := fmt.Sprintf("%v", val)
  53. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  54. replaceCount++
  55. }
  56. }
  57. }
  58. if dk == 2 {
  59. dKey := edbInfoIdBytes[dk]
  60. if _, ok := formulaMap[dKey]; ok { //公式中存在
  61. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  62. dvStr := fmt.Sprintf("%v", val)
  63. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  64. replaceCount++
  65. }
  66. }
  67. }
  68. if dk == 3 {
  69. dKey := edbInfoIdBytes[dk]
  70. if _, ok := formulaMap[dKey]; ok { //公式中存在
  71. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  72. dvStr := fmt.Sprintf("%v", val)
  73. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  74. replaceCount++
  75. }
  76. }
  77. }
  78. if dk == 4 {
  79. dKey := edbInfoIdBytes[dk]
  80. if _, ok := formulaMap[dKey]; ok { //公式中存在
  81. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  82. dvStr := fmt.Sprintf("%v", val)
  83. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  84. replaceCount++
  85. }
  86. }
  87. }
  88. if dk == 5 {
  89. dKey := edbInfoIdBytes[dk]
  90. if _, ok := formulaMap[dKey]; ok { //公式中存在
  91. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  92. dvStr := fmt.Sprintf("%v", val)
  93. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  94. replaceCount++
  95. }
  96. }
  97. }
  98. if dk == 6 {
  99. dKey := edbInfoIdBytes[dk]
  100. if _, ok := formulaMap[dKey]; ok { //公式中存在
  101. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  102. dvStr := fmt.Sprintf("%v", val)
  103. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  104. replaceCount++
  105. }
  106. }
  107. }
  108. if dk == 7 {
  109. dKey := edbInfoIdBytes[dk]
  110. if _, ok := formulaMap[dKey]; ok { //公式中存在
  111. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  112. dvStr := fmt.Sprintf("%v", val)
  113. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  114. replaceCount++
  115. }
  116. }
  117. }
  118. if dk == 8 {
  119. dKey := edbInfoIdBytes[dk]
  120. if _, ok := formulaMap[dKey]; ok { //公式中存在
  121. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  122. dvStr := fmt.Sprintf("%v", val)
  123. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  124. replaceCount++
  125. }
  126. }
  127. }
  128. }
  129. for k, v := range funMap {
  130. formulaStr = strings.Replace(formulaStr, v, k, -1)
  131. }
  132. if replaceCount == len(formulaMap) {
  133. return formulaStr
  134. } else {
  135. return ""
  136. }
  137. }
  138. func GetFormulaMap() map[string]string {
  139. funMap := make(map[string]string)
  140. funMap["MAX"] = "[@@]"
  141. funMap["MIN"] = "[@!]"
  142. funMap["ABS"] = "[@#]"
  143. funMap["CEIL"] = "[@$]"
  144. funMap["COS"] = "[@%]"
  145. funMap["FLOOR"] = "[@^]"
  146. funMap["MOD"] = "[@&]"
  147. funMap["POW"] = "[@*]"
  148. funMap["ROUND"] = "[@(]"
  149. return funMap
  150. }
  151. //修复计算指标与基础指标的关联关系
  152. func FixEdbInfoCalculateMapping() {
  153. fmt.Println("start")
  154. data_manage.FixEdbInfoCalculateMapping()
  155. fmt.Println("end")
  156. }