diff --git a/apps/qm/models.py b/apps/qm/models.py index 0d547a28..32110ff3 100644 --- a/apps/qm/models.py +++ b/apps/qm/models.py @@ -235,6 +235,20 @@ class FtestWork(CommonBDModel): ftestwork_count_fields.append(f.name) return ftestwork_count_fields + # def cal_count(self): + # self.count_notok = FtestworkDefect.objects.filter( + # mlogb=self, defect__okcate=30).aggregate(total=Sum("count"))["total"] or 0 + # self.count_ok = self.count_real - self.count_notok + # if self.count_ok < 0: + # raise ParseError('合格数量不能小于0') + # self.save(update_fields=['count_ok', 'count_notok']) + +# class FtestworkDefect(BaseModel): +# ftestwork = models.ForeignKey(FtestWork, verbose_name='关联检验工作', on_delete=models.CASCADE, +# related_name='ftestwork_defect') +# defect = models.ForeignKey(Defect, verbose_name='缺陷', on_delete=models.CASCADE) +# count = models.PositiveIntegerField('数量', default=0) + class Ftest(CommonBDModel): """ 检验记录 diff --git a/apps/wpm/migrations/0084_auto_20250108_1501.py b/apps/wpm/migrations/0084_auto_20250108_1501.py deleted file mode 100644 index b5b43404..00000000 --- a/apps/wpm/migrations/0084_auto_20250108_1501.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 3.2.12 on 2025-01-08 07:01 - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('qm', '0034_auto_20250108_1016'), - ('wpm', '0083_mlogbw_ftest'), - ] - - operations = [ - migrations.CreateModel( - name='MlogbDefect', - fields=[ - ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), - ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), - ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), - ('count', models.PositiveIntegerField(default=0, verbose_name='数量')), - ('defect', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='qm.defect', verbose_name='缺陷')), - ('mlogb', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.mlogb', verbose_name='关联记录')), - ], - options={ - 'abstract': False, - }, - ), - migrations.AddField( - model_name='mlogb', - name='defects', - field=models.ManyToManyField(blank=True, through='wpm.MlogbDefect', to='qm.Defect', verbose_name='不合格缺陷'), - ), - ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index b41b4127..f83aa1e4 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -352,25 +352,18 @@ class Mlogb(BaseModel): elif self.material_out: return "out", self.material_out.tracking - def cal_count(self): - self.count_notok = MlogbDefect.objects.filter( - mlogb=self, defect__okcate=30).aggregate(total=Sum("count"))["total"] or 0 - self.count_ok = self.count_real - self.count_notok - if self.count_ok < 0: - raise ParseError('合格数量不能小于0') - self.save(update_fields=['count_ok', 'count_notok']) - -class MlogbDefect(BaseModel): - mlogb = models.ForeignKey(Mlogb, verbose_name='关联记录', on_delete=models.CASCADE) - defect = models.ForeignKey("qm.defect", verbose_name='缺陷', on_delete=models.CASCADE) - count = models.PositiveIntegerField('数量', default=0) +# class MlogbDefect(BaseModel): +# mlogb = models.ForeignKey(Mlogb, verbose_name='关联记录', on_delete=models.CASCADE) +# defect = models.ForeignKey("qm.defect", verbose_name='缺陷', on_delete=models.CASCADE) +# count = models.PositiveIntegerField('数量', default=0) class Mlogbw(BaseModel): number = models.TextField('单个编号') mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE) wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL , related_name='wpr_mlogbw', null=True, blank=True) - ftest = models.OneToOneField("qm.ftest", verbose_name='关联检验', on_delete=models.PROTECT, null=True, blank=True) + ftest = models.OneToOneField("qm.ftest", verbose_name='关联检验', + on_delete=models.PROTECT, null=True, blank=True, related_name="mlogbw_ftest") note = models.TextField('备注', null=True, blank=True) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index ea1451a5..12c0317e 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -908,16 +908,16 @@ class BatchStSerializer(CustomModelSerializer): model = BatchSt fields = "__all__" -class MlogbDefectSerializer(CustomModelSerializer): - defect_name = serializers.CharField(source='defect.name', read_only=True) - class Meta: - model = MlogbDefect - fields = "__all__" - read_only_fields = EXCLUDE_FIELDS_BASE - - def create(self, validated_data): - defect = validated_data["defect"] - mlogb = validated_data["mlogb"] - if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists(): - raise ParseError('该缺陷已填写') - return super().create(validated_data) \ No newline at end of file +# class MlogbDefectSerializer(CustomModelSerializer): +# defect_name = serializers.CharField(source='defect.name', read_only=True) +# class Meta: +# model = MlogbDefect +# fields = "__all__" +# read_only_fields = EXCLUDE_FIELDS_BASE +# +# def create(self, validated_data): +# defect = validated_data["defect"] +# mlogb = validated_data["mlogb"] +# if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists(): +# raise ParseError('该缺陷已填写') +# return super().create(validated_data) \ No newline at end of file diff --git a/apps/wpm/urls.py b/apps/wpm/urls.py index d64e046d..406d0280 100644 --- a/apps/wpm/urls.py +++ b/apps/wpm/urls.py @@ -5,7 +5,7 @@ from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet, AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet, MlogbOutViewSet, FmlogViewSet, BatchStViewSet, - MlogbwViewSet, MlogbDefectViewSet) + MlogbwViewSet) from apps.wpm.datax import AnaViewSet @@ -28,7 +28,6 @@ router.register('otherlog', OtherLogViewSet, basename='otherlog') router.register('ana', AnaViewSet, basename='ana') router.register('batchst', BatchStViewSet, basename='batchst') router.register('mlogbw', MlogbwViewSet, basename='mlogbw') -router.register("mlogbdefect", MlogbDefectViewSet, basename='mlogbdefect') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 7901dd8f..7f30235f 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -25,7 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, - MlogbwCreateUpdateSerializer, MlogbDefectSerializer) + MlogbwCreateUpdateSerializer) from .services import mlog_submit, handover_submit, mlog_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State @@ -649,26 +649,26 @@ class MlogbwViewSet(CustomModelViewSet): self.cal_mlogb_count(mlogb_to) -class MlogbDefectViewSet(CustomListModelMixin, BulkCreateModelMixin, - BulkDestroyModelMixin, CustomGenericViewSet): - perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"} - queryset = MlogbDefect.objects.all() - serializer_class = MlogbDefectSerializer - filterset_fields = ["mlogb", "defect"] - ordering = ["create_time"] - - def filter_queryset(self, queryset): - if not self.detail and not self.request.query_params.get('mlogb', None): - raise ParseError('请指定所属日志明细') - return super().filter_queryset(queryset) - - @transaction.atomic - def perform_create(self, serializer): - ins:MlogbDefect = serializer.save() - ins.mlogb.cal_count() - - @transaction.atomic - def perform_destroy(self, instance): - mlogb = instance.mlogb - instance.delete() +# class MlogbDefectViewSet(CustomListModelMixin, BulkCreateModelMixin, +# BulkDestroyModelMixin, CustomGenericViewSet): +# perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"} +# queryset = MlogbDefect.objects.all() +# serializer_class = MlogbDefectSerializer +# filterset_fields = ["mlogb", "defect"] +# ordering = ["create_time"] +# +# def filter_queryset(self, queryset): +# if not self.detail and not self.request.query_params.get('mlogb', None): +# raise ParseError('请指定所属日志明细') +# return super().filter_queryset(queryset) +# +# @transaction.atomic +# def perform_create(self, serializer): +# ins:MlogbDefect = serializer.save() +# ins.mlogb.cal_count() +# +# @transaction.atomic +# def perform_destroy(self, instance): +# mlogb = instance.mlogb +# instance.delete() mlogb.cal_count() \ No newline at end of file