package worker import ( "Wine-Server/utils" "Wine-Server/utils/tables" "errors" "github.com/gorilla/websocket" ) func keepAlive(conn *websocket.Conn) { _ = conn.WriteJSON(utils.WsEvent("pon", nil)) } func getSecrets(conn *websocket.Conn) { _ = conn.WriteJSON(utils.WsEvent("secrets", utils.JsonType{ "public": utils.ClientPub, "private": utils.ClientPri, })) } func login(conn *websocket.Conn, data any) (string, error) { var param loginParam err := utils.AnyTrans(data, ¶m) if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("参数错误"))) return "", err } var pass string pass, err = utils.Decrypt(param.Password) if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("解密失败"))) return "", err } worker := &tables.WorkerTable{Phone: param.Account, Password: utils.HashPassword(pass)} err = worker.Login() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("用户名或密码错误"))) return "", err } var token string utils.WorkerLock.Lock() if _, exist := utils.WorkerWss[worker.Id]; exist { utils.WorkerLock.Unlock() _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Fail("账户已在别处登录"))) return "", errors.New("login other where") } for { token = utils.Format("WorkerToken_%s", utils.RandomString(20, utils.AlphaNumPatten)) exist, _ := utils.Redis.Exists(utils.WxPayCli, token).Result() if exist != 1 { utils.Redis.Set(utils.WxPayCli, token, worker.Id, utils.Duration(7*24*60*60)) break } } utils.WorkerLock.Unlock() _ = conn.WriteJSON(utils.WsEvent("loginResult", utils.Success(token))) return worker.Id, nil } func info(conn *websocket.Conn, worker *tables.WorkerTable) { manager := tables.ManagerTable{Id: worker.Manager} _ = manager.Get() _ = conn.WriteJSON(utils.WsEvent("workerInfo", utils.JsonType{ "first": worker.First, "last": worker.Last, "name": worker.Name, "phone": worker.Phone, "manager": manager.Name, "count": worker.Count, "todo": worker.Todo, "avg": worker.Avg, "max": worker.Max, })) } func query(conn *websocket.Conn, wid string, data any) { var param queryParam err := utils.AnyTrans(data, ¶m) if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("queryResult", utils.Fail("参数错误"))) return } total, orders, err := tables.ChangesQueryForWorker(wid, param.Cond, param.Status, param.Limit, param.Page) if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("queryResult", utils.Fail("查询信息失败"))) return } _ = conn.WriteJSON(utils.WsEvent( "queryResult", utils.Success(utils.JsonType{"total": total, "list": orders}), )) } func detail(conn *websocket.Conn, data any) { cid, ok := data.(float64) if !ok { _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Fail("参数错误"))) return } change, err := tables.ChangeDetail(uint32(cid)) if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Fail("查询信息失败"))) return } _ = conn.WriteJSON(utils.WsEvent("detailResult", utils.Success(change))) } func ready(conn *websocket.Conn, wid string, data any) { cid, ok := data.(float64) if !ok { _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("参数错误"))) return } change := tables.ChangeTable{Id: uint32(cid)} err := change.Get() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("订单不存在"))) return } if change.Status != 0 { _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("订单状态异常"))) return } if device, din := utils.SellerDevices[change.Device]; din && device.Online { err = utils.Redis.Set( utils.WxPayCli, utils.Format("Change_%s_%s", change.Device, wid), cid, utils.Duration(300), ).Err() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("授权码存储失败"))) return } _ = device.Conn.WriteJSON(utils.WsEvent("openGate", utils.JsonType{ "type": "Changing", "user_type": "worker", "user_id": wid, })) _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Success(nil))) return } _ = conn.WriteJSON(utils.WsEvent("readyResult", utils.Fail("设备离线"))) } func finish(conn *websocket.Conn, worker *tables.WorkerTable, data any) { cid, ok := data.(float64) if !ok { _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("参数错误"))) return } change := &tables.ChangeTable{Id: uint32(cid)} err := change.Get() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("订单不存在"))) return } if change.Status != 1 { _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("请先完成上酒动作"))) return } device := tables.DeviceTable{Id: change.Device} err = device.Get() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("设备查询失败"))) return } device.Wines[0].Id, device.Wines[0].Remain = change.New[0].Id, change.New[0].Remain device.Wines[1].Id, device.Wines[1].Remain = change.New[1].Id, change.New[1].Remain device.Wines[2].Id, device.Wines[2].Remain = change.New[2].Id, change.New[2].Remain device.Wines[3].Id, device.Wines[3].Remain = change.New[3].Id, change.New[3].Remain err = device.UpdateSelf() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("更新设备失败"))) return } change.Status, change.Finish = 2, utils.TimeNow() err = change.UpdateSelf() if err != nil { utils.Logger.Println(err) _ = conn.WriteJSON(utils.WsEvent("finishResult", utils.Fail("更新订单失败"))) return } this := uint32(change.Finish.Unix() - change.Finish.Unix()) sum := worker.Avg*worker.Count + this worker.Count++ worker.Todo-- if this > worker.Max { worker.Max = this } worker.Avg = sum / worker.Count _ = worker.UpdateSelf() operate := tables.OperationTable{ UserType: 1, UserId: worker.Id, OpType: 1, Level: 0, Describe: "完成上酒订单", } _ = operate.Insert() }