base_from_sci99.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package models
  2. import (
  3. "eta/eta_index_lib/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "strconv"
  7. "strings"
  8. "time"
  9. )
  10. package models
  11. import (
  12. "github.com/beego/beego/v2/client/orm"
  13. "time"
  14. )
  15. // BaseFromSci99Index 代表卓创资讯-原始指标表的结构
  16. type BaseFromSci99Index struct {
  17. BaseFromSciIndexId int `orm:"column(base_from_sci_index_id);pk"` // 主键,自动递增
  18. IndexCode string // 指标编码
  19. IndexName string // 指标名称
  20. ClassifyId int // 分类Id
  21. Unit string // 单位
  22. Frequency string // 频度
  23. Describe string // 指标描述
  24. CreateTime time.Time // 创建时间
  25. ModifyTime time.Time // 修改时间
  26. }
  27. // BaseFromSci99Data 代表卓创资讯-原始指标数据表的结构
  28. type BaseFromSci99Data struct {
  29. BaseFromSciDataId int `orm:"column(base_from_sci_data_id);pk"` // 主键,自动递增
  30. BaseFromSciIndexId int // 指标id
  31. IndexCode string // 指标编码
  32. DataTime string // 数据日期
  33. Value string // 数据值
  34. CreateTime time.Time // 创建时间
  35. ModifyTime time.Time // 修改时间
  36. }
  37. // BaseFromSci99Classify 代表卓创资讯-原始指标分类表的结构
  38. type BaseFromSci99Classify struct {
  39. BaseFromSciClassifyId int `orm:"column(base_from_sci_classify_id);pk"` // 主键,自动递增
  40. ClassifyName string // 分类名称
  41. Sort int // 排序
  42. CreateTime time.Time // 创建时间
  43. ModifyTime time.Time // 修改时间
  44. }
  45. func GetBaseFromSci99DataDataByCondition(condition string, pars []interface{}) (item []*BaseFromIcpiData, err error) {
  46. sql := ` SELECT * FROM base_from_sci99_data WHERE 1=1 `
  47. o := orm.NewOrm()
  48. if condition != "" {
  49. sql += condition
  50. }
  51. sql += ` ORDER BY data_time DESC `
  52. _, err = o.Raw(sql, pars).QueryRows(&item)
  53. return
  54. }
  55. // 添加数据
  56. func AddBaseFromSci99Index(item *BaseFromSci99Index) (lastId int64, err error) {
  57. o := orm.NewOrmUsingDB("data")
  58. lastId, err = o.Insert(item)
  59. return
  60. }
  61. func AddBaseFromSci99Classify(item *BaseFromSci99Classify) (lastId int64, err error) {
  62. o := orm.NewOrmUsingDB("data")
  63. lastId, err = o.Insert(item)
  64. return
  65. }
  66. func AddBaseFromSci99DataMulti(item []*BaseFromSci99Data) (err error) {
  67. o := orm.NewOrmUsingDB("data")
  68. _, err = o.InsertMulti(1000, item)
  69. return
  70. }
  71. func GetBaseFromSci99Index() (list []*BaseFromSci99Index, err error) {
  72. o := orm.NewOrmUsingDB("data")
  73. sql := `SELECT * FROM base_from_sci99_index `
  74. _, err = o.Raw(sql).QueryRows(&list)
  75. return
  76. }
  77. func GetBaseFromSci99DataByIndexCode(indexCode string) (items []*BaseFromSci99Data, err error) {
  78. o := orm.NewOrm()
  79. sql := `SELECT * FROM base_from_sci99_data WHERE index_code=? `
  80. _, err = o.Raw(sql, indexCode).QueryRows(&items)
  81. return
  82. }
  83. // 新增卓创资讯指标数据
  84. func AddEdbDataFromSci99(edbCode string) (err error) {
  85. o := orm.NewOrm()
  86. dataAll, err := GetBaseFromSci99DataByIndexCode(edbCode)
  87. if err != nil && err.Error() != utils.ErrNoRow() {
  88. return
  89. }
  90. var isAdd bool
  91. addSql := ` INSERT INTO edb_data_sci99(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  92. existMap := make(map[string]string)
  93. for _, sv := range dataAll {
  94. eDate := sv.DataTime
  95. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  96. if err != nil {
  97. fmt.Println("time.Parse Err:" + eDate)
  98. return err
  99. }
  100. timestamp := dataTime.UnixNano() / 1e6
  101. timeStr := fmt.Sprintf("%d", timestamp)
  102. if _, ok := existMap[eDate]; !ok {
  103. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  104. isAdd = true
  105. }
  106. }
  107. if isAdd {
  108. addSql = strings.TrimRight(addSql, ",")
  109. utils.FileLog.Info("addSql:" + addSql)
  110. _, err = o.Raw(addSql).Exec()
  111. if err != nil {
  112. return err
  113. }
  114. }
  115. return
  116. }
  117. // 刷新卓创资讯指标数据
  118. func RefreshEdbDataFromSci99(edbInfoId int, edbCode, startDate string) (err error) {
  119. source := utils.DATA_SOURCE_SCI99
  120. subSource := utils.DATA_SUB_SOURCE_EDB
  121. o := orm.NewOrm()
  122. if err != nil {
  123. return
  124. }
  125. edbInfoIdStr := strconv.Itoa(edbInfoId)
  126. //计算数据
  127. var condition string
  128. var pars []interface{}
  129. if edbCode != "" {
  130. condition += " AND index_code=? "
  131. pars = append(pars, edbCode)
  132. }
  133. if startDate != "" {
  134. condition += " AND data_time>=? "
  135. pars = append(pars, startDate)
  136. }
  137. dataList, err := GetBaseFromSci99DataDataByCondition(condition, pars)
  138. if err != nil {
  139. return
  140. }
  141. // 真实数据的最大日期 , 插入规则配置的日期
  142. var realDataMaxDate, edbDataInsertConfigDate time.Time
  143. var edbDataInsertConfig *EdbDataInsertConfig
  144. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  145. {
  146. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  147. if err != nil && err.Error() != utils.ErrNoRow() {
  148. return
  149. }
  150. if edbDataInsertConfig != nil {
  151. edbDataInsertConfigDate = edbDataInsertConfig.Date
  152. }
  153. }
  154. //获取指标所有数据
  155. var existCondition string
  156. var existPars []interface{}
  157. existCondition += " AND edb_info_id=? "
  158. existPars = append(existPars, edbInfoId)
  159. if startDate != "" {
  160. existCondition += " AND data_time>=? "
  161. existPars = append(existPars, startDate)
  162. }
  163. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  164. if err != nil {
  165. return err
  166. }
  167. existMap := make(map[string]*EdbInfoSearchData)
  168. for _, v := range existList {
  169. existMap[v.DataTime] = v
  170. }
  171. addSql := ` INSERT INTO edb_data_sci99(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  172. var isAdd bool
  173. for _, v := range dataList {
  174. item := v
  175. itemValue := v.Value
  176. eDate := item.DataTime
  177. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  178. if err != nil {
  179. return err
  180. }
  181. if _, ok := existMap[v.DataTime]; !ok {
  182. sValue := itemValue
  183. if sValue != "" {
  184. timestamp := dataTime.UnixNano() / 1e6
  185. timeStr := fmt.Sprintf("%d", timestamp)
  186. saveValue := sValue
  187. if findItem, ok := existMap[eDate]; !ok {
  188. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
  189. isAdd = true
  190. } else {
  191. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != sValue {
  192. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, sValue)
  193. if err != nil {
  194. return err
  195. }
  196. }
  197. }
  198. }
  199. }
  200. // 下面代码主要目的是处理掉手动插入的数据判断
  201. {
  202. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  203. realDataMaxDate = dataTime
  204. }
  205. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  206. isFindConfigDateRealData = true
  207. }
  208. }
  209. }
  210. // 处理手工数据补充的配置
  211. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  212. if isAdd {
  213. addSql = strings.TrimRight(addSql, ",")
  214. _, err = o.Raw(addSql).Exec()
  215. if err != nil {
  216. return err
  217. }
  218. }
  219. return
  220. }