Exemplo n.º 1
0
def cancel_appointment():
    from rentservice.models import UserAppointment
    from rentservice.models import AppointmentDetail
    from monservice.models import SiteBoxStock
    from rentservice.utils import logger
    import datetime
    import pytz
    tz = pytz.timezone(settings.TIME_ZONE)
    log = logger.get_logger(__name__)
    log.info("cancel appointment start...")
    current_time = datetime.datetime.now(tz=tz)
    start_time = current_time + datetime.timedelta(minutes=-20)
    appointment_list = UserAppointment.objects.filter(
        flag=0, cancel_time__gte=start_time, cancel_time__lte=current_time)
    for appointment in appointment_list:
        detail_list = AppointmentDetail.objects.filter(
            appointment_id=appointment, flag=0)
        for detail in detail_list:
            stock = SiteBoxStock.objects.get(site=detail.site_id,
                                             box_type=detail.box_type)
            stock.reserve_num -= detail.box_num
            stock.save()
            detail.flag = 1
            detail.save()
        appointment.flag = 2
        appointment.save()
    log.info("cancel appointment end....")
Exemplo n.º 2
0
def send_tms_push_message(alias_list, push_message):
    from tms.utils.jpush import push
    from tms.utils import logger
    log = logger.get_logger(__name__)
    try:
        push.push_alias(alias_list=alias_list, push_msg=push_message)
    except Exception as e:
        log.error(e)
Exemplo n.º 3
0
def update_site_box_stock():
    from monservice.models import SiteBoxStock
    from rentservice.utils import logger
    from django.conf import settings
    from rentservice.utils.redistools import RedisTool
    import json
    log = logger.get_logger(__name__)
    redis_pool = RedisTool()
    log.info("update_site_box_stock: compute begin")
    REDIS_KEY_SITE_BOX_STOCK = 'site_box_stock_update'
    try:
        conn = redis_pool.get_connection()
        len_queue = conn.llen(REDIS_KEY_SITE_BOX_STOCK)
        log.info("update_site_box_stock: len_queue = %s" % len_queue)
        site_type_ava_num_hash = {}
        site_type_reserv_num_hash = {}
        if len_queue > 0:
            # log.debug("update_list = %s" % update_list)
            for index in xrange(0, len_queue):
                try:
                    item = conn.lpop(REDIS_KEY_SITE_BOX_STOCK)
                    item_dict = json.loads(item)
                    tmp_key = str(item_dict['site']) + '#' + str(
                        item_dict['box_type'])
                    if tmp_key in site_type_ava_num_hash.keys():
                        try:
                            site_type_ava_num_hash[tmp_key] += int(
                                item_dict['ava_num'])
                        except Exception, e:
                            site_type_ava_num_hash[tmp_key] -= int(
                                item_dict['ava_num'])
                            log.error(repr(e))
                            log.error(
                                "update_site_box_stock: restore initial value")
                    else:
                        site_type_ava_num_hash[tmp_key] = int(
                            item_dict['ava_num'])
                    if tmp_key in site_type_reserv_num_hash.keys():
                        try:
                            site_type_reserv_num_hash[tmp_key] += int(
                                item_dict['reserve_num'])
                        except Exception, e:
                            site_type_reserv_num_hash[tmp_key] -= int(
                                item_dict['reserve_num'])
                            log.error(repr(e))
                            log.error(
                                "update_site_box_stock: restore initial value")
                    else:
                        site_type_reserv_num_hash[tmp_key] = int(
                            item_dict['reserve_num'])
                except Exception, e:
                    log.error(repr(e))
                    log.error(
                        "update_site_box_stock: redis queue consume failure, push message into queue again"
                    )
                    conn.rpush(REDIS_KEY_SITE_BOX_STOCK, item)
