Example #1
0
 def update_file(files, file_path, invoice_data):
     isExists = os.path.exists(file_path)
     if not isExists:
         os.makedirs(file_path)
     for file in files:
         # 原始文件名
         source_fname = files.get(file)[0].get("filename")
         # 生成新的文件名, 返回完整路径
         full_file = FileUploadOperate.gen_file_name(
             file_path, source_fname)
         with open(full_file, "wb") as f:
             f.write(files.get(file)[0].get("body"))
         em = "save {0} to path: {1}".format(file, full_file)
         LOG.info(em)
         # 更新数据库数据库
         upload_db_obj = UploadLog.query.filter(
             and_(UploadLog.invoice_uuid == invoice_data.invoice_uuid,
                  UploadLog.file_type == file)).first()
         if not upload_db_obj:
             em = "can not found file type: <{0}> with invoice id: <{1}>".format(
                 file, invoice_data.invoice_uuid)
             LOG.exception(em)
             continue
         upload_db_obj.file = full_file
         upload_db_obj.create_time = int(time.time)
         upload_db_obj.status = "unapproval"
         db_session.flush()
     db_session.commit()
     return 200
Example #2
0
 def generate_discount(money, counts=1, code_len=8, valid_date=None):
     ''' 随机生成8位的优惠码 记录到数据库'''
     db_objs = []
     for count in range(counts):
         code_list = []
         # 0-9
         for i in range(10):
             code_list.append(str(i))
         # A-Z
         for i in range(65, 91):
             code_list.append(chr(i))
         # a-z
         for i in range(97, 123):
             code_list.append(chr(i))
         myslice = random.sample(code_list, code_len)
         verification_code = ''.join(myslice)
         db_obj = Discount(uid=str(uuid.uuid1()),
                           discount_id=verification_code,
                           money=money,
                           gen_time=int(time.time()),
                           is_used=False,
                           valid_date=valid_date,
                           used_time=None,
                           description=None)
         db_objs.append(db_obj)
     for db_obj in db_objs:
         db_session.add(db_obj)
         db_session.flush()
     db_session.commit()
     return {"result": "successful"}
Example #3
0
 def delete_order(resource_id, end_time):
     """结算订单"""
     # check resource is it exist
     db_objs = Orders.query.filter(Orders.resource_id == resource_id).all()
     if not db_objs:
         em = "can not found resource_id <{0}>".format(resource_id)
         LOG.exception(em)
         return {"code": 1, "message": em}
     used_money = 0
     for db_obj in db_objs:
         db_obj.end_time = end_time
         db_obj.status = options.order_Settlement
         # 单条订单价格
         price_obj = Price.query.filter(
             Price.price_type == db_obj.resource_type).first()
         if not price_obj:
             em = "can not found price type, order type is immediately. Please define first"
             LOG.exception(em)
             continue
         order_money = ExprOrders.order_used_money(db_obj,
                                                   price_obj,
                                                   immed=True)
         if order_money:
             used_money += order_money
             # 更新用户余额,添加消费日志
             ExprOrders.update_user_money(used_money, db_obj)
     # 更新用户过期时间
     ret = ExprOrders.expr_user_exceed_time(db_obj.user_id)
     if not ret:
         em = "update user exceed time error. user_id <{0}>".format(
             db_obj.user_id)
         LOG.exception(em)
         return {"code": 1, "message": em}
     db_session.commit()
     return {"code": 0, "message": ""}
    def add_user_recharge(user_id, user_name, total_fee, out_trade_no,
                          trade_status, recharge_way):
        """method to update user money """
        # 用户冲值记录, 只要调用支付宝接口就生成。根据状态判断是否成功

        # check user is it exist
        user = User.query.filter(User.user_id == user_id).first()
        if not user:
            em = "can not found user. user id: <{0}>".format(user_id)
            LOG.exception(em)
            # return {"error": [{"code": 400, "msg": "{0}".format(em)}]}
            return 0

        uid = str(uuid.uuid1())
        log_time = int(time.time())
        try:
            # 记录冲值记录,默认状态为`failed`
            recharge_log = RechargeLog(uid,
                                       user_id,
                                       user_name,
                                       total_fee,
                                       log_time,
                                       out_trade_no,
                                       trade_status,
                                       recharge_way=recharge_way)
            db_session.add(recharge_log)
            db_session.commit()
            return {"success": [{"code": 200, "msg": ""}]}
        except Exception as e:
            db_session.rollback()
            em = "recharge for user <{0}> error. user id : <{1}>. msg: {2}".format(
                user.user_name, user_id, e)
            LOG.exception(em)
            return {"error": [{"code": 500, "msg": "{0}".format(em)}]}
 def add_user(data):
     project_id = data.get("tenant_id")
     project_name = data.get("_context_project_name")
     user_id = data.get("user_id")
     user_name = data.get('_context_user_name')
     id = str(uuid.uuid1())
     exist_user = User.query.filter(User.user_id == user_id).first()
     try:
         if not exist_user:
             db_users = User(id=id,
                             user_id=user_id,
                             user_name=user_name,
                             project_id=project_id,
                             project_name=project_name,
                             register_time=int(time.time()))
             db_session.add(db_users)
             db_session.commit()
             em = "add user: <{0}> success".format(user_name)
             LOG.debug(em)
             return {
                 "success": [{
                     "code": 200,
                     "msg": "{0}".format(em),
                     "data": db_users
                 }]
             }
     except Exception as e:
         db_session.rollback()
         em = "add user: <{0}> failed msg: {1}".format(user_name, e)
         LOG.exception(em)
         return {"error": [{"code": 400, "msg": "{0}".format(em)}]}
