|
@@ -16,7 +16,9 @@ type WorkerTable struct {
|
|
Manager string
|
|
Manager string
|
|
|
|
|
|
Count uint32
|
|
Count uint32
|
|
- Cost uint32
|
|
|
|
|
|
+ Todo uint32
|
|
|
|
+ Avg uint32
|
|
|
|
+ Max uint32
|
|
}
|
|
}
|
|
|
|
|
|
func CreateWorkerTable() error {
|
|
func CreateWorkerTable() error {
|
|
@@ -29,18 +31,20 @@ func CreateWorkerTable() error {
|
|
"`password` VARCHAR(128) NOT NULL," +
|
|
"`password` VARCHAR(128) NOT NULL," +
|
|
"`manager` VARCHAR(16) DEFAULT ''," +
|
|
"`manager` VARCHAR(16) DEFAULT ''," +
|
|
"`count` INT UNSIGNED DEFAULT 0," +
|
|
"`count` INT UNSIGNED DEFAULT 0," +
|
|
- "`cost` 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)
|
|
_, err := utils.Mysql.Exec(SQL)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
func (row *WorkerTable) Insert() error {
|
|
func (row *WorkerTable) Insert() error {
|
|
- SQL := "INSERT INTO `worker`(`id`,`name`,`phone`,`password`) VALUES(?,?,?,?);"
|
|
|
|
|
|
+ SQL := "INSERT INTO `worker`(`id`,`name`,`phone`,`password`,`manager`) VALUES(?,?,?,?,?);"
|
|
pre, err := utils.Mysql.Prepare(SQL)
|
|
pre, err := utils.Mysql.Prepare(SQL)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- _, err = pre.Exec(row.Id, row.Name, row.Phone, row.Password)
|
|
|
|
|
|
+ _, err = pre.Exec(row.Id, row.Name, row.Phone, row.Password, row.Manager)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -65,43 +69,51 @@ func (row *WorkerTable) Update(args utils.JsonType) error {
|
|
}
|
|
}
|
|
|
|
|
|
func (row *WorkerTable) UpdateSelf() error {
|
|
func (row *WorkerTable) UpdateSelf() error {
|
|
- SQL := "UPDATE `worker` SET `last`=?,`name`=?,`phone`=?,`password`=?,`manager`=?,`count`=?,`cost`=? WHERE `id`=?;"
|
|
|
|
- pre, err := utils.Mysql.Prepare(SQL)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
|
|
+ SQL := "UPDATE `worker` SET `last`=?,`name`=?,`phone`=?,`password`=?,`manager`=?," +
|
|
|
|
+ "`count`=?,`todo`=?,`avg_cost`=?,`max_cost`=? WHERE `id`=?;"
|
|
row.Last = utils.TimeNow()
|
|
row.Last = utils.TimeNow()
|
|
- _, err = pre.Exec(row.Last, row.Name, row.Phone, row.Password, row.Manager, row.Count, row.Cost, row.Id)
|
|
|
|
|
|
+ _, 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
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
func (row *WorkerTable) Get() error {
|
|
func (row *WorkerTable) Get() error {
|
|
- SQL := "SELECT `first`,`last`,`name`,`phone`,`password`,`manager`,`count`,`cost` FROM `worker` WHERE `id`=?;"
|
|
|
|
- pre, err := utils.Mysql.Prepare(SQL)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- err = pre.QueryRow(row.Id).Scan(
|
|
|
|
- &row.First, &row.Last, &row.Name, &row.Phone,
|
|
|
|
- &row.Password, &row.Count, &row.Cost,
|
|
|
|
|
|
+ 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,
|
|
)
|
|
)
|
|
- return err
|
|
|
|
}
|
|
}
|
|
|
|
|
|
func (row *WorkerTable) GetByPhone() error {
|
|
func (row *WorkerTable) GetByPhone() error {
|
|
- SQL := "SELECT `id`,`first`,`last`,`name`,`password`,`manager`,`count`,`cost` FROM `worker` WHERE `phone`=? LIMIT 1;"
|
|
|
|
- pre, err := utils.Mysql.Prepare(SQL)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- err = pre.QueryRow(row.Phone).Scan(
|
|
|
|
- &row.Id, &row.First, &row.Last, &row.Name,
|
|
|
|
- &row.Password, &row.Manager, &row.Count, &row.Cost,
|
|
|
|
|
|
+ SQL := "SELECT `id`,`first`,`last`,`name`,`password`,`manager`,`count`,`todo`," +
|
|
|
|
+ "`avg_cost`,`max_cost` FROM `worker` WHERE `phone`=?;"
|
|
|
|
+ return utils.Mysql.QueryRow(SQL, row.Phone).Scan(
|
|
|
|
+ &row.Id, &row.First, &row.Last, &row.Name, &row.Password,
|
|
|
|
+ &row.Manager, &row.Count, &row.Todo, &row.Avg, &row.Max,
|
|
)
|
|
)
|
|
- return err
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-func WorkerQuery(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
|
|
|
|
|
|
+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"
|
|
SQL := "none"
|
|
if manager == "" { // any
|
|
if manager == "" { // any
|
|
SQL = utils.Format(
|
|
SQL = utils.Format(
|
|
@@ -120,20 +132,20 @@ func WorkerQuery(manager, cond string, limit, page int) (int, []utils.JsonType,
|
|
return 0, nil, err
|
|
return 0, nil, err
|
|
}
|
|
}
|
|
if total == 0 {
|
|
if total == 0 {
|
|
- return 0, []utils.JsonType{}, err
|
|
|
|
|
|
+ return 0, []workerQueryRes{}, err
|
|
}
|
|
}
|
|
if manager == "" { // any
|
|
if manager == "" { // any
|
|
SQL = utils.Format(
|
|
SQL = utils.Format(
|
|
- "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`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;",
|
|
|
|
|
|
+ "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,
|
|
cond, cond, limit, (page-1)*limit,
|
|
)
|
|
)
|
|
} else { // one
|
|
} else { // one
|
|
SQL = utils.Format(
|
|
SQL = utils.Format(
|
|
- "SELECT w.`id`,w.`first`,w.`last`,w.`name`,w.`phone`,w.`count`,w.`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;",
|
|
|
|
|
|
+ "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,
|
|
manager, cond, cond, limit, (page-1)*limit,
|
|
)
|
|
)
|
|
}
|
|
}
|
|
@@ -143,21 +155,31 @@ func WorkerQuery(manager, cond string, limit, page int) (int, []utils.JsonType,
|
|
if err != nil {
|
|
if err != nil {
|
|
return 0, nil, err
|
|
return 0, nil, err
|
|
}
|
|
}
|
|
- res := make([]utils.JsonType, 0)
|
|
|
|
|
|
+ res := make([]workerQueryRes, 0)
|
|
for rows.Next() {
|
|
for rows.Next() {
|
|
- var worker WorkerTable
|
|
|
|
- name := ""
|
|
|
|
- _ = rows.Scan(&worker.Id, &worker.First, &worker.Last, &worker.Name, &worker.Phone, &worker.Count, &worker.Cost, &worker.Manager, &name)
|
|
|
|
- res = append(res, utils.JsonType{
|
|
|
|
- "id": worker.Id, "first": worker.First, "last": worker.Last, "name": worker.Name, "phone": worker.Phone,
|
|
|
|
- "count": worker.Count, "cost": worker.Cost, "manager": utils.JsonType{"id": worker.Manager, "name": name},
|
|
|
|
- })
|
|
|
|
|
|
+ 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()
|
|
_ = rows.Close()
|
|
return total, res, nil
|
|
return total, res, nil
|
|
}
|
|
}
|
|
|
|
|
|
-func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
|
|
|
|
|
|
+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(
|
|
SQL := utils.Format(
|
|
"SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
|
|
"SELECT COUNT(`id`) AS `total` FROM `worker` WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%');",
|
|
manager, cond, cond,
|
|
manager, cond, cond,
|
|
@@ -168,10 +190,10 @@ func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []utils.Js
|
|
return 0, nil, err
|
|
return 0, nil, err
|
|
}
|
|
}
|
|
if total == 0 {
|
|
if total == 0 {
|
|
- return 0, []utils.JsonType{}, err
|
|
|
|
|
|
+ return 0, []workerQueryForAdminRes{}, err
|
|
}
|
|
}
|
|
SQL = utils.Format(
|
|
SQL = utils.Format(
|
|
- "SELECT `id`,`first`,`last`,`name`,`phone`,`count`,`cost` FROM `worker` "+
|
|
|
|
|
|
+ "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;",
|
|
"WHERE `manager`='%s' AND (`name` LIKE '%%%s%%' OR `phone` LIKE '%%%s%%') LIMIT %d OFFSET %d;",
|
|
manager, cond, cond, limit, (page-1)*limit,
|
|
manager, cond, cond, limit, (page-1)*limit,
|
|
)
|
|
)
|
|
@@ -180,14 +202,11 @@ func WorkerQueryForAdmin(manager, cond string, limit, page int) (int, []utils.Js
|
|
if err != nil {
|
|
if err != nil {
|
|
return 0, nil, err
|
|
return 0, nil, err
|
|
}
|
|
}
|
|
- res := make([]utils.JsonType, 0)
|
|
|
|
|
|
+ res := make([]workerQueryForAdminRes, 0)
|
|
for rows.Next() {
|
|
for rows.Next() {
|
|
- var worker WorkerTable
|
|
|
|
- _ = rows.Scan(&worker.Id, &worker.First, &worker.Last, &worker.Name, &worker.Phone, &worker.Count, &worker.Cost)
|
|
|
|
- res = append(res, utils.JsonType{
|
|
|
|
- "id": worker.Id, "first": worker.First, "last": worker.Last, "name": worker.Name,
|
|
|
|
- "phone": worker.Phone, "count": worker.Count, "cost": worker.Cost,
|
|
|
|
- })
|
|
|
|
|
|
+ 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()
|
|
_ = rows.Close()
|
|
return total, res, nil
|
|
return total, res, nil
|
|
@@ -198,3 +217,68 @@ func WorkersDelete(ids []string) error {
|
|
_, err := utils.Mysql.Exec(SQL)
|
|
_, err := utils.Mysql.Exec(SQL)
|
|
return err
|
|
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
|
|
|
|
+}
|