| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 | import jsonimport threadingimport timeimport oss2from django.db import transactionfrom django.views.generic.base import Viewfrom Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, PUSH_BUCKET, PUSH_INACCURATE_BUCKETfrom Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, LOGGERfrom Model.models import FeedBackModel, StatResModel, PushInaccurateFeedbackfrom Object.AWS.AmazonS3Util import AmazonS3Utilfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Object.utils import LocalDateTimeUtilfrom Service.CommonService import CommonServicefrom Service.ModelService import ModelServicefrom Service.EquipmentInfoService import EquipmentInfoServiceclass FeedBackView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation', None)        return self.validation(request.GET, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation', None)        return self.validation(request.POST, operation)    def validation(self, request_dict, operation):        response = ResponseObject()        token = request_dict.get('token', None)        tko = TokenObject(token)        if tko.code == 0:            userID = tko.userID            if operation == 'add':                return self.do_add(userID, request_dict, response)            elif operation == 'getUploadUrl':                return self.do_get_upload_url(request_dict, response)            elif operation == 'query':                return self.do_query(userID, request_dict, response)            elif operation == 'delete':                return self.do_delete(userID, request_dict, response)            elif operation == 'queryByAdmin':                return self.do_query_by_admin(userID, request_dict, response)            elif operation == 'deleteByAdmin':                return self.do_delete_by_admin(userID, request_dict, response)            elif operation == 'deleteImage':                return self.do_delete_image(userID, request_dict, response)            elif operation == 'submitted':  # 查询是否已提交过推送图片反馈                return self.submitted(userID, request_dict, response)            elif operation == 'pushInaccurate':  # 用户反馈推送不准确                return self.push_inaccurate(userID, request_dict, response)            else:                return response.json(414)        else:            return response.json(tko.code)    def do_query(self, userID, request_dict, response):        page = request_dict.get('page', None)        line = request_dict.get('line', None)        if page and line:            page = int(page)            line = int(line)        else:            return response.json(444, 'page,line')        fb_qs = FeedBackModel.objects.filter(userID_id=userID)[(page - 1) * line:page * line]. \            values('id', 'status', 'content', 'addTime', 'updTime', 'type')        sid_list = []        for fb in fb_qs:            sid_list.append(fb['id'])        sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name', 'feedbackmodel__id')        # return response.json(0,list(sm_qs))        auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)        bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')        res = []        for fb in fb_qs:            fb['img_url'] = []            for sm in sm_qs:                if sm['feedbackmodel__id'] == fb['id']:                    obj = 'feedback/' + sm['name']                    img_url = bucket.sign_url('GET', obj, 3600)                    fb['img_url'].append(img_url)                    # fb['FS__name'] = sm['name']            res.append(fb)        return response.json(0, res)    def do_add(self, userID, request_dict, response):        nowTime = int(time.time())        content = request_dict.get('content', None)        type = request_dict.get('type', None)        res_1 = request_dict.get('res_1', None)        res_2 = request_dict.get('res_2', None)        res_3 = request_dict.get('res_3', None)        app = request_dict.get('app', None)        phone_model = request_dict.get('phone_model', None)        os_version = request_dict.get('os_version', None)        uid = request_dict.get('uid', None)        product_type = request_dict.get('product_type', None)        app_version = request_dict.get('app_version', None)        appBundleId = request_dict.get('appBundleId', None)        email = request_dict.get('email', None)        score = request_dict.get('score', None)        try:            with transaction.atomic():                fb = FeedBackModel()                fb.addTime = nowTime                fb.updTime = nowTime                fb.content = content                if type:                    fb.type = type                if app:                    fb.app = app                if phone_model:                    fb.phone_model = phone_model                if os_version:                    fb.os_version = os_version                if uid:                    fb.uid = uid                if product_type:                    fb.product_type = product_type                if app_version:                    fb.app_version = app_version                if appBundleId:                    fb.appBundleId = appBundleId                if email:                    fb.email = email                if score:                    fb.score = score                fb.userID_id = userID                fb.save()                if res_1:                    fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_1))                if res_2:                    fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_2))                if res_3:                    fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_3))        except Exception as e:            print(repr(e))            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))        else:            return response.json(0)    def do_get_upload_url(self, request_dict, response):        uploadType = request_dict.get('uploadType', None)        uploadType = json.loads(uploadType)        if len(uploadType):            res = []            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)            bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')            for upType in uploadType:                name = CommonService.createOrderID()                s_name = str(name) + '.' + upType                obj = 'feedback/' + s_name                url = bucket.sign_url('PUT', obj, 7200)                res.append({'put_url': url, 'res_name': s_name})            return response.json(0, res)        else:            return response.json(444, 'uploadType')    def do_delete(self, userID, request_dict, response):        id = request_dict.get('id', None)        try:            fb_qs = FeedBackModel.objects.get(userID_id=userID, id=id)            sr_id_list = fb_qs.FS.values_list('id', flat=True)            StatResModel.objects.filter(id__in=sr_id_list).delete()            fb_qs.delete()            # is_delete = StatResModel.objects.filter(id__in=sr_id_list).delete()            # print(is_delete)            print('----------')        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))        else:            return response.json(0)    def do_query_by_admin(self, userID, request_dict, response):        own_perm = ModelService.check_perm(userID, 30)        if own_perm:            page = request_dict.get('page', None)            line = request_dict.get('line', None)            status = request_dict.get('status', None)            username = request_dict.get('username', None)            type = request_dict.get('type', None)            if page and line:                page = int(page)                line = int(line)                filter_data = {}                if status:                    filter_data = {'status': status}                if username:                    filter_data = {'userID_id': ModelService.get_userID_byname(username)}                if type:                    filter_data = {'type': type}                try:                    fb_qs = FeedBackModel.objects.filter()                except Exception as e:                    return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))                print('----------')                if filter_data:                    fb_qs = fb_qs.filter(**filter_data)                count = fb_qs.count()                fb_qs = fb_qs[(page - 1) * line:page * line].values('id', 'type', 'status', 'content', 'addTime', 'app',                                                                    'uid', 'os_version', 'phone_model', 'product_type',                                                                    'updTime', 'userID__username', 'userID__phone',                                                                    'userID__userEmail', 'app_version', 'appBundleId',                                                                    'email', 'score'                                                                    )                sid_list = []                print(fb_qs)                for fb in fb_qs:                    sid_list.append(fb['id'])                sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name',                                                                                           'feedbackmodel__id')                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)                bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')                res = []                print(sm_qs)                for fb in fb_qs:                    fb['img_url'] = []                    for sm in sm_qs:                        if sm['feedbackmodel__id'] == fb['id']:                            obj = 'feedback/' + sm['name']                            img_url = bucket.sign_url('GET', obj, 3600)                            # img_url.replace('statres.oss-cn-hongkong.aliyuncs.com','static.zositech.xyz')                            fb['img_url'].append(img_url)                            # fb['FS__name'] = sm['name']                            if fb['userID__username'] == '':                                fb['userID__username'] = fb['userID__userEmail']                            if fb['userID__username'] == '':                                fb['userID__username'] = fb['userID__phone']                    res.append(fb)                return response.json(0, {'datas': res, 'count': count})            else:                return response.json(444, 'page,line')        else:            return response.json(404)    def do_delete_by_admin(self, userID, request_dict, response):        own_perm = ModelService.check_perm(userID, 10)        if own_perm:            id = request_dict.get('id', None)            try:                fb_qs = FeedBackModel.objects.get(id=id)                sr_id_list = fb_qs.FS.values_list('id', flat=True)                StatResModel.objects.filter(id__in=sr_id_list).delete()                fb_qs.delete()                print('----------')            except Exception as e:                return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))            else:                return response.json(0)        else:            return response.json(404)    def do_delete_image(self, userID, request_dict, response):        # own_perm = ModelService.check_perm(userID, 10)        # if not own_perm:        #     return response.json(404)        end_time = request_dict.get('end_time', None)        if end_time is None:            return response.json(444)        sys_ms_qs = FeedBackModel.objects.filter(addTime__lt=end_time).order_by('id').values('id')        ids = []        for sys_ms in sys_ms_qs:            ids.append(sys_ms['id'])        sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=ids).values('id', 'name')        names = []        time_struct = time.localtime()        current_year = time_struct.tm_year        target_year = current_year - 1        str_prefix = str(target_year)        print(str_prefix)        for sm in sm_qs:            name = sm['name']            if name.find(str_prefix) == 0:                names.append('feedback/' + name)        # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)        # bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')        # bucket.batch_delete_objects(names)        # FeedBackModel.objects.filter(id__in=ids).delete()        print(names)        print(len(names))        return response.json(0)    @staticmethod    def submitted(user_id, request_dict, response):        equipment_info_id = request_dict.get('equipment_info_id', None)        uid = request_dict.get('uid', None)        is_st = request_dict.get('is_st', None)        event_type = request_dict.get('event_type', None)        event_time = request_dict.get('event_time', None)        channel = request_dict.get('channel', None)        if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):            return response.json(444)        is_st, event_type, channel = int(is_st), int(event_type), int(channel)        # 查询数据是否存在        push_inaccurate_feedback_qs = PushInaccurateFeedback.objects.filter(equipment_info_id=equipment_info_id,                                                                            user_id=user_id, uid=uid, channel=channel,                                                                            event_type=event_type,                                                                            event_time=event_time,                                                                            is_st=is_st)        if push_inaccurate_feedback_qs.exists():            return response.json(174)        # 查询图片是否存在s3        if is_st == 3:            key = '{uid}/{channel}/{event_time}_0.jpeg'.format(uid=uid, channel=channel, event_time=event_time)        else:            key = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid, channel=channel, event_time=event_time)        try:            s3 = AmazonS3Util(                aws_access_key_id=ACCESS_KEY_ID,                secret_access_key=SECRET_ACCESS_KEY,                region_name=REGION_NAME            )            have_object = s3.get_object(PUSH_BUCKET, key)            if have_object:                return response.json(0)            else:                return response.json(174)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @staticmethod    def push_inaccurate(user_id, request_dict, response):        equipment_info_id = request_dict.get('equipment_info_id', None)        uid = request_dict.get('uid', None)        is_st = request_dict.get('is_st', None)        event_type = request_dict.get('event_type', None)        event_time = request_dict.get('event_time', None)        channel = request_dict.get('channel', None)        tag = request_dict.get('tag', '')        if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):            return response.json(444)        try:            thread = threading.Thread(target=FeedBackView.asyn_push_inaccurate,                                      args=(                                          equipment_info_id, uid, channel, user_id, event_type, event_time, int(is_st),                                          tag,))            thread.start()            return response.json(0)        except Exception as e:            return response.json(500, repr(e))    @staticmethod    def asyn_push_inaccurate(equipment_info_id, uid, channel, user_id, event_type, event_time, is_st, tag):        try:            # 默认查询近七天内数据            now_time = int(time.time())            start_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)            uid_list = uid.split(',')            equipment_info_qs, count = EquipmentInfoService. \                union_equipment_info(user_id, uid_list, event_type, start_time, now_time, 1, 10, event_time)            identify_type = 1 if equipment_info_qs[0]['eventTag'] else 0            s3 = AmazonS3Util(                aws_access_key_id=ACCESS_KEY_ID,                secret_access_key=SECRET_ACCESS_KEY,                region_name=REGION_NAME            )            if is_st != 3:                file_path = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid,                                                                       channel=channel,                                                                       event_time=event_time)                s3.copy_obj(PUSH_BUCKET, PUSH_INACCURATE_BUCKET, file_path)            else:                for index in range(3):                    file_path = '{uid}/{channel}/{event_time}_{index}.jpeg'.format(uid=uid,                                                                                   channel=channel,                                                                                   event_time=event_time,                                                                                   index=index)                    if s3.get_object(PUSH_BUCKET, file_path):                        s3.copy_obj(PUSH_BUCKET, PUSH_INACCURATE_BUCKET, file_path)            PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id, user_id=user_id,                                                  event_type=event_type, uid=uid, channel=channel,                                                  add_time=now_time, tag=tag, is_st=is_st, event_time=event_time,                                                  identify_type=identify_type)        except Exception as e:            LOGGER.info('asyn_push_inaccurate, errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 |