worker.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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) GetByPhone() error {
  81. SQL := "SELECT `id`,`first`,`last`,`name`,`password`,`manager`,`count`,`todo`," +
  82. "`avg_cost`,`max_cost` FROM `worker` WHERE `phone`=?;"
  83. return utils.Mysql.QueryRow(SQL, row.Phone).Scan(
  84. &row.Id, &row.First, &row.Last, &row.Name, &row.Password,
  85. &row.Manager, &row.Count, &row.Todo, &row.Avg, &row.Max,
  86. )
  87. }
  88. type workerQueryRes struct {
  89. Id string `json:"id"`
  90. Name string `json:"name"`
  91. Phone string `json:"phone"`
  92. Count uint32 `json:"count"`
  93. Cost uint32 `json:"cost"`
  94. First utils.TimeType `json:"first"`
  95. Last utils.TimeType `json:"last"`
  96. Manager struct {
  97. Id string `json:"id"`
  98. Name string `json:"name"`
  99. } `json:"manager"`
  100. }
  101. func WorkerQuery(manager, cond string, limit, page int) (int, []workerQueryRes, error) {
  102. SQL := "none"
  103. if manager == "" { // any
  104. SQL = utils.Format(
  105. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%';",
  106. cond, cond,
  107. )
  108. } else { // one
  109. SQL = utils.Format(
  110. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  111. manager, cond, cond,
  112. )
  113. }
  114. total := 0
  115. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  116. if err != nil {
  117. return 0, nil, err
  118. }
  119. if total == 0 {
  120. return 0, []workerQueryRes{}, err
  121. }
  122. if manager == "" { // any
  123. SQL = utils.Format(
  124. "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
  125. "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
  126. "WHERE w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%' LIMIT %d OFFSET %d;",
  127. cond, cond, limit, (page-1)*limit,
  128. )
  129. } else { // one
  130. SQL = utils.Format(
  131. "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
  132. "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
  133. "WHERE w.`manager`='%s' AND (w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  134. manager, cond, cond, limit, (page-1)*limit,
  135. )
  136. }
  137. var rows *sql.Rows
  138. rows, err = utils.Mysql.Query(SQL)
  139. if err != nil {
  140. return 0, nil, err
  141. }
  142. res := make([]workerQueryRes, 0)
  143. for rows.Next() {
  144. var one workerQueryRes
  145. _ = rows.Scan(
  146. &one.Id, &one.First, &one.Last, &one.Name, &one.Phone,
  147. &one.Count, &one.Cost, &one.Manager.Id, &one.Manager.Name,
  148. )
  149. res = append(res, one)
  150. }
  151. _ = rows.Close()
  152. return total, res, nil
  153. }
  154. type workerQueryForAdminRes struct {
  155. Id string `json:"id"`
  156. Name string `json:"name"`
  157. Phone string `json:"phone"`
  158. Count uint32 `json:"count"`
  159. Cost uint32 `json:"cost"`
  160. First utils.TimeType `json:"first"`
  161. Last utils.TimeType `json:"last"`
  162. }
  163. func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []workerQueryForAdminRes, error) {
  164. SQL := utils.Format(
  165. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  166. manager, cond, cond,
  167. )
  168. total := 0
  169. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  170. if err != nil {
  171. return 0, nil, err
  172. }
  173. if total == 0 {
  174. return 0, []workerQueryForAdminRes{}, err
  175. }
  176. SQL = utils.Format(
  177. "SELECT `id`,`first`,`last`,`name`,`phone`,`count`,`avg_cost` FROM `worker` "+
  178. "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  179. manager, cond, cond, limit, (page-1)*limit,
  180. )
  181. var rows *sql.Rows
  182. rows, err = utils.Mysql.Query(SQL)
  183. if err != nil {
  184. return 0, nil, err
  185. }
  186. res := make([]workerQueryForAdminRes, 0)
  187. for rows.Next() {
  188. var one workerQueryForAdminRes
  189. _ = rows.Scan(&one.Id, &one.First, &one.Last, &one.Name, &one.Phone, &one.Count, &one.Cost)
  190. res = append(res, one)
  191. }
  192. _ = rows.Close()
  193. return total, res, nil
  194. }
  195. func WorkersDelete(ids []string) error {
  196. SQL := utils.Format("DELETE FROM `worker` WHERE `id` IN (%s);", utils.SqlStringListJoin(ids))
  197. _, err := utils.Mysql.Exec(SQL)
  198. return err
  199. }
  200. func WorkersQueryByPhoneOrName(manager, cond string) ([]utils.JsonType, error) {
  201. like := utils.Format("%%%s%%", cond)
  202. SQL := "SELECT `id`,`phone`,`name` FROM `worker` WHERE `manager`=? AND (`phone` LIKE ? OR `name` LIKE ?) LIMIT 10;"
  203. rows, err := utils.Mysql.Query(SQL, manager, like, like)
  204. if err != nil {
  205. return nil, err
  206. }
  207. res := make([]utils.JsonType, 0)
  208. for rows.Next() {
  209. tid, tph, tna := "", "", ""
  210. _ = rows.Scan(&tid, &tph, &tna)
  211. res = append(res, utils.JsonType{"id": tid, "phone": tph, "name": tna})
  212. }
  213. _ = rows.Close()
  214. return res, nil
  215. }
  216. type workerQueryForHistoryRes struct {
  217. Id string `json:"id"`
  218. Name string `json:"name"`
  219. Phone string `json:"phone"`
  220. Count uint32 `json:"count"`
  221. Todo uint32 `json:"todo"`
  222. Avg uint32 `json:"avg"`
  223. Max uint32 `json:"max"`
  224. Last utils.TimeType `json:"last"`
  225. }
  226. func WorkerQueryForHistory(manager, cond string, limit, page int) (int, []workerQueryForHistoryRes, error) {
  227. SQL := utils.Format(
  228. "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
  229. manager, cond, cond,
  230. )
  231. total := 0
  232. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  233. if err != nil {
  234. return 0, nil, err
  235. }
  236. if total == 0 {
  237. return 0, []workerQueryForHistoryRes{}, err
  238. }
  239. SQL = utils.Format(
  240. "SELECT `id`,`last`,`name`,`phone`,`count`,`todo`,`avg_cost`,`max_cost` FROM `worker` "+
  241. "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
  242. manager, cond, cond, limit, (page-1)*limit,
  243. )
  244. var rows *sql.Rows
  245. rows, err = utils.Mysql.Query(SQL)
  246. if err != nil {
  247. return 0, nil, err
  248. }
  249. res := make([]workerQueryForHistoryRes, 0)
  250. for rows.Next() {
  251. var one workerQueryForHistoryRes
  252. _ = rows.Scan(
  253. &one.Id, &one.Last, &one.Name, &one.Phone,
  254. &one.Count, &one.Todo, &one.Avg, &one.Max,
  255. )
  256. res = append(res, one)
  257. }
  258. _ = rows.Close()
  259. return total, res, nil
  260. }