123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- package tables
- import (
- "Wine-Server/utils"
- "database/sql"
- )
- type WorkerTable struct {
- Id string
- First utils.TimeType
- Last utils.TimeType
- Name string
- Phone string
- Password string
- Manager string
- Count uint32
- Todo uint32
- Avg uint32
- Max uint32
- }
- func CreateWorkerTable() error {
- SQL := "CREATE TABLE IF NOT EXISTS `worker`(" +
- "`id` VARCHAR(16) PRIMARY KEY NOT NULL," +
- "`first` DATETIME DEFAULT CURRENT_TIMESTAMP," +
- "`last` DATETIME DEFAULT CURRENT_TIMESTAMP," +
- "`name` VARCHAR(16) NOT NULL," +
- "`phone` VARCHAR(11) NOT NULL," +
- "`password` VARCHAR(128) NOT NULL," +
- "`manager` VARCHAR(16) DEFAULT ''," +
- "`count` INT UNSIGNED DEFAULT 0," +
- "`todo` INT UNSIGNED DEFAULT 0," +
- "`avg_cost` INT UNSIGNED DEFAULT 0," +
- "`max_cost` INT UNSIGNED DEFAULT 0);"
- _, err := utils.Mysql.Exec(SQL)
- return err
- }
- func (row *WorkerTable) Insert() error {
- SQL := "INSERT INTO `worker`(`id`,`name`,`phone`,`password`,`manager`) VALUES(?,?,?,?,?);"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return err
- }
- _, err = pre.Exec(row.Id, row.Name, row.Phone, row.Password, row.Manager)
- return err
- }
- func (row *WorkerTable) Delete() error {
- pre, err := utils.Mysql.Prepare("DELETE FROM `worker` WHERE `id`=?;")
- if err != nil {
- return err
- }
- _, err = pre.Exec(row.Id)
- return err
- }
- func (row *WorkerTable) Update(args utils.JsonType) error {
- keys, values := utils.UnZip(args)
- SQL := utils.Format("UPDATE `worker` SET %s WHERE `id`='%s';", utils.SqlFields(keys), row.Id)
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return err
- }
- _, err = pre.Exec(values...)
- return err
- }
- func (row *WorkerTable) UpdateSelf() error {
- SQL := "UPDATE `worker` SET `last`=?,`name`=?,`phone`=?,`password`=?,`manager`=?," +
- "`count`=?,`todo`=?,`avg_cost`=?,`max_cost`=? WHERE `id`=?;"
- row.Last = utils.TimeNow()
- _, err := utils.Mysql.Exec(
- SQL, row.Last, row.Name, row.Phone, row.Password, row.Manager,
- row.Count, row.Todo, row.Avg, row.Max, row.Id,
- )
- return err
- }
- func (row *WorkerTable) Get() error {
- SQL := "SELECT `first`,`last`,`name`,`phone`,`password`,`manager`,`count`,`todo`," +
- "`avg_cost`,`max_cost` FROM `worker` WHERE `id`=?;"
- return utils.Mysql.QueryRow(SQL, row.Id).Scan(
- &row.First, &row.Last, &row.Name, &row.Phone, &row.Password,
- &row.Manager, &row.Count, &row.Todo, &row.Avg, &row.Max,
- )
- }
- func (row *WorkerTable) Login() error {
- SQL := "SELECT `id` FROM `worker` WHERE `phone`=? AND `password`=?;"
- err := utils.Mysql.QueryRow(SQL, row.Phone, row.Password).Scan(&row.Id)
- return err
- }
- type workerQueryRes struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Phone string `json:"phone"`
- Count uint32 `json:"count"`
- Cost uint32 `json:"cost"`
- First utils.TimeType `json:"first"`
- Last utils.TimeType `json:"last"`
- Manager struct {
- Id string `json:"id"`
- Name string `json:"name"`
- } `json:"manager"`
- }
- func WorkerQuery(manager, cond string, limit, page int) (int, []workerQueryRes, error) {
- SQL := "none"
- if manager == "" { // any
- SQL = utils.Format(
- "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%';",
- cond, cond,
- )
- } else { // one
- SQL = utils.Format(
- "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
- manager, cond, cond,
- )
- }
- total := 0
- err := utils.Mysql.QueryRow(SQL).Scan(&total)
- if err != nil {
- return 0, nil, err
- }
- if total == 0 {
- return 0, []workerQueryRes{}, err
- }
- if manager == "" { // any
- SQL = utils.Format(
- "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
- "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
- "WHERE w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%' LIMIT %d OFFSET %d;",
- cond, cond, limit, (page-1)*limit,
- )
- } else { // one
- SQL = utils.Format(
- "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`avg_cost`,m.`id`,m.`name` "+
- "FROM `worker` AS w LEFT JOIN `manager` AS m ON w.`manager`=m.`id` "+
- "WHERE w.`manager`='%s' AND (w.`name` LIKE '%%%s%%' OR w.`phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
- manager, cond, cond, limit, (page-1)*limit,
- )
- }
- var rows *sql.Rows
- rows, err = utils.Mysql.Query(SQL)
- if err != nil {
- return 0, nil, err
- }
- res := make([]workerQueryRes, 0)
- for rows.Next() {
- var one workerQueryRes
- _ = rows.Scan(
- &one.Id, &one.First, &one.Last, &one.Name, &one.Phone,
- &one.Count, &one.Cost, &one.Manager.Id, &one.Manager.Name,
- )
- res = append(res, one)
- }
- _ = rows.Close()
- return total, res, nil
- }
- type workerQueryForAdminRes struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Phone string `json:"phone"`
- Count uint32 `json:"count"`
- Cost uint32 `json:"cost"`
- First utils.TimeType `json:"first"`
- Last utils.TimeType `json:"last"`
- }
- func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []workerQueryForAdminRes, error) {
- SQL := utils.Format(
- "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
- manager, cond, cond,
- )
- total := 0
- err := utils.Mysql.QueryRow(SQL).Scan(&total)
- if err != nil {
- return 0, nil, err
- }
- if total == 0 {
- return 0, []workerQueryForAdminRes{}, err
- }
- SQL = utils.Format(
- "SELECT `id`,`first`,`last`,`name`,`phone`,`count`,`avg_cost` FROM `worker` "+
- "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
- manager, cond, cond, limit, (page-1)*limit,
- )
- var rows *sql.Rows
- rows, err = utils.Mysql.Query(SQL)
- if err != nil {
- return 0, nil, err
- }
- res := make([]workerQueryForAdminRes, 0)
- for rows.Next() {
- var one workerQueryForAdminRes
- _ = rows.Scan(&one.Id, &one.First, &one.Last, &one.Name, &one.Phone, &one.Count, &one.Cost)
- res = append(res, one)
- }
- _ = rows.Close()
- return total, res, nil
- }
- func WorkersDelete(ids []string) error {
- SQL := utils.Format("DELETE FROM `worker` WHERE `id` IN (%s);", utils.SqlStringListJoin(ids))
- _, err := utils.Mysql.Exec(SQL)
- return err
- }
- func WorkersQueryByPhoneOrName(manager, cond string) ([]utils.JsonType, error) {
- like := utils.Format("%%%s%%", cond)
- SQL := "SELECT `id`,`phone`,`name` FROM `worker` WHERE `manager`=? AND (`phone` LIKE ? OR `name` LIKE ?) LIMIT 10;"
- rows, err := utils.Mysql.Query(SQL, manager, like, like)
- if err != nil {
- return nil, err
- }
- res := make([]utils.JsonType, 0)
- for rows.Next() {
- tid, tph, tna := "", "", ""
- _ = rows.Scan(&tid, &tph, &tna)
- res = append(res, utils.JsonType{"id": tid, "phone": tph, "name": tna})
- }
- _ = rows.Close()
- return res, nil
- }
- type workerQueryForHistoryRes struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Phone string `json:"phone"`
- Count uint32 `json:"count"`
- Todo uint32 `json:"todo"`
- Avg uint32 `json:"avg"`
- Max uint32 `json:"max"`
- Last utils.TimeType `json:"last"`
- }
- func WorkerQueryForHistory(manager, cond string, limit, page int) (int, []workerQueryForHistoryRes, error) {
- SQL := utils.Format(
- "SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
- manager, cond, cond,
- )
- total := 0
- err := utils.Mysql.QueryRow(SQL).Scan(&total)
- if err != nil {
- return 0, nil, err
- }
- if total == 0 {
- return 0, []workerQueryForHistoryRes{}, err
- }
- SQL = utils.Format(
- "SELECT `id`,`last`,`name`,`phone`,`count`,`todo`,`avg_cost`,`max_cost` FROM `worker` "+
- "WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
- manager, cond, cond, limit, (page-1)*limit,
- )
- var rows *sql.Rows
- rows, err = utils.Mysql.Query(SQL)
- if err != nil {
- return 0, nil, err
- }
- res := make([]workerQueryForHistoryRes, 0)
- for rows.Next() {
- var one workerQueryForHistoryRes
- _ = rows.Scan(
- &one.Id, &one.Last, &one.Name, &one.Phone, &one.Count, &one.Todo, &one.Avg, &one.Max,
- )
- res = append(res, one)
- }
- _ = rows.Close()
- return total, res, nil
- }
|