コード例 #1
0
 def get_current_user(self):
     session_opr = ObjectDict()
     session_opr.username = '******'
     session_opr.ipaddr = self.request.remote_ip
     session_opr.opr_type = 0
     session_opr.login_time = utils.get_currtime()
     return session_opr
コード例 #2
0
ファイル: agency_service.py プロジェクト: sailorhdx/taurusxr
 def recharge(self, formdata, **kwargs):
     try:
         rfee = utils.yuan2fen(formdata.fee_value)
         if rfee <= 0:
             raise ValueError(u'充值金额必须大于0')
         agency = self.db.query(models.TrAgency).get(formdata.agency_id)
         agency.amount += rfee
         aorder = models.TrAgencyOrder()
         aorder.id = utils.get_uuid()
         aorder.agency_id = agency.id
         aorder.fee_type = 'recharge'
         aorder.fee_value = rfee
         aorder.fee_total = agency.amount
         aorder.fee_desc = u'代理商 (%s) 充值' % utils.safeunicode(agency.agency_name)
         aorder.create_time = utils.get_currtime()
         aorder.sync_ver = tools.gen_sync_ver()
         self.db.add(aorder)
         self.add_oplog(u'代理商(%s)充值' % utils.safeunicode(agency.agency_name))
         self.db.commit()
         return agency
     except Exception as err:
         self.db.rollback()
         logger.exception(err, tag='agency_recharge_error')
         self.last_error = u'代理商充值失败:%s' % utils.safeunicode(err)
         return False
コード例 #3
0
 def add_oplog(self, message):
     ops_log = models.TrOperateLog()
     ops_log.id = utils.get_uuid()
     ops_log.operator_name = self.operator.username
     ops_log.operate_ip = self.operator.ipaddr
     ops_log.operate_time = utils.get_currtime()
     ops_log.operate_desc = message
     self.db.add(ops_log)
コード例 #4
0
 def add_oplog(self, message):
     ops_log = models.TrOperateLog()
     ops_log.id = utils.get_uuid()
     ops_log.operator_name = self.current_user.username
     ops_log.operate_ip = self.current_user.ipaddr
     ops_log.operate_time = utils.get_currtime()
     ops_log.operate_desc = message
     ops_log.sync_ver = tools.gen_sync_ver()
     self.db.add(ops_log)
コード例 #5
0
ファイル: log_trace.py プロジェクト: sailorhdx/taurusxr
 def event_syslog_trace(self, name, message, **kwargs):
     """ syslog trace event """
     message = u'%s - %s' % (utils.get_currtime(), message)
     if 'username' in kwargs:
         self.trace_userlog(kwargs['username'], message)
     if name == 'radius' and 'username' in kwargs:
         self.trace_radius(kwargs['username'], message)
     else:
         self.trace_log(name, message)
コード例 #6
0
ファイル: syncd.py プロジェクト: sailorhdx/taurusxr
 def do_fail(self, sync_id, msg='', **kwargs):
     try:
         with self.db_engine.begin() as db:
             table = models.TrRepliSyncStatus.__table__
             stmt = table.update().where(table.c.id == sync_id).values(
                 last_sync=utils.get_currtime(),
                 sync_times=table.c.sync_times + 1,
                 sync_status=2,
                 error=utils.safeunicode(msg)[:2000])
             db.execute(stmt)
     except Exception as err:
         logger.error(traceback.format_exc())
コード例 #7
0
 def post(self):
     form = login_form.login_form()
     if not form.validates(source=self.get_params()):
         return self.render('base_form.html', form=form)
     account = self.db.query(models.TrAccount).get(form.d.username)
     if not account:
         return self.render('base_form.html', form=form, msg=u'账号不存在')
     if self.aes.decrypt(account.password) != form.d.password:
         return self.render('base_form.html', form=form, msg=u'密码错误')
     self.set_session_user(account.customer_id, account.account_number,
                           self.request.remote_ip, utils.get_currtime())
     self.redirect('/ssportal')
コード例 #8
0
ファイル: vcard_service.py プロジェクト: sailorhdx/taurusxr
    def batch_active(self, vcardcodes, **kwargs):
        try:
            vcardcodes = [vc for vc in vcardcodes if vc]
            if not vcardcodes:
                raise ValueError(u'没有需要处理的卡')
            for vc in vcardcodes:
                up_params = {'status': 1, 'active_time': utils.get_currtime()}
                self.db.query(models.TrValCard).filter_by(
                    card_code=vc, status=0).update(up_params)

            self.add_oplog(u'批量激活充值卡:数量=%s' % len(vcardcodes))
            self.db.commit()
            return True
        except Exception as err:
            self.db.rollback()
            logger.exception(err)
            self.last_error = u'充值卡激活失败:%s' % utils.safeunicode(err)
            return False
コード例 #9
0
ファイル: issues.py プロジェクト: sailorhdx/taurusxr
 def post(self):
     form = issues_forms.issues_process_form()
     if not form.validates(source=self.get_params()):
         return self.render('base_form', form=form)
     iflow = models.TrIssuesFlow()
     iflow.id = tools.gen_num_id(16)
     iflow.issues_id = form.d.issues_id
     iflow.accept_time = utils.get_currtime()
     iflow.accept_status = form.d.accept_status
     iflow.accept_result = form.d.accept_result
     iflow.operator_name = self.current_user.username
     iflow.sync_ver = tools.gen_sync_ver()
     self.db.add(iflow)
     issues = self.db.query(models.TrIssues).get(iflow.issues_id)
     issues.status = iflow.accept_status
     issues.sync_ver = tools.gen_sync_ver()
     self.add_oplog(u'处理工单%s' % iflow.issues_id)
     self.db.commit()
     self.redirect('/admin/issues/detail?issues_id=%s' % iflow.issues_id)
コード例 #10
0
 def post(self):
     uname = self.get_argument('username', '')
     upass = self.get_argument('password', '')
     if not uname:
         return self.render_json(code=1, msg=u'请填写用户名')
     if not upass:
         return self.render_json(code=1, msg=u'请填写密码')
     enpasswd = md5(upass.encode()).hexdigest()
     opr = self.db.query(models.TrOperator).filter_by(
         operator_name=uname, operator_pass=enpasswd).first()
     if not opr:
         return self.render_json(code=1, msg=u'用户名密码不符')
     if opr.operator_status == 1:
         return self.render_json(code=1, msg=u'该操作员账号已被停用')
     self.set_session_user(uname, self.request.remote_ip, opr.operator_type,
                           utils.get_currtime())
     self.add_oplog(u'操作员(%s)登陆' % uname)
     self.db.commit()
     self.render_json(code=0, msg='ok')
コード例 #11
0
ファイル: vcard_service.py プロジェクト: sailorhdx/taurusxr
    def batchadd(self, formdata, **kwargs):
        try:
            batch_bn = self.get_next_bn()
            batch_num = int(formdata.num)
            if batch_num > 100:
                raise ValueError(u'最大只能发行300个充值卡')
            if formdata.card_type not in ('product', 'balance', 'timelen',
                                          'flowlen'):
                raise ValueError(u'无效的充值卡类型')
            for sn in range(1001, batch_num + 1001):
                vcard = models.TrValCard()
                vcard.card_code = '{0}{1}'.format(batch_bn, sn)
                vcard.card_type = formdata.card_type
                vcard.card_bn = batch_num
                vcard.card_pwd = self.aes.encrypt(tools.gen_random_num(7))
                vcard.product_tag = ''
                vcard.credit = 0
                vcard.flowlen = 0
                vcard.timelen = 0
                vcard.status = 0
                vcard.expire_date = formdata.expire_date
                vcard.create_time = utils.get_currtime()
                if formdata.card_type == 'product':
                    vcard.product_tag = formdata.product_tag
                if formdata.card_type == 'balance':
                    vcard.credit = formdata.credit
                if formdata.card_type == 'flowlen':
                    vcard.flowlen = formdata.flowlen
                if formdata.card_type == 'timelen':
                    vcard.timelen = formdata.timelen
                vcard.fee_price = utils.fen2yuan(int(formdata.fee_price) * 100)
                self.db.add(vcard)

            self.add_oplog(u'批量发行充值卡:数量=%s' % batch_num)
            self.db.commit()
            return True
        except Exception as err:
            self.db.rollback()
            logger.exception(err)
            self.last_error = u'充值卡发行失败:%s' % utils.safeunicode(err)
            return False
コード例 #12
0
 def post(self):
     form = customer_forms.customer_order_check_form()
     if not form.validates(source=self.get_params()):
         return self.render('base_form.html', form=form)
     audit_desc = utils.safeunicode(form.d.audit_desc)
     order = self.db.query(models.TrCustomerOrder).get(form.d.order_id)
     new_actual_fee = utils.yuan2fen(form.d.actual_fee)
     if order.actual_fee != new_actual_fee:
         audit_desc += u';调整费用 \xa5{} 为 \xa5{}'.format(utils.fen2yuan(order.actual_fee), form.d.actual_fee)
     checktime = utils.get_currtime()
     order.actual_fee = new_actual_fee
     order.pay_status = 2
     order.check_time = checktime
     order.order_desc += u'; 对账审核时间:{}'.format(checktime)
     audit_desc += u'; 订单ID:{}'.format(order.order_id)
     order.stat_year = order.create_time[0:4]
     order.stat_month = order.create_time[0:7]
     order.stat_day = order.create_time[0:10]
     self.add_oplog(audit_desc)
     self.db.commit()
     self.redirect('/admin/customer/order')
