From c524d1b9a53598b22929b2cbaf1a9db5411e7eda Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 11 Oct 2024 15:26:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9D=A1=E7=A0=81?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E7=AE=A1=E7=90=86=E7=9A=84app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cm/__init__.py | 0 apps/cm/admin.py | 3 +++ apps/cm/apps.py | 6 +++++ apps/cm/migrations/0001_initial.py | 36 ++++++++++++++++++++++++++++++ apps/cm/migrations/__init__.py | 0 apps/cm/models.py | 13 +++++++++++ apps/cm/serializers.py | 20 +++++++++++++++++ apps/cm/tests.py | 3 +++ apps/cm/urls.py | 12 ++++++++++ apps/cm/views.py | 33 +++++++++++++++++++++++++++ server/settings.py | 3 ++- server/urls.py | 1 + 12 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 apps/cm/__init__.py create mode 100644 apps/cm/admin.py create mode 100644 apps/cm/apps.py create mode 100644 apps/cm/migrations/0001_initial.py create mode 100644 apps/cm/migrations/__init__.py create mode 100644 apps/cm/models.py create mode 100644 apps/cm/serializers.py create mode 100644 apps/cm/tests.py create mode 100644 apps/cm/urls.py create mode 100644 apps/cm/views.py diff --git a/apps/cm/__init__.py b/apps/cm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cm/admin.py b/apps/cm/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/cm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/cm/apps.py b/apps/cm/apps.py new file mode 100644 index 00000000..c6213e16 --- /dev/null +++ b/apps/cm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CmConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.cm' diff --git a/apps/cm/migrations/0001_initial.py b/apps/cm/migrations/0001_initial.py new file mode 100644 index 00000000..9e932c92 --- /dev/null +++ b/apps/cm/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.12 on 2024-10-11 07:17 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('pum', '0008_auto_20240731_1829'), + ('mtm', '0042_auto_20241010_1140'), + ] + + operations = [ + migrations.CreateModel( + name='LableMat', + 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='删除标记')), + ('state', models.PositiveSmallIntegerField(choices=[(10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废')], default=10, verbose_name='状态')), + ('batch', models.CharField(max_length=100, verbose_name='批次号')), + ('notok_sign', models.CharField(blank=True, max_length=10, null=True, verbose_name='不合格标记')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material')), + ('material_origin', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lm_mo', to='mtm.material', verbose_name='原始物料')), + ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='pum.supplier', verbose_name='外协供应商')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/cm/migrations/__init__.py b/apps/cm/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cm/models.py b/apps/cm/models.py new file mode 100644 index 00000000..4f77be02 --- /dev/null +++ b/apps/cm/models.py @@ -0,0 +1,13 @@ +from django.db import models +from apps.utils.models import BaseModel +from apps.mtm.models import Material +from apps.pum.models import Supplier +# Create your models here. + +class LableMat(BaseModel): + state = models.PositiveSmallIntegerField('状态', default=10, choices=((10, '合格'), (20, '不合格'), (30, '返修'), (40, '检验'), (50, '报废'))) + material = models.ForeignKey(Material, on_delete=models.CASCADE) + batch = models.CharField('批次号', max_length=100) + supplier = models.ForeignKey(Supplier, verbose_name='外协供应商', on_delete=models.SET_NULL, null=True, blank=True) + notok_sign = models.CharField('不合格标记', max_length=10, null=True, blank=True) + material_origin = models.ForeignKey(Material, verbose_name='原始物料', on_delete=models.SET_NULL, null=True, blank=True, related_name='lm_mo') \ No newline at end of file diff --git a/apps/cm/serializers.py b/apps/cm/serializers.py new file mode 100644 index 00000000..0c467670 --- /dev/null +++ b/apps/cm/serializers.py @@ -0,0 +1,20 @@ +from rest_framework import serializers +from .models import LableMat +from apps.qm.models import NotOkOption + + +class TidSerializer(serializers.Serializer): + tid = serializers.CharField(label='表ID') + + +class LabelMatSerializer(serializers.ModelSerializer): + material_name = serializers.StringRelatedField(source='material', read_only=True) + material_origin_name = serializers.StringRelatedField(source='material_origin', read_only=True) + supplier_name = serializers.CharField(source='supplier.name', read_only=True) + notok_sign_name = serializers.SerializerMethodField() + class Meta: + model = LableMat + fields = '__all__' + + def get_notok_sign_name(self, obj): + return getattr(NotOkOption, obj.notok_sign, NotOkOption.qt).label if obj.notok_sign else None \ No newline at end of file diff --git a/apps/cm/tests.py b/apps/cm/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/cm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/cm/urls.py b/apps/cm/urls.py new file mode 100644 index 00000000..652b90c8 --- /dev/null +++ b/apps/cm/urls.py @@ -0,0 +1,12 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from apps.cm.views import LableMatViewSet + +API_BASE_URL = 'api/cm/' +HTML_BASE_URL = 'cm/' + +router = DefaultRouter() +router.register('labelmat', LableMatViewSet, basename='labelmat') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] \ No newline at end of file diff --git a/apps/cm/views.py b/apps/cm/views.py new file mode 100644 index 00000000..ead69c7e --- /dev/null +++ b/apps/cm/views.py @@ -0,0 +1,33 @@ +from django.shortcuts import render +from apps.cm.models import LableMat +from rest_framework.decorators import action +from apps.cm.serializers import TidSerializer +from apps.inm.models import MaterialBatch +from rest_framework.exceptions import ParseError +from rest_framework.response import Response +from apps.utils.viewsets import CustomGenericViewSet +# Create your views here. + +class LableMatViewSet(CustomGenericViewSet): + perms_map = {"post": "*"} + @action(methods=['post'], detail=False, serializer_class=TidSerializer) + def get_from_mb(self, request, pk=None): + """ + 从仓库明细获取物料标签 + + 从仓库明细获取物料标签 + """ + tid = request.data.get('tid') + try: + mb = MaterialBatch.objects.get(id=tid) + except MaterialBatch.DoesNotExist: + raise ParseError('仓库明细不存在') + obj, _ = LableMat.objects.get_or_create( + state=10, + material=mb.material, + batch=mb.batch, + defaults={ + "supplier": mb.supplier + } + ) + return Response({"label": f"mat-{obj.id}"}) \ No newline at end of file diff --git a/server/settings.py b/server/settings.py index d6701e6a..0874cbaf 100755 --- a/server/settings.py +++ b/server/settings.py @@ -78,7 +78,8 @@ INSTALLED_APPS = [ 'apps.pm', 'apps.enp', 'apps.edu', - 'apps.dpm' + 'apps.dpm', + 'apps.cm' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index 2ef416a7..e1e58a59 100755 --- a/server/urls.py +++ b/server/urls.py @@ -68,6 +68,7 @@ urlpatterns = [ path('', include('apps.enp.urls')), path('', include('apps.edu.urls')), path('', include('apps.dpm.urls')), + path('', include('apps.cm.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")),