Example #6
0
    def update_invoice(data):
        # 计算所有充值记录之和
        # if not data.get("orders"):
        #     em = "no any more orders id"
        #     LOG.exception(em)
        #     raise HTTPError(400, em)
        # 确认是发票记录是否存在
        invoice_obj = Invoice.query.filter(Invoice.uuid == data.invoice_uuid).first()
        if not invoice_obj:
            em = "can not found any more invoice with id: <{0}>".format(data.invoice_uuid)
            LOG.exception(em)
            raise HTTPError(400, em)
        # # 如果发票状态为邮寄,也不能修改
        # if invoice_obj.status == options.invoice_status.get("posted"):
        #     em = "invoice is posted. can not change"
        #     LOG.exception(em)
        #     raise HTTPError(400, em)
        # update database

        Invoice.query.filter(Invoice.uuid == data.invoice_uuid).update({Invoice.status: data.status,
                                                                        Invoice.complete_date: data.complete_date,
                                                                        Invoice.description: data.description,
                                                                        Invoice.logistics_no: data.logistics_no,
                                                                        Invoice.logistics_company: data.logistics_company,
                                                                        Invoice.invoice_no: data.invoice_no
                                                                        })
        db_session.commit()
        return True
 def update_user_money(money, order):
     """
     this method to update user's money(order's money)
     :param order:  db object with order info
     :return: 
     """
     try:
         if float(money) <= 0:
             return {"code": 0, "message": ""}
         user = User.query.filter(User.user_id == order.user_id).first()
         if not user:
             em = "can not found user id: <{0}>".format(order.user_id)
             LOG.exception(em)
             return False
         user.money = (float(user.money) if float(user.money) else 0)
         new_money = user.money - money
         if new_money < 0 and order.order_type == options.order_immed:
             em = "user have no enough money. user id: <{0}> resource id: <{1}>  " \
                  "resource name: <{2}>".format(order.user_id,
                                                order.resource_id,
                                                order.resource_name)
             LOG.exception(em)
             return {"code": 1, "message": em}
         User.query.filter(User.user_id == order.user_id).update(
             {User.money: new_money})
         db_session.flush()
         msg = "update user <{0}> money from <{1}> to <{2}>".format(
             user.user_id, user.money, new_money)
         LOG.debug(msg)
         # add log
         consume_log = ConsumeLog(str(uuid.uuid1()),
                                  order.user_id,
                                  order.user_name,
                                  order.project_id,
                                  order.resource_name,
                                  order.resource_type,
                                  order.resource_id,
                                  order.start_time,
                                  order.end_time,
                                  money,
                                  int(time.time()),
                                  resource_from=order.resource_from,
                                  order_uid=order.uid,
                                  details=order.resource)
         db_session.add(consume_log)
         db_session.commit()
         # 实时同步数据到cmdb
         CMDBHandle.syncdata2cmdb("consume", consume_log.uid)
         return {"code": 0, "message": ""}
     except Exception as e:
         db_session.rollback()
         em = "update user money failed. user id: <{0}> " \
              "resource id: <{1}> resource name: <{2}> msg: <{3}>".format(order.user_id,
                                                                          order.resource_id,
                                                                          order.resource_name,
                                                                          e)
         LOG.exception(em)
         return {"code": 1, "message": em}
