device.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type deviceWine struct {
  7. Id uint16 `json:"id"`
  8. Name string `json:"name"`
  9. Price uint16 `json:"price"`
  10. Degree uint16 `json:"degree"`
  11. Density uint16 `json:"density"`
  12. Picture string `json:"picture"`
  13. Describe string `json:"describe"`
  14. Remain uint16 `json:"remain"`
  15. Ppv uint16 `json:"ppv"`
  16. }
  17. func (dw *deviceWine) Get() error {
  18. if dw.Id == 0 {
  19. return nil
  20. }
  21. src := &WineTable{Id: dw.Id}
  22. err := src.Get()
  23. if err != nil {
  24. return err
  25. }
  26. dw.Name = src.Name
  27. dw.Price = src.Price
  28. dw.Degree = src.Degree
  29. dw.Density = src.Density
  30. dw.Picture = src.Picture
  31. dw.Describe = src.Describe
  32. return nil
  33. }
  34. type DeviceTable struct {
  35. Id string
  36. Addr string
  37. First utils.TimeType
  38. Last utils.TimeType
  39. Wines [4]deviceWine
  40. Manager string
  41. Mark string
  42. Order uint32
  43. Income uint64
  44. }
  45. func CreateDeviceTable() error {
  46. SQL := "CREATE TABLE IF NOT EXISTS `device`(" +
  47. "`id` VARCHAR(32) PRIMARY KEY," +
  48. "`addr` VARCHAR(128) DEFAULT ''," +
  49. "`first` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  50. "`last` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  51. "`wine1` SMALLINT UNSIGNED DEFAULT 10100,`remain1` SMALLINT UNSIGNED DEFAULT 0,`ppv1` SMALLINT UNSIGNED DEFAULT 2," +
  52. "`wine2` SMALLINT UNSIGNED DEFAULT 10100,`remain2` SMALLINT UNSIGNED DEFAULT 0,`ppv2` SMALLINT UNSIGNED DEFAULT 2," +
  53. "`wine3` SMALLINT UNSIGNED DEFAULT 10100,`remain3` SMALLINT UNSIGNED DEFAULT 0,`ppv3` SMALLINT UNSIGNED DEFAULT 2," +
  54. "`wine4` SMALLINT UNSIGNED DEFAULT 10100,`remain4` SMALLINT UNSIGNED DEFAULT 0,`ppv4` SMALLINT UNSIGNED DEFAULT 2," +
  55. "`manager` VARCHAR(16) DEFAULT '',`mark` VARCHAR(256) DEFAULT ''," +
  56. "`order` INT UNSIGNED DEFAULT 0,`income` BIGINT UNSIGNED DEFAULT 0);"
  57. _, err := utils.Mysql.Exec(SQL)
  58. return err
  59. }
  60. func (row *DeviceTable) Insert() error {
  61. pre, err := utils.Mysql.Prepare("INSERT INTO `device`(`id`) VALUES(?);")
  62. if err != nil {
  63. return err
  64. }
  65. _, err = pre.Exec(row.Id)
  66. return err
  67. }
  68. // Delete deprecated
  69. func (row *DeviceTable) Delete() error {
  70. pre, err := utils.Mysql.Prepare("DELETE FROM `device` WHERE `id`=?;")
  71. if err != nil {
  72. return err
  73. }
  74. _, err = pre.Exec(row.Id)
  75. return err
  76. }
  77. func (row *DeviceTable) Update(args utils.JsonType) error {
  78. keys, values := utils.UnZip(args)
  79. SQL := utils.Format("UPDATE `device` SET %s WHERE `id`='%s';", utils.SqlFields(keys), row.Id)
  80. pre, err := utils.Mysql.Prepare(SQL)
  81. if err != nil {
  82. return err
  83. }
  84. _, err = pre.Exec(values...)
  85. return err
  86. }
  87. func (row *DeviceTable) UpdateSelf() error {
  88. SQL := "UPDATE `device` SET `addr`=?,`last`=?,`wine1`=?,`remain1`=?,`ppv1`=?,`wine2`=?,`remain2`=?,`ppv2`=?," +
  89. "`wine3`=?,`remain3`=?,`ppv3`=?,`wine4`=?,`remain4`=?,`ppv4`=?,`manager`=?,`mark`=?,`order`=?," +
  90. "`income`=? WHERE `id`=?;"
  91. pre, err := utils.Mysql.Prepare(SQL)
  92. if err != nil {
  93. return err
  94. }
  95. row.Last = utils.TimeNow()
  96. _, err = pre.Exec(
  97. row.Addr, row.Last,
  98. row.Wines[0].Id, row.Wines[0].Remain, row.Wines[0].Ppv,
  99. row.Wines[1].Id, row.Wines[1].Remain, row.Wines[1].Ppv,
  100. row.Wines[2].Id, row.Wines[2].Remain, row.Wines[2].Ppv,
  101. row.Wines[3].Id, row.Wines[3].Remain, row.Wines[3].Ppv,
  102. row.Manager, row.Mark, row.Order, row.Income, row.Id,
  103. )
  104. return err
  105. }
  106. func (row *DeviceTable) Get() error {
  107. SQL := "SELECT `addr`,`first`,`last`,`wine1`,`remain1`,`ppv1`,`wine2`,`remain2`,`ppv2`," +
  108. "`wine3`,`remain3`,`ppv3`,`wine4`,`remain4`,`ppv4`,`manager`,`mark`,`order`,`income` " +
  109. "FROM `device` WHERE `id`=?;"
  110. pre, err := utils.Mysql.Prepare(SQL)
  111. if err != nil {
  112. return err
  113. }
  114. err = pre.QueryRow(row.Id).Scan(
  115. &row.Addr, &row.First, &row.Last,
  116. &row.Wines[0].Id, &row.Wines[0].Remain, &row.Wines[0].Ppv,
  117. &row.Wines[1].Id, &row.Wines[1].Remain, &row.Wines[1].Ppv,
  118. &row.Wines[2].Id, &row.Wines[2].Remain, &row.Wines[2].Ppv,
  119. &row.Wines[3].Id, &row.Wines[3].Remain, &row.Wines[3].Ppv,
  120. &row.Manager, &row.Mark, &row.Order, &row.Income,
  121. )
  122. return err
  123. }
  124. func DevicesQuery(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
  125. SQL, like := "none", utils.Format("%%%s%%", cond)
  126. if manager == "" { // not assigned
  127. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `manager`='' AND (`id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?);"
  128. } else if manager == "*" { // all
  129. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?;"
  130. } else { // specific one
  131. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `manager`=? AND (`id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?);"
  132. }
  133. pre, err := utils.Mysql.Prepare(SQL)
  134. if err != nil {
  135. return 0, nil, err
  136. }
  137. total := 0
  138. if manager == "" || manager == "*" {
  139. err = pre.QueryRow(like, like, like).Scan(&total)
  140. } else {
  141. err = pre.QueryRow(manager, like, like, like).Scan(&total)
  142. }
  143. if err != nil {
  144. return 0, nil, err
  145. }
  146. if total == 0 {
  147. return 0, []utils.JsonType{}, err
  148. }
  149. if manager == "" { // not assigned
  150. SQL = "SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id`,m.`name` FROM `device` AS d LEFT JOIN `manager` AS m " +
  151. "ON d.`manager`=m.`id` WHERE d.`manager`='' AND (d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ?) LIMIT ? OFFSET ?;"
  152. } else if manager == "*" { // all
  153. SQL = "SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id`,m.`name` FROM `device` AS d LEFT JOIN `manager` AS m " +
  154. "ON d.`manager`=m.`id` WHERE d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ? LIMIT ? OFFSET ?;"
  155. } else { // specific one
  156. SQL = "SELECT d.`id`,d.`addr`,d.`first`,d.`last`,d.`mark`,m.`id`,m.`name` FROM `device` AS d LEFT JOIN `manager` AS m " +
  157. "ON d.`manager`=m.`id` WHERE d.`manager`=? AND (d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ?) LIMIT ? OFFSET ?;"
  158. }
  159. pre, err = utils.Mysql.Prepare(SQL)
  160. if err != nil {
  161. return 0, nil, err
  162. }
  163. var rows *sql.Rows
  164. if manager == "" || manager == "*" {
  165. rows, err = pre.Query(like, like, like, limit, (page-1)*limit)
  166. } else {
  167. rows, err = pre.Query(manager, like, like, like, limit, (page-1)*limit)
  168. }
  169. if err != nil {
  170. return 0, nil, err
  171. }
  172. res := make([]utils.JsonType, 0)
  173. for rows.Next() {
  174. tId, tAddr, tMark, tMid, tManager := "", "", "", "", ""
  175. tFirst, tLast := utils.TimeNow(), utils.TimeNow()
  176. _ = rows.Scan(&tId, &tAddr, &tFirst, &tLast, &tMark, &tMid, &tManager)
  177. res = append(res, utils.JsonType{
  178. "id": tId, "addr": tAddr, "first": tFirst, "last": tLast, "mark": tMark,
  179. "manager": utils.JsonType{"id": tMid, "name": tManager},
  180. })
  181. }
  182. _ = rows.Close()
  183. return total, res, nil
  184. }
  185. func DevicesAssignManager(ids []string, manager string) error {
  186. SQL := utils.Format("UPDATE `device` SET `manager`='%s' WHERE `id` IN (%s);", manager, utils.SqlStringListJoin(ids))
  187. _, err := utils.Mysql.Exec(SQL)
  188. return err
  189. }
  190. func DevicesWithTheWine(wid uint16) ([]string, error) {
  191. SQL := utils.Format(
  192. "SELECT `id` FROM `device` WHERE `wine1`=%d OR `wine2`=%d OR `wine3`=%d OR `wine4`=%d;",
  193. wid, wid, wid, wid,
  194. )
  195. rows, err := utils.Mysql.Query(SQL)
  196. if err != nil {
  197. return nil, err
  198. }
  199. res := make([]string, 0)
  200. for rows.Next() {
  201. var id string
  202. _ = rows.Scan(&id)
  203. res = append(res, id)
  204. }
  205. _ = rows.Close()
  206. return res, nil
  207. }