views.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. from rest_framework import viewsets
  2. from utils.page import MyPageNumberPagination
  3. from utils.md5 import Md5
  4. from rest_framework.filters import OrderingFilter
  5. from django_filters.rest_framework import DjangoFilterBackend
  6. from rest_framework.response import Response
  7. from rest_framework.exceptions import APIException
  8. from django.http import StreamingHttpResponse
  9. from stock.models import StockshelfModel as shelflist
  10. from . import serializers
  11. from .filter import StockBinFilter,StockshelfFilter
  12. from .files import FileListRenderCN, FileListRenderEN, FileBinListRenderCN, FileBinListRenderEN
  13. from rest_framework.settings import api_settings
  14. from django.db import transaction
  15. from rest_framework import status
  16. class stockshelfViewSet(viewsets.ModelViewSet):
  17. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  18. ordering_fields = ['id', "create_time", "update_time", ]
  19. filter_class = StockshelfFilter
  20. pagination_class = MyPageNumberPagination
  21. """
  22. list:
  23. Response a data list(all)
  24. post:
  25. Create a new data(create)
  26. """
  27. def get_project(self):
  28. try:
  29. id = self.kwargs.get('pk')
  30. return id
  31. except:
  32. return None
  33. def get_queryset(self):
  34. id = self.get_project()
  35. if self.request.user:
  36. if id is None:
  37. return shelflist.objects.filter()
  38. else:
  39. return shelflist.objects.filter(id=id)
  40. else:
  41. return shelflist.objects.none()
  42. def get_serializer_class(self):
  43. if self.action in ['list', 'create', ]:
  44. return serializers.stockShelfSerializer
  45. elif self.action in ['retrieve','update',]:
  46. return serializers.stockShelfpartialSerializer
  47. else:
  48. return self.http_method_not_allowed(request=self.request)
  49. def create(self, request, *args, **kwargs):
  50. data = request.data.copy()
  51. warehouse_code = data.get('warehouse_code')
  52. warehouse_name = data.get('warehouse_name')
  53. shelf_type = data.get('shelf_type')
  54. shelf_name = data.get('shelf_name')
  55. rows = int(data.get('rows', 0))
  56. cols = int(data.get('cols', 0))
  57. layers = int(data.get('layers', 0))
  58. existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers)
  59. # 生成所有可能的坐标
  60. instances = []
  61. for r in range(1, rows+1):
  62. for c in range(1, cols+1):
  63. for l in range(1, layers+1):
  64. if (r, c, l) not in existing_positions :
  65. instances.append(shelflist(
  66. warehouse_code=warehouse_code,
  67. warehouse_name=warehouse_name,
  68. shelf_type=shelf_type,
  69. shelf_name=shelf_name,
  70. row=r,
  71. col=c,
  72. layer=l,
  73. ))
  74. try:
  75. with transaction.atomic():
  76. shelflist.objects.bulk_create(instances, batch_size=1000)
  77. except Exception as e:
  78. return Response(
  79. {"error": str(e)},
  80. status=status.HTTP_500_INTERNAL_SERVER_ERROR
  81. )
  82. return Response({
  83. "created": len(instances),
  84. "skipped": (rows*cols*layers) - len(instances)
  85. }, status=status.HTTP_201_CREATED)
  86. def update(self, request, pk):
  87. qs = self.get_object()
  88. print(qs.id)
  89. # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST)
  90. data = self.request.data
  91. print(data)
  92. serializer = self.get_serializer(qs, data=data)
  93. serializer.is_valid(raise_exception=True)
  94. serializer.save()
  95. headers = self.get_success_headers(serializer.data)
  96. return Response(serializer.data, status=200, headers=headers)
  97. def retrieve(self, request, pk):
  98. qs = self.get_object()
  99. serializer = self.get_serializer(qs)
  100. return Response(serializer.data)
  101. class StockBinViewSet(viewsets.ModelViewSet):
  102. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  103. ordering_fields = ['id', "create_time", "update_time", ]
  104. filter_class = StockBinFilter
  105. pagination_class = MyPageNumberPagination
  106. """
  107. list:
  108. Response a data list(all)
  109. post:
  110. Create a new data(create)
  111. """
  112. def get_project(self):
  113. try:
  114. id = self.kwargs.get('pk')
  115. return id
  116. except:
  117. return None
  118. def get_queryset(self):
  119. id = self.get_project()
  120. if self.request.user:
  121. if id is None:
  122. return shelflist.objects.filter()
  123. else:
  124. return shelflist.objects.filter(id=id)
  125. else:
  126. return shelflist.objects.none()
  127. def get_serializer_class(self):
  128. if self.action in ['list', 'create', ]:
  129. return serializers.stocklistSerializer
  130. # elif self.action in ['retrieve','update',]:
  131. # return serializers.stocklistpartialSerializer
  132. else:
  133. return self.http_method_not_allowed(request=self.request)
  134. # def create(self, request, *args, **kwargs):
  135. # data = request.data.copy()
  136. # warehouse_code = data.get('warehouse_code')
  137. # warehouse_name = data.get('warehouse_name')
  138. # shelf_type = data.get('shelf_type')
  139. # shelf_name = data.get('shelf_name')
  140. # rows = int(data.get('rows', 0))
  141. # cols = int(data.get('cols', 0))
  142. # layers = int(data.get('layers', 0))
  143. # existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers)
  144. # # 生成所有可能的坐标
  145. # instances = []
  146. # for r in range(1, rows+1):
  147. # for c in range(1, cols+1):
  148. # for l in range(1, layers+1):
  149. # if (r, c, l) not in existing_positions :
  150. # instances.append(shelflist(
  151. # warehouse_code=warehouse_code,
  152. # warehouse_name=warehouse_name,
  153. # shelf_type=shelf_type,
  154. # shelf_name=shelf_name,
  155. # row=r,
  156. # col=c,
  157. # layer=l,
  158. # ))
  159. # try:
  160. # with transaction.atomic():
  161. # shelflist.objects.bulk_create(instances, batch_size=1000)
  162. # except Exception as e:
  163. # return Response(
  164. # {"error": str(e)},
  165. # status=status.HTTP_500_INTERNAL_SERVER_ERROR
  166. # )
  167. # return Response({
  168. # "created": len(instances),
  169. # "skipped": (rows*cols*layers) - len(instances)
  170. # }, status=status.HTTP_201_CREATED)
  171. # def update(self, request, pk):
  172. # qs = self.get_object()
  173. # print(qs.id)
  174. # # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST)
  175. # data = self.request.data
  176. # print(data)
  177. # serializer = self.get_serializer(qs, data=data)
  178. # serializer.is_valid(raise_exception=True)
  179. # serializer.save()
  180. # headers = self.get_success_headers(serializer.data)
  181. # return Response(serializer.data, status=200, headers=headers)
  182. # def retrieve(self, request, pk):
  183. # qs = self.get_object()
  184. # serializer = self.get_serializer(qs)
  185. # return Response(serializer.data)