edb_info_calculate_tbz.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package data_manage
  2. import (
  3. "fmt"
  4. "github.com/shopspring/decimal"
  5. "hongze/hongze_task/utils"
  6. "rdluck_tools/orm"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. type EdbInfoCalculateTbz struct {
  12. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tbz_id);pk"`
  13. EdbInfoId int `description:"指标id"`
  14. EdbCode string `description:"指标编码"`
  15. FromEdbInfoId int `description:"计算指标id"`
  16. FromEdbCode string `description:"计算指标编码"`
  17. FromEdbName string `description:"计算指标名称"`
  18. FromSource int `description:"计算指标来源"`
  19. FromSourceName string `description:"计算指标来源名称"`
  20. FromTag string `description:"来源指标标签"`
  21. Sort int `description:"计算指标名称排序"`
  22. CreateTime time.Time `description:"创建时间"`
  23. ModifyTime time.Time `description:"修改时间"`
  24. }
  25. func TbzDiv(a, b float64) float64 {
  26. af := decimal.NewFromFloat(float64(a))
  27. bf := decimal.NewFromFloat(float64(b))
  28. val, _ := af.Div(bf).Float64()
  29. val = val - 1
  30. return val
  31. }
  32. //刷新同比值数据
  33. func RefreshCalculateTbz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
  34. o := orm.NewOrm()
  35. o.Using("data")
  36. o.Begin()
  37. defer func() {
  38. if err != nil {
  39. o.Rollback()
  40. } else {
  41. o.Commit()
  42. }
  43. }()
  44. if err != nil {
  45. return
  46. }
  47. edbInfoIdStr := strconv.Itoa(edbInfoId)
  48. //计算数据
  49. //计算数据
  50. var condition string
  51. var pars []interface{}
  52. condition += " AND edb_info_id=? "
  53. pars = append(pars, edbInfoId)
  54. if startDate != "" {
  55. condition += " AND data_time>=? "
  56. pars = append(pars, startDate)
  57. }
  58. if endDate != "" {
  59. condition += " AND data_time<=? "
  60. pars = append(pars, endDate)
  61. }
  62. dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
  63. if err != nil {
  64. return err
  65. }
  66. var dateArr []string
  67. dataMap := make(map[string]*EdbInfoSearchData)
  68. for _, v := range dataList {
  69. dateArr = append(dateArr, v.DataTime)
  70. dataMap[v.DataTime] = v
  71. }
  72. addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  73. var isAdd bool
  74. for ak, av := range dateArr {
  75. fmt.Println(ak, av)
  76. currentItem := dataMap[av]
  77. if currentItem != nil {
  78. //当前日期
  79. currentDate, err := time.Parse(utils.FormatDate, av)
  80. if err != nil {
  81. return err
  82. }
  83. //上一年的日期
  84. preDate := currentDate.AddDate(-1, 0, 0)
  85. preDateStr := preDate.Format(utils.FormatDate)
  86. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
  87. //dataTime, _ := time.Parse(utils.FormatDate, date)
  88. timestamp := currentDate.UnixNano() / 1e6
  89. timestampStr := fmt.Sprintf("%d", timestamp)
  90. val := TbzDiv(currentItem.Value, findItem.Value)
  91. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  92. if err != nil && err.Error() != utils.ErrNoRow() {
  93. return err
  94. }
  95. if count <= 0 {
  96. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  97. isAdd = true
  98. } else {
  99. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  100. if err != nil {
  101. return err
  102. }
  103. }
  104. utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
  105. continue
  106. } else {
  107. if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
  108. nextDateDay := preDate.AddDate(0, 1, 0)
  109. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  110. preDateDay := preDate.AddDate(0, -1, 0)
  111. preDateDayStr := preDateDay.Format(utils.FormatDate)
  112. for i := 0; i <= 6; i++ {
  113. if i >= 1 {
  114. nextDateDay = nextDateDay.AddDate(0, 0, i)
  115. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  116. }
  117. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  118. timestamp := currentDate.UnixNano() / 1e6
  119. timestampStr := fmt.Sprintf("%d", timestamp)
  120. val := TbzDiv(currentItem.Value, findItem.Value)
  121. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  122. if err != nil && err.Error() != utils.ErrNoRow() {
  123. return err
  124. }
  125. if count <= 0 {
  126. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  127. isAdd = true
  128. } else {
  129. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  130. if err != nil {
  131. return err
  132. }
  133. }
  134. break
  135. } else {
  136. if i >= 1 {
  137. preDateDay = preDate.AddDate(0, 0, -i)
  138. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  139. }
  140. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  141. timestamp := currentDate.UnixNano() / 1e6
  142. timestampStr := fmt.Sprintf("%d", timestamp)
  143. val := TbzDiv(currentItem.Value, findItem.Value)
  144. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  145. if err != nil && err.Error() != utils.ErrNoRow() {
  146. return err
  147. }
  148. if count <= 0 {
  149. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  150. isAdd = true
  151. } else {
  152. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  153. if err != nil {
  154. return err
  155. }
  156. }
  157. }
  158. break
  159. }
  160. }
  161. } else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
  162. if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
  163. timestamp := currentDate.UnixNano() / 1e6
  164. timestampStr := fmt.Sprintf("%d", timestamp)
  165. val := TbzDiv(currentItem.Value, findItem.Value)
  166. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  167. if err != nil && err.Error() != utils.ErrNoRow() {
  168. return err
  169. }
  170. if count <= 0 {
  171. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  172. isAdd = true
  173. } else {
  174. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  175. if err != nil {
  176. return err
  177. }
  178. }
  179. break
  180. }
  181. } else {
  182. nextDateDay := preDate.AddDate(0, 0, 1)
  183. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  184. preDateDay := preDate.AddDate(0, 0, -1)
  185. preDateDayStr := preDateDay.Format(utils.FormatDate)
  186. for i := 0; i < 35; i++ {
  187. if i >= 1 {
  188. nextDateDay = nextDateDay.AddDate(0, 0, i)
  189. nextDateDayStr = nextDateDay.Format(utils.FormatDate)
  190. }
  191. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  192. timestamp := currentDate.UnixNano() / 1e6
  193. timestampStr := fmt.Sprintf("%d", timestamp)
  194. val := TbzDiv(currentItem.Value, findItem.Value)
  195. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  196. if err != nil && err.Error() != utils.ErrNoRow() {
  197. return err
  198. }
  199. if count <= 0 {
  200. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  201. isAdd = true
  202. } else {
  203. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  204. if err != nil {
  205. return err
  206. }
  207. }
  208. break
  209. } else {
  210. if i >= 1 {
  211. preDateDay = preDate.AddDate(0, 0, -i)
  212. preDateDayStr = nextDateDay.Format(utils.FormatDate)
  213. }
  214. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  215. timestamp := currentDate.UnixNano() / 1e6
  216. timestampStr := fmt.Sprintf("%d", timestamp)
  217. val := TbzDiv(currentItem.Value, findItem.Value)
  218. count, err := GetEdbDataCalculateTbzByCodeAndDate(edbCode, av)
  219. if err != nil && err.Error() != utils.ErrNoRow() {
  220. return err
  221. }
  222. if count <= 0 {
  223. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  224. isAdd = true
  225. } else {
  226. err = ModifyEdbDataCalculateTbz(int64(edbInfoId), av, val)
  227. if err != nil {
  228. return err
  229. }
  230. }
  231. }
  232. break
  233. }
  234. }
  235. }
  236. }
  237. }
  238. }
  239. if isAdd {
  240. addSql = strings.TrimRight(addSql, ",")
  241. _, err = o.Raw(addSql).Exec()
  242. if err != nil {
  243. return err
  244. }
  245. }
  246. return
  247. }
  248. type EdbInfoCalculateTbzDetail struct {
  249. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tbz_id);pk"`
  250. EdbInfoId int `description:"指标id"`
  251. EdbCode string `description:"指标编码"`
  252. FromEdbInfoId int `description:"计算指标id"`
  253. FromEdbCode string `description:"计算指标编码"`
  254. FromEdbName string `description:"计算指标名称"`
  255. FromSource int `description:"计算指标来源"`
  256. FromSourceName string `description:"计算指标来源名称"`
  257. FromTag string `description:"来源指标标签"`
  258. Sort int `description:"计算指标名称排序"`
  259. CreateTime time.Time `description:"创建时间"`
  260. ModifyTime time.Time `description:"修改时间"`
  261. StartDate string `description:"开始日期"`
  262. EndDate string `description:"结束日期"`
  263. }
  264. func GetEdbInfoCalculateTbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
  265. o := orm.NewOrm()
  266. o.Using("data")
  267. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_tbz AS a
  268. INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
  269. WHERE a.edb_info_id=? `
  270. err = o.Raw(sql, edbInfoId).QueryRow(&item)
  271. return
  272. }
  273. func GetEdbDataCalculateTbzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
  274. o := orm.NewOrm()
  275. o.Using("data")
  276. sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tbz WHERE edb_code=? AND data_time=? `
  277. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  278. return
  279. }
  280. func ModifyEdbDataCalculateTbz(edbInfoId int64, dataTime string, value float64) (err error) {
  281. o := orm.NewOrm()
  282. o.Using("data")
  283. sql := ` UPDATE edb_data_calculate_tbz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  284. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  285. return
  286. }