diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index a0d1014..1b14ae3 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -95,6 +95,13 @@ class FIFOItemCreateSerializer(serializers.ModelSerializer): if fifo.pu_order is not None: raise ValidationError('非采购订单') return super().create(validated_data) + + def validate_batch(self, value): + if value == '': + return value + elif len(value) > 6: + return value + raise ValidationError('批次号错误') class FIFOItemUpdateSerializer(serializers.ModelSerializer): class Meta: @@ -122,6 +129,13 @@ class FIFODetailInPurSerializer(serializers.ModelSerializer): class Meta: model = FIFOItem fields = ['material', 'count', 'batch', 'details', 'warehouse'] + + def validate_batch(self, value): + if value == '': + return value + elif len(value) > 6: + return value + raise ValidationError('批次号错误') class MaterialBatchQuerySerializer(serializers.Serializer): diff --git a/hb_server/apps/inm/services.py b/hb_server/apps/inm/services.py index 1c3c743..1bfa718 100644 --- a/hb_server/apps/inm/services.py +++ b/hb_server/apps/inm/services.py @@ -1,6 +1,9 @@ from rest_framework.exceptions import ValidationError -from apps.inm.models import FIFOItemProduct, IProduct, Inventory, MaterialBatch, FIFO, FIFOItem - +from sqlalchemy import true +from apps.inm.models import FIFOItemProduct, IProduct, Inventory, MaterialBatch, FIFO, FIFOItem, WareHouse +from apps.mtm.models import Material +from apps.sam.models import SalePack, SaleProduct +from django.db.models import Count class InmService: @classmethod def update_inm(cls, instance:FIFO, type:int=1): @@ -72,4 +75,60 @@ class InmService: if instance.type == FIFO.FIFO_TYPE_DO_OUT: # 生产领料的情况直接从IProduct中删除 numbers = FIFOItemProduct.objects.filter(fifoitem=i).values_list('number', flat=True) - IProduct.objects.filter(number__in=numbers).delete() \ No newline at end of file + IProduct.objects.filter(number__in=numbers).delete() + # 销售的话已经处理了 + # elif instance.type == FIFO.FIFO_TYPE_SALE_OUT: + # ips = FIFOItemProduct.objects.filter(fifoitem=i).values_list('iproduct', flat=True) + # IProduct.objects.filter(id__in=ips).update(state=IProduct.SALED) + + @classmethod + def sale_out_audit(cls, fifo:FIFO): + sale = fifo.sale + saleps = SaleProduct.objects.filter(sale=sale, packnum__isnull=True, remark__isnull=True) + if saleps.exists(): + raise ValidationError('存在未装箱的产品') + # 创建出库条目 + ips = IProduct.objects.filter(sale_iproduct__sale=sale + ).exclude(sale_iproduct__packnum__isnull=True) + ips.update(state=IProduct.SALED) + items = ips.values('warehouse', 'material', 'batch').annotate(total=Count('id')) + for i in items: + warehouse = WareHouse.objects.get(id=i['warehouse']) + material = Material.objects.get(id=i['material']) + fifoitem = FIFOItem() + fifoitem.need_test = False + fifoitem.warehouse = warehouse + fifoitem.material = material + fifoitem.count = i['total'] + fifoitem.batch = i['batch'] + fifoitem.fifo = fifo + fifoitem.save() + items_p = ips.filter(warehouse=warehouse, batch=i['batch']) + ipxs = [] + for i in items_p: + # 创建出库明细半成品 + ip = {} + ip['fifoitem'] = fifoitem + ip['number'] = i.number + ip['material'] = i.material + ip['iproduct'] = i + ipxs.append(FIFOItemProduct(**ip)) + FIFOItemProduct.objects.bulk_create(ipxs) + # 装箱附件处理 + # SalePack.objects.filter(sale_product__in = saleps) + + + # 更新动态产品表情况 + from apps.wpm.models import WProduct + WProduct.objects.filter(iproduct_wproduct__sale_iproduct__sale=sale).update( + act_state=WProduct.WPR_ACT_STATE_SELLED) + + # 变更销售记录实际发货数 + sale.count_real = ips.count() + sale.save() + # 变更订单状态 + order = sale.order + if order: + order.delivered_count = IProduct.objects.filter(sale_iproduct__sale__order=order + ).exclude(sale_iproduct__packnum__isnull=True).count() + order.save() \ No newline at end of file diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index fe4b69a..055b3a8 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -184,11 +184,14 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): return Response() @action(methods=['post'], detail=True, perms_map={'post': 'fifo_audit'}, serializer_class=serializers.Serializer) + @transaction.atomic def audit(self, request, pk=None): """ 审核通过 """ obj = self.get_object() + if obj.type == FIFO.FIFO_TYPE_SALE_OUT: # 如果是销售提货,需额外处理 + pass if not FIFOItem.objects.filter(fifo=obj).exists(): raise ValidationError('出入库条目为空') for i in FIFOItem.objects.filter(fifo=obj, need_test=True): @@ -196,12 +199,11 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): raise APIException('未检验通过, 不可审核') if obj.is_audited: raise APIException('该入库记录已审核通过') - with transaction.atomic(): - obj.is_audited = True - obj.auditor = request.user - obj.inout_date = timezone.now() # 也是审核日期 - obj.save() - InmService.update_inm(obj) # 更新库存 + obj.is_audited = True + obj.auditor = request.user + obj.inout_date = timezone.now() # 也是审核日期 + obj.save() + InmService.update_inm(obj) # 更新库存 return Response() diff --git a/hb_server/apps/sam/serializers_sale.py b/hb_server/apps/sam/serializers_sale.py index 615deea..4fb7589 100644 --- a/hb_server/apps/sam/serializers_sale.py +++ b/hb_server/apps/sam/serializers_sale.py @@ -89,10 +89,11 @@ class SPackItemCreateSerializer(serializers.Serializer): class SaleProductPackSerializer(serializers.ModelSerializer): detail = SPackItemCreateSerializer(many=True) + packnum = serializers.CharField(min_length=6) class Meta: model = SaleProduct fields = ['packnum', 'detail', 'remark'] class SRemarkItemCreateSerializer(serializers.Serializer): - remark = serializers.CharField() + remark = serializers.CharField(min_length=6) diff --git a/hb_server/apps/sam/views_sale.py b/hb_server/apps/sam/views_sale.py index 7c52345..47f3b07 100644 --- a/hb_server/apps/sam/views_sale.py +++ b/hb_server/apps/sam/views_sale.py @@ -89,46 +89,10 @@ class SaleViewSet(CreateUpdateModelAMixin, ListModelMixin, RetrieveModelMixin, C fifo.create_by = request.user fifo.number = 'CK' + ranstr(7) fifo.save() - # 创建出库条目 - # ips = IProduct.objects.filter(sale_iproduct__sale=obj) - # items = ips.values('warehouse', 'material', 'batch').annotate(total=Count('id')) - # for i in items: - # warehouse = WareHouse.objects.get(id=i['warehouse']) - # material = Material.objects.get(id=i['material']) - # fifoitem = FIFOItem() - # fifoitem.need_test = False - # fifoitem.warehouse = warehouse - # fifoitem.material = material - # fifoitem.count = i['total'] - # fifoitem.batch = i['batch'] - # fifoitem.fifo = fifo - # fifoitem.save() - # items_p = ips.filter(warehouse=warehouse, batch=i['batch']) - # ipxs = [] - # for i in items_p: - # # 创建出库明细半成品 - # ip = {} - # ip['fifoitem'] = fifoitem - # ip['number'] = i.number - # ip['material'] = i.material - # ip['iproduct'] = i - # ipxs.append(FIFOItemProduct(**ip)) - # FIFOItemProduct.objects.bulk_create(ipxs) - - # 更新动态产品表情况 - # from apps.wpm.models import WProduct - # WProduct.objects.filter(iproduct_wproduct__sale_iproduct__sale=obj).update( - # act_state=WProduct.WPR_ACT_STATE_SELLED) - # 更新库存 - # InmService.update_inm(fifo) - # 变更销售提货审核状态 + obj.is_audited = True obj.save() - # 变更订单状态 - # if obj.order: - # order = obj.order - # order.delivered_count = order.delivered_count + obj.count - # order.save() + return Response()