Example #8
0
 def get_discount():
     db_obj = Discount.query.filter(
         and_(Discount.is_used == False,
              Discount.is_allocation == False)).first()
     if not db_obj:
         LOG.exception("no avalid discount card can be use")
         return False, 500
     db_obj.is_allocation = True
     db_session.commit()
     return True, db_obj
 def cycle_update_user():
     ""
     try:
         now_time = int(time.time())
         User.query.filter(User.exceed_time < now_time).update(
             {User.is_exceed: True})
         db_session.commit()
     except Exception as e:
         db_session.rollback()
         em = "cycle update user error. msg: <{0}>".format(e)
         LOG.exception(em)
 def change_user_resource_status(user_id, status):
     """status: is a boolean value. True or False"""
     try:
         User.query.filter(User.user_id == user_id).update(
             {User.is_destroy: status})
         db_session.commit()
         return True, 200
     except Exception as e:
         db_session.rollback()
         em = "update user's status error msg: <{0}>".format(e)
         LOG.exception(em)
         return False, 500
    def update_user_recharge(async_data):
        """根据号in_trade_no(唯一订单号)来更新用户冲值记录的状态"""
        out_trade_no = async_data.get("out_trade_no")
        trade_status = async_data.get("trade_status")
        money = float(async_data.get("price"))
        try:
            # 更新用户余额(如果是成功的消息)
            if trade_status == "success":
                # 根据订单号从recharge_log表找用户user_id
                recharg = RechargeLog.query.filter(
                    RechargeLog.out_trade_no == out_trade_no).first()
                if not recharg:
                    em = "can not fond user's user_id from table recharge_log"
                    return {"error": [{"code": 500, "msg": "{0}".format(em)}]}
                user_id = recharg.user_id
                user = User.query.filter(User.user_id == user_id).first()
                if not user:
                    em = "can not fond user user_id : <{0}>".format(user_id)
                    LOG.exception(em)
                    return 0
                user_money = user.money
                new_money = money + (float(user_money)
                                     if float(user_money) else 0)
                is_exceed = (True if new_money <= 0 else False)
                # up date user's money
                User.query.filter(User.user_id == user_id).update({
                    User.money:
                    new_money,
                    User.is_exceed:
                    is_exceed
                })
                db_session.commit()
                ExprOrders.sync_user_exceed_time(user_id=user_id)

            # 更新日志记录
            RechargeLog.query.filter(
                RechargeLog.out_trade_no == out_trade_no).update(
                    {RechargeLog.trade_status: trade_status})
            msg = "user <{0}> recharge money <{1}>".format(user_id, money)
            LOG.debug(msg)
            db_session.commit()
            # 同步数据到cmdb
            result = RechargeLog.query.filter(
                RechargeLog.out_trade_no == out_trade_no).first()
            CMDBHandle.syncdata2cmdb("recharge", result.uid)
            return {"success": [{"code": 200, "msg": ""}]}
        except Exception as e:
            db_session.rollback()
            em = "update user recharge failed with in_trade_no: <{0}> msg: {1}".format(
                out_trade_no, e)
            LOG.exception(em)
            return {"error": [{"code": 500, "msg": "{0}".format(em)}]}
