Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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
Example #7
0
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']))
Example #8
0
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)
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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")
Example #14
0
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')
Example #15
0
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)