worker.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type WorkerTable struct {
  7. Id string
  8. First utils.TimeType
  9. Last utils.TimeType
  10. Name string
  11. Phone string
  12. Password string
  13. Manager string
  14. Count uint32
  15. Todo uint32
  16. Avg uint32
  17. Max uint32
  18. }
  19. func CreateWorkerTable() error {
  20. SQL := "CREATE TABLE IF NOT EXISTS `worker`(" +
  21. "`id` VARCHAR(16) PRIMARY KEY NOT NULL," +
  22. "`first` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  23. "`last` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  24. "`name` VARCHAR(16) NOT NULL," +
  25. "`phone` VARCHAR(11) NOT NULL," +
  26. "`password` VARCHAR(128) NOT NULL," +
  27. "`manager` VARCHAR(16) DEFAULT ''," +
  28. "`count` INT UNSIGNED DEFAULT 0," +
  29. "`todo` INT UNSIGNED DEFAULT 0," +
  30. "`avg_cost` INT UNSIGNED DEFAULT 0," +
  31. "`max_cost` INT UNSIGNED DEFAULT 0);"
  32. _, err := utils.Mysql.Exec(SQL)
  33. return err
  34. }
  35. func (row *WorkerTable) Insert() error {
  36. SQL := "INSERT INTO `worker`(`id`,`name`,`phone`,`password`,`manager`) VALUES(?,?,?,?,?);"
  37. pre, err := utils.Mysql.Prepare(SQL)
  38. if err != nil {
  39. return err
  40. }
  41. _, err = pre.Exec(row.Id, row.Name, row.Phone, row.Password, row.Manager)
  42. return err
  43. }
  44. func (row *WorkerTable) Delete() error {
  45. pre, err := utils.Mysql.Prepare("DELETE FROM `worker` WHERE `id`=?;")
  46. if err != nil {
  47. return err
  48. }
  49. _, err = pre.Exec(row.Id)
  50. return err
  51. }
  52. func (row *WorkerTable) Update(args utils.JsonType) error {
  53. keys, values := utils.UnZip(args)
  54. SQL := utils.Format("UPDATE `worker` SET %s WHERE `id`='%s';", utils.SqlFields(keys), row.Id)
  55. pre, err := utils.Mysql.Prepare(SQL)
  56. if err != nil {
  57. return err
  58. }
  59. _, err = pre.Exec(values...)
  60. return err
  61. }
  62. func (row *WorkerTable) UpdateSelf() error {
  63. SQL := "UPDATE `worker` SET `last`=?,`name`=?,`phone`=?,`password`=?,`manager`=?," +
  64. "`count`=?,`todo`=?,`avg_cost`=?,`max_cost`=? WHERE `id`=?;"
  65. row.Last = utils.TimeNow()
  66. _, err := utils.Mysql.Exec(
  67. SQL, row.Last, row.Name, row.Phone, row.Password, row.Manager,
  68. row.Count, row.Todo, row.Avg, row.Max, row.Id,
  69. )
  70. return err
  71. }
  72. func (row *WorkerTable) Get() error {
  73. SQL := "SELECT `first`,`last`,`name`,`phone`,`password`,`manager`,`count`,`todo`," +
  74. "`avg_cost`,`max_cost` FROM `worker` WHERE `id`=?;"
  75. return utils.Mysql.QueryRow(SQL, row.Id).Scan(
  76. &row.First, &row.Last, &row.Name, &row.Phone, &row.Password,
  77. &row.Manager, &row.Count, &row.Todo, &row.Avg, &row.Max,
  78. )
  79. }
  80. func (row *WorkerTable) Login() error {
  81. SQL := "SELECT `id` FROM `worker` WHERE `phone`=? AND `password`=?;"
  82. err := utils.Mysql.QueryRow(SQL, row.Phone, row.Password).Scan(&row.Id)
  83. return err
  84. }
  85. type workerQueryRes struct {
  86. Id string `json:"id"`
  87. Name string `json:"name"`
  88. Phone string `json:"phone"`
  89. Count uint32 `json:"count"`
  90. Cost uint32 `json:"cost"`
  91. First utils.TimeType `json:"first"`
  92. Last utils.TimeType `json:"last"`
  93. Manager struct {
  94. Id string `json:"id"`
  95. Name string `json:"name"`
  96. } `json:"manager"`
  97. }
  98. func WorkerQuery(manager, cond string, limit, page int) (int, []workerQueryRes, error) {
  99. SQL := "none"
  100. if manager == "" { // any
  101. SQL = utils.Format(
  102. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%';",
  103. cond, cond,
  104. )
  105. } else { // one
  106. SQL = utils.Format(
  107. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  108. manager, cond, cond,
  109. )
  110. }
  111. total := 0
  112. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  113. if err != nil {
  114. return 0, nil, err
  115. }
  116. if total == 0 {
  117. return 0, []workerQueryRes{}, err
  118. }
  119. if manager == "" { // any
  120. SQL = utils.Format(
  121. "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
  122. "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
  123. "WHERE w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%' LIMIT %d OFFSET %d;",
  124. cond, cond, limit, (page-1)*limit,
  125. )
  126. } else { // one
  127. SQL = utils.Format(
  128. "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
  129. "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
  130. "WHERE w.`manager`='%s' AND (w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  131. manager, cond, cond, limit, (page-1)*limit,
  132. )
  133. }
  134. var rows *sql.Rows
  135. rows, err = utils.Mysql.Query(SQL)
  136. if err != nil {
  137. return 0, nil, err
  138. }
  139. res := make([]workerQueryRes, 0)
  140. for rows.Next() {
  141. var one workerQueryRes
  142. _ = rows.Scan(
  143. &one.Id, &one.First, &one.Last, &one.Name, &one.Phone,
  144. &one.Count, &one.Cost, &one.Manager.Id, &one.Manager.Name,
  145. )
  146. res = append(res, one)
  147. }
  148. _ = rows.Close()
  149. return total, res, nil
  150. }
  151. type workerQueryForAdminRes struct {
  152. Id string `json:"id"`
  153. Name string `json:"name"`
  154. Phone string `json:"phone"`
  155. Count uint32 `json:"count"`
  156. Cost uint32 `json:"cost"`
  157. First utils.TimeType `json:"first"`
  158. Last utils.TimeType `json:"last"`
  159. }
  160. func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []workerQueryForAdminRes, error) {
  161. SQL := utils.Format(
  162. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  163. manager, cond, cond,
  164. )
  165. total := 0
  166. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  167. if err != nil {
  168. return 0, nil, err
  169. }
  170. if total == 0 {
  171. return 0, []workerQueryForAdminRes{}, err
  172. }
  173. SQL = utils.Format(
  174. "SELECT `id`,`first`,`last`,`name`,`phone`,`count`,`avg_cost` FROM `worker` "+
  175. "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  176. manager, cond, cond, limit, (page-1)*limit,
  177. )
  178. var rows *sql.Rows
  179. rows, err = utils.Mysql.Query(SQL)
  180. if err != nil {
  181. return 0, nil, err
  182. }
  183. res := make([]workerQueryForAdminRes, 0)
  184. for rows.Next() {
  185. var one workerQueryForAdminRes
  186. _ = rows.Scan(&one.Id, &one.First, &one.Last, &one.Name, &one.Phone, &one.Count, &one.Cost)
  187. res = append(res, one)
  188. }
  189. _ = rows.Close()
  190. return total, res, nil
  191. }
  192. func WorkersDelete(ids []string) error {
  193. SQL := utils.Format("DELETE FROM `worker` WHERE `id` IN (%s);", utils.SqlStringListJoin(ids))
  194. _, err := utils.Mysql.Exec(SQL)
  195. return err
  196. }
  197. func WorkersQueryByPhoneOrName(manager, cond string) ([]utils.JsonType, error) {
  198. like := utils.Format("%%%s%%", cond)
  199. SQL := "SELECT `id`,`phone`,`name` FROM `worker` WHERE `manager`=? AND (`phone` LIKE ? OR `name` LIKE ?) LIMIT 10;"
  200. rows, err := utils.Mysql.Query(SQL, manager, like, like)
  201. if err != nil {
  202. return nil, err
  203. }
  204. res := make([]utils.JsonType, 0)
  205. for rows.Next() {
  206. tid, tph, tna := "", "", ""
  207. _ = rows.Scan(&tid, &tph, &tna)
  208. res = append(res, utils.JsonType{"id": tid, "phone": tph, "name": tna})
  209. }
  210. _ = rows.Close()
  211. return res, nil
  212. }
  213. type workerQueryForHistoryRes struct {
  214. Id string `json:"id"`
  215. Name string `json:"name"`
  216. Phone string `json:"phone"`
  217. Count uint32 `json:"count"`
  218. Todo uint32 `json:"todo"`
  219. Avg uint32 `json:"avg"`
  220. Max uint32 `json:"max"`
  221. Last utils.TimeType `json:"last"`
  222. }
  223. func WorkerQueryForHistory(manager, cond string, limit, page int) (int, []workerQueryForHistoryRes, error) {
  224. SQL := utils.Format(
  225. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  226. manager, cond, cond,
  227. )
  228. total := 0
  229. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  230. if err != nil {
  231. return 0, nil, err
  232. }
  233. if total == 0 {
  234. return 0, []workerQueryForHistoryRes{}, err
  235. }
  236. SQL = utils.Format(
  237. "SELECT `id`,`last`,`name`,`phone`,`count`,`todo`,`avg_cost`,`max_cost` FROM `worker` "+
  238. "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  239. manager, cond, cond, limit, (page-1)*limit,
  240. )
  241. var rows *sql.Rows
  242. rows, err = utils.Mysql.Query(SQL)
  243. if err != nil {
  244. return 0, nil, err
  245. }
  246. res := make([]workerQueryForHistoryRes, 0)
  247. for rows.Next() {
  248. var one workerQueryForHistoryRes
  249. _ = rows.Scan(
  250. &one.Id, &one.Last, &one.Name, &one.Phone, &one.Count, &one.Todo, &one.Avg, &one.Max,
  251. )
  252. res = append(res, one)
  253. }
  254. _ = rows.Close()
  255. return total, res, nil
  256. }