Example #12
0
    def save_file(files, file_path, user_info):
        isExists = os.path.exists(file_path)
        if not isExists:
            os.makedirs(file_path)
        if not files:
            return None
        # 添加到数据库
        db_obj = UploadLog(
            str(uuid.uuid1()),
            user_info.get("user_id"),
            user_info.get("user").get("user").get("name"),
            int(time.time()),
        )
        for file in files:
            # 原始文件名
            source_fname = files.get(file)[0].get("filename")
            # 生成新的文件名, 返回完整路径
            full_file = FileUploadOperate.gen_file_name(
                file_path, source_fname)
            with open(full_file, "wb") as f:
                f.write(files.get(file)[0].get("body"))
            em = "save {0} to path: {1}".format(file, full_file)
            LOG.info(em)
            # 文件路径入库为url格式:http://172.16.68.75:8900/file?path=/data/upload/xxxxx/xxxx.jpg
            file_full_url = "http://" + str(options.float_ip) + ":" + str(
                options.api_port) + "/" + "file?path=" + full_file

            if file == "yhkh":
                db_obj.yhkh_url = file_full_url

            if file == "swdj":
                db_obj.swdj_url = file_full_url

                print file_full_url
            if file == "yezz":
                db_obj.yezz_url = file_full_url

        db_session.add(db_obj)
        db_session.commit()
        return db_obj.uuid
Example #13
0
 def add_discount(id, money, valid_date, user_context, description=None):
     try:
         if not id or not money or not valid_date or not user_context:
             em = "invalid argement with add discount"
             LOG.exception(em)
             return False, 400
         # must be admin role
         if not user_context.get("user").get("admin"):
             em = "user <{0}> is not admin. role must be admin.".format(
                 user_context.get("user").get("user").get("name"))
             LOG.exception(em)
             return False, 400
         # check discount id is it esxit
         discount = Discount.query.filter(
             Discount.discount_id == id).first()
         if discount:
             em = "discount id discount_id already exist. id: <0>".format(
                 id)
             LOG.exception(em)
             return False, 409
         # add discount id
         add_discount = Discount(uid=str(uuid.uuid1()),
                                 discount_id=id,
                                 money=money,
                                 gen_time=int(time.time()),
                                 valid_date=int(
                                     ConvertTime2Int(valid_date)),
                                 is_used=False,
                                 description=description)
         db_session.add(add_discount)
         db_session.commit()
         LOG.debug(
             "add discount id Successful. discount id: <{0}>".format(id))
         return True, 200
     except Exception as e:
         db_session.rollback()
         em = "add discount error. discount id: <{0}>. msg: <{1}>".format(
             id, e)
         LOG.exception(em)
         return False, 500
Example #14
0
    def delete_invoice(uuid):
        """取消发票"""
        invoice_obj = Invoice.query.filter(Invoice.uuid == uuid).first()
        if not invoice_obj:
            em = "can not found invoice with uuid <{0}>".format(uuid)
            LOG.exception(em)
            raise HTTPError(400, em)

        # 如果发票状态为已邮寄,则不能取消和删除
        if invoice_obj.status == options.invoice_status.get("posted"):
            em = "invoice is posted. can not delete"
            LOG.exception(em)
            raise HTTPError(400, em)
        # 更新充值记
        if invoice_obj.recharge_uuids:
            recharge_ids = invoice_obj.recharge_uuids.split(",")
            for recharge_id in recharge_ids:
                RechargeLog.query.filter(RechargeLog.uid == recharge_id).update({RechargeLog.is_invoiced: False})
                db_session.flush()
        invoice_obj.deleted = True
        db_session.commit()
        return invoice_obj
