def get_effect_list(self, user_id, page_number, page_size, req=None): result = [] data_report_map = self.get_promotion_data_report(user_id) # 活动状态 status = [1, 2, 3] if req: version, platform = get_app_info( req.environ.get('HTTP_USER_AGENT', '')) if version and version < "030300": status = [1, 2] # 活动列表 actvs = [] with get_connection('qf_mchnt') as conn: where = dict(userid=user_id, status=('in', status), type=1) actvs = conn.select('member_actv', where=where, other="order by id desc limit %d, %d" % (page_number, page_size)) now = datetime.datetime.now() for actv in actvs: new = {} new['id'] = actv['id'] new['content'] = actv['content'] or actv['title'] new['start_time'] = actv['start_time'].strftime(DATE_FMT) new['end_time'] = actv['expire_time'].strftime(DATE_FMT) ctime = datetime.datetime.fromtimestamp(actv['ctime']) notify_datetime = base.get_notify_datetime(ctime) new['notify_time'] = notify_datetime.strftime('%Y-%m-%d %H:%M') new['ctime'] = timestamp_str(actv['ctime'], DATETIME_FMT) # 被终止 if actv['status'] == 3: new['state'] = new['status'] = 4 # 审核失败 elif actv['status'] == 2: new['state'] = new['status'] = 3 new['audit_info'] = actv['audit_info'] # 已结束 elif actv['expire_time'] < now: new['state'] = new['status'] = 2 # 进行中 else: new['state'] = new['status'] = 1 if now < notify_datetime: new['status'] = 0 # get data resport _report = dict(member_count=0, transaction_count=0, payment_count=0) data_report = data_report_map.get(actv['id'], _report.copy()) new.update(data_report) result.append(new) return dict(allow_create=self.check_allow_create(user_id), promotion_list=result)
def GET(self): # 如果是大商户或者操作员, 暂不展示 user_cate = self.get_user_cate() if user_cate in ('bigmerchant', 'opuser'): return success({'panels': []}) # 版本号 ua = self.req.environ.get('HTTP_USER_AGENT', '') self.version, self.platform = get_app_info(ua) # 根据渠道获取面板数据 default_func_names = getattr(config, 'DATA_FUNCS', data_funcs.keys()) func_names = get_qd_conf_value_ex(mode='data_func_names', key='ext', groupid=self.get_groupid(), default=default_func_names) funcs = get_value(func_names, self.platform, self.version) panels = [] if funcs: with futures.ThreadPoolExecutor(10) as executor: for panel in executor.map(self._get_panel, funcs): if panel: panels += (panel if isinstance(panel, MulType) else [panel]) panels.sort(key=lambda d: d.get('create_time'), reverse=True) return success({'panels': panels})
def GET(self): self._ua = self.req.environ.get('HTTP_USER_AGENT', '') log.debug('user_agent:%s userid:%s' % (self._ua, self.user.userid)) ret = {} # app版本号 手机platform version, platform = get_app_info(self._ua) self._platform = (platform or self.req.inputjson().get('platform')) self._version = version # 获取appid self.appid = self.get_appid() # 获取语言 self._language = self.get_language() #香港渠道是否可退款 ret['is_refund'] = 1 groupid = self.get_groupid() if groupid in config.HK_GROUPID: opuid = self.user.ses.get("opuid", '') cate = self.get_cate() if cate == 'submerchant' or opuid: ret['is_refund'] = 0 # 获取配置 app_conf = config.USER_CONF for k, v in app_conf.iteritems(): if isinstance(v, types.DictType): try: mode = v.get('mode', 'mchnt') func = getattr(self, mode + '_conf') value = func(**v) # 版本控制 if v.get('app_control'): value = get_value(value, self._platform, self._version) # 如果是pay_sequence, 单独处理 if k == 'pay_sequence': value = self.del_pay_sequence(value) # 语言控制 if k == 'trade_config': value = self.del_trade_config(value) if value is not None: ret[k] = value except: log.debug(traceback.format_exc()) elif hasattr(config, v): ret[k] = getattr(config, v) return self.write(success(ret))
def GET(self): userid = self.user.ses.get('userid') # 获取版本号 req = self.req log.debug('user_agent:%s' % req.environ.get('HTTP_USER_AGENT', '')) version, platform = get_app_info(req.environ.get( 'HTTP_USER_AGENT', '')) log.info('version:%s platform:%s' % (version, platform)) type_list = self.get_type_list(userid, version) return self.write(success(type_list))
def _get_user_service(self): # 用户服务列表, 最少返回默认的列表 user_service = Apollo(config.APOLLO_SERVERS).user_service( self.user.userid) user_service = {}.fromkeys([i['code'] for i in user_service] + config.DEFAULT_SERVICES).keys() # 获取版本号 log.debug('user_agent:%s' % self.req.environ.get('HTTP_USER_AGENT', '')) version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) log.info('version:%s platform:%s' % (version, platform)) # 根据版本号和平台获取服务列表 services = get_services(version, platform) services.sort(key=lambda x: x.get('weight', 0), reverse=True) scodes = [i['code'] for i in services] return [i for i in scodes if i in user_service]
def GET(self): log.debug('user_agent:%s' % self.req.environ.get('HTTP_USER_AGENT', '')) version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) log.info('version:%s platform:%s' % (version, platform)) # 获取服务列表 # 早期版本没有带version default = 'middle' if 'version' in self.req.input() else 'origin' services = get_services(version, platform, default) services.sort(key=lambda x: x.get('weight', 0), reverse=True) return self.write( success({ 'system_services': services, 'zip_conf': config.ZIP_CONFIG, 'activity_conf': config.ACT_CONF, 'pay_sequence': config.PAY_SEQUENCE, }))
def GET(self): groupid = self.get_groupid() version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) platform = platform or 'ios' # tabs配置 menus = get_qd_conf_value( mode=platform + '_tabs', key='service', groupid=groupid) or [] menus = copy.deepcopy(menus) language = self.get_language() for menu in menus: # 語言控制 if 'name' in menu: menu['name'] = get_constant(menu['name'], language) return self.write(success({ 'tabs': menus, }))
def GET(self): r = deepcopy(paying_goods) r['now'] = int(time.time()) _, platform = get_app_info(self.req.environ.get('HTTP_USER_AGENT','')) if self._ck_mode == 'sid': userid = self.user.userid for i in r['goods']: # 根据平台配置 t = getattr(config, '_'.join([i['code'],platform,'SERVICE']).upper(), None) if t: i['services'] = t # 个人配置 if self._ck_mode == 'sid': try: redis_key = '__mchnt_api_goods_info_{}__'.format(i['code']) tservices = json.loads(redis_pool.hget(redis_key, userid)) except: pass else: i['services'] = tservices if not i.get('show_price'): i['price'] = [] return self.write(success(r))
def get_src(self): if hasattr(self, '_src'): return self._src useragent = self.req.environ.get('HTTP_USER_AGENT', '') log.debug('useragent:%s' % useragent) # 通过useragent判断 version, platform = get_app_info(useragent) if platform: self._src = 'mchnt' return 'mchnt' # 通过上传值判断 input_src = self.req.input().get('src') if not input_src: if 'QYB' in useragent: self._src = 'salesman' else: self._src = 'mchnt' else: self._src = input_src return self._src
def GET(self): mode = self.req.input().get('mode') if mode not in ('main', 'settings'): mode = 'main' # 版本号, 平台 version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) platform = platform or 'ios' prefix = platform + ('' if mode == 'main' else '_' + mode) # 用户角色 user_cate = self.get_user_cate() # 用户groupid groupid = self.get_groupid() # 用户信息 userinfo = {} user = apcli_ex('findUserByid', int(self.user.userid)) if user: userinfo = user.__dict__ userinfo['userid'] = userinfo['uid'] # 菜单配置 menus = get_qd_conf_value_ex( mode=prefix + '_menu', key='service', groupid=groupid) or [] menus = copy.deepcopy(menus) language = self.get_language() # 根据条件配置 ret_menus = [] for group in menus: t = [] for menu in group['menu']: # 操作员管理不展示 if (menu['tag'] == 'operator' and user_cate == 'opuser'): continue # 根据角色控制展示 cate_control = menu.pop('cate_control', None) if (cate_control is not None and user_cate not in cate_control): continue # 根据版本号控制 app_control = menu.pop('app_control', None) if app_control is None: tmp_menu = menu elif (app_control and get_value(app_control, platform, version)): tmp_menu = { k: get_value(v, platform, version) for k, v in menu.iteritems() } else: continue # 如果需要展示联系业务员 if menu['tag'] == 'contact_salesman': slsm_info = self.get_slsm_info(int(self.user.userid)) if not slsm_info: continue tmp_menu['content'] = slsm_info['telephone'] or slsm_info[ 'mobile'] if not tmp_menu['content']: continue tmp_menu['link'] = str(tmp_menu['link']).format(**userinfo) # 語言控制 if 'title' in tmp_menu: tmp_menu['title'] = get_constant(tmp_menu['title'], language) t.append(tmp_menu) if t: ret_menus.append({'menu': t}) # 能否修改基本信息 # 国家不是中国的, 暂不支持修改 qdinfo = get_qudaoinfo(groupid) support_cates = getattr(config, 'EDIT_INFO_CATES', ['bigmerchant', 'merchant', 'submerchant']) if qdinfo['country'] != "CN" or user_cate not in support_cates: edit_info = 0 else: edit_info = get_qd_conf_value(mode=platform + '_edit_info', key='service', groupid=groupid, default=1) return success({'menus': ret_menus, 'edit_info': edit_info})
def get_user_services(self, pos='all', addon=None, limit=None): ''' 获取用户功能列表 参数: pos all:全部功能 home_page:首页 head: 头部 addon 功能多加载的数据 limit 限制数量 ''' userid = int(self.user.userid) language = self.get_language() # 获取用户的信息 user = apcli('findUserBriefById', userid) if not user: raise ThirdError('商户不存在') user = user.__dict__ self._user = user # 获取用户的登录角色 user_cate = self.get_user_cate() # 获取渠道配置 qd_conf = get_qd_conf() # 用户服务列表 groupid = user['groupid'] default_services = get_qd_conf_value(userid, 'default', 'service', groupid=groupid, default=config.DEFAULT_SERVICES, qd_confs=qd_conf) user_service = apcli.user_service(userid) self._user_service = {i['code'] for i in user_service} | set(default_services) # 根据版本号和平台获取服务列表 version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) log.info('user_agent:%s version:%s platform:%s userid:%s' % (self.req.environ.get('HTTP_USER_AGENT', ''), version, platform, userid)) sys_services = get_qd_conf_value(userid, 'services', 'service', groupid=groupid, default=config.SYSTEM_SERVICES, qd_confs=qd_conf) must_addon = [ 'recharge_link', 'group_link', 'condition', 'dis_groupids', 'nodis_groupids', 'dis_service', 'dis_condition', 'show_cate' ] addon = (addon or []) + must_addon services = get_services(version, platform, addon=addon, sys_services=sys_services) # 调整返回值 ret = [] payinfo = None user_open_service = {i['code'] for i in user_service} for service in services: # 若不满足条件, 直接跳过 if service['code'] not in self._user_service: continue # 指定角色才展示 show_cates = service.pop('show_cate') or [ 'merchant', 'submerchant' ] if user_cate not in show_cates: continue # 显示位置判断 tpos = service.pop('pos') or ['all'] if pos not in tpos: continue dis_condition = service.pop('dis_condition', None) if dis_condition: try: if not eval( dis_condition, { 'user': user, 'user_open': service['code'] in user_open_service }): continue except: log.warn(traceback.format_exc()) continue # 条件 condition = service.pop('condition', None) # 渠道link group_link = service.pop('group_link', None) # 渠道link # 根据grouid配置是否展示 dis_groupids = service.pop('dis_groupids') or config.QF_GROUPIDS nodis_groupids = service.pop( 'nodis_groupids') or config.QF_GROUPIDS # 付费后的链接 recharge_link = service.pop('recharge_link', None) # 余额提现链接 dis_service = service.pop('dis_service', '') # 根据条件判断 if condition: # 如果指定服务存在将不展示 if ('dis_service' in condition and dis_service in self._user_service): continue # 根据渠道判断 # 白牌渠道不展示 if 'group_dis' in condition: if groupid in qd_conf: continue # 根据渠道id来控制展示 if 'group_control' in condition: if groupid not in dis_groupids: continue # 根据渠道id来控制展示 if 'nogroup_control' in condition: if groupid in nodis_groupids: continue # 白牌渠道link if 'group_link' in condition: if groupid in qd_conf: service['link'] = group_link # 开通点餐服务 if 'diancan_service' in condition: if payinfo is None: payinfo = get_mchnt_paying(userid, code='diancan') if payinfo and str(payinfo['expire_time']) > time.strftime( DATETIME_FMT): service['link'] = recharge_link # 链接带上参数 service['link'] = service['link'].format(**user) # name根据语言可控制 if 'name' in service: service['name'] = get_constant(service['name'], language) ret.append(service) return ret[:limit]
def auto_apply(self, userid): data = self._data td, now = time.strftime(DATE_FMT), time.strftime(DATETIME_FMT) #新审核系统预设参数 info = {} #凭证参数 piclist = [] # 字典转码 def byteify(input): if isinstance(input, dict): return { byteify(key): byteify(value) for key, value in input.iteritems() } elif isinstance(input, list): return [byteify(element) for element in input] elif isinstance(input, unicode): return input.encode('utf-8') else: return input # 写入凭证 with get_connection('qf_mis') as db: d = {k: v.strip() for k, v in self.req.input().iteritems()} cert_types = UserDefine.CERT_TYPE for code in UserDefine.CERT_TYPE_LIST: if (code not in d or not d[code] or code not in cert_types): continue insert_data = { 'user_id': userid, 'upgrade_id': 0, 'apply_level': 0, 'cert_type': cert_types[code], 'name': code, 'submit_time': now, 'state': 1, 'input_state': 1, 'typist_user': 0, 'typist_time': now, 'imgname': d[code] } try: piclist.append({ "name": str(code), "src": str(d[code]), "cert_type": str(cert_types[code]) }) db.insert('mis_upgrade_voucher', insert_data) except: log.debug(traceback.format_exc()) info["piclist"] = piclist # 写入审核 version, platform = get_app_info( self.req.environ.get('HTTP_USER_AGENT', '')) src = ''.join([data['src'], platform, version]) idstatdate = (data['idstatdate'] if is_valid_date( data.get('idstatdate')) else td) idenddate = (data['idenddate'] if is_valid_date(data.get('idenddate')) else td) # mcc if data['cate'] == 'saleman' and not data['shoptype_id']: mcc = UserDefine.DEFAULT_SALEMAN_MCC else: mcc = UserUtil.get_mcc(data['shoptype_id']) apply_values = { 'user': int(userid), 'usertype': data['usertype'], 'legalperson': data['legalperson'] or data['bankuser'], 'name': data['name'], 'idnumber': data['idnumber'], 'idstatdate': idstatdate, 'idenddate': idenddate, 'telephone': data['landline'], 'idphoto1': data['idcardfront'], 'idphoto2': data['idcardback'], 'licenseend_date': td, 'licensephoto': '', 'taxenddate': td, 'longitude': covert(data['longitude'], float), 'latitude': covert(data['latitude'], float), 'address': ''.join([data['city'], data['location'], data['address']]), 'city': data['city'], 'province': data['province'], 'mobile': data['username'], 'headbankname': data['headbankname'], 'banktype': (2 if data['banktype'] == '2' else 1), 'bankname': data['bankname'], 'bankuser': data['bankuser'], 'bankProvince': data['bankprovince'], 'bankCity': data['bankcity'], 'bankaccount': data['bankaccount'].replace(' ', ''), 'state': 4, 'brchbank_code': data['bankcode'], 'mcc': mcc, 'nickname': data['shopname'], 'src': src, 'groupid': data['groupid'], 'srctype': UserDefine.SIGNUP_SRCTYPE_TINY, # 先固定为小微商户 'edu': 1, 'monthincome': 0, 'monthexpense': 0, 'tid': '', 'terminalcount': 1, 'last_admin': 0, 'allowarea': 0, 'needauth': 2, 'passcheck': 2, 'last_modify': now, 'post': '', 'provision': '', 'bankmobile': data['bankmobile'], 'monthtradeamount': 1, 'founddate': td, 'area': 100, 'payment_type': 1, 'rent_count': 0, 'pertradeamount': 1, 'rent_total_amt': -1, 'utime': now, 'uploadtime': now, "licensenumber": data.get("licensenumber", "") } # 获取上传费率 apply_values['ratio'] = self.get_ratio() or '' #收集后台需要的字段,摒弃废弃字段,后期只用下面的字段 userid = int(userid) groupid = int(data['groupid']) info["usertype"] = data['usertype'] info["mobile"] = data['username'] info["name"] = data['name'] info["cardstart"] = data['idstatdate'] info["cardend"] = data['idenddate'] info["legalperson"] = data['legalperson'] or data['bankuser'] info["src"] = data['src'] info["licensenumber"] = data['licensenumber'] info["mcc"] = mcc info["risk_level"] = "54" info["telephone"] = data['landline'] info["nickname"] = data['shopname'] info["bankaccount"] = data['bankaccount'].replace(' ', '') info["shop_province"] = data['province'] info["shop_city"] = data['city'] info["shop_address"] = data['address'] info["banktype"] = (2 if data['banktype'] == '2' else 1) info["bankname"] = data['bankname'] info["bankuser"] = data['bankuser'] info["headbankname"] = data['headbankname'] info["bankcode"] = data['bankcode'] fee = self.get_ratio() or '' if fee != '': fee = json.loads(fee) for (k, v) in fee.items(): info[k] = v info = byteify(info) info = json.dumps(info, ensure_ascii=False) #指定的灰度渠道下商户进入新审核逻辑 if groupid in config.NEW_AUDIT_GROUP: client = ThriftClient(config.AUDIT_SERVERS, AuditServer, framed=False) client.raise_except = True re = client.call( 'add_audit', audit_api(audit_type='signup', userid=userid, groupid=groupid, info=info)) #其他渠道的商户继续老的审核系统 else: with get_connection('qf_mis') as db: db.insert('apply', apply_values) self.set_cache_audit(userid, 2)