warn.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type WarnTable struct {
  7. Id uint32
  8. Device string
  9. Manager string
  10. Time utils.TimeType
  11. Deal bool
  12. }
  13. func CreateWarnTable() error {
  14. SQL := "CREATE TABLE IF NOT EXISTS `warn`(" +
  15. "`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL," +
  16. "`device` VARCHAR(32) NOT NULL," +
  17. "`manager` VARCHAR(16) NOT NULL," +
  18. "`time` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  19. "`deal` BOOL DEFAULT FALSE);"
  20. _, err := utils.Mysql.Exec(SQL)
  21. return err
  22. }
  23. func (row *WarnTable) Insert() error {
  24. SQL := "INSERT INTO `warn` (`device`,`manager`) VALUES (?,?);"
  25. pre, err := utils.Mysql.Prepare(SQL)
  26. if err != nil {
  27. return err
  28. }
  29. _, err = pre.Exec(row.Device, row.Manager)
  30. return err
  31. }
  32. // Delete deprecated
  33. func (row *WarnTable) Delete() error {
  34. _, err := utils.Mysql.Exec("DELETE FROM `warn` WHERE `id`=?;", row.Id)
  35. return err
  36. }
  37. func (row *WarnTable) Update(args utils.JsonType) error {
  38. keys, values := utils.UnZip(args)
  39. SQL := utils.Format("UPDATE `warn` SET %s WHERE `id`=%d;", utils.SqlFields(keys), row.Id)
  40. pre, err := utils.Mysql.Prepare(SQL)
  41. if err != nil {
  42. return err
  43. }
  44. _, err = pre.Exec(values...)
  45. return err
  46. }
  47. func (row *WarnTable) UpdateSelf() error {
  48. SQL := "UPDATE `warn` SET `device`=?,`manager`=?,`time`=?,`deal`=? WHERE `id`=?;"
  49. row.Time = utils.TimeNow()
  50. _, err := utils.Mysql.Exec(SQL, row.Device, row.Manager, row.Time, row.Deal, row.Id)
  51. return err
  52. }
  53. func (row *WarnTable) Get() error {
  54. SQL := "SELECT `device`,`manager`,`time`,`deal` FROM `warn` WHERE `id`=?;"
  55. err := utils.Mysql.QueryRow(SQL, row.Id).Scan(&row.Device, &row.Manager, &row.Time, &row.Deal)
  56. return err
  57. }
  58. func (row *WarnTable) GetByDeviceAndManager() error {
  59. SQL := "SELECT `id`,`time`,`deal` FROM `warn` WHERE `device`=? AND `manager`=?;"
  60. err := utils.Mysql.QueryRow(SQL, row.Device, row.Manager).Scan(&row.Id, &row.Time, &row.Deal)
  61. return err
  62. }
  63. type warnQueryRes struct {
  64. Id uint32 `json:"id"`
  65. Device string `json:"device"`
  66. Time utils.TimeType `json:"time"`
  67. Deal bool `json:"deal"`
  68. Addr string `json:"addr"`
  69. Old [4]WineWithIdNameRemain `json:"old"`
  70. }
  71. func WarnQuery(manager, cond string, deal, limit, page int) (int, []warnQueryRes, error) {
  72. SQL := "none"
  73. if deal == -1 {
  74. SQL = utils.Format(
  75. "SELECT COUNT(w.`id`) AS `total` FROM `warn` AS w LEFT JOIN `device` AS d ON w.`device`=d.`id` "+
  76. "WHERE w.`manager`='%s' AND (w.`device` LIKE '%%%s%%' OR d.`addr` LIKE '%%%s%%');", manager, cond, cond,
  77. )
  78. } else {
  79. SQL = utils.Format(
  80. "SELECT COUNT(w.`id`) AS `total` FROM `warn` AS w LEFT JOIN `device` AS d ON w.`device`=d.`id` "+
  81. "WHERE w.`manager`='%s' AND w.`deal`=%d AND (w.`device` LIKE '%%%s%%' OR d.`addr` LIKE '%%%s%%');",
  82. manager, deal, cond, cond,
  83. )
  84. }
  85. total := 0
  86. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  87. if err != nil {
  88. return 0, nil, err
  89. }
  90. if total == 0 {
  91. return 0, []warnQueryRes{}, err
  92. }
  93. if deal == -1 {
  94. SQL = utils.Format(
  95. "SELECT w.`id`,w.`device`,w.`time`,w.`deal`,d.`addr`,d.`wine1`,w1.`name`,d.`remain1`,"+
  96. "d.`wine2`,w2.`name`,d.`remain2`,d.`wine3`,w3.`name`,d.`remain3`,d.`wine4`,w4.`name`,d.`remain4` "+
  97. "FROM `warn` AS w LEFT JOIN `device` AS d ON w.`device`=d.`id` "+
  98. "INNER JOIN `wine` AS w1 ON d.`wine1`=w1.`id` INNER JOIN `wine` AS w2 ON d.`wine1`=w2.`id` "+
  99. "INNER JOIN `wine` AS w3 ON d.`wine1`=w3.`id` INNER JOIN `wine` AS w4 ON d.`wine1`=w4.`id` "+
  100. "WHERE w.`manager`='%s' AND (w.`device` LIKE '%%%s%%' OR d.`addr` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  101. manager, cond, cond, limit, (page-1)*limit,
  102. )
  103. } else {
  104. SQL = utils.Format(
  105. "SELECT w.`id`,w.`device`,w.`time`,w.`deal`,d.`addr`,d.`wine1`,w1.`name`,d.`remain1`,"+
  106. "d.`wine2`,w2.`name`,d.`remain2`,d.`wine3`,w3.`name`,d.`remain3`,d.`wine4`,w4.`name`,d.`remain4` "+
  107. "FROM `warn` AS w LEFT JOIN `device` AS d ON w.`device`=d.`id` "+
  108. "INNER JOIN `wine` AS w1 ON d.`wine1`=w1.`id` INNER JOIN `wine` AS w2 ON d.`wine1`=w2.`id` "+
  109. "INNER JOIN `wine` AS w3 ON d.`wine1`=w3.`id` INNER JOIN `wine` AS w4 ON d.`wine1`=w4.`id` "+
  110. "WHERE w.`manager`='%s' AND w.`deal`=%d AND (w.`device` LIKE '%%%s%%' OR d.`addr` LIKE '%%%s%%') "+
  111. "LIMIT %d OFFSET %d;", manager, deal, cond, cond, limit, (page-1)*limit,
  112. )
  113. }
  114. var rows *sql.Rows
  115. res := make([]warnQueryRes, 0)
  116. rows, err = utils.Mysql.Query(SQL)
  117. if err != nil {
  118. return 0, nil, err
  119. }
  120. for rows.Next() {
  121. var tmp warnQueryRes
  122. _ = rows.Scan(
  123. &tmp.Id, &tmp.Device, &tmp.Time, &tmp.Deal, &tmp.Addr,
  124. &tmp.Old[0].Id, &tmp.Old[0].Name, &tmp.Old[0].Remain,
  125. &tmp.Old[1].Id, &tmp.Old[1].Name, &tmp.Old[1].Remain,
  126. &tmp.Old[2].Id, &tmp.Old[2].Name, &tmp.Old[2].Remain,
  127. &tmp.Old[3].Id, &tmp.Old[3].Name, &tmp.Old[3].Remain,
  128. )
  129. res = append(res, tmp)
  130. }
  131. _ = rows.Close()
  132. return total, res, nil
  133. }