feat: 添加条码二维码管理的app

This commit is contained in:
caoqianming 2024-10-11 15:26:48 +08:00
parent 8e918e9a7e
commit c524d1b9a5
12 changed files with 129 additions and 1 deletions

0
apps/cm/__init__.py Normal file
View File

3
apps/cm/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/cm/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class CmConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.cm'

View File

@ -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,
},
),
]

View File

13
apps/cm/models.py Normal file
View File

@ -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')

20
apps/cm/serializers.py Normal file
View File

@ -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

3
apps/cm/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

12
apps/cm/urls.py Normal file
View File

@ -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)),
]

33
apps/cm/views.py Normal file
View File

@ -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}"})

View File

@ -78,7 +78,8 @@ INSTALLED_APPS = [
'apps.pm',
'apps.enp',
'apps.edu',
'apps.dpm'
'apps.dpm',
'apps.cm'
]
MIDDLEWARE = [

View File

@ -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")),