trade.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type TradeTable struct {
  7. Id string
  8. Trade string
  9. Device string
  10. Time utils.TimeType
  11. Payer string
  12. Wine uint16
  13. Price uint16
  14. Weight uint16
  15. Cash uint32
  16. Manager string
  17. }
  18. func CreateTradeTable() error {
  19. SQL := "CREATE TABLE IF NOT EXISTS `trade`(" +
  20. "`id` VARCHAR(32) PRIMARY KEY NOT NULL," +
  21. "`trade` VARCHAR(64) NOT NULL," +
  22. "`device` VARCHAR(32) NOT NULL," +
  23. "`time` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  24. "`payer` VARCHAR(64) NOT NULL," +
  25. "`wine` SMALLINT UNSIGNED NOT NULL," +
  26. "`price` SMALLINT UNSIGNED NOT NULL," +
  27. "`weight` SMALLINT UNSIGNED NOT NULL," +
  28. "`cash` INT UNSIGNED NOT NULL," +
  29. "`manager` VARCHAR(16));"
  30. _, err := utils.Mysql.Exec(SQL)
  31. return err
  32. }
  33. func (row *TradeTable) Insert() error {
  34. SQL := "INSERT INTO `trade`(`id`,`trade`,`device`,`payer`,`wine`,`price`,`weight`,`cash`,`manager`) VALUES(?,?,?,?,?,?,?,?,?);"
  35. pre, err := utils.Mysql.Prepare(SQL)
  36. if err != nil {
  37. return err
  38. }
  39. _, err = pre.Exec(row.Id, row.Trade, row.Device, row.Payer, row.Wine, row.Price, row.Weight, row.Cash, row.Manager)
  40. return err
  41. }
  42. func (row *TradeTable) Delete() error {
  43. pre, err := utils.Mysql.Prepare("DELETE FROM `trade` WHERE `id`=?;")
  44. if err != nil {
  45. return err
  46. }
  47. _, err = pre.Exec(row.Id)
  48. return err
  49. }
  50. func (row *TradeTable) Update(args utils.JsonType) error {
  51. keys, values := utils.UnZip(args)
  52. SQL := utils.Format("UPDATE `trade` SET %s WHERE `id`='%s';", utils.SqlFields(keys), row.Id)
  53. pre, err := utils.Mysql.Prepare(SQL)
  54. if err != nil {
  55. return err
  56. }
  57. _, err = pre.Exec(values...)
  58. return err
  59. }
  60. func (row *TradeTable) UpdateSelf() error {
  61. SQL := "UPDATE `trade` SET `trade`=?,`device`=?,`time`=?,`payer`=?,`wine`=?`price`=?,`weight`=?,`cash`=?,`manager`=? WHERE `id`=?;"
  62. pre, err := utils.Mysql.Prepare(SQL)
  63. if err != nil {
  64. return err
  65. }
  66. _, err = pre.Exec(row.Trade, row.Device, row.Time, row.Payer, row.Wine, row.Price, row.Weight, row.Cash, row.Manager, row.Id)
  67. return err
  68. }
  69. func (row *TradeTable) Get() error {
  70. SQL := "SELECT `trade`,`device`,`time`,`payer`,`wine`,`price`,`weight`,`cash`,`manager` FROM `trade` WHERE `id`=?;"
  71. pre, err := utils.Mysql.Prepare(SQL)
  72. if err != nil {
  73. return err
  74. }
  75. err = pre.QueryRow(row.Id).Scan(
  76. &row.Trade, &row.Device, &row.Time, &row.Payer,
  77. &row.Wine, &row.Price, &row.Weight, &row.Cash, &row.Manager,
  78. )
  79. return err
  80. }
  81. func TradeQuery(cond, uid string, limit, page int) (int, []utils.JsonType, error) {
  82. like := utils.Format("%%%s%%", cond)
  83. 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 ?);"
  84. pre, err := utils.Mysql.Prepare(SQL)
  85. if err != nil {
  86. return 0, nil, err
  87. }
  88. total := 0
  89. err = pre.QueryRow(uid, like, like).Scan(&total)
  90. if err != nil {
  91. return 0, nil, err
  92. }
  93. if total == 0 {
  94. return 0, []utils.JsonType{}, nil
  95. }
  96. SQL = "SELECT t.`id`,t.`device`,t.`time`,w.`name`,t.`price`,t.`weight`,t.`cash`,r.`cash`,r.`reason` " +
  97. "FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid` " +
  98. "WHERE t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?) ORDER BY t.`time` DESC LIMIT ? OFFSET ?;"
  99. pre, err = utils.Mysql.Prepare(SQL)
  100. if err != nil {
  101. return 0, nil, err
  102. }
  103. var rows *sql.Rows
  104. rows, err = pre.Query(uid, like, like, limit, (page-1)*limit)
  105. if err != nil {
  106. return 0, nil, err
  107. }
  108. res := make([]utils.JsonType, 0)
  109. for rows.Next() {
  110. var one TradeTable
  111. refund := 0
  112. wineName, reason := "", ""
  113. _ = rows.Scan(&one.Id, &one.Device, &one.Time, &wineName, &one.Price, &one.Weight, &one.Cash, &refund, &reason)
  114. res = append(res, utils.JsonType{
  115. "id": one.Id, "device": one.Device, "time": one.Time, "wine": wineName, "price": one.Price,
  116. "weight": one.Weight, "cash": one.Cash, "refund": refund, "reason": reason,
  117. })
  118. }
  119. _ = rows.Close()
  120. return total, res, nil
  121. }
  122. func TradeQueryForAdmin(manager, cond, uid string, limit, page int) (int, []utils.JsonType, error) {
  123. like := utils.Format("%%%s%%", cond)
  124. SQL := "SELECT COUNT(t.`id`) FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` " +
  125. "WHERE t.`manager`=? AND t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?);"
  126. pre, err := utils.Mysql.Prepare(SQL)
  127. if err != nil {
  128. return 0, nil, err
  129. }
  130. total := 0
  131. err = pre.QueryRow(manager, uid, like, like).Scan(&total)
  132. if err != nil {
  133. return 0, nil, err
  134. }
  135. if total == 0 {
  136. return 0, []utils.JsonType{}, nil
  137. }
  138. SQL = "SELECT t.`id`,t.`device`,t.`time`,w.`name`,t.`price`,t.`weight`,t.`cash`,r.`cash`,r.`reason` " +
  139. "FROM `trade` AS t LEFT JOIN `wine` AS w ON t.`wine`=w.`id` LEFT JOIN `refund` AS r ON t.`id`=r.`tid` " +
  140. "WHERE t.`manager`=? AND t.`payer`=? AND (t.`id` LIKE ? OR w.`name` LIKE ?) ORDER BY t.`time` DESC LIMIT ? OFFSET ?;"
  141. pre, err = utils.Mysql.Prepare(SQL)
  142. if err != nil {
  143. return 0, nil, err
  144. }
  145. var rows *sql.Rows
  146. rows, err = pre.Query(manager, uid, like, like, limit, (page-1)*limit)
  147. if err != nil {
  148. return 0, nil, err
  149. }
  150. res := make([]utils.JsonType, 0)
  151. for rows.Next() {
  152. var one TradeTable
  153. refund := 0
  154. wineName, reason := "", ""
  155. _ = rows.Scan(&one.Id, &one.Device, &one.Time, &wineName, &one.Price, &one.Weight, &one.Cash, &refund, &reason)
  156. res = append(res, utils.JsonType{
  157. "id": one.Id, "device": one.Device, "time": one.Time, "wine": wineName, "price": one.Price,
  158. "weight": one.Weight, "cash": one.Cash, "refund": refund, "reason": reason,
  159. })
  160. }
  161. _ = rows.Close()
  162. return total, res, nil
  163. }
  164. func TradeRankAdmins(start, end string) ([]idNameTotal, error) {
  165. SQL := "SELECT m.`id`,m.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
  166. "LEFT JOIN `manager` AS m ON t.`manager`=m.`id` " +
  167. "WHERE t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY t.`manager` ORDER BY `income` DESC;"
  168. rows, err := utils.Mysql.Query(SQL, start, end)
  169. if err != nil {
  170. return nil, err
  171. }
  172. res := make([]idNameTotal, 0)
  173. for rows.Next() {
  174. var one idNameTotal
  175. _ = rows.Scan(&one.Id, &one.Name, &one.Total)
  176. res = append(res, one)
  177. }
  178. _ = rows.Close()
  179. return res, nil
  180. }
  181. func TradeRankDevices(start, end string) ([]idTotal, error) {
  182. SQL := "SELECT `device`,SUM(`cash`) AS `income` FROM `trade` " +
  183. "WHERE `time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY `device` ORDER BY `income` DESC;"
  184. rows, err := utils.Mysql.Query(SQL, start, end)
  185. if err != nil {
  186. return nil, err
  187. }
  188. res := make([]idTotal, 0)
  189. for rows.Next() {
  190. var one idTotal
  191. _ = rows.Scan(&one.Id, &one.Total)
  192. res = append(res, one)
  193. }
  194. _ = rows.Close()
  195. return res, nil
  196. }
  197. func TradeRankDevicesForAdmin(manager, start, end string) ([]idTotal, error) {
  198. SQL := "SELECT `device`,SUM(`cash`) AS `income` FROM `trade` WHERE `manager`=? " +
  199. "AND (`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY `device` ORDER BY `income` DESC;"
  200. rows, err := utils.Mysql.Query(SQL, manager, start, end)
  201. if err != nil {
  202. return nil, err
  203. }
  204. res := make([]idTotal, 0)
  205. for rows.Next() {
  206. var one idTotal
  207. _ = rows.Scan(&one.Id, &one.Total)
  208. res = append(res, one)
  209. }
  210. _ = rows.Close()
  211. return res, nil
  212. }
  213. func TradeRankWines(start, end string) ([]idNameTotal, error) {
  214. SQL := "SELECT w.`id`,w.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
  215. "LEFT JOIN `wine` AS w ON t.`wine`=w.`id` " +
  216. "WHERE t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?) GROUP BY t.`wine` ORDER BY `income` DESC;"
  217. rows, err := utils.Mysql.Query(SQL, start, end)
  218. if err != nil {
  219. return nil, err
  220. }
  221. res := make([]idNameTotal, 0)
  222. for rows.Next() {
  223. var one idNameTotal
  224. _ = rows.Scan(&one.Id, &one.Name, &one.Total)
  225. res = append(res, one)
  226. }
  227. _ = rows.Close()
  228. return res, nil
  229. }
  230. func TradeRankWinesForAdmin(manager, start, end string) ([]idNameTotal, error) {
  231. SQL := "SELECT w.`id`,w.`name`,SUM(t.`cash`) AS `income` FROM `trade` AS t " +
  232. "LEFT JOIN `wine` AS w ON t.`wine`=w.`id` WHERE t.`manager`=? " +
  233. "AND (t.`time` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY t.`wine` ORDER BY `income` DESC;"
  234. rows, err := utils.Mysql.Query(SQL, manager, start, end)
  235. if err != nil {
  236. return nil, err
  237. }
  238. res := make([]idNameTotal, 0)
  239. for rows.Next() {
  240. var one idNameTotal
  241. _ = rows.Scan(&one.Id, &one.Name, &one.Total)
  242. res = append(res, one)
  243. }
  244. _ = rows.Close()
  245. return res, nil
  246. }
  247. func TradeQuerySpecificOne(filed, value string, kind uint8) ([]timeTotal, error) {
  248. SQL := "none"
  249. if kind == 0 {
  250. SQL = utils.Format(
  251. "SELECT DATE_FORMAT(`time`,'%%Y-%%m') as `tt`,SUM(`cash`) FROM `trade` WHERE `%s`=? GROUP BY `tt`;", filed,
  252. )
  253. } else {
  254. align, days := getAlignDays(kind)
  255. SQL = utils.Format(
  256. "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`cash`) FROM `trade` WHERE `%s`=? AND (`time` BETWEEN "+
  257. "DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) GROUP BY `tt`;", align, filed, days,
  258. )
  259. }
  260. rows, err := utils.Mysql.Query(SQL, value)
  261. if err != nil {
  262. return nil, err
  263. }
  264. res := make([]timeTotal, 0)
  265. for rows.Next() {
  266. var one timeTotal
  267. _ = rows.Scan(&one.Time, &one.Total)
  268. res = append(res, one)
  269. }
  270. _ = rows.Close()
  271. return res, nil
  272. }
  273. func TradeQuerySpecificOneForAdmin(manager, filed, value string, kind uint8) ([]timeTotal, error) {
  274. SQL := "none"
  275. if kind == 0 {
  276. SQL = utils.Format(
  277. "SELECT DATE_FORMAT(`time`,'%%Y-%%m') as `tt`,SUM(`cash`) FROM `trade` "+
  278. "WHERE `manager`=? AND `%s`=? GROUP BY `tt`;", filed,
  279. )
  280. } else {
  281. align, days := getAlignDays(kind)
  282. SQL = utils.Format(
  283. "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`cash`) FROM `trade` WHERE `manager`=? AND "+
  284. "`%s`=? AND (`time` BETWEEN DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) "+
  285. "GROUP BY `tt`;", align, filed, days,
  286. )
  287. }
  288. rows, err := utils.Mysql.Query(SQL, manager, value)
  289. if err != nil {
  290. return nil, err
  291. }
  292. res := make([]timeTotal, 0)
  293. for rows.Next() {
  294. var one timeTotal
  295. _ = rows.Scan(&one.Time, &one.Total)
  296. res = append(res, one)
  297. }
  298. _ = rows.Close()
  299. return res, nil
  300. }