コード例 #13
0
 def do_async():
     try:
         with make_db(self.db) as db:
             _status = models.TrRepliSyncStatus()
             _status.id = utils.get_uuid()
             _status.table_name = sync_obj.table_name
             _status.action = sync_obj.action
             _status.sync_status = 0
             _status.sync_times = 0
             _status.error = ''
             _status.pkeys = sync_obj.pkeys
             _status.content = sync_obj.content
             _status.create_time = utils.get_currtime()
             _status.last_sync = _status.create_time
             _status.sync_ver = sync_obj.sync_ver or tools.gen_sync_ver(
             )
             db.add(_status)
             db.commit()
     except Exception as err:
         import traceback
         traceback.print_exc()
コード例 #14
0
    def post(self):
        try:
            order_ids = self.get_argument('order_ids', '')
            idarray = [ p for p in order_ids.split(',') if p ]
            if not idarray:
                return self.render_json(code=1, msg=u'没有需要对账的交易记录')
            _query = self.db.query(models.TrCustomerOrder).filter(models.TrCustomerOrder.order_id.in_(idarray))
            total = 0
            for od in _query:
                if od.pay_status in (0, 1):
                    od.sync_ver = tools.gen_sync_ver()
                    od.pay_status = 2
                    od.check_time = utils.get_currtime()
                    od.order_desc += u'; 对账审核时间:{}'.format(od.check_time)
                    total += 1

            self.add_oplog(u'批量对账操作总数:%s' % total)
            self.db.commit()
            self.render_json(msg=u'操作成功')
        except Exception as err:
            self.render_json(code=1, msg=u'操作失败 %s' % err.message)
コード例 #15
0
ファイル: account_service.py プロジェクト: sailorhdx/taurusxr
    def pause(self, account_number, **kwargs):
        """用户账号停机

        :param account_number:   用户账号
        :type account_number:    string
        """
        try:
            if not account_number:
                raise ValueError(u'账号不能为空')
            account = self.db.query(models.TrAccount).get(account_number)
            if account.status != 1:
                raise ValueError(u'用户当前状态不允许停机')
            _datetime = utils.get_currtime()
            account.last_pause = _datetime
            account.status = 2
            account.sync_ver = tools.gen_sync_ver()
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'pause'
            accept_log.accept_source = 'console'
            accept_log.accept_desc = u'用户停机:上网账号:%s' % account_number
            accept_log.account_number = account.account_number
            accept_log.accept_time = _datetime
            accept_log.operator_name = self.operator.username
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            self.db.add(accept_log)
            self.db.commit()
            dispatch.pub(evset.ACCOUNT_PAUSE_EVENT, account.account_number, async=True)
            dispatch.pub(evset.CACHE_DELETE_EVENT, account_cache_key(account.account_number), async=True)
            for online in self.db.query(models.TrOnline).filter_by(account_number=account_number):
                dispatch.pub(evset.UNLOCK_ONLINE_EVENT, account_number, online.nas_addr, online.acct_session_id, async=True)

            return True
        except Exception as err:
            self.db.rollback()
            self.last_error = u'用户停机失败:%s' % utils.safeunicode(err.message)
            logger.error(self.last_error, tag='account_pause_error', username=account_number)
            return False