Exemplo n.º 4
0
def generate_site_stat():
    from monservice.models import SiteInfo
    from rentservice.models import RentLeaseInfo
    from rentservice.models import SiteStat
    from rentservice.models import SiteStatDetail
    from monservice.models import BoxTypeInfo
    from rentservice.utils import logger
    import uuid
    import datetime
    import pytz
    tz = pytz.timezone(settings.TIME_ZONE)
    log = logger.get_logger(__name__)
    log.info("statistic site box start...")
    # 轮询所有的仓库信息
    site_list = SiteInfo.objects.all()
    box_types = BoxTypeInfo.objects.all()
    now = datetime.datetime.now(tz=tz)
    start_time = now + datetime.timedelta(days=-1)
    stat_day = start_time.strftime('%Y-%m-%d')
    _count = SiteStat.objects.filter(stat_day=stat_day).count()
    if _count > 0:
        log.info("the count is %d" % _count)
        return
    log.info("generate site stat start........")
    for site in site_list:
        # 获取所有转出的箱子信息 上一日的所有数据
        box_out = RentLeaseInfo.objects.filter(
            off_site=site, lease_start_time__gte=start_time)
        # 获取所有入场的箱子信息 上一日的所有数据
        box_in = RentLeaseInfo.objects.filter(on_site=site,
                                              lease_end_time__gte=start_time)
        # 统计总数
        stat_id = str(uuid.uuid1())
        site_stat = SiteStat(stat_id=stat_id,
                             stat_day=stat_day,
                             total_in=box_in.count(),
                             total_out=box_out.count(),
                             site=site)
        site_stat.save()
        # 获取不同类型箱子的in & out
        box_type_stat = []
        for box_type in box_types:
            # box out count
            out_count = box_out.filter(box__type=box_type).count()
            # box in count
            in_count = box_in.filter(box__type=box_type).count()
            stat_detail = SiteStatDetail(detail_id=str(uuid.uuid1()),
                                         box_type=box_type,
                                         box_out=out_count,
                                         box_in=in_count,
                                         sitestat=site_stat)
            box_type_stat.append(stat_detail)
        SiteStatDetail.objects.bulk_create(box_type_stat)
    log.info('statistic site box end....')
Exemplo n.º 5
0
def cal_missing_alarm():
    from monservice.models import BoxInfo
    from util import logger
    log = logger.get_logger(__name__)
    try:
        log.info("cal missing alarm begin ...")
        result = BoxInfo.objects.raw(
            "SELECT deviceid,iot.cal_missing_alarm() from iot.monservice_boxinfo limit 1"
        )
        log.info("cal missing alarm result:" + str(len(list(result))))
        log.info("cal missing alarm end ...")
    except Exception, e:
        log.error('cal missing alarm error, msg:' + e.message)
Exemplo n.º 6
0
def update_box_bill_daily():
    from rentservice.models import BoxRentFeeDetail, RentLeaseInfo, EnterpriseUser
    from rentservice.utils import logger
    import uuid
    import datetime
    import pytz
    from django.conf import settings
    from django.db import transaction
    log = logger.get_logger(__name__)
    timezone = pytz.timezone(settings.TIME_ZONE)
    current_time = datetime.datetime.now(tz=timezone)
    log.info("update_box_bill_daily: compute begin")
    try:
        user_list = RentLeaseInfo.objects.filter(
            rent_status=1, sum_flag=0).values_list('user_id', flat=True)
        user_obj_list = EnterpriseUser.objects.select_related(
            'enterprise').filter(user_id__in=user_list)
        log.info("update_box_bill_daily: user_list = %s" % user_list)
        for user in user_obj_list:
            off_site_counts = 0
            on_site_counts = RentLeaseInfo.objects.filter(user_id=user,
                                                          rent_status=1,
                                                          sum_flag=0).count()
            rent_lease_info_list = RentLeaseInfo.objects.select_for_update(
            ).filter(user_id=user, rent_status=1, sum_flag=0)
            user_rent_fee_sum = 0
            with transaction.atomic():
                for rent_lease_info in rent_lease_info_list:
                    user_rent_fee_sum = user_rent_fee_sum + rent_lease_info.rent
                    rent_lease_info.sum_flag = 1
                    rent_lease_info.last_update_time = current_time
                    rent_lease_info.save()
                log.info(
                    "update_box_bill_daily: off_site_counts=%s, on_site_counts=%s"
                    % (off_site_counts, on_site_counts))
                box_rent_fee = BoxRentFeeDetail(detail_id=uuid.uuid1(),
                                                enterprise=user.enterprise,
                                                user=user,
                                                date=current_time,
                                                off_site_nums=off_site_counts,
                                                on_site_nums=on_site_counts,
                                                rent_fee=user_rent_fee_sum)
                box_rent_fee.save()
    except Exception, e:
        log.error(repr(e))
