edb_data_calculate_zdyfx.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. package models
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_index_lib/global"
  6. "eta_gn/eta_index_lib/models/excel"
  7. "eta_gn/eta_index_lib/utils"
  8. "fmt"
  9. "github.com/shopspring/decimal"
  10. "gorm.io/gorm"
  11. "reflect"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. type CustomAnalysis struct{}
  17. type CustomAnalysisData struct {
  18. ExcelInfoId int `description:"excel的id"`
  19. DateList []string
  20. DataList []float64
  21. }
  22. func (obj CustomAnalysis) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, err error, errMsg string) {
  23. req := params.Req
  24. edbCode := params.EdbCode
  25. jsonByte, err := json.Marshal(req.Data)
  26. if err != nil {
  27. return
  28. }
  29. var customAnalysisData CustomAnalysisData
  30. err = json.Unmarshal(jsonByte, &customAnalysisData)
  31. if err != nil {
  32. return
  33. }
  34. to := global.DEFAULT_DmSQL.Begin()
  35. defer func() {
  36. if err != nil {
  37. to.Rollback()
  38. } else {
  39. to.Commit()
  40. }
  41. }()
  42. edbInfo = new(EdbInfo)
  43. edbInfo.Source = obj.GetSource()
  44. edbInfo.SourceName = obj.GetSourceName()
  45. edbInfo.EdbCode = edbCode
  46. edbInfo.EdbName = req.EdbName
  47. edbInfo.EdbNameSource = req.EdbName
  48. edbInfo.Frequency = req.Frequency
  49. edbInfo.Unit = req.Unit
  50. edbInfo.ClassifyId = req.ClassifyId
  51. edbInfo.SysUserId = params.SysUserId
  52. edbInfo.SysUserRealName = params.SysUserRealName
  53. edbInfo.CreateTime = time.Now()
  54. edbInfo.ModifyTime = time.Now()
  55. edbInfo.UniqueCode = params.UniqueCode
  56. edbInfo.CalculateFormula = req.Formula
  57. edbInfo.EdbNameEn = req.EdbName
  58. edbInfo.UnitEn = req.Unit
  59. edbInfo.EdbType = obj.GetEdbType()
  60. edbInfo.Sort = GetAddEdbMaxSortByClassifyId(req.ClassifyId, utils.EDB_INFO_TYPE)
  61. tmpErr := to.Create(edbInfo).Error
  62. if tmpErr != nil {
  63. err = tmpErr
  64. return
  65. }
  66. {
  67. excelEdbMappingItem := new(excel.ExcelEdbMapping)
  68. excelEdbMappingItem.CreateTime = time.Now()
  69. excelEdbMappingItem.ModifyTime = time.Now()
  70. excelEdbMappingItem.ExcelInfoId = customAnalysisData.ExcelInfoId
  71. excelEdbMappingItem.Source = 4
  72. excelEdbMappingItem.EdbInfoId = edbInfo.EdbInfoId
  73. err = to.Create(excelEdbMappingItem).Error
  74. if err != nil {
  75. return
  76. }
  77. }
  78. err = obj.refresh(to, edbInfo, customAnalysisData.DateList, customAnalysisData.DataList)
  79. return
  80. }
  81. func (obj CustomAnalysis) Edit(params EditCalculateBatchParams) (err error, errMsg string) {
  82. req := params.Req
  83. edbInfo := params.EdbInfo
  84. jsonByte, err := json.Marshal(req.Data)
  85. if err != nil {
  86. return
  87. }
  88. var customAnalysisData CustomAnalysisData
  89. err = json.Unmarshal(jsonByte, &customAnalysisData)
  90. if err != nil {
  91. return
  92. }
  93. to := global.DEFAULT_DmSQL.Begin()
  94. defer func() {
  95. if err != nil {
  96. to.Rollback()
  97. } else {
  98. to.Commit()
  99. }
  100. }()
  101. edbInfo.EdbName = req.EdbName
  102. edbInfo.EdbNameSource = req.EdbName
  103. edbInfo.Frequency = req.Frequency
  104. edbInfo.Unit = req.Unit
  105. edbInfo.ClassifyId = req.ClassifyId
  106. edbInfo.CalculateFormula = req.Formula
  107. edbInfo.EdbNameEn = req.EdbNameEn
  108. edbInfo.UnitEn = req.UnitEn
  109. edbInfo.ModifyTime = time.Now()
  110. err = to.Model(edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "ModifyTime", "EdbNameEn", "UnitEn"}).Updates(edbInfo).Error
  111. if err != nil {
  112. return
  113. }
  114. if customAnalysisData.ExcelInfoId > 0 && len(customAnalysisData.DateList) > 0 && len(customAnalysisData.DataList) > 0 {
  115. excelEdbMapping, tmpErr := excel.GetExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
  116. if tmpErr != nil {
  117. err = errors.New("获取excel与指标的关系失败,Err:" + tmpErr.Error())
  118. return
  119. }
  120. if excelEdbMapping.ExcelInfoId != customAnalysisData.ExcelInfoId {
  121. errMsg = `excel与指标关系异常`
  122. err = errors.New(errMsg)
  123. return
  124. }
  125. err = obj.refresh(to, edbInfo, customAnalysisData.DateList, customAnalysisData.DataList)
  126. }
  127. return
  128. }
  129. func (obj CustomAnalysis) Refresh(params RefreshParams) (err error, errMsg string) {
  130. return
  131. }
  132. func (obj CustomAnalysis) GetSource() int {
  133. return utils.DATA_SOURCE_CALCULATE_ZDYFX
  134. }
  135. func (obj CustomAnalysis) GetSourceName() string {
  136. return utils.DATA_SOURCE_NAME_CALCULATE_ZDYFX
  137. }
  138. func (obj CustomAnalysis) GetEdbType() int {
  139. return utils.CALCULATE_EDB_TYPE
  140. }
  141. type UpdateEdbDataStr struct {
  142. Value string `description:"数据对应的最新值"`
  143. DataTime string `description:"数据对应的日期"`
  144. }
  145. func (obj CustomAnalysis) refresh(to *gorm.DB, edbInfo *EdbInfo, dateList []string, dataList []float64) (err error) {
  146. edbInfoId := edbInfo.EdbInfoId
  147. dataTableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
  148. edbInfoIdStr := strconv.Itoa(edbInfoId)
  149. if len(dateList) != len(dataList) {
  150. err = errors.New("数据集与日期集不匹配")
  151. return
  152. }
  153. existDataList, err := GetAllEdbDataListByTo(to, edbInfoId, edbInfo.Source, edbInfo.SubSource)
  154. if err != nil {
  155. return err
  156. }
  157. existDataMap := make(map[string]string)
  158. removeDataTimeMap := make(map[string]int) //需要移除的日期数据
  159. for _, v := range existDataList {
  160. existDataMap[v.DataTime] = v.Value
  161. removeDataTimeMap[v.DataTime] = 1
  162. }
  163. needAddDateMap := make(map[time.Time]int)
  164. var isAdd, isUpdate bool
  165. addSql := ` INSERT INTO ` + dataTableName + `(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  166. updateEdbDataStrList := make([]UpdateEdbDataStr, 0)
  167. updateSql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  168. updateSql = fmt.Sprintf(updateSql, dataTableName)
  169. for i, currDateStr := range dateList {
  170. currVal := dataList[i] // 当前日期对应的值
  171. currTime, tmpErr := time.ParseInLocation(utils.FormatDate, currDateStr, time.Local)
  172. if tmpErr != nil {
  173. err = tmpErr
  174. return
  175. }
  176. saveValue := decimal.NewFromFloat(currVal).Round(4).String()
  177. existVal, ok := existDataMap[currDateStr]
  178. if ok {
  179. delete(removeDataTimeMap, currDateStr)
  180. existValDec, _ := decimal.NewFromString(existVal)
  181. existVal = existValDec.Round(4).String()
  182. if existVal != saveValue {
  183. isUpdate = true
  184. updateEdbDataStrList = append(updateEdbDataStrList, UpdateEdbDataStr{
  185. Value: saveValue,
  186. DataTime: currDateStr,
  187. })
  188. }
  189. continue
  190. }
  191. timestamp := currTime.UnixNano() / 1e6
  192. timeStr := fmt.Sprintf("%d", timestamp)
  193. if _, existOk := needAddDateMap[currTime]; !existOk {
  194. addSql += GetAddSql(edbInfoIdStr, edbInfo.EdbCode, currDateStr, timeStr, saveValue)
  195. isAdd = true
  196. }
  197. needAddDateMap[currTime] = 1
  198. }
  199. {
  200. removeDateList := make([]string, 0)
  201. for dateTime := range removeDataTimeMap {
  202. removeDateList = append(removeDateList, dateTime)
  203. }
  204. removeNum := len(removeDateList)
  205. if removeNum > 0 {
  206. sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (`+utils.GetOrmInReplace(removeNum)+`) `, dataTableName)
  207. err = to.Exec(sql, edbInfo.EdbInfoId, removeDateList).Error
  208. if err != nil {
  209. fmt.Println(reflect.TypeOf(obj).Name(), " add data ;delete Err", err.Error())
  210. err = fmt.Errorf("删除不存在的指标数据失败,Err:" + err.Error())
  211. return
  212. }
  213. }
  214. }
  215. if isAdd {
  216. addSql = strings.TrimRight(addSql, ",")
  217. err = to.Exec(addSql).Error
  218. if err != nil {
  219. fmt.Println(reflect.TypeOf(obj).Name(), " add data Err", err.Error())
  220. return
  221. }
  222. }
  223. if isUpdate {
  224. updateSql = ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  225. updateSql = fmt.Sprintf(updateSql, dataTableName)
  226. for _, v := range updateEdbDataStrList {
  227. if v.Value == "" || v.DataTime == "" {
  228. continue
  229. }
  230. err = to.Exec(updateSql, v.Value, edbInfoId, v.DataTime).Error
  231. if err != nil {
  232. fmt.Println(reflect.TypeOf(obj).Name(), " update data Err", err.Error())
  233. return
  234. }
  235. }
  236. }
  237. return
  238. }
  239. func (obj CustomAnalysis) ResetData(edbInfo *EdbInfo, dateList []string, dataList []float64) (err error, errMsg string) {
  240. to := global.DEFAULT_DmSQL.Begin()
  241. defer func() {
  242. if err != nil {
  243. to.Rollback()
  244. } else {
  245. to.Commit()
  246. }
  247. }()
  248. err = obj.refresh(to, edbInfo, dateList, dataList)
  249. return
  250. }
  251. type ResetCustomAnalysisData struct {
  252. EdbInfoId int
  253. DateList []string
  254. DataList []float64
  255. }