Example #15
0
 def add_order(data):
     """添加订单"""
     data = orderinfo_plugins.GetOrderAbout(data)
     for r_name, used in data.resources.iteritems():
         if not used:
             continue
         order_object = Orders(str(uuid.uuid1()),
                               start_time=data.time_stamp,
                               end_time=data.end_time,
                               resource_from=data.resource_from,
                               resource_from_provider=data.resource_from_provider,
                               off=data.off,
                               used=used,
                               resource_id=data.resource_id,
                               resource_name=r_name,
                               project_id=data.project_id,
                               project_name=data.project_name,
                               user_id=data.user_id,
                               resource=data.resource,
                               user_name=data.user_name,
                               order_type=data.order_type,
                               log_time=int(time.time()),
                               status=options.order_Settlement,
                               )
         if data.money <= 0:
             em = "tencent order. money can not le 0"
             LOG.exception(em)
             continue
         # 更新用户余额,添加消费记录
         result = ExprOrders.update_user_money(data.money, order_object)
         if result.get("code") != 0:
             return result
             # 订单状态为已结算
         db_session.add(order_object)
         db_session.flush()
     # 更新用户过期时间
     ExprOrders.expr_user_exceed_time(data.user_id)
     db_session.commit()
     return {"code": 0, "message": ""}
Example #16
0
 def use_discount(id, user_context):
     try:
         now_time = int(time.time())
         # check discount id is it exsit
         discount = Discount.query.filter(
             Discount.discount_id == id).first()
         if not discount:
             em = "can not found discount id. id: <0>".format(id)
             LOG.exception(em)
             return False, 410
         # check discount id is is exceed
         if discount.valid_date or discount.is_used:
             if discount.valid_date <= now_time or discount.is_used:
                 em = "discount id is not valid. id: <{0}>".format(
                     discount.discount_id)
                 LOG.exception(em)
                 return False, 400
         user_id = user_context.get("user").get("user").get("id")
         # update user's money
         user = User.query.filter(User.user_id == user_id).first()
         if not user:
             em = "can not found user. user id: <{0}>".format(user_id)
             LOG.exception(em)
             # try to add user
             data = {
                 "tenant_id":
                 user_context.get("tenant_id"),
                 "_context_project_name":
                 user_context.get("user").get("project").get("name"),
                 "user_id":
                 user_context.get("user").get("user").get("id"),
                 "_context_user_name":
                 user_context.get("user").get("user").get("id")
             }
             ret = UserOperate.add_user(data)
             if not ret.get("success"):
                 return False, 500
             user = ret.get("success")[0].get("data")
         user.money += discount.money
         # update discount tables's status
         # Discount.query.filter(Discount.discount_id == id).update({Discount.is_used: True})
         # add Recharge Log
         recharge = RechargeLog(
             uid=str(uuid.uuid1()),
             user_id=user_id,
             user_name=user_context.get("user").get("user").get("name"),
             money=discount.money,
             log_time=int(time.time()),
             out_trade_no=discount.discount_id,
             trade_status="success",
             recharge_way="discount_id")
         db_session.add(recharge)
         db_session.flush()
         # update discount id
         Discount.query.filter(Discount.discount_id == id).update({
             Discount.is_used:
             True,
             Discount.used_time:
             now_time
         })
         db_session.commit()
         LOG.debug("discount id used by user id: <{0}>")
         # update user's exceed time
         ExprOrders.sync_user_exceed_time(user_id=user_id)
         return True, 200
     except Exception as e:
         db_session.rollback()
         em = "use discount id error. id: <{0}> user id<{1}>".format(
             id, user_id)
         LOG.exception(em)
         return False, 500
