views.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. import traceback
  2. from dateutil.relativedelta import relativedelta
  3. from django.http import StreamingHttpResponse
  4. from django.utils import timezone
  5. from rest_framework import viewsets
  6. from rest_framework.settings import api_settings
  7. from .files import FileRenderCN, FileRenderEN
  8. from .models import CyclecountModeDayModel
  9. from . import serializers
  10. from utils.page import MyPageNumberPagination
  11. from rest_framework.filters import OrderingFilter
  12. from django_filters.rest_framework import DjangoFilterBackend
  13. from rest_framework.response import Response
  14. from .filter import Filter
  15. from .filter import ManualFilter
  16. from .filter import QTYRecorderListFilter
  17. from .serializers import FileRenderSerializer, FileRenderAllSerializer
  18. from .models import QTYRecorder
  19. from .models import ManualCyclecountModeModel
  20. from userprofile.models import Users
  21. from stock.views import StockBinViewSet
  22. from utils.md5 import Md5
  23. from staff.models import ListModel as staff
  24. class QTYRecorderViewSet(viewsets.ModelViewSet):
  25. """
  26. list:
  27. Response a data list(all)
  28. """
  29. pagination_class = MyPageNumberPagination
  30. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  31. ordering_fields = ['id', "create_time", "update_time", ]
  32. filter_class = QTYRecorderListFilter
  33. def get_queryset(self):
  34. if self.request.user:
  35. return QTYRecorder.objects.filter(openid=self.request.auth.openid)
  36. else:
  37. return QTYRecorder.objects.none()
  38. def get_serializer_class(self):
  39. if self.action in ['list']:
  40. return serializers.QTYRecorderSerializer
  41. else:
  42. return self.http_method_not_allowed(request=self.request)
  43. class CyclecountModeDayViewSet(viewsets.ModelViewSet):
  44. """
  45. retrieve:
  46. Response a data list(get)
  47. list:
  48. Response a data list(all)
  49. create:
  50. Create a data line(post)
  51. delete:
  52. Delete a data line(delete)
  53. partial_update:
  54. Partial_update a data(patch:partial_update)
  55. update:
  56. Update a data(put:update)
  57. """
  58. pagination_class = None
  59. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  60. ordering_fields = ['id', "create_time", "update_time", ]
  61. filter_class = Filter
  62. def get_project(self):
  63. try:
  64. id = self.kwargs.get('pk')
  65. return id
  66. except:
  67. return None
  68. def get_queryset(self):
  69. id = self.get_project()
  70. if self.request.user:
  71. cur_date = timezone.now()
  72. delt_date = relativedelta(days=1)
  73. if id is None:
  74. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=0,
  75. update_time__gte=str((cur_date -delt_date).date()) + ' 00:00:00',
  76. update_time__lte=str((cur_date + delt_date).date()) + ' 00:00:00')
  77. else:
  78. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=0,
  79. update_time__gte=str((cur_date - delt_date).date()) + ' 00:00:00',
  80. update_time__lte=str((cur_date + delt_date).date()) + ' 00:00:00', id=id)
  81. else:
  82. return CyclecountModeDayModel.objects.none()
  83. def get_serializer_class(self):
  84. if self.action in ['list']:
  85. return serializers.CyclecountGetSerializer
  86. elif self.action in ['create']:
  87. return serializers.CyclecountPostSerializer
  88. elif self.action in ['update']:
  89. return serializers.CyclecountUpdateSerializer
  90. else:
  91. return self.http_method_not_allowed(request=self.request)
  92. def create(self, request, *args, **kwargs):
  93. data = self.request.data
  94. for i in range(len(data)):
  95. CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid,
  96. t_code=data[i]['t_code']).update(
  97. physical_inventory=data[i]['physical_inventory'], cyclecount_status=1,
  98. difference=data[i]['physical_inventory'] - data[i]['goods_qty'])
  99. return Response({"detail": "success"}, status=200)
  100. def update(self, request, *args, **kwargs):
  101. data = self.request.data
  102. for i in range(len(data)):
  103. scan_count_data = self.get_queryset().filter(openid=self.request.auth.openid,
  104. t_code=data[i]['t_code']).first()
  105. scan_count_data.physical_inventory = scan_count_data.physical_inventory + data[i]['physical_inventory']
  106. scan_count_data.difference = data[i]['physical_inventory'] - data[i]['goods_qty']
  107. scan_count_data.cyclecount_status = 1
  108. scan_count_data.save()
  109. return Response({"detail": "success"}, status=200)
  110. class CyclecountModeAllViewSet(viewsets.ModelViewSet):
  111. """
  112. list:
  113. Response a data list(get)
  114. """
  115. pagination_class = MyPageNumberPagination
  116. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  117. ordering_fields = ['id', "create_time", "update_time", ]
  118. filter_class = Filter
  119. def get_project(self):
  120. try:
  121. id = self.kwargs.get('pk')
  122. return id
  123. except:
  124. return None
  125. def get_queryset(self):
  126. id = self.get_project()
  127. if self.request.user:
  128. date_choice = self.request.GET.get('create_time', '')
  129. cur_time = timezone.now().date()
  130. if date_choice:
  131. if id is None:
  132. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  133. update_time__gte=str(date_choice) + ' 00:00:00',
  134. update_time__lte=str(date_choice) + ' 23:59:59')
  135. else:
  136. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  137. update_time__gte=str(date_choice) + ' 00:00:00',
  138. update_time__lte=str(date_choice) + ' 23:59:59',
  139. id=id)
  140. else:
  141. if id is None:
  142. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  143. update_time__gte=str(cur_time) + ' 00:00:00',
  144. update_time__lte=str(cur_time) + ' 23:59:59')
  145. else:
  146. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  147. update_time__gte=str(cur_time) + ' 00:00:00',
  148. update_time__lte=str(cur_time) + ' 23:59:59',
  149. id=id)
  150. else:
  151. return CyclecountModeDayModel.objects.none()
  152. def get_serializer_class(self):
  153. if self.action in ['list']:
  154. return serializers.CyclecountGetSerializer
  155. else:
  156. return self.http_method_not_allowed(request=self.request)
  157. class FileDownloadView(viewsets.ModelViewSet):
  158. renderer_classes = (FileRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  159. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  160. ordering_fields = ['id', "create_time"]
  161. filter_class = Filter
  162. def get_project(self):
  163. try:
  164. id = self.kwargs.get('pk')
  165. return id
  166. except:
  167. return None
  168. def get_queryset(self):
  169. id = self.get_project()
  170. if self.request.user:
  171. cur_date = timezone.now()
  172. delt_date = relativedelta(days=1)
  173. if id is None:
  174. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=0,
  175. update_time__gte=str((cur_date -delt_date).date()) + ' 00:00:00')
  176. else:
  177. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=0,
  178. update_time__gte=str((cur_date -delt_date).date()) + ' 00:00:00', id=id)
  179. else:
  180. return CyclecountModeDayModel.objects.none()
  181. def get_serializer_class(self):
  182. if self.action in ['list']:
  183. return serializers.FileRenderSerializer
  184. else:
  185. return self.http_method_not_allowed(request=self.request)
  186. def get_lang(self, data):
  187. lang = self.request.META.get('HTTP_LANGUAGE')
  188. if lang:
  189. if lang == 'zh-hans':
  190. return FileRenderCN().render(data)
  191. else:
  192. return FileRenderEN().render(data)
  193. else:
  194. return FileRenderEN().render(data)
  195. def list(self, request, *args, **kwargs):
  196. from datetime import datetime
  197. dt = datetime.now()
  198. data = (
  199. FileRenderSerializer(instance).data
  200. for instance in self.filter_queryset(self.get_queryset())
  201. )
  202. renderer = self.get_lang(data)
  203. response = StreamingHttpResponse(
  204. renderer,
  205. content_type="text/csv"
  206. )
  207. response['Content-Disposition'] = "attachment; filename='cyclecount_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
  208. return response
  209. class FileDownloadAllView(viewsets.ModelViewSet):
  210. renderer_classes = (FileRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  211. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  212. ordering_fields = ['id', "create_time"]
  213. filter_class = Filter
  214. def get_project(self):
  215. try:
  216. id = self.kwargs.get('pk')
  217. return id
  218. except:
  219. return None
  220. def get_queryset(self):
  221. id = self.get_project()
  222. if self.request.user:
  223. cur_date = timezone.now()
  224. delt_date = relativedelta(days=1)
  225. if id is None:
  226. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  227. update_time__gte=str((cur_date -delt_date).date()) + ' 00:00:00',
  228. update_time__lte=str((cur_date + delt_date).date()) + ' 23:59:59')
  229. else:
  230. return CyclecountModeDayModel.objects.filter(openid=self.request.auth.openid, cyclecount_status=1,
  231. update_time__gte=str((cur_date - delt_date).date()) + ' 00:00:00',
  232. update_time__lte=str((cur_date + delt_date).date()) + ' 23:59:59', id=id)
  233. else:
  234. return CyclecountModeDayModel.objects.none()
  235. def get_serializer_class(self):
  236. if self.action in ['list']:
  237. return serializers.FileRenderSerializer
  238. else:
  239. return self.http_method_not_allowed(request=self.request)
  240. def get_lang(self, data):
  241. lang = self.request.META.get('HTTP_LANGUAGE')
  242. if lang:
  243. if lang == 'zh-hans':
  244. return FileRenderCN().render(data)
  245. else:
  246. return FileRenderEN().render(data)
  247. else:
  248. return FileRenderEN().render(data)
  249. def list(self, request, *args, **kwargs):
  250. from datetime import datetime
  251. dt = datetime.now()
  252. data = (
  253. FileRenderAllSerializer(instance).data
  254. for instance in self.filter_queryset(self.get_queryset())
  255. )
  256. renderer = self.get_lang(data)
  257. response = StreamingHttpResponse(
  258. renderer,
  259. content_type="text/csv"
  260. )
  261. response['Content-Disposition'] = "attachment; filename='cyclecountall_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
  262. return response
  263. class GetGoodsCyclecountViewSet(StockBinViewSet):
  264. """
  265. list:
  266. Response a data list(get)
  267. """
  268. pagination_class = None
  269. def list(self, request, *args, **kwargs):
  270. staff_name = staff.objects.filter(openid=self.request.auth.openid, id=self.request.META.get('HTTP_OPERATOR')).first().staff_name
  271. queryset = self.filter_queryset(self.get_queryset())
  272. goods_code = self.request.GET.get('goods_code', '')
  273. for i in queryset:
  274. if (d:=ManualCyclecountModeModel.objects.filter(cyclecount_status=0, bin_name=i.bin_name, goods_code=goods_code)).exists():
  275. d.delete()
  276. data = {
  277. 'openid': self.request.auth.openid,
  278. 'creater': staff_name,
  279. 'cyclecount_status': 0,
  280. 'bin_name': i.bin_name,
  281. 'goods_code': goods_code,
  282. 'goods_qty': i.goods_qty,
  283. 'physical_inventory': 0,
  284. 'difference': 0,
  285. 't_code': Md5.md5(goods_code)
  286. }
  287. serializer = serializers.ManualCyclecountPostSerializer(data=data)
  288. serializer.is_valid(raise_exception=True)
  289. serializer.save()
  290. queryset = ManualCyclecountModeModel.objects.filter(goods_code=goods_code, cyclecount_status=0)
  291. page = self.paginate_queryset(queryset)
  292. if page is not None:
  293. serializer = serializers.ManualCyclecountGetSerializer(instance=page, many=True)
  294. return self.get_paginated_response(serializer.data)
  295. serializer = serializers.ManualCyclecountGetSerializer(instance=queryset, many=True)
  296. return Response(serializer.data)
  297. class ManualCyclecountViewSet(viewsets.ModelViewSet):
  298. """
  299. retrieve:
  300. Response a data list(get)
  301. list:
  302. Response a data list(all)
  303. create:
  304. Create a data line(post)
  305. delete:
  306. Delete a data line(delete)
  307. partial_update:
  308. Partial_update a data(patch:partial_update)
  309. update:
  310. Update a data(put:update)
  311. """
  312. pagination_class = None
  313. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  314. ordering_fields = ['id', "create_time", "update_time", ]
  315. filter_class = ManualFilter
  316. def get_project(self):
  317. try:
  318. id = self.kwargs.get('pk')
  319. return id
  320. except:
  321. return None
  322. def get_queryset(self):
  323. id = self.get_project()
  324. if self.request.user:
  325. cur_date = timezone.now()
  326. delt_date = relativedelta(days=1)
  327. u = Users.objects.filter(vip=9).first()
  328. if u is None:
  329. superopenid = None
  330. else:
  331. superopenid = u.openid
  332. query_dict = {
  333. 'cyclecount_status': 0,
  334. 'update_time__gte': str((cur_date - delt_date).date()) + ' 00:00:00',
  335. 'update_time__lte': str((cur_date + delt_date).date()) + ' 00:00:00'
  336. }
  337. if self.request.auth.openid != superopenid:
  338. query_dict['openid'] = self.request.auth.openid
  339. if id is not None:
  340. query_dict['id'] = id
  341. return ManualCyclecountModeModel.objects.filter(**query_dict)
  342. else:
  343. return ManualCyclecountModeModel.objects.none()
  344. def get_serializer_class(self):
  345. if self.action in ['list']:
  346. return serializers.ManualCyclecountGetSerializer
  347. elif self.action in ['create']:
  348. return serializers.ManualCyclecountModeModel
  349. elif self.action in ['update']:
  350. return serializers.ManualCyclecountUpdateSerializer
  351. else:
  352. return self.http_method_not_allowed(request=self.request)
  353. def create(self, request, *args, **kwargs):
  354. data = self.request.data
  355. for i in range(len(data)):
  356. ManualCyclecountModeModel.objects.filter(openid=self.request.auth.openid, t_code=data[i]['t_code']).update(
  357. physical_inventory=data[i]['physical_inventory'],
  358. cyclecount_status=1,
  359. difference=data[i]['physical_inventory'] - data[i]['goods_qty']
  360. )
  361. return Response({"detail": "success"}, status=200)
  362. def update(self, request, *args, **kwargs):
  363. data = self.request.data
  364. for i in range(len(data)):
  365. scan_count_data = self.get_queryset().filter(openid=self.request.auth.openid,
  366. t_code=data[i]['t_code']).first()
  367. scan_count_data.physical_inventory = scan_count_data.physical_inventory + data[i]['physical_inventory']
  368. scan_count_data.difference = data[i]['physical_inventory'] - data[i]['goods_qty']
  369. scan_count_data.cyclecount_status = 1
  370. scan_count_data.save()
  371. return Response({"detail": "success"}, status=200)
  372. class ManualCyclecountRecorderViewSet(viewsets.ModelViewSet):
  373. """
  374. list:
  375. Response a data list(get)
  376. """
  377. pagination_class = MyPageNumberPagination
  378. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  379. ordering_fields = ['id', "create_time", "update_time", ]
  380. filter_class = ManualFilter
  381. def get_project(self):
  382. try:
  383. id = self.kwargs.get('pk')
  384. return id
  385. except:
  386. return None
  387. def get_queryset(self):
  388. id = self.get_project()
  389. if self.request.user:
  390. date_choice = self.request.GET.get('create_time', '')
  391. cur_time = timezone.now().date()
  392. u = Users.objects.filter(vip=9).first()
  393. if u is None:
  394. superopenid = None
  395. else:
  396. superopenid = u.openid
  397. query_dict = {
  398. 'cyclecount_status': 1
  399. }
  400. if self.request.auth.openid != superopenid:
  401. query_dict['openid'] = self.request.auth.openid
  402. if date_choice:
  403. query_dict['update_time__gte'] = str(date_choice) + ' 00:00:00'
  404. query_dict['update_time__lte'] = str(date_choice) + ' 23:59:59'
  405. else:
  406. query_dict['update_time__gte'] = str(cur_time) + ' 00:00:00'
  407. query_dict['update_time__lte'] = str(cur_time) + ' 23:59:59'
  408. if id is not None:
  409. query_dict['id'] = id
  410. return ManualCyclecountModeModel.objects.filter(**query_dict)
  411. else:
  412. return ManualCyclecountModeModel.objects.none()
  413. def get_serializer_class(self):
  414. if self.action in ['list']:
  415. return serializers.ManualCyclecountGetSerializer
  416. else:
  417. return self.http_method_not_allowed(request=self.request)
  418. class ManualFileDownloadView(viewsets.ModelViewSet):
  419. renderer_classes = (FileRenderCN, ) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  420. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  421. ordering_fields = ['id', "create_time"]
  422. filter_class = ManualFilter
  423. def get_project(self):
  424. try:
  425. id = self.kwargs.get('pk')
  426. return id
  427. except:
  428. return None
  429. def get_queryset(self):
  430. id = self.get_project()
  431. if self.request.user:
  432. cur_date = timezone.now()
  433. delt_date = relativedelta(days=1)
  434. u = Users.objects.filter(vip=9).first()
  435. if u is None:
  436. superopenid = None
  437. else:
  438. superopenid = u.openid
  439. query_dict = {
  440. 'cyclecount_status': 0,
  441. 'update_time__gte': str((cur_date - delt_date).date()) + ' 00:00:00'
  442. }
  443. if self.request.auth.openid != superopenid:
  444. query_dict['openid'] = self.request.auth.openid
  445. if id is not None:
  446. query_dict['id'] = id
  447. return ManualCyclecountModeModel.objects.filter(**query_dict)
  448. else:
  449. return ManualCyclecountModeModel.objects.none()
  450. def get_serializer_class(self):
  451. if self.action in ['list']:
  452. return serializers.ManualFileRenderSerializer
  453. else:
  454. return self.http_method_not_allowed(request=self.request)
  455. def get_lang(self, data):
  456. lang = self.request.META.get('HTTP_LANGUAGE')
  457. if lang:
  458. if lang == 'zh-hans':
  459. return FileRenderCN().render(data)
  460. else:
  461. return FileRenderEN().render(data)
  462. else:
  463. return FileRenderEN().render(data)
  464. def list(self, request, *args, **kwargs):
  465. from datetime import datetime
  466. dt = datetime.now()
  467. data = (
  468. serializers.ManualFileRenderSerializer(instance).data
  469. for instance in self.filter_queryset(self.get_queryset())
  470. )
  471. renderer = self.get_lang(data)
  472. response = StreamingHttpResponse(
  473. renderer,
  474. content_type="text/csv"
  475. )
  476. response['Content-Disposition'] = "attachment; filename='manualcyclecount_{}.csv'".format(str(dt.strftime('%Y%m%d%H%M%S%f')))
  477. return response