edb_info_calculate.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. package data
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "math"
  10. "regexp"
  11. "strings"
  12. "time"
  13. )
  14. func CheckFormula(formula string) map[string]string {
  15. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG", "LN", "EXP"}
  16. str := strings.ToUpper(formula)
  17. for _, v := range mathFormula {
  18. str = strings.Replace(str, v, "", -1)
  19. }
  20. str = strings.Replace(str, "(", "", -1)
  21. str = strings.Replace(str, ")", "", -1)
  22. byteMap := make(map[string]string)
  23. for i := 0; i < len(str); i++ {
  24. byteInt := str[i]
  25. if byteInt >= 65 && byteInt <= 90 {
  26. byteStr := string(byteInt)
  27. if _, ok := byteMap[byteStr]; !ok {
  28. byteMap[byteStr] = byteStr
  29. }
  30. }
  31. }
  32. return byteMap
  33. }
  34. type FormulaListItem struct {
  35. Formula string `json:"f"`
  36. Date string `json:"d"`
  37. }
  38. // CheckFormulaJson 检测计算公式json串是否异常
  39. func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
  40. list := make([]FormulaListItem, 0)
  41. err = json.Unmarshal([]byte(formula), &list)
  42. if err != nil {
  43. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  44. return
  45. }
  46. formulaSlice = make([]string, 0)
  47. // 日期排序
  48. for _, v := range list {
  49. formulaSlice = append(formulaSlice, v.Formula)
  50. }
  51. return
  52. }
  53. type CalculateItems struct {
  54. EdbInfoId int
  55. DataMap map[string]float64
  56. }
  57. func ReplaceFormula(edbInfoIdArr []*data_manage.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
  58. // todo 处理min和max
  59. funMap := GetFormulaMap()
  60. for k, v := range funMap {
  61. formulaStr = strings.Replace(formulaStr, k, v, -1)
  62. }
  63. replaceCount := 0
  64. for dk, dv := range edbInfoIdArr {
  65. if dk == 0 {
  66. dKey := edbInfoIdBytes[dk]
  67. if _, ok := formulaMap[dKey]; ok { //公式中存在
  68. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  69. dvStr := fmt.Sprintf("%v", val)
  70. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  71. replaceCount++
  72. } else {
  73. fmt.Println("valArr not found:", valArr, valOk)
  74. }
  75. } else {
  76. fmt.Println("formulaMap not found:", dKey, dk)
  77. }
  78. }
  79. if dk == 1 {
  80. dKey := edbInfoIdBytes[dk]
  81. if _, ok := formulaMap[dKey]; ok { //公式中存在
  82. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  83. dvStr := fmt.Sprintf("%v", val)
  84. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  85. replaceCount++
  86. } else {
  87. fmt.Println("valArr not found:", valArr, valOk)
  88. }
  89. } else {
  90. fmt.Println("formulaMap not found:", dKey, dk)
  91. }
  92. }
  93. if dk == 2 {
  94. dKey := edbInfoIdBytes[dk]
  95. if _, ok := formulaMap[dKey]; ok { //公式中存在
  96. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  97. dvStr := fmt.Sprintf("%v", val)
  98. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  99. replaceCount++
  100. }
  101. }
  102. }
  103. if dk == 3 {
  104. dKey := edbInfoIdBytes[dk]
  105. if _, ok := formulaMap[dKey]; ok { //公式中存在
  106. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  107. dvStr := fmt.Sprintf("%v", val)
  108. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  109. replaceCount++
  110. }
  111. }
  112. }
  113. if dk == 4 {
  114. dKey := edbInfoIdBytes[dk]
  115. if _, ok := formulaMap[dKey]; ok { //公式中存在
  116. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  117. dvStr := fmt.Sprintf("%v", val)
  118. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  119. replaceCount++
  120. }
  121. }
  122. }
  123. if dk == 5 {
  124. dKey := edbInfoIdBytes[dk]
  125. if _, ok := formulaMap[dKey]; ok { //公式中存在
  126. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  127. dvStr := fmt.Sprintf("%v", val)
  128. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  129. replaceCount++
  130. }
  131. }
  132. }
  133. if dk == 6 {
  134. dKey := edbInfoIdBytes[dk]
  135. if _, ok := formulaMap[dKey]; ok { //公式中存在
  136. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  137. dvStr := fmt.Sprintf("%v", val)
  138. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  139. replaceCount++
  140. }
  141. }
  142. }
  143. if dk == 7 {
  144. dKey := edbInfoIdBytes[dk]
  145. if _, ok := formulaMap[dKey]; ok { //公式中存在
  146. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  147. dvStr := fmt.Sprintf("%v", val)
  148. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  149. replaceCount++
  150. }
  151. }
  152. }
  153. if dk == 8 {
  154. dKey := edbInfoIdBytes[dk]
  155. if _, ok := formulaMap[dKey]; ok { //公式中存在
  156. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  157. dvStr := fmt.Sprintf("%v", val)
  158. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  159. replaceCount++
  160. }
  161. }
  162. }
  163. if dk == 9 {
  164. dKey := edbInfoIdBytes[dk]
  165. if _, ok := formulaMap[dKey]; ok { //公式中存在
  166. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  167. dvStr := fmt.Sprintf("%v", val)
  168. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  169. replaceCount++
  170. }
  171. }
  172. }
  173. if dk == 10 {
  174. dKey := edbInfoIdBytes[dk]
  175. if _, ok := formulaMap[dKey]; ok { //公式中存在
  176. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  177. dvStr := fmt.Sprintf("%v", val)
  178. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  179. replaceCount++
  180. }
  181. }
  182. }
  183. if dk == 11 {
  184. dKey := edbInfoIdBytes[dk]
  185. if _, ok := formulaMap[dKey]; ok { //公式中存在
  186. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  187. dvStr := fmt.Sprintf("%v", val)
  188. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  189. replaceCount++
  190. }
  191. }
  192. }
  193. if dk == 12 {
  194. dKey := edbInfoIdBytes[dk]
  195. if _, ok := formulaMap[dKey]; ok { //公式中存在
  196. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  197. dvStr := fmt.Sprintf("%v", val)
  198. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  199. replaceCount++
  200. }
  201. }
  202. }
  203. if dk == 13 {
  204. dKey := edbInfoIdBytes[dk]
  205. if _, ok := formulaMap[dKey]; ok { //公式中存在
  206. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  207. dvStr := fmt.Sprintf("%v", val)
  208. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  209. replaceCount++
  210. }
  211. }
  212. }
  213. if dk == 14 {
  214. dKey := edbInfoIdBytes[dk]
  215. if _, ok := formulaMap[dKey]; ok { //公式中存在
  216. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  217. dvStr := fmt.Sprintf("%v", val)
  218. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  219. replaceCount++
  220. }
  221. }
  222. }
  223. if dk == 15 {
  224. dKey := edbInfoIdBytes[dk]
  225. if _, ok := formulaMap[dKey]; ok { //公式中存在
  226. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  227. dvStr := fmt.Sprintf("%v", val)
  228. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  229. replaceCount++
  230. }
  231. }
  232. }
  233. if dk == 16 {
  234. dKey := edbInfoIdBytes[dk]
  235. if _, ok := formulaMap[dKey]; ok { //公式中存在
  236. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  237. dvStr := fmt.Sprintf("%v", val)
  238. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  239. replaceCount++
  240. }
  241. }
  242. }
  243. if dk == 17 {
  244. dKey := edbInfoIdBytes[dk]
  245. if _, ok := formulaMap[dKey]; ok { //公式中存在
  246. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  247. dvStr := fmt.Sprintf("%v", val)
  248. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  249. replaceCount++
  250. }
  251. }
  252. }
  253. if dk == 18 {
  254. dKey := edbInfoIdBytes[dk]
  255. if _, ok := formulaMap[dKey]; ok { //公式中存在
  256. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  257. dvStr := fmt.Sprintf("%v", val)
  258. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  259. replaceCount++
  260. }
  261. }
  262. }
  263. if dk == 19 {
  264. dKey := edbInfoIdBytes[dk]
  265. if _, ok := formulaMap[dKey]; ok { //公式中存在
  266. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  267. dvStr := fmt.Sprintf("%v", val)
  268. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  269. replaceCount++
  270. }
  271. }
  272. }
  273. if dk == 20 {
  274. dKey := edbInfoIdBytes[dk]
  275. if _, ok := formulaMap[dKey]; ok { //公式中存在
  276. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  277. dvStr := fmt.Sprintf("%v", val)
  278. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  279. replaceCount++
  280. }
  281. }
  282. }
  283. if dk == 21 {
  284. dKey := edbInfoIdBytes[dk]
  285. if _, ok := formulaMap[dKey]; ok { //公式中存在
  286. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  287. dvStr := fmt.Sprintf("%v", val)
  288. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  289. replaceCount++
  290. }
  291. }
  292. }
  293. if dk == 22 {
  294. dKey := edbInfoIdBytes[dk]
  295. if _, ok := formulaMap[dKey]; ok { //公式中存在
  296. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  297. dvStr := fmt.Sprintf("%v", val)
  298. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  299. replaceCount++
  300. }
  301. }
  302. }
  303. if dk == 23 {
  304. dKey := edbInfoIdBytes[dk]
  305. if _, ok := formulaMap[dKey]; ok { //公式中存在
  306. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  307. dvStr := fmt.Sprintf("%v", val)
  308. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  309. replaceCount++
  310. }
  311. }
  312. }
  313. if dk == 24 {
  314. dKey := edbInfoIdBytes[dk]
  315. if _, ok := formulaMap[dKey]; ok { //公式中存在
  316. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  317. dvStr := fmt.Sprintf("%v", val)
  318. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  319. replaceCount++
  320. }
  321. }
  322. }
  323. if dk == 25 {
  324. dKey := edbInfoIdBytes[dk]
  325. if _, ok := formulaMap[dKey]; ok { //公式中存在
  326. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  327. dvStr := fmt.Sprintf("%v", val)
  328. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  329. replaceCount++
  330. }
  331. }
  332. }
  333. }
  334. for k, v := range funMap {
  335. formulaStr = strings.Replace(formulaStr, v, k, -1)
  336. }
  337. if replaceCount == len(formulaMap) {
  338. return formulaStr
  339. } else {
  340. return ""
  341. }
  342. }
  343. func GetFormulaMap() map[string]string {
  344. funMap := make(map[string]string)
  345. funMap["MAX"] = "[@@]"
  346. funMap["MIN"] = "[@!]"
  347. funMap["ABS"] = "[@#]"
  348. funMap["CEIL"] = "[@$]"
  349. funMap["COS"] = "[@%]"
  350. funMap["FLOOR"] = "[@^]"
  351. funMap["MOD"] = "[@&]"
  352. funMap["POW"] = "[@*]"
  353. funMap["ROUND"] = "[@(]"
  354. return funMap
  355. }
  356. // 处理整个数据
  357. func handleDateSaveDataMap(dateList []string, realSaveDataMap, saveDataMap map[string]map[int]float64, edbInfoIdArr []*data_manage.EdbInfo, emptyType int) {
  358. var startDate, endDate string
  359. var startDateT, endDateT time.Time
  360. if emptyType == 2 || emptyType == 3 {
  361. for k, _ := range realSaveDataMap {
  362. if k > endDate {
  363. endDate = k
  364. }
  365. if k < startDate || startDate == "" {
  366. startDate = k
  367. }
  368. }
  369. startDateT, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
  370. endDateT, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  371. }
  372. for _, date := range dateList {
  373. tmpDataMap := realSaveDataMap[date]
  374. for _, edbInfo := range edbInfoIdArr {
  375. tmpEdbInfoId := edbInfo.EdbInfoId // 当前指标id
  376. // 如果该日期不存在该指标数据,那么需要找寻前后日期的数据,进行填补
  377. if _, ok := tmpDataMap[tmpEdbInfoId]; !ok {
  378. //day := 0
  379. //switch edbInfo.Frequency {
  380. //case "周度":
  381. // day = 7
  382. //case "旬度":
  383. // day = 15
  384. //case "月度":
  385. // day = 30
  386. //case "季度":
  387. // day = 90
  388. //case "年度":
  389. // day = 365
  390. //}
  391. // 需求池 255 指标运算文案修改,补数据遍历区间修改(2023-3-7 09:37:23修改)
  392. switch emptyType {
  393. case 0:
  394. handleDateDataMap(realSaveDataMap, saveDataMap, date, tmpEdbInfoId, 35)
  395. case 2:
  396. handleDateDataMapBefore(realSaveDataMap, saveDataMap, date, tmpEdbInfoId, startDateT, endDateT)
  397. case 3:
  398. handleDateDataMapAfter(realSaveDataMap, saveDataMap, date, tmpEdbInfoId, startDateT, endDateT)
  399. case 4:
  400. handleDateDataMapZero(saveDataMap, date, tmpEdbInfoId)
  401. }
  402. }
  403. }
  404. }
  405. }
  406. // handleDataMap 处理单个日期的数据
  407. func handleDateDataMap(realSaveDataMap, saveDataMap map[string]map[int]float64, date string, edbInfoId, day int) {
  408. currDate, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  409. // 后一天
  410. nextDateDayStr := currDate.AddDate(0, 0, 1).Format(utils.FormatDate)
  411. // 前一天
  412. preDateDayStr := currDate.AddDate(0, 0, -1).Format(utils.FormatDate)
  413. for i := 1; i <= day; i++ {
  414. // 下个日期的数据
  415. {
  416. if i >= 1 {
  417. nextDateDayStr = currDate.AddDate(0, 0, i).Format(utils.FormatDate)
  418. }
  419. if findDataMap, hasFindDataMap := realSaveDataMap[nextDateDayStr]; hasFindDataMap { // 下一个日期有数据
  420. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  421. saveDataMap[date][edbInfoId] = val
  422. return
  423. }
  424. }
  425. }
  426. // 上个日期的数据
  427. {
  428. if i >= 1 {
  429. preDateDayStr = currDate.AddDate(0, 0, -i).Format(utils.FormatDate)
  430. }
  431. if findDataMap, hasFindDataMap := realSaveDataMap[preDateDayStr]; hasFindDataMap { // 下一个日期有数据
  432. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  433. saveDataMap[date][edbInfoId] = val
  434. return
  435. }
  436. }
  437. }
  438. }
  439. }
  440. // handleDataByLinearRegression 插值法补充数据(线性方程式)
  441. func handleDataByLinearRegression(edbInfoDataList []*data_manage.EdbDataList, handleDataMap map[string]float64) (err error) {
  442. if len(edbInfoDataList) < 2 {
  443. return
  444. }
  445. var startEdbInfoData *data_manage.EdbDataList
  446. for _, v := range edbInfoDataList {
  447. handleDataMap[v.DataTime] = v.Value
  448. // 第一个数据就给过滤了,给后面的试用
  449. if startEdbInfoData == nil {
  450. startEdbInfoData = v
  451. continue
  452. }
  453. // 获取两条数据之间相差的天数
  454. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  455. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  456. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  457. betweenDay := betweenHour / 24
  458. // 如果相差一天,那么过滤
  459. if betweenDay <= 1 {
  460. startEdbInfoData = v
  461. continue
  462. }
  463. // 生成线性方程式
  464. var a, b float64
  465. {
  466. coordinateData := make([]utils.Coordinate, 0)
  467. tmpCoordinate1 := utils.Coordinate{
  468. X: 1,
  469. Y: startEdbInfoData.Value,
  470. }
  471. coordinateData = append(coordinateData, tmpCoordinate1)
  472. tmpCoordinate2 := utils.Coordinate{
  473. X: float64(betweenDay) + 1,
  474. Y: v.Value,
  475. }
  476. coordinateData = append(coordinateData, tmpCoordinate2)
  477. a, b = utils.GetLinearResult(coordinateData)
  478. if math.IsNaN(a) || math.IsNaN(b) {
  479. err = errors.New("线性方程公式生成失败")
  480. return
  481. }
  482. }
  483. // 生成对应的值
  484. {
  485. for i := 1; i < betweenDay; i++ {
  486. tmpDataTime := startDataTime.AddDate(0, 0, i)
  487. aDecimal := decimal.NewFromFloat(a)
  488. xDecimal := decimal.NewFromInt(int64(i) + 1)
  489. bDecimal := decimal.NewFromFloat(b)
  490. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  491. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  492. }
  493. }
  494. startEdbInfoData = v
  495. }
  496. return
  497. }
  498. // HandleDataByLinearRegression 插值法补充数据(线性方程式)
  499. func HandleDataByLinearRegression(edbInfoDataList []*data_manage.EdbDataList, handleDataMap map[string]float64) (err error) {
  500. return handleDataByLinearRegression(edbInfoDataList, handleDataMap)
  501. }
  502. // CallCalculateComputeCorrelation 调用计算拟合残差的相关系数
  503. func CallCalculateComputeCorrelation(data *data_manage.EdbInfoCalculateBatchSaveReqByEdbLib, lang string) (val string, err error, errMsg string) {
  504. errMsg = "计算失败"
  505. // 调用指标库去更新
  506. reqJson, err := json.Marshal(data)
  507. if err != nil {
  508. errMsg = "计算相关系数参数解析异常!"
  509. err = errors.New("参数解析失败,Err:" + err.Error())
  510. return
  511. }
  512. respItem, err := CalculateComputeCorrelation(string(reqJson), lang)
  513. if err != nil {
  514. return
  515. }
  516. if respItem.Ret == 200 {
  517. val = respItem.Data
  518. }
  519. return
  520. }
  521. // handleDateDataMapBefore 前值填充:空值优先以最近的前值填充,没有前值时,用后值填充
  522. func handleDateDataMapBefore(realSaveDataMap, saveDataMap map[string]map[int]float64, date string, edbInfoId int, startDateT, endDateT time.Time) {
  523. currDate, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  524. // 后一天
  525. nextDateDay := currDate
  526. // 前一天
  527. preDateDay := currDate
  528. for i := 1; preDateDay.After(startDateT) || preDateDay == startDateT; i++ {
  529. // 上个日期的数据
  530. {
  531. preDateDay = currDate.AddDate(0, 0, -i)
  532. preDateDayStr := preDateDay.Format(utils.FormatDate)
  533. if findDataMap, hasFindDataMap := realSaveDataMap[preDateDayStr]; hasFindDataMap { // 下一个日期有数据
  534. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  535. fmt.Println(fmt.Sprintf("date:%s, 无值,取%s的值%.4f", date, preDateDayStr, val))
  536. saveDataMap[date][edbInfoId] = val
  537. return
  538. }
  539. }
  540. }
  541. }
  542. for i := 1; nextDateDay.Before(endDateT) || nextDateDay == endDateT; i++ {
  543. // 下个日期的数据
  544. {
  545. nextDateDay = currDate.AddDate(0, 0, i)
  546. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  547. if findDataMap, hasFindDataMap := realSaveDataMap[nextDateDayStr]; hasFindDataMap { // 下一个日期有数据
  548. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  549. fmt.Println(fmt.Sprintf("date:%s, 无值,取%s的值%.4f", date, nextDateDayStr, val))
  550. saveDataMap[date][edbInfoId] = val
  551. return
  552. }
  553. }
  554. }
  555. }
  556. return
  557. }
  558. // handleDateDataMapAfter 后值填充:空值优先以最近的后值填充,没有后值时,用前值填充
  559. func handleDateDataMapAfter(realSaveDataMap, saveDataMap map[string]map[int]float64, date string, edbInfoId int, startDateT, endDateT time.Time) {
  560. currDate, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  561. // 后一天
  562. nextDateDay := currDate
  563. // 前一天
  564. preDateDay := currDate
  565. for i := 1; nextDateDay.Before(endDateT) || nextDateDay == endDateT; i++ {
  566. // 下个日期的数据
  567. {
  568. nextDateDay = currDate.AddDate(0, 0, i)
  569. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  570. if findDataMap, hasFindDataMap := realSaveDataMap[nextDateDayStr]; hasFindDataMap { // 下一个日期有数据
  571. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  572. fmt.Println(fmt.Sprintf("date:%s, 无值,取%s的值%.4f", date, nextDateDayStr, val))
  573. saveDataMap[date][edbInfoId] = val
  574. return
  575. }
  576. }
  577. }
  578. }
  579. for i := 1; preDateDay.After(startDateT) || preDateDay == startDateT; i++ {
  580. // 上个日期的数据
  581. {
  582. preDateDay = currDate.AddDate(0, 0, -i)
  583. preDateDayStr := preDateDay.Format(utils.FormatDate)
  584. if findDataMap, hasFindDataMap := realSaveDataMap[preDateDayStr]; hasFindDataMap { // 下一个日期有数据
  585. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  586. fmt.Println(fmt.Sprintf("date:%s, 无值,取%s的值%.4f", date, preDateDayStr, val))
  587. saveDataMap[date][edbInfoId] = val
  588. return
  589. }
  590. }
  591. }
  592. }
  593. return
  594. }
  595. // handleDateDataMapZero 等于0
  596. func handleDateDataMapZero(saveDataMap map[string]map[int]float64, date string, edbInfoId int) {
  597. saveDataMap[date][edbInfoId] = 0
  598. return
  599. }
  600. func GetMaxMinEdbInfo(formula string) string {
  601. //formula := "A+min(A,B,max(A,C))"
  602. // todo 无法处理max里嵌套max或者min的情况
  603. // 使用正则表达式匹配MAX和MIN函数及其参数
  604. regex := regexp.MustCompile(`(?i)(MAX|MIN)\((.*?)\)`)
  605. matches := regex.FindAllStringSubmatch(formula, -1)
  606. // 遍历匹配结果,输出MAX和MIN函数及其参数
  607. for _, match := range matches {
  608. if len(match) == 3 {
  609. parameter := strings.ToLower(match[0]) // 参数
  610. formula = strings.ReplaceAll(formula, match[0], parameter)
  611. fmt.Printf("formula: %s\n", formula)
  612. }
  613. }
  614. formula = strings.ReplaceAll(formula, "max", "MAX")
  615. formula = strings.ReplaceAll(formula, "min", "MIN")
  616. return formula
  617. }