base_from_baiinfo.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/utils"
  5. "fmt"
  6. "gorm.io/gorm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. type BaseFromBaiinfoData struct {
  12. BaiinfoDataId int `gorm:"column:baiinfo_data_id;primaryKey"`
  13. //BaiinfoDataId int `orm:"column(baiinfo_data_id);pk"`
  14. BaseFromBaiinfoIndexId int
  15. IndexCode string
  16. DataTime string
  17. Value string
  18. CreateTime time.Time
  19. ModifyTime time.Time
  20. DataTimestamp int64
  21. }
  22. func (e *BaseFromBaiinfoData) AfterFind(db *gorm.DB) (err error) {
  23. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  24. return
  25. }
  26. func GetBaseFromBaiinfoDataByCondition(condition string, pars []interface{}) (list []*BaseFromBaiinfoData, err error) {
  27. //o := orm.NewOrm()
  28. sql := `SELECT * FROM base_from_baiinfo_data WHERE 1=1 `
  29. if condition != "" {
  30. sql += condition
  31. }
  32. //_, err = o.Raw(sql, pars).QueryRows(&list)
  33. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  34. return
  35. }
  36. // AddEdbDataFromBaiinfo 新增百川盈弗指标数据
  37. func AddEdbDataFromBaiinfo(edbCode string) (err error) {
  38. //o := orm.NewOrm()
  39. var condition string
  40. var pars []interface{}
  41. if edbCode != "" {
  42. condition += " AND index_code=? "
  43. pars = append(pars, edbCode)
  44. }
  45. baiinfoBaseDataAll, err := GetBaseFromBaiinfoDataByCondition(condition, pars)
  46. if err != nil && !utils.IsErrNoRow(err) {
  47. return
  48. }
  49. var isAdd bool
  50. addSql := ` INSERT INTO edb_data_baiinfo(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  51. existMap := make(map[string]string)
  52. for _, sv := range baiinfoBaseDataAll {
  53. eDate := sv.DataTime
  54. dataTime, err := time.Parse(utils.FormatDate, eDate)
  55. if err != nil {
  56. return err
  57. }
  58. timestamp := dataTime.UnixNano() / 1e6
  59. timeStr := fmt.Sprintf("%d", timestamp)
  60. if _, ok := existMap[eDate]; !ok {
  61. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  62. isAdd = true
  63. }
  64. existMap[eDate] = sv.Value
  65. }
  66. if isAdd {
  67. addSql = strings.TrimRight(addSql, ",")
  68. utils.FileLog.Info("addSql:" + addSql)
  69. err = global.DEFAULT_DB.Exec(addSql).Error
  70. //_, err = o.Raw(addSql).Exec()
  71. if err != nil {
  72. return err
  73. }
  74. }
  75. return
  76. }
  77. // RefreshEdbDataFromBaiinfo 刷新百川盈弗指标数据
  78. func RefreshEdbDataFromBaiinfo(edbInfoId int, edbCode, startDate string) (err error) {
  79. source := utils.DATA_SOURCE_BAIINFO
  80. subSource := utils.DATA_SUB_SOURCE_EDB
  81. //o := orm.NewOrm()
  82. if err != nil {
  83. return
  84. }
  85. edbInfoIdStr := strconv.Itoa(edbInfoId)
  86. //计算数据
  87. var condition string
  88. var pars []interface{}
  89. if edbCode != "" {
  90. condition += " AND index_code=? "
  91. pars = append(pars, edbCode)
  92. }
  93. if startDate != "" {
  94. condition += " AND data_time>=? "
  95. pars = append(pars, startDate)
  96. }
  97. baiinfoDataList, err := GetBaseFromBaiinfoDataByCondition(condition, pars)
  98. if err != nil {
  99. return
  100. }
  101. // 真实数据的最大日期 , 插入规则配置的日期
  102. var realDataMaxDate, edbDataInsertConfigDate time.Time
  103. var edbDataInsertConfig *EdbDataInsertConfig
  104. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  105. {
  106. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  107. if err != nil && !utils.IsErrNoRow(err) {
  108. return
  109. }
  110. if edbDataInsertConfig != nil {
  111. edbDataInsertConfigDate = edbDataInsertConfig.Date
  112. }
  113. }
  114. var existCondition string
  115. var existPars []interface{}
  116. existCondition += " AND edb_info_id=? "
  117. existPars = append(existPars, edbInfoId)
  118. if startDate != "" {
  119. existCondition += " AND data_time>=? "
  120. existPars = append(existPars, startDate)
  121. }
  122. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  123. if err != nil {
  124. return err
  125. }
  126. existMap := make(map[string]*EdbInfoSearchData)
  127. for _, v := range existList {
  128. existMap[v.DataTime] = v
  129. }
  130. addSql := ` INSERT INTO edb_data_baiinfo(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  131. var isAdd bool
  132. for _, v := range baiinfoDataList {
  133. item := v
  134. eDate := item.DataTime
  135. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  136. if err != nil {
  137. return err
  138. }
  139. if findItem, ok := existMap[v.DataTime]; !ok {
  140. sValue := item.Value
  141. timestamp := dataTime.UnixNano() / 1e6
  142. timeStr := fmt.Sprintf("%d", timestamp)
  143. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  144. isAdd = true
  145. } else {
  146. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  147. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
  148. if err != nil {
  149. return err
  150. }
  151. }
  152. }
  153. // 下面代码主要目的是处理掉手动插入的数据判断
  154. {
  155. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  156. realDataMaxDate = dataTime
  157. }
  158. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  159. isFindConfigDateRealData = true
  160. }
  161. }
  162. }
  163. // 处理手工数据补充的配置
  164. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  165. if isAdd {
  166. addSql = strings.TrimRight(addSql, ",")
  167. //_, err = o.Raw(addSql).Exec()
  168. err = global.DEFAULT_DB.Exec(addSql).Error
  169. if err != nil {
  170. fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
  171. return
  172. }
  173. }
  174. return
  175. }
  176. // HandleBaiinfoExcelDataReq 百川盈弗的excel数据
  177. type HandleBaiinfoExcelDataReq struct {
  178. BaseFilePath string
  179. RenameFilePath string
  180. IndexName string
  181. IndexCode string
  182. ExcelDataMap map[string]string
  183. TerminalCode string `description:"编码"`
  184. }
  185. type BaseFromBaiinfoIndex struct {
  186. BaseFromBaiinfoIndexId int64 `gorm:"column:base_from_baiinfo_index_id;primaryKey"`
  187. //BaseFromBaiinfoIndexId int64 `orm:"column(base_from_baiinfo_index_id);pk"`
  188. IndexCode string
  189. IndexName string
  190. Frequency string
  191. Unit string
  192. StartDate string
  193. EndDate string
  194. Sort int
  195. BaseFileName string
  196. RenameFileName string
  197. TerminalCode string
  198. CreateTime time.Time
  199. ModifyTime time.Time
  200. }
  201. func (e *BaseFromBaiinfoIndex) AfterFind(db *gorm.DB) (err error) {
  202. e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
  203. e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
  204. return
  205. }
  206. func (d *BaseFromBaiinfoIndex) AddBaseFromBaiinfoIndex() (lastId int64, err error) {
  207. //o := orm.NewOrm()
  208. //lastId, err = o.Insert(d)
  209. err = global.DEFAULT_DB.Create(&d).Error
  210. if err != nil {
  211. return
  212. }
  213. lastId = d.BaseFromBaiinfoIndexId
  214. return
  215. }
  216. func AddBaseFromBaiinfoData(item []*BaseFromBaiinfoData) (err error) {
  217. //o := orm.NewOrm()
  218. //_, err = o.InsertMulti(1, item)
  219. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  220. return
  221. }
  222. func (d *BaseFromBaiinfoIndex) GetSmmIndexItem(indexCode string) (item *BaseFromBaiinfoIndex, err error) {
  223. //o := orm.NewOrm()
  224. sql := ` SELECT * FROM base_from_baiinfo_index WHERE index_code=? `
  225. //err = o.Raw(sql, indexCode).QueryRow(&item)
  226. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  227. return
  228. }
  229. func GetBaseFromBaiinfoDataByCode(indexCode string) (list []*BaseFromBaiinfoData, err error) {
  230. //o := orm.NewOrm()
  231. sql := ` SELECT * FROM base_from_baiinfo_data WHERE index_code=? `
  232. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  233. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  234. return
  235. }
  236. func ModifyBaiinfoIndexSort(baseFromBaiinfoIndexId int64) (err error) {
  237. //o := orm.NewOrm()
  238. sql := ` UPDATE base_from_baiinfo_index SET sort=? WHERE base_from_baiinfo_index_id=? `
  239. //_, err = o.Raw(sql, baseFromBaiinfoIndexId, baseFromBaiinfoIndexId).Exec()
  240. err = global.DEFAULT_DB.Exec(sql, baseFromBaiinfoIndexId, baseFromBaiinfoIndexId).Error
  241. return
  242. }
  243. func GetBaiinfoIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  244. //o := orm.NewOrm()
  245. sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM base_from_baiinfo_data WHERE index_code=? `
  246. //err = o.Raw(sql, indexCode).QueryRow(&item)
  247. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  248. var latest_value float64
  249. sql = ` SELECT value AS latest_value FROM base_from_baiinfo_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
  250. //err = o.Raw(sql, indexCode).QueryRow(&latest_value)
  251. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&latest_value).Error
  252. item.LatestValue = latest_value
  253. return
  254. }
  255. func ModifyBaiinfoIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  256. //o := orm.NewOrm()
  257. sql := ` UPDATE base_from_baiinfo_index SET start_date=?,end_date=?,latest_value = ?,modify_time=NOW() WHERE index_code=? `
  258. //_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
  259. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
  260. return
  261. }
  262. // Update 修改
  263. func (r *BaseFromBaiinfoIndex) Update(updateCols []string) (err error) {
  264. //o := orm.NewOrm()
  265. //_, err = o.Update(r, updateCols...)
  266. err = global.DEFAULT_DB.Model(&r).Select(updateCols).Updates(&r).Error
  267. return
  268. }