def POST(self): userid = int(self.user.userid) # 商户付费状态 groupid = self.get_groupid() mchnt = get_payinfo_ex(userid, service_code='card_actv', groupid=groupid) if not mchnt: add_free_ex(userid, service_code='card_actv', groupid=groupid) elif str(mchnt['expire_time']) <= time.strftime(DATETIME_FMT): if mchnt['status'] == MCHNT_STATUS_FREE: raise ParamError('免费体验已经到期了哦') if mchnt['status'] == MCHNT_STATUS_NORMAL: raise ParamError('付费已经到期了哦') # 能否创建集点活动 self.allow_create(userid) actv = self.validator.data # 适用门店 d = self.req.input() actv['mchnt_id_list'] = self.get_mchnt_id_list( d.get('mchnt_id_list', '').strip().split(',')) actv['userid'] = userid actv['goods_name'] = remove_emoji(actv.get('goods_name')) if not 1 <= str_len(actv['goods_name']) <= 8: raise ParamError('商品名长度是1至8位') if actv['goods_amt'] <= 0: raise ParamError('商品价格应大于0') actv['start_time'] = actv.get('start_time') or time.strftime(DT_FMT) if not(is_valid_date(actv['start_time']) and is_valid_date(actv['expire_time'])): raise ParamError('活动时间格式不合法') if actv['start_time'] > actv['expire_time']: raise ParamError('开始时间应该小于结束时间') actv['start_time'] = str_to_tstamp(actv['start_time'], DT_FMT) actv['expire_time'] = str_to_tstamp(actv['expire_time'], DT_FMT) + 86399 if actv['exchange_pt'] not in range(1, 11): raise ParamError('暂不只支持该兑换集点的活动') if actv['obtain_amt'] <= 0: raise ParamError('集点条件大于0') if actv['obtain_limit'] < 0: raise ParamError('一次交易获取的最多集点应该大于0') actv['id'] = getid() actv['ctime'] = actv['utime'] = int(time.time()) actv['status'] = ACTV_STATUS_NORMAL with get_connection_exception('qf_mchnt') as db: db.insert('card_actv', actv) return self.write(success({'id': actv['id']}))
def _trans_input(self): d = {k: v.strip() for k, v in self.req.input().iteritems()} r = {} r['id'] = d.get('id') or '' # actv info with get_connection_exception('qf_mchnt') as db: info = db.select_one('card_actv', where={'id': r['id']}) if not info: raise ParamError('活动不存在') info['start_time'] = int(time.mktime(info['start_time'].timetuple())) expire_time = d.get('expire_time', info['expire_time']) if not is_valid_date(expire_time): raise ParamError('活动截止时间格式不对') r['expire_time'] = str_to_tstamp(expire_time, DATE_FMT) + 86399 #if r['expire_time'] < info['start_time']: #raise ParamError('修改活动的截止日期不能小于起始日期') r['obtain_amt'] = int(d.get('obtain_amt', info['obtain_amt']) or 0) if r['obtain_amt'] <= 0: raise ParamError('集点条件大于0元') r['goods_name'] = remove_emoji(d.get('goods_name', info['goods_name'])) if not 1 <= str_len(r['goods_name']) <= 8: raise ParamError('商品名长度是1至8位') r['goods_amt'] = int(d.get('goods_amt', info['goods_amt']) or 0) if r['goods_amt'] <= 0: raise ParamError('商品价格应大于0') r['content'] = (info['content'] or '') + (d.get('content') or '%smis修改' % (time.strftime(DATETIME_FMT))) return r
def GET(self, userid=None): d = {k: v.strip() for k, v in self.req.input().iteritems()} expectdate = d.get('expectdate') if not is_valid_date(expectdate): raise ParamError('账期格式错误') # 数据总结 settle_statis = get_settle_statis(userid, expectdate) totalmoney = totalfee = totalmonthfee = 0 for i in settle_statis: totalmoney += i['tradeamt'] totalfee += i['fee'] # 获取扣款历史 monthfees = [] try: monthfees = thrift_call(FundService, 'findWithholdHistory', config.FUND_SERVERS, userid, expectdate) except: log.warn(traceback.format_exc()) # 扣款历史 fee_detail_list = [] for monthfee in monthfees: # 费用是正的是补给用户的,加到总额里面去 if monthfee.amount > 0: totalmoney += monthfee.amount else: totalmonthfee += monthfee.amount is_rent_fee = False if isinstance(monthfee.title, types.UnicodeType): monthfee.title = monthfee.title.encode('utf-8') # 修改title如果是月租费的话 etc 12月QPOS月服务费 if monthfee.title == 'QPOS月服务费': monthfee.title = '%s月%s' % (monthfee.evidence_date[5:7], monthfee.title) is_rent_fee = True # 存在的话,就合并 is_exist = False for fee in fee_detail_list: if monthfee.title == fee['name'] and is_rent_fee: fee['value'] += monthfee.amount is_exist = True break if not is_exist: fee_detail_list.append({ 'name': monthfee.title, 'value': monthfee.amount, 'month': monthfee.evidence_date }) return self.write( success({ 'total_amt': totalmoney - totalfee + totalmonthfee, 'total_trade_amt': totalmoney, 'totalfee': totalfee, 'feedetail': fee_detail_list }))
def GET(self, userid=None): d = {k: v.strip() for k, v in self.req.input().iteritems()} # 账期 expectdate = d.get('expectdate') if not is_valid_date(expectdate): raise ParamError('账期格式错误') # 分页信息 page, pagesize = d.get('page', 0), d.get('pagesize', 10) if not all(map(is_valid_int, (pagesize, page))): raise ParamError('分页信息错误') # 到账详细信息 details = defaultdict(list) try: trade_rs = thrift_call(FundService, 'findActtradeInfo', config.FUND_SERVERS, userid, expectdate, int(page), int(pagesize)) for r in trade_rs: details[r.tradetime[:10]].append({ 'tradetime': r.tradetime, 'tradeamt': r.tradeamt, 'fee': r.fee, 'type': r.tradetype, 'coupon_fee': r.ori_coupon_amt - r.coupon_amt, 'ori_coupon_amt': r.ori_coupon_amt }) except: log.warn(traceback.format_exc()) # 头部信息 statis = get_settle_statis(userid, expectdate) statis.sort(key=lambda d: d['tradedt'], reverse=True) ret = [] for i in statis: records = details.get(i['tradedt']) if records: ret.append({ 'txdt': i['tradedt'], 'cnt': i['cnt'], 'fee': i['fee'], 'tradeamt': i['tradeamt'], 'details': records }) return self.write(success(ret))
def POST(self): d = self.req.inputjson() actv = self.check_allow_change(d.get('id')) update_value = { 'utime': int(time.time()), 'status': ACTV_STAUS_STOPED, } # 结束申明 if d.get('statement'): statement = remove_emoji(d['statement']) if not 1 <= str_len(statement) <= 150: raise ParamError('停止活动声明应该是1至150位') update_value['statement'] = statement # 结束时间 if d.get('expire_time'): expire_time = d.get('expire_time') if not is_valid_date(expire_time): raise ParamError('截止日期时间格式不对') if expire_time > str(actv['expire_time']): raise ParamError('只能缩短活动截止日期') # 活动结束时间小于当前时间 if expire_time < time.strftime(DT_FMT): update_value['expire_time'] = int(time.time() - 600) else: update_value['expire_time'] = str_to_tstamp( expire_time, DT_FMT) + 86399 else: update_value['expire_time'] = int(time.time() - 600) with get_connection_exception('qf_mchnt') as db: db.update('card_actv', update_value, {'id': d['id']}) return success({})
def POST(self): d = self.req.inputjson() userid = self.user.userid # 付费过期不能修改活动 mchnt = get_payinfo_ex( userid, service_code='card_actv', groupid=self.get_groupid()) if str(mchnt.get('expire_time')) < time.strftime(DATETIME_FMT): raise ParamError('付费已经到期了哦') # 获取活动信息 self.check_allow_change(d.get('id')) update_value = {} # 活动开始截止时间 for field in ('start_time', 'expire_time'): if d.get(field): if not is_valid_date(d[field]): raise ParamError('时间格式错误') if field == 'start_time': update_value[field] = str_to_tstamp(d[field], DT_FMT) else: update_value[field] = str_to_tstamp(d[field], DT_FMT)+86399 for field in ('obtain_amt', 'obtain_limit', 'goods_amt'): if d.get(field) and not is_valid_int(d[field]): raise ParamError('数据格式错误') # 修改活动状态 if is_valid_int(d.get('status')): if int(d['status']) in (ACTV_STATUS_NORMAL, ACTV_STAUS_STOPED): update_value['status'] = int(d['status']) # 结束申明 if int(d['status']) == ACTV_STAUS_STOPED and d.get('statement'): if d.get('statement'): statement = remove_emoji(d['statement']) if not 1 <= str_len(statement) <= 150: raise ParamError('停止活动声明应该是1至150位') update_value['statement'] = statement # 集点条件 if d.get('obtain_amt'): if d['obtain_amt'] < 0: raise ParamError('集点条件大于0元') update_value['obtain_amt'] = d['obtain_amt'] # 集点限制 if d.get('obtain_limit'): if d['obtain_limit'] < 0: raise ParamError('集点条件大于0元') update_value['obtain_limit'] = d['obtain_limit'] # 奖品名称 if d.get('goods_name'): d['goods_name'] = remove_emoji(d['goods_name']) if not 1 <= str_len(d['goods_name']) <= 8: raise ParamError('商品名长度是1至8位') update_value['goods_name'] = d['goods_name'] # 奖品金额 if d.get('goods_amt'): if d['goods_amt'] <= 0: raise ParamError('商品价格应大于0') update_value['goods_amt'] = d['goods_amt'] # 参与商户 if 'mchnt_id_list' in d: update_value['mchnt_id_list'] = self.get_mchnt_id_list( d['mchnt_id_list'].strip().split(','), int(d['id'])) if update_value: update_value['utime'] = int(time.time()) with get_connection_exception('qf_mchnt') as db: db.update('card_actv', update_value, {'id': d['id']}) return self.write(success({'id': d['id']}))
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)