Exemplo n.º 7
0
def generate_tms_sensor_data():
    from tms.models import TruckFlume, SensorData
    from tms.utils import logger
    from tms.view.alarm import judge_alarm
    import time
    import random
    log = logger.get_logger(__name__)
    try:
        log.info('generate_tms_sensor_data task start')
        deviceids = TruckFlume.objects.distinct('deviceid')
        cnt = 0
        start_time = time.time()
        seners = []
        for deviceid in deviceids:
            s = SensorData(
                timestamp=time.time(),
                intimestamp=time.time(),
                deviceid=deviceid.deviceid,
                temperature=str(round(random.uniform(0, 15), 2)),
                longitude=str(round(random.uniform(74.696559, 134.018924), 6)),
                latitude=str(round(random.uniform(18.315171, 53.276964), 6)),
                salinity=str(round(random.uniform(0.1, 20), 2)),
                ph=str(round(random.uniform(0.1, 14), 2)),
                dissolved_oxygen=str(round(random.uniform(0.1, 10), 2)),  # 溶氧量
                chemical_oxygen_consumption=str(round(random.uniform(2, 3),
                                                      2)),  # 化学耗氧量
                transparency=str(round(random.uniform(0, 1), 2)),  # 透明度
                aqua=str(round(random.uniform(0, 1), 2)),  # 水色
                nutrient_salt_of_water=str(round(random.uniform(0, 1),
                                                 2)),  # 水体营养盐
                anaerobion=str(round(random.uniform(0, 1), 2)))  # 厌氧菌
            s.save()
            seners.append(s)
            cnt += 1
        end_time = time.time()
        log.info('generate_tms_sensor_data task end,insert ' + str(cnt) +
                 ' records,in' + str(end_time - start_time) + 'secs')

        judge_alarm(seners)

    except Exception, e:
        log.error(repr(e))
Exemplo n.º 8
0
def billing():
    from rentservice.models import RentLeaseInfo
    from rentservice.utils import logger
    import datetime
    import pytz
    tz = pytz.timezone(settings.TIME_ZONE)
    log = logger.get_logger(__name__)
    log.info("billing begin ...")
    rent_info_list = RentLeaseInfo.objects.filter(rent_status=0)
    for rent_info in rent_info_list:
        if rent_info.rent_fee_rate == 0:
            price_per_hour = int(rent_info.box.type.price)
        else:
            price_per_hour = rent_info.rent_fee_rate
        current_time = datetime.datetime.now(tz=tz)
        rent_hour_delta = current_time.hour - rent_info.lease_start_time.hour
        rent_info.rent = price_per_hour * rent_hour_delta
        log.info("lease_info_id=%s, current rent=%s" %
                 (rent_info.lease_info_id, rent_info.rent))
        rent_info.save()
    log.info("billing end ...")
