edb_info_calculate_tbz.go 10 KB

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