FeedBack.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. import json
  2. import time
  3. import oss2
  4. from django.db import transaction
  5. from django.views.generic.base import View
  6. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, PUSH_BUCKET, PUSH_INACCURATE_BUCKET
  7. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
  8. from Model.models import FeedBackModel, StatResModel, PushInaccurateFeedback
  9. from Object.AWS.AmazonS3Util import AmazonS3Util
  10. from Object.ResponseObject import ResponseObject
  11. from Object.TokenObject import TokenObject
  12. from Object.utils import LocalDateTimeUtil
  13. from Service.CommonService import CommonService
  14. from Service.ModelService import ModelService
  15. from Service.EquipmentInfoService import EquipmentInfoService
  16. class FeedBackView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation', None)
  20. return self.validation(request.GET, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation', None)
  24. return self.validation(request.POST, operation)
  25. def validation(self, request_dict, operation):
  26. response = ResponseObject()
  27. token = request_dict.get('token', None)
  28. tko = TokenObject(token)
  29. if tko.code == 0:
  30. userID = tko.userID
  31. if operation == 'add':
  32. return self.do_add(userID, request_dict, response)
  33. elif operation == 'getUploadUrl':
  34. return self.do_get_upload_url(request_dict, response)
  35. elif operation == 'query':
  36. return self.do_query(userID, request_dict, response)
  37. elif operation == 'delete':
  38. return self.do_delete(userID, request_dict, response)
  39. elif operation == 'queryByAdmin':
  40. return self.do_query_by_admin(userID, request_dict, response)
  41. elif operation == 'deleteByAdmin':
  42. return self.do_delete_by_admin(userID, request_dict, response)
  43. elif operation == 'deleteImage':
  44. return self.do_delete_image(userID, request_dict, response)
  45. elif operation == 'submitted': # 查询是否已提交过推送图片反馈
  46. return self.submitted(userID, request_dict, response)
  47. elif operation == 'pushInaccurate': # 用户反馈推送不准确
  48. return self.push_inaccurate(userID, request_dict, response)
  49. else:
  50. return response.json(414)
  51. else:
  52. return response.json(tko.code)
  53. def do_query(self, userID, request_dict, response):
  54. page = request_dict.get('page', None)
  55. line = request_dict.get('line', None)
  56. if page and line:
  57. page = int(page)
  58. line = int(line)
  59. else:
  60. return response.json(444, 'page,line')
  61. fb_qs = FeedBackModel.objects.filter(userID_id=userID)[(page - 1) * line:page * line]. \
  62. values('id', 'status', 'content', 'addTime', 'updTime', 'type')
  63. sid_list = []
  64. for fb in fb_qs:
  65. sid_list.append(fb['id'])
  66. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name', 'feedbackmodel__id')
  67. # return response.json(0,list(sm_qs))
  68. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  69. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  70. res = []
  71. for fb in fb_qs:
  72. fb['img_url'] = []
  73. for sm in sm_qs:
  74. if sm['feedbackmodel__id'] == fb['id']:
  75. obj = 'feedback/' + sm['name']
  76. img_url = bucket.sign_url('GET', obj, 3600)
  77. fb['img_url'].append(img_url)
  78. # fb['FS__name'] = sm['name']
  79. res.append(fb)
  80. return response.json(0, res)
  81. def do_add(self, userID, request_dict, response):
  82. nowTime = int(time.time())
  83. content = request_dict.get('content', None)
  84. type = request_dict.get('type', None)
  85. res_1 = request_dict.get('res_1', None)
  86. res_2 = request_dict.get('res_2', None)
  87. res_3 = request_dict.get('res_3', None)
  88. app = request_dict.get('app', None)
  89. phone_model = request_dict.get('phone_model', None)
  90. os_version = request_dict.get('os_version', None)
  91. uid = request_dict.get('uid', None)
  92. product_type = request_dict.get('product_type', None)
  93. app_version = request_dict.get('app_version', None)
  94. appBundleId = request_dict.get('appBundleId', None)
  95. email = request_dict.get('email', None)
  96. score = request_dict.get('score', None)
  97. try:
  98. with transaction.atomic():
  99. fb = FeedBackModel()
  100. fb.addTime = nowTime
  101. fb.updTime = nowTime
  102. fb.content = content
  103. if type:
  104. fb.type = type
  105. if app:
  106. fb.app = app
  107. if phone_model:
  108. fb.phone_model = phone_model
  109. if os_version:
  110. fb.os_version = os_version
  111. if uid:
  112. fb.uid = uid
  113. if product_type:
  114. fb.product_type = product_type
  115. if app_version:
  116. fb.app_version = app_version
  117. if appBundleId:
  118. fb.appBundleId = appBundleId
  119. if email:
  120. fb.email = email
  121. if score:
  122. fb.score = score
  123. fb.userID_id = userID
  124. fb.save()
  125. if res_1:
  126. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_1))
  127. if res_2:
  128. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_2))
  129. if res_3:
  130. fb.FS.add(StatResModel.objects.create(addTime=nowTime, name=res_3))
  131. except Exception as e:
  132. print(repr(e))
  133. return response.json(500, repr(e))
  134. else:
  135. return response.json(0)
  136. def do_get_upload_url(self, request_dict, response):
  137. uploadType = request_dict.get('uploadType', None)
  138. uploadType = json.loads(uploadType)
  139. if len(uploadType):
  140. res = []
  141. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  142. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  143. for upType in uploadType:
  144. name = CommonService.createOrderID()
  145. s_name = str(name) + '.' + upType
  146. obj = 'feedback/' + s_name
  147. url = bucket.sign_url('PUT', obj, 7200)
  148. res.append({'put_url': url, 'res_name': s_name})
  149. return response.json(0, res)
  150. else:
  151. return response.json(444, 'uploadType')
  152. def do_delete(self, userID, request_dict, response):
  153. id = request_dict.get('id', None)
  154. try:
  155. fb_qs = FeedBackModel.objects.get(userID_id=userID, id=id)
  156. sr_id_list = fb_qs.FS.values_list('id', flat=True)
  157. StatResModel.objects.filter(id__in=sr_id_list).delete()
  158. fb_qs.delete()
  159. # is_delete = StatResModel.objects.filter(id__in=sr_id_list).delete()
  160. # print(is_delete)
  161. print('----------')
  162. except Exception as e:
  163. return response.json(500, repr(e))
  164. else:
  165. return response.json(0)
  166. def do_query_by_admin(self, userID, request_dict, response):
  167. own_perm = ModelService.check_perm(userID, 30)
  168. if own_perm:
  169. page = request_dict.get('page', None)
  170. line = request_dict.get('line', None)
  171. status = request_dict.get('status', None)
  172. username = request_dict.get('username', None)
  173. type = request_dict.get('type', None)
  174. if page and line:
  175. page = int(page)
  176. line = int(line)
  177. filter_data = {}
  178. if status:
  179. filter_data = {'status': status}
  180. if username:
  181. filter_data = {'userID_id': ModelService.get_userID_byname(username)}
  182. if type:
  183. filter_data = {'type': type}
  184. try:
  185. fb_qs = FeedBackModel.objects.filter()
  186. except Exception as e:
  187. return response.json(500, repr(e))
  188. print('----------')
  189. if filter_data:
  190. fb_qs = fb_qs.filter(**filter_data)
  191. count = fb_qs.count()
  192. fb_qs = fb_qs[(page - 1) * line:page * line].values('id', 'type', 'status', 'content', 'addTime', 'app',
  193. 'uid', 'os_version', 'phone_model', 'product_type',
  194. 'updTime', 'userID__username', 'userID__phone',
  195. 'userID__userEmail', 'app_version', 'appBundleId',
  196. 'email', 'score'
  197. )
  198. sid_list = []
  199. print(fb_qs)
  200. for fb in fb_qs:
  201. sid_list.append(fb['id'])
  202. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=sid_list).values('id', 'name',
  203. 'feedbackmodel__id')
  204. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  205. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  206. res = []
  207. print(sm_qs)
  208. for fb in fb_qs:
  209. fb['img_url'] = []
  210. for sm in sm_qs:
  211. if sm['feedbackmodel__id'] == fb['id']:
  212. obj = 'feedback/' + sm['name']
  213. img_url = bucket.sign_url('GET', obj, 3600)
  214. # img_url.replace('statres.oss-cn-hongkong.aliyuncs.com','static.zositech.xyz')
  215. fb['img_url'].append(img_url)
  216. # fb['FS__name'] = sm['name']
  217. if fb['userID__username'] == '':
  218. fb['userID__username'] = fb['userID__userEmail']
  219. if fb['userID__username'] == '':
  220. fb['userID__username'] = fb['userID__phone']
  221. res.append(fb)
  222. return response.json(0, {'datas': res, 'count': count})
  223. else:
  224. return response.json(444, 'page,line')
  225. else:
  226. return response.json(404)
  227. def do_delete_by_admin(self, userID, request_dict, response):
  228. own_perm = ModelService.check_perm(userID, 10)
  229. if own_perm:
  230. id = request_dict.get('id', None)
  231. try:
  232. fb_qs = FeedBackModel.objects.get(id=id)
  233. sr_id_list = fb_qs.FS.values_list('id', flat=True)
  234. StatResModel.objects.filter(id__in=sr_id_list).delete()
  235. fb_qs.delete()
  236. print('----------')
  237. except Exception as e:
  238. return response.json(500, repr(e))
  239. else:
  240. return response.json(0)
  241. else:
  242. return response.json(404)
  243. def do_delete_image(self, userID, request_dict, response):
  244. # own_perm = ModelService.check_perm(userID, 10)
  245. # if not own_perm:
  246. # return response.json(404)
  247. end_time = request_dict.get('end_time', None)
  248. if end_time is None:
  249. return response.json(444)
  250. sys_ms_qs = FeedBackModel.objects.filter(addTime__lt=end_time).order_by('id').values('id')
  251. ids = []
  252. for sys_ms in sys_ms_qs:
  253. ids.append(sys_ms['id'])
  254. sm_qs = StatResModel.objects.filter(feedbackmodel__id__in=ids).values('id', 'name')
  255. names = []
  256. time_struct = time.localtime()
  257. current_year = time_struct.tm_year
  258. target_year = current_year - 1
  259. str_prefix = str(target_year)
  260. print(str_prefix)
  261. for sm in sm_qs:
  262. name = sm['name']
  263. if name.find(str_prefix) == 0:
  264. names.append('feedback/' + name)
  265. # auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  266. # bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  267. # bucket.batch_delete_objects(names)
  268. # FeedBackModel.objects.filter(id__in=ids).delete()
  269. print(names)
  270. print(len(names))
  271. return response.json(0)
  272. @staticmethod
  273. def submitted(user_id, request_dict, response):
  274. equipment_info_id = request_dict.get('equipment_info_id', None)
  275. uid = request_dict.get('uid', None)
  276. is_st = request_dict.get('is_st', None)
  277. event_type = request_dict.get('event_type', None)
  278. event_time = request_dict.get('event_time', None)
  279. channel = request_dict.get('channel', None)
  280. if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
  281. return response.json(444)
  282. is_st, event_type, channel = int(is_st), int(event_type), int(channel)
  283. # 查询数据是否存在
  284. push_inaccurate_feedback_qs = PushInaccurateFeedback.objects.filter(equipment_info_id=equipment_info_id,
  285. user_id=user_id, uid=uid, channel=channel,
  286. event_type=event_type,
  287. event_time=event_time,
  288. is_st=is_st)
  289. if push_inaccurate_feedback_qs.exists():
  290. return response.json(174)
  291. # 查询图片是否存在s3
  292. if is_st == 3:
  293. key = '{uid}/{channel}/{event_time}_0.jpeg'.format(uid=uid, channel=channel, event_time=event_time)
  294. else:
  295. key = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid, channel=channel, event_time=event_time)
  296. try:
  297. s3 = AmazonS3Util(
  298. aws_access_key_id=ACCESS_KEY_ID,
  299. secret_access_key=SECRET_ACCESS_KEY,
  300. region_name=REGION_NAME
  301. )
  302. have_object = s3.get_object(PUSH_BUCKET, key)
  303. if have_object:
  304. return response.json(0)
  305. else:
  306. return response.json(174)
  307. except Exception as e:
  308. return response.json(500, repr(e))
  309. @staticmethod
  310. def push_inaccurate(user_id, request_dict, response):
  311. equipment_info_id = request_dict.get('equipment_info_id', None)
  312. uid = request_dict.get('uid', None)
  313. is_st = request_dict.get('is_st', None)
  314. event_type = request_dict.get('event_type', None)
  315. event_time = request_dict.get('event_time', None)
  316. channel = request_dict.get('channel', None)
  317. tag = request_dict.get('tag', '')
  318. if not all([equipment_info_id, uid, is_st, event_type, event_time, channel]):
  319. return response.json(444)
  320. now_time = int(time.time())
  321. is_st = int(is_st)
  322. try:
  323. # 默认查询近七天内数据
  324. start_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
  325. uid_list = uid.split(',')
  326. equipment_info_qs, count = EquipmentInfoService. \
  327. union_equipment_info(user_id, uid_list, event_type, start_time, now_time, 1, 10, event_time)
  328. identify_type = 1 if equipment_info_qs[0]['event_tag'] else 0
  329. s3 = AmazonS3Util(
  330. aws_access_key_id=ACCESS_KEY_ID,
  331. secret_access_key=SECRET_ACCESS_KEY,
  332. region_name=REGION_NAME
  333. )
  334. if is_st != 3:
  335. file_path = '{uid}/{channel}/{event_time}.jpeg'.format(uid=uid,
  336. channel=channel,
  337. event_time=event_time)
  338. s3.copy_obj(PUSH_BUCKET, PUSH_INACCURATE_BUCKET, file_path)
  339. else:
  340. for index in range(3):
  341. file_path = '{uid}/{channel}/{event_time}_{index}.jpeg'.format(uid=uid,
  342. channel=channel,
  343. event_time=event_time,
  344. index=index)
  345. if s3.get_object(PUSH_BUCKET, file_path):
  346. s3.copy_obj(PUSH_BUCKET, PUSH_INACCURATE_BUCKET, file_path)
  347. PushInaccurateFeedback.objects.create(equipment_info_id=equipment_info_id, user_id=user_id,
  348. event_type=event_type, uid=uid, channel=channel,
  349. add_time=now_time, tag=tag, is_st=is_st, event_time=event_time,
  350. identify_type=identify_type)
  351. return response.json(0)
  352. except Exception as e:
  353. return response.json(500, repr(e))