change.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package tables
  2. import (
  3. "Wine-Server/utils"
  4. "database/sql"
  5. )
  6. type ChangeTable struct {
  7. Id uint32
  8. Wid uint32
  9. Device string
  10. Manager string
  11. Worker string
  12. Code string
  13. Deal bool
  14. Publish utils.TimeType
  15. Finish utils.TimeType
  16. Old [4]WineWithIdRemain
  17. New [4]WineWithIdRemain
  18. }
  19. func CreateChangeTable() error {
  20. SQL := "CREATE TABLE IF NOT EXISTS `change`(" +
  21. "`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL," +
  22. "`wid` INT UNSIGNED NOT NULL," +
  23. "`device` VARCHAR(32) NOT NULL,`manager` VARCHAR(16) NOT NULL," +
  24. "`worker` VARCHAR(16) NOT NULL,`code` VARCHAR(6) NOT NULL," +
  25. "`deal` BOOL DEFAULT FALSE," +
  26. "`publish` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  27. "`finish` DATETIME DEFAULT CURRENT_TIMESTAMP," +
  28. "`wine1o` SMALLINT UNSIGNED DEFAULT 0," +
  29. "`remain1o` SMALLINT UNSIGNED DEFAULT 0," +
  30. "`wine2o` SMALLINT UNSIGNED DEFAULT 0," +
  31. "`remain2o` SMALLINT UNSIGNED DEFAULT 0," +
  32. "`wine3o` SMALLINT UNSIGNED DEFAULT 0," +
  33. "`remain3o` SMALLINT UNSIGNED DEFAULT 0," +
  34. "`wine4o` SMALLINT UNSIGNED DEFAULT 0," +
  35. "`remain4o` SMALLINT UNSIGNED DEFAULT 0," +
  36. "`wine1n` SMALLINT UNSIGNED DEFAULT 0," +
  37. "`remain1n` SMALLINT UNSIGNED DEFAULT 0," +
  38. "`wine2n` SMALLINT UNSIGNED DEFAULT 0," +
  39. "`remain2n` SMALLINT UNSIGNED DEFAULT 0," +
  40. "`wine3n` SMALLINT UNSIGNED DEFAULT 0," +
  41. "`remain3n` SMALLINT UNSIGNED DEFAULT 0," +
  42. "`wine4n` SMALLINT UNSIGNED DEFAULT 0," +
  43. "`remain4n` SMALLINT UNSIGNED DEFAULT 0);"
  44. _, err := utils.Mysql.Exec(SQL)
  45. return err
  46. }
  47. func (row *ChangeTable) Insert() error {
  48. SQL := "INSERT INTO `change` (``wid,`device`,`manager`,`worker`,`code`,`wine1o`,`remain1o`,`wine2o`,`remain2o`," +
  49. "`wine3o`,`remain3o`,`wine4o`,`remain4o`,`wine1n`,`remain1n`,`wine2n`,`remain2n`,`wine3n`,`remain3n`," +
  50. "`wine4n`,`remain4n`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"
  51. pre, err := utils.Mysql.Prepare(SQL)
  52. if err != nil {
  53. return err
  54. }
  55. _, err = pre.Exec(
  56. row.Wid, row.Device, row.Manager, row.Worker, row.Code,
  57. row.Old[0].Id, row.Old[0].Remain, row.Old[1].Id, row.Old[1].Remain,
  58. row.Old[2].Id, row.Old[2].Remain, row.Old[3].Id, row.Old[3].Remain,
  59. row.New[0].Id, row.New[0].Remain, row.New[1].Id, row.New[1].Remain,
  60. row.New[2].Id, row.New[2].Remain, row.New[3].Id, row.New[3].Remain,
  61. )
  62. return err
  63. }
  64. func (row *ChangeTable) Delete() error {
  65. _, err := utils.Mysql.Exec("DELETE FROM `change` WHERE `id`=?;", row.Id)
  66. return err
  67. }
  68. func (row *ChangeTable) Update(args utils.JsonType) error {
  69. keys, values := utils.UnZip(args)
  70. SQL := utils.Format("UPDATE `change` SET %s WHERE `id`=%d;", utils.SqlFields(keys), row.Id)
  71. pre, err := utils.Mysql.Prepare(SQL)
  72. if err != nil {
  73. return err
  74. }
  75. _, err = pre.Exec(values...)
  76. return err
  77. }
  78. func (row *ChangeTable) UpdateSelf() error {
  79. SQL := "UPDATE `change` SET `wid`=?,`device`=?,`manager`=?,`worker`=?,`code`=?,`deal`=?,`publish`=?,`finish`=?," +
  80. "`wine1o`=?,`remain1o`=?,`wine2o`=?,`remain2o`=?,`wine3o`=?,`remain3o`=?,`wine4o`=?,`remain4o`=?," +
  81. "`wine1n`=?,`remain1n`=?,`wine2n`=?,`remain2n`=?,`wine3n`=?,`remain3n`=?,`wine4n`=?,`remain4n`=? WHERE `id`=?;"
  82. _, err := utils.Mysql.Exec(
  83. SQL, row.Wid, row.Device, row.Manager, row.Worker,
  84. row.Code, row.Deal, row.Publish, row.Finish,
  85. row.Old[0].Id, row.Old[0].Remain, row.Old[1].Id, row.Old[1].Remain,
  86. row.Old[2].Id, row.Old[2].Remain, row.Old[3].Id, row.Old[3].Remain,
  87. row.New[0].Id, row.New[0].Remain, row.New[1].Id, row.New[1].Remain,
  88. row.New[2].Id, row.New[2].Remain, row.New[3].Id, row.New[3].Remain, row.Id,
  89. )
  90. return err
  91. }
  92. func (row *ChangeTable) Get() error {
  93. SQL := "SELECT `wid`,`device`,`manager`,`worker`,`code`,`deal`,`publish`,`finish`," +
  94. "`wine1o`,`remain1o`,`wine2o`,`remain2o`,`wine3o`,`remain3o`,`wine4o`,`remain4o`," +
  95. "`wine1n`,`remain1n`,`wine2n`,`remain2n`,`wine3n`,`remain3n`,`wine4n`,`remain4n` FROM `change` WHERE `id`=?;"
  96. err := utils.Mysql.QueryRow(SQL, row.Id).Scan(
  97. &row.Wid, &row.Device, &row.Manager, &row.Worker,
  98. &row.Code, &row.Deal, &row.Publish, &row.Finish,
  99. &row.Old[0].Id, &row.Old[0].Remain, &row.Old[1].Id, &row.Old[1].Remain,
  100. &row.Old[2].Id, &row.Old[2].Remain, &row.Old[3].Id, &row.Old[3].Remain,
  101. &row.New[0].Id, &row.New[0].Remain, &row.New[1].Id, &row.New[1].Remain,
  102. &row.New[2].Id, &row.New[2].Remain, &row.New[3].Id, &row.New[3].Remain,
  103. )
  104. return err
  105. }
  106. type changeQueryRes struct {
  107. Id uint32 `json:"id"`
  108. Device struct {
  109. Id string `json:"id"`
  110. Addr string `json:"addr"`
  111. } `json:"device"`
  112. Code string `json:"code"`
  113. Deal bool `json:"deal"`
  114. Publish utils.TimeType `json:"publish"`
  115. Finish utils.TimeType `json:"finish"`
  116. Old [4]WineWithIdNameRemain `json:"old"`
  117. New [4]WineWithIdNameRemain `json:"new"`
  118. }
  119. func ChangesQuery(manager, worker, cond string, deal, limit, page int) (int, []changeQueryRes, error) {
  120. SQL, like := "none", utils.Format("%%%s%%", cond)
  121. if deal == -1 {
  122. SQL = utils.Format(
  123. "SELECT COUNT(c.`id`) FROM `change` AS c LEFT JOIN `device` AS d ON c.`device`=d.`id`"+
  124. "WHERE c.`manager`='%s' AND c.`worker`='%s' AND (d.`id` LIKE '%s' OR d.`addr` LIKE '%s')",
  125. manager, worker, like, like,
  126. )
  127. } else {
  128. SQL = utils.Format(
  129. "SELECT COUNT(c.`id`) FROM `change` AS c LEFT JOIN `device` AS d ON c.`device`=d.`id`"+
  130. "WHERE c.`deal`=%d AND c.`manager`='%s' AND c.`worker`='%s' AND (d.`id` LIKE '%s' OR d.`addr` LIKE '%s')",
  131. deal, manager, worker, like, like,
  132. )
  133. }
  134. total := 0
  135. err := utils.Mysql.QueryRow(SQL).Scan(&total)
  136. if err != nil {
  137. return 0, nil, err
  138. }
  139. if total == 0 {
  140. return 0, []changeQueryRes{}, err
  141. }
  142. if deal == -1 {
  143. SQL = utils.Format(
  144. "SELECT c.`id`,d.`id`,d.`addr`,c.`code`,c.`deal`,c.`publish`,c.`finish`,"+
  145. "w1.`id`,w1.`name`,c.`remain1o`,w2.`id`,w2.`name`,c.`remain2o`,"+
  146. "w3.`id`,w3.`name`,c.`remain3o`,w4.`id`,w4.`name`,c.`remain4o`,"+
  147. "w5.`id`,w5.`name`,c.`remain1n`,w6.`id`,w6.`name`,c.`remain2n`,"+
  148. "w7.`id`,w7.`name`,c.`remain3n`,w8.`id`,w8.`name`,c.`remain4n` "+
  149. "FROM `change` AS c LEFT JOIN `device` AS d ON c.`device`=d.`id`"+
  150. "INNER JOIN `wine` AS w1 ON w1.`id`=c.`wine1o` INNER JOIN `wine` AS w2 ON w2.`id`=c.`wine2o` "+
  151. "INNER JOIN `wine` AS w3 ON w3.`id`=c.`wine3o` INNER JOIN `wine` AS w4 ON w4.`id`=c.`wine4o` "+
  152. "INNER JOIN `wine` AS w5 ON w5.`id`=c.`wine1n` INNER JOIN `wine` AS w6 ON w6.`id`=c.`wine2n` "+
  153. "INNER JOIN `wine` AS w7 ON w7.`id`=c.`wine3n` INNER JOIN `wine` AS w8 ON w8.`id`=c.`wine4n` "+
  154. "WHERE c.`manager`='%s' AND c.`worker`='%s' AND (d.`id` LIKE '%s' OR d.`addr` LIKE '%s') "+
  155. "LIMIT %d OFFSET %d;", manager, worker, like, like, limit, (page-1)*limit,
  156. )
  157. } else {
  158. SQL = utils.Format(
  159. "SELECT c.`id`,d.`id`,d.`addr`,c.`code`,c.`deal`,c.`publish`,c.`finish`,"+
  160. "w1.`id`,w1.`name`,c.`remain1o`,w2.`id`,w2.`name`,c.`remain2o`,"+
  161. "w3.`id`,w3.`name`,c.`remain3o`,w4.`id`,w4.`name`,c.`remain4o`,"+
  162. "w5.`id`,w5.`name`,c.`remain1n`,w6.`id`,w6.`name`,c.`remain2n`,"+
  163. "w7.`id`,w7.`name`,c.`remain3n`,w8.`id`,w8.`name`,c.`remain4n` "+
  164. "FROM `change` AS c LEFT JOIN `device` AS d ON c.`device`=d.`id`"+
  165. "INNER JOIN `wine` AS w1 ON w1.`id`=c.`wine1o` INNER JOIN `wine` AS w2 ON w2.`id`=c.`wine2o` "+
  166. "INNER JOIN `wine` AS w3 ON w3.`id`=c.`wine3o` INNER JOIN `wine` AS w4 ON w4.`id`=c.`wine4o` "+
  167. "INNER JOIN `wine` AS w5 ON w5.`id`=c.`wine1n` INNER JOIN `wine` AS w6 ON w6.`id`=c.`wine2n` "+
  168. "INNER JOIN `wine` AS w7 ON w7.`id`=c.`wine3n` INNER JOIN `wine` AS w8 ON w8.`id`=c.`wine4n` "+
  169. "WHERE c.`deal`=%d AND c.`manager`='%s' AND c.`worker`='%s' AND (d.`id` LIKE '%s' OR d.`addr` LIKE '%s') "+
  170. "LIMIT %d OFFSET %d;", deal, manager, worker, like, like, limit, (page-1)*limit,
  171. )
  172. }
  173. var rows *sql.Rows
  174. res := make([]changeQueryRes, 0)
  175. rows, err = utils.Mysql.Query(SQL)
  176. if err != nil {
  177. return 0, nil, err
  178. }
  179. for rows.Next() {
  180. var one changeQueryRes
  181. _ = rows.Scan(
  182. &one.Id, &one.Device.Id, &one.Device.Addr, &one.Code, &one.Deal, &one.Publish, &one.Finish,
  183. &one.Old[0].Id, &one.Old[0].Name, &one.Old[0].Remain,
  184. &one.Old[1].Id, &one.Old[1].Name, &one.Old[1].Remain,
  185. &one.Old[2].Id, &one.Old[2].Name, &one.Old[2].Remain,
  186. &one.Old[3].Id, &one.Old[3].Name, &one.Old[3].Remain,
  187. &one.New[0].Id, &one.New[0].Name, &one.New[0].Remain,
  188. &one.New[1].Id, &one.New[1].Name, &one.New[1].Remain,
  189. &one.New[2].Id, &one.New[2].Name, &one.New[2].Remain,
  190. &one.New[3].Id, &one.New[3].Name, &one.New[3].Remain,
  191. )
  192. res = append(res, one)
  193. }
  194. _ = rows.Close()
  195. return total, res, nil
  196. }
  197. func ChangeRankWorkers(start, end string) ([]idNameTotal, error) {
  198. SQL := "SELECT w.`id` AS `person`,w.`name`,SUM(c.`id`) AS `count` FROM `change` AS c " +
  199. "LEFT JOIN `worker` AS w ON c.`worker`=w.`id` WHERE c.`deal`=TRUE " +
  200. "AND (c.`finish` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY `person` ORDER BY `count` DESC;"
  201. rows, err := utils.Mysql.Query(SQL, start, end)
  202. if err != nil {
  203. return nil, err
  204. }
  205. res := make([]idNameTotal, 0)
  206. for rows.Next() {
  207. var one idNameTotal
  208. _ = rows.Scan(&one.Id, &one.Name, &one.Total)
  209. res = append(res, one)
  210. }
  211. _ = rows.Close()
  212. return res, nil
  213. }
  214. func ChangeRankWorkersForAdmin(manager, start, end string) ([]idNameTotal, error) {
  215. SQL := "SELECT w.`id` AS `person`,w.`name`,SUM(c.`id`) AS `count` FROM `change` AS c " +
  216. "LEFT JOIN `worker` AS w ON c.`worker`=w.`id` WHERE c.`deal`=TRUE AND c.`manager`=? " +
  217. "AND (c.`finish` BETWEEN TIMESTAMP(?) AND TIMESTAMP(?)) GROUP BY `person` ORDER BY `count` DESC;"
  218. rows, err := utils.Mysql.Query(SQL, manager, start, end)
  219. if err != nil {
  220. return nil, err
  221. }
  222. res := make([]idNameTotal, 0)
  223. for rows.Next() {
  224. var one idNameTotal
  225. _ = rows.Scan(&one.Id, &one.Name, &one.Total)
  226. res = append(res, one)
  227. }
  228. _ = rows.Close()
  229. return res, nil
  230. }
  231. func ChangeQueryWorker(id string, kind uint8) ([]timeTotal, error) {
  232. SQL := "none"
  233. if kind == 0 {
  234. SQL = "SELECT DATE_FORMAT(`time`,'%Y-%m') as `tt`,SUM(`id`) FROM `change` WHERE `deal`=TRUE AND `worker`=? GROUP BY `tt`;"
  235. } else {
  236. align, days := getAlignDays(kind)
  237. SQL = utils.Format(
  238. "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`tt`) FROM `change` WHERE `deal`=TRUE AND `worker`=? AND (`time` BETWEEN "+
  239. "DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) GROUP BY `tt`;", align, days,
  240. )
  241. }
  242. rows, err := utils.Mysql.Query(SQL, id)
  243. if err != nil {
  244. return nil, err
  245. }
  246. res := make([]timeTotal, 0)
  247. for rows.Next() {
  248. var one timeTotal
  249. _ = rows.Scan(&one.Time, &one.Total)
  250. res = append(res, one)
  251. }
  252. _ = rows.Close()
  253. return res, nil
  254. }
  255. func ChangeQueryWorkerForAdmin(manager, id string, kind uint8) ([]timeTotal, error) {
  256. SQL := "none"
  257. if kind == 0 {
  258. SQL = "SELECT DATE_FORMAT(`time`,'%Y-%m') as `tt`,SUM(`id`) FROM `change` " +
  259. "WHERE `deal`=TRUE AND `manager`=? AND `worker`=? GROUP BY `tt`;"
  260. } else {
  261. align, days := getAlignDays(kind)
  262. SQL = utils.Format(
  263. "SELECT DATE_FORMAT(`time`,'%s') as `tt`,SUM(`tt`) FROM `change` WHERE `deal`=TRUE AND `manager`=? "+
  264. "AND `worker`=? AND (`time` BETWEEN DATE_SUB(CURRENT_TIMESTAMP,INTERVAL %d DAY) AND CURRENT_TIMESTAMP) "+
  265. "GROUP BY `tt`;", align, days,
  266. )
  267. }
  268. rows, err := utils.Mysql.Query(SQL, manager, id)
  269. if err != nil {
  270. return nil, err
  271. }
  272. res := make([]timeTotal, 0)
  273. for rows.Next() {
  274. var one timeTotal
  275. _ = rows.Scan(&one.Time, &one.Total)
  276. res = append(res, one)
  277. }
  278. _ = rows.Close()
  279. return res, nil
  280. }