predict_edb_data_calculate_qjjs.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package models
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_index_lib/global"
  6. "eta_gn/eta_index_lib/utils"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "gorm.io/gorm"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. type PredictCalculateRangeAnalysis struct {
  15. }
  16. func (obj PredictCalculateRangeAnalysis) Add(params BatchSaveCalculateBatchParams) (edbInfo *EdbInfo, latestDateStr string, latestValue float64, err error, errMsg string) {
  17. req := params.Req
  18. edbCode := params.EdbCode
  19. uniqueCode := params.UniqueCode
  20. sysUserId := params.SysUserId
  21. sysUserRealName := params.SysUserRealName
  22. //req *EdbInfoCalculateBatchSaveReq, edbCode, uniqueCode string, sysUserId int, sysUserRealName string
  23. to := global.DEFAULT_DmSQL.Begin()
  24. defer func() {
  25. if err != nil {
  26. to.Rollback()
  27. } else {
  28. to.Commit()
  29. }
  30. }()
  31. if req.EdbInfoId > 0 {
  32. err = errors.New("无法新增")
  33. return
  34. }
  35. edbInfo = new(EdbInfo)
  36. edbInfo.Source = obj.GetSource()
  37. edbInfo.SourceName = obj.GetSourceName()
  38. edbInfo.EdbCode = edbCode
  39. edbInfo.EdbName = req.EdbName
  40. edbInfo.EdbNameSource = req.EdbName
  41. edbInfo.Frequency = req.Frequency
  42. edbInfo.Unit = req.Unit
  43. edbInfo.ClassifyId = req.ClassifyId
  44. edbInfo.SysUserId = sysUserId
  45. edbInfo.SysUserRealName = sysUserRealName
  46. edbInfo.CreateTime = time.Now()
  47. edbInfo.ModifyTime = time.Now()
  48. edbInfo.UniqueCode = uniqueCode
  49. edbInfo.CalculateFormula = req.CalculateFormula
  50. edbInfo.EdbNameEn = req.EdbName
  51. edbInfo.UnitEn = req.Unit
  52. edbInfo.EdbType = obj.GetEdbType()
  53. edbInfo.EdbInfoType = 1
  54. tmpErr := to.Create(edbInfo).Error
  55. if tmpErr != nil {
  56. err = tmpErr
  57. return
  58. }
  59. //关联关系
  60. fromEdbInfo, e := GetEdbInfoById(req.FromEdbInfoId)
  61. if e != nil {
  62. err = fmt.Errorf("获取来源指标失败,Err:%s", e.Error())
  63. return
  64. }
  65. calculateMappingItem := new(EdbInfoCalculateMapping)
  66. calculateMappingItem.CreateTime = time.Now()
  67. calculateMappingItem.ModifyTime = time.Now()
  68. calculateMappingItem.Sort = 1
  69. calculateMappingItem.EdbCode = edbCode
  70. calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
  71. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  72. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  73. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  74. calculateMappingItem.FromSource = fromEdbInfo.Source
  75. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  76. calculateMappingItem.FromTag = ""
  77. calculateMappingItem.Source = edbInfo.Source
  78. calculateMappingItem.SourceName = edbInfo.SourceName
  79. calculateMappingItem.FromSubSource = edbInfo.SubSource
  80. err = to.Create(calculateMappingItem).Error
  81. if err != nil {
  82. return
  83. }
  84. //计算数据
  85. latestDateStr, latestValue, err, errMsg = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, fromEdbInfo, edbInfo.EdbCode, edbInfo.CalculateFormula)
  86. return
  87. }
  88. func (obj PredictCalculateRangeAnalysis) Edit(params BatchSaveCalculateBatchParams) (latestDateStr string, latestValue float64, err error, errMsg string) {
  89. edbInfo := params.EdbInfo
  90. req := params.Req
  91. to := global.DEFAULT_DmSQL.Begin()
  92. defer func() {
  93. if err != nil {
  94. to.Rollback()
  95. } else {
  96. to.Commit()
  97. }
  98. }()
  99. //修改指标信息
  100. edbInfo.EdbName = req.EdbName
  101. edbInfo.EdbNameSource = req.EdbName
  102. edbInfo.Frequency = req.Frequency
  103. edbInfo.Unit = req.Unit
  104. edbInfo.ClassifyId = req.ClassifyId
  105. edbInfo.CalculateFormula = req.CalculateFormula
  106. //修改指标信息
  107. switch params.Lang {
  108. case utils.EnLangVersion:
  109. edbInfo.EdbNameEn = req.EdbName
  110. edbInfo.UnitEn = req.Unit
  111. default:
  112. edbInfo.EdbName = req.EdbName
  113. edbInfo.Unit = req.Unit
  114. edbInfo.EdbNameSource = req.EdbName
  115. }
  116. edbInfo.ModifyTime = time.Now()
  117. err = to.Model(edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "ModifyTime", "EdbNameEn", "UnitEn"}).Updates(edbInfo).Error
  118. if err != nil {
  119. return
  120. }
  121. //删除,计算指标关联的,基础指标的关联关系
  122. sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
  123. err = to.Exec(sql, edbInfo.EdbInfoId).Error
  124. if err != nil {
  125. err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
  126. return
  127. }
  128. //清空原有数据
  129. tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
  130. sql = ` DELETE FROM ` + tableName + ` WHERE edb_info_id = ? `
  131. err = to.Exec(sql, edbInfo.EdbInfoId).Error
  132. if err != nil {
  133. return
  134. }
  135. fromEdbInfo, e := GetEdbInfoById(req.FromEdbInfoId)
  136. if e != nil {
  137. err = fmt.Errorf("获取来源指标失败,Err:%s", e.Error())
  138. return
  139. }
  140. calculateMappingItem := new(EdbInfoCalculateMapping)
  141. calculateMappingItem.CreateTime = time.Now()
  142. calculateMappingItem.ModifyTime = time.Now()
  143. calculateMappingItem.Sort = 1
  144. calculateMappingItem.EdbCode = edbInfo.EdbCode
  145. calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
  146. calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
  147. calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
  148. calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
  149. calculateMappingItem.FromSource = fromEdbInfo.Source
  150. calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
  151. calculateMappingItem.FromTag = ""
  152. calculateMappingItem.Source = edbInfo.Source
  153. calculateMappingItem.SourceName = edbInfo.SourceName
  154. calculateMappingItem.FromSubSource = edbInfo.SubSource
  155. err = to.Create(calculateMappingItem).Error
  156. if err != nil {
  157. return
  158. }
  159. //计算数据
  160. latestDateStr, latestValue, err, errMsg = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, fromEdbInfo, edbInfo.EdbCode, edbInfo.CalculateFormula)
  161. return
  162. }
  163. func (obj PredictCalculateRangeAnalysis) Refresh(params RefreshParams) (latestDateStr string, latestValue float64, err error, errMsg string) {
  164. edbInfo := params.EdbInfo
  165. edbInfoCalculateDetailList, err := GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
  166. if err != nil {
  167. return
  168. }
  169. var fromEdbInfo *EdbInfo
  170. for _, v := range edbInfoCalculateDetailList {
  171. fromEdbInfo, _ = GetEdbInfoById(v.FromEdbInfoId)
  172. break
  173. }
  174. if fromEdbInfo == nil {
  175. errMsg = "指标异常"
  176. err = errors.New(errMsg)
  177. return
  178. }
  179. to := global.DEFAULT_DmSQL.Begin()
  180. defer func() {
  181. if err != nil {
  182. to.Rollback()
  183. } else {
  184. to.Commit()
  185. }
  186. }()
  187. // 计算数据
  188. latestDateStr, latestValue, err, errMsg = obj.refresh(to, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, fromEdbInfo, edbInfo.EdbCode, edbInfo.CalculateFormula)
  189. return
  190. }
  191. func (obj PredictCalculateRangeAnalysis) refresh(to *gorm.DB, edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, calculateFormula string) (latestDateStr string, latestValue float64, err error, errMsg string) {
  192. edbInfoIdStr := strconv.Itoa(edbInfoId)
  193. tableName := GetEdbDataTableName(obj.GetSource(), utils.DATA_SUB_SOURCE_EDB)
  194. //获取扩散指数指标所有数据
  195. existDataList, err := GetAllEdbDataListByTo(to, edbInfoId, source, subSource)
  196. if err != nil {
  197. return
  198. }
  199. latestDateStr = fromEdbInfo.LatestDate
  200. //计算指标的map
  201. existDataMap := make(map[string]*EdbData, 0)
  202. removeDateMap := make(map[string]string)
  203. for _, v := range existDataList {
  204. existDataMap[v.DataTime] = v
  205. removeDateMap[v.DataTime] = ``
  206. }
  207. var rangeAnalysisConf RangeAnalysisCalculateFormula
  208. //fmt.Println("calculateFormula:", calculateFormula)
  209. err = json.Unmarshal([]byte(calculateFormula), &rangeAnalysisConf)
  210. if err != nil {
  211. err = fmt.Errorf("解析区间计算公式失败 %s", err.Error())
  212. return
  213. }
  214. rangeAnalysisChartData, err := GetRangeAnalysisChartDataByEdbInfo(fromEdbInfo, rangeAnalysisConf)
  215. if err != nil {
  216. err = fmt.Errorf("获取区间计算数据失败 %s", err.Error())
  217. return
  218. }
  219. addSql := ` INSERT INTO ` + tableName + ` (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  220. var isAdd bool
  221. for _, item := range rangeAnalysisChartData {
  222. currDateStr := item.DataTime
  223. currVal := item.Value
  224. // 判断扩散指数指标是否存在数据
  225. if existData, ok := existDataMap[currDateStr]; ok {
  226. // 处理扩散指数数据的值
  227. existValStr := existData.Value
  228. existValDeci, tmpErr := decimal.NewFromString(existValStr)
  229. if tmpErr != nil {
  230. err = tmpErr
  231. return
  232. }
  233. existVal, _ := existValDeci.Round(4).Float64()
  234. // 判断扩散指数数据的值 与 当前计算出来的结果, 如果两个数据结果不相等的话,那么就修改咯
  235. if existVal != currVal {
  236. err = ModifyEdbDataById(source, subSource, existData.EdbDataId, fmt.Sprint(currVal))
  237. if err != nil {
  238. return
  239. }
  240. }
  241. } else {
  242. // 直接入库
  243. timestamp := item.DataTimestamp
  244. timestampStr := fmt.Sprintf("%d", timestamp)
  245. addSql += GetAddSql(edbInfoIdStr, edbCode, currDateStr, timestampStr, fmt.Sprint(currVal))
  246. isAdd = true
  247. }
  248. delete(removeDateMap, currDateStr)
  249. }
  250. // 数据入库
  251. {
  252. if isAdd {
  253. addSql = strings.TrimRight(addSql, ",")
  254. err = to.Exec(addSql).Error
  255. }
  256. // 移除不存在的日期数据
  257. if len(removeDateMap) > 0 {
  258. removeDateList := make([]string, 0) //需要移除的日期
  259. for k := range removeDateMap {
  260. removeDateList = append(removeDateList, k)
  261. }
  262. removeDateStr := strings.Join(removeDateList, `","`)
  263. removeDateStr = `"` + removeDateStr + `"`
  264. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
  265. err = to.Exec(sql, edbInfoId).Error
  266. if err != nil {
  267. err = fmt.Errorf("删除扩散指数指标数据失败,Err:" + err.Error())
  268. return
  269. }
  270. }
  271. }
  272. //确定实际数据的最终值
  273. {
  274. finalLast, tmpErr := GetFinalLastByTo(to, edbInfoId, obj.GetSource(), utils.DATA_SUB_SOURCE_EDB, fromEdbInfo.LatestDate)
  275. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  276. return
  277. }
  278. if tmpErr == nil {
  279. latestDateStr = finalLast.DataTime
  280. latestValue = finalLast.Value
  281. }
  282. }
  283. return
  284. }
  285. // GetSource 获取来源编码id
  286. func (obj PredictCalculateRangeAnalysis) GetSource() int {
  287. return utils.DATA_SOURCE_PREDICT_CALCULATE_RANGEANLYSIS
  288. }
  289. // GetSourceName 获取来源名称
  290. func (obj PredictCalculateRangeAnalysis) GetSourceName() string {
  291. return utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_RANGEANLYSIS
  292. }
  293. // GetEdbType 获取指标类型
  294. func (obj PredictCalculateRangeAnalysis) GetEdbType() int {
  295. return utils.CALCULATE_EDB_TYPE
  296. }