worker.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package worker
  2. import (
  3. "Wine-Server/utils"
  4. "Wine-Server/utils/tables"
  5. "errors"
  6. "github.com/gorilla/websocket"
  7. )
  8. func keepAlive(conn *websocket.Conn) {
  9. _ = conn.WriteJSON(utils.WsEvent("pon", nil))
  10. }
  11. func getSecrets(conn *websocket.Conn) {
  12. _ = conn.WriteJSON(utils.WsEvent("secrets", utils.JsonType{
  13. "public": utils.ClientPub, "private": utils.ClientPri,
  14. }))
  15. }
  16. func login(conn *websocket.Conn, data any) (string, error) {
  17. var param loginParam
  18. err := utils.AnyTrans(data, &param)
  19. if err != nil {
  20. utils.Logger.Println(err)
  21. _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("参数错误")))
  22. return "", err
  23. }
  24. var pass string
  25. pass, err = utils.Decrypt(param.Password)
  26. if err != nil {
  27. utils.Logger.Println(err)
  28. _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("解密失败")))
  29. return "", err
  30. }
  31. worker := &tables.WorkerTable{Phone: param.Account, Password: utils.HashPassword(pass)}
  32. err = worker.Login()
  33. if err != nil {
  34. utils.Logger.Println(err)
  35. _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("用户名或密码错误")))
  36. return "", err
  37. }
  38. var token string
  39. utils.WorkerLock.Lock()
  40. if _, exist := utils.WorkerWss[worker.Id]; exist {
  41. utils.WorkerLock.Unlock()
  42. _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("账户已在别处登录")))
  43. return "", errors.New("login other where")
  44. }
  45. for {
  46. token = utils.Format("WorkerToken_%s", utils.RandomString(20, utils.AlphaNumPatten))
  47. exist, _ := utils.Redis.Exists(utils.WxPayCli, token).Result()
  48. if exist != 1 {
  49. utils.Redis.Set(utils.WxPayCli, token, worker.Id, utils.Duration(7*24*60*60))
  50. break
  51. }
  52. }
  53. utils.WorkerLock.Unlock()
  54. _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Success(token)))
  55. return worker.Id, nil
  56. }
  57. func info(conn *websocket.Conn, worker *tables.WorkerTable) {
  58. manager := tables.ManagerTable{Id: worker.Manager}
  59. _ = manager.Get()
  60. _ = conn.WriteJSON(utils.WsEvent("workerInfo", utils.JsonType{
  61. "first": worker.First, "last": worker.Last, "name": worker.Name,
  62. "phone": worker.Phone, "manager": manager.Name, "count": worker.Count,
  63. "todo": worker.Todo, "avg": worker.Avg, "max": worker.Max,
  64. }))
  65. }
  66. func query(conn *websocket.Conn, wid string, data any) {
  67. var param queryParam
  68. err := utils.AnyTrans(data, &param)
  69. if err != nil {
  70. utils.Logger.Println(err)
  71. _ = conn.WriteJSON(utils.WsEvent("queryResult", utils.Fail("参数错误")))
  72. return
  73. }
  74. total, orders, err := tables.ChangesQueryForWorker(wid, param.Cond, param.Status, param.Limit, param.Page)
  75. if err != nil {
  76. utils.Logger.Println(err)
  77. _ = conn.WriteJSON(utils.WsEvent("queryResult", utils.Fail("查询信息失败")))
  78. return
  79. }
  80. _ = conn.WriteJSON(utils.WsEvent(
  81. "queryResult",
  82. utils.Success(utils.JsonType{"total": total, "list": orders}),
  83. ))
  84. }
  85. func detail(conn *websocket.Conn, data any) {
  86. cid, ok := data.(float64)
  87. if !ok {
  88. _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Fail("参数错误")))
  89. return
  90. }
  91. change, err := tables.ChangeDetail(uint32(cid))
  92. if err != nil {
  93. utils.Logger.Println(err)
  94. _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Fail("查询信息失败")))
  95. return
  96. }
  97. _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Success(change)))
  98. }
  99. func ready(conn *websocket.Conn, wid string, data any) {
  100. cid, ok := data.(float64)
  101. if !ok {
  102. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("参数错误")))
  103. return
  104. }
  105. change := tables.ChangeTable{Id: uint32(cid)}
  106. err := change.Get()
  107. if err != nil {
  108. utils.Logger.Println(err)
  109. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("订单不存在")))
  110. return
  111. }
  112. if change.Status != 0 {
  113. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("订单状态异常")))
  114. return
  115. }
  116. if device, din := utils.SellerDevices[change.Device]; din && device.Online {
  117. err = utils.Redis.Set(
  118. utils.WxPayCli, utils.Format("Change_%s_%s", change.Device, wid), cid, utils.Duration(300),
  119. ).Err()
  120. if err != nil {
  121. utils.Logger.Println(err)
  122. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("授权码存储失败")))
  123. return
  124. }
  125. _ = device.Conn.WriteJSON(utils.WsEvent("openGate", utils.JsonType{
  126. "type": "Changing", "user_type": "worker", "user_id": wid,
  127. }))
  128. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Success(nil)))
  129. return
  130. }
  131. _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("设备离线")))
  132. }
  133. func finish(conn *websocket.Conn, worker *tables.WorkerTable, data any) {
  134. cid, ok := data.(float64)
  135. if !ok {
  136. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("参数错误")))
  137. return
  138. }
  139. change := &tables.ChangeTable{Id: uint32(cid)}
  140. err := change.Get()
  141. if err != nil {
  142. utils.Logger.Println(err)
  143. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("订单不存在")))
  144. return
  145. }
  146. if change.Status != 1 {
  147. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("请先完成上酒动作")))
  148. return
  149. }
  150. device := tables.DeviceTable{Id: change.Device}
  151. err = device.Get()
  152. if err != nil {
  153. utils.Logger.Println(err)
  154. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("设备查询失败")))
  155. return
  156. }
  157. device.Wines[0].Id, device.Wines[0].Remain = change.New[0].Id, change.New[0].Remain
  158. device.Wines[1].Id, device.Wines[1].Remain = change.New[1].Id, change.New[1].Remain
  159. device.Wines[2].Id, device.Wines[2].Remain = change.New[2].Id, change.New[2].Remain
  160. device.Wines[3].Id, device.Wines[3].Remain = change.New[3].Id, change.New[3].Remain
  161. err = device.UpdateSelf()
  162. if err != nil {
  163. utils.Logger.Println(err)
  164. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("更新设备失败")))
  165. return
  166. }
  167. change.Status, change.Finish = 2, utils.TimeNow()
  168. err = change.UpdateSelf()
  169. if err != nil {
  170. utils.Logger.Println(err)
  171. _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("更新订单失败")))
  172. return
  173. }
  174. this := uint32(change.Finish.Unix() - change.Finish.Unix())
  175. sum := worker.Avg*worker.Count + this
  176. worker.Count++
  177. worker.Todo--
  178. if this > worker.Max {
  179. worker.Max = this
  180. }
  181. worker.Avg = sum / worker.Count
  182. _ = worker.UpdateSelf()
  183. operate := tables.OperationTable{
  184. UserType: 1, UserId: worker.Id, OpType: 1, Level: 0, Describe: "完成上酒订单",
  185. }
  186. _ = operate.Insert()
  187. }