def consumer_retrieve_voucher(numbers, merchant_identity): """ 用户读取指定商家优惠券,没给出merchant_identity则读取全部 :param numbers: 平台账号或管理员账号 :param merchant_identity: 商家ID :return: """ try: if not merchant_identity: return consumer_retrieve_all_voucher(numbers) # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 80111, "invalid account" collection = get_mongo_collection("voucher") if not collection: g_log.error("get collection voucher failed") return 80113, "get collection voucher failed" # g_log.debug("%s", datetime.now()) voucher = collection.find({"numbers": numbers, "merchant_identity": merchant_identity, "expire_time": {"$gte": datetime.now()}, "used": 0}) if not voucher: g_log.error("consumer %s retrieve %s voucher failed", numbers, merchant_identity) return 80114, "consumer retrieve voucher failed" g_log.debug("retrieve voucher success") return 80100, voucher except Exception as e: g_log.error("%s", e) return 80115, "exception"
def consumer_retrieve_all_voucher(numbers): """ 用户读取优惠券 :param numbers: :return: """ try: # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 80116, "invalid account" collection = get_mongo_collection("voucher") if not collection: g_log.error("get collection voucher failed") return 80117, "get collection voucher failed" records = collection.find({"numbers": numbers, "expire_time": {"$gte": datetime.now()}, "used": 0}).sort("merchant_identity") if not records: g_log.error("retrieve voucher failed") return 80118, "retrieve voucher failed" return 80100, records except Exception as e: g_log.error("%s", e) return 80119, "exception"
def consumer_retrieve_with_numbers(numbers): """ 读取用户资料 :param numbers: 用户电话号码 :return: (20200, consumer)/成功,(>20200, "errmsg")/失败 """ try: # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 20211, "invalid account" collection = get_mongo_collection("consumer") if not collection: g_log.error("get collection consumer failed") return 20212, "get collection consumer failed" consumer = collection.find_one({"numbers": numbers, "deleted": 0}) if not consumer: g_log.debug("consumer %s not exist", numbers) return 20213, "consumer not exist" return 20200, consumer except Exception as e: g_log.error("%s", e) return 20214, "exception"
def merchant_allow_exchange_in(**kwargs): """ 商家是否允许积分转入 :param numbers: 平台账号或管理员账号 :param merchant_identity: 商家ID :return: """ try: # 检查要创建者numbers numbers = kwargs.get("numbers", "") merchant_identity = kwargs.get("merchant_identity") # 检查管理员和商家关系 if not account_is_valid_consumer(numbers): g_log.error("invalid account, %s", numbers) return 60211, "invalid account" if merchant_is_verified(merchant_identity) != "y": g_log.debug("merchant %s not verified", merchant_identity) return 60213, "not verified" code, message = credit_exceed_upper(**{"merchant_identity": merchant_identity, "allow_last": "yes"}) return 60200, "yes" if bool(message) else "no" except Exception as e: g_log.error("%s", e) return 60212, "exception"
def confirm_voucher(**kwargs): """ 商家确认优惠券 :param kwargs: {"numbers": 186889882240, "merchant_identity": "", "manager": "18688982240", "voucher_identity": "a1der234", "activity_identity": "iof", "exec_confirm": 1} :return: """ try: # 检查合法账号 numbers = kwargs.get("numbers", "") if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 80111, "invalid account" manager = kwargs.get("manager", "") merchant_identity = kwargs.get("merchant_identity", "") merchant = user_is_merchant_manager(manager, merchant_identity) if not merchant: g_log.error("%s is not merchant %s manager", manager, merchant_identity) return 80312, "not manager" voucher_identity = kwargs.get("voucher_identity", "") activity_identity = kwargs.get("activity_identity", "") exec_confirm = kwargs.get("exec_confirm", "") collection = get_mongo_collection("voucher") if not collection: g_log.error("get collection voucher failed") return 80314, "get collection voucher failed" if not exec_confirm: voucher = collection.find_one({"_id": ObjectId(voucher_identity), "merchant_identity": merchant_identity, "activity_identity": activity_identity, "numbers": numbers}) if not voucher: g_log.error("voucher %s not exist", voucher_identity) return 80300, "invalid" return 80300, "used" if voucher["used"] == 1 else "valid" voucher = collection.find_one_and_update({"merchant_identity": merchant_identity, "numbers": numbers, "_id": ObjectId(voucher_identity), "used": 0}, {"$set": {"used": 1}}) if not voucher: g_log.error("voucher %s not exist", voucher_identity) return 80315, "confirm voucher failed" # 更新记录入库 collection = get_mongo_collection("voucher_record") if not collection: g_log.error("get collection voucher record failed") return 80316, "get collection voucher record failed" result = collection.insert_one({"voucher_identity": voucher_identity, "time": datetime.now(), "operator": manager}) if not result: g_log.error("insert voucher record failed") return 80300, "yes" except Exception as e: g_log.error("%s", e) return 80317, "exception"
def upload_token_retrieve_debug(kind, numbers, merchant_identity=""): """ debug环境生成上传凭证 指定客户头像路径c/avatar/numbers, 商家logo路径m/logo/numbers, 商家活动路径ma/poster/numbers :param kind: 资源类型 :param numbers: 账号 :return: (upload_token, key) """ q = Auth(g_access_key, g_secret_key) kind_to_key = {"c_avatar": "c/avatar", "m_logo": "m/logo", "m_qrcode": "m/qrcode", "a_poster": "a/poster"} key = "%s/%s/%s" % (kind_to_key.get(kind, "dummy"), numbers, datetime.now().strftime('%b%d%y%H%M%S')) policy = {"scope": g_bucket_name_debug + ":" + key, "mimeLimit": "image/*"} upload_token = q.upload_token(g_bucket_name_debug, key=key, expires=3600, policy=policy) g_log.debug("debug upload token, [key:%s, policy:%s, token:%s]", key, policy, upload_token) # 修改资料图片路径 if kind == "c_avatar": # 平台修改客户头像资料 if not account_is_valid_consumer(numbers): g_log.warning("%s invalid consumer account", numbers) return 70111, "invalid consumer account" # code, message = consumer_update_with_numbers(numbers, avatar=key) # if code != 20400: # g_log.warning("update consumer %s avatar %s failed", numbers, key) # return 70112, "update consumer avatar failed" elif kind == "m_logo": # 平台修改商家logo资料 if not account_is_valid_merchant(numbers): return 70113, "invalid merchant account" if not merchant_identity: return 70114, "missing merchant identity" # code, message = merchant_update_with_numbers(numbers, merchant_identity, logo=key) # if code != 30400: # g_log.warning("update merchant logo %s failed", key) # return 70115, "update merchant logo failed" elif kind == "m_qrcode": if not account_is_valid_merchant(numbers): return 70113, "invalid merchant account" if not merchant_identity: return 70114, "missing merchant identity" elif kind == "a_poster": # 平台修改活动图片资料 if not account_is_valid_merchant(numbers): return 70116, "invalid merchant account" if not merchant_identity: return 70117, "missing merchant identity" else: g_log.debug("unsupported resource kind %s", kind) return 70118, "unsupported resource kind" return 70100, (upload_token, key)
def upload_token_retrieve_online(kind, numbers, merchant_identity=""): """ 线上环境生成上传凭证 平台回调完成,生成资源下载key,并存入平台数据库 回调返回数据结构 { "key": "key", "payload": { {"success":true,"name":"key"} } } :param kind: 上传的资源类型 :param numbers: 账号 :return: """ # 7牛环境初始化 q = Auth(g_access_key, g_secret_key) # 回调url kind_to_path = {"c_avatar": "consumer", "m_logo": "merchant", "a_poster": "activity"} callback_url = "%s/%s" % (g_qiniu_callback_url, kind_to_path.get(kind, "dummy")) # 回调post参数 kind_to_type = {"c_avatar": "update_avatar", "m_logo": "update_logo", "a_poster": "update_poster"} callback_body_type = kind_to_type.get(kind, "dummy") callback_body = {"type": callback_body_type, "numbers": numbers, "merchant": merchant_identity, "hash": "$(etags)"} policy = {"callbackUrl": callback_url, "callbackBody": callback_body, "callbackBodyType": "application/json", "callbackFetchKey": 1, "mimeLimit": "image/*"} upload_token = q.upload_token(g_bucket_name, expires=3600, policy=policy) g_log.debug("debug upload token, [policy:%s, token:%s]", policy, upload_token) # 修改资料图片路径 if kind == "c_avatar": # 平台修改客户头像资料 if not account_is_valid_consumer(numbers): g_log.warning("%s invalid consumer account", numbers) return 70117, "invalid consumer account" elif kind == "m_logo": # 平台修改商家logo资料 if not account_is_valid_merchant(numbers): return 70118, "invalid consumer account" elif kind == "a_poster": # 平台修改活动图片资料 if not account_is_valid_merchant(numbers): return 70119, "invalid consumer account" else: g_log.debug("unsupported resource kind %s", kind) return 70120, "unsupported resource kind" return 70100, upload_token
def consumer_retrieve_activity_with_numbers(numbers, mark): """ 读取活动资料 :param numbers: 用户电话号码 :return: (70200, activity)/成功,(>70200, "errmsg")/失败 """ try: # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 70611, "invalid account" collection = get_mongo_collection("activity") if not collection: g_log.error("get collection activity failed") return 70613, "get collection activity failed" try: last_time = datetime.strptime(mark, '%Y-%m-%d %H:%M:%S') g_log.warning("mark %s, last time %s", mark, last_time) except: last_time = datetime.now() g_log.warning("2 mark %s, last time %s", mark, last_time) activity = collection.find({"deleted": 0, "create_time": {"$lt": last_time}, "expire_time": {"$gte": datetime.now()}}, limit=10).sort("create_time", -1) if not activity: g_log.debug("activity %s not exist", numbers) return 70614, "activity not exist" collection2 = get_mongo_collection("merchant") if not collection2: g_log.error("get collection merchant failed") return 70615, "get collection merchant failed" activity_dict = [] # type(activity_one) = "dict" for activity_one in activity: merchant = collection2.find_one({"_id": ObjectId(activity_one["merchant_identity"])}) activity_one["merchant"] = merchant activity_dict.append(activity_one) # activity.rewind() return 70600, activity_dict except Exception as e: g_log.error("%s", e) return 70617, "exception"
def consumer_delete_with_numbers(numbers): """ 删除用户资料 :param numbers: 用户电话号码 :return: (20500, "yes")/成功,(>20500, "errmsg")/失败 """ try: # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 20511, "invalid phone number" collection = get_mongo_collection("consumer") if not collection: g_log.error("get collection consumer failed") return 20512, "get collection consumer failed" consumer = collection.find_one_and_update({"numbers": numbers, "deleted": 0}, {"$set": {"deleted": 1}}) if not consumer: g_log.error("consumer %s not exist", numbers) return 20513, "consumer not exist" return 20500, "yes" except Exception as e: g_log.error("%s", e) return 20514, "exception"
def buy_activity(**kwargs): """ 购买活动 :param kwargs: {"numbers": "18688982240", "activity_identity": "xij923f0a8m", "merchant_identity": "xij923f0a8m", "spend_credit": [{"identity": "a97jiw", "quantity": 100}, ...]} :return: (70800, "yes")/成功,(>70800, "errmsg")/失败 """ try: # 检查要创建的用户numbers numbers = kwargs.get("numbers", "") if not account_is_valid_consumer(numbers): g_log.warning("not manager %s", numbers) return 70811, "not manager" merchant_identity = kwargs.get("merchant_identity", "") activity_identity = kwargs.get("activity_identity", "") spend_credit = kwargs.get("spend_credit", []) total_quantity = 0 for credit in spend_credit: total_quantity += credit["quantity"] # 检查活动是否存在 collection = get_mongo_collection("activity") if not collection: g_log.error("get collection activity failed") return 70812, "get collection activity failed" activity = collection.find_one_and_update({"merchant_identity": merchant_identity, "_id": ObjectId(activity_identity), "credit": total_quantity, "deleted": 0}, {"$inc": {"volume": 1}}) if not activity: g_log.error("activity %s not exist", activity_identity) return 70813, "activity not exist" # 扣除用户积分 flow_credit = 0 for credit in spend_credit: value = {"numbers": numbers, "merchant_identity": merchant_identity, "credit_identity": credit["identity"], "credit": credit["quantity"]} g_log.debug("buy activity using credit: %s", value) consume_credit(**value) flow_credit += credit["quantity"] g_log.debug("consume total credit: %d", flow_credit) # 更新商家flow参数,用户消费减少已发行量 code, message = merchant_credit_update(**{"numbers": numbers, "merchant_identity": merchant_identity, "mode": "issued", "supplement": -flow_credit}) if code != 60400: g_log.error("update issued credit failed") return 70817, "update issued credit failed" # 存入优惠券数据库 collection = get_mongo_collection("voucher") if not collection: g_log.error("get collection voucher failed") return 70814, "get collection voucher failed" # TODO... 优惠券唯一识别码,二维码 value = {"numbers": numbers, "merchant_identity": merchant_identity, "activity_identity": activity_identity, "create_time": datetime.now(), "expire_time": activity["expire_time"], "activity_title": activity["title"], "used": 0} g_log.debug("create voucher: %s", value) voucher = collection.insert_one(value).inserted_id if not voucher: g_log.error("create voucher failed") return 70815, "create voucher failed" return 70800, str(voucher) except Exception as e: g_log.error("%s", e) return 70816, "exception"
def consumer_update_with_numbers(numbers, **kwargs): """ 更新用户资料 :param numbers: 用户电话号码 :param kwargs: {"numbers": "18688982240", "nickname": "trace deng", "introduce": "ego cogito ergo sum", "avatar": "", "qrcode": "", "email": "*****@*****.**", "country": "RPC", "location": "magic city", "sexy": "male", "age": 18} :return: (20400, "yes")/成功,(>20400, "errmsg")/失败 """ try: # 检查合法账号 if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 20411, "invalid phone number" value = {} # 昵称不能超过16字节,超过要截取前16字节 nickname = kwargs.get("nickname") if nickname: if len(nickname) > 32: g_log.warning("too long nickname %s", nickname) nickname = nickname[0:16] value["nickname"] = nickname # 不合理的性别当作未知处理 sexy = kwargs.get("sexy") if sexy: value["sexy"] = sexy_string_2_number(sexy) age = kwargs.get("age") if age: if age > 500: g_log.warning("too old age %s", age) age = 500 value["age"] = age # 个人介绍不能超过512字节,超过要截取前512字节 introduce = kwargs.get("introduce") if introduce: if len(introduce) > 512: g_log.warning("too long introduce %s", introduce) introduce = introduce[0:512] value["introduce"] = introduce # TODO... 头像、logo、国家、地区检查 avatar = kwargs.get("avatar") if avatar: value["avatar"] = avatar email = kwargs.get("email") if email and email_is_valid(email): value["email"] = email country = kwargs.get("country") if country: value["country"] = country location = kwargs.get("location") if location: value["location"] = location qrcode = kwargs.get("qrcode") if qrcode: value["qrcode"] = qrcode g_log.debug("update consumer material: %s", value) # 存入数据库 collection = get_mongo_collection("consumer") if not collection: g_log.error("get collection consumer failed") return 20412, "get collection consumer failed" consumer = collection.find_one_and_update({"numbers": numbers, "deleted": 0}, {"$set": value}) if not consumer: g_log.error("consumer %s exist", numbers) return 20413, "consumer not exist" return 20400, "yes" except Exception as e: g_log.error("%s", e) return 20415, "exception"
def consumer_create(**kwargs): """ 增加用户资料 :param kwargs: {"numbers": "18688982240", "nickname": "trace deng", "introduce": "ego cogito ergo sum", "avatar": "", "qrcode": "", "email": "*****@*****.**", "country": "RPC", "location": "magic city", "sexy": "female", "age": 18} :return: (20100, "yes")/成功,(>20100, "errmsg")/失败 """ try: # 检查要创建的用户numbers numbers = kwargs.get("numbers", "") if not account_is_valid_consumer(numbers): g_log.warning("invalid customer account %s", numbers) return 20111, "invalid phone number" # 昵称不能超过16字节,超过要截取前16字节 nickname = kwargs.get("nickname", numbers) if len(nickname) > 32: g_log.warning("too long nickname %s", nickname) nickname = nickname[0:16] # 不合理的性别当作未知处理 sexy = sexy_string_2_number(kwargs.get("sexy", "unknow")) age = kwargs.get("age", 0) if age > 500: g_log.warning("too old age %s", age) age = 500 # 个人介绍不能超过512字节,超过要截取前512字节 introduce = kwargs.get("introduce", "") if len(introduce) > 512: g_log.warning("too long introduce %s", introduce) introduce = introduce[0:512] avatar = kwargs.get("avatar", "") email = kwargs.get("email", "") if 0 == email_is_valid(email): email = "" # TODO... logo、国家、地区检查 country = kwargs.get("country", "") location = kwargs.get("location", "") qrcode = kwargs.get("qrcode", "") value = {"numbers": numbers, "nickname": nickname, "avatar": avatar, "email": email, "introduce": introduce, "sexy": sexy, "age": age, "country": country, "location": location, "qrcode": qrcode, "deleted": 0, "create_time": datetime.now()} # 存入数据库 collection = get_mongo_collection("consumer") if not collection: g_log.error("get collection consumer failed") return 20112, "get collection consumer failed" consumer = collection.find_one_and_replace({"numbers": numbers}, value, upsert=True, return_document=ReturnDocument.AFTER) if not consumer: g_log.error("create consumer %s failed", numbers) return 20113, "create consumer failed" return 20100, "yes" except Exception as e: g_log.error("%s", e) return 20114, "exception"