device.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. if err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. func (row *DeviceTable) Insert() error {
  64. pre, err := utils.Mysql.Prepare("INSERT INTO `device`(`id`) VALUES(?);")
  65. if err != nil {
  66. return err
  67. }
  68. _, err = pre.Exec(row.Id)
  69. if err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. func (row *DeviceTable) Delete() error {
  75. pre, err := utils.Mysql.Prepare("DELETE FROM `device` WHERE `id`=?;")
  76. if err != nil {
  77. return err
  78. }
  79. _, err = pre.Exec(row.Id)
  80. if err != nil {
  81. return err
  82. }
  83. return nil
  84. }
  85. func (row *DeviceTable) Update(args utils.JsonType) error {
  86. keys, values := utils.UnZip(args)
  87. SQL := utils.Format("UPDATE `device` SET %s WHERE `id`='%s';", utils.SqlFields(keys), row.Id)
  88. pre, err := utils.Mysql.Prepare(SQL)
  89. if err != nil {
  90. return err
  91. }
  92. _, err = pre.Exec(values...)
  93. if err != nil {
  94. return err
  95. }
  96. return nil
  97. }
  98. func (row *DeviceTable) UpdateSelf() error {
  99. SQL := "UPDATE `device` SET `addr`=?,`last`=?,`wine1`=?,`remain1`=?,`ppv1`=?,`wine2`=?,`remain2`=?,`ppv2`=?," +
  100. "`wine3`=?,`remain3`=?,`ppv3`=?,`wine4`=?,`remain4`=?,`ppv4`=?,`manager`=?,`mark`=?,`order`=?," +
  101. "`income`=? WHERE `id`=?;"
  102. pre, err := utils.Mysql.Prepare(SQL)
  103. if err != nil {
  104. return err
  105. }
  106. row.Last = utils.TimeNow()
  107. _, err = pre.Exec(
  108. row.Addr, row.Last,
  109. row.Wines[0].Id, row.Wines[0].Remain, row.Wines[0].Ppv,
  110. row.Wines[1].Id, row.Wines[1].Remain, row.Wines[1].Ppv,
  111. row.Wines[2].Id, row.Wines[2].Remain, row.Wines[2].Ppv,
  112. row.Wines[3].Id, row.Wines[3].Remain, row.Wines[3].Ppv,
  113. row.Manager, row.Mark, row.Order, row.Income, row.Id,
  114. )
  115. if err != nil {
  116. return err
  117. }
  118. return nil
  119. }
  120. func (row *DeviceTable) Get() error {
  121. SQL := "SELECT `addr`,`first`,`last`,`wine1`,`remain1`,`ppv1`,`wine2`,`remain2`,`ppv2`," +
  122. "`wine3`,`remain3`,`ppv3`,`wine4`,`remain4`,`ppv4`,`manager`,`mark`,`order`,`income` " +
  123. "FROM `device` WHERE `id`=?;"
  124. pre, err := utils.Mysql.Prepare(SQL)
  125. if err != nil {
  126. return err
  127. }
  128. err = pre.QueryRow(row.Id).Scan(
  129. &row.Addr, &row.First, &row.Last,
  130. &row.Wines[0].Id, &row.Wines[0].Remain, &row.Wines[0].Ppv,
  131. &row.Wines[1].Id, &row.Wines[1].Remain, &row.Wines[1].Ppv,
  132. &row.Wines[2].Id, &row.Wines[2].Remain, &row.Wines[2].Ppv,
  133. &row.Wines[3].Id, &row.Wines[3].Remain, &row.Wines[3].Ppv,
  134. &row.Manager, &row.Mark, &row.Order, &row.Income,
  135. )
  136. if err != nil {
  137. return err
  138. }
  139. return nil
  140. }
  141. func QueryDevices(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
  142. SQL, like := "none", utils.Format("%%%s%%", cond)
  143. if manager == "" { // not assigned
  144. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `manager`='' AND (`id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?);"
  145. } else if manager == "*" { // all
  146. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?;"
  147. } else { // specific one
  148. SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `manager`=? AND (`id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?);"
  149. }
  150. pre, err := utils.Mysql.Prepare(SQL)
  151. if err != nil {
  152. return 0, nil, err
  153. }
  154. total := 0
  155. if manager == "" || manager == "*" {
  156. err = pre.QueryRow(like, like, like).Scan(&total)
  157. } else {
  158. err = pre.QueryRow(manager, like, like, like).Scan(&total)
  159. }
  160. if err != nil {
  161. return 0, nil, err
  162. }
  163. if total == 0 {
  164. return 0, []utils.JsonType{}, err
  165. }
  166. if manager == "" { // not assigned
  167. 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 " +
  168. "ON d.`manager`=m.`id` WHERE d.`manager`='' AND (d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ?) LIMIT ? OFFSET ?;"
  169. } else if manager == "*" { // all
  170. 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 " +
  171. "ON d.`manager`=m.`id` WHERE d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ? LIMIT ? OFFSET ?;"
  172. } else { // specific one
  173. 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 " +
  174. "ON d.`manager`=m.`id` WHERE d.`manager`=? AND (d.`id` LIKE ? OR d.`addr` LIKE ? OR d.`mark` LIKE ?) LIMIT ? OFFSET ?;"
  175. }
  176. pre, err = utils.Mysql.Prepare(SQL)
  177. if err != nil {
  178. return 0, nil, err
  179. }
  180. var rows *sql.Rows
  181. if manager == "" || manager == "*" {
  182. rows, err = pre.Query(like, like, like, limit, (page-1)*limit)
  183. } else {
  184. rows, err = pre.Query(manager, like, like, like, limit, (page-1)*limit)
  185. }
  186. if err != nil {
  187. return 0, nil, err
  188. }
  189. res := make([]utils.JsonType, 0)
  190. for rows.Next() {
  191. tId, tAddr, tMark, tMid, tManager := "", "", "", "", ""
  192. tFirst, tLast := utils.TimeNow(), utils.TimeNow()
  193. _ = rows.Scan(&tId, &tAddr, &tFirst, &tLast, &tMark, &tMid, &tManager)
  194. res = append(res, utils.JsonType{
  195. "id": tId, "addr": tAddr, "first": tFirst, "last": tLast, "mark": tMark,
  196. "manager": utils.JsonType{"id": tMid, "name": tManager},
  197. })
  198. }
  199. err = rows.Close()
  200. if err != nil {
  201. return 0, nil, err
  202. }
  203. return total, res, nil
  204. }
  205. func BatchAssignDeviceManager(ids []string, manager string) error {
  206. SQL := utils.Format("UPDATE `device` SET `manager`='%s' WHERE `id` IN (%s);", manager, utils.SqlStringListJoin(ids))
  207. _, err := utils.Mysql.Exec(SQL)
  208. return err
  209. }