base_from_smm.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  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 BaseFromSmmData struct {
  11. SmmDataId int `gorm:"column:smm_data_id;primaryKey"`
  12. //SmmDataId int `orm:"column(smm_data_id);pk"`
  13. BaseFromSmmIndexId int
  14. IndexCode string
  15. DataTime string
  16. Value string
  17. CreateTime time.Time
  18. ModifyTime time.Time
  19. DataTimestamp int64
  20. }
  21. func (s *BaseFromSmmData) Update(cols []string) (err error) {
  22. //o := orm.NewOrm()
  23. //_, err = o.Update(s, cols...)
  24. err = global.DEFAULT_DB.Model(&s).Select(cols).Updates(&s).Error
  25. return
  26. }
  27. func AddBaseFromSmmData(item []*BaseFromSmmData) (err error) {
  28. //o := orm.NewOrm()
  29. //_, err = o.InsertMulti(500, item)
  30. err = global.DEFAULT_DB.CreateInBatches(item, 500).Error
  31. return
  32. }
  33. func GetBaseFromSmmDataByCondition(condition string, pars []interface{}) (list []*BaseFromSmmData, err error) {
  34. //o := orm.NewOrm()
  35. sql := `SELECT * FROM base_from_smm_data WHERE 1=1 `
  36. if condition != "" {
  37. sql += condition
  38. }
  39. //_, err = o.Raw(sql, pars).QueryRows(&list)
  40. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  41. return
  42. }
  43. func UpdateBaseFromSmmDataListByIndexCode(items []*BaseFromSmmData) (err error) {
  44. //o := orm.NewOrm()
  45. to := global.DEFAULT_DB.Begin()
  46. defer func() {
  47. if err != nil {
  48. _ = to.Rollback()
  49. } else {
  50. _ = to.Commit()
  51. }
  52. }()
  53. sql := `UPDATE base_from_smm_data SET value=? WHERE index_code=? AND data_time=? `
  54. for _, item := range items {
  55. err = to.Exec(sql, item.Value, item.IndexCode, item.DataTime).Error
  56. if err != nil {
  57. return
  58. }
  59. }
  60. //stmt, err := o.Raw(sql).Prepare()
  61. //if err != nil {
  62. // return
  63. //}
  64. //defer stmt.Close()
  65. //for _, item := range items {
  66. // _, err = stmt.Exec(item.Value, item.IndexCode, item.DataTime)
  67. // if err != nil {
  68. // return
  69. // }
  70. //}
  71. return
  72. }
  73. func GetBaseFromSmmDataByIds(smmDataIds []int) (list []*BaseFromSmmData, err error) {
  74. if len(smmDataIds) == 0 {
  75. return
  76. }
  77. //o := orm.NewOrm()
  78. //sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND base_from_smm_index_id in (` + utils.GetOrmInReplace(len(smmDataIds)) + `)`
  79. sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND base_from_smm_index_id in ?`
  80. //_, err = o.Raw(sql, smmDataIds).QueryRows(&list)
  81. err = global.DEFAULT_DB.Raw(sql, smmDataIds).Find(&list).Error
  82. return
  83. }
  84. func GetBaseFromSmmDataByCodeAndDate(indexCode string, dataTime string) (item *BaseFromSmmData, err error) {
  85. //o := orm.NewOrm()
  86. sql := `SELECT * FROM base_from_smm_data WHERE 1=1 AND index_code=? AND data_time=? `
  87. //err = o.Raw(sql, indexCode, dataTime).QueryRow(&item)
  88. err = global.DEFAULT_DB.Raw(sql, indexCode, dataTime).First(&item).Error
  89. return
  90. }
  91. // 新增有色指标数据
  92. func AddEdbDataFromSmm(edbCode string, smmBaseDataAll []*BaseFromSmmData) (err error) {
  93. //o := orm.NewOrm()
  94. var isAdd bool
  95. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  96. existMap := make(map[string]string)
  97. for _, sv := range smmBaseDataAll {
  98. eDate := sv.DataTime
  99. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  100. if err != nil {
  101. return err
  102. }
  103. timestamp := dataTime.UnixNano() / 1e6
  104. timeStr := fmt.Sprintf("%d", timestamp)
  105. if _, ok := existMap[eDate]; !ok {
  106. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  107. isAdd = true
  108. }
  109. existMap[eDate] = sv.Value
  110. }
  111. if isAdd {
  112. addSql = strings.TrimRight(addSql, ",")
  113. utils.FileLog.Info("addSql:" + addSql)
  114. //_, err = o.Raw(addSql).Exec()
  115. err = global.DEFAULT_DB.Exec(addSql).Error
  116. if err != nil {
  117. return err
  118. }
  119. }
  120. return
  121. }
  122. // RefreshEdbDataFromSmm 刷新有色指标数据
  123. func RefreshEdbDataFromSmm(edbInfoId int, edbCode, startDate string) (err error) {
  124. source := utils.DATA_SOURCE_YS
  125. subSource := utils.DATA_SUB_SOURCE_EDB
  126. //o := orm.NewOrm()
  127. if err != nil {
  128. return
  129. }
  130. edbInfoIdStr := strconv.Itoa(edbInfoId)
  131. //计算数据
  132. var condition string
  133. var pars []interface{}
  134. if edbCode != "" {
  135. condition += " AND index_code=? "
  136. pars = append(pars, edbCode)
  137. }
  138. if startDate != "" {
  139. condition += " AND data_time>=? "
  140. pars = append(pars, startDate)
  141. }
  142. smmDataList, err := GetBaseFromSmmDataByCondition(condition, pars)
  143. if err != nil {
  144. return
  145. }
  146. // 真实数据的最大日期 , 插入规则配置的日期
  147. var realDataMaxDate, edbDataInsertConfigDate time.Time
  148. var edbDataInsertConfig *EdbDataInsertConfig
  149. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  150. {
  151. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  152. if err != nil && !utils.IsErrNoRow(err) {
  153. return
  154. }
  155. if edbDataInsertConfig != nil {
  156. edbDataInsertConfigDate = edbDataInsertConfig.Date
  157. }
  158. }
  159. var existCondition string
  160. var existPars []interface{}
  161. existCondition += " AND edb_info_id=? "
  162. existPars = append(existPars, edbInfoId)
  163. if startDate != "" {
  164. existCondition += " AND data_time>=? "
  165. existPars = append(existPars, startDate)
  166. }
  167. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  168. if err != nil {
  169. return err
  170. }
  171. existMap := make(map[string]*EdbInfoSearchData)
  172. for _, v := range existList {
  173. existMap[v.DataTime] = v
  174. }
  175. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  176. var isAdd bool
  177. for _, v := range smmDataList {
  178. item := v
  179. eDate := item.DataTime
  180. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  181. if err != nil {
  182. return err
  183. }
  184. if findItem, ok := existMap[v.DataTime]; !ok {
  185. sValue := item.Value
  186. timestamp := dataTime.UnixNano() / 1e6
  187. timeStr := fmt.Sprintf("%d", timestamp)
  188. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  189. isAdd = true
  190. } else {
  191. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  192. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
  193. if err != nil {
  194. return err
  195. }
  196. }
  197. }
  198. // 下面代码主要目的是处理掉手动插入的数据判断
  199. {
  200. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  201. realDataMaxDate = dataTime
  202. }
  203. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  204. isFindConfigDateRealData = true
  205. }
  206. }
  207. }
  208. // 处理手工数据补充的配置
  209. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  210. if isAdd {
  211. addSql = strings.TrimRight(addSql, ",")
  212. err = global.DEFAULT_DB.Exec(addSql).Error
  213. //_, err = o.Raw(addSql).Exec()
  214. if err != nil {
  215. fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
  216. return
  217. }
  218. }
  219. return
  220. }
  221. type BaseFromSmmIndex struct {
  222. BaseFromSmmIndexId int64 `gorm:"column:base_from_smm_index_id;primaryKey"`
  223. //BaseFromSmmIndexId int64 `orm:"column(base_from_smm_index_id);pk"`
  224. ClassifyId int
  225. Interface string
  226. Name string
  227. IndexCode string
  228. IndexName string
  229. Type1 string `orm:"column(type_1)"`
  230. Type2 string `orm:"column(type_2)"`
  231. Type3 string `orm:"column(type_3)"`
  232. Frequency string
  233. Unit string
  234. ApiStartTime string
  235. ApiUpdateTime string
  236. StartTime string
  237. FinishTime string
  238. BaseFileName string
  239. RenameFileName string
  240. StartDate string
  241. EndDate string
  242. TerminalCode string `description:"编码"`
  243. CreateTime time.Time
  244. ModifyTime time.Time
  245. DataState string
  246. ReleaseTime string
  247. }
  248. func (d *BaseFromSmmIndex) AddBaseFromSmmIndex() (lastId int64, err error) {
  249. //o := orm.NewOrm()
  250. //lastId, err = o.Insert(d)
  251. err = global.DEFAULT_DB.Create(&d).Error
  252. if err != nil {
  253. return
  254. }
  255. lastId = d.BaseFromSmmIndexId
  256. return
  257. }
  258. func (d *BaseFromSmmIndex) GetSmmIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
  259. //o := orm.NewOrm()
  260. sql := ` SELECT * FROM base_from_smm_index WHERE index_code=? `
  261. //fmt.Println(sql, indexCode)
  262. //err = o.Raw(sql, indexCode).QueryRow(&item)
  263. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  264. return
  265. }
  266. // Add 新增
  267. func (m *BaseFromSmmIndex) Add() (err error) {
  268. //o := orm.NewOrm()
  269. //_, err = o.Insert(m)
  270. err = global.DEFAULT_DB.Create(&m).Error
  271. return
  272. }
  273. func GetBaseFromSmmDataBySmmCode(smmCode string) (list []*BaseFromSmmData, err error) {
  274. //o := orm.NewOrm()
  275. sql := ` SELECT * FROM base_from_smm_data WHERE index_code=? `
  276. //_, err = o.Raw(sql, smmCode).QueryRows(&list)
  277. err = global.DEFAULT_DB.Raw(sql, smmCode).Find(&list).Error
  278. return
  279. }
  280. func ModifySmmIndexSort(baseFromSmmIndexId int64) (err error) {
  281. //o := orm.NewOrm()
  282. sql := ` UPDATE base_from_smm_index SET sort=? WHERE base_from_smm_index_id=? `
  283. //_, err = o.Raw(sql, baseFromSmmIndexId, baseFromSmmIndexId).Exec()
  284. err = global.DEFAULT_DB.Exec(sql, baseFromSmmIndexId, baseFromSmmIndexId).Error
  285. return
  286. }
  287. func GetSmmIndexInfoMaxAndMinInfo(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  288. //o := orm.NewOrm()
  289. 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=? `
  290. //err = o.Raw(sql, indexCode).QueryRow(&item)
  291. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  292. if err != nil {
  293. return
  294. }
  295. // 获取最新值
  296. var latest_value float64
  297. sql = ` SELECT value AS latest_value FROM base_from_smm_data WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
  298. //err = o.Raw(sql, indexCode).QueryRow(&latest_value)
  299. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latest_value).Error
  300. if err != nil {
  301. return
  302. }
  303. item.LatestValue = latest_value
  304. return
  305. }
  306. func ModifySmmIndexMaxAndMinInfo(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  307. //o := orm.NewOrm()
  308. sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,end_value=?,modify_time=NOW() WHERE index_code=? `
  309. //_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Exec()
  310. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
  311. return
  312. }
  313. // HandleSmmExcelDataReq SMM的excel数据
  314. type HandleSmmExcelDataReq struct {
  315. BaseFilePath string
  316. RenameFilePath string
  317. IndexName string
  318. Source string
  319. IndexCode string
  320. Unit string
  321. Frequency string
  322. ExcelDataMap map[string]string
  323. TerminalCode string `description:"编码"`
  324. }
  325. // MultiUpdateBaseFromSmmDataValue 批量更新SMM指标数据
  326. func MultiUpdateBaseFromSmmDataValue(items []*BaseFromSmmData) (err error) {
  327. if len(items) == 0 {
  328. return
  329. }
  330. //o := orm.NewOrm()
  331. to := global.DEFAULT_DB.Begin()
  332. defer func() {
  333. if err != nil {
  334. _ = to.Rollback()
  335. } else {
  336. _ = to.Commit()
  337. }
  338. }()
  339. sql := `UPDATE base_from_smm_data SET value = ?, modify_time = NOW() WHERE index_code = ? AND data_time = ? LIMIT 1`
  340. for _, v := range items {
  341. if v.IndexCode == "" || v.DataTime == "" {
  342. continue
  343. }
  344. //_, err = o.Raw(sql, v.Value, v.IndexCode, v.DataTime).Exec()
  345. err = to.Exec(sql, v.Value, v.IndexCode, v.DataTime).Error
  346. if err != nil {
  347. return
  348. }
  349. }
  350. //p, err := o.Raw(sql).Prepare()
  351. //if err != nil {
  352. // return
  353. //}
  354. //defer func() {
  355. // _ = p.Close()
  356. //}()
  357. //for _, v := range items {
  358. // if v.IndexCode == "" || v.DataTime == "" {
  359. // continue
  360. // }
  361. // _, err = p.Exec(v.Value, v.IndexCode, v.DataTime)
  362. // if err != nil {
  363. // return
  364. // }
  365. //}
  366. return
  367. }
  368. type AddSmmIndexToDataSourceResp struct {
  369. EdbCode string `description:"指标编码"`
  370. ClassifyId int `description:"指标分类"`
  371. SysUserId int `description:"操作人id"`
  372. SysUserRealName string `description:"操作人真实名称"`
  373. }
  374. func (m *BaseFromSmmIndex) GetIndexItem(indexCode string) (item *BaseFromSmmIndex, err error) {
  375. //o := orm.NewOrm()
  376. sql := `SELECT * FROM base_from_smm_index WHERE index_code = ? `
  377. //err = o.Raw(sql, indexCode).QueryRow(&item)
  378. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  379. return
  380. }
  381. // 修改
  382. func (m *BaseFromSmmIndex) Update(updateParams, whereParam map[string]interface{}) (err error) {
  383. //to := orm.NewOrm()
  384. tx := global.DEFAULT_DB.Model(&BaseFromSmmIndex{})
  385. //ptrStructOrTableName := "base_from_smm_index"
  386. //qs := to.QueryTable(ptrStructOrTableName)
  387. //for expr, exprV := range whereParam {
  388. // qs = qs.Filter(expr, exprV)
  389. //}
  390. for expr, exprV := range whereParam {
  391. tx = tx.Where(expr, exprV)
  392. }
  393. //_, err = qs.Update(updateParams)
  394. // 执行更新操作
  395. result := tx.Updates(updateParams)
  396. if result.Error != nil {
  397. err = fmt.Errorf("update err: %s", result.Error.Error())
  398. return
  399. }
  400. return
  401. }
  402. // BridgeZhongJiIndexDataParams 桥接服务-获取中基指标数据入参
  403. type BridgeZhongJiIndexDataParams struct {
  404. EdbCode string `json:"edb_code" form:"edb_code" description:"指标编码"`
  405. }
  406. type BridgeZhongJiIndexListParams struct {
  407. Page int `json:"page" form:"page" description:"页码"`
  408. PageSize int `json:"page_size" form:"page_size" description:"每页指标个数,每页不能超过500条,超过会固定为500"`
  409. }
  410. type BaseFromSmmDataList struct {
  411. Data []*BaseFromSmmData
  412. IndexCode string
  413. }
  414. type UpdateRule struct {
  415. RuleDesc string `json:"rule_desc"`
  416. Notice string `json:"notice"`
  417. ReleaseTime string `json:"release_time"`
  418. RuleInfo UpdateRuleInfo `json:"rule_info"`
  419. }
  420. type UpdateRuleInfo struct {
  421. UpdCal string `json:"upd_cal"`
  422. UpdCalUnit string `json:"upd_cal_unit"`
  423. PeriodOffset int `json:"period_offset"`
  424. UpdCount int `json:"upd_count"`
  425. }
  426. type DataItem struct {
  427. QuotaID string `json:"quota_id"`
  428. QuotaName string `json:"quota_name"`
  429. Mark string `json:"mark"`
  430. Unit string `json:"unit"`
  431. ValueType string `json:"value_type"`
  432. Source string `json:"source"`
  433. ListOrder int `json:"list_order"`
  434. DataStart string `json:"data_start"`
  435. DataEnd string `json:"data_end"`
  436. Frequency string `json:"frequency"`
  437. Precision int `json:"precision"`
  438. TypeCode string `json:"type_code"`
  439. TypeName string `json:"type_name"`
  440. TypeCodeAll string `json:"type_code_all"`
  441. TypeAll string `json:"type_all"`
  442. Tags string `json:"tags"`
  443. AuthStart string `json:"auth_start"`
  444. AuthFinish string `json:"auth_finish"`
  445. AuthLang string `json:"auth_lang"`
  446. AuthModule string `json:"auth_module"`
  447. DataDur string `json:"data_dur"`
  448. Spec string `json:"spec"`
  449. Area string `json:"area"`
  450. DataState string `json:"data_state"`
  451. UpdateRule UpdateRule `json:"update_rule"`
  452. }
  453. type ListData struct {
  454. Total int `json:"total"`
  455. CurrentPage int `json:"current_page"`
  456. PageSize int `json:"page_size"`
  457. PageCount int `json:"page_count"`
  458. Data []DataItem `json:"data"`
  459. }
  460. type SmmIndexListResponse struct {
  461. Code int `json:"code"`
  462. Msg string `json:"msg"`
  463. Data ListData `json:"data"`
  464. }
  465. type SmmListResp struct {
  466. Code int `json:"code"`
  467. Msg string `json:"msg"`
  468. Data SmmIndexListResponse `json:"data"`
  469. }
  470. func AddBaseFromSmmIndex(list []*BaseFromSmmIndex) (lastId int64, err error) {
  471. //o := orm.NewOrm()
  472. //_, err = o.InsertMulti(len(list), list)
  473. err = global.DEFAULT_DB.CreateInBatches(list, len(list)).Error
  474. return
  475. }
  476. // BridgeZhongJiIndexLatestDataParams 桥接服务-获取中基更新指标数据入参
  477. type BridgeZhongJiIndexLatestDataParams struct {
  478. EdbCode string `json:"edb_code" form:"edb_code" description:"指标编码"`
  479. LastTime int64 `json:"last_time" form:"last_time" description:"上次更新时间戳(秒)"`
  480. }
  481. func GetBaseFromSmmIndex() (list []*BaseFromSmmIndex, err error) {
  482. //o := orm.NewOrm()
  483. sql := ` SELECT * FROM base_from_smm_index`
  484. //_, err = o.Raw(sql).QueryRows(&list)
  485. err = global.DEFAULT_DB.Raw(sql).Find(&list).Error
  486. return
  487. }
  488. func ModifyBaseFromSmmIndex(item *BaseFromSmmIndex) (err error) {
  489. //o := orm.NewOrm()
  490. sql := ` UPDATE base_from_smm_index SET end_date = ?, modify_time=NOW(), data_state= ? `
  491. //_, err = o.Raw(sql, item.EndDate, item.DataState).Exec()
  492. err = global.DEFAULT_DB.Exec(sql, item.EndDate, item.DataState).Error
  493. return
  494. }
  495. func (m *BaseFromSmmIndex) UpdateCols(cols []string) (err error) {
  496. //o := orm.NewOrm()
  497. //_, err = o.Update(m, cols...)
  498. err = global.DEFAULT_DB.Model(&m).Select(cols).Updates(&m).Error
  499. return
  500. }
  501. func ModifyBaseFromSmmIndexDate(item *BaseFromSmmIndex) (err error) {
  502. //o := orm.NewOrm()
  503. sql := ` UPDATE base_from_smm_index SET end_date = ?, modify_time=NOW(), data_state= ? WHERE base_from_smm_index_id=?`
  504. //_, err = o.Raw(sql, item.EndDate, item.DataState, item.BaseFromSmmIndexId).Exec()
  505. err = global.DEFAULT_DB.Exec(sql, item.EndDate, item.DataState, item.BaseFromSmmIndexId).Error
  506. return
  507. }
  508. type SmmLatestDataResponse struct {
  509. Code int `json:"code"`
  510. Msg string `json:"msg"`
  511. Data SmmLatestResp `json:"data"`
  512. }
  513. type SmmLatestResp struct {
  514. Code int `json:"code"`
  515. Msg string `json:"msg"`
  516. Data SmmLatestData `json:"data"`
  517. }
  518. type SmmLatestData struct {
  519. DataLen int `json:"data_len"`
  520. DataList []Datum `json:"data_list"`
  521. }
  522. type Datum struct {
  523. QuotaID string `json:"quota_id"`
  524. Date string `json:"date"`
  525. Value string `json:"value"`
  526. Mark string `json:"mark"`
  527. Create string `json:"create"`
  528. Update string `json:"update"`
  529. }
  530. // RefreshEdbDataFromSmmToEdb 刷新有色指标数据
  531. func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDataList []*BaseFromSmmData) (err error) {
  532. source := utils.DATA_SOURCE_YS
  533. subSource := utils.DATA_SUB_SOURCE_EDB
  534. //o := orm.NewOrm()
  535. if err != nil {
  536. return
  537. }
  538. edbInfoIdStr := strconv.Itoa(edbInfoId)
  539. //计算数据
  540. var condition string
  541. var pars []interface{}
  542. if edbCode != "" {
  543. condition += " AND index_code=? "
  544. pars = append(pars, edbCode)
  545. }
  546. if startDate != "" {
  547. condition += " AND data_time>=? "
  548. pars = append(pars, startDate)
  549. }
  550. // 真实数据的最大日期 , 插入规则配置的日期
  551. var realDataMaxDate, edbDataInsertConfigDate time.Time
  552. var edbDataInsertConfig *EdbDataInsertConfig
  553. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  554. {
  555. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  556. if err != nil && !utils.IsErrNoRow(err) {
  557. return
  558. }
  559. if edbDataInsertConfig != nil {
  560. edbDataInsertConfigDate = edbDataInsertConfig.Date
  561. }
  562. }
  563. var existCondition string
  564. var existPars []interface{}
  565. existCondition += " AND edb_info_id=? "
  566. existPars = append(existPars, edbInfoId)
  567. if startDate != "" {
  568. existCondition += " AND data_time>=? "
  569. existPars = append(existPars, startDate)
  570. }
  571. existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
  572. if err != nil {
  573. return err
  574. }
  575. existMap := make(map[string]*EdbInfoSearchData)
  576. for _, v := range existList {
  577. existMap[v.DataTime] = v
  578. }
  579. addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  580. var isAdd bool
  581. for _, v := range smmDataList {
  582. item := v
  583. eDate := item.DataTime
  584. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  585. if err != nil {
  586. return err
  587. }
  588. if findItem, ok := existMap[v.DataTime]; !ok {
  589. sValue := item.Value
  590. timestamp := dataTime.UnixNano() / 1e6
  591. timeStr := fmt.Sprintf("%d", timestamp)
  592. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  593. isAdd = true
  594. } else {
  595. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  596. err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
  597. if err != nil {
  598. return err
  599. }
  600. }
  601. }
  602. // 下面代码主要目的是处理掉手动插入的数据判断
  603. {
  604. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  605. realDataMaxDate = dataTime
  606. }
  607. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  608. isFindConfigDateRealData = true
  609. }
  610. }
  611. }
  612. // 处理手工数据补充的配置
  613. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
  614. if isAdd {
  615. addSql = strings.TrimRight(addSql, ",")
  616. //_, err = o.Raw(addSql).Exec()
  617. err = global.DEFAULT_DB.Exec(addSql).Error
  618. if err != nil {
  619. fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
  620. return
  621. }
  622. }
  623. return
  624. }
  625. type BaseFromSmmRecord struct {
  626. BaseFromSmmRecordId int64 `orm:"column(base_from_smm_record_id);pk"`
  627. BaseFromSmmIndexId int64
  628. OldIndexName string `description:"原始名称"`
  629. NewIndexName string `description:"新的名称"`
  630. CreateTime time.Time `description:"记录创建时间"`
  631. Timestamp int64 `description:"记录创建时间戳"`
  632. }
  633. func AddBaseFromSmmRecord(item *BaseFromSmmRecord) (err error) {
  634. //o := orm.NewOrm()
  635. //_, err = o.Insert(item)
  636. err = global.DEFAULT_DB.Create(&item).Error
  637. return
  638. }