コード例 #16
0
ファイル: account_service.py プロジェクト: sailorhdx/taurusxr
    def resume(self, account_number, **kwargs):
        """用户账号复机

        :param account_number:   用户账号
        :type account_number:    string
        """
        try:
            if not account_number:
                raise ValueError(u'账号不能为空')
            account = self.db.query(models.TrAccount).get(account_number)
            node_id = self.db.query(models.TrCustomer.node_id).filter(models.TrCustomer.customer_id == models.TrAccount.customer_id, models.TrAccount.account_number == account_number).scalar()
            if account.status != 2:
                return self.render_json(code=1, msg=u'用户当前状态不允许复机')
            account.status = 1
            _datetime = datetime.datetime.now()
            _pause_time = datetime.datetime.strptime(account.last_pause, '%Y-%m-%d %H:%M:%S')
            _expire_date = datetime.datetime.strptime(account.expire_date + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
            days = (_expire_date - _pause_time).days
            new_expire = (_datetime + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
            account.expire_date = new_expire
            account.sync_ver = tools.gen_sync_ver()
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'resume'
            accept_log.accept_source = 'console'
            accept_log.accept_desc = u'用户复机:上网账号:%s' % account_number
            accept_log.account_number = account.account_number
            accept_log.accept_time = utils.get_currtime()
            accept_log.operator_name = self.operator.username
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            self.db.add(accept_log)
            self.db.commit()
            return True
        except Exception as err:
            self.db.rollback()
            self.last_error = u'用户停机失败:%s' % utils.safeunicode(err.message)
            logger.error(self.last_error, tag='account_resume_error', username=account_number)
            return False
コード例 #17
0
ファイル: issuse.py プロジェクト: sailorhdx/taurusxr
 def post(self):
     try:
         openid = self.session.get('mps_openid',
                                   os.environ.get('DEV_OPEN_ID'))
         if not openid:
             cbk_param = urlencode({'cbk': '/mps/issues'})
             return self.redirect('/mps/oauth?%s' % cbk_param,
                                  permanent=False)
         customer = self.db.query(
             models.TrCustomer).filter_by(wechat_oid=openid).first()
         if not customer:
             return self.redirect('/mps/userbind', permanent=False)
         issues_type = self.get_argument('issues_type', '')
         content = self.get_argument('content', '')[:512]
         account = self.db.query(models.TrAccount).filter_by(
             customer_id=customer.customer_id).first()
         if self.db.query(models.TrIssues).filter_by(
                 account_number=account.account_number,
                 status=0).count() >= 7:
             return self.render('error.html', msg=u'您还有多条未受理完的工单,请耐心等待!')
         issues = models.TrIssues()
         issues.id = tools.gen_num_id(16)
         issues.account_number = account.account_number
         issues.issues_type = issues_type
         issues.content = content
         issues.builder_name = self.get_param_value('mps_issues_builder',
                                                    'default')
         issues.status = 0
         issues.operator_name = 'admin'
         issues.date_time = utils.get_currtime()
         issues.sync_ver = tools.gen_sync_ver()
         self.db.add(issues)
         self.db.commit()
         self.notify_builder(issues)
         self.notify_user(customer.wechat_oid,
                          u'尊敬的用户,您的工单已提交,我们会尽快处理,请耐心等待。')
         self.render('success.html', msg=u'在线受理完成')
     except Exception as err:
         logger.exception(err, trace='wechat')
         self.render('error.html', msg=u'在线受理失败,请联系客服 %s' % repr(err))
コード例 #18
0
 def event_ppmf_user_renew(self, account_number, product_id):
     with make_db(self.db) as db:
         try:
             account = db.query(models.TrAccount).get(account_number)
             product = db.query(models.TrProduct).get(product_id)
             if not product:
                 logger.error(u'执行流量包月续费时,用户[%s]资费id[%s]不存在' %
                              (account_number, product_id))
                 return
             if product.fee_price > account.balance:
                 logger.error(u'执行流量包月续费时,用户[%s]余额不足' % account_number)
                 return
             old_balance = account.balance
             old_flows = account.flow_length
             account.balance -= product.fee_price
             account.flow_length = product.fee_flows
             account.sync_ver = tools.gen_sync_ver()
             accept_log = models.TrAcceptLog()
             accept_log.id = utils.get_uuid()
             accept_log.accept_type = 'auto_renew'
             accept_log.accept_source = 'task'
             accept_log.account_number = account_number
             accept_log.accept_time = utils.get_currtime()
             accept_log.operator_name = 'admin'
             accept_log.accept_desc = u'用户[%s]流量包月套餐续费, 续费前余额为(%s)元,流量为(%s)G,续费后余额为(%s)元,流量为(%s)G' % (
                 account_number, utils.fen2yuan(old_balance),
                 utils.kb2gb(old_flows), utils.fen2yuan(
                     account.balance), utils.kb2gb(account.flow_length))
             accept_log.stat_year = accept_log.accept_time[0:4]
             accept_log.stat_month = accept_log.accept_time[0:7]
             accept_log.stat_day = accept_log.accept_time[0:10]
             accept_log.sync_ver = tools.gen_sync_ver()
             self.db.add(accept_log)
             self.db.commit()
             logger.info(u'用户[%s]流量包月套餐续费完成' % account_number,
                         trace='event')
         except Exception as err:
             logger.exception(err)
             logger.error(u'用户[%s]流量包月套餐续费失败' % account_number,
                          trace='event')
コード例 #19
0
    def post(self):
        form = login_forms.login_form()
        if not form.validates(source=self.get_params()):
            return self.render('usrportal_login_form.html', form=form)
        account_number = form.d.account_number
        password = form.d.password

        if not account_number:
            return self.render_json(code=1, msg=u'请填写用户名')
        if not password:
            return self.render_json(code=1, msg=u'请填写密码')

        account = self.db.query(models.TrAccount).get(account_number)
        if not account:
            return self.render_json(code=1, msg=u'账号不存在')
        if self.aes.decrypt(account.password) != password:
            return self.render_json(code=1, msg=u'密码错误')
        product = self.db.query(models.TrProduct).get(account.product_id)
        self.set_session_user(account.customer_id, account.account_number,
                              self.request.remote_ip, utils.get_currtime(),
                              account.status, account.expire_date, account.create_time,
                              product.product_policy, product.product_name)
        return self.render_json(code=0, msg='ok')
コード例 #20
0
ファイル: issues.py プロジェクト: sailorhdx/taurusxr
 def post(self):
     builders = self.get_builders_by_account(
         self.get_argument('account_number'))
     form = issues_forms.issues_add_form(builders)
     if not form.validates(source=self.get_params()):
         return self.render('base_form.html', form=form)
     if self.db.query(models.TrAccount).filter_by(
             account_number=form.d.account_number).count() == 0:
         return self.render('base_form.html', form=form, msg=u'用户账号不存在')
     issues = models.TrIssues()
     issues.id = tools.gen_num_id(16)
     issues.account_number = form.d.account_number
     issues.issues_type = form.d.issues_type
     issues.content = form.d.content
     issues.builder_name = form.d.builder_name
     issues.status = 0
     issues.operator_name = self.current_user.username
     issues.date_time = utils.get_currtime()
     issues.sync_ver = tools.gen_sync_ver()
     self.db.add(issues)
     self.add_oplog(u'创建新工单:%s' % issues.id)
     self.db.commit()
     self.pub_notify(issues)
     self.redirect('/admin/issues/list')
コード例 #21
0
    def update(self, formdata, **kwargs):
        try:
            fee_months = self.parse_arg(formdata, 'fee_months', defval='0')
            fee_days = self.parse_arg(formdata, 'fee_days', defval='0')
            fee_times = self.parse_arg(formdata, 'fee_times', defval='0')
            fee_flows = self.parse_arg(formdata, 'fee_flows', defval='0')
            addr_pool = self.parse_arg(formdata, 'addr_pool', defval='')
            product = self.db.query(models.TrProduct).get(formdata.id)
            product.product_name = formdata.product_name
            product.ispub = formdata.get('ispub', 0)
            product.product_status = formdata.product_status
            product.fee_days = fee_days
            product.fee_months = fee_months
            product.fee_times = utils.hour2sec(fee_times)
            product.fee_flows = utils.gb2kb(fee_flows)
            product.bind_mac = formdata.bind_mac
            product.bind_vlan = formdata.bind_vlan
            product.concur_number = formdata.concur_number
            product.fee_period = ''
            product.fee_price = utils.yuan2fen(formdata.fee_price)
            product.input_max_limit = utils.mbps2bps(formdata.input_max_limit)
            product.output_max_limit = utils.mbps2bps(
                formdata.output_max_limit)
            product.free_auth = formdata.free_auth
            product.free_auth_uprate = utils.mbps2bps(formdata.free_auth_uprate
                                                      or 0)
            product.free_auth_downrate = utils.mbps2bps(
                formdata.free_auth_downrate or 0)
            product.update_time = utils.get_currtime()
            product.sync_ver = tools.gen_sync_ver()
            opsdesc = u'修改资费信息:%s' % utils.safeunicode(product.product_name)
            self.add_oplog(opsdesc)
            self.db.query(models.TrProductCharges).filter_by(
                product_id=product.id).delete()
            for charge_code in kwargs.get('item_charges', []):
                pcharges = models.TrProductCharges()
                pcharges.charge_code = charge_code
                pcharges.product_id = product.id
                pcharges.sync_ver = tools.gen_sync_ver()
                self.db.add(pcharges)

            self.update_attr(product.id,
                             'flow_price',
                             formdata.get('flow_price', 0),
                             attr_desc=u'流量充值单价(元)(流量套餐)',
                             attr_type=0)
            self.update_attr(product.id,
                             'month_price',
                             formdata.get('month_price', 0),
                             attr_desc=u'按月续费单价(元)(买断包月套餐)',
                             attr_type=0)
            self.update_attr(product.id,
                             'day_price',
                             formdata.get('day_price', 0),
                             attr_desc=u'按日续费单价(元)(买断包日套餐)',
                             attr_type=0)
            self.update_attr(product.id,
                             'max_giftflows',
                             formdata.get('max_giftflows', 0),
                             attr_desc=u'最大赠送流量值(G)',
                             attr_type=0)
            self.update_attr(product.id,
                             'max_giftdays',
                             formdata.get('max_giftdays', 0),
                             attr_desc=u'最大赠送天数',
                             attr_type=0)
            if addr_pool:
                self.update_attr(product.id,
                                 'Framed-Pool',
                                 addr_pool,
                                 attr_desc=u'地址池',
                                 attr_type=1)
            if 'bandwidthCode' in formdata:
                self.update_attr(product.id,
                                 'limit_rate_code',
                                 formdata.get('bandwidthCode'),
                                 attr_desc=u'资费扩展限速标识',
                                 attr_type=0)
            self.db.commit()
            self.update_cache_event(product.id)
            return product
        except Exception as err:
            self.db.rollback()
            logger.exception(err, tag='product_update_error')
            self.last_error = u'操作失败:%s' % utils.safeunicode(err)
            return False
コード例 #22
0
    def post(self):
        node_cache = {}
        area_cache = {}
        product_cache = {}
        accounts = [
            a.account_number
            for a in self.db.query(models.TrAccount.account_number)
        ]
        iform = customer_forms.customer_import_form()
        f = self.request.files['import_file'][0]
        try:
            impctx = utils.safeunicode(f['body'])
        except Exception as err:
            logger.exception(err)
            self.render_error(msg=u'文件格式错误: %s' % utils.safeunicode(err))
            return

        lines = impctx.split('\n')
        _num = 0
        impusers = []
        for line in lines:
            _num += 1
            line = line.strip()
            if not line or u'用户姓名' in line:
                continue
            attr_array = line.split(',')
            if len(attr_array) < 13:
                return self.render('customer_import_form.html',
                                   form=iform,
                                   msg=u'第 %s  行错误: 用户字段必须是14个 ' % _num)
            if attr_array[7] in accounts:
                continue
            vform = customer_forms.customer_import_vform()
            vform.fill(**dict(realname=utils.safeunicode(attr_array[0]),
                              node=utils.safeunicode(attr_array[1]),
                              area=utils.safeunicode(attr_array[2]),
                              product=utils.safeunicode(attr_array[3]),
                              idcard=attr_array[4],
                              mobile=attr_array[5],
                              address=utils.safeunicode(attr_array[6]),
                              account_number=attr_array[7],
                              password=attr_array[8],
                              begin_date=attr_array[9],
                              expire_date=attr_array[10],
                              time_length=utils.hour2sec(attr_array[11]),
                              flow_length=utils.mb2kb(attr_array[12])))
            impusers.append(vform)

        _unums = 0
        for form in impusers:
            try:
                node_id = self.get_node_id(form.d.node, node_cache)
                if not node_id:
                    raise ValueError(u'区域:%s不存在' %
                                     utils.safeunicode(form.d.node))
                area_id = self.get_area_id(form.d.area, area_cache)
                if not area_id:
                    raise ValueError(u'社区:%s不存在' %
                                     utils.safeunicode(form.d.area))
                product_id = self.get_product_id(form.d.product, product_cache)
                if not product_id:
                    raise ValueError(u'资费:%s不存在' %
                                     utils.safeunicode(form.d.product))
                customer = models.TrCustomer()
                customer.customer_id = utils.get_uuid()
                customer.node_id = node_id
                customer.area_id = area_id
                customer.realname = form.d.realname
                customer.idcard = form.d.idcard
                customer.customer_name = form.d.account_number
                customer.password = md5(form.d.password.encode()).hexdigest()
                customer.sex = '1'
                customer.age = '0'
                customer.email = ''
                customer.mobile = form.d.mobile
                customer.address = form.d.address
                customer.create_time = form.d.begin_date + ' 00:00:00'
                customer.update_time = utils.get_currtime()
                customer.email_active = 0
                customer.mobile_active = 0
                customer.active_code = utils.get_uuid()
                customer.sync_ver = tools.gen_sync_ver()
                self.db.add(customer)
                accept_log = models.TrAcceptLog()
                accept_log.id = utils.get_uuid()
                accept_log.accept_type = 'open'
                accept_log.accept_source = 'console'
                _desc = u'用户导入账号:%s' % form.d.account_number
                accept_log.accept_desc = _desc
                accept_log.account_number = form.d.account_number
                accept_log.accept_time = customer.update_time
                accept_log.operator_name = self.current_user.username
                accept_log.stat_year = accept_log.accept_time[0:4]
                accept_log.stat_month = accept_log.accept_time[0:7]
                accept_log.stat_day = accept_log.accept_time[0:10]
                accept_log.sync_ver = tools.gen_sync_ver()
                self.db.add(accept_log)
                self.db.flush()
                self.db.refresh(accept_log)
                order_fee = 0
                actual_fee = 0
                balance = 0
                time_length = 0
                flow_length = 0
                expire_date = form.d.expire_date
                product = self.db.query(models.TrProduct).get(product_id)
                if product.product_policy == BOTimes:
                    time_length = utils.hour2sec(form.d.time_length)
                elif product.product_policy == BOFlows:
                    flow_length = utils.gb2kb(form.d.flow_length)
                elif product.product_policy in (PPTimes, PPFlow):
                    balance = utils.yuan2fen(form.d.balance)
                    expire_date = MAX_EXPIRE_DATE
                order = models.TrCustomerOrder()
                order.id = utils.get_uuid()
                order.order_id = utils.gen_order_id()
                order.customer_id = customer.customer_id
                order.product_id = product.id
                order.account_number = form.d.account_number
                order.order_fee = order_fee
                order.actual_fee = actual_fee
                order.pay_status = 1
                order.accept_id = accept_log.id
                order.order_source = 'console'
                order.create_time = customer.update_time
                order.order_desc = u'用户导入开户'
                order.stat_year = order.create_time[0:4]
                order.stat_month = order.create_time[0:7]
                order.stat_day = order.create_time[0:10]
                order.sync_ver = tools.gen_sync_ver()
                self.db.add(order)
                account = models.TrAccount()
                account.id = utils.get_uuid()
                account.account_number = form.d.account_number
                account.customer_id = customer.customer_id
                account.product_id = order.product_id
                account.install_address = customer.address
                account.ip_address = ''
                account.mac_addr = ''
                account.password = self.aes.encrypt(form.d.password)
                account.status = 1
                account.balance = 0
                account.time_length = time_length
                account.flow_length = flow_length
                account.expire_date = expire_date
                account.user_concur_number = product.concur_number
                account.bind_mac = product.bind_mac
                account.bind_vlan = product.bind_vlan
                account.vlan_id1 = 0
                account.vlan_id2 = 0
                account.create_time = customer.create_time
                account.update_time = customer.update_time
                account.sync_ver = tools.gen_sync_ver()
                self.db.add(account)
                _unums += 1
            except Exception as e:
                self.db.rollback()
                logger.exception(e)
                return self.render('customer_import_form.html',
                                   form=iform,
                                   msg=u'导入数据错误 : %s' % utils.safeunicode(e))

        self.add_oplog(u'导入开户,用户数:%s' % _unums)
        self.db.commit()
        self.redirect('/admin/customer')
コード例 #23
0
ファイル: account_renew.py プロジェクト: sailorhdx/taurusxr
    def renew(self, formdata, **kwargs):
        """用户续费

        :param formdata:   用户续费参数表
        :type formdata:    dict
        
        formdata params:
        
        :param account_number:   用户账号
        :type account_number:    string
        :param operate_desc:    操作描述
        :type operate_desc:     string
        :param fee_value:    费用金额(元) x.xx
        :type fee_value:     string
        :param months:    订购月数,预付费包月有效
        :type months:     int
        :param giftdays:    赠送天数
        :type giftdays:     int
        :param expire_date:    到期时间 yyyy-mm-dd
        :type expire_date:     string
        :param order_id:    订单号(可选) 16-32位字符串
        :type order_id:     string
        """
        try:
            account_number = self.parse_arg(formdata,
                                            'account_number',
                                            rule=rules.not_null)
            product_id = self.parse_arg(formdata,
                                        'product_id',
                                        rule=rules.not_null)
            operate_desc = self.parse_arg(formdata, 'operate_desc', defval='')
            fee_value = self.parse_arg(formdata,
                                       'fee_value',
                                       rule=rules.is_rmb)
            months = self.parse_arg(formdata,
                                    'months',
                                    defval='0',
                                    rule=rules.is_number)
            days = self.parse_arg(formdata,
                                  'days',
                                  defval='0',
                                  rule=rules.is_number)
            giftdays = self.parse_arg(formdata,
                                      'giftdays',
                                      defval='0',
                                      rule=rules.is_number)
            expire_date = self.parse_arg(formdata,
                                         'expire_date',
                                         rule=rules.is_date)
            order_id = self.parse_arg(formdata,
                                      'order_id',
                                      defval=utils.gen_order_id(),
                                      rule=rules.not_null)
            vcard_code = self.parse_arg(formdata, 'vcard_code', defval='')
            vcard_pwd = self.parse_arg(formdata, 'vcard_pwd', defval='')
            account = self.db.query(models.TrAccount).get(account_number)
            if account.status in (3, 4, 5):
                raise ValueError(u'无效用户状态')
            node_id = self.db.query(models.TrCustomer.node_id).filter(
                models.TrCustomer.customer_id == models.TrAccount.customer_id,
                models.TrAccount.account_number == account_number).scalar()
            product = self.db.query(models.TrProduct).get(account.product_id)
            vcard = None
            if vcard_code and vcard_pwd:
                vcard = self.db.query(models.TrValCard).get(vcard_code)
                if not self.check_vcard(vcard, vcard_pwd, product):
                    return False
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'next'
            accept_log.accept_source = 'console'
            accept_log.accept_desc = u'用户续费:上网账号:%s,续费%s元;%s' % (
                account_number, fee_value, utils.safeunicode(operate_desc))
            accept_log.account_number = account_number
            accept_log.accept_time = utils.get_currtime()
            accept_log.operator_name = self.operator.operator_name
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            accept_log.sync_ver = tools.gen_sync_ver()
            self.db.add(accept_log)
            order_fee = 0
            if product.product_policy == PPMonth:
                order_fee = decimal.Decimal(
                    product.fee_price) * decimal.Decimal(months)
                order_fee = int(order_fee.to_integral_value())
            if product.product_policy == PPDay:
                order_fee = decimal.Decimal(
                    product.fee_price) * decimal.Decimal(days)
                order_fee = int(order_fee.to_integral_value())
            elif product.product_policy in (BOMonth, BOTimes, BOFlows, BODay):
                order_fee = int(product.fee_price)
            order = models.TrCustomerOrder()
            order.id = utils.get_uuid()
            order.order_id = order_id
            order.customer_id = account.customer_id
            order.product_id = product_id
            order.account_number = account_number
            order.order_fee = order_fee
            order.actual_fee = utils.yuan2fen(fee_value)
            order.pay_status = 1
            order.accept_id = accept_log.id
            order.order_source = 'console'
            order.create_time = utils.get_currtime()
            order.stat_year = order.create_time[0:4]
            order.stat_month = order.create_time[0:7]
            order.stat_day = order.create_time[0:10]
            order.sync_ver = tools.gen_sync_ver()
            if vcard:
                vcard.status = 2
                vcard.use_time = utils.get_currtime()
                vcard.customer_id = account.customer_id
            agency_id = self.db.query(models.TrCustomer.agency_id).filter_by(
                customer_id=account.customer_id).scalar()
            if agency_id and order.actual_fee > 0:
                agency = self.db.query(models.TrAgency).get(agency_id)
                if agency.amount < order.actual_fee:
                    raise ValueError(u'代理商预存款余额不足')
                agency_share = models.TrAgencyShare()
                agency_share.id = utils.get_uuid()
                agency_share.agency_id = agency_id
                agency_share.order_id = order.order_id
                agency_share.share_rate = agency.share_rate
                sfee = decimal.Decimal(order.actual_fee) * decimal.Decimal(
                    agency.share_rate) / decimal.Decimal(100)
                sfee = int(sfee.to_integral_value())
                agency_share.share_fee = sfee
                agency_share.create_time = utils.get_currtime()
                agency_share.sync_ver = tools.gen_sync_ver()
                self.db.add(agency_share)
                agency.amount -= order.actual_fee
                aorder = models.TrAgencyOrder()
                aorder.id = utils.get_uuid()
                aorder.agency_id = agency.id
                aorder.fee_type = 'cost'
                aorder.fee_value = -order.actual_fee
                aorder.fee_total = agency.amount
                aorder.fee_desc = u'用户 %s 续费扣费' % account_number
                aorder.create_time = agency_share.create_time
                aorder.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder)
                agency.amount += agency_share.share_fee
                aorder2 = models.TrAgencyOrder()
                aorder2.id = utils.get_uuid()
                aorder2.agency_id = agency.id
                aorder2.fee_type = 'share'
                aorder2.fee_value = agency_share.share_fee
                aorder2.fee_total = agency.amount
                aorder2.fee_desc = u'用户 %s 续费分成(%s%%)' % (account_number,
                                                          agency.share_rate)
                aorder2.create_time = agency_share.create_time
                aorder2.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder2)
            if product_id != account.product_id:
                account.product_id = product_id
            old_expire_date = account.expire_date
            if account.status != UsrPreAuth:
                account.status = 1
            account.expire_date = expire_date
            if product.product_policy == BOTimes:
                account.time_length += product.fee_times
            elif product.product_policy == BOFlows:
                account.flow_length += product.fee_flows
            account.sync_ver = tools.gen_sync_ver()
            order.order_desc = u'用户续费,续费前到期:%s,续费后到期:%s, 赠送天数: %s' % (
                old_expire_date, account.expire_date, giftdays)
            self.db.add(order)
            self.add_oplog(order.order_desc)
            self.db.commit()
            dispatch.pub(ACCOUNT_NEXT_EVENT, order.account_number, async=True)
            dispatch.pub(redis_cache.CACHE_DELETE_EVENT,
                         account_cache_key(account.account_number),
                         async=True)
            return True
        except Exception as err:
            self.db.rollback()
            self.last_error = u'用户续费失败:%s' % utils.safeunicode(err)
            logger.error(self.last_error,
                         tag='account_renew_error',
                         username=formdata.get('account_number'))
            return False

        return
