def _reconnect(socket, phone, uuid, signature, city_code, longitude, latitude): response = washer_pb2.Login_Response() result = verify_signature(phone, uuid, signature) if not result: response.error_code = common_pb2.ERROR_BADREQUEST helper.client_send(socket, common_pb2.LOGIN, response) return filter = {"phone": phone} washer = Washer.find_one(filter) if washer is None: #找不到商家 print('washer not found.') response.error_code = common_pb2.ERROR_WASHER_NOT_FOUND helper.client_send(socket, common_pb2.LOGIN, response) return _washer['socket'] = socket _washer['phone'] = washer['phone'] Washer.add_online_washer(socket, _washer) response.id = str(washer['_id']) response.nick = washer['nick'] response.phone = washer['phone'] response.avatar = washer['avatar'] response.level = washer['level'] response.status = washer['status'] response.secret = result['secret'] helper.client_send(socket, common_pb2.LOGIN, response)
def _login(socket, phone, password, uuid): response = washer_pb2.Login_Response() md5 = hashlib.md5() md5.update(password.encode()) password = md5.hexdigest() filter = {"phone": phone} washer = Washer.find_one(filter) if washer is None: response.error_code = common_pb2.ERROR_WASHER_NOT_FOUND helper.client_send(socket, common_pb2.LOGIN, response) print('washer:{} not found.'.format(phone)) return elif washer['password'] != password: response.error_code = common_pb2.ERROR_PASSWORD_INVALID helper.client_send(socket, common_pb2.LOGIN, response) print('password invalid.') return print('{}, login success'.format(phone)) filter = {"washer_phone": phone, "statu": common_pb2.DISTRIBUTED} orders = Order.find(filter).count() _washer = { "id": str(washer['_id']), "phone": phone, "nick": washer['nick'], "level": washer['level'], "avatar": washer['avatar'], "type": washer['type'], "orders": orders, "open": washer['open'], "socket": socket } print("success-> v1.washer._login, phone:{} login success".format(phone)) Washer.add_online_washer(socket, _washer) response.washer.id = str(washer['_id']) response.washer.phone = washer['phone'] response.washer.nick = washer['nick'] response.washer.avatar = washer['avatar'] response.washer.level = washer['level'] response.washer.reg_time = washer['reg_time'] response.washer.status = washer['status'] response.washer.open = washer['open'] response.washer.type = washer['type'] response.washer.secret = _make_secret(phone, uuid) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.LOGIN, response) filter = {"phone": phone} update = {"$set": {"last_login": int(time.time())}} Washer.update_one(filter, update)
def history_order(socket, platform, data): response = order_pb2.History_Order_Response() washer = Washer.get_online_washer(socket) if washer is None: response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.HISTORY_ORDER, response) return request = order_pb2.History_Order_Request() request.ParseFromString(data) filter = {"washer_phone": washer['phone']} if request.offset: filter.udpate({"order_time": {"$lt": request.offset}}) sort = [("order_time", -1)] limit = request.limit or 10 cursor = Order.find(filter, sort=sort, limit=limit) for item in cursor: order = response.order.add() order.id = str(item['_id']) order.status = item['status'] order.quantity = item['quantity'] order.order_time = item['order_time'] order.price = item['price'] order.total_fee = item['total_fee'] order.discount = item['discount'] order.finish_time = item['finish_time'] order.pay_time = item['pay_time'] order.allocate_time = item['allocate_time'] response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.HISTORY_ORDER, response)
def order_detail(socket, platform, data): request = order_pb2.Order_Detail_Request() request.ParseFromString(data) order_id = request.order_id.strip() response = order_pb2.Order_Detail_Response() washer = Washer.get_online_washer(socket) if washer is None: print("error-> v1.order.order_detail: not logined washer") response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.ORDER_DETAIL, response) return filter = {"_id": ObjectId(order_id), "washer_phone": washer['phone']} result = Order.find_one(filter) if not result: print("error-> v1.order.order_detail: order_id:{} not found".format( order_id)) response.error_code = common_pb2.ERROR_ORDER_NOT_FOUND helper.client_send(socket, common_pb2.ORDER_DETAIL, response) return print("success-> v1.order.order_detail, order_id:{} detail:{}".format( order_id, result)) response.order.id = order_id response.order.quantity = result['quantity'] response.order.price = result['price'] response.order.total_fee = result['total_fee'] response.order.discount = result['discount'] response.order.status = result['status'] response.order.finish_time = result['finish_time'] response.order.pay_time = result['pay_time'] response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.ORDER_DETAIL, response)
def fresh_location(socket, platform, data): response = washer_pb2.Fresh_Location_Response() washer = Washer.get_online_washer(socket) if washer is None: #未登录 print( "error-> v1.washer.fresh_location, can not fresh location before login." ) response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.FRESH_LOCATION, response) return request = washer_pb2.Fresh_Location_Request() request.ParseFromString(data) if not washer['open']: #没开工的不允许更新工作组中的地理位置 print( "error-> v1.washer.fresh_location, can not fresh location before start work." ) response.error_code = common_pb2.ERROR_NOT_START_WORK helper.client_send(socket, common_pb2.FRESH_LOCATION, response) return else: print("debug-> v1.washer.fresh_location, set washer online") washer['city_code'] = request.city_code Washer.add_online_washer(socket, washer) if washer['orders'] >= common.MAX_ORDERS: #超过所允许接单数 print("error-> v1.washer.fresh_location, reach the max orders") response.error_code = common_pb2.ERROR_OUT_MAX_ORDERS helper.client_send(socket, common_pb2.FRESH_LOCATION, response) return city_code = request.city_code longitude = request.longitude latitude = request.latitude result = Washer.in_workgroup(city_code, longitude, latitude, washer['phone'], washer['type']) if not result: print( "error-> v1.washer.fresh_location, put washer into workgorup failure" ) response.error_code = common_pb2.ERROR_FRESH_LOCATION_FAILURE helper.client_send(socket, common_pb2.FRESH_LOCATION, response) return print("success-> v1.washer.fresh_location, fresh location success") response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.FRESH_LOCATION, response)
def _make_secret(phone, uuid): now = time.time() elements = [str(now)] elements.append(common.APP_KEY) elements.append(uuid) elements.append(helper.make_rand(6)) elements.append(phone) secret = ''.join(elements) md5 = hashlib.md5() md5.update(secret.encode()) secret = md5.hexdigest() filter = {"phone": phone} update = {"$set": {"secret": secret}} Washer.update_one(filter, update) return secret
def start_work(socket, platform, data): response = washer_pb2.Start_Work_Response() washer = Washer.get_online_washer(socket) if washer is None: #未登录 print("login first please") response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.START_WORK, response) return """ if washer['open'] == 1: #已经处于开工状态 response.error_code = common_pb2.ERROR_ALREAD_START helper.client_send(socket, common_pb2.START_WORK, response) return """ filter = {"phone": washer['phone']} update = {"$set": {"open": 1}} result = Washer.update_one(filter, update) """ if not result.modified_count: #mongo version 2.6开始才有此值 response.error_code = common_pb2.ERROR_START_WORK_FAILURE helper.client_send(socket, common_pb2.START_WORK, response) return """ request = washer_pb2.Start_Work_Request() request.ParseFromString(data) city_code = request.city_code longitude = request.longitude latitude = request.latitude result = Washer.in_workgroup(city_code, longitude, latitude, washer['phone'], washer['type']) if not result: #写入redis失败 print( "error-> v1.washer.start_work, phone:{} add to workgroup failure". format(washer['phone'])) response.error_code = common_pb2.ERROR_START_WORK_FAILURE helper.client_send(socket, common_pb2.START_WORK, response) return washer['open'] = 1 washer['city_code'] = city_code Washer.add_online_washer(socket, washer) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.START_WORK, response) print("{}, start work success".format(washer['phone']))
def cancel_order(socket, platform, data): response = order_pb2.Cancel_Order_Response() washer = Washer.get_online_washer(socket) if washer is None: print("debug-> v1.order.cancel_order, not logined user") response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.CANCEL_ORDER, response) return request = order_pb2.Cancel_Order_Request() request.ParseFromString(data) order_id = request.order_id.strip() now = int(time.time()) filter = {"_id": ObjectId(order_id), "washer_phone": washer['phone']} order = Order.find_one(filter) if order is None: print("debug-> v1.order.cancel_order, order_id:{} not found".format( washer['nick'], washer['phone'], order_id)) response.error_code = common_pb2.ERROR_ORDER_NOT_FOUND helper.client_send(socket, common_pb2.CANCEL_ORDER, response) return if order['status'] != common_pb2.DISTRIBUTED: print( "debug-> v1.order.cancel_order, order_id:{}, order_status:{} not != DISTRIBUTED" .format(order_id, order['status'])) response.error_code = common_pb2.ERROR_ORDER_STATUS_WRONG helper.client_send(socket, common_pb2.CANCEL_ORDER, response) return filter.update({"status": common_pb2.DISTRIBUTED}) update = { "$set": { "status": common_pb2.CANCELED, "cancel_time": now, "cancel_by": washer['type'] } } result = Order.update_one(filter, update) if not result.modified_count: print( "debug-> v1.order.cancel_order, order_id:{} update failure".format( order_id)) response.error_code = common_pb2.ERROR_CANCEL_ORDER_FAILURE helper.client_send(socket, common_pb2.CANCEL_ORDER, response) return print("debug-> v1.order.cancel_order, order_id:{} cancel success".format( order_id)) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.CANCEL_ORDER, response) system_request = system_order_pb2.Cancel_Order_Request() system_request.order_id = order_id helper.system_send(system_common_pb2.CANCEL_ORDER, system_request)
def order_check(socket, platform, data): washer = Washer.get_online_washer(socket) if washer is None: return filter = { "washer_phone": washer['phone'], "status": common_pb2.DISTRIBUTED } sort = [("allocate_time", 1)] cursor = Order.find(filter).sort(sort)
def stop_work(socket, platform, data): response = washer_pb2.Stop_Work_Response() washer = Washer.get_online_washer(socket) if washer is None: #未登录 response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.STOP_WORK, response) return if 'open' in washer and washer['open'] == 0: print( "debug-> v1.washer.stop_work, nick:{} phone:{} work already stoped." .format(washer['nick'], washer['phone'])) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.STOP_WORK, response) return filter = {"phone": washer['phone']} update = {"$set": {"open": 0}} result = Washer.update_one(filter, update) if not result.modified_count: print( "debug-> v1.washer.stop_work, nick:{} phone:{}, update database failure, stop work failure" .format(washer['nick'], washer['phone'])) response.error_code = common_pb2.ERROR_STOP_WORK_FAILURE helper.client_send(socket, common_pb2.STOP_WORK, response) return result = Washer.out_workgroup(washer['city_code'], washer['phone'], washer['type']) if not result: print( "debug-> v1.washer.stop_work, nick:{} phone:{}, out workgroup failure" .format(washer['nick'], washer['phone'])) response.error_code = common_pb2.ERROR_STOP_WORK_FAILURE helper.client_send(socket, common_pb2.STOP_WORK, response) return print("debug-> v1.washer.stop_work, nick:{} phone:{} stop work success.". format(washer['nick'], washer['phone'])) washer['open'] = 0 Washer.add_online_washer(socket, washer) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.STOP_WORK, response)
def logout(socket, platform, data): response = washer_pb2.Logout_Response() washer = Washer.get_online_washer(socket) if washer['open']: filter = {"phone": washer['phone']} update = {"$set": {"open": 0}} Washer.update_one(filter, update) Washer.out_workgroup(washer['city_code'], washer['phone'], washer['type']) Washer.remove_online_washer(socket) print("success-> v1.washer.logout, phone:{}".format(washer['phone'])) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.LOGOUT, response) helper.socket_close(socket)
def order_feedback(socket, platform, data): response = order_pb2.Order_Feedback_Response() washer = Washer.get_online_washer(socket) if washer is None: print("debug-> v1.order.order_feedback, not logined user") response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response) return request = order_pb2.Order_Feedback_Request() request.ParseFromString(data) order_id = request.order_id.strip() score = request.score filter = {"_id": ObjectId(order_id), "washer_phone": washer['phone']} order = Order.find_one(filter) if order is None: response.error_code = common_pb2.ERROR_ORDER_NOT_FOUND helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response) return if order['status'] != common_pb2.FINISH: response.error_code = common_pb2.ERROR_ORDER_STATUS_WRONG helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response) return if order['washer_score'] != 0: response.error_code = common_pb2.ERROR_ALREADY_FEEDBACK helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response) return filter.update({"status": common_pb2.FINISH, "washer_score": 0}) update = {"$set": {"washer_score": score}} result = Order.update_one(filter, update) if not result.modified_count: print("debug-> v1.order.order_feedback, order_id:{} update failure.". format(order_id)) response.error_code = common_pb2.ERROR_ORDER_FEEDBACK_FAILURE helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response) return print("debug-> v1.order.order_feedback, order_id:{}, feedback success.". format(order_id)) response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.ORDER_FEEDBACK, response)
def processing_order(socket, platform, data): request = order_pb2.Processing_Order_Request() request.ParseFromString(data) order_id = request.order_id.strip() response = order_pb2.Processing_Order_Response() washer = Washer.get_online_washer(socket) if washer is None: print('error-> v1.order.processing_order: not logined washer') response.error_code = common_pb2.ERROR_NOT_LOGIN helper.client_send(socket, common_pb2.PROCESSING_ORDER, response) return filter = { "_id": ObjectId(order_id), "status": common_pb2.DISTRIBUTED, "washer_phone": washer['phone'] } order = Order.find_one(filter) now = int(time.time()) update = { "$set": { "status": common_pb2.PROCESSING, "processing_time": now } } result = Order.update_one(filter, update) if not result.modified_count: print( "error-> v1.order.finish_order: modified_count not greate than zero" ) response.error_code = common_pb2.ERROR_PROCESSING_FAILURE helper.client_send(socket, common_pb2.PROCESSING_ORDER, response) return response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.PROCESSING_ORDER, response) print("success-> v1.order.processing_order success")
def register(socket, platform, data): request = washer_pb2.Register_Request() request.ParseFromString(data) nick = request.nick.strip() phone = request.phone.strip() authcode = request.authcode password = request.password.strip() password2 = request.password2.strip() avatar = request.avatar.strip() signature = request.signature.strip() response = washer_pb2.Register_Response() if password != password2: response.error_code = common_pb2.ERROR_PASSWORD_NOT_EQUAL helper.client_send(socket, common_pb2.REGISTER, response) print('password not equal') return elif not helper.verify_phone(phone): response.error_code = common_pb2.ERROR_PHONE_INVALID helper.client_send(socket, common_pb2.REGISTER, response) print('phone invalid') return now = int(time.time()) filter = {"phone": phone} washer = Washer.find_one(filter) washer_mix = Washer_Mix.find_one(filter) if washer is not None: print('washer:{} exist.'.format(phone)) response.error_code = common_pb2.ERROR_WASHER_EXIST helper.client_send(socket, common_pb2.REGISTER, response) return elif washer_mix is None or washer_mix['authcode'] != authcode: print('authcode:{} invalid'.format(authcode)) response.error_code = common_pb2.ERROR_AUTHCODE_INVALID helper.client_send(socket, common_pb2.REGISTER, response) return elif washer_mix['expired'] < now: print('autchode expired.') response.error_code = common_pb2.ERROR_AUTHCODE_EXPIRED helper.client_send(socket, common_pb2.REGISTER, response) return md5 = hashlib.md5() md5.update(password.encode()) password = md5.hexdigest() doc = { "phone": phone, "nick": nick, "password": password, "avatar": avatar, "status": 0, "reg_time": now, "last_login": 0, "level": common.WASHER_INIT_LEVEL, "address": "", "longitude": 0.0, "latitude": 0.0, "type": common_pb2.PERSONAL, #用户类型 "open": 0 #是否营业 } try: result = Washer.insert_one(doc) response.washer.id = str(result.inserted_id) response.washer.phone = phone response.washer.nick = nick response.washer.level = common.WASHER_INIT_LEVEL response.washer.status = 0 response.washer.avatar = avatar response.washer.type = common_pb2.PERSONAL response.error_code = common_pb2.SUCCESS helper.client_send(socket, common_pb2.REGISTER, response) print('register success') except DuplicateKeyError: response.error_code = common_pb2.ERROR_WASHER_EXIST helper.client_send(socket, common_pb2.REGISTER, response) print('duplicate key error, washer exist')
def allocate_order(socket, platform, data): request = system_order_pb2.Allocate_Order_Request() request.ParseFromString(data) order_id = request.order_id washer_type = request.washer_type quantity = request.quantity customer_id = request.customer.id customer_phone = request.customer.phone customer_nick = request.customer.nick customer_level = request.customer.level customer_avatar = request.customer.avatar customer_city_code = request.customer.city_code customer_longitude = request.customer.longitude customer_latitude = request.customer.latitude print("customer_city_code:{}, customer_longitude:{}, customer_latitude:{}, washer_type:{}, quantity:{}".format(customer_city_code, customer_longitude, customer_latitude, washer_type, quantity)) washer = Washer.allocate_washer(customer_city_code, customer_longitude, customer_latitude, washer_type) response = system_order_pb2.Allocate_Order_Response() if washer is None: response.error_code = system_common_pb2.ERROR_WASHER_NOT_FOUND helper.system_response(socket, system_common_pb2.ALLOCATE_ORDER, response) return filter = {"_id": ObjectId(order_id) } update = { "$set":{ "washer_id": washer['id'], "washer_phone": washer['phone'], "washer_nick": washer['nick'], "washer_avatar": washer['avatar'], "status": system_common_pb2.DISTRIBUTED, "allocate_time": int(time.time()) } } result = Order.update_one(filter, update) if not result.modified_count: response.error_code = system_common_pb2.ERROR_ALLOCATE_WASHER_FAILURE helper.system_response(socket, system_common_pb2.ALLOCATE_ORDER, response) return response.id = washer['id'] response.phone = washer['phone'] response.nick = washer['nick'] response.avatar = washer['avatar'] response.level = washer['level'] response.longitude = washer['longitude'] response.latitude = washer['latitude'] response.error_code = system_common_pb2.SUCCESS helper.system_response(socket, system_common_pb2.ALLOCATE_ORDER, response) #通知商家有人下单 response = system_order_pb2.Allocate_Order_Push() response.customer.id = customer_id response.customer.phone = customer_phone response.customer.nick = customer_nick response.customer.avatar = customer_avatar response.customer.level = customer_level response.customer.longitude = customer_longitude response.customer.latitude = customer_latitude response.order_id = order_id response.quantity = quantity print("response.quantity:{}".format(quantity)) response.error_code = system_common_pb2.SUCCESS helper.client_send(washer['socket'], system_common_pb2.WASHER_ALLOCATE_ORDER, response)