edb_info_calculate_tcz.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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 EdbInfoCalculateTcz struct {
  12. EdbInfoCalculateTbzId int `orm:"column(edb_info_calculate_tcz_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 TczSub(a, b float64) string {
  26. af := decimal.NewFromFloat(float64(a))
  27. fmt.Println(af)
  28. bf := decimal.NewFromFloat(float64(b))
  29. val, _ := af.Sub(bf).Float64()
  30. valStr := utils.SubFloatToString(val, 4)
  31. return valStr
  32. }
  33. //刷新同差值数据
  34. func RefreshCalculateTcz(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. fmt.Println(edbInfoId, fromEdbInfo.EdbInfoId)
  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_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  74. var isAdd bool
  75. for _, av := range dateArr {
  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 := TczSub(currentItem.Value, findItem.Value)
  91. count, err := GetEdbDataCalculateTczByCodeAndDate(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 = ModifyEdbDataCalculateTcz(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 := TczSub(currentItem.Value, findItem.Value)
  121. count, err := GetEdbDataCalculateTczByCodeAndDate(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 = ModifyEdbDataCalculateTcz(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 := TczSub(currentItem.Value, findItem.Value)
  144. count, err := GetEdbDataCalculateTczByCodeAndDate(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 = ModifyEdbDataCalculateTcz(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 := TczSub(currentItem.Value, findItem.Value)
  166. count, err := GetEdbDataCalculateTczByCodeAndDate(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 = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
  175. if err != nil {
  176. return err
  177. }
  178. }
  179. break
  180. }
  181. } else {
  182. nextDateDay := preDate
  183. preDateDay := preDate
  184. for i := 0; i < 35; i++ {
  185. nextDateDayStr := nextDateDay.Format(utils.FormatDate)
  186. if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
  187. timestamp := currentDate.UnixNano() / 1e6
  188. timestampStr := fmt.Sprintf("%d", timestamp)
  189. val := TczSub(currentItem.Value, findItem.Value)
  190. count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
  191. if err != nil && err.Error() != utils.ErrNoRow() {
  192. return err
  193. }
  194. if count <= 0 {
  195. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  196. isAdd = true
  197. } else {
  198. err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
  199. if err != nil {
  200. return err
  201. }
  202. }
  203. break
  204. } else {
  205. preDateDayStr := preDateDay.Format(utils.FormatDate)
  206. if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
  207. timestamp := currentDate.UnixNano() / 1e6
  208. timestampStr := fmt.Sprintf("%d", timestamp)
  209. val := TczSub(currentItem.Value, findItem.Value)
  210. count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
  211. if err != nil && err.Error() != utils.ErrNoRow() {
  212. return err
  213. }
  214. if count <= 0 {
  215. addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
  216. isAdd = true
  217. } else {
  218. err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
  219. if err != nil {
  220. return err
  221. }
  222. }
  223. }
  224. break
  225. }
  226. nextDateDay = nextDateDay.AddDate(0, 0, 1)
  227. preDateDay = preDateDay.AddDate(0, 0, -1)
  228. }
  229. }
  230. }
  231. }
  232. }
  233. fmt.Println("isAdd:", isAdd)
  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_TCZ, 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 EdbInfoCalculateTczDetail struct {
  254. EdbInfoCalculateTczId int `orm:"column(edb_info_calculate_tcz_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 GetEdbInfoCalculateTczDetail(edbInfoId int) (item *EdbInfoCalculateTczDetail, err error) {
  270. o := orm.NewOrm()
  271. o.Using("data")
  272. sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_tcz 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 GetEdbDataCalculateTczByCodeAndDate(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_tcz WHERE edb_code=? AND data_time=? `
  282. err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
  283. return
  284. }
  285. func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime, value string) (err error) {
  286. o := orm.NewOrm()
  287. o.Using("data")
  288. sql := ` UPDATE edb_data_calculate_tcz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
  289. _, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
  290. return
  291. }