views.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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 BoundListModel, BoundDetailModel,BoundBatchModel, BatchLogModel, OutBatchModel,OutBoundDetailModel,MaterialStatistics
  11. # from .files import FileListRenderCN, FileDetailRenderCN
  12. from .serializers import BoundListGetSerializer,BoundListPostSerializer,BoundBatchGetSerializer,BoundBatchPostSerializer,BoundDetailGetSerializer,BoundDetailPostSerializer
  13. from .serializers import OutBoundDetailGetSerializer,OutBoundDetailPostSerializer,OutBatchGetSerializer,OutBatchPostSerializer,BatchLogGetSerializer
  14. from .serializers import MaterialStatisticsSerializer,MaterialStatisticsSerializer_items
  15. from .filter import BoundListFilter, BoundDetailFilter,BoundBatchFilter
  16. from .filter import OutBatchFilter,OutBoundDetailFilter,BatchlogFilter
  17. from .filter import MaterialStatisticsFilter
  18. # 以后添加模块检验
  19. from warehouse.models import ListModel as warehouse
  20. from staff.models import ListModel as staff
  21. from rest_framework.permissions import AllowAny
  22. from rest_framework.views import APIView
  23. class MaterialStatisticsViewSet(viewsets.ModelViewSet):
  24. """
  25. retrieve:
  26. Response a data list(get)
  27. list:
  28. Response a data list(all)
  29. create:
  30. Create a data line(post)
  31. delete:
  32. Delete a data line(delete)
  33. """
  34. # authentication_classes = [] # 禁用所有认证类
  35. # permission_classes = [AllowAny] # 允许任意访问
  36. pagination_class = MyPageNumberPagination
  37. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  38. ordering_fields = ['id', "create_time", "update_time", ]
  39. filter_class = MaterialStatisticsFilter
  40. def get_project(self):
  41. try:
  42. id = self.kwargs.get('pk')
  43. return id
  44. except:
  45. return None
  46. def get_queryset(self):
  47. id = self.get_project()
  48. if self.request.user:
  49. if id is None:
  50. return MaterialStatistics.objects.filter()
  51. else:
  52. return MaterialStatistics.objects.filter(id=id)
  53. else:
  54. return MaterialStatistics.objects.none()
  55. def get_serializer_class(self):
  56. if self.action in ['list' ]:
  57. return MaterialStatisticsSerializer
  58. elif self.action in ['retrieve']:
  59. return MaterialStatisticsSerializer_items
  60. else:
  61. return self.http_method_not_allowed(request=self.request)
  62. class BoundListViewSet(viewsets.ModelViewSet):
  63. """
  64. retrieve:
  65. Response a data list(get)
  66. list:
  67. Response a data list(all)
  68. create:
  69. Create a data line(post)
  70. delete:
  71. Delete a data line(delete)
  72. """
  73. # authentication_classes = [] # 禁用所有认证类
  74. # permission_classes = [AllowAny] # 允许任意访问
  75. pagination_class = MyPageNumberPagination
  76. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  77. ordering_fields = ['id', "create_time", "update_time", ]
  78. filter_class = BoundListFilter
  79. def get_project(self):
  80. try:
  81. id = self.kwargs.get('pk')
  82. return id
  83. except:
  84. return None
  85. def get_queryset(self):
  86. id = self.get_project()
  87. if self.request.user:
  88. if id is None:
  89. return BoundListModel.objects.filter( is_delete=False)
  90. else:
  91. return BoundListModel.objects.filter( id=id, is_delete=False)
  92. else:
  93. return BoundListModel.objects.none()
  94. def get_serializer_class(self):
  95. if self.action in ['list', 'destroy','retrieve']:
  96. return BoundListGetSerializer
  97. elif self.action in ['create', 'update']:
  98. return BoundListPostSerializer
  99. else:
  100. return self.http_method_not_allowed(request=self.request)
  101. def create(self, request, *args, **kwargs):
  102. data = self.request.data
  103. # if BoundListModel.objects.filter(code=data['code'], is_delete=False).exists():
  104. # raise APIException({"detail": "Data exists"})
  105. # else:
  106. data['openid'] = self.request.auth.openid
  107. data['bound_date'] =str(timezone.now().strftime('%Y-%m-%d'))
  108. order_day=str(timezone.now().strftime('%Y-%m-'))
  109. data['bound_month'] =str(timezone.now().strftime('%Y%m'))
  110. if data['bound_type'] == 'in':
  111. data['bound_status'] = '100'
  112. else:
  113. data['bound_status'] = '200'
  114. qs_set = BoundListModel.objects.filter(bound_month=data['bound_month'], bound_code_type=data['bound_code_type'], is_delete=False)
  115. print('qs_set是:', len(qs_set))
  116. if len(qs_set) > 0:
  117. bound_last_code = qs_set.order_by('-id').first().bound_code
  118. data['bound_code'] = data['bound_code_type'] +'-'+ order_day + str(int(bound_last_code.split('-')[-1])+1).zfill(4)
  119. else:
  120. data['bound_code'] = data['bound_code_type'] +'-'+ order_day + '0001'
  121. serializer = self.get_serializer(data=data)
  122. serializer.is_valid(raise_exception=True)
  123. serializer.save()
  124. headers = self.get_success_headers(serializer.data)
  125. return Response(serializer.data, status=200, headers=headers)
  126. def update(self, request, pk):
  127. qs = self.get_object()
  128. data = self.request.data
  129. serializer = self.get_serializer(qs, data=data)
  130. serializer.is_valid(raise_exception=True)
  131. serializer.save()
  132. headers = self.get_success_headers(serializer.data)
  133. return Response(serializer.data, status=200, headers=headers)
  134. def destroy(self, request, pk):
  135. qs = self.get_object()
  136. if qs.openid != self.request.auth.openid:
  137. raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
  138. else:
  139. qs.is_delete = True
  140. qs.bound_code =qs.bound_code+'-delete'+str(timezone.now().strftime('%Y%m%d%H%M%S'))
  141. qs.save()
  142. serializer = self.get_serializer(qs, many=False)
  143. headers = self.get_success_headers(serializer.data)
  144. return Response(serializer.data, status=200, headers=headers)
  145. class BoundBatchViewSet(viewsets.ModelViewSet):
  146. """
  147. retrieve:
  148. Response a data list(get)
  149. list:
  150. Response a data list(all)
  151. create:
  152. Create a data line(post)
  153. delete:
  154. Delete a data line(delete)
  155. """
  156. # authentication_classes = [] # 禁用所有认证类
  157. # permission_classes = [AllowAny] # 允许任意访问
  158. pagination_class = MyPageNumberPagination
  159. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  160. ordering_fields = ['id', "create_time", "update_time", ]
  161. filter_class = BoundBatchFilter
  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 BoundBatchModel.objects.filter( is_delete=False)
  173. else:
  174. return BoundBatchModel.objects.filter( id=id, is_delete=False)
  175. else:
  176. return BoundBatchModel.objects.none()
  177. def get_serializer_class(self):
  178. if self.action in ['list', 'destroy','retrieve']:
  179. return BoundBatchGetSerializer
  180. elif self.action in ['create', 'update']:
  181. return BoundBatchPostSerializer
  182. else:
  183. return self.http_method_not_allowed(request=self.request)
  184. def create(self, request, *args, **kwargs):
  185. data = self.request.data
  186. try:
  187. data['openid'] = self.request.auth.openid
  188. data['goods_total_weight'] = data['goods_weight']*data['goods_qty']
  189. order_day=str(timezone.now().strftime('-%Y%m'))
  190. order_month=str(timezone.now().strftime('%Y%m'))
  191. data['bound_month'] =str(timezone.now().strftime('%Y%m'))
  192. print(data['order'])
  193. if data['order'] == 'true':
  194. qs_set = BoundBatchModel.objects.filter( goods_code=data['goods_code'], bound_month=order_month, is_delete=False)
  195. print('qs_set是:', len(qs_set))
  196. if len(qs_set) > 0:
  197. bound_last_code = qs_set.order_by('-id').first().bound_number
  198. data['bound_batch_order'] = int(bound_last_code.split('-')[-1])+1
  199. data['bound_number'] = data['goods_code'] + '-' + str(int(bound_last_code.split('-')[-1])+1)
  200. else:
  201. data['bound_batch_order'] = int(order_day.split('-')[-1])*1000 +1
  202. data['bound_number'] = data['goods_code'] + order_day + '001'
  203. else:
  204. data['bound_number'] = data['goods_code'] + '-' + str(data['bound_batch_order'])
  205. serializer = self.get_serializer(data=data)
  206. serializer.is_valid(raise_exception=True)
  207. serializer.save()
  208. headers = self.get_success_headers(serializer.data)
  209. self.add_batch_log(serializer.data, 0, data['goods_qty'])
  210. return Response(serializer.data, status=200, headers=headers)
  211. except Exception as e:
  212. print(e)
  213. raise APIException({"detail": "{}".format(e)})
  214. def add_batch_log(self, data, log_type, goods_qty):
  215. choices_dict = dict(BatchLogModel.BATCH_LOG_TYPE)
  216. log_type_name = choices_dict.get(log_type, "未知类型")
  217. try:
  218. # 获取 BoundBatchModel 实例
  219. batch_obj = BoundBatchModel.objects.get(id=data['id'])
  220. except BoundBatchModel.DoesNotExist:
  221. return False
  222. log_data = {
  223. 'batch_id': batch_obj,
  224. 'log_type': log_type,
  225. 'log_date': timezone.now().strftime('%Y-%m-%d-%H:%M'), # 直接格式化时间,无需转字符串
  226. 'goods_code': data['goods_code'],
  227. 'goods_desc': data['goods_desc'],
  228. 'goods_qty': data['goods_qty'],
  229. 'log_content': f"{log_type_name} {data['goods_qty']}件",
  230. 'creater': data['creater'],
  231. 'openid': data['openid'],
  232. 'is_delete': False,
  233. }
  234. # 创建日志记录
  235. BatchLogModel.objects.create(**log_data)
  236. return True
  237. def update(self, request, pk):
  238. qs = self.get_object()
  239. data = self.request.data
  240. serializer = self.get_serializer(qs, data=data)
  241. serializer.is_valid(raise_exception=True)
  242. serializer.save()
  243. headers = self.get_success_headers(serializer.data)
  244. return Response(serializer.data, status=200, headers=headers)
  245. def destroy(self, request, pk):
  246. qs = self.get_object()
  247. if qs.openid != self.request.auth.openid:
  248. raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
  249. else:
  250. qs.is_delete = True
  251. qs.save()
  252. serializer = self.get_serializer(qs, many=False)
  253. headers = self.get_success_headers(serializer.data)
  254. return Response(serializer.data, status=200, headers=headers)
  255. class BoundDetailViewSet(viewsets.ModelViewSet):
  256. """
  257. retrieve:
  258. Response a data list(get)
  259. list:
  260. Response a data list(all)
  261. create:
  262. Create a data line(post)
  263. delete:
  264. Delete a data line(delete)
  265. """
  266. # authentication_classes = [] # 禁用所有认证类
  267. # permission_classes = [AllowAny] # 允许任意访问
  268. pagination_class = MyPageNumberPagination
  269. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  270. ordering_fields = ['id', "create_time", "update_time", ]
  271. filter_class = BoundDetailFilter
  272. def get_project(self):
  273. try:
  274. id = self.kwargs.get('pk')
  275. return id
  276. except:
  277. return None
  278. def get_queryset(self):
  279. id = self.get_project()
  280. if self.request.user:
  281. if id is None:
  282. return BoundDetailModel.objects.filter( is_delete=False)
  283. else:
  284. return BoundDetailModel.objects.filter( id=id, is_delete=False)
  285. else:
  286. return BoundDetailModel.objects.none()
  287. def get_serializer_class(self):
  288. if self.action in ['list', 'destroy','retrieve']:
  289. return BoundDetailGetSerializer
  290. elif self.action in ['create', 'update']:
  291. return BoundDetailPostSerializer
  292. else:
  293. return self.http_method_not_allowed(request=self.request)
  294. def create(self, request, *args, **kwargs):
  295. data = self.request.data
  296. data['openid'] = self.request.auth.openid
  297. data.setdefault('is_delete', False)
  298. # 验证并保存数据
  299. data['detail_code'] = f"DC-{data['bound_list']:02}{data['bound_batch']:02}"
  300. print(data['detail_code'])
  301. if BoundDetailModel.objects.filter(detail_code=data['detail_code'], is_delete=False).exists():
  302. raise APIException({"detail": "Data exists"})
  303. else:
  304. serializer = self.get_serializer(data=data)
  305. serializer.is_valid(raise_exception=True)
  306. serializer.save()
  307. # 返回响应
  308. headers = self.get_success_headers(serializer.data)
  309. return Response(serializer.data, status=200, headers=headers)
  310. def update(self, request, pk):
  311. qs = self.get_object()
  312. data = self.request.data
  313. serializer = self.get_serializer(qs, data=data)
  314. serializer.is_valid(raise_exception=True)
  315. serializer.save()
  316. headers = self.get_success_headers(serializer.data)
  317. return Response(serializer.data, status=200, headers=headers)
  318. def destroy(self, request, pk):
  319. qs = self.get_object()
  320. if qs.openid != self.request.auth.openid:
  321. raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
  322. else:
  323. qs.is_delete = True
  324. qs.save()
  325. serializer = self.get_serializer(qs, many=False)
  326. headers = self.get_success_headers(serializer.data)
  327. return Response(serializer.data, status=200, headers=headers)
  328. class OutBoundDetailViewSet(viewsets.ModelViewSet):
  329. """
  330. retrieve:
  331. Response a data list(get)
  332. list: Response a data list(all)
  333. create:
  334. Create a data line(post)
  335. delete:
  336. Delete a data line(delete)
  337. """
  338. # authentication_classes = [] # 禁用所有认证类
  339. # permission_classes = [AllowAny] # 允许任意访问
  340. pagination_class = MyPageNumberPagination
  341. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  342. ordering_fields = ['id', "create_time", "update_time", ]
  343. filter_class = OutBoundDetailFilter
  344. def get_project(self):
  345. try:
  346. id = self.kwargs.get('pk')
  347. return id
  348. except:
  349. return None
  350. def get_queryset(self):
  351. id = self.get_project()
  352. if self.request.user:
  353. if id is None:
  354. return OutBoundDetailModel.objects.filter( is_delete=False)
  355. else:
  356. return OutBoundDetailModel.objects.filter( id=id, is_delete=False)
  357. else:
  358. return OutBoundDetailModel.objects.none()
  359. def get_serializer_class(self):
  360. if self.action in ['list', 'destroy','retrieve']:
  361. return OutBoundDetailGetSerializer
  362. elif self.action in ['create', 'update']:
  363. return OutBoundDetailPostSerializer
  364. else:
  365. return self.http_method_not_allowed(request=self.request)
  366. def create(self, request, *args, **kwargs):
  367. data = self.request.data
  368. data['openid'] = self.request.auth.openid
  369. data.setdefault('is_delete', False)
  370. data['bound_batch_number'] = OutBatchModel.objects.get(id=data['bound_batch']).batch_number.id
  371. # 验证并保存数据
  372. data['detail_code'] = f"DC-{data['bound_list']:02}{data['bound_batch']:02}"
  373. print(data['detail_code'])
  374. if OutBoundDetailModel.objects.filter(detail_code=data['detail_code'], is_delete=False).exists():
  375. raise APIException({"detail": "Data exists"})
  376. else:
  377. serializer = self.get_serializer(data=data)
  378. serializer.is_valid(raise_exception=True)
  379. serializer.save()
  380. # 返回响应
  381. headers = self.get_success_headers(serializer.data)
  382. return Response(serializer.data, status=200, headers=headers)
  383. def update(self, request, pk):
  384. qs = self.get_object()
  385. data = self.request.data
  386. serializer = self.get_serializer(qs, data=data)
  387. serializer.is_valid(raise_exception=True)
  388. serializer.save()
  389. headers = self.get_success_headers(serializer.data)
  390. return Response(serializer.data, status=200, headers=headers)
  391. def destroy(self, request, pk):
  392. qs = self.get_object()
  393. if qs.openid != self.request.auth.openid:
  394. raise APIException({"detail": "该入库非您所属,禁止删除,您可以进行编辑"})
  395. else:
  396. qs.is_delete = True
  397. qs.save()
  398. serializer = self.get_serializer(qs, many=False)
  399. headers = self.get_success_headers(serializer.data)
  400. return Response(serializer.data, status=200, headers=headers)
  401. class OutBoundBatchViewSet(viewsets.ModelViewSet):
  402. """
  403. retrieve:
  404. Response a data list(get)
  405. list:
  406. Response a data list(all)
  407. create:
  408. Create a data line(post)
  409. delete:
  410. Delete a data line(delete)
  411. """
  412. # authentication_classes = [] # 禁用所有认证类
  413. # permission_classes = [AllowAny] # 允许任意访问
  414. pagination_class = MyPageNumberPagination
  415. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  416. ordering_fields = ['id', "create_time", "update_time", ]
  417. filter_class = OutBatchFilter
  418. def get_project(self):
  419. try:
  420. id = self.kwargs.get('pk')
  421. return id
  422. except:
  423. return None
  424. def get_queryset(self):
  425. id = self.get_project()
  426. if self.request.user:
  427. if id is None:
  428. return OutBatchModel.objects.filter( is_delete=False)
  429. else:
  430. return OutBatchModel.objects.filter( id=id, is_delete=False)
  431. else:
  432. return OutBatchModel.objects.none()
  433. def get_serializer_class(self):
  434. if self.action in ['list', 'destroy','retrieve']:
  435. return OutBatchGetSerializer
  436. elif self.action in ['create', 'update']:
  437. return OutBatchPostSerializer
  438. else:
  439. return self.http_method_not_allowed(request=self.request)
  440. def create(self, request, *args, **kwargs):
  441. data = self.request.data
  442. batch_obj = BoundBatchModel.objects.get(bound_number=data['out_number'])
  443. if batch_obj is None:
  444. raise APIException({"detail": "批次不存在"})
  445. data['batch_number'] = batch_obj.id
  446. data['out_date'] = str(timezone.now().strftime('%Y-%m-%d %H:%M:%S'))
  447. data['openid'] = self.request.auth.openid
  448. data.setdefault('is_delete', False)
  449. data['goods_total_weight'] = data['goods_weight']*data['goods_out_qty']
  450. data['goods_qty'] = batch_obj.goods_qty -batch_obj.goods_out_qty - data['goods_out_qty']
  451. batch_obj.goods_out_qty += data['goods_out_qty']
  452. if batch_obj.goods_out_qty > batch_obj.goods_in_qty:
  453. raise APIException({"detail": "出库数量大于批次数量"})
  454. batch_obj.goods_qty -= data['goods_out_qty']
  455. batch_obj.save()
  456. data['status'] = 0 #现在处于出库申请状态
  457. serializer = self.get_serializer(data=data)
  458. serializer.is_valid(raise_exception=True)
  459. serializer.save()
  460. headers = self.get_success_headers(serializer.data)
  461. self.add_batch_log(serializer.data, 1, data['goods_out_qty'])
  462. return Response(serializer.data, status=200, headers=headers)
  463. def update(self, request, pk):
  464. qs = self.get_object()
  465. data = self.request.data
  466. data['openid'] = self.request.auth.openid
  467. data.setdefault('is_delete', False)
  468. data['goods_total_weight'] = data['goods_weight']*data['goods_qty']
  469. serializer = self.get_serializer(qs, data=data)
  470. serializer.is_valid(raise_exception=True)
  471. serializer.save()
  472. headers = self.get_success_headers(serializer.data)
  473. self.add_batch_log(serializer.data, 1, data['goods_qty'])
  474. return Response(serializer.data, status=200, headers=headers)
  475. def destroy(self, request, pk):
  476. qs = self.get_object()
  477. if qs.openid != self.request.auth.openid:
  478. raise APIException({"detail": "该出库非您所属,禁止删除,您可以进行编辑"})
  479. else:
  480. qs.is_delete = True
  481. qs.save()
  482. serializer = self.get_serializer(qs, many=False)
  483. headers = self.get_success_headers(serializer.data)
  484. return Response(serializer.data, status=200, headers=headers)
  485. def add_batch_log(self, data, log_type, goods_qty):
  486. choices_dict = dict(BatchLogModel.BATCH_LOG_TYPE)
  487. log_type_name = choices_dict.get(log_type, "未知类型")
  488. try:
  489. # 获取 BoundBatchModel 实例
  490. batch_obj = BoundBatchModel.objects.get(id=data['batch_number'])
  491. except BoundBatchModel.DoesNotExist:
  492. # 处理批次不存在的情况(如记录日志或抛出异常)
  493. return False
  494. log_data = {
  495. 'batch_id': batch_obj, # 关键修复:传入实例对象,而不是 batch_obj.id
  496. 'log_type': log_type,
  497. 'log_date': timezone.now().strftime('%Y-%m-%d-%H:%M'), # 直接格式化时间,无需转字符串
  498. 'goods_code': data['goods_code'],
  499. 'goods_desc': data['goods_desc'],
  500. 'goods_qty': data['goods_qty'],
  501. 'log_content': f"{log_type_name} {goods_qty}件",
  502. 'creater': data['creater'],
  503. 'openid': data['openid'],
  504. 'is_delete': False,
  505. # 注意:create_time 和 update_time 由模型的 auto_now_add 和 auto_now 自动处理,无需手动赋值
  506. }
  507. # 创建日志记录
  508. BatchLogModel.objects.create(**log_data)
  509. return True
  510. class BoundBatchLogViewSet(viewsets.ModelViewSet):
  511. """
  512. retrieve:
  513. Response a data list(get)
  514. list:
  515. Response a data list(all)
  516. delete:
  517. Delete a data line(delete)
  518. """
  519. # authentication_classes = [] # 禁用所有认证类
  520. # permission_classes = [AllowAny] # 允许任意访问
  521. pagination_class = MyPageNumberPagination
  522. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  523. ordering_fields = ['id', "create_time", "update_time", ]
  524. filter_class = BatchlogFilter
  525. def get_queryset(self):
  526. return BatchLogModel.objects.filter( is_delete=False)
  527. def get_serializer_class(self):
  528. if self.action in ['list', 'destroy','retrieve']:
  529. return BatchLogGetSerializer
  530. else:
  531. return self.http_method_not_allowed(request=self.request)
  532. def destroy(self, request, pk):
  533. qs = self.get_object()
  534. qs.is_delete = True
  535. qs.save()
  536. serializer = self.get_serializer(qs, many=False)
  537. headers = self.get_success_headers(serializer.data)
  538. return Response(serializer.data, status=200, headers=headers)
  539. class BatchContainerAPIView(APIView):
  540. """
  541. post:
  542. 返回批次对应的container列表
  543. """
  544. # authentication_classes = [] # 禁用所有认证类
  545. # permission_classes = [AllowAny] # 允许任意访问
  546. def post(self, request):
  547. data = request.data
  548. batch_id = data.get('batch_id')
  549. from container.models import ContainerDetailModel
  550. container_detail_all = ContainerDetailModel.objects.filter(batch_id=batch_id, is_delete=False).exclude(status=3).all()
  551. container_dict = {}
  552. for container_detail in container_detail_all:
  553. container_id = container_detail.container_id
  554. if container_id not in container_dict:
  555. container_dict[container_id] = {
  556. 'id': container_id,
  557. 'goods_code': container_detail.goods_code,
  558. 'goods_desc': container_detail.goods_desc,
  559. 'container_code': container_detail.container.container_code,
  560. 'current_location': container_detail.container.current_location,
  561. 'goods_qty': container_detail.goods_qty-container_detail.goods_out_qty,
  562. 'class':container_detail.goods_class
  563. }
  564. else:
  565. container_dict[container_id]['goods_qty'] += container_detail.goods_qty-container_detail.goods_out_qty
  566. container_dict = list(container_dict.values())
  567. return_data = {'code': 200,'msg': 'Success Create', 'data': container_dict}
  568. return Response(return_data)