コード例 #24
0
ファイル: customer_add.py プロジェクト: sailorhdx/taurusxr
    def add(self, formdata, **kwargs):
        """用户开户

        :param formdata:   用户开户参数表
        :type formdata:    dict

        formdata params:

        :param account_number:   用户账号
        :type account_number:    string
        :param billing_type:   计费模式,0 首次上线计费 1 立即计费
        :type billing_type:    int
        :param customer_id:   客户ID,16-32位字符串(可选)
        :type customer_id:    string
        :param order_id:   交易ID,16-32位字符串(可选)
        :type order_id:    string
        :param product_id:   订购资费ID
        :type product_id:    string
        :param node_id:   用户区域ID
        :type node_id:    string
        :param area_id:   用户社区ID(可选)
        :type area_id:    string
        :param agency_id:   代理商ID(可选)
        :type agency_id:    string
        :param realname:   用户姓名
        :type realname:    string
        :param password:   用户账号密码
        :type password:    string
        :param ip_address:   用户IP地址
        :type ip_address:    string
        :param idcard:   用户身份证号码(可选)
        :type idcard:    string
        :param email:   用户电子邮箱(可选)
        :type email:    string
        :param mobile:   用户手机号码(可选)
        :type mobile:    string
        :param address:   用户地址(可选)
        :type address:    string
        :param customer_desc:   用户描述备注(可选)
        :type customer_desc:    string
        :param accept_source:   用户受理来源(可选)
        :type accept_source:    string
        :param expire_date:   用户到期时间 yyyy-mm-dd
        :type expire_date:    string
        :param months:   用户订购月数,预付费包月有效
        :type days:    int
        :param days:    用户订购天数,预付费包日有效
        :type months:    int
        :param fee_value:   交易费用 x.xx 元
        :type fee_value:    string
        :param giftflows:   赠送流量 x.xx GB
        :type giftflows:    string
        :param giftdays:   赠送天数
        :type giftdays:    int
        :param charge_code:   收费项目编码
        :type charge_code:    string
        :param builder_name:   服务人员名
        :type builder_name:    string
        :param vcard_code:   充值卡
        :type vcard_code:    string
        :param vcard_pwd:   充值卡密码
        :type vcard_pwd:    string
        """
        try:
            account_number = self.parse_arg(formdata,
                                            'account_number',
                                            rule=rules.not_null)
            account_number = account_number.strip()
            formdata['account_number'] = account_number
            billing_type = int(formdata.get('billing_type', 1))
            pay_status = int(formdata.get('pay_status', 1))
            customer_id = self.parse_arg(formdata,
                                         'customer_id',
                                         defval=utils.get_uuid())
            order_id = self.parse_arg(formdata,
                                      'order_id',
                                      defval=utils.get_uuid(),
                                      rule=rules.not_null)
            product_id = self.parse_arg(formdata,
                                        'product_id',
                                        rule=rules.not_null)
            node_id = self.parse_arg(formdata, 'node_id', rule=rules.not_null)
            area_id = self.parse_arg(formdata, 'area_id', defval='')
            agency_id = self.parse_arg(formdata, 'agency_id', defval='')
            realname = self.parse_arg(formdata,
                                      'realname',
                                      defval=account_number)
            realname = realname or account_number
            password = self.parse_arg(formdata,
                                      'password',
                                      rule=rules.not_null)
            ip_address = self.parse_arg(formdata, 'ip_address', defval='')
            idcard = self.parse_arg(formdata, 'idcard', defval='')
            sex = self.parse_arg(formdata, 'sex', defval='1')
            age = self.parse_arg(formdata, 'age', defval='0')
            email = self.parse_arg(formdata, 'email', defval='')
            mobile = self.parse_arg(formdata, 'mobile', defval='')
            address = self.parse_arg(formdata, 'address', defval='')
            customer_desc = self.parse_arg(formdata,
                                           'customer_desc',
                                           defval='')
            accept_source = self.parse_arg(formdata,
                                           'accept_source',
                                           defval='console')
            expire_date = self.parse_arg(formdata,
                                         'expire_date',
                                         rule=rules.is_date)
            months = self.parse_arg(formdata,
                                    'months',
                                    defval='0',
                                    rule=rules.is_number)
            days = self.parse_arg(formdata,
                                  'days',
                                  defval='0',
                                  rule=rules.is_number)
            fee_value = self.parse_arg(formdata,
                                       'fee_value',
                                       rule=rules.is_rmb)
            giftflows = self.parse_arg(formdata,
                                       'giftflows',
                                       defval='0',
                                       rule=rules.is_number3)
            giftdays = self.parse_arg(formdata,
                                      'giftdays',
                                      defval='0',
                                      rule=rules.is_number)
            charge_code = self.parse_arg(formdata, 'charge_code', defval='')
            builder_name = self.parse_arg(formdata, 'builder_name', defval='')
            status = self.parse_arg(formdata,
                                    'status',
                                    defval='1',
                                    rule=rules.is_number)
            wechat_oid = self.parse_arg(formdata, 'wechat_oid', defval='')
            vcard_code = self.parse_arg(formdata, 'vcard_code', defval='')
            vcard_pwd = self.parse_arg(formdata, 'vcard_pwd', defval='')
            if not self.check_data(formdata):
                return False
            product = self.db.query(models.TrProduct).get(product_id)
            vcard = None
            if vcard_code and vcard_pwd:
                vcard = self.db.query(models.TrValCard).get(vcard_code)
                if not self.check_vcard(vcard, vcard_pwd, product):
                    return False
            if hasattr(self.operator,
                       'agency_id') and self.operator.agency_id is not None:
                agency_id = self.operator.agency_id
            customer = models.TrCustomer()
            customer.customer_id = customer_id
            customer.node_id = node_id
            customer.area_id = area_id
            customer.agency_id = agency_id
            customer.realname = utils.safeunicode(realname)
            customer.customer_name = account_number
            customer.password = md5(password.encode()).hexdigest()
            customer.idcard = idcard
            customer.sex = sex
            customer.age = age
            customer.email = email
            customer.mobile = mobile
            customer.address = address
            customer.create_time = utils.get_currtime()
            customer.update_time = utils.get_currtime()
            customer.email_active = 0
            customer.mobile_active = 0
            customer.active_code = utils.get_uuid()
            customer.customer_desc = customer_desc
            customer.wechat_oid = wechat_oid
            customer.sync_ver = tools.gen_sync_ver()
            self.db.add(customer)
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'open'
            accept_log.accept_source = accept_source
            accept_log.account_number = account_number
            accept_log.accept_time = customer.create_time
            accept_log.operator_name = self.operator.operator_name
            accept_log.accept_desc = u'用户新开户:(%s)%s' % (customer.customer_name,
                                                        customer.realname)
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            accept_log.sync_ver = tools.gen_sync_ver()
            self.db.add(accept_log)
            order_fee = 0
            balance = 0
            expire_date = expire_date
            flow_length = 0
            if product.product_policy == PPMonth:
                order_fee = decimal.Decimal(
                    product.fee_price) * decimal.Decimal(months)
                order_fee = int(order_fee.to_integral_value())
            if product.product_policy == PPDay:
                order_fee = decimal.Decimal(
                    product.fee_price) * decimal.Decimal(days)
                order_fee = int(order_fee.to_integral_value())
            elif product.product_policy == APMonth:
                order_fee = 0
            elif product.product_policy in (BOMonth, BODay):
                order_fee = int(product.fee_price)
            elif product.product_policy == BOFlows:
                order_fee = int(product.fee_price)
                flow_length = int(product.fee_flows)
            order = models.TrCustomerOrder()
            order.order_id = order_id
            order.customer_id = customer.customer_id
            order.product_id = product.id
            order.account_number = account_number
            order.order_fee = order_fee
            order.actual_fee = utils.yuan2fen(fee_value)
            order.pay_status = pay_status
            order.accept_id = accept_log.id
            order.order_source = accept_log.accept_source
            order.create_time = customer.create_time
            order.order_desc = u'用户新开账号'
            order.stat_year = order.create_time[0:4]
            order.stat_month = order.create_time[0:7]
            order.stat_day = order.create_time[0:10]
            order.sync_ver = tools.gen_sync_ver()
            self.db.add(order)
            if vcard:
                vcard.status = 2
                vcard.use_time = utils.get_currtime()
                vcard.customer_id = customer.customer_id
            if agency_id and pay_status == 1:
                agency = self.db.query(models.TrAgency).get(agency_id)
                if agency.amount < order.actual_fee:
                    self.last_error = u'代理商预存款余额不足'
                    return False
                agency_share = models.TrAgencyShare()
                agency_share.id = utils.get_uuid()
                agency_share.agency_id = agency_id
                agency_share.order_id = order.order_id
                agency_share.share_rate = agency.share_rate
                sfee = decimal.Decimal(order.actual_fee) * decimal.Decimal(
                    agency.share_rate) / decimal.Decimal(100)
                sfee = int(sfee.to_integral_value())
                agency_share.share_fee = sfee
                agency_share.create_time = utils.get_currtime()
                agency_share.sync_ver = tools.gen_sync_ver()
                self.db.add(agency_share)
                agency.amount -= order.actual_fee
                aorder = models.TrAgencyOrder()
                aorder.id = utils.get_uuid()
                aorder.agency_id = agency.id
                aorder.fee_type = 'cost'
                aorder.fee_value = -order.actual_fee
                aorder.fee_total = agency.amount
                aorder.fee_desc = u'用户 %s 开通扣费' % account_number
                aorder.create_time = agency_share.create_time
                aorder.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder)
                agency.amount += agency_share.share_fee
                aorder2 = models.TrAgencyOrder()
                aorder2.id = utils.get_uuid()
                aorder2.agency_id = agency.id
                aorder2.fee_type = 'share'
                aorder2.fee_value = agency_share.share_fee
                aorder2.fee_total = agency.amount
                aorder2.fee_desc = u'用户 %s 开通分成(%s%%)' % (account_number,
                                                          agency.share_rate)
                aorder2.create_time = agency_share.create_time
                aorder2.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder2)
            charge_value = 0
            if charge_code:
                charge_log = models.TrChargeLog()
                charge_log.id = utils.get_uuid()
                charge_log.order_id = order.order_id
                charge_log.charge_code = charge_code
                charge_log.operator_name = accept_log.operator_name
                charge_log.operate_time = order.create_time
                charge_log.sync_ver = tools.gen_sync_ver()
                self.db.add(charge_log)
                charge_value = int(
                    self.db.query(
                        models.TrCharges).get(charge_code).charge_value or 0)
            account = models.TrAccount()
            account.account_number = account_number
            account.ip_address = ip_address
            account.customer_id = customer.customer_id
            account.product_id = order.product_id
            account.install_address = customer.address
            account.mac_addr = ''
            account.password = self.aes.encrypt(password)
            account.status = status
            if billing_type == 0:
                account.status = UsrPreAuth
            if pay_status == 0:
                account.status = UsrPadding
            account.balance = balance - charge_value
            account.time_length = int(product.fee_times)
            account.flow_length = flow_length
            account.expire_date = expire_date
            account.user_concur_number = product.concur_number
            account.bind_mac = product.bind_mac
            account.bind_vlan = product.bind_vlan
            account.vlan_id1 = 0
            account.vlan_id2 = 0
            account.create_time = customer.create_time
            account.update_time = customer.create_time
            account.account_desc = customer.customer_desc
            account.sync_ver = tools.gen_sync_ver()
            self.db.add(account)
            if pay_status == 0:
                order.before_account_data = self.warp_account_data(
                    account, status=UsrPadding)
            order.after_account_data = self.warp_account_data(account,
                                                              status=1)
            order.order_desc = u'用户新开账号,赠送天数:%s, 收费项金额:%s' % (
                giftdays, utils.fen2yuan(charge_value))
            issues = None
            builder_phone = None
            if builder_name and pay_status == 1:
                builder_phone = self.db.query(
                    models.TrBuilder.builder_phone).filter_by(
                        builder_name=builder_name).scalar()
                issues = models.TrIssues()
                issues.id = utils.get_uuid()
                issues.account_number = account.account_number
                issues.issues_type = '0'
                issues.content = u'用户新开账号, 请前往安装'
                issues.builder_name = builder_name
                issues.status = 0
                issues.operator_name = self.operator.operator_name
                issues.date_time = utils.get_currtime()
                issues.sync_ver = tools.gen_sync_ver()
                self.db.add(issues)
            opsdesc = u'用户新开账号 %s, 赠送天数:%s, 收费项金额:%s' % (
                account.account_number, giftdays, utils.fen2yuan(charge_value))
            self.add_oplog(opsdesc)
            self.db.commit()
            dispatch.pub(ACCOUNT_OPEN_EVENT,
                         account.account_number,
                         async=True)
            if issues and builder_phone:
                dispatch.pub(ISSUES_ASSIGN_EVENT,
                             issues.account_number,
                             builder_phone,
                             async=True)
            self.update_routeros_sync_event(account_number, password,
                                            product_id, node_id)
            return True
        except Exception as err:
            self.db.rollback()
            traceback.print_exc()
            self.last_error = u'客户开户操作失败:%s' % utils.safeunicode(err)
            logger.error(self.last_error,
                         tag='customer_add_error',
                         username=formdata.get('account_number'))
            return False

        return
