views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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. from operation_log.views import log_success_operation, log_failure_operation
  17. class stockshelfViewSet(viewsets.ModelViewSet):
  18. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  19. ordering_fields = ['id', "create_time", "update_time", ]
  20. filter_class = StockshelfFilter
  21. pagination_class = MyPageNumberPagination
  22. """
  23. list:
  24. Response a data list(all)
  25. post:
  26. Create a new data(create)
  27. """
  28. def get_project(self):
  29. try:
  30. id = self.kwargs.get('pk')
  31. return id
  32. except:
  33. return None
  34. def get_queryset(self):
  35. id = self.get_project()
  36. if self.request.user:
  37. if id is None:
  38. return shelflist.objects.filter()
  39. else:
  40. return shelflist.objects.filter(id=id)
  41. else:
  42. return shelflist.objects.none()
  43. def get_serializer_class(self):
  44. if self.action in ['list', 'create', ]:
  45. return serializers.stockShelfSerializer
  46. elif self.action in ['retrieve','update',]:
  47. return serializers.stockShelfpartialSerializer
  48. else:
  49. return self.http_method_not_allowed(request=self.request)
  50. def create(self, request, *args, **kwargs):
  51. data = request.data.copy()
  52. warehouse_code = data.get('warehouse_code')
  53. warehouse_name = data.get('warehouse_name')
  54. shelf_type = data.get('shelf_type')
  55. shelf_name = data.get('shelf_name')
  56. rows = int(data.get('rows', 0))
  57. cols = int(data.get('cols', 0))
  58. layers = int(data.get('layers', 0))
  59. existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers)
  60. # 生成所有可能的坐标
  61. instances = []
  62. for r in range(1, rows+1):
  63. for c in range(1, cols+1):
  64. for l in range(1, layers+1):
  65. if (r, c, l) not in existing_positions :
  66. instances.append(shelflist(
  67. warehouse_code=warehouse_code,
  68. warehouse_name=warehouse_name,
  69. shelf_type=shelf_type,
  70. shelf_name=shelf_name,
  71. row=r,
  72. col=c,
  73. layer=l,
  74. ))
  75. try:
  76. with transaction.atomic():
  77. shelflist.objects.bulk_create(instances, batch_size=1000)
  78. # 记录成功日志
  79. try:
  80. log_success_operation(
  81. request=self.request,
  82. operation_content=f"批量创建货架位置,仓库: {warehouse_name}({warehouse_code}), 货架: {shelf_name}, 创建数量: {len(instances)}, 跳过数量: {(rows*cols*layers) - len(instances)}",
  83. operation_level="new",
  84. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  85. module_name="库存管理"
  86. )
  87. except Exception as e:
  88. pass
  89. except Exception as e:
  90. # 记录失败日志
  91. try:
  92. log_failure_operation(
  93. request=self.request,
  94. operation_content=f"批量创建货架位置失败,仓库: {warehouse_name}({warehouse_code}), 货架: {shelf_name}, 错误: {str(e)}",
  95. operation_level="new",
  96. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  97. module_name="库存管理"
  98. )
  99. except Exception as log_error:
  100. pass
  101. return Response(
  102. {"error": str(e)},
  103. status=status.HTTP_500_INTERNAL_SERVER_ERROR
  104. )
  105. return Response({
  106. "created": len(instances),
  107. "skipped": (rows*cols*layers) - len(instances)
  108. }, status=status.HTTP_201_CREATED)
  109. def update(self, request, pk):
  110. qs = self.get_object()
  111. print(qs.id)
  112. # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST)
  113. data = self.request.data
  114. print(data)
  115. try:
  116. serializer = self.get_serializer(qs, data=data)
  117. serializer.is_valid(raise_exception=True)
  118. serializer.save()
  119. headers = self.get_success_headers(serializer.data)
  120. # 记录成功日志
  121. try:
  122. log_success_operation(
  123. request=self.request,
  124. operation_content=f"更新货架位置 ID:{pk},仓库: {qs.warehouse_name}({qs.warehouse_code}), 货架: {qs.shelf_name}",
  125. operation_level="update",
  126. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  127. object_id=pk,
  128. module_name="库存管理"
  129. )
  130. except Exception as e:
  131. pass
  132. return Response(serializer.data, status=200, headers=headers)
  133. except Exception as e:
  134. # 记录失败日志
  135. try:
  136. log_failure_operation(
  137. request=self.request,
  138. operation_content=f"更新货架位置失败 ID:{pk},错误: {str(e)}",
  139. operation_level="update",
  140. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  141. object_id=pk,
  142. module_name="库存管理"
  143. )
  144. except Exception as log_error:
  145. pass
  146. raise
  147. def retrieve(self, request, pk):
  148. qs = self.get_object()
  149. serializer = self.get_serializer(qs)
  150. return Response(serializer.data)
  151. class StockBinViewSet(viewsets.ModelViewSet):
  152. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  153. ordering_fields = ['id', "create_time", "update_time", ]
  154. filter_class = StockBinFilter
  155. pagination_class = MyPageNumberPagination
  156. """
  157. list:
  158. Response a data list(all)
  159. post:
  160. Create a new data(create)
  161. """
  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. if id is None:
  172. return shelflist.objects.filter()
  173. else:
  174. return shelflist.objects.filter(id=id)
  175. else:
  176. return shelflist.objects.none()
  177. def get_serializer_class(self):
  178. if self.action in ['list', 'create', ]:
  179. return serializers.stocklistSerializer
  180. # elif self.action in ['retrieve','update',]:
  181. # return serializers.stocklistpartialSerializer
  182. else:
  183. return self.http_method_not_allowed(request=self.request)
  184. # def create(self, request, *args, **kwargs):
  185. # data = request.data.copy()
  186. # warehouse_code = data.get('warehouse_code')
  187. # warehouse_name = data.get('warehouse_name')
  188. # shelf_type = data.get('shelf_type')
  189. # shelf_name = data.get('shelf_name')
  190. # rows = int(data.get('rows', 0))
  191. # cols = int(data.get('cols', 0))
  192. # layers = int(data.get('layers', 0))
  193. # existing_positions = shelflist.get_existing_positions(warehouse_code,shelf_name, rows, cols, layers)
  194. # # 生成所有可能的坐标
  195. # instances = []
  196. # for r in range(1, rows+1):
  197. # for c in range(1, cols+1):
  198. # for l in range(1, layers+1):
  199. # if (r, c, l) not in existing_positions :
  200. # instances.append(shelflist(
  201. # warehouse_code=warehouse_code,
  202. # warehouse_name=warehouse_name,
  203. # shelf_type=shelf_type,
  204. # shelf_name=shelf_name,
  205. # row=r,
  206. # col=c,
  207. # layer=l,
  208. # ))
  209. # try:
  210. # with transaction.atomic():
  211. # shelflist.objects.bulk_create(instances, batch_size=1000)
  212. # except Exception as e:
  213. # return Response(
  214. # {"error": str(e)},
  215. # status=status.HTTP_500_INTERNAL_SERVER_ERROR
  216. # )
  217. # return Response({
  218. # "created": len(instances),
  219. # "skipped": (rows*cols*layers) - len(instances)
  220. # }, status=status.HTTP_201_CREATED)
  221. # def update(self, request, pk):
  222. # qs = self.get_object()
  223. # print(qs.id)
  224. # # return Response({"detail": "暂不支持修改"}, status=status.HTTP_400_BAD_REQUEST)
  225. # data = self.request.data
  226. # print(data)
  227. # serializer = self.get_serializer(qs, data=data)
  228. # serializer.is_valid(raise_exception=True)
  229. # serializer.save()
  230. # headers = self.get_success_headers(serializer.data)
  231. # return Response(serializer.data, status=200, headers=headers)
  232. # def retrieve(self, request, pk):
  233. # qs = self.get_object()
  234. # serializer = self.get_serializer(qs)
  235. # return Response(serializer.data)