Exemple #1
0
    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}}
Exemple #2
0
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))