Exemplo n.º 9
0
def update_smarttms_redis_auth_info():
    from smarttms.models import AccessGroup, AccessUrlGroup, AuthUserGroup
    from smarttms.serializers import AccessGroupSerializer, AuthUserGroupSerializer, AccessUrlGroupSerializer
    from smarttms.utils import logger
    from smarttms.utils.redistools import RedisTool
    PERMISSION_GROUP_HASH = 'smarttms_permissions_group_hash'
    PERMISSION_URL_HASH = 'smarttms_permissions_url_hash'
    log = logger.get_logger(__name__)
    log.info("smarttms_update_redis_auth_info begin")
    try:
        redis_pool = RedisTool()
        conn = redis_pool.get_connection()
        access_group_ret = AccessGroup.objects.all()
        access_group_list = AccessGroupSerializer(access_group_ret,
                                                  many=True).data
        groupid_group_dic = {}
        for item in access_group_list:
            groupid_group_dic[item['access_group_id']] = item['group']
        ret = AuthUserGroup.objects.all()
        auth_user_group = AuthUserGroupSerializer(ret, many=True).data
        for item in auth_user_group:
            conn.hset(PERMISSION_GROUP_HASH, item['user_token'],
                      groupid_group_dic[item['group']])
        for item_access_group in access_group_list:
            ret = AccessUrlGroup.objects.filter(
                access_group__group=item_access_group['group'])
            access_url_list = []
            access_url_group = AccessUrlGroupSerializer(ret, many=True).data
            for item in access_url_group:
                access_url_list.append(item['access_url_set'])
            if access_url_list:
                final_hash_value = ','.join(access_url_list)
            else:
                final_hash_value = ''
            if final_hash_value:
                conn.hset(PERMISSION_URL_HASH, item_access_group['group'],
                          final_hash_value)
    except Exception, e:
        log.error(repr(e))
Exemplo n.º 10
0
def dump_sensor_data():
    import os
    import time
    import zipfile
    from util import logger
    from monservice.models import SensorData
    log = logger.get_logger(__name__)
    try:
        log.info("dump sensor data begin ...")
        end_time_str = str(
            time.strftime('%Y-%m-%d', time.localtime(int(
                time.time())))) + ' 00:00:00'
        end_time = int(
            time.mktime(time.strptime(end_time_str, '%Y-%m-%d %H:%M:%S')))
        start_time = end_time - 3600 * 24
        txt_file_name = 'sensor_data_' + time.strftime(
            '%Y-%m-%d', time.localtime(start_time)) + '.txt'
        zip_file_name = 'sensor_data_' + time.strftime(
            '%Y-%m-%d', time.localtime(start_time)) + '.zip'
        save_path = '/opt/pg-data/dump_data/'
        full_name = save_path + txt_file_name
        SensorData.objects. \
            filter(timestamp__gte=start_time, timestamp__lt=end_time).to_csv(full_name)
        log.info("dump sensor data finish, file_name:" + full_name)
        if os.path.exists(full_name):
            f = zipfile.ZipFile(save_path + zip_file_name, 'w',
                                zipfile.ZIP_DEFLATED)
            f.write(full_name, txt_file_name)
            f.close()
            log.info("zip file finish, zip file name:" + zip_file_name)
            os.remove(full_name)
            log.info("remove file finish, file_name:" + full_name)
        else:
            log.error("dump sensor data error, file_name:" + full_name)
    except Exception, e:
        log.error('dump sensor data error, msg:' + e.message)
Exemplo n.º 11
0
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from rest_framework import views
from rest_framework.parsers import FileUploadParser
from rest_framework.response import Response
import os
from rentservice.utils import logger
from rentservice.utils.retcode import retcode, errcode
import uuid
from qiniu import Auth, put_file, etag, urlsafe_base64_encode
import qiniu.config
import base64

log = logger.get_logger(__name__)


class FileUploadView(views.APIView):
    parser_classes = (FileUploadParser, )
    access_key = 'WlfLj84tEqH7_FX-GhAnj30OmhreeeUYtBYgwnCN'
    secret_key = 'O8efy3dIot_jv-xyh7kC_QBZ_2bUca5C4bdH7PXj'
    bucket_name = 'cloudbox'
    base_url = 'oyzmceglk.bkt.clouddn.com'

    def put(self, request, filename, format=None):
        file_obj = request.data['file']
        ret = {'status': False, 'data': None, 'error': None}
        f = open(os.path.join('.', file_obj.name), 'wb')
        try:
            if file_obj.multiple_chunks():
                for chunk in file_obj.chunks():