コード例 #25
0
ファイル: customer_add.py プロジェクト: sailorhdx/taurusxr
    def batch_add(self, formdata, **kwargs):
        try:
            opennum = int(formdata.get('opennum', 100))
            if opennum > 1000:
                opennum = 1000
            user_prefix = formdata.get(
                'user_prefix',
                datetime.datetime.now().strftime('%Y%m%d'))
            suffix_len = int(formdata.get('suffix_len', 4))
            start_num = int(formdata.get('start_num', 1))
            pwd_type = int(formdata.get('pwd_type', 0))
            password = formdata.get('password', None)
            product_id = self.parse_arg(formdata,
                                        'product_id',
                                        rule=rules.not_null)
            expire_date = self.parse_arg(formdata,
                                         'expire_date',
                                         rule=rules.is_date)
            node_id = self.parse_arg(formdata, 'node_id', rule=rules.not_null)
            area_id = self.parse_arg(formdata, 'area_id', defval='')
            for num in xrange(start_num, opennum + start_num):
                account_number = '%s%s' % (
                    user_prefix, string.rjust(str(num), suffix_len, '0'))
                customer = models.TrCustomer()
                customer.customer_id = utils.get_uuid()
                customer.node_id = node_id
                customer.area_id = area_id
                customer.agency_id = None
                customer.realname = account_number
                customer.customer_name = account_number
                customer.password = md5(str(random.randint(
                    999999, 99999999))).hexdigest()
                customer.idcard = ''
                customer.sex = '1'
                customer.age = '0'
                customer.email = ''
                customer.mobile = '000000'
                customer.address = ''
                customer.create_time = utils.get_currtime()
                customer.update_time = utils.get_currtime()
                customer.email_active = 0
                customer.mobile_active = 0
                customer.active_code = utils.get_uuid()
                customer.customer_desc = u'批量生成客户'
                customer.sync_ver = tools.gen_sync_ver()
                self.db.add(customer)
                accept_log = models.TrAcceptLog()
                accept_log.id = utils.get_uuid()
                accept_log.accept_type = 'open'
                accept_log.accept_source = 'console'
                accept_log.account_number = account_number
                accept_log.accept_time = customer.create_time
                accept_log.operator_name = self.operator.operator_name
                accept_log.accept_desc = u'用户新开户:%s' % customer.customer_name
                accept_log.stat_year = accept_log.accept_time[0:4]
                accept_log.stat_month = accept_log.accept_time[0:7]
                accept_log.stat_day = accept_log.accept_time[0:10]
                accept_log.sync_ver = tools.gen_sync_ver()
                self.db.add(accept_log)
                product = self.db.query(models.TrProduct).get(product_id)
                order = models.TrCustomerOrder()
                order.order_id = utils.get_uuid()
                order.customer_id = customer.customer_id
                order.product_id = product.id
                order.account_number = account_number
                if product.product_policy in (PPTimes, PPFlow, PPMonth, PPDay):
                    order.order_fee = 0
                else:
                    order.order_fee = product.fee_price
                order.actual_fee = 0
                order.pay_status = 1
                order.accept_id = accept_log.id
                order.order_source = accept_log.accept_source
                order.create_time = customer.create_time
                order.order_desc = u'用户批量开通账号'
                order.stat_year = order.create_time[0:4]
                order.stat_month = order.create_time[0:7]
                order.stat_day = order.create_time[0:10]
                order.sync_ver = tools.gen_sync_ver()
                self.db.add(order)
                account = models.TrAccount()
                account.account_number = account_number
                account.ip_address = ''
                account.customer_id = customer.customer_id
                account.product_id = order.product_id
                account.install_address = ''
                account.mac_addr = ''
                if pwd_type == 1 and password not in (None, ''):
                    account.password = self.aes.encrypt(password)
                else:
                    account.password = self.aes.encrypt(
                        str(random.randint(999999, 9999999)))
                account.status = 0
                account.balance = 0
                account.time_length = int(product.fee_times)
                account.flow_length = int(product.fee_flows)
                account.expire_date = expire_date
                account.user_concur_number = product.concur_number
                account.bind_mac = product.bind_mac
                account.bind_vlan = product.bind_vlan
                account.vlan_id1 = 0
                account.vlan_id2 = 0
                account.create_time = customer.create_time
                account.update_time = customer.create_time
                account.account_desc = customer.customer_desc
                account.sync_ver = tools.gen_sync_ver()
                self.db.add(account)

            self.add_oplog(u'批量开户总数 %s' % opennum)
            self.db.commit()
            return True
        except Exception as err:
            self.db.rollback()
            logger.exception(err, tag='customer_batch_add_error')
            traceback.print_exc()
            self.last_error = u'批量开户操作失败:%s' % utils.safeunicode(err.message)
            return False

        return
