views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. from rest_framework import viewsets
  2. from utils.page import MyPageNumberPagination
  3. from utils.datasolve import sumOfList, transportation_calculate
  4. from utils.md5 import Md5
  5. from rest_framework.filters import OrderingFilter
  6. from django_filters.rest_framework import DjangoFilterBackend
  7. from rest_framework.response import Response
  8. from rest_framework.exceptions import APIException
  9. from django.utils import timezone
  10. from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel
  11. from bound.models import BoundBatchModel,BoundDetailModel,BoundListModel
  12. # from .files import FileListRenderCN, FileDetailRenderCN
  13. from .serializers import ContainerDetailGetSerializer,ContainerDetailPostSerializer
  14. from .serializers import ContainerListGetSerializer,ContainerListPostSerializer
  15. from .serializers import ContainerOperationGetSerializer,ContainerOperationPostSerializer
  16. from .filter import ContainerDetailFilter,ContainerListFilter,ContainerOperationFilter
  17. # 以后添加模
  18. from warehouse.models import ListModel as warehouse
  19. from staff.models import ListModel as staff
  20. from rest_framework.permissions import AllowAny
  21. class ContainerListViewSet(viewsets.ModelViewSet):
  22. """
  23. retrieve:
  24. Response a data list(get)
  25. list:
  26. Response a data list(all)
  27. create:
  28. Create a data line(post)
  29. delete:
  30. Delete a data line(delete)
  31. """
  32. # authentication_classes = [] # 禁用所有认证类
  33. # permission_classes = [AllowAny] # 允许任意访问
  34. pagination_class = MyPageNumberPagination
  35. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  36. ordering_fields = ['id', "create_time", "update_time", ]
  37. filter_class = ContainerListFilter
  38. def get_project(self):
  39. try:
  40. id = self.kwargs.get('pk')
  41. return id
  42. except:
  43. return None
  44. def get_queryset(self):
  45. id = self.get_project()
  46. if self.request.user:
  47. if id is None:
  48. return ContainerListModel.objects.filter( is_delete=False)
  49. else:
  50. return ContainerListModel.objects.filter( id=id, is_delete=False)
  51. else:
  52. return ContainerListModel.objects.none()
  53. def get_serializer_class(self):
  54. if self.action in ['list', 'destroy','retrieve']:
  55. return ContainerListGetSerializer
  56. elif self.action in ['create', 'update']:
  57. return ContainerListPostSerializer
  58. else:
  59. return self.http_method_not_allowed(request=self.request)
  60. def create(self, request, *args, **kwargs):
  61. data = self.request.data
  62. order_month = str(timezone.now().strftime('%Y%m'))
  63. data['month'] = order_month
  64. data['last_operate'] = str(timezone.now())
  65. serializer = self.get_serializer(data=data)
  66. serializer.is_valid(raise_exception=True)
  67. serializer.save()
  68. headers = self.get_success_headers(serializer.data)
  69. return Response(serializer.data, status=200, headers=headers)
  70. def update(self, request, pk):
  71. qs = self.get_object()
  72. data = self.request.data
  73. serializer = self.get_serializer(qs, data=data)
  74. serializer.is_valid(raise_exception=True)
  75. serializer.save()
  76. headers = self.get_success_headers(serializer.data)
  77. return Response(serializer.data, status=200, headers=headers)
  78. class ContainerDetailViewSet(viewsets.ModelViewSet):
  79. """
  80. retrieve:
  81. Response a data list(get)
  82. list:
  83. Response a data list(all)
  84. create:
  85. Create a data line(post)
  86. delete:
  87. Delete a data line(delete)
  88. """
  89. # authentication_classes = [] # 禁用所有认证类
  90. # permission_classes = [AllowAny] # 允许任意访问
  91. pagination_class = MyPageNumberPagination
  92. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  93. ordering_fields = ['id', "create_time", "update_time", ]
  94. filter_class = ContainerDetailFilter
  95. def get_project(self):
  96. try:
  97. id = self.kwargs.get('pk')
  98. return id
  99. except:
  100. return None
  101. def get_queryset(self):
  102. id = self.get_project()
  103. if self.request.user:
  104. if id is None:
  105. return ContainerDetailModel.objects.filter( is_delete=False)
  106. else:
  107. return ContainerDetailModel.objects.filter( id=id, is_delete=False)
  108. else:
  109. return ContainerDetailModel.objects.none()
  110. def get_serializer_class(self):
  111. if self.action in ['list', 'destroy','retrieve']:
  112. return ContainerDetailGetSerializer
  113. elif self.action in ['create', 'update']:
  114. return ContainerDetailPostSerializer
  115. else:
  116. return self.http_method_not_allowed(request=self.request)
  117. def create(self, request, *args, **kwargs):
  118. data = self.request.data
  119. order_month = str(timezone.now().strftime('%Y%m'))
  120. data['month'] = order_month
  121. container_code = data.get('container')
  122. batches = data.get('batches', []) # 确保有默认空列表
  123. print('扫描到的托盘编码', container_code)
  124. # 处理托盘对象
  125. container_obj = ContainerListModel.objects.filter(container_code=container_code).first()
  126. if container_obj:
  127. data['container'] = container_obj.id
  128. print('托盘编码存在', data['container'])
  129. else:
  130. print('托盘编码不存在')
  131. serializer_list = ContainerListPostSerializer(data={'container_code': container_code})
  132. serializer_list.is_valid(raise_exception=True)
  133. serializer_list.save()
  134. data['container'] = serializer_list.data.get('id')
  135. # 循环处理每个批次
  136. for batch in batches:
  137. bound_number = batch.get('goods_code')
  138. goods_qty = batch.get('goods_qty')
  139. # 查询商品对象
  140. bound_obj = BoundBatchModel.objects.filter(bound_number=bound_number).first()
  141. if not bound_obj:
  142. # 如果商品不存在,返回错误,这里暂时在程序中进行提醒,后续需要改为前端弹窗提醒
  143. print(f"商品编码 {bound_number} 不存在")
  144. # 跳出此次循环
  145. continue
  146. # return Response({"error": f"商品编码 {bound_number} 不存在"}, status=400)
  147. # 3. 更新批次数据(根据业务规则)
  148. try:
  149. last_qty = bound_obj.goods_in_qty
  150. bound_obj.goods_in_qty += batch.get("goods_qty", 0)
  151. if bound_obj.goods_in_qty >= bound_obj.goods_qty:
  152. bound_obj.goods_in_qty = bound_obj.goods_qty
  153. bound_obj.status = 2
  154. print('批次id',bound_obj.id)
  155. bound_detail_obj = BoundDetailModel.objects.filter(bound_batch=bound_obj.id).first()
  156. if bound_detail_obj:
  157. bound_detail_obj.status = 2
  158. bound_detail_obj.save()
  159. print('入库申请id',bound_detail_obj.bound_list_id)
  160. # 入库申请全部批次入库完成
  161. bound_batch_all = BoundDetailModel.objects.filter(bound_list=bound_detail_obj.bound_list_id).all()
  162. if bound_batch_all.count() == bound_batch_all.filter(status=2).count():
  163. bound_list_obj = BoundListModel.objects.filter(id=bound_detail_obj.bound_list_id).first()
  164. print('当前状态',bound_list_obj.bound_status)
  165. bound_list_obj.bound_status = 102
  166. print('更新状态',bound_list_obj.bound_status)
  167. bound_list_obj.save()
  168. print('入库申请全部批次入库完成')
  169. else:
  170. print('入库申请部分批次入库完成')
  171. else:
  172. bound_obj.status = 1
  173. bound_obj.save() # 保存到数据库
  174. # 创建托盘详情记录(每个批次独立)
  175. print('新增个数',bound_obj.goods_in_qty-last_qty)
  176. if bound_obj.goods_in_qty-last_qty == goods_qty:
  177. detail_data = {
  178. "container": data['container'], # 托盘ID
  179. "batch": bound_obj.id, # 外键关联批次
  180. "goods_code": bound_obj.goods_code,
  181. "goods_desc": bound_obj.goods_desc,
  182. "goods_qty": goods_qty,
  183. "goods_weight": bound_obj.goods_weight,
  184. "status": 1,
  185. "month": data['month'],
  186. "creater": data.get('creater', 'zl') # 默认值兜底
  187. }
  188. serializer = self.get_serializer(data=detail_data)
  189. serializer.is_valid(raise_exception=True)
  190. serializer.save() # 必须保存到数据库
  191. elif bound_obj.goods_in_qty-last_qty > 0:
  192. print('批次数量不一致')
  193. detail_data = {
  194. "container": data['container'], # 托盘ID
  195. "batch": bound_obj.id, # 外键关联批次
  196. "goods_code": bound_obj.goods_code,
  197. "goods_desc": bound_obj.goods_desc,
  198. "goods_qty": bound_obj.goods_in_qty-last_qty,
  199. "goods_weight": bound_obj.goods_weight,
  200. "status": 1,
  201. "month": data['month'],
  202. "creater": data.get('creater', 'zl') # 默认值兜底
  203. }
  204. serializer = self.get_serializer(data=detail_data)
  205. serializer.is_valid(raise_exception=True)
  206. serializer.save() # 必须保存到数据库
  207. else :
  208. print('重复入库')
  209. except Exception as e:
  210. print(f"更新批次 {bound_number} 失败: {str(e)}")
  211. continue
  212. # 将处理后的数据返回(或根据业务需求保存到数据库)
  213. res_data={
  214. "code": "200",
  215. "msg": "Success Create",
  216. "data": data
  217. }
  218. return Response(res_data, status=200)
  219. def update(self, request, pk):
  220. qs = self.get_object()
  221. data = self.request.data
  222. serializer = self.get_serializer(qs, data=data)
  223. serializer.is_valid(raise_exception=True)
  224. serializer.save()
  225. headers = self.get_success_headers(serializer.data)
  226. return Response(serializer.data, status=200, headers=headers)
  227. class ContainerOperationViewSet(viewsets.ModelViewSet):
  228. """
  229. retrieve:
  230. Response a data list(get)
  231. list:
  232. Response a data list(all)
  233. create:
  234. Create a data line(post)
  235. delete:
  236. Delete a data line(delete)
  237. """
  238. # authentication_classes = [] # 禁用所有认证类
  239. # permission_classes = [AllowAny] # 允许任意访问
  240. pagination_class = MyPageNumberPagination
  241. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  242. ordering_fields = ['id', "create_time", "update_time", ]
  243. filter_class = ContainerOperationFilter
  244. def get_project(self):
  245. try:
  246. id = self.kwargs.get('pk')
  247. return id
  248. except:
  249. return None
  250. def get_queryset(self):
  251. id = self.get_project()
  252. if self.request.user:
  253. if id is None:
  254. return ContainerOperationModel.objects.filter( is_delete=False)
  255. else:
  256. return ContainerOperationModel.objects.filter( id=id, is_delete=False)
  257. else:
  258. return ContainerOperationModel.objects.none()
  259. def get_serializer_class(self):
  260. if self.action in ['list', 'destroy','retrieve']:
  261. return ContainerOperationGetSerializer
  262. elif self.action in ['create', 'update']:
  263. return ContainerOperationPostSerializer
  264. else:
  265. return self.http_method_not_allowed(request=self.request)
  266. def create(self, request, *args, **kwargs):
  267. data = self.request.data
  268. serializer = self.get_serializer(data=data)
  269. serializer.is_valid(raise_exception=True)
  270. serializer.save()
  271. headers = self.get_success_headers(serializer.data)
  272. return Response(serializer.data, status=200, headers=headers)
  273. def update(self, request, pk):
  274. qs = self.get_object()
  275. data = self.request.data
  276. serializer = self.get_serializer(qs, data=data)
  277. serializer.is_valid(raise_exception=True)
  278. serializer.save()
  279. headers = self.get_success_headers(serializer.data)
  280. return Response(serializer.data, status=200, headers=headers)