base_from_smm.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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 BaseFromSmmData struct {
  11. SmmDataId int `orm:"column(smm_data_id);pk"`
  12. BaseFromSmmIndexId int
  13. IndexCode string
  14. DataTime string
  15. Value string
  16. CreateTime time.Time
  17. ModifyTime time.Time
  18. DataTimestamp int64
  19. }
  20. func AddBaseFromSmmData(item []*BaseFromSmmData) (err error) {
  21. o := orm.NewOrm()
  22. _, err = o.InsertMulti(len(item), item)
  23. return
  24. }
  25. func GetBaseFromSmmDataByCondition(condition string, pars []interface{}) (list []*BaseFromSmmData, err error) {
  26. o := orm.NewOrm()
  27. sql := `SELECT * FROM base_from_smm_data WHERE 1=1 `
  28. if condition != "" {
  29. sql += condition
  30. }
  31. _, err = o.Raw(sql, pars).QueryRows(&list)
  32. return
  33. }
  34. // 新增有色指标数据
  35. func AddEdbDataFromSmm(edbCode string) (err error) {
  36. o := orm.NewOrm()
  37. var condition string
  38. var pars []interface{}
  39. if edbCode != "" {
  40. condition += " AND index_code=? "
  41. pars = append(pars, edbCode)
  42. }
  43. smmBaseDataAll, err := GetBaseFromSmmDataByCondition(condition, pars)
  44. if err != nil && err.Error() != utils.ErrNoRow() {
  45. return
  46. }
  47. var isAdd bool
  48. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  49. existMap := make(map[string]string)
  50. for _, sv := range smmBaseDataAll {
  51. eDate := sv.DataTime
  52. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  53. if err != nil {
  54. return err
  55. }
  56. timestamp := dataTime.UnixNano() / 1e6
  57. timeStr := fmt.Sprintf("%d", timestamp)
  58. if _, ok := existMap[eDate]; !ok {
  59. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  60. isAdd = true
  61. }
  62. existMap[eDate] = sv.Value
  63. }
  64. if isAdd {
  65. addSql = strings.TrimRight(addSql, ",")
  66. utils.FileLog.Info("addSql:" + addSql)
  67. _, err = o.Raw(addSql).Exec()
  68. if err != nil {
  69. return err
  70. }
  71. }
  72. return
  73. }
  74. // RefreshEdbDataFromSmm 刷新有色指标数据
  75. func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error) {
  76. source := utils.DATA_SOURCE_YS
  77. subSource := utils.DATA_SUB_SOURCE_EDB
  78. o := orm.NewOrm()
  79. if err != nil {
  80. return
  81. }
  82. edbInfoIdStr := strconv.Itoa(edbInfoId)
  83. //计算数据
  84. var condition string
  85. var pars []interface{}
  86. if edbCode != "" {
  87. condition += " AND index_code=? "
  88. pars = append(pars, edbCode)
  89. }
  90. if startDate != "" {
  91. condition += " AND data_time>=? "
  92. pars = append(pars, startDate)
  93. }
  94. smmDataList, err := GetBaseFromSmmDataByCondition(condition, pars)
  95. if err != nil {
  96. return
  97. }
  98. // 真实数据的最大日期 , 插入规则配置的日期
  99. var realDataMaxDate, edbDataInsertConfigDate time.Time
  100. var edbDataInsertConfig *EdbDataInsertConfig
  101. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  102. {
  103. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  104. if err != nil && err.Error() != utils.ErrNoRow() {
  105. return
  106. }
  107. if edbDataInsertConfig != nil {
  108. edbDataInsertConfigDate = edbDataInsertConfig.Date
  109. }
  110. }
  111. var existCondition string
  112. var existPars []interface{}
  113. existCondition += " AND edb_info_id=? "
  114. existPars = append(existPars, edbInfoId)
  115. if startDate != "" {
  116. existCondition += " AND data_time>=? "
  117. existPars = append(existPars, startDate)
  118. }
  119. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  120. if err != nil {
  121. return err
  122. }
  123. existMap := make(map[string]*EdbInfoSearchData)
  124. for _, v := range existList {
  125. existMap[v.DataTime] = v
  126. }
  127. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  128. var isAdd bool
  129. for _, v := range smmDataList {
  130. item := v
  131. eDate := item.DataTime
  132. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  133. if err != nil {
  134. return err
  135. }
  136. if findItem, ok := existMap[v.DataTime]; !ok {
  137. sValue := item.Value
  138. timestamp := dataTime.UnixNano() / 1e6
  139. timeStr := fmt.Sprintf("%d", timestamp)
  140. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  141. isAdd = true
  142. } else {
  143. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  144. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
  145. if err != nil {
  146. return err
  147. }
  148. }
  149. }
  150. // 下面代码主要目的是处理掉手动插入的数据判断
  151. {
  152. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  153. realDataMaxDate = dataTime
  154. }
  155. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  156. isFindConfigDateRealData = true
  157. }
  158. }
  159. }
  160. // 处理手工数据补充的配置
  161. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  162. if isAdd {
  163. addSql = strings.TrimRight(addSql, ",")
  164. _, err = o.Raw(addSql).Exec()
  165. if err != nil {
  166. fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
  167. return
  168. }
  169. }
  170. return
  171. }
  172. type BaseFromSmmIndex struct {
  173. BaseFromSmmIndexId int64 `orm:"column(base_from_smm_index_id);pk"`
  174. ClassifyId int
  175. Interface string
  176. Name string
  177. IndexCode string
  178. IndexName string
  179. Type1 string `orm:"column(type_1)"`
  180. Type2 string `orm:"column(type_2)"`
  181. Type3 string `orm:"column(type_3)"`
  182. Frequency string
  183. Unit string
  184. ApiStartTime string
  185. ApiUpdateTime string
  186. StartTime string
  187. FinishTime string
  188. BaseFileName string
  189. RenameFileName string
  190. StartDate string
  191. EndDate string
  192. TerminalCode string `description:"编码"`
  193. CreateTime time.Time
  194. ModifyTime time.Time
  195. }
  196. func (d *BaseFromSmmIndex) AddBaseFromSmmIndex() (lastId int64, err error) {
  197. o := orm.NewOrm()
  198. lastId, err = o.Insert(d)
  199. return
  200. }
  201. func (d *BaseFromSmmIndex) GetSmmIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
  202. o := orm.NewOrm()
  203. sql := ` SELECT * FROM base_from_smm_index WHERE index_code=? `
  204. fmt.Println(sql, indexCode)
  205. err = o.Raw(sql, indexCode).QueryRow(&item)
  206. return
  207. }
  208. // Add 新增
  209. func (m *BaseFromSmmIndex) Add() (err error) {
  210. o := orm.NewOrm()
  211. _, err = o.Insert(m)
  212. return
  213. }
  214. func GetBaseFromSmmDataBySmmCode(smmCode string) (list []*BaseFromSmmData, err error) {
  215. o := orm.NewOrm()
  216. sql := ` SELECT * FROM base_from_smm_data WHERE index_code=? `
  217. _, err = o.Raw(sql, smmCode).QueryRows(&list)
  218. return
  219. }
  220. func ModifySmmIndexSort(baseFromSmmIndexId int64) (err error) {
  221. o := orm.NewOrm()
  222. sql := ` UPDATE base_from_smm_index SET sort=? WHERE base_from_smm_index_id=? `
  223. _, err = o.Raw(sql, baseFromSmmIndexId, baseFromSmmIndexId).Exec()
  224. return
  225. }
  226. func GetSmmIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  227. o := orm.NewOrm()
  228. 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_smm_data WHERE index_code=? `
  229. err = o.Raw(sql, indexCode).QueryRow(&item)
  230. return
  231. }
  232. func ModifySmmIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  233. o := orm.NewOrm()
  234. sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,modify_time=NOW() WHERE index_code=? `
  235. _, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
  236. return
  237. }
  238. // HandleSmmExcelDataReq SMM的excel数据
  239. type HandleSmmExcelDataReq struct {
  240. BaseFilePath string
  241. RenameFilePath string
  242. IndexName string
  243. Source string
  244. IndexCode string
  245. Unit string
  246. Frequency string
  247. ExcelDataMap map[string]string
  248. TerminalCode string `description:"编码"`
  249. }
  250. // MultiUpdateBaseFromSmmDataValue 批量更新SMM指标数据
  251. func MultiUpdateBaseFromSmmDataValue(items []*BaseFromSmmData) (err error) {
  252. if len(items) == 0 {
  253. return
  254. }
  255. o := orm.NewOrm()
  256. sql := `UPDATE base_from_smm_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
  257. p, err := o.Raw(sql).Prepare()
  258. if err != nil {
  259. return
  260. }
  261. defer func() {
  262. _ = p.Close()
  263. }()
  264. for _, v := range items {
  265. if v.IndexCode == "" || v.DataTime == "" {
  266. continue
  267. }
  268. _, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
  269. if err != nil {
  270. return
  271. }
  272. }
  273. return
  274. }
  275. type AddSmmIndexToDataSourceResp struct {
  276. EdbCode string `description:"指标编码"`
  277. ClassifyId int `description:"指标分类"`
  278. SysUserId int `description:"操作人id"`
  279. SysUserRealName string `description:"操作人真实名称"`
  280. }
  281. func (m *BaseFromSmmIndex) GetIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
  282. o := orm.NewOrm()
  283. sql := `SELECT * FROM base_from_smm_index WHERE index_code = ? `
  284. err = o.Raw(sql, indexCode).QueryRow(&item)
  285. return
  286. }
  287. // 修改
  288. func (m *BaseFromSmmIndex) Update(updateParams, whereParam map[string]interface{}) (err error) {
  289. to := orm.NewOrm()
  290. ptrStructOrTableName := "base_from_smm_index"
  291. qs := to.QueryTable(ptrStructOrTableName)
  292. for expr, exprV := range whereParam {
  293. qs = qs.Filter(expr, exprV)
  294. }
  295. _, err = qs.Update(updateParams)
  296. return
  297. }