feat: qm增加defect
This commit is contained in:
parent
8928c0b7aa
commit
9a14216b78
|
@ -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,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
检测项目
|
检测项目
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue