def ordercount(self, request, *args, **kwargs): data = { "amount_tot": 0.0, "amount": 0.0, "order_tot": 0, "order": 0, "rate_tot": 0.0, "rate": 0.0 } start_datetime = send_toTimestamp( datetime.datetime.now().strftime('%Y-%m-%d') + ' 00:00:01') end_datetime = send_toTimestamp( datetime.datetime.now().strftime('%Y-%m-%d') + ' 23:59:59') #流水统计,订单比数统计,成功率 QuerySet = Order.objects.all() if self.request.user.rolecode in ["1000", "1001"]: pass elif self.request.user.rolecode == '2001': QuerySet = QuerySet.filter(userid=self.request.user.userid) elif request.user.rolecode == "3001": userlink = UserLink.objects.filter( userid_to=self.request.user.userid) if not userlink.exists(): QuerySet = Order.objects.filter(userid=0) else: QuerySet = QuerySet.filter( userid__in=[item.userid for item in userlink]) else: raise PubErrorCustom("用户类型有误!") is_all = 0.0 is_ok = 0.0 is_all_today = 0.0 is_ok_today = 0.0 for item in QuerySet: is_all += 1 if start_datetime <= item.createtime <= end_datetime: is_all_today += 1 if item.status == '0': is_ok += 1 data['amount_tot'] += float(item.confirm_amount) data['order_tot'] += 1 if start_datetime <= item.createtime <= end_datetime: data['amount'] += float(item.confirm_amount) data['order'] += 1 is_ok_today += 1 data['rate_tot'] = round(is_ok / is_all * 100.0, 3) if is_all else 0 data['rate'] = round(is_ok_today / is_all_today * 100.0, 3) if is_all_today else 0 data1 = [ { "title": '当天商户流水', "subtitle": '实时', "count": '¥{}'.format(round(data["amount"], 2)), "allcount": '¥{}'.format(round(data["amount_tot"], 2)), "text": '总流水', "color": 'rgb(27, 201, 142)', "key": '商' }, { "title": '当天订单数', "subtitle": '实时', "count": '{}'.format(data["order"]), "allcount": '{}'.format(data["order_tot"]), "text": '总订单比数', "color": 'rgb(230, 71, 88)', "key": '订' }, { "title": '当天订单成功率', "subtitle": '实时', "count": '{}%'.format(data["rate"]), "allcount": '{}%'.format(data["rate_tot"]), "text": '总成功率', "color": 'rgb(178, 159, 255)', "key": '成' }, ] ut = UtilTime() item_count = 7 data2 = [] data3 = [] day = ut.today.replace(days=-7) while item_count: day = ut.replace(arrow_v=day, days=1) day_string = ut.arrow_to_string(arrow_s=day, format_v="YYYY-MM-DD")[0:10] amount = 0.0 for item in QuerySet.filter( createtime__lte=ut.string_to_arrow(day_string + ' 23:59:59').timestamp, createtime__gte=ut.string_to_arrow(day_string + ' 00:00:01').timestamp, status='0'): amount += float(item.confirm_amount) data2.append(day_string.replace('-', '')[4:]) data3.append(amount) item_count -= 1 data4 = {'value': data3, 'key': data2, 'top': ['订单金额']} return {"data": {"data1": data1, "data4": data4}}
class RedisCaCheHandler(RedisCaCheHandlerBase): def __init__(self, **kwargs): #必查询字段 self.must_params = list(set([] + kwargs.get('must_params', []))) #查询时过滤字段 self.filter_params = list( set(['google_token', 'passwd', 'pay_passwd'] + kwargs.get('filter_params', []))) #带条件查询字段 self.condition_params = list( set([] + kwargs.get('condition_params', []))) #请求的值 self.filter_value = kwargs.get('filter_value') if kwargs.get( 'filter_value') else {} #唯一key self.must_key = kwargs.get('must_key') if kwargs.get( 'must_key') else "" #唯一key value self.must_key_value = kwargs.get('must_key_value') if kwargs.get( 'must_key_value') else "" #方法 if not kwargs.get("method"): raise PubErrorCustom("方法不能为空") self.method = kwargs.get("method") #表 if not kwargs.get("table"): raise PubErrorCustom("表不能为空") self.table = kwargs.get("table") #序列化 self.serialiers = kwargs.get("serialiers") self.ut = UtilTime() kwargs.setdefault('key', self.table) super().__init__(**kwargs) def filter(self): #查前端请求的带条件字段 self.condition_params_web = list( set([] + self.filter_value.get('conditions', [])) ) if self.filter_value else [] self.res = self.redis_dict_get_all() if not self.res: self.res = [] #特殊处理字段 createtime = self.filter_value.pop( 'createtime') if self.filter_value.get('createtime') else None data = [] for key in self.res: isOk = True #必查字段处理 for item in self.must_params: if not self.res[key].get(item, None): isOk = False break if str(self.res[key].get(item, None)) != self.filter_value.get( 'rolecode', None): isOk = False break if not isOk: continue #带条件查询字段 for item in self.condition_params: rValue = self.filter_value.pop( item[0]) if self.filter_value.get(item[0], None) else None if item[1] == 'like': if rValue and item in str( self.res.get(key)) and str(rValue) not in str( self.res.get(key).get(item)): isOk = False break elif item[1] == '>': if rValue and item in str( self.res.get(key)) and str(rValue) > str( self.res.get(key).get(item)): isOk = False break elif item[1] == '>=': if rValue and item in str( self.res.get(key)) and str(rValue) >= str( self.res.get(key).get(item)): isOk = False break elif item[1] == '<': if rValue and item in str( self.res.get(key)) and str(rValue) < str( self.res.get(key).get(item)): isOk = False break elif item[1] == '<=': if rValue and item in str( self.res.get(key)) and str(rValue) <= str( self.res.get(key).get(item)): isOk = False break else: raise PubErrorCustom("标识有误!") if not isOk: continue #其他查询字段 for item in self.filter_value: rValue = self.filter_value.get(item, None) if rValue and item in str( self.res.get(key)) and str(rValue) != str( self.res.get(key).get(item)): isOk = False break if not isOk: continue #特殊字段处理 if not self.timeHandler(createtime, self.res, key): continue #前端条件过滤查询 for item in self.condition_params_web: if '=' in item: s = item.split('=') if not (str(self.res[key].get(s[0])) == str(s[1])): isOk = False break elif '≠' in item: s = item.split('≠') if not (str(self.res[key].get(s[0])) != str(s[1])): isOk = False break elif 'like' in item: s = item.split('like') if not (str(s[1]) in str(self.res[key].get(s[0]))): isOk = False break elif '>' in item: s = item.split('>') try: if not (float(self.res[key].get(s[0])) > float(s[1])): isOk = False break except ValueError: if not (str(self.res[key].get(s[0])) > str(s[1])): isOk = False break elif '≥' in item: s = item.split('≥') try: if not (float(self.res[key].get(s[0])) >= float(s[1])): isOk = False break except ValueError: if not (str(self.res[key].get(s[0])) >= str(s[1])): isOk = False break elif '<' in item: s = item.split('<') try: if not (float(self.res[key].get(s[0])) < float(s[1])): isOk = False break except ValueError: if not (str(self.res[key].get(s[0])) < str(s[1])): isOk = False break elif '≤' in item: s = item.split('≤') try: if not (float(self.res[key].get(s[0])) <= float(s[1])): isOk = False break except ValueError: if not (str(self.res[key].get(s[0])) <= str(s[1])): isOk = False break elif '∈' in item: s = item.split('∈') if not (str(self.res[key].get(s[0])) in str(s[1])): isOk = False break if not isOk: continue for item in self.filter_params: if item in self.res[key]: self.res[key].pop(item) data.append(self.res[key]) data.sort(key=lambda k: (k.get('createtime', 0)), reverse=True) return data def save(self): res = eval("{}(self.filter_value,many=False).data".format( self.serialiers)) self.redis_dict_insert(res.get(self.must_key), res) def delete(self): self.redis_dict_del(self.must_key_value) def insertAll(self): res = eval("{}(self.filter_value,many=True).data".format( self.serialiers)) self.redis_dict_delall() for item in res: self.redis_dict_insert(item[self.must_key], item) def timeHandler(self, timeValue, res, key): if timeValue and str(timeValue) != '-1': times = timeValue.split(',') if len(times) > 1: start_date = self.ut.string_to_timestamp(times[0] + ' 00:00:01') end_date = self.ut.string_to_timestamp(times[1] + ' 23:59:59') else: today = self.ut.arrow_to_string(self.ut.string_to_arrow( times[0], format_v="YYYY-MM-DD").replace(days=1), format_v="YYYY-MM-DD") if today == self.ut.arrow_to_string(format_v="YYYY-MM-DD"): start_date = self.ut.string_to_timestamp(times[0] + ' 00:00:01') end_date = self.ut.string_to_timestamp(times[0] + " 23:59:59") elif today < self.ut.arrow_to_string(format_v="YYYY-MM-DD"): start_date = self.ut.string_to_timestamp(times[0] + ' 00:00:01') end_date = self.ut.string_to_timestamp( self.ut.arrow_to_string(format_v="YYYY-MM-DD") + " 23:59:59") else: start_date = self.ut.string_to_timestamp(times[0] + ' 00:00:01') end_date = self.ut.string_to_timestamp(times[0] + " 23:59:59") if res[key]['createtime'] < start_date or res[key][ 'createtime'] > end_date: return False return True def run(self): return eval("self.{}()".format(self.method))