コード例 #26
0
ファイル: forward.py プロジェクト: sailorhdx/taurusxr
 def get(self):
     action = self.get_argument('action', '')
     acip = self.get_argument('acip', '')
     ip = self.get_argument('ip', '')
     temp_acurl = self.get_argument('url', '')
     dest_acip = ''
     dest_ip = ''
     try:
         if acip:
             dest_acip = base64.b64decode(acip)
             self.session['temp_acip'] = dest_acip
         if ip:
             dest_ip = base64.b64decode(ip)
             self.session['temp_userip'] = dest_ip
         else:
             dest_ip = self.request.remote_ip
             self.session['temp_userip'] = dest_ip
         self.session['temp_acurl'] = temp_acurl
         self.session.save()
         if action == 'new':
             self.redirect('/ssportal/product')
             return
         if action == 'renew':
             user = self.get_argument('user')
             timestemp = self.get_argument('timestemp')
             action = self.get_argument('action')
             sign = self.get_argument('sign')
             nas = self.db.query(models.TrBas).filter_by(ip_addr=dest_acip).first()
             if not nas:
                 logger.error('nas {0} not exists'.format(dest_acip), username=user)
                 self.redirect('/ssportal')
                 return
             signstr = user + ip + timestemp + action + str(nas.bas_secret) + acip
             logger.info(signstr)
             _sign = md5(signstr).hexdigest()
             logger.info('sign = ' + _sign)
             if sign != _sign:
                 logger.error('ssportal forward sign error', username=user)
                 self.redirect('/ssportal')
                 return
             account = self.db.query(models.TrAccount).get(user)
             if not account:
                 logger.error('ssportal forward error, account {0} not exists'.format(user), username=user)
                 self.redirect('/ssportal')
                 return
             self.set_session_user(account.customer_id, account.account_number, ip, utils.get_currtime())
             self.redirect('/ssportal/account')
     except Exception as err:
         logger.exception(err)
         self.redirect('/ssportal')
