feat: qm增加defect

This commit is contained in:
caoqianming 2024-12-17 09:42:11 +08:00
parent 8928c0b7aa
commit 9a14216b78
5 changed files with 85 additions and 10 deletions

View File

@ -0,0 +1,35 @@
# Generated by Django 3.2.12 on 2024-12-17 01:38
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('qm', '0027_ftestwork_ticket'),
]
operations = [
migrations.CreateModel(
name='Defect',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='名称')),
('code', models.CharField(max_length=50, verbose_name='标识')),
('cate', models.CharField(choices=[('尺寸', '尺寸'), ('外观', '外观'), ('内质', '内质')], max_length=50, verbose_name='分类')),
('okcate', models.PositiveSmallIntegerField(choices=[(10, '合格'), (20, '合格B类'), (30, '不合格')], default=30, verbose_name='不合格分类')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='defect_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='defect_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -1,11 +1,26 @@
from django.db import models from django.db import models
from apps.system.models import CommonAModel, CommonADModel, User from apps.system.models import CommonAModel, User
from apps.utils.models import CommonBDModel, BaseModel from apps.utils.models import CommonBDModel, BaseModel
from apps.mtm.models import Material, Mgroup, Team, Shift from apps.mtm.models import Material, Shift
from apps.em.models import Equipment from apps.em.models import Equipment
from apps.wpm.models import SfLog, WMaterial from apps.wpm.models import SfLog, WMaterial
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
class Defect(CommonAModel):
# 缺陷项
DEFECT_OK = 10
DEFECT_OK_B = 20
DEFECT_NOTOK = 30
name = models.CharField(max_length=50, verbose_name="名称")
code = models.CharField(max_length=50, verbose_name="标识")
cate = models.CharField(max_length=50, verbose_name="分类", choices=(("尺寸", "尺寸"), ("外观", "外观"), ("内质", "内质")))
okcate= models.PositiveSmallIntegerField(verbose_name="不合格分类",
choices=((DEFECT_OK, "合格"), (DEFECT_OK_B, "合格B类"), (DEFECT_NOTOK, "不合格")),
default=DEFECT_NOTOK)
def __str__(self):
return self.name
class NotOkOption(models.TextChoices): class NotOkOption(models.TextChoices):
# 不合格项 # 不合格项
zw = "zw", _("炸纹") zw = "zw", _("炸纹")
@ -85,6 +100,7 @@ FTEST_TYPE_CHOICES = (
('process', '过程检验'), ('process', '过程检验'),
('prod', '成品检验') ('prod', '成品检验')
) )
class TestItem(CommonAModel): class TestItem(CommonAModel):
""" """
检测项目 检测项目

View File

@ -1,13 +1,17 @@
from apps.qm.models import QuaStat, TestItem, Ftest, FtestItem, FtestWork, Ptest, NotOkOption from apps.qm.models import QuaStat, TestItem, Ftest, FtestItem, FtestWork, Ptest, NotOkOption, Defect
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from apps.system.models import Dept, Dictionary
from apps.wpm.models import SfLog, WMaterial from apps.wpm.models import SfLog, WMaterial
from django.db import transaction from django.db import transaction
from apps.inm.serializers import MaterialBatchDetailSerializer from apps.inm.serializers import MaterialBatchDetailSerializer
class DefectSerializer(CustomModelSerializer):
class Meta:
model = Defect
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS
class TestItemSerializer(CustomModelSerializer): class TestItemSerializer(CustomModelSerializer):
class Meta: class Meta:

View File

@ -1,7 +1,9 @@
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.qm.views import QuaStatViewSet, TestItemViewSet, FtestWorkViewSet, FtestViewSet, PtestViewSet, NotOkOptionView from apps.qm.views import (QuaStatViewSet, TestItemViewSet,
FtestWorkViewSet, FtestViewSet, PtestViewSet,
NotOkOptionView, DefectViewSet)
API_BASE_URL = 'api/qm/' API_BASE_URL = 'api/qm/'
HTML_BASE_URL = 'qm/' HTML_BASE_URL = 'qm/'
@ -12,6 +14,7 @@ router.register('testitem', TestItemViewSet, basename='testitem')
router.register('ftest', FtestViewSet, basename='ftest') router.register('ftest', FtestViewSet, basename='ftest')
router.register('ftestwork', FtestWorkViewSet, basename='ftestwork') router.register('ftestwork', FtestWorkViewSet, basename='ftestwork')
router.register('ptest', PtestViewSet, basename='ptest') router.register('ptest', PtestViewSet, basename='ptest')
router.register("defect", DefectViewSet, basename="defect")
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
path(API_BASE_URL + 'notok_option/', NotOkOptionView.as_view()), path(API_BASE_URL + 'notok_option/', NotOkOptionView.as_view()),