Example #17
0
    def update_order(data, resource_id):
        """变更订单"""
        new_orders = []
        data = orderinfo_plugins.GetOrderAbout(data)
        for r_name, used in data.resources.iteritems():
            if not used:
                continue
            # 检查订单是否存在
            check_orders = Orders.query.filter(
                and_(Orders.resource_id == resource_id,
                     Orders.project_id == data.project_id,
                     Orders.user_id == data.user_id,
                     Orders.resource_name == r_name,
                     Orders.status == None)).first()

            if not check_orders:
                em = "order is not exist. resource id: <{0}> resource type: <{1}>".format(
                    resource_id, r_name)
                LOG.exception(em)
                continue

            # 获取单价
            price_type_obj = Price.query.filter(Price.name == r_name).first()
            if not price_type_obj:
                n_r_name = r_name.split("/")[-1]
                price_type_obj = Price.query.filter(
                    Price.name == n_r_name).first()
            price_type = (price_type_obj.price_type
                          if price_type_obj else None)

            # 结算订单
            check_orders.end_time = data.time_stamp
            order_money = ExprOrders.order_used_money(check_orders,
                                                      price_type_obj,
                                                      immed=True)
            # 更新用户余额,添加消费记录
            result = ExprOrders.update_user_money(order_money, check_orders)
            # if result.get("code") != 0:
            #     return result
            check_orders.status = options.order_Settlement
            # 添加新订单
            order_object = Orders(
                str(uuid.uuid1()),
                start_time=data.time_stamp,
                resource_from=data.resource_from,
                resource_from_provider=data.resource_from_provider,
                off=data.off,
                used=used,
                resource_id=resource_id,
                resource_type=price_type,
                resource_name=r_name,
                project_id=data.project_id,
                project_name=data.project_name,
                user_id=data.user_id,
                resource=data.resource,
                user_name=data.user_name,
                order_type=data.order_type,
                log_time=int(time.time()),
            )
            new_orders.append(order_object)
        # 更新用户过期时间
        ExprOrders.expr_user_exceed_time(data.user_id, new_orders)
        for new_order in new_orders:
            db_session.add(new_order)
            db_session.commit()
        return {"code": 0, "message": ""}
