base_from_baiinfo.go 8.6 KB

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