feat: 去除mlogbdefect

This commit is contained in:
caoqianming 2025-01-09 10:07:51 +08:00
parent f209d1767d
commit 3751b2f2e2
6 changed files with 57 additions and 87 deletions

View File

@ -235,6 +235,20 @@ class FtestWork(CommonBDModel):
ftestwork_count_fields.append(f.name) ftestwork_count_fields.append(f.name)
return ftestwork_count_fields 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): class Ftest(CommonBDModel):
""" """
检验记录 检验记录

View File

@ -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='不合格缺陷'),
),
]

View File

@ -352,25 +352,18 @@ class Mlogb(BaseModel):
elif self.material_out: elif self.material_out:
return "out", self.material_out.tracking return "out", self.material_out.tracking
def cal_count(self): # class MlogbDefect(BaseModel):
self.count_notok = MlogbDefect.objects.filter( # mlogb = models.ForeignKey(Mlogb, verbose_name='关联记录', on_delete=models.CASCADE)
mlogb=self, defect__okcate=30).aggregate(total=Sum("count"))["total"] or 0 # defect = models.ForeignKey("qm.defect", verbose_name='缺陷', on_delete=models.CASCADE)
self.count_ok = self.count_real - self.count_notok # count = models.PositiveIntegerField('数量', default=0)
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 Mlogbw(BaseModel): class Mlogbw(BaseModel):
number = models.TextField('单个编号') number = models.TextField('单个编号')
mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE) mlogb = models.ForeignKey(Mlogb, verbose_name='生产记录', on_delete=models.CASCADE)
wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL
, related_name='wpr_mlogbw', null=True, blank=True) , 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) note = models.TextField('备注', null=True, blank=True)

View File

@ -908,16 +908,16 @@ class BatchStSerializer(CustomModelSerializer):
model = BatchSt model = BatchSt
fields = "__all__" fields = "__all__"
class MlogbDefectSerializer(CustomModelSerializer): # class MlogbDefectSerializer(CustomModelSerializer):
defect_name = serializers.CharField(source='defect.name', read_only=True) # defect_name = serializers.CharField(source='defect.name', read_only=True)
class Meta: # class Meta:
model = MlogbDefect # model = MlogbDefect
fields = "__all__" # fields = "__all__"
read_only_fields = EXCLUDE_FIELDS_BASE # read_only_fields = EXCLUDE_FIELDS_BASE
#
def create(self, validated_data): # def create(self, validated_data):
defect = validated_data["defect"] # defect = validated_data["defect"]
mlogb = validated_data["mlogb"] # mlogb = validated_data["mlogb"]
if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists(): # if MlogbDefect.objects.filter(mlogb=mlogb, defect=defect).exists():
raise ParseError('该缺陷已填写') # raise ParseError('该缺陷已填写')
return super().create(validated_data) # return super().create(validated_data)

View File

@ -5,7 +5,7 @@ from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet,
WMaterialViewSet, MlogViewSet, HandoverViewSet, WMaterialViewSet, MlogViewSet, HandoverViewSet,
AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet, AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet,
MlogbOutViewSet, FmlogViewSet, BatchStViewSet, MlogbOutViewSet, FmlogViewSet, BatchStViewSet,
MlogbwViewSet, MlogbDefectViewSet) MlogbwViewSet)
from apps.wpm.datax import AnaViewSet from apps.wpm.datax import AnaViewSet
@ -28,7 +28,6 @@ router.register('otherlog', OtherLogViewSet, basename='otherlog')
router.register('ana', AnaViewSet, basename='ana') router.register('ana', AnaViewSet, basename='ana')
router.register('batchst', BatchStViewSet, basename='batchst') router.register('batchst', BatchStViewSet, basename='batchst')
router.register('mlogbw', MlogbwViewSet, basename='mlogbw') router.register('mlogbw', MlogbwViewSet, basename='mlogbw')
router.register("mlogbdefect", MlogbDefectViewSet, basename='mlogbdefect')
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
] ]

View File

@ -25,7 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer,
AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer,
MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer,
MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer,
MlogbwCreateUpdateSerializer, MlogbDefectSerializer) MlogbwCreateUpdateSerializer)
from .services import mlog_submit, handover_submit, mlog_revert from .services import mlog_submit, handover_submit, mlog_revert
from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wpm.services import mlog_submit_validate, generate_new_batch
from apps.wf.models import State from apps.wf.models import State
@ -649,26 +649,26 @@ class MlogbwViewSet(CustomModelViewSet):
self.cal_mlogb_count(mlogb_to) self.cal_mlogb_count(mlogb_to)
class MlogbDefectViewSet(CustomListModelMixin, BulkCreateModelMixin, # class MlogbDefectViewSet(CustomListModelMixin, BulkCreateModelMixin,
BulkDestroyModelMixin, CustomGenericViewSet): # BulkDestroyModelMixin, CustomGenericViewSet):
perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"} # perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"}
queryset = MlogbDefect.objects.all() # queryset = MlogbDefect.objects.all()
serializer_class = MlogbDefectSerializer # serializer_class = MlogbDefectSerializer
filterset_fields = ["mlogb", "defect"] # filterset_fields = ["mlogb", "defect"]
ordering = ["create_time"] # ordering = ["create_time"]
#
def filter_queryset(self, queryset): # def filter_queryset(self, queryset):
if not self.detail and not self.request.query_params.get('mlogb', None): # if not self.detail and not self.request.query_params.get('mlogb', None):
raise ParseError('请指定所属日志明细') # raise ParseError('请指定所属日志明细')
return super().filter_queryset(queryset) # return super().filter_queryset(queryset)
#
@transaction.atomic # @transaction.atomic
def perform_create(self, serializer): # def perform_create(self, serializer):
ins:MlogbDefect = serializer.save() # ins:MlogbDefect = serializer.save()
ins.mlogb.cal_count() # ins.mlogb.cal_count()
#
@transaction.atomic # @transaction.atomic
def perform_destroy(self, instance): # def perform_destroy(self, instance):
mlogb = instance.mlogb # mlogb = instance.mlogb
instance.delete() # instance.delete()
mlogb.cal_count() mlogb.cal_count()