View File

@ -1,27 +1,38 @@
from django.shortcuts import render from rest_framework.mixins import ListModelMixin
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from apps.qm.models import QuaStat, TestItem, Ftest, Ptest, FtestWork from apps.qm.models import QuaStat, TestItem, Ftest, Ptest, FtestWork
from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \ from apps.qm.serializers import QuaStatSerializer, TestItemSerializer, QuaStatUpdateSerializer, FtestSerializer, PtestSerializer, \
FtestWorkCreateUpdateSerializer, FtestWorkSerializer FtestWorkCreateUpdateSerializer, FtestWorkSerializer, DefectSerializer
from apps.qm.tasks import cal_quastat_sflog from apps.qm.tasks import cal_quastat_sflog
from rest_framework.response import Response from rest_framework.response import Response
from apps.utils.mixins import BulkCreateModelMixin, BulkUpdateModelMixin from apps.utils.mixins import BulkUpdateModelMixin
import datetime import datetime
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.wpm.models import SfLog from apps.wpm.models import SfLog
from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter from apps.qm.filters import QuaStatFilter, TestItemFilter, FtestWorkFilter
from django.db import transaction from django.db import transaction
from apps.qm.models import NotOkOption from apps.qm.models import NotOkOption, Defect
from apps.qm.services import ftestwork_submit from apps.qm.services import ftestwork_submit
from apps.utils.thread import MyThread from apps.utils.thread import MyThread
from apps.wpm.services_2 import get_alldata_with_batch_and_store from apps.wpm.services_2 import get_alldata_with_batch_and_store
from apps.wf.models import State
# Create your views here. # Create your views here.
class DefectViewSet(CustomModelViewSet):
"""
list:缺陷项
缺陷项
"""
queryset = Defect.objects.all()
serializer_class = DefectSerializer
filterset_fields = ["cate", "okcate"]
search_fields = ["name", "code"]
class NotOkOptionView(APIView): class NotOkOptionView(APIView):
perms_map = {'get': '*'} perms_map = {'get': '*'}
@ -146,6 +157,8 @@ class FtestWorkViewSet(CustomModelViewSet):
ins:FtestWork = self.get_object() ins:FtestWork = self.get_object()
if ins.submit_time is not None: if ins.submit_time is not None:
raise ParseError('已提交无法修改') raise ParseError('已提交无法修改')
if ins.ticket and ins.ticket.state.type != State.STATE_TYPE_START:
raise ParseError('审批单已进行,无法修改')
x = super().update(request, *args, **kwargs) x = super().update(request, *args, **kwargs)
# 触发批次统计分析 # 触发批次统计分析
if ins.batch: if ins.batch:
@ -156,6 +169,8 @@ class FtestWorkViewSet(CustomModelViewSet):
ins:FtestWork = self.get_object() ins:FtestWork = self.get_object()
if ins.submit_time is not None: if ins.submit_time is not None:
raise ParseError('已提交无法删除') raise ParseError('已提交无法删除')
if ins.ticket:
raise ParseError('存在审批, 无法删除')
x = super().destroy(request, *args, **kwargs) x = super().destroy(request, *args, **kwargs)
# 触发批次统计分析 # 触发批次统计分析
if ins.batch: if ins.batch:
@ -177,6 +192,8 @@ class FtestWorkViewSet(CustomModelViewSet):
提交检验工作 提交检验工作
""" """
ins:FtestWork = self.get_object() ins:FtestWork = self.get_object()
if ins.ticket:
raise ParseError('该检验工作存在审批!')
if ins.wm is None: if ins.wm is None:
raise ParseError('该检验工作未关联车间库存') raise ParseError('该检验工作未关联车间库存')
if ins.submit_time is None: if ins.submit_time is None: