base_from_purang_index.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package models
  2. import (
  3. "bytes"
  4. sql2 "database/sql"
  5. "eta/eta_index_lib/global"
  6. "eta/eta_index_lib/utils"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // BaseFromPurang 普兰金融
  13. type BaseFromPurang struct{}
  14. type BaseFromPurangData struct {
  15. BaseFromPurangDataId int `gorm:"column:base_from_purang_data_id;primaryKey"`
  16. BaseFromPurangIndexId int
  17. IndexCode string
  18. DataTime time.Time
  19. Value string
  20. CreateTime time.Time
  21. ModifyTime time.Time
  22. DataTimestamp int64
  23. }
  24. func GetBaseFromPurangDataByCondition(condition string, pars []interface{}) (list []*BaseFromPurangData, err error) {
  25. sql := `SELECT * FROM base_from_purang_data WHERE 1=1 `
  26. if condition != "" {
  27. sql += condition
  28. }
  29. err = global.DEFAULT_DB.Raw(sql, pars...).Find(&list).Error
  30. return
  31. }
  32. // Add 添加
  33. func (obj BaseFromPurang) Add(edbCode string) (err error) {
  34. var condition string
  35. var pars []interface{}
  36. if edbCode != "" {
  37. condition += " AND index_code=? "
  38. pars = append(pars, edbCode)
  39. }
  40. purangBaseDataAll, err := GetBaseFromPurangDataByCondition(condition, pars)
  41. if err != nil && !utils.IsErrNoRow(err) {
  42. return
  43. }
  44. var isAdd bool
  45. addSql := ` INSERT INTO edb_data_purang(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  46. length := len(purangBaseDataAll)
  47. existMap := make(map[string]struct{}, length)
  48. nowStr := time.Now().Format(utils.FormatDateTime)
  49. var buffer bytes.Buffer
  50. buffer.WriteString(addSql)
  51. for i := 0; i < length; i++ {
  52. sv := purangBaseDataAll[i]
  53. eDate := sv.DataTime.Format(utils.FormatDate)
  54. dataTime, err := time.Parse(utils.FormatDate, eDate)
  55. if err != nil {
  56. return err
  57. }
  58. timestamp := dataTime.UnixNano() / 1e6
  59. timeStr := fmt.Sprintf("%d", timestamp)
  60. if _, ok := existMap[eDate]; !ok {
  61. sqlTmp := GetAddSqlV2("0", edbCode, eDate, timeStr, sv.Value, nowStr)
  62. buffer.WriteString(sqlTmp)
  63. isAdd = true
  64. }
  65. existMap[eDate] = struct{}{}
  66. }
  67. if isAdd {
  68. addSql = buffer.String()
  69. addSql = strings.TrimRight(addSql, ",")
  70. utils.FileLog.Info("addSql:" + addSql)
  71. err = global.DEFAULT_DB.Exec(addSql).Error
  72. if err != nil {
  73. return err
  74. }
  75. }
  76. return
  77. }
  78. // Refresh 刷新普兰金融指标数据
  79. func (obj BaseFromPurang) Refresh(edbInfoId int, edbCode, startDate string) (err error) {
  80. source := obj.GetSource()
  81. if err != nil {
  82. return
  83. }
  84. edbInfoIdStr := strconv.Itoa(edbInfoId)
  85. //计算数据
  86. var condition string
  87. var pars []interface{}
  88. if edbCode != "" {
  89. condition += " AND index_code=? "
  90. pars = append(pars, edbCode)
  91. }
  92. if startDate != "" {
  93. condition += " AND data_time>=? "
  94. pars = append(pars, startDate)
  95. }
  96. PurangDataList, err := GetBaseFromPurangDataByCondition(condition, pars)
  97. if err != nil {
  98. return
  99. }
  100. // 真实数据的最大日期 , 插入规则配置的日期
  101. var realDataMaxDate, edbDataInsertConfigDate time.Time
  102. var edbDataInsertConfig *EdbDataInsertConfig
  103. var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
  104. {
  105. edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
  106. if err != nil && !utils.IsErrNoRow(err) {
  107. return
  108. }
  109. if edbDataInsertConfig != nil {
  110. edbDataInsertConfigDate = edbDataInsertConfig.Date
  111. }
  112. }
  113. var existCondition string
  114. var existPars []interface{}
  115. existCondition += " AND edb_info_id=? "
  116. existPars = append(existPars, edbInfoId)
  117. if startDate != "" {
  118. existCondition += " AND data_time>=? "
  119. existPars = append(existPars, startDate)
  120. }
  121. existList, err := GetEdbDataByCondition(source, 0, existCondition, existPars)
  122. if err != nil {
  123. return err
  124. }
  125. existMap := make(map[string]*EdbInfoSearchData)
  126. for _, v := range existList {
  127. existMap[v.DataTime] = v
  128. }
  129. addSql := ` INSERT INTO edb_data_purang(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
  130. var isAdd bool
  131. for _, v := range PurangDataList {
  132. item := v
  133. eDate := item.DataTime.Format(utils.FormatDate)
  134. dataTime := item.DataTime
  135. if findItem, ok := existMap[eDate]; !ok {
  136. sValue := item.Value
  137. timestamp := dataTime.UnixNano() / 1e6
  138. timeStr := fmt.Sprintf("%d", timestamp)
  139. addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
  140. isAdd = true
  141. } else {
  142. if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
  143. err = ModifyEdbDataById(source, 0, findItem.EdbDataId, item.Value)
  144. if err != nil {
  145. return err
  146. }
  147. }
  148. }
  149. // 下面代码主要目的是处理掉手动插入的数据判断
  150. {
  151. if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
  152. realDataMaxDate = dataTime
  153. }
  154. if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
  155. isFindConfigDateRealData = true
  156. }
  157. }
  158. }
  159. // 处理手工数据补充的配置
  160. HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, 0, existMap, isFindConfigDateRealData)
  161. if isAdd {
  162. addSql = strings.TrimRight(addSql, ",")
  163. err = global.DEFAULT_DB.Exec(addSql).Error
  164. if err != nil {
  165. fmt.Println("RefreshEdbDataFromBaiinfo add Err", err.Error())
  166. return
  167. }
  168. }
  169. return
  170. }
  171. // GetSource 获取来源编码id
  172. func (obj BaseFromPurang) GetSource() int {
  173. return utils.DATA_SOURCE_PuRang
  174. }
  175. // GetSourceName 获取来源名称
  176. func (obj BaseFromPurang) GetSourceName() string {
  177. return utils.DATA_SOURCE_NAME_PuRang
  178. }
  179. type BaseFromPurangIndex struct {
  180. BaseFromPurangIndexId int64 `gorm:"column:base_from_purang_index_id;primaryKey"`
  181. IndexCode string
  182. IndexName string
  183. Frequency string
  184. Unit string
  185. StartDate time.Time
  186. EndDate time.Time
  187. ClassifyId int64
  188. Sort int
  189. BaseFileName string
  190. RenameFileName string
  191. TerminalCode string
  192. CreateTime time.Time
  193. ModifyTime time.Time
  194. }
  195. type BaseFromPurangIndexList struct {
  196. BaseFromPurangIndexId int64 `gorm:"column:base_from_purang_index_id;primaryKey"`
  197. IndexCode string
  198. IndexName string
  199. Frequency string
  200. Unit string
  201. Sort int
  202. ClassifyId int64
  203. StartDate time.Time
  204. EndDate time.Time
  205. TerminalCode string
  206. CreateTime time.Time
  207. ModifyTime time.Time
  208. }
  209. func (y *BaseFromPurangData) GetByIndexCode(indexCode string) (list []*BaseFromPurangData, err error) {
  210. sql := ` SELECT * FROM base_from_purang_data WHERE index_code=? `
  211. err = global.DEFAULT_DB.Raw(sql, indexCode).Find(&list).Error
  212. return
  213. }
  214. func (y *BaseFromPurangData) AddMulti(item []*BaseFromPurangData) (err error) {
  215. err = global.DEFAULT_DB.CreateInBatches(&item, 1).Error
  216. return
  217. }
  218. // Update 修改
  219. func (y *BaseFromPurangData) Update(updateCols []string) (err error) {
  220. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  221. return
  222. }
  223. // HandlePurangExcelData 涌益咨询的excel数据
  224. type HandlePurangExcelData struct {
  225. ClassifyName string `description:"指标目录"`
  226. ParentClassifyName string `description:"父级指标目录"`
  227. ClassifySort int `description:"指标目录排序号"`
  228. IndexName string `description:"指标名称"`
  229. IndexCode string `description:"指标编码"`
  230. Unit string `description:"单位"`
  231. Sort int `description:"排序号"`
  232. Frequency string `description:"频度"`
  233. ExcelDataMap map[string]string
  234. }
  235. type HandlePurangExcelDataReq struct {
  236. List []*HandlePurangExcelData
  237. TerminalCode string `description:"编码"`
  238. }
  239. func (y *BaseFromPurangData) GetMaxAndMinDateByIndexCode(indexCode string) (item *EdbInfoMaxAndMinInfo, err error) {
  240. 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_purang_data WHERE index_code=? `
  241. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  242. sql = ` SELECT value AS latest_value FROM %s WHERE index_code=? ORDER BY data_time DESC LIMIT 1 `
  243. sql = fmt.Sprintf(sql, "base_from_purang_data")
  244. var latestValueNull sql2.NullFloat64
  245. err = global.DEFAULT_DB.Raw(sql, indexCode).Scan(&latestValueNull).Error
  246. if err == nil && latestValueNull.Valid {
  247. item.LatestValue = latestValueNull.Float64
  248. }
  249. return
  250. }
  251. func (y *BaseFromPurangIndex) ModifyIndexMaxAndMinDate(indexCode string, item *EdbInfoMaxAndMinInfo) (err error) {
  252. sql := ` UPDATE base_from_purang_index SET start_date=?,end_date=?, end_value=?, modify_time=NOW() WHERE index_code=? `
  253. err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.LatestValue, indexCode).Error
  254. return
  255. }
  256. func (y *BaseFromPurangIndex) GetByIndexCode(indexCode string) (item *BaseFromPurangIndex, err error) {
  257. sql := ` SELECT * FROM base_from_purang_index WHERE index_code=? `
  258. err = global.DEFAULT_DB.Raw(sql, indexCode).First(&item).Error
  259. return
  260. }
  261. func (y *BaseFromPurangIndex) Add() (lastId int64, err error) {
  262. err = global.DEFAULT_DB.Create(&y).Error
  263. if err != nil {
  264. return
  265. }
  266. lastId = y.BaseFromPurangIndexId
  267. return
  268. }
  269. // Update 修改
  270. func (y *BaseFromPurangIndex) Update(updateCols []string) (err error) {
  271. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  272. return
  273. }
  274. // BaseFromPurangClassify Purang原始数据分类表
  275. type BaseFromPurangClassify struct {
  276. ClassifyId int64 `gorm:"column:classify_id;primaryKey"`
  277. ClassifyName string `description:"分类名称"`
  278. ClassifyNameEn string `description:"分类名称"`
  279. ParentId int `description:"父级id"`
  280. SysUserId int `description:"创建人id"`
  281. SysUserRealName string `description:"创建人姓名"`
  282. Level int `description:"层级"`
  283. Sort int `description:"排序字段,越小越靠前,默认值:10"`
  284. ModifyTime time.Time `description:"修改时间"`
  285. CreateTime time.Time `description:"创建时间"`
  286. }
  287. func (y *BaseFromPurangClassify) Add() (lastId int64, err error) {
  288. err = global.DEFAULT_DB.Create(&y).Error
  289. if err != nil {
  290. return
  291. }
  292. lastId = int64(y.ClassifyId)
  293. return
  294. }
  295. // Update 修改
  296. func (y *BaseFromPurangClassify) Update(updateCols []string) (err error) {
  297. err = global.DEFAULT_DB.Model(&y).Select(updateCols).Updates(&y).Error
  298. return
  299. }
  300. func (y *BaseFromPurangClassify) GetByClassifyName(classifyName string) (item *BaseFromPurangClassify, err error) {
  301. sql := ` SELECT * FROM base_from_purang_classify WHERE classify_name=? `
  302. err = global.DEFAULT_DB.Raw(sql, classifyName).First(&item).Error
  303. return
  304. }
  305. func (y *BaseFromPurangClassify) GetParentClassify() (items []*BaseFromPurangClassify, err error) {
  306. sql := ` SELECT * FROM base_from_purang_classify WHERE parent_id=0 `
  307. err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
  308. return
  309. }