Example #18
0
 def add_order(data):
     """添加订单"""
     data = orderinfo_plugins.GetOrderAbout(data)
     new_orders = []
     for r_name, used in data.resources.iteritems():
         if not used:
             continue
         # 检查订单是否存在
         check_orders = Orders.query.filter(
             and_(Orders.resource_id == data.resource_id,
                  Orders.project_id == data.project_id,
                  Orders.user_id == data.user_id,
                  Orders.resource_name == r_name,
                  Orders.status == None)).first()
         if check_orders:
             em = "order is already exist. resource id: <{0}> resource type: <{1}>".format(
                 data.resource_id, r_name)
             LOG.exception(em)
             continue
         # 获取单价
         price_type_obj = Price.query.filter(Price.name == r_name).first()
         if not price_type_obj:
             n_r_name = r_name.split("/")[-1]
             price_type_obj = Price.query.filter(
                 Price.name == n_r_name).first()
         price_type = (price_type_obj.price_type
                       if price_type_obj else None)
         order_object = Orders(
             str(uuid.uuid1()),
             start_time=data.time_stamp,
             end_time=data.end_time,
             resource_from=data.resource_from,
             resource_from_provider=data.resource_from_provider,
             off=data.off,
             used=used,
             resource_id=data.resource_id,
             resource_type=price_type,
             resource_name=r_name,
             project_id=data.project_id,
             project_name=data.project_name,
             user_id=data.user_id,
             resource=data.resource,
             user_name=data.user_name,
             order_type=data.order_type,
             log_time=int(time.time()),
         )
         #  订单类型-立即结算
         if data.order_type == options.order_immed:
             if not price_type_obj:
                 em = "can not found price type, order type is immediately. Please define first"
                 LOG.exception(em)
                 return {"code": 1, "message": em}
             else:
                 # get the order total used money
                 immed_order_money = ExprOrders.order_used_money(
                     order_object, price_type_obj, immed=True)
                 if not immed_order_money:
                     continue
                 # 更新用户余额,添加消费记录
                 result = ExprOrders.update_user_money(
                     immed_order_money, order_object)
                 if result.get("code") != 0:
                     return result
                 # 订单状态为已结算
                 order_object.status = options.order_Settlement
                 db_session.add(order_object)
                 db_session.flush()
         else:
             if price_type_obj:
                 new_orders.append(order_object)
     # 更新用户过期时间
     ExprOrders.expr_user_exceed_time(data.user_id, new_orders)
     # 添加到数据库
     for new_order in new_orders:
         db_session.add(new_order)
         db_session.flush()
         msg = "add order successful. resource_id: <{0}>".format(
             data.resource_id)
         LOG.debug(msg)
     db_session.commit()
     return {"code": 0, "message": ""}
 def sync_user_exceed_time(user_id=None):
     """数据同步,根据用户当前订单及余额,更新用户超时时间"""
     try:
         now_time = int(time.time())
         if not user_id:
             all_users = User.query.filter().all()
         else:
             all_users = User.query.filter(User.user_id == user_id).all()
         for user in all_users:
             total_used = 0
             min_used = 0
             orders = Orders.query.filter(
                 and_(Orders.user_id == user.user_id, Orders.status == None,
                      Orders.resource_type)).all()
             # 如果没有订单,余额大于0,更新过期时间为空,未过期
             if not orders and float(user.money) > 0:
                 User.query.filter(User.user_id == user.user_id).update({
                     User.is_exceed:
                     False,
                     User.exceed_time:
                     None,
                 })
                 db_session.flush()
             for order in orders:
                 order.end_time = now_time
                 order.order_type = options.order_immed
                 price = Price.query.filter(
                     Price.price_type == order.resource_type).first()
                 if not price:
                     em = "can not found price type. price type: <{0}>".format(
                         order)
                     LOG.exception(em)
                     return False
                 used = ExprOrders.order_used_money(order,
                                                    price,
                                                    immed=True)
                 if used:
                     total_used += used
                     order.end_time = None
             if total_used > float(user.money):
                 if not user.is_exceed:
                     User.query.filter(User.user_id == user.user_id).update(
                         {
                             User.is_exceed: True,
                             User.exceed_time: now_time,
                         })
                 db_session.flush()
             else:
                 for order in orders:
                     price = Price.query.filter(
                         Price.price_type == order.resource_type).first()
                     used = ExprOrders.order_used_money(order,
                                                        price,
                                                        immed=False)
                     if used:
                         min_used += used
                 if total_used > 0 and min_used > 0:
                     new_money = float(user.money) - total_used
                     valid_use_sec = new_money / min_used * 60
                     user_exceed_time = valid_use_sec + now_time
                     User.query.filter(User.user_id == user.user_id).update(
                         {
                             User.exceed_time: user_exceed_time,
                             User.is_exceed: False
                         })
                     db_session.flush()
                     em = "update <{0}> user's exceed time to <{1}>".format(
                         user.user_id, user_exceed_time)
                     LOG.debug(em)
             print "==================finish one. user_id: <{0}>==============================".format(
                 user.user_id)
         db_session.commit()
     except ExprOrders as e:
         db_session.rollback()
         print "error. user_id==========>>>, ", user.user_id
         print e
    def expr_user_exceed_time(user_id, new_orders=None):
        """计算用户过期时间"""
        # user_id     用户唯一ID
        # new_order   新进来的订单,列表中包含数据库对象[db_obj1, db_obj2, db_obj3, .....]

        min_used_money = 0
        total_used_money = 0
        now_time = int(time.time())
        user = User.query.filter(User.user_id == user_id).first()
        if not user:
            em = "can not found user. user id: <{0}>".format(user_id)
            LOG.exception(em)
            return {"code": 1, "message": em}
        orders = Orders.query.filter(
            and_(Orders.user_id == user_id, Orders.status == None,
                 Orders.resource_type != None)).all()
        for order in orders:
            price = Price.query.filter(
                Price.price_type == order.resource_type).first()

            print "start time=======", order.start_time
            print "end time=======", order.end_time
            # 结束时间为当前时间
            order.end_time = now_time
            # 获取订单总使用金额
            total_used = ExprOrders.order_used_money(order, price, immed=True)
            if total_used:
                total_used_money += total_used
            # 获取订单每分钟使用金额
            min_used = ExprOrders.order_used_money(order, price, immed=False)
            if min_used:
                min_used_money += min_used
            order.end_time = None
        if new_orders:
            for new_order in new_orders:
                price = Price.query.filter(
                    Price.price_type == new_order.resource_type).first()
                if price:
                    # 获取新订单每分钟使用金额
                    min_used = ExprOrders.order_used_money(new_order,
                                                           price,
                                                           immed=False)
                    if min_used:
                        min_used_money += min_used

        # 当前余额 - 之前订单使用总和 = 可用余额
        vaild_money = float(user.money) - total_used_money
        # 余额小于0,直接更新为过期
        if vaild_money <= 0:
            if not user.is_exceed:
                User.query.filter(User.user_id == user_id).update({
                    User.is_exceed:
                    True,
                    User.exceed_time:
                    now_time
                })
                db_session.flush()
                em = "user available money le 0. user is exceed with user id: <{0}>".format(
                    user_id)
                LOG.debug(em)
        else:
            # 可用余额 / 每分钟使用量 * 60 = 可用秒数
            if min_used_money > 0:
                valid_use_sec = (vaild_money / min_used_money) * 60
                # 过期时间 = 当前时间 + 可用秒数
                user_exceed_time = now_time + valid_use_sec
                User.query.filter(User.user_id == user_id).update(
                    {User.exceed_time: user_exceed_time})
                db_session.flush()
                em = "update user's exceed time to <{0}> with user id <{1}>".format(
                    user_exceed_time, user_id)
                LOG.debug(em)

        # 用户现在过期状态为`已过期`,如果无订单,余额大于0,更新用户过期状态为`未过期`
        if user.is_exceed:
            if not orders:
                User.query.filter(User.user_id == user_id).update({
                    User.exceed_time:
                    None,
                    User.is_exceed:
                    False
                })
                db_session.flush()
        db_session.commit()
        return True
