123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- package tables
- import (
- "Wine-Server/utils"
- "database/sql"
- )
- type TradeTable struct {
- Id string
- Trade string
- Device string
- Time utils.TimeType
- Payer string
- Wine uint16
- Price uint16
- Weight uint16
- Cash uint32
- Manager string
- }
- func CreateTradeTable() error {
- SQL := "CREATE TABLE IF NOT EXISTS `trade`(" +
- "`id` VARCHAR(32) PRIMARY KEY NOT NULL," +
- "`trade` VARCHAR(64) NOT NULL," +
- "`device` VARCHAR(32) NOT NULL," +
- "`time` DATETIME DEFAULT CURRENT_TIMESTAMP," +
- "`payer` VARCHAR(64) NOT NULL," +
- "`wine` SMALLINT UNSIGNED NOT NULL," +
- "`price` SMALLINT UNSIGNED NOT NULL," +
- "`weight` SMALLINT UNSIGNED NOT NULL," +
- "`cash` INT UNSIGNED NOT NULL," +
- "`manager` VARCHAR(16));"
- _, err := utils.Mysql.Exec(SQL)
- return err
- }
- func (row *TradeTable) Insert() error {
- SQL := "INSERT INTO `trade`(`id`,`trade`,`device`,`payer`,`wine`,`price`,`weight`,`cash`,`manager`) VALUES(?,?,?,?,?,?,?,?,?);"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return err
- }
- _, err = pre.Exec(row.Id, row.Trade, row.Device, row.Payer, row.Wine, row.Price, row.Weight, row.Cash, row.Manager)
- return err
- }
- func (row *TradeTable) Delete() error {
- pre, err := utils.Mysql.Prepare("DELETE FROM `trade` WHERE `id`=?;")
- if err != nil {
- return err
- }
- _, err = pre.Exec(row.Id)
- return err
- }
- func (row *TradeTable) Update(args utils.JsonType) error {
- keys, values := utils.UnZip(args)
- SQL := utils.Format("UPDATE `trade` 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 *TradeTable) UpdateSelf() error {
- SQL := "UPDATE `trade` SET `trade`=?,`device`=?,`time`=?,`payer`=?,`wine`=?`price`=?,`weight`=?,`cash`=?,`manager`=? WHERE `id`=?;"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return err
- }
- _, err = pre.Exec(row.Trade, row.Device, row.Time, row.Payer, row.Wine, row.Price, row.Weight, row.Cash, row.Manager, row.Id)
- return err
- }
- func (row *TradeTable) Get() error {
- SQL := "SELECT `trade`,`device`,`time`,`payer`,`wine`,`price`,`weight`,`cash`,`manager` FROM `trade` WHERE `id`=?;"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return err
- }
- err = pre.QueryRow(row.Id).Scan(
- &row.Trade, &row.Device, &row.Time, &row.Payer,
- &row.Wine, &row.Price, &row.Weight, &row.Cash, &row.Manager,
- )
- return err
- }
- func TradeQuery(cond, uid string, limit, page int) (int, []utils.JsonType, error) {
- like := utils.Format("%%%s%%", cond)
- SQL := "SELECT COUNT(t.`id`) FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` WHERE t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?);"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return 0, nil, err
- }
- total := 0
- err = pre.QueryRow(uid, like, like).Scan(&total)
- if err != nil {
- return 0, nil, err
- }
- if total == 0 {
- return 0, []utils.JsonType{}, nil
- }
- SQL = "SELECT t.`id`,t.`device`,t.`time`,w.`name`,t.`price`,t.`weight`,t.`cash`,r.`cash`,r.`reason` " +
- "FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid` " +
- "WHERE t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?) ORDER BY t.`time` DESC LIMIT ? OFFSET ?;"
- pre, err = utils.Mysql.Prepare(SQL)
- if err != nil {
- return 0, nil, err
- }
- var rows *sql.Rows
- rows, err = pre.Query(uid, like, like, limit, (page-1)*limit)
- if err != nil {
- return 0, nil, err
- }
- res := make([]utils.JsonType, 0)
- for rows.Next() {
- var one TradeTable
- refund := 0
- wineName, reason := "", ""
- _ = rows.Scan(&one.Id, &one.Device, &one.Time, &wineName, &one.Price, &one.Weight, &one.Cash, &refund, &reason)
- res = append(res, utils.JsonType{
- "id": one.Id, "device": one.Device, "time": one.Time, "wine": wineName, "price": one.Price,
- "weight": one.Weight, "cash": one.Cash, "refund": refund, "reason": reason,
- })
- }
- _ = rows.Close()
- return total, res, nil
- }
- func TradeQueryForAdmin(manager, cond, uid string, limit, page int) (int, []utils.JsonType, error) {
- like := utils.Format("%%%s%%", cond)
- SQL := "SELECT COUNT(t.`id`) FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` " +
- "WHERE t.`manager`=? AND t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?);"
- pre, err := utils.Mysql.Prepare(SQL)
- if err != nil {
- return 0, nil, err
- }
- total := 0
- err = pre.QueryRow(manager, uid, like, like).Scan(&total)
- if err != nil {
- return 0, nil, err
- }
- if total == 0 {
- return 0, []utils.JsonType{}, nil
- }
- SQL = "SELECT t.`id`,t.`device`,t.`time`,w.`name`,t.`price`,t.`weight`,t.`cash`,r.`cash`,r.`reason` " +
- "FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid` " +
- "WHERE t.`manager`=? AND t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?) ORDER BY t.`time` DESC LIMIT ? OFFSET ?;"
- pre, err = utils.Mysql.Prepare(SQL)
- if err != nil {
- return 0, nil, err
- }
- var rows *sql.Rows
- rows, err = pre.Query(manager, uid, like, like, limit, (page-1)*limit)
- if err != nil {
- return 0, nil, err
- }
- res := make([]utils.JsonType, 0)
- for rows.Next() {
- var one TradeTable
- refund := 0
- wineName, reason := "", ""
- _ = rows.Scan(&one.Id, &one.Device, &one.Time, &wineName, &one.Price, &one.Weight, &one.Cash, &refund, &reason)
- res = append(res, utils.JsonType{
- "id": one.Id, "device": one.Device, "time": one.Time, "wine": wineName, "price": one.Price,
- "weight": one.Weight, "cash": one.Cash, "refund": refund, "reason": reason,
- })
- }
- _ = rows.Close()
- return total, res, nil
- }
- func TradeRankAdmins(start, end string) ([]idNameTotal, error) {
- SQL := "SELECT m.`id`,m.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
- "LEFT JOIN `manager` AS m ON t.`manager`=m.`id` " +
- "WHERE t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY t.`manager` ORDER BY `income` DESC;"
- rows, err := utils.Mysql.Query(SQL, start, end)
- if err != nil {
- return nil, err
- }
- res := make([]idNameTotal, 0)
- for rows.Next() {
- var one idNameTotal
- _ = rows.Scan(&one.Id, &one.Name, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeRankDevices(start, end string) ([]idTotal, error) {
- SQL := "SELECT `device`,SUM(`cash`) AS `income` FROM `trade` " +
- "WHERE `time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY `device` ORDER BY `income` DESC;"
- rows, err := utils.Mysql.Query(SQL, start, end)
- if err != nil {
- return nil, err
- }
- res := make([]idTotal, 0)
- for rows.Next() {
- var one idTotal
- _ = rows.Scan(&one.Id, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeRankDevicesForAdmin(manager, start, end string) ([]idTotal, error) {
- SQL := "SELECT `device`,SUM(`cash`) AS `income` FROM `trade` WHERE `manager`=? " +
- "AND (`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY `device` ORDER BY `income` DESC;"
- rows, err := utils.Mysql.Query(SQL, manager, start, end)
- if err != nil {
- return nil, err
- }
- res := make([]idTotal, 0)
- for rows.Next() {
- var one idTotal
- _ = rows.Scan(&one.Id, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeRankWines(start, end string) ([]idNameTotal, error) {
- SQL := "SELECT w.`id`,w.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
- "LEFT JOIN `wine` AS w ON t.`wine`=w.`id` " +
- "WHERE t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY t.`wine` ORDER BY `income` DESC;"
- rows, err := utils.Mysql.Query(SQL, start, end)
- if err != nil {
- return nil, err
- }
- res := make([]idNameTotal, 0)
- for rows.Next() {
- var one idNameTotal
- _ = rows.Scan(&one.Id, &one.Name, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeRankWinesForAdmin(manager, start, end string) ([]idNameTotal, error) {
- SQL := "SELECT w.`id`,w.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
- "LEFT JOIN `wine` AS w ON t.`wine`=w.`id` WHERE t.`manager`=? " +
- "AND (t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY t.`wine` ORDER BY `income` DESC;"
- rows, err := utils.Mysql.Query(SQL, manager, start, end)
- if err != nil {
- return nil, err
- }
- res := make([]idNameTotal, 0)
- for rows.Next() {
- var one idNameTotal
- _ = rows.Scan(&one.Id, &one.Name, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeQuerySpecificOne(filed, value string, kind uint8) ([]timeTotal, error) {
- SQL := "none"
- if kind == 0 {
- SQL = utils.Format(
- "SELECT DATE_FORMAT(`time`,'%%Y-%%m') as `tt`,SUM(`cash`) FROM `trade` WHERE `%s`=? GROUP BY `tt`;", filed,
- )
- } else {
- align, days := getAlignDays(kind)
- SQL = utils.Format(
- "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`cash`) FROM `trade` WHERE `%s`=? AND (`time` BETWEEN "+
- "DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) GROUP BY `tt`;", align, filed, days,
- )
- }
- rows, err := utils.Mysql.Query(SQL, value)
- if err != nil {
- return nil, err
- }
- res := make([]timeTotal, 0)
- for rows.Next() {
- var one timeTotal
- _ = rows.Scan(&one.Time, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
- func TradeQuerySpecificOneForAdmin(manager, filed, value string, kind uint8) ([]timeTotal, error) {
- SQL := "none"
- if kind == 0 {
- SQL = utils.Format(
- "SELECT DATE_FORMAT(`time`,'%%Y-%%m') as `tt`,SUM(`cash`) FROM `trade` "+
- "WHERE `manager`=? AND `%s`=? GROUP BY `tt`;", filed,
- )
- } else {
- align, days := getAlignDays(kind)
- SQL = utils.Format(
- "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`cash`) FROM `trade` WHERE `manager`=? AND "+
- "`%s`=? AND (`time` BETWEEN DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) "+
- "GROUP BY `tt`;", align, filed, days,
- )
- }
- rows, err := utils.Mysql.Query(SQL, manager, value)
- if err != nil {
- return nil, err
- }
- res := make([]timeTotal, 0)
- for rows.Next() {
- var one timeTotal
- _ = rows.Scan(&one.Time, &one.Total)
- res = append(res, one)
- }
- _ = rows.Close()
- return res, nil
- }
|