base_from_baiinfo.go 7.1 KB

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