base_from_smm.go 21 KB

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