dcitemhistorydatamodel.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. package model
  2. import (
  3. "GtDataStore/app/cmd/organization/pb"
  4. "context"
  5. "database/sql"
  6. "fmt"
  7. "github.com/zeromicro/go-zero/core/stores/sqlc"
  8. "github.com/zeromicro/go-zero/core/stores/sqlx"
  9. "strings"
  10. "time"
  11. )
  12. var _ DcItemHistoryDataModel = (*customDcItemHistoryDataModel)(nil)
  13. type (
  14. // DcItemHistoryDataModel is an interface to be customized, add more methods here,
  15. // and implement the added methods in customDcItemHistoryDataModel.
  16. DcItemHistoryDataModel interface {
  17. dcItemHistoryDataModel
  18. MultiInsert(ctx context.Context, projectId int64, datas []*pb.ItemHistoryData) (int64, error)
  19. QueryHistoryDataByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) ([]*ItemHistoryData, error)
  20. QueryHistoryDataMaxMinByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*MaxMinData, error)
  21. QueryHistoryDataFirstByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*ItemHistoryData, error)
  22. QueryHistoryDataLastByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*ItemHistoryData, error)
  23. QueryHistoryDataForChart(ctx context.Context, in *pb.ItemHistoryDataForChartReq) ([]*pb.ItemHistoryDataForChart, error)
  24. }
  25. customDcItemHistoryDataModel struct {
  26. *defaultDcItemHistoryDataModel
  27. }
  28. MaxMinData struct {
  29. MaxVal sql.NullFloat64 `db:"max_val"` // 最大值
  30. MinVal sql.NullFloat64 `db:"min_val"` // 最小值
  31. AvgVal sql.NullFloat64 `db:"avg_val"` // 平均值
  32. }
  33. ItemHistoryData struct {
  34. ItemName string `db:"item_name"` // 点位名
  35. Val float64 `db:"val"` // 值
  36. HTime time.Time `db:"h_time"` // 采集数据时间
  37. }
  38. )
  39. // NewDcItemHistoryDataModel returns a model for the database table.
  40. func NewDcItemHistoryDataModel(conn sqlx.SqlConn) DcItemHistoryDataModel {
  41. return &customDcItemHistoryDataModel{
  42. defaultDcItemHistoryDataModel: newDcItemHistoryDataModel(conn),
  43. }
  44. }
  45. func (m *defaultDcItemHistoryDataModel) MultiInsert(ctx context.Context, projectId int64, datas []*pb.ItemHistoryData) (int64, error) {
  46. query := fmt.Sprintf("insert ignore into %s (`item_name`,`val`,`h_time`) values (?, ?, ?)", m.getTableName(projectId))
  47. if bulk, err := sqlx.NewBulkInserter(m.conn, query); err == nil {
  48. for _, data := range datas {
  49. if err = bulk.Insert(data.ItemName, data.Val, data.HTime); err != nil {
  50. return 0, err
  51. }
  52. }
  53. bulk.Flush()
  54. return int64(len(datas)), nil
  55. } else {
  56. return 0, err
  57. }
  58. }
  59. func (m *defaultDcItemHistoryDataModel) QueryHistoryDataByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) ([]*ItemHistoryData, error) {
  60. resp := make([]*ItemHistoryData, 0)
  61. var err error
  62. if strings.Index(in.ItemName, ",") > 0 {
  63. ItemNames := strings.Split(in.ItemName, ",")
  64. var ItemNameStrs []string
  65. for _, val := range ItemNames {
  66. ItemNameStrs = append(ItemNameStrs, "'"+val+"'")
  67. }
  68. inClause := strings.Join(ItemNameStrs, ",")
  69. query := fmt.Sprintf("SELECT hd.* FROM %s AS hd "+
  70. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  71. " WHERE hd.item_name in (%s) AND h_time BETWEEN ? AND ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  72. " Order by h_time %s", m.getTableName(in.ProjectId), inClause, in.Order)
  73. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.Stime, in.Etime)
  74. } else {
  75. query := fmt.Sprintf("SELECT hd.* FROM %s AS hd "+
  76. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  77. " WHERE hd.item_name in (?) AND h_time BETWEEN ? AND ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  78. " Order by h_time %s", m.getTableName(in.ProjectId), in.Order)
  79. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime)
  80. }
  81. switch err {
  82. case nil:
  83. return resp, nil
  84. case sqlc.ErrNotFound:
  85. return nil, ErrNotFound
  86. default:
  87. return nil, err
  88. }
  89. }
  90. func (m *defaultDcItemHistoryDataModel) QueryHistoryDataMaxMinByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*MaxMinData, error) {
  91. resp := &MaxMinData{}
  92. var err error
  93. query := fmt.Sprintf("SELECT max(hd.val) as max_val, min(hd.val) as min_val, avg(hd.val) as avg_val FROM %s AS hd "+
  94. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  95. " WHERE hd.item_name = ? AND h_time BETWEEN ? AND ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))", m.getTableName(in.ProjectId))
  96. err = m.conn.QueryRowCtx(ctx, resp, query, in.ItemName, in.Stime, in.Etime)
  97. switch err {
  98. case nil:
  99. if !resp.MaxVal.Valid {
  100. resp.MaxVal.Float64 = 0
  101. }
  102. if !resp.MinVal.Valid {
  103. resp.MinVal.Float64 = 0
  104. }
  105. if !resp.AvgVal.Valid {
  106. resp.AvgVal.Float64 = 0
  107. }
  108. return resp, nil
  109. case sqlc.ErrNotFound:
  110. return nil, ErrNotFound
  111. default:
  112. return nil, err
  113. }
  114. }
  115. func (m *defaultDcItemHistoryDataModel) QueryHistoryDataFirstByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*ItemHistoryData, error) {
  116. resp := &ItemHistoryData{}
  117. var err error
  118. query := fmt.Sprintf("SELECT hd.* FROM %s AS hd "+
  119. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  120. " WHERE hd.item_name = ? AND h_time BETWEEN ? AND ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  121. " Order by h_time asc limit 1", m.getTableName(in.ProjectId))
  122. err = m.conn.QueryRowCtx(ctx, resp, query, in.ItemName, in.Stime, in.Etime)
  123. switch err {
  124. case nil:
  125. return resp, nil
  126. case sqlc.ErrNotFound:
  127. return nil, ErrNotFound
  128. default:
  129. return nil, err
  130. }
  131. }
  132. func (m *defaultDcItemHistoryDataModel) QueryHistoryDataLastByTime(ctx context.Context, in *pb.ItemHistoryDataByTimeReq) (*ItemHistoryData, error) {
  133. resp := &ItemHistoryData{}
  134. var err error
  135. if in.Stime != "" && in.Etime != "" {
  136. query := fmt.Sprintf("SELECT hd.* FROM %s AS hd "+
  137. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  138. " WHERE hd.item_name = ? AND h_time BETWEEN ? AND ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  139. " Order by h_time desc limit 1", m.getTableName(in.ProjectId))
  140. err = m.conn.QueryRowCtx(ctx, resp, query, in.ItemName, in.Stime, in.Etime)
  141. } else {
  142. query := fmt.Sprintf("SELECT hd.* FROM %s AS hd "+
  143. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  144. " WHERE hd.item_name = ? AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  145. " Order by h_time desc limit 1", m.getTableName(in.ProjectId))
  146. err = m.conn.QueryRowCtx(ctx, resp, query, in.ItemName)
  147. }
  148. switch err {
  149. case nil:
  150. return resp, nil
  151. case sqlc.ErrNotFound:
  152. return nil, ErrNotFound
  153. default:
  154. return nil, err
  155. }
  156. }
  157. func (m *defaultDcItemHistoryDataModel) QueryHistoryDataForChart(ctx context.Context, in *pb.ItemHistoryDataForChartReq) ([]*pb.ItemHistoryDataForChart, error) {
  158. resp := make([]*pb.ItemHistoryDataForChart, 0)
  159. var err error
  160. var selectFormat, timeLpad, timeZero string
  161. if in.Interval == "s" {
  162. selectFormat = "%Y-%m-%d %H:%i:"
  163. timeLpad = "%s"
  164. timeZero = ""
  165. } else if in.Interval == "minute" {
  166. selectFormat = "%Y-%m-%d %H:"
  167. timeLpad = "%i"
  168. timeZero = ":00"
  169. } else if in.Interval == "h" {
  170. selectFormat = "%Y-%m-%d "
  171. timeLpad = "%H"
  172. timeZero = ":00:00"
  173. } else {
  174. // day
  175. selectFormat = "%Y-%m-"
  176. timeLpad = "%d"
  177. timeZero = " 00:00:00"
  178. }
  179. if in.Aggregator == "realtime" {
  180. if in.MinVal != 0 && in.MaxVal != 0 {
  181. query := fmt.Sprintf("SELECT t1.item_name AS `name`, t1.val AS `val`, t2.htime AS `htime_at`"+
  182. " FROM %s AS t1 JOIN ("+
  183. " SELECT hd.item_name,"+
  184. " CASE WHEN MINUTE(h_time) >= 30 THEN DATE_FORMAT(DATE_ADD(h_time, INTERVAL 1 HOUR), '%%Y-%%m-%%d %%H:00:00') "+
  185. " ELSE DATE_FORMAT(h_time, '%%Y-%%m-%%d %%H:00:00') END AS htime"+
  186. " FROM %s AS hd"+
  187. //" LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  188. " WHERE hd.item_name = ? AND h_time >= ? AND h_time < ?"+
  189. //" AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  190. " AND hd.val > %f AND hd.val < %f"+
  191. " GROUP BY htime) AS t2 ON t1.item_name = t2.item_name AND t1.h_time = t2.htime"+
  192. " WHERE t1.item_name = ? ORDER BY t1.h_time %s",
  193. m.getTableName(in.ProjectId), m.getTableName(in.ProjectId), in.MinVal, in.MaxVal, in.Order)
  194. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime, in.ItemName)
  195. } else {
  196. query := fmt.Sprintf("SELECT t1.item_name AS `name`, t1.val AS `val`, t2.htime AS `htime_at`"+
  197. " FROM %s AS t1 JOIN ("+
  198. " SELECT hd.item_name,"+
  199. " CASE WHEN MINUTE(h_time) >= 30 THEN DATE_FORMAT(DATE_ADD(h_time, INTERVAL 1 HOUR), '%%Y-%%m-%%d %%H:00:00') "+
  200. " ELSE DATE_FORMAT(h_time, '%%Y-%%m-%%d %%H:00:00') END AS htime"+
  201. " FROM %s AS hd"+
  202. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  203. " WHERE hd.item_name = ? AND h_time >= ? AND h_time < ?"+
  204. " AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  205. " GROUP BY htime) AS t2 ON t1.item_name = t2.item_name AND t1.h_time = t2.htime"+
  206. " WHERE t1.item_name = ? ORDER BY t1.h_time %s",
  207. m.getTableName(in.ProjectId), m.getTableName(in.ProjectId), in.Order)
  208. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime, in.ItemName)
  209. }
  210. } else if in.Aggregator == "new" {
  211. if in.MinVal != 0 && in.MaxVal != 0 {
  212. query := fmt.Sprintf("SELECT t1.item_name AS `name`, t1.val AS `val`, t2.grouped_h_time AS `htime_at`"+
  213. " FROM %s AS t1 JOIN ("+
  214. " SELECT hd.item_name,"+
  215. " CONCAT(DATE_FORMAT(h_time, '%s'), LPAD(FLOOR(DATE_FORMAT(h_time, '%s') / %d) * %d, 2, 0), '%s') AS grouped_h_time "+
  216. " FROM %s AS hd"+
  217. //" LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  218. " WHERE hd.item_name = ? AND h_time >= ? AND h_time < ?"+
  219. //" AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  220. " AND hd.val > %f AND hd.val < %f"+
  221. " GROUP BY hd.item_name,grouped_h_time) AS t2 ON t1.item_name = t2.item_name AND t1.h_time = t2.grouped_h_time"+
  222. " WHERE t1.item_name = ? ORDER BY t1.h_time %s",
  223. m.getTableName(in.ProjectId), selectFormat, timeLpad, in.Size, in.Size, timeZero, m.getTableName(in.ProjectId), in.MinVal, in.MaxVal, in.Order)
  224. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime, in.ItemName)
  225. } else {
  226. query := fmt.Sprintf("SELECT t1.item_name AS `name`, t1.val AS `val`, t2.grouped_h_time AS `htime_at`"+
  227. " FROM %s AS t1 JOIN ("+
  228. " SELECT hd.item_name,"+
  229. " CONCAT(DATE_FORMAT(h_time, '%s'), LPAD(FLOOR(DATE_FORMAT(h_time, '%s') / %d) * %d, 2, 0), '%s') AS grouped_h_time "+
  230. " FROM %s AS hd"+
  231. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  232. " WHERE hd.item_name = ? AND h_time >= ? AND h_time < ?"+
  233. " AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  234. " GROUP BY hd.item_name,grouped_h_time) AS t2 ON t1.item_name = t2.item_name AND t1.h_time = t2.grouped_h_time"+
  235. " WHERE t1.item_name = ? ORDER BY t1.h_time %s",
  236. m.getTableName(in.ProjectId), selectFormat, timeLpad, in.Size, in.Size, timeZero, m.getTableName(in.ProjectId), in.Order)
  237. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime, in.ItemName)
  238. }
  239. } else {
  240. if in.MinVal != 0 && in.MaxVal != 0 {
  241. query := fmt.Sprintf("SELECT hd.item_name AS `name`, %s(val) AS `val`, "+
  242. " CONCAT(DATE_FORMAT(h_time,'%s'),LPAD(FLOOR(DATE_FORMAT(h_time, '%s')/%d)*%d,2,0),'%s') AS `htime_at`"+
  243. " FROM %s AS hd "+
  244. //" LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  245. " WHERE hd.item_name = ? AND h_time >= ?"+
  246. " AND h_time < ?"+
  247. //" AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  248. " AND hd.val > %f AND hd.val < %f"+
  249. " GROUP BY htime_at ORDER BY htime_at %s",
  250. in.Aggregator, selectFormat, timeLpad, in.Size, in.Size, timeZero, m.getTableName(in.ProjectId), in.MinVal, in.MaxVal, in.Order)
  251. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime)
  252. } else {
  253. query := fmt.Sprintf("SELECT hd.item_name AS `name`, %s(val) AS `val`, "+
  254. " CONCAT(DATE_FORMAT(h_time,'%s'),LPAD(FLOOR(DATE_FORMAT(h_time, '%s')/%d)*%d,2,0),'%s') AS `htime_at`"+
  255. " FROM %s AS hd "+
  256. " LEFT JOIN dc_item_config as ic ON hd.item_name = ic.item_name "+
  257. " WHERE hd.item_name = ? AND h_time >= ?"+
  258. " AND h_time < ?"+
  259. " AND (ic.id IS NULL OR (hd.val > ic.min_val AND hd.val < ic.max_val))"+
  260. " GROUP BY htime_at ORDER BY htime_at %s",
  261. in.Aggregator, selectFormat, timeLpad, in.Size, in.Size, timeZero, m.getTableName(in.ProjectId), in.Order)
  262. err = m.conn.QueryRowsCtx(ctx, &resp, query, in.ItemName, in.Stime, in.Etime)
  263. }
  264. }
  265. switch err {
  266. case nil:
  267. return resp, nil
  268. case sqlc.ErrNotFound:
  269. return nil, ErrNotFound
  270. default:
  271. return nil, err
  272. }
  273. }
  274. func (m *defaultDcItemHistoryDataModel) getTableName(projectId int64) string {
  275. return fmt.Sprintf("dc_item_history_data_%d", projectId)
  276. }
  277. /*
  278. func (m *defaultDcItemHistoryDataModel) QueryHistoryData(ctx context.Context, in *pb.ItemHistoryDataListReq) ([]DcItemHistoryData, error) {
  279. resp := make([]DcItemHistoryData, 0)
  280. var err error
  281. var query string
  282. if in.Aggregator == "realtime" {
  283. query = fmt.Sprintf("SELECT project_id,item_name,val,DATE_FORMAT(c_time, '%%Y-%%m-%%d %%H:00:00') as c_time FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY DATE_FORMAT(c_time, '%%Y-%%m-%%d %%H:00:00') ORDER BY TIME_TO_SEC(c_time) ASC) AS row_num FROM %s WHERE project_id = ? AND item_name = ? AND c_time >= ? AND c_time < ? AND val <> 0) subquery WHERE row_num = 1;", m.table)
  284. } else if in.Aggregator == "new" {
  285. groupSql := ""
  286. timeSql := ""
  287. if in.Interval == "minute" {
  288. query = fmt.Sprintf(`
  289. SELECT val, DATE_ADD(DATE_FORMAT(min_c_time, '%%Y-%%m-%%d %%H:%%i'), INTERVAL (FLOOR(TIME_TO_SEC(min_c_time)/600)*%d) MINUTE) as c_time
  290. FROM (
  291. SELECT MAX(val) AS val,
  292. MIN(c_time) AS min_c_time
  293. FROM %s
  294. WHERE project_id = ? AND item_name = ?
  295. AND c_time >= ? AND c_time < ?
  296. GROUP BY DATE_FORMAT(c_time, '%%Y-%%m-%%d %%H:%%i'), FLOOR(TIME_TO_SEC(c_time) / 600)
  297. ) AS subquery
  298. ORDER BY min_c_time ASC;`, in.Size, m.table)
  299. } else if in.Interval == "h" {
  300. timeSql = fmt.Sprintf("DATE_ADD(concat(DATE_FORMAT(ts,'%%Y-%%m-%%d '),LPAD(FLOOR(DATE_FORMAT(ts, '%%H')/%d)*%d,2,0),':00:00'), INTERVAL %d hour)", in.Size, in.Size, in.Size)
  301. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m-%%d' ),FLOOR(DATE_FORMAT(ts, '%%H' )/%d)", in.Size)
  302. } else {
  303. // day
  304. timeSql = fmt.Sprintf("DATE_ADD(concat(DATE_FORMAT(ts,'%%Y-%%m-'),LPAD(FLOOR(DATE_FORMAT(ts, '%%d')/%d)*%d,2,0),' 00:00:00'), INTERVAL %d day)", in.Size, in.Size, in.Size)
  305. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m' ),FLOOR(DATE_FORMAT(ts, '%%d' )/%d)", in.Size)
  306. }
  307. tableName := "ws_scada." + TableName(itemId)
  308. table := fmt.Sprintf(`(select *
  309. from %s
  310. where item_name = "%s" and project_id = %s
  311. and ts >= "%s" and ts < "%s"
  312. order by ts desc
  313. limit 99999999) A `, tableName, itemId, projectId, sTime, eTime)
  314. rows, err = DB.New().Table(table).
  315. Select(fmt.Sprintf("cast(item_value as DECIMAL(11,4)) as val, %s as htime", timeSql)).
  316. Group(groupSql).
  317. Order("htime asc").
  318. Rows()
  319. }
  320. err = m.conn.QueryRowCtx(ctx, &resp, query, in.ProjectId, in.ItemName, in.Stime, in.Etime)
  321. switch err {
  322. case nil:
  323. return resp, nil
  324. case sqlc.ErrNotFound:
  325. return nil, ErrNotFound
  326. default:
  327. return nil, err
  328. }
  329. var rows *sql.Rows
  330. if aggregator == "realtime" {
  331. rows, err = DB.New().Table("ws_scada."+TableName(itemId)).
  332. Select("item_value as val,CASE WHEN MINUTE(ts) >= 30 THEN DATE_FORMAT(DATE_ADD(ts, INTERVAL 1 HOUR), '%Y-%m-%d %H:00:00') ELSE DATE_FORMAT(ts, '%Y-%m-%d %H:00:00') END AS htime").
  333. Where("item_name = ? ", itemId).
  334. Where("ts >= ? and ts < ?", sTime, eTime).
  335. Where("project_id = ?", projectId).
  336. Group("htime").
  337. Rows()
  338. } else if aggregator == "new" {
  339. groupSql := ""
  340. timeSql := ""
  341. if interval == "minute" {
  342. timeSql = fmt.Sprintf("DATE_ADD(concat(DATE_FORMAT(ts,'%%Y-%%m-%%d %%H:'),LPAD(FLOOR(DATE_FORMAT(ts, '%%i')/%d)*%d,2,0),':00'), INTERVAL %d minute)", sizeInt, sizeInt, sizeInt)
  343. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m-%%d %%H' ),FLOOR(DATE_FORMAT(ts, '%%i' )/%d)", sizeInt)
  344. } else if interval == "h" {
  345. timeSql = fmt.Sprintf("DATE_ADD(concat(DATE_FORMAT(ts,'%%Y-%%m-%%d '),LPAD(FLOOR(DATE_FORMAT(ts, '%%H')/%d)*%d,2,0),':00:00'), INTERVAL %d hour)", sizeInt, sizeInt, sizeInt)
  346. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m-%%d' ),FLOOR(DATE_FORMAT(ts, '%%H' )/%d)", sizeInt)
  347. } else {
  348. // day
  349. timeSql = fmt.Sprintf("DATE_ADD(concat(DATE_FORMAT(ts,'%%Y-%%m-'),LPAD(FLOOR(DATE_FORMAT(ts, '%%d')/%d)*%d,2,0),' 00:00:00'), INTERVAL %d day)", sizeInt, sizeInt, sizeInt)
  350. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m' ),FLOOR(DATE_FORMAT(ts, '%%d' )/%d)", sizeInt)
  351. }
  352. tableName := "ws_scada." + TableName(itemId)
  353. table := fmt.Sprintf(`(select *
  354. from %s
  355. where item_name = "%s" and project_id = %s
  356. and ts >= "%s" and ts < "%s"
  357. order by ts desc
  358. limit 99999999) A `, tableName, itemId, projectId, sTime, eTime)
  359. rows, err = DB.New().Table(table).
  360. Select(fmt.Sprintf("cast(item_value as DECIMAL(11,4)) as val, %s as htime", timeSql)).
  361. Group(groupSql).
  362. Order("htime asc").
  363. Rows()
  364. } else {
  365. groupSql := ""
  366. timeSql := ""
  367. if interval == "minute" {
  368. timeSql = fmt.Sprintf("concat(DATE_FORMAT(ts,'%%Y-%%m-%%d %%H:'),LPAD(FLOOR(DATE_FORMAT(ts, '%%i')/%d)*%d,2,0),':00')", sizeInt, sizeInt)
  369. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m-%%d %%H' ),FLOOR(DATE_FORMAT(ts, '%%i' )/%d)", sizeInt)
  370. } else if interval == "h" {
  371. timeSql = fmt.Sprintf("concat(DATE_FORMAT(ts, '%%Y-%%m-%%d ' ),LPAD(FLOOR(DATE_FORMAT(ts, '%%H' )/%d)*%d,2,0),':00:00')", sizeInt, sizeInt)
  372. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m-%%d' ),FLOOR(DATE_FORMAT(ts, '%%H' )/%d)", sizeInt)
  373. } else {
  374. //day
  375. timeSql = fmt.Sprintf("concat(DATE_FORMAT(ts, '%%Y-%%m-' ),LPAD(FLOOR(DATE_FORMAT(ts, '%%d' )/%d)*%d,2,0),' 00:00:00')", sizeInt, sizeInt)
  376. groupSql = fmt.Sprintf("DATE_FORMAT(ts, '%%Y-%%m' ),FLOOR(DATE_FORMAT(ts, '%%d' )/%d)", sizeInt)
  377. }
  378. rows, err = DB.New().Table("ws_scada."+TableName(itemId)).
  379. Select(fmt.Sprintf("%s(cast(item_value as DECIMAL(11,4))) as val, %s as htime", aggregator, timeSql)).
  380. Where("item_name = ? ", itemId).
  381. Where("ts >= ? and ts < ?", sTime, eTime).
  382. Where("project_id = ?", projectId).
  383. Group(groupSql).
  384. Rows()
  385. }
  386. defer rows.Close()
  387. if err != nil {
  388. log.Error(err)
  389. return nil, err
  390. }
  391. // 查询点位信息 导出表格需要
  392. configMap, err := GetDrdcByItemNameAndDeviceId(itemId, fmt.Sprintf("%d", deviceId))
  393. if err != nil {
  394. log.Error(err)
  395. return nil, err
  396. }
  397. for rows.Next() {
  398. di := postgres.JinkeHistoryData{}
  399. var val sql.NullString
  400. err := rows.Scan(&val, &di.Htime)
  401. di.Val = NullStringConverse(val)
  402. if err != nil { // 获得的都是字符串
  403. log.Error("Some amazing wrong happens in the process of queryAll.", err)
  404. return nil, err
  405. }
  406. di.Name = configMap.ItemAlias
  407. //判断小数点
  408. if configMap.IsBool == false {
  409. di.Val = processPrecise(di.Val, configMap.ItemPrecise)
  410. }
  411. resp = append(resp, di)
  412. }
  413. return resp, nil
  414. }
  415. */