Exemplo n.º 12
0
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.parsers import JSONParser
from rentservice.models import EnterpriseUser, AuthUserGroup, AccessGroup
from rentservice.utils.retcode import retcode, errcode
from rentservice.utils.logger import get_logger
from rest_framework.settings import api_settings
from rentservice.serializers import AccessGroupSerializer, EnterpriseUserSerializer
import hashlib
from django.conf import settings
import time
import uuid
from rentservice.utils.redistools import RedisTool

USER_ALIAS_ID_HASH = 'user_alias_id_hash'
log = get_logger(__name__)

# @csrf_exempt
# @api_view(['POST'])
# def add_user(request):
#     ret = {}
#     data = JSONParser().parse(request)
#     try:
#         username = data['username']
#     except Exception:
#         return JsonResponse(retcode({}, "9999", '注册姓名不能为空'), safe=True, status=status.HTTP_400_BAD_REQUEST)
#     try:
#         password = data['password']
#     except Exception:
#         return JsonResponse(retcode({}, "9999", '注册密码不能为空'), safe=True, status=status.HTTP_400_BAD_REQUEST)
#     try:
Exemplo n.º 13
0
def update_box_bill_month_async():
    from rentservice.models import BoxRentFeeDetail, EnterpriseInfo, BoxRentFeeByMonth
    from rentservice.utils import logger
    import uuid
    import datetime
    import pytz
    from django.conf import settings
    log = logger.get_logger(__name__)
    timezone = pytz.timezone(settings.TIME_ZONE)
    log.info("update_box_bill_daily: compute begin")
    current_time = datetime.datetime.now(tz=timezone)
    if BoxRentFeeDetail.objects.all().count() > 0:
        log.info("box_rent_fee_month_billing: compute begin")
        try:
            enterprise_list = BoxRentFeeDetail.objects.values(
                'enterprise').distinct()
            for enterprise in enterprise_list:
                enterprise_obj = EnterpriseInfo.objects.get(
                    enterprise_id=enterprise['enterprise'])
                query_list = BoxRentFeeDetail.objects.filter(
                    enterprise=enterprise_obj,
                    date__year=current_time.year,
                    date__month=current_time.month)
                off_site_box_nums_month = 0
                on_site_box_nums_month = 0
                rent_fee_month = 0
                for box_rent_day in query_list:
                    rent_fee_month = rent_fee_month + box_rent_day.rent_fee
                    on_site_box_nums_month = on_site_box_nums_month + box_rent_day.on_site_nums
                    off_site_box_nums_month = off_site_box_nums_month + box_rent_day.off_site_nums
                log.info(
                    "enterprise_id = %s, rent_fee_month=%s, on_site_box_nums_month=%s,off_site_box_nums_month=%s"
                    % (enterprise['enterprise'], rent_fee_month,
                       on_site_box_nums_month, off_site_box_nums_month))
                try:
                    box_rent_bill_month = BoxRentFeeByMonth.objects.get(
                        enterprise=enterprise_obj,
                        date__year=current_time.year,
                        date__month=current_time.month)
                    box_rent_bill_month.rent_fee = rent_fee_month
                    box_rent_bill_month.off_site_nums = off_site_box_nums_month
                    box_rent_bill_month.on_site_nums = on_site_box_nums_month
                    box_rent_bill_month.save()
                except BoxRentFeeByMonth.DoesNotExist, e:
                    month_date = datetime.datetime(year=current_time.year,
                                                   month=current_time.month,
                                                   day=1,
                                                   hour=12,
                                                   tzinfo=timezone)
                    box_rent_fee = BoxRentFeeByMonth(
                        detail_id=uuid.uuid1(),
                        enterprise=enterprise_obj,
                        date=month_date,
                        off_site_nums=off_site_box_nums_month,
                        on_site_nums=on_site_box_nums_month,
                        rent_fee=rent_fee_month)
                    box_rent_fee.save()
                    log.error(repr(e))
        except Exception, e:
            log.error(repr(e))
        log.info("box_rent_fee_month_billing: compute finsih")
