入厂检查
This commit is contained in:
parent
1bec31257e
commit
0f38d31883
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 3.2.6 on 2021-11-02 03:13
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('inm', '0008_auto_20211102_0935'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='fifo',
|
||||
name='is_audited',
|
||||
field=models.BooleanField(default=False, verbose_name='是否审核'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='fifodetail',
|
||||
name='is_tested',
|
||||
field=models.BooleanField(default=False, verbose_name='是否检测'),
|
||||
),
|
||||
]
|
|
@ -72,7 +72,8 @@ class FIFODetail(BaseModel):
|
|||
"""
|
||||
出入库详细记录
|
||||
"""
|
||||
is_tested = models.BooleanField('是否检测', default=False)
|
||||
is_tested = models.BooleanField('是否已检测', default=False)
|
||||
is_testok = models.BooleanField('是否检测合格', default=False)
|
||||
material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
||||
count = models.IntegerField('数量', default=0)
|
||||
batch = models.CharField('批次号', max_length=100, null=True, blank=True)
|
||||
|
|
|
@ -8,32 +8,31 @@ def update_inm(instance:FIFO, type:int):
|
|||
"""
|
||||
更新库存(正反)
|
||||
"""
|
||||
if instance.is_audited:
|
||||
warehouse = instance.warehouse
|
||||
if instance.type in [3]: # 采购入库
|
||||
# 更新相关表
|
||||
for i in FIFODetail.objects.filter(fifo=instance):
|
||||
material = i.material
|
||||
o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \
|
||||
defaults={'material':material, 'warehouse':warehouse, 'count':0})
|
||||
o1.count = o1.count + i.count
|
||||
o1.save()
|
||||
o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=i.batch,\
|
||||
defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':i.batch})
|
||||
o2.count = o2.count + i.count
|
||||
o2.save()
|
||||
material.count = material.count + i.count
|
||||
material.save()
|
||||
elif instance.type in [1]: # 生产领料
|
||||
# 更新相关表
|
||||
for i in FIFODetail.objects.filter(fifo=instance):
|
||||
material = i.material
|
||||
o1 = Inventory.objects.get(material=material, warehouse=warehouse)
|
||||
o1.count = o1.count - i.count
|
||||
o1.save()
|
||||
o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch)
|
||||
o2.count = o2.count - i.count
|
||||
o2.save()
|
||||
material.count = material.count - i.count
|
||||
material.save()
|
||||
warehouse = instance.warehouse
|
||||
if instance.type in [3]: # 采购入库
|
||||
# 更新相关表
|
||||
for i in FIFODetail.objects.filter(fifo=instance):
|
||||
material = i.material
|
||||
o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \
|
||||
defaults={'material':material, 'warehouse':warehouse, 'count':0})
|
||||
o1.count = o1.count + i.count
|
||||
o1.save()
|
||||
o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=i.batch,\
|
||||
defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':i.batch})
|
||||
o2.count = o2.count + i.count
|
||||
o2.save()
|
||||
material.count = material.count + i.count
|
||||
material.save()
|
||||
elif instance.type in [1]: # 生产领料
|
||||
# 更新相关表
|
||||
for i in FIFODetail.objects.filter(fifo=instance):
|
||||
material = i.material
|
||||
o1 = Inventory.objects.get(material=material, warehouse=warehouse)
|
||||
o1.count = o1.count - i.count
|
||||
o1.save()
|
||||
o2 = MaterialBatch.objects.get(material=material, warehouse=warehouse, batch=i.batch)
|
||||
o2.count = o2.count - i.count
|
||||
o2.save()
|
||||
material.count = material.count - i.count
|
||||
material.save()
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ class FIFODetailViewSet(ListModelMixin, GenericViewSet):
|
|||
search_fields = []
|
||||
ordering_fields = ['create_time']
|
||||
ordering = ['-create_time']
|
||||
|
||||
|
||||
class FIFOViewSet(ListModelMixin, GenericViewSet):
|
||||
"""
|
||||
出入库记录
|
||||
|
@ -82,7 +82,10 @@ class FIFOViewSet(ListModelMixin, GenericViewSet):
|
|||
perms_map = {'*': '*'}
|
||||
queryset = FIFO.objects.select_related('warehouse', 'operator')
|
||||
serializer_class = FIFOListSerializer
|
||||
filterset_fields = ['warehouse', 'type']
|
||||
filterset_fields = '__all__'
|
||||
ordering_fields = '__all__'
|
||||
search_fields = ['warehouse__name', 'warehouse__number']
|
||||
ordering = ['-pk']
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.action == 'list':
|
||||
|
@ -106,7 +109,7 @@ class FIFOViewSet(ListModelMixin, GenericViewSet):
|
|||
"""
|
||||
obj = self.get_object()
|
||||
for i in FIFODetail.objects.filter(fifo=obj):
|
||||
if not i.is_tested:
|
||||
if not i.is_testok:
|
||||
raise APIException('未检验通过, 不可审核')
|
||||
obj.is_audited = True
|
||||
obj.save()
|
||||
|
|
|
@ -88,6 +88,7 @@ class RecordForm(CommonAModel):
|
|||
type = models.IntegerField('表格类型', choices=type_choices, default=1)
|
||||
step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '记录表格'
|
||||
verbose_name_plural = verbose_name
|
||||
|
@ -130,7 +131,7 @@ class RecordFormField(CommonAModel):
|
|||
field_choice = models.JSONField('radio、checkbox、select的选项', default=dict, blank=True, null=True,
|
||||
help_text='radio,checkbox,select,multiselect类型可供选择的选项,格式为json如:{"1":"中国", "2":"美国"},注意数字也需要引号')
|
||||
sort = models.IntegerField('排序号', default=1)
|
||||
need_judge = models.BooleanField('需要判定', default=False)
|
||||
need_judge = models.BooleanField('需要判定项目', default=False)
|
||||
high_limit = models.FloatField('上限值', null=True, blank=True)
|
||||
high_rule = models.IntegerField('上限规则', choices=high_rule_choices, null=True, blank=True)
|
||||
low_limit = models.FloatField('下限值', null=True, blank=True)
|
||||
|
|
|
@ -151,6 +151,11 @@ class UsedStepListSerializer(serializers.ModelSerializer):
|
|||
queryset = queryset.select_related('step')
|
||||
return queryset
|
||||
|
||||
class RecordFormSimpleSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = RecordForm
|
||||
fields = ['id', 'name']
|
||||
class RecordFormSerializer(serializers.ModelSerializer):
|
||||
step_ = StepSimpleSerializer(source='step', read_only=True)
|
||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||
|
@ -182,6 +187,26 @@ class RecordFormFieldSerializer(serializers.ModelSerializer):
|
|||
model = RecordFormField
|
||||
fields = '__all__'
|
||||
|
||||
class RecordFormDetailSerializer(serializers.ModelSerializer):
|
||||
step_ = StepSimpleSerializer(source='step', read_only=True)
|
||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||
form_fields = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = RecordForm
|
||||
fields = '__all__'
|
||||
|
||||
@staticmethod
|
||||
def setup_eager_loading(queryset):
|
||||
""" Perform necessary eager loading of data. """
|
||||
queryset = queryset.select_related('step', 'material')
|
||||
return queryset
|
||||
|
||||
def get_form_fields(self, obj):
|
||||
serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False), many=True)
|
||||
return serializer.data
|
||||
|
||||
|
||||
class RecordFormFieldCreateSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RecordFormField
|
||||
|
|
|
@ -3,7 +3,7 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet
|
|||
from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin
|
||||
|
||||
from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubplanMaterial, TechDoc, UsedStep, SubProduction
|
||||
from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubplanMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer
|
||||
from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionSerializer, SubplanMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer
|
||||
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
|
@ -159,6 +159,8 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet
|
|||
return RecordFormCreateSerializer
|
||||
elif self.action == 'update':
|
||||
return RecordFormUpdateSerializer
|
||||
elif self.action == 'retrieve':
|
||||
return RecordFormDetailSerializer
|
||||
return RecordFormSerializer
|
||||
|
||||
@action(methods=['get'], detail=True, perms_map={'get':'*'}, pagination_class=None, serializer_class=RecordFormFieldSerializer)
|
||||
|
@ -170,6 +172,8 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet
|
|||
serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
|
||||
|
||||
class RecordFormFieldViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet):
|
||||
"""
|
||||
|
|
|
@ -43,4 +43,10 @@ class AnalysisItem(CommonAModel):
|
|||
class TestRecord(CommonAModel):
|
||||
"""
|
||||
检验记录
|
||||
"""
|
||||
"""
|
||||
|
||||
form = models.ForeignKey('mtm.recordform', verbose_name='所用表格', on_delete=models.CASCADE)
|
||||
record_data = models.JSONField('记录数据', default=dict, blank=True)
|
||||
is_testok = models.BooleanField('是否合格', default=True)
|
||||
fifo_detail = models.ForeignKey('inm.fifodetail', verbose_name='关联的出入库批次', on_delete=models.CASCADE, null=True, blank=True)
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
from rest_framework import serializers
|
||||
from apps.mtm.models import RecordForm, RecordFormField
|
||||
from apps.mtm.serializers import RecordFormFieldSerializer, RecordFormSimpleSerializer
|
||||
from apps.system.serializers import FileSimpleSerializer
|
||||
from .models import Standard, TestItem
|
||||
from .models import Standard, TestItem, TestRecord
|
||||
|
||||
class StandardCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
|
@ -31,3 +33,41 @@ class TestItemSerializer(serializers.ModelSerializer):
|
|||
|
||||
class AnalysisItemSerializer(serializers.ModelSerializer):
|
||||
pass
|
||||
|
||||
|
||||
class TestRecordCreateSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TestRecord
|
||||
fields = ['form', 'record_data', 'is_testok', 'fifo_detail']
|
||||
|
||||
def create(self, validated_data):
|
||||
if 'is_testok' not in validated_data:
|
||||
raise serializers.ValidationError('未填写检测结论')
|
||||
return super().create(validated_data)
|
||||
|
||||
class TestRecordListSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = TestRecord
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class TestRecordDetailSerializer(serializers.ModelSerializer):
|
||||
form_ = RecordFormSimpleSerializer(source='form', read_only=True)
|
||||
record_data_ = serializers.SerializerMethodField()
|
||||
class Meta:
|
||||
model = TestRecord
|
||||
fields = '__all__'
|
||||
|
||||
@staticmethod
|
||||
def setup_eager_loading(queryset):
|
||||
queryset = queryset.select_related('form','fifo_detail')
|
||||
return queryset
|
||||
|
||||
def get_record_data_(self, obj):
|
||||
record_data = obj.record_data
|
||||
all_fields = RecordFormField.objects.filter(form=obj.form, is_deletd=False).order_by('sort')
|
||||
all_fields_l = RecordFormFieldSerializer(instance=all_fields, many=True).data
|
||||
for i in all_fields_l:
|
||||
key = i['field_key']
|
||||
i['field_value'] = record_data.get(key, None)
|
||||
return all_fields_l
|
|
@ -1,4 +1,4 @@
|
|||
from apps.qm.views import StandardViewSet, TestItemViewSet
|
||||
from apps.qm.views import StandardViewSet, TestItemViewSet, TestRecordViewSet
|
||||
from django.db.models import base
|
||||
from rest_framework import urlpatterns
|
||||
from django.urls import path, include
|
||||
|
@ -7,6 +7,7 @@ from rest_framework.routers import DefaultRouter
|
|||
router = DefaultRouter()
|
||||
router.register('standard', StandardViewSet, basename='standard')
|
||||
router.register('testitem', TestItemViewSet, basename='testitem')
|
||||
router.register('testrecord', TestRecordViewSet, basename='testrecord')
|
||||
urlpatterns = [
|
||||
path('', include(router.urls)),
|
||||
]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer
|
||||
from apps.qm.models import Standard, TestItem
|
||||
from apps.qm.serializers import StandardCreateUpdateSerializer, StandardSerializer, TestItemCreateUpdateSerializer, TestItemSerializer, TestRecordCreateSerializer, TestRecordDetailSerializer, TestRecordListSerializer
|
||||
from apps.qm.models import Standard, TestItem, TestRecord
|
||||
from django.shortcuts import render
|
||||
from rest_framework.viewsets import ModelViewSet
|
||||
from apps.system.mixins import CreateUpdateModelAMixin
|
||||
|
@ -37,3 +37,29 @@ class TestItemViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
|||
if self.action in ['create', 'update']:
|
||||
return TestItemCreateUpdateSerializer
|
||||
return TestItemSerializer
|
||||
|
||||
class TestRecordViewSet(ModelViewSet):
|
||||
"""
|
||||
检测记录
|
||||
"""
|
||||
perms_map = {'*': '*'}
|
||||
queryset = TestRecord.objects.select_related('fifo_detail', 'form').all()
|
||||
serializer_class = TestRecordListSerializer
|
||||
ordering = ['-id']
|
||||
|
||||
def get_serializer_class(self):
|
||||
if self.action == 'create':
|
||||
return TestRecordCreateSerializer
|
||||
elif self.action == 'list':
|
||||
return TestRecordListSerializer
|
||||
elif self.action == 'retrieve':
|
||||
return TestRecordDetailSerializer
|
||||
return super().get_serializer_class()
|
||||
|
||||
def perform_create(self, serializer):
|
||||
obj = serializer.save(create_by = self.request.user)
|
||||
# 如果检测合格
|
||||
if obj.fifo_detail:
|
||||
obj.fifo_detail.is_testok = True if obj.is_testok else False
|
||||
obj.fifo_detail.is_tested = True
|
||||
obj.fifo_detail.save()
|
|
@ -1,6 +1,7 @@
|
|||
from rest_framework import serializers
|
||||
from rest_framework.serializers import ModelSerializer
|
||||
from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse
|
||||
from apps.inm.signals import update_inm
|
||||
from apps.mtm.models import Material
|
||||
from apps.mtm.serializers import MaterialSimpleSerializer
|
||||
|
||||
|
@ -53,12 +54,16 @@ class PickSerializer(serializers.Serializer):
|
|||
})
|
||||
wm.count = wm.count + i['pick_count']
|
||||
wm.save()
|
||||
# 更新子计划进度
|
||||
# 更新子计划物料情况
|
||||
spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=1)
|
||||
spp.count_real = spp.count_real + i['pick_count']
|
||||
spp.save()
|
||||
sp.is_picked=True
|
||||
sp.save()
|
||||
# 更新库存
|
||||
fifo.is_audited = True
|
||||
fifo.save()
|
||||
update_inm(fifo)
|
||||
return fifo
|
||||
|
||||
class WMaterialListSerializer(serializers.ModelSerializer):
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
from rest_framework.viewsets import GenericViewSet
|
||||
|
||||
class MyGenericViewSet(GenericViewSet):
|
||||
filterset_fields = '__all__'
|
||||
ordering_fields = '__all__'
|
||||
ordering = ['-pk']
|
Loading…
Reference in New Issue