Example #21
0
    def add_invoice(data, upfile_uuid):
        # 计算所有充值记录之和
        if not data.orders:
            em = "no any more orders id"
            LOG.exception(em)
            raise HTTPError(400, em)
        money = 0
        for order in data.orders:
            # 查找所有充值记录
            recharge = RechargeLog.query.filter(RechargeLog.uid == order).first()
            if not recharge:
                em = "user id: <{0}>. can not found recharge log. id: <{1}>".format(data.user_id, order)
                LOG.exception(em)
                continue
            if recharge.trade_status != "success" :
                em = "user id: <{0}>. recharge log is not success. id: <{1}>".format(data.user_id, order)
                LOG.exception(em)
                continue
            if recharge.is_invoiced:
                em = "user id: <{0}>. recharge log is invoiced. id: <{1}>".format(data.user_id, order)
                LOG.exception(em)
                continue
            # 不允许开取发票的类型
            if recharge.recharge_way in options.reject_recharge_type:
                em = "user id: <{0}>. recharge type is not allowed id: <{1}>".format(data.user_id, order)
                LOG.exception(em)
                continue

            money += float(recharge.money)
            # 更新充值记录为已开发票
            RechargeLog.query.filter(RechargeLog.uid == order).update({RechargeLog.is_invoiced: True})
            db_session.flush()
        if money <= 0:
            em = "user id: <{0}>. apply invoice error. user's money is le 0".format(data.user_id)
            LOG.exception(em)
            raise HTTPError(500, "server internal error")
        # add database
        invoice_obj = Invoice(uuid=data.invoice_uuid,
                            title=data.title,
                            status=options.invoice_status.get("verifying"),
                            post_address=data.post_address,
                            post_user=data.post_user,
                            post_phone=data.post_phone,
                            money=money,
                            title_type=data.title_type,
                            title_mode=data.title_mode,
                            context=data.context,
                            corporation_name=data.corporation_name,
                            taxpayer_dentity=data.taxpayer_dentity,
                            register_address=data.register_address,
                            register_phone=data.register_phone,
                            deposit_bank=data.deposit_bank,
                            deposit_account=data.deposit_account,
                            user_name=data.user_name,
                            user_id=data.user_id,
                            application_date=get_nowtime(),
                            description=data.description,
                            recharge_uuids=','.join(data.orders),
                            upfile_uuid=upfile_uuid,
                            )
        db_session.add(invoice_obj)
        db_session.commit()
        return invoice_obj