Exemplo n.º 14
0
def box_rent_fee_daily_billing():
    from rentservice.models import RentLeaseInfo, EnterpriseUser, BoxRentFeeDetail
    from rentservice.serializers import BoxRentFeeDetailSerializer, RentLeaseBoxSerializer
    from rentservice.utils import logger
    import datetime
    import pytz
    import uuid
    tz = pytz.timezone(settings.TIME_ZONE)
    log = logger.get_logger(__name__)
    log.info("BoxRentFee billing begin ...")
    current_time = datetime.datetime.now(tz=tz)
    if RentLeaseInfo.objects.all().count() > 0:
        user_list = RentLeaseInfo.objects.values_list('user_id', flat=True)
        user_obj_list = EnterpriseUser.objects.filter(user_id__in=user_list)
        # log.info("box_rent_fee_billing: user_list=%s" % user_list)
        for user in user_obj_list:
            off_site_counts = RentLeaseInfo.objects.filter(
                user_id=user,
                last_update_time__day=current_time.day - 1,
                lease_start_time__day=current_time.day - 1).count()
            on_site_counts = RentLeaseInfo.objects.filter(
                user_id=user,
                last_update_time__day=current_time.day - 1,
                lease_end_time__day=current_time.day - 1).count()
            log.info(
                "box_rent_fee_billing: off_site_counts=%s, on_site_counts=%s" %
                (off_site_counts, on_site_counts))
            try:
                log.info("box_rent_fee_billing: begin compute")
                user_lease_info_list = RentLeaseInfo.objects.filter(
                    user_id=user)
                if user_lease_info_list.count() == 0:
                    log.info(
                        "box_rent_fee_billing: user_lease_info_list is null")
                log.info("box_rent_fee_billing: user_lease_info_list = %s" %
                         RentLeaseBoxSerializer(user_lease_info_list,
                                                many=True).data)
                user_total_rent_fee = 0
                for lease in user_lease_info_list:
                    if lease.rent_fee_rate == 0:
                        price_per_hour = int(lease.box.type.price)
                    else:
                        price_per_hour = lease.rent_fee_rate
                    log.info(
                        "box_rent_fee_billing: id=%s, price_per_hour=%s, rent_fee_rate=%s"
                        % (lease.lease_info_id, price_per_hour,
                           lease.rent_fee_rate))
                    if lease.rent_status == 0:
                        user_total_rent_fee = user_total_rent_fee + price_per_hour * 24
                        log.info(
                            "box_rent_fee_billing: still billing user_total_rent_fee=%s"
                            % user_total_rent_fee)
                    else:
                        delta_hour = current_time.hour - lease.lease_end_time.hour
                        delta_day = current_time.day - lease.lease_end_time.day
                        delta_month = current_time.month - lease.lease_end_time.month
                        delta_year = current_time.month - lease.lease_end_time.year
                        if (delta_hour <= 24 and delta_hour > 0) and delta_day == 0 \
                                and delta_month == 0 and delta_year == 0:
                            user_total_rent_fee = user_total_rent_fee + price_per_hour * (
                                delta_hour)
                            log.info(
                                "lease id = %s, box lease finished, the last delat hour is %s, rent rate is %s"
                                % (lease.lease_info_id, delta_hour,
                                   price_per_hour))
                        else:
                            log.info(
                                "lease id = %s, box lease finished, terminate rent_billing"
                                % lease.lease_info_id)
                    lease.last_update_time = current_time
                    lease.save()
                    log.info(
                        "box_rent_fee_billing: update last_update_time succ")
                box_rent_fee = BoxRentFeeDetail(detail_id=uuid.uuid1(),
                                                enterprise=user.enterprise,
                                                user=user,
                                                date=current_time,
                                                off_site_nums=off_site_counts,
                                                on_site_nums=on_site_counts,
                                                rent_fee=user_total_rent_fee)
                box_rent_fee.save()
                log.info("save box_rent_fee == %s" %
                         BoxRentFeeDetailSerializer(box_rent_fee).data)
                log.info("box_rent_fee_billing: compute finsih")
            except Exception, e:
                log.error(repr(e))