コード例 #27
0
ファイル: account_cancel.py プロジェクト: sailorhdx/taurusxr
    def cancel(self, formdata, **kwargs):
        """用户销户,将用户状态设置为销户状态,账号不可用,不删除用户数据,数据保留用做查询统计。

        :param formdata:   用户销户参数表
        :type formdata:    dict
        
        formdata params:
        
        :param account_number:   用户账号
        :type account_number:    string
        :param operate_desc:    操作描述
        :type operate_desc:     string
        :param fee_value:    费用金额(元) x.xx
        :type fee_value:     string
        """
        try:
            account_number = self.parse_arg(formdata,
                                            'account_number',
                                            rule=rules.not_null)
            fee_value = self.parse_arg(formdata,
                                       'fee_value',
                                       rule=rules.is_rmb)
            operate_desc = self.parse_arg(formdata, 'operate_desc', defval='')
            account = self.db.query(models.TrAccount).get(account_number)
            if account.status != 1:
                raise ValueError(u'无效用户状态')
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'cancel'
            accept_log.accept_source = 'console'
            accept_log.account_number = account_number
            accept_log.accept_time = utils.get_currtime()
            accept_log.operator_name = self.operator.operator_name
            accept_log.accept_desc = u'用户销户退费%s(元);%s' % (
                fee_value, utils.safeunicode(operate_desc))
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            accept_log.sync_ver = tools.gen_sync_ver()
            self.db.add(accept_log)
            old_expire_date = account.expire_date
            order = models.TrCustomerOrder()
            order.id = utils.get_uuid()
            order.order_id = utils.gen_order_id()
            order.customer_id = account.customer_id
            order.product_id = account.product_id
            order.account_number = account_number
            order.order_fee = 0
            order.actual_fee = -utils.yuan2fen(fee_value)
            order.pay_status = 1
            order.order_source = 'console'
            order.accept_id = accept_log.id
            order.create_time = utils.get_currtime()
            order.order_desc = accept_log.accept_desc
            order.stat_year = order.create_time[0:4]
            order.stat_month = order.create_time[0:7]
            order.stat_day = order.create_time[0:10]
            order.sync_ver = tools.gen_sync_ver()
            self.db.add(order)
            account.status = 3
            agency_id = self.db.query(models.TrCustomer.agency_id).filter_by(
                customer_id=account.customer_id).scalar()
            if agency_id:
                agency = self.db.query(models.TrAgency).get(agency_id)
                sfee = decimal.Decimal(order.actual_fee) * decimal.Decimal(
                    agency.share_rate) / decimal.Decimal(100)
                sfee = int(sfee.to_integral_value())
                if agency.amount < sfee:
                    raise ValueError(u'代理商预存款余额不足')
                agency.amount -= -sfee
                aorder = models.TrAgencyOrder()
                aorder.id = utils.get_uuid()
                aorder.agency_id = agency.id
                aorder.fee_type = 'sharecost'
                aorder.fee_value = sfee
                aorder.fee_total = agency.amount
                aorder.fee_desc = u'用户 %s 销户退费分摊(%s%%) %s 元' % (
                    account_number, agency.share_rate,
                    utils.fen2yuan(aorder.fee_value))
                aorder.create_time = utils.get_currtime()
                order.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder)
            self.db.commit()
            dispatch.pub(ACCOUNT_CHANNEL_EVENT,
                         account.account_number,
                         async=True)
            dispatch.pub(redis_cache.CACHE_DELETE_EVENT,
                         account_cache_key(account.account_number),
                         async=True)
            for online in self.db.query(models.TrOnline).filter_by(
                    account_number=account.account_number):
                dispatch.pub(UNLOCK_ONLINE_EVENT,
                             online.account_number,
                             online.nas_addr,
                             online.acct_session_id,
                             async=True)

            return True
        except Exception as err:
            self.db.rollback()
            self.last_error = u'用户销户失败:%s, %s' % (utils.safeunicode(
                err.message), err.__class__)
            logger.error(self.last_error,
                         tag='account_cancel_error',
                         username=formdata.get('account_number'))
            return False
コード例 #28
0
ファイル: account_change.py プロジェクト: sailorhdx/taurusxr
    def change(self, formdata, **kwargs):
        """用户资费变更

        :param formdata:   用户续费参数表
        :type formdata:    dict
        
        formdata params:
        
        :param account_number:   用户账号
        :type account_number:    string
        :param product_id:   变更后的资费ID
        :type product_id:    string
        :param expire_date:   变更后的到期时间 yyyy-mm-dd
        :type expire_date:    string
        :param balance:   变更后的余额 x.xx 元
        :type balance:    string
        :param time_length:   变更后的剩余时长-小时
        :type time_length:    string
        :param flow_length:   变更后的剩余流量-GB
        :type flow_length:    string
        :param add_value:   变更费用 x.xx 元
        :type add_value:    string
        :param operate_desc:   变更说明
        :type operate_desc:    string
        """
        try:
            account_number = self.parse_arg(formdata, 'account_number', rule=rules.not_null)
            product_id = self.parse_arg(formdata, 'product_id', rule=rules.not_null)
            expire_date = self.parse_arg(formdata, 'expire_date', rule=rules.is_date)
            balance = self.parse_arg(formdata, 'balance', rule=rules.is_rmb)
            add_value = self.parse_arg(formdata, 'add_value', rule=rules.is_rmb)
            time_length = self.parse_arg(formdata, 'time_length', rule=rules.is_number3)
            flow_length = self.parse_arg(formdata, 'flow_length', rule=rules.is_number3)
            operate_desc = self.parse_arg(formdata, 'operate_desc')
            account = self.db.query(models.TrAccount).get(account_number)
            if account.status not in (1, 4):
                raise ValueError(u'无效用户状态')
            node_id = self.db.query(models.TrCustomer.node_id).filter(models.TrCustomer.customer_id == models.TrAccount.customer_id, models.TrAccount.account_number == account_number).scalar()
            product = self.db.query(models.TrProduct).get(product_id)
            accept_log = models.TrAcceptLog()
            accept_log.id = utils.get_uuid()
            accept_log.accept_type = 'change'
            accept_log.accept_source = 'console'
            accept_log.account_number = account_number
            accept_log.accept_time = utils.get_currtime()
            accept_log.operator_name = self.operator.operator_name
            accept_log.accept_desc = u'用户资费变更为:%s;%s' % (product.product_name, utils.safeunicode(operate_desc))
            accept_log.stat_year = accept_log.accept_time[0:4]
            accept_log.stat_month = accept_log.accept_time[0:7]
            accept_log.stat_day = accept_log.accept_time[0:10]
            accept_log.sync_ver = tools.gen_sync_ver()
            self.db.add(accept_log)
            old_exoire_date = account.expire_date
            account.product_id = product.id
            if product.product_policy in (PPMonth,
             BOMonth,
             PPDay,
             BODay):
                account.expire_date = expire_date
                account.balance = 0
                account.time_length = 0
                account.flow_length = 0
            elif product.product_policy in (PPTimes, PPFlow):
                account.expire_date = MAX_EXPIRE_DATE
                account.balance = utils.yuan2fen(balance)
                account.time_length = 0
                account.flow_length = 0
            elif product.product_policy == BOTimes:
                account.expire_date = MAX_EXPIRE_DATE
                account.balance = 0
                account.time_length = utils.hour2sec(time_length)
                account.flow_length = 0
            elif product.product_policy == BOFlows:
                account.expire_date = MAX_EXPIRE_DATE
                account.balance = 0
                account.time_length = 0
                account.flow_length = utils.gb2kb(flow_length)
            account.sync_ver = tools.gen_sync_ver()
            order = models.TrCustomerOrder()
            order.order_id = utils.gen_order_id()
            order.customer_id = account.customer_id
            order.product_id = account.product_id
            order.account_number = account.account_number
            order.order_fee = 0
            order.actual_fee = utils.yuan2fen(add_value)
            order.pay_status = 1
            order.accept_id = accept_log.id
            order.order_source = 'console'
            order.create_time = utils.get_currtime()
            order.stat_year = order.create_time[0:4]
            order.stat_month = order.create_time[0:7]
            order.stat_day = order.create_time[0:10]
            order.order_desc = u'用户变更资费,变更前到期:%s,变更后到期:%s' % (old_exoire_date, account.expire_date)
            order.sync_ver = tools.gen_sync_ver()
            self.db.add(order)
            agency_id = self.db.query(models.TrCustomer.agency_id).filter_by(customer_id=account.customer_id).scalar()
            if agency_id and order.actual_fee > 0:
                agency = self.db.query(models.TrAgency).get(agency_id)
                if agency.amount < order.actual_fee:
                    raise ValueError(u'代理商预存款余额不足')
                agency_share = models.TrAgencyShare()
                agency_share.id = utils.get_uuid()
                agency_share.agency_id = agency_id
                agency_share.order_id = order.order_id
                agency_share.share_rate = agency.share_rate
                sfee = decimal.Decimal(order.actual_fee) * decimal.Decimal(agency.share_rate) / decimal.Decimal(100)
                sfee = int(sfee.to_integral_value())
                agency_share.share_fee = sfee
                agency_share.create_time = utils.get_currtime()
                agency_share.sync_ver = tools.gen_sync_ver()
                self.db.add(agency_share)
                agency.amount -= order.actual_fee
                agency.sync_ver = tools.gen_sync_ver()
                aorder = models.TrAgencyOrder()
                aorder.id = utils.get_uuid()
                aorder.agency_id = agency.id
                aorder.fee_type = 'cost'
                aorder.fee_value = -order.actual_fee
                aorder.fee_total = agency.amount
                aorder.fee_desc = u'用户 %s 资费变更扣费' % account_number
                aorder.create_time = agency_share.create_time
                aorder.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder)
                agency.amount += agency_share.share_fee
                aorder2 = models.TrAgencyOrder()
                aorder2.id = utils.get_uuid()
                aorder2.agency_id = agency.id
                aorder2.fee_type = 'share'
                aorder2.fee_value = agency_share.share_fee
                aorder2.fee_total = agency.amount
                aorder2.fee_desc = u'用户 %s 变更资费分成(%s%%)' % (account_number, agency.share_rate)
                aorder2.create_time = agency_share.create_time
                aorder2.sync_ver = tools.gen_sync_ver()
                self.db.add(aorder2)
            self.add_oplog(accept_log.accept_desc)
            self.db.commit()
            dispatch.pub(redis_cache.CACHE_DELETE_EVENT, account_cache_key(account.account_number), async=True)
            return True
        except Exception as err:
            self.db.rollback()
            self.last_error = u'用户资费变更失败:%s' % utils.safeunicode(err)
            logger.error(self.last_error, tag='account_change_error', username=formdata.get('account_number'))
            return False
コード例 #29
0
ファイル: agency_service.py プロジェクト: sailorhdx/taurusxr
    def update(self, formdata, **kwargs):
        try:
            if int(formdata.share_rate) > 100 or int(formdata.share_rate) < 0:
                raise ValueError(u'分成比例必须在1-100')
            agency = self.db.query(models.TrAgency).get(formdata.agency_id)
            agency.agency_name = formdata.agency_name
            agency.contact = formdata.contact
            agency.mobile = formdata.mobile
            agency.share_rate = formdata.share_rate
            agency.create_time = utils.get_currtime()
            agency.update_time = agency.create_time
            agency.agency_desc = formdata.agency_desc
            agency.sync_ver = tools.gen_sync_ver()
            operator = self.db.query(models.TrOperator).filter_by(operator_name=agency.operator_name).first()
            if formdata.operator_pass:
                operator.operator_pass = md5(formdata.operator_pass.encode()).hexdigest()
            operator.operator_desc = formdata.agency_name
            operator.operator_status = formdata.operator_status
            operator.sync_ver = tools.gen_sync_ver()
            self.db.query(models.TrOperatorNodes).filter_by(operator_name=operator.operator_name).delete()
            for node_id in kwargs.get('operator_nodes') or []:
                onode = models.TrOperatorNodes()
                onode.operator_name = formdata.operator_name
                onode.node_id = node_id
                onode.sync_ver = tools.gen_sync_ver()
                self.db.add(onode)

            self.db.query(models.TrOperatorProducts).filter_by(operator_name=operator.operator_name).delete()
            for product_id in kwargs.get('operator_products') or []:
                oproduct = models.TrOperatorProducts()
                oproduct.operator_name = formdata.operator_name
                oproduct.product_id = product_id
                oproduct.sync_ver = tools.gen_sync_ver()
                self.db.add(oproduct)

            self.db.query(models.TrOperatorRule).filter_by(operator_name=operator.operator_name).delete()
            for path in kwargs.get('rule_item') or []:
                item = permit.get_route(path)
                if not item:
                    continue
                rule = models.TrOperatorRule()
                rule.id = utils.get_uuid()
                rule.operator_name = operator.operator_name
                rule.rule_name = item['name']
                rule.rule_path = item['path']
                rule.rule_category = item['category']
                rule.sync_ver = tools.gen_sync_ver()
                self.db.add(rule)

            permit.unbind_opr(operator.operator_name)
            self.add_oplog(u'更新代理商 %s' % utils.safeunicode(agency.agency_name))
            self.db.commit()
            for rule in self.db.query(models.TrOperatorRule).filter_by(operator_name=operator.operator_name):
                permit.bind_opr(rule.operator_name, rule.rule_path)

            return agency
        except Exception as err:
            self.db.rollback()
            logger.exception(err, tag='agency_update_error')
            self.last_error = u'代理商更新失败:%s' % utils.safeunicode(err)
            return False
コード例 #30
0
ファイル: agency_service.py プロジェクト: sailorhdx/taurusxr
    def add(self, formdata, **kwargs):
        try:
            if int(formdata.share_rate) > 100 or int(formdata.share_rate) < 0:
                raise ValueError(u'分成比例必须在0-100')
            if self.db.query(models.TrOperator.id).filter_by(operator_name=formdata.operator_name).count() > 0:
                raise ValueError(u'操作员已经存在')
            agency = models.TrAgency()
            agency.id = utils.get_uuid()
            agency.agency_name = formdata.agency_name
            agency.operator_name = formdata.operator_name
            agency.contact = formdata.contact
            agency.mobile = formdata.mobile
            agency.amount = utils.yuan2fen(formdata.amount)
            agency.share_rate = formdata.share_rate
            agency.create_time = utils.get_currtime()
            agency.update_time = agency.create_time
            agency.agency_desc = formdata.agency_desc
            agency.sync_ver = tools.gen_sync_ver()
            self.db.add(agency)
            self.db.flush()
            self.db.refresh(agency)
            aorder = models.TrAgencyOrder()
            aorder.id = utils.get_uuid()
            aorder.agency_id = agency.id
            aorder.fee_type = 'recharge'
            aorder.fee_value = agency.amount
            aorder.fee_total = agency.amount
            aorder.fee_desc = u'代理商 (%s) 开通预存余额' % utils.safeunicode(formdata.agency_name)
            aorder.create_time = utils.get_currtime()
            aorder.sync_ver = tools.gen_sync_ver()
            self.db.add(aorder)
            operator = models.TrOperator()
            operator.id = utils.get_uuid()
            operator.operator_name = formdata.operator_name
            operator.operator_pass = md5(formdata.operator_pass.encode()).hexdigest()
            operator.operator_type = 1
            operator.operator_desc = formdata.agency_name
            operator.operator_status = 0
            operator.sync_ver = tools.gen_sync_ver()
            self.db.add(operator)
            for node_id in kwargs.get('operator_nodes') or []:
                onode = models.TrOperatorNodes()
                onode.operator_name = formdata.operator_name
                onode.node_id = node_id
                onode.sync_ver = tools.gen_sync_ver()
                self.db.add(onode)

            for product_id in kwargs.get('operator_products') or []:
                oproduct = models.TrOperatorProducts()
                oproduct.operator_name = formdata.operator_name
                oproduct.product_id = product_id
                oproduct.sync_ver = tools.gen_sync_ver()
                self.db.add(oproduct)

            for path in kwargs.get('rule_item') or []:
                item = permit.get_route(path)
                if not item:
                    continue
                rule = models.TrOperatorRule()
                rule.id = utils.get_uuid()
                rule.operator_name = operator.operator_name
                rule.rule_name = item['name']
                rule.rule_path = item['path']
                rule.rule_category = item['category']
                rule.sync_ver = tools.gen_sync_ver()
                self.db.add(rule)

            self.add_oplog(u'创建代理商 %s' % utils.safeunicode(agency.agency_name))
            self.db.commit()
            for rule in self.db.query(models.TrOperatorRule).filter_by(operator_name=agency.operator_name):
                permit.bind_opr(rule.operator_name, rule.rule_path)

            return agency
        except Exception as err:
            self.db.rollback()
            logger.exception(err, tag='agency_add_error')
            self.last_error = u'代理商创建失败:%s' % utils.safeunicode(err)
            return False