worker.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package seller
  2. import (
  3. "Wine-Server/utils"
  4. "Wine-Server/utils/tables"
  5. "encoding/json"
  6. "github.com/gin-gonic/gin"
  7. "github.com/gorilla/websocket"
  8. "github.com/skip2/go-qrcode"
  9. )
  10. func versionHandler(ctx *gin.Context) {
  11. version := tables.VersionTable{}
  12. err := version.GetLatest()
  13. if err != nil {
  14. ctx.JSON(utils.HttpError, utils.Fail("Get latest version failed"))
  15. return
  16. }
  17. ctx.JSON(utils.HttpOk, utils.Success(version))
  18. }
  19. func infoOfDevice(device *tables.DeviceTable, conn *websocket.Conn) {
  20. var err error
  21. for i := 0; i < 4; i++ {
  22. err = device.Wines[i].Get()
  23. if err != nil {
  24. utils.Logger.Println("Query wine info failed:", err)
  25. _ = conn.WriteJSON(utils.WsError("Query wine info failed"))
  26. return
  27. }
  28. }
  29. _ = conn.WriteJSON(utils.WsEvent("wineResult", device.Wines))
  30. var advList []tables.AdvertiseTable
  31. advList, err = tables.AdvertiseListAll()
  32. if err != nil {
  33. utils.Logger.Println("Query advertise failed:", err)
  34. _ = conn.WriteJSON(utils.WsError("Query advertise failed"))
  35. return
  36. }
  37. _ = conn.WriteJSON(utils.WsEvent("advResult", advList))
  38. var runParams []tables.ParamsTable
  39. runParams, err = tables.ParamsListAll()
  40. if err != nil {
  41. utils.Logger.Println("Query running params failed:", err)
  42. _ = conn.WriteJSON(utils.WsError("Query running params failed"))
  43. return
  44. }
  45. _ = conn.WriteJSON(utils.WsEvent("runParamResult", runParams))
  46. url := utils.Format("%s?device=%s&callback=%s", utils.VipScanApi, device.Id, utils.VipCallback)
  47. img, err := qrcode.Encode(url, qrcode.Medium, 512)
  48. if err != nil {
  49. utils.Logger.Println(err)
  50. _ = conn.WriteJSON(utils.WsError("Can't Access to Vip Qrcode"))
  51. return
  52. }
  53. _ = conn.WriteJSON(utils.WsEvent("vipQrcodeResult", img))
  54. _ = conn.WriteJSON(utils.WsEvent("initFinish", nil))
  55. }
  56. func keepAlive(conn *websocket.Conn, data any) {
  57. _ = conn.WriteJSON(utils.WsEvent("pon", data))
  58. }
  59. func getQrcode(device *tables.DeviceTable, conn *websocket.Conn, data any) {
  60. var param qrcodeParam
  61. err := utils.AnyTrans(data, &param)
  62. if err != nil {
  63. _ = conn.WriteJSON(utils.WsError("param error"))
  64. return
  65. }
  66. wine := tables.WineTable{Id: param.Id}
  67. err = wine.Get()
  68. if err != nil {
  69. utils.Logger.Printf("Query wine[%d] failed: %s\n", param.Id, err)
  70. _ = conn.WriteJSON(utils.WsError(utils.Format("no such wine: %d", param.Id)))
  71. return
  72. }
  73. cash := int(param.Weight) * int(wine.Price)
  74. if cash != param.Cash {
  75. utils.Logger.Printf("got a wrong cash[user: %d, need: %d]\n", param.Cash, cash)
  76. _ = conn.WriteJSON(utils.WsError(utils.Format("got a wrong cash[you: %d, real: %d]", param.Cash, cash)))
  77. return
  78. }
  79. _ = device.Get()
  80. trade := device.Id + utils.TimeString()
  81. store := tradeRedis{Device: device.Id, Cell: param.Cell, Wine: wine.Id, Weight: param.Weight, Cash: uint32(cash)}
  82. marshal, err := json.Marshal(store)
  83. if err != nil {
  84. utils.Logger.Println("marshal trade failed:", err)
  85. _ = conn.WriteJSON(utils.WsError("marshal trade failed"))
  86. return
  87. }
  88. err = utils.Redis.Set(utils.WxPayCli, utils.Format("WxPay_%s", trade), marshal, utils.Duration(1800)).Err()
  89. if err != nil {
  90. utils.Logger.Println("store trade failed:", err)
  91. _ = conn.WriteJSON(utils.WsError("store trade failed"))
  92. return
  93. }
  94. var img []byte
  95. img, err = utils.TryWxPay(trade, wine.Name, cash)
  96. if err != nil {
  97. utils.Logger.Println("access to wxpay failed:", err)
  98. _ = conn.WriteJSON(utils.WsError("access to Wechat Pay failed"))
  99. return
  100. }
  101. _ = conn.WriteJSON(utils.WsEvent("qrcodeOkayed", img))
  102. }
  103. func checkAuthCode(did string, conn *websocket.Conn, data any) {
  104. var param authParam
  105. err := utils.AnyTrans(data, &param)
  106. if err != nil {
  107. _ = conn.WriteJSON(utils.WsError("params error"))
  108. return
  109. }
  110. utils.Logger.Println(param)
  111. if param.UserType == "debugger" && param.Type == "Changing" {
  112. key := utils.Format("Change_%s_%s", did, param.UserId)
  113. code, err := utils.Redis.Get(utils.WxPayCli,key).Result()
  114. utils.Logger.Println(key, code)
  115. if err != nil {
  116. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  117. "type": param.Type, "ok": false,
  118. }))
  119. return
  120. }
  121. if code == param.Code {
  122. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  123. "type": param.Type, "ok": true, "work": []utils.JsonType{
  124. {
  125. "cell": 1,
  126. "old": utils.JsonType{"id": 13026, "name": "某一款酒名-1", "remain": 300},
  127. "new": utils.JsonType{"id": 13026, "name": "某一款酒名-1", "remain": 15000},
  128. },
  129. {
  130. "cell": 2,
  131. "old": utils.JsonType{"id": 13027, "name": "某一款酒名-2", "remain": 286},
  132. "new": utils.JsonType{"id": 13029, "name": "某一款酒名-3", "remain": 15000},
  133. },
  134. {
  135. "cell": 3,
  136. "old": utils.JsonType{"id": 13027, "name": "某一款酒名-2", "remain": 286},
  137. "new": utils.JsonType{"id": 13029, "name": "某一款酒名-3", "remain": 15000},
  138. },
  139. {
  140. "cell": 4,
  141. "old": utils.JsonType{"id": 13027, "name": "某一款酒名-2", "remain": 286},
  142. "new": utils.JsonType{"id": 13029, "name": "某一款酒名-3", "remain": 15000},
  143. },
  144. },
  145. }))
  146. } else {
  147. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  148. "type": param.Type, "ok": false,
  149. }))
  150. }
  151. return
  152. }
  153. switch param.Type {
  154. case "Changing":
  155. cid, err := utils.Redis.Get(utils.WxPayCli, utils.Format("Change_%s_%s", did, param.UserId)).Int()
  156. if err != nil {
  157. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  158. "type": param.Type, "ok": false,
  159. }))
  160. return
  161. }
  162. change := tables.ChangeTable{Id: uint32(cid)}
  163. err = change.Get()
  164. if err != nil || change.Code != param.Code {
  165. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  166. "type": param.Type, "ok": false,
  167. }))
  168. return
  169. }
  170. _ = change.Update(utils.JsonType{"status": 1})
  171. works := make([]utils.JsonType, 0)
  172. for i := 0; i < 4; i++ {
  173. ow := tables.WineTable{Id: change.Old[0].Id}
  174. nw := tables.WineTable{Id: change.New[0].Id}
  175. _, _ = ow.Get(), nw.Get()
  176. works = append(works, utils.JsonType{
  177. "cell": i + 1,
  178. "old": utils.JsonType{"id": ow.Id, "name": ow.Name, "remain": change.Old[0].Remain},
  179. "new": utils.JsonType{"id": nw.Id, "name": nw.Name, "remain": change.New[0].Remain},
  180. })
  181. }
  182. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  183. "type": param.Type, "ok": true, "work": works,
  184. }))
  185. break
  186. case "Fixing":
  187. code, err := utils.Redis.Get(utils.WxPayCli, utils.Format("Fix_%s_%s", did, param.UserId)).Result()
  188. if err != nil {
  189. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  190. "type": param.Type, "ok": false,
  191. }))
  192. return
  193. }
  194. _ = conn.WriteJSON(utils.WsEvent("authCodeResult", utils.JsonType{
  195. "type": param.Type, "ok": code == param.Code,
  196. }))
  197. break
  198. default:
  199. _ = conn.WriteJSON(utils.WsError("unrecognized open type"))
  200. }
  201. }
  202. func openResult(conn *websocket.Conn, data any) {
  203. var param resultParam
  204. err := utils.AnyTrans(data, &param)
  205. if err != nil {
  206. _ = conn.WriteJSON(utils.WsError("params error"))
  207. return
  208. }
  209. switch param.UserType {
  210. case "worker":
  211. if worker, win := utils.WorkerWss[param.UserId]; win {
  212. _ = worker.WriteJSON(utils.WsEvent("openResult", utils.JsonType{
  213. "type": param.Type, "result": param.Result,
  214. }))
  215. }
  216. break
  217. case "debugger":
  218. if debugger, din := utils.DebugWss[param.UserId]; din {
  219. _ = debugger.WriteJSON(utils.WsEvent("openResult", utils.JsonType{
  220. "type": param.Type, "result": param.Result,
  221. }))
  222. }
  223. break
  224. case "manager":
  225. if manager, min := utils.ManagerWss[param.UserId]; min {
  226. _ = manager.WriteJSON(utils.WsEvent("openResult", utils.JsonType{
  227. "type": param.Type, "result": param.Result,
  228. }))
  229. }
  230. break
  231. default:
  232. utils.Logger.Printf("unrecognized user type: %s\n", param.UserType)
  233. break
  234. }
  235. }
  236. func workFinished(conn *websocket.Conn, data any) {
  237. var param finishParam
  238. err := utils.AnyTrans(data, &param)
  239. if err != nil {
  240. _ = conn.WriteJSON(utils.WsError("params error"))
  241. return
  242. }
  243. switch param.UserType {
  244. case "worker":
  245. if worker, win := utils.WorkerWss[param.UserId]; win {
  246. _ = worker.WriteJSON(utils.WsEvent("workFinished", param.Type))
  247. }
  248. break
  249. case "debugger":
  250. if debugger, din := utils.DebugWss[param.UserId]; din {
  251. _ = debugger.WriteJSON(utils.WsEvent("workFinished", param.Type))
  252. }
  253. break
  254. case "manager":
  255. if manager, min := utils.ManagerWss[param.UserId]; min {
  256. _ = manager.WriteJSON(utils.WsEvent("workFinished", param.Type))
  257. }
  258. break
  259. default:
  260. utils.Logger.Printf("unrecognized user type: %s\n", param.UserType)
  261. break
  262. }
  263. }