base_from_yongyi.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package models
  2. import (
  3. "eta/eta_index_lib/global"
  4. "eta/eta_index_lib/utils"
  5. "fmt"
  6. "gorm.io/gorm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // BaseFromYongyi 涌溢咨询
  12. type BaseFromYongyi struct{}
  13. type BaseFromYongyiData struct {
  14. YongyiDataId int `gorm:"column:yongyi_data_id;primaryKey"`
  15. //YongyiDataId int `orm:"column(yongyi_data_id);pk"`
  16. YongyiIndexId int
  17. IndexCode string
  18. DataTime string
  19. Value string
  20. CreateTime time.Time
  21. ModifyTime time.Time
  22. DataTimestamp int64
  23. }
  24. func (e *BaseFromYongyiData) AfterFind(db *gorm.DB) (err error) {
  25. e.DataTime = utils.GormDateStrToDateStr(e.DataTime)
  26. return
  27. }
  28. func GetBaseFromYongyiDataByCondition(condition string, pars []interface{}) (list []*BaseFromYongyiData, err error) {
  29. //o := orm.NewOrm()
  30. sql := `SELECT * FROM base_from_yongyi_data WHERE 1=1 `
  31. if condition != "" {
  32. sql += condition
  33. }
  34. //_, err = o.Raw(sql, pars).QueryRows(&list)
  35. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  36. return
  37. }
  38. // Add 添加
  39. func (obj BaseFromYongyi) Add(edbCode string) (err error) {
  40. //o := orm.NewOrm()
  41. var condition string
  42. var pars []interface{}
  43. if edbCode != "" {
  44. condition += " AND index_code=? "
  45. pars = append(pars, edbCode)
  46. }
  47. yongyiBaseDataAll, err := GetBaseFromYongyiDataByCondition(condition, pars)
  48. if err != nil && !utils.IsErrNoRow(err) {
  49. return
  50. }
  51. var isAdd bool
  52. addSql := ` INSERT INTO edb_data_yongyi(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  53. addSql = utils.ReplaceDriverKeywords("", addSql)
  54. existMap := make(map[string]string)
  55. for _, sv := range yongyiBaseDataAll {
  56. eDate := sv.DataTime
  57. dataTime, err := time.Parse(utils.FormatDate, eDate)
  58. if err != nil {
  59. return err
  60. }
  61. timestamp := dataTime.UnixNano() / 1e6
  62. timeStr := fmt.Sprintf("%d", timestamp)
  63. if _, ok := existMap[eDate]; !ok {
  64. addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
  65. isAdd = true
  66. }
  67. existMap[eDate] = sv.Value
  68. }
  69. if isAdd {
  70. addSql = strings.TrimRight(addSql, ",")
  71. utils.FileLog.Info("addSql:" + addSql)
  72. //_, err = o.Raw(addSql).Exec()
  73. err = global.DEFAULT_DB.Exec(addSql).Error
  74. if err != nil {
  75. return err
  76. }
  77. }
  78. return
  79. }
  80. // Refresh 刷新涌益咨询指标数据
  81. func (obj BaseFromYongyi) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
  82. source := obj.GetSource()
  83. //o := orm.NewOrm()
  84. if err != nil {
  85. return
  86. }
  87. edbInfoIdStr := strconv.Itoa(edbInfoId)
  88. //计算数据
  89. var condition string
  90. var pars []interface{}
  91. if edbCode != "" {
  92. condition += " AND index_code=? "
  93. pars = append(pars, edbCode)
  94. }
  95. if startDate != "" {
  96. condition += " AND data_time>=? "
  97. pars = append(pars, startDate)
  98. }
  99. yongyiDataList, err := GetBaseFromYongyiDataByCondition(condition, pars)
  100. if err != nil {
  101. return
  102. }
  103. // 真实数据的最大日期 , 插入规则配置的日期
  104. var realDataMaxDate, edbDataInsertConfigDate time.Time
  105. var edbDataInsertConfig *EdbDataInsertConfig
  106. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  107. {
  108. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  109. if err != nil && !utils.IsErrNoRow(err) {
  110. return
  111. }
  112. if edbDataInsertConfig != nil {
  113. edbDataInsertConfigDate = edbDataInsertConfig.Date
  114. }
  115. }
  116. var existCondition string
  117. var existPars []interface{}
  118. existCondition += " AND edb_info_id=? "
  119. existPars = append(existPars, edbInfoId)
  120. if startDate != "" {
  121. existCondition += " AND data_time>=? "
  122. existPars = append(existPars, startDate)
  123. }
  124. existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
  125. if err != nil {
  126. return err
  127. }
  128. existMap := make(map[string]*EdbInfoSearchData)
  129. for _, v := range existList {
  130. existMap[v.DataTime] = v
  131. }
  132. addSql := ` INSERT INTO edb_data_yongyi(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  133. addSql = utils.ReplaceDriverKeywords("", addSql)
  134. var isAdd bool
  135. for _, v := range yongyiDataList {
  136. item := v
  137. eDate := item.DataTime
  138. dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
  139. if err != nil {
  140. return err
  141. }
  142. if findItem, ok := existMap[v.DataTime]; !ok {
  143. sValue := item.Value
  144. timestamp := dataTime.UnixNano() / 1e6
  145. timeStr := fmt.Sprintf("%d", timestamp)
  146. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  147. isAdd = true
  148. } else {
  149. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  150. err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
  151. if err != nil {
  152. return err
  153. }
  154. }
  155. }
  156. // 下面代码主要目的是处理掉手动插入的数据判断
  157. {
  158. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  159. realDataMaxDate = dataTime
  160. }
  161. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  162. isFindConfigDateRealData = true
  163. }
  164. }
  165. }
  166. // 处理手工数据补充的配置
  167. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
  168. if isAdd {
  169. addSql = strings.TrimRight(addSql, ",")
  170. //_, err = o.Raw(addSql).Exec()
  171. err = global.DEFAULT_DB.Exec(addSql).Error
  172. if err != nil {
  173. fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
  174. return
  175. }
  176. }
  177. return
  178. }
  179. // GetSource 获取来源编码id
  180. func (obj BaseFromYongyi) GetSource() int {
  181. return utils.DATA_SOURCE_YONYI
  182. }
  183. // GetSourceName 获取来源名称
  184. func (obj BaseFromYongyi) GetSourceName() string {
  185. return utils.DATA_SOURCE_NAME_YONYI
  186. }
  187. type BaseFromYongyiIndex struct {
  188. YongyiIndexId int64 `gorm:"column:yongyi_index_id;primaryKey"`
  189. //YongyiIndexId int64 `orm:"column(yongyi_index_id);pk"`
  190. IndexCode string
  191. IndexName string
  192. Frequency string
  193. Unit string
  194. ClassifyId int64
  195. StartDate string
  196. EndDate string
  197. Sort int
  198. TerminalCode string
  199. CreateTime time.Time
  200. ModifyTime time.Time
  201. }
  202. func (e *BaseFromYongyiIndex) AfterFind(db *gorm.DB) (err error) {
  203. e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
  204. e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
  205. return
  206. }
  207. type BaseFromYongyiIndexList struct {
  208. //YongyiIndexId int64 `orm:"column(yongyi_index_id);pk"`
  209. YongyiIndexId int64 `gorm:"column:yongyi_index_id;primaryKey"`
  210. IndexCode string
  211. IndexName string
  212. Frequency string
  213. Unit string
  214. ClassifyId int64
  215. StartDate string
  216. EndDate string
  217. TerminalCode string
  218. CreateTime string
  219. ModifyTime string
  220. }
  221. // AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
  222. func (m *BaseFromYongyiIndexList) AfterFind(db *gorm.DB) (err error) {
  223. m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
  224. m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
  225. m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
  226. m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
  227. return
  228. }
  229. func (y *BaseFromYongyiData) GetByIndexCode(indexCode string) (list []*BaseFromYongyiData, err error) {
  230. //o := orm.NewOrm()
  231. sql := ` SELECT * FROM base_from_yongyi_data WHERE index_code=? `
  232. //_, err = o.Raw(sql, indexCode).QueryRows(&list)
  233. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  234. return
  235. }
  236. func (y *BaseFromYongyiData) AddMulti(item []*BaseFromYongyiData) (err error) {
  237. //o := orm.NewOrm()
  238. //_, err = o.InsertMulti(1, item)
  239. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  240. return
  241. }
  242. // Update 修改
  243. func (y *BaseFromYongyiData) Update(updateCols []string) (err error) {
  244. //o := orm.NewOrm()
  245. //_, err = o.Update(y, updateCols...)
  246. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  247. return
  248. }
  249. // HandleYongyiExcelData 涌益咨询的excel数据
  250. type HandleYongyiExcelData struct {
  251. ClassifyName string `description:"指标目录"`
  252. ClassifySort int `description:"指标目录排序号"`
  253. IndexName string `description:"指标名称"`
  254. IndexCode string `description:"指标编码"`
  255. Unit string `description:"单位"`
  256. Sort int `description:"排序号"`
  257. Frequency string `description:"频度"`
  258. ExcelDataMap map[string]string
  259. }
  260. type HandleYongyiExcelDataReq struct {
  261. List []*HandleYongyiExcelData
  262. TerminalCode string `description:"编码"`
  263. }
  264. func (y *BaseFromYongyiData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  265. //o := orm.NewOrm()
  266. 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_yongyi_data WHERE index_code=? `
  267. //err = o.Raw(sql, indexCode).QueryRow(&item)
  268. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  269. return
  270. }
  271. func (y *BaseFromYongyiIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  272. //o := orm.NewOrm()
  273. sql := ` UPDATE base_from_yongyi_index SET start_date=?,end_date=?,modify_time=NOW() WHERE index_code=? `
  274. //_, err = o.Raw(sql, item.MinDate, item.MaxDate, indexCode).Exec()
  275. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, indexCode).Error
  276. return
  277. }
  278. func (y *BaseFromYongyiIndex) GetByIndexCode(indexCode string) (item *BaseFromYongyiIndex, err error) {
  279. //o := orm.NewOrm()
  280. sql := ` SELECT * FROM base_from_yongyi_index WHERE index_code=? `
  281. //err = o.Raw(sql, indexCode).QueryRow(&item)
  282. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  283. return
  284. }
  285. func (y *BaseFromYongyiIndex) Add() (lastId int64, err error) {
  286. //o := orm.NewOrm()
  287. //lastId, err = o.Insert(y)
  288. err = global.DEFAULT_DB.Create(&y).Error
  289. if err != nil {
  290. return
  291. }
  292. lastId = y.ClassifyId
  293. return
  294. }
  295. // Update 修改
  296. func (y *BaseFromYongyiIndex) Update(updateCols []string) (err error) {
  297. //o := orm.NewOrm()
  298. //_, err = o.Update(y, updateCols...)
  299. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  300. return
  301. }
  302. // BaseFromYongyiClassify Yongyi原始数据分类表
  303. type BaseFromYongyiClassify struct {
  304. ClassifyId int64 `gorm:"column:classify_id;primaryKey"`
  305. //ClassifyId int64 `orm:"column(classify_id);pk"`
  306. ClassifyName string `description:"分类名称"`
  307. ParentId int `description:"父级id"`
  308. SysUserId int `description:"创建人id"`
  309. SysUserRealName string `description:"创建人姓名"`
  310. Level int `description:"层级"`
  311. Sort int `description:"排序字段,越小越靠前,默认值:10"`
  312. ModifyTime time.Time `description:"修改时间"`
  313. CreateTime time.Time `description:"创建时间"`
  314. }
  315. func (y *BaseFromYongyiClassify) Add() (lastId int64, err error) {
  316. //o := orm.NewOrm()
  317. //lastId, err = o.Insert(y)
  318. err = global.DEFAULT_DB.Create(&y).Error
  319. if err != nil {
  320. return
  321. }
  322. lastId = y.ClassifyId
  323. return
  324. }
  325. // Update 修改
  326. func (y *BaseFromYongyiClassify) Update(updateCols []string) (err error) {
  327. //o := orm.NewOrm()
  328. //_, err = o.Update(y, updateCols...)
  329. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  330. return
  331. }
  332. func (y *BaseFromYongyiClassify) GetByClassifyName(classifyName string) (item *BaseFromYongyiClassify, err error) {
  333. //o := orm.NewOrm()
  334. sql := ` SELECT * FROM base_from_yongyi_classify WHERE classify_name=? `
  335. //err = o.Raw(sql, classifyName).QueryRow(&item)
  336. err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
  337. return
  338. }
  339. func (y *BaseFromYongyiClassify) GetParentClassify() (items []*BaseFromYongyiClassify, err error) {
  340. //o := orm.NewOrm()
  341. sql := ` SELECT * FROM base_from_yongyi_classify WHERE classify_name in ("日度", "月度", "周度", "年度", "旬度", "半年度", "年度") and parent_id=0 `
  342. //_, err = o.Raw(sql).QueryRows(&items)
  343. err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
  344. return
  345. }