feat: 添加条码二维码管理的app
This commit is contained in:
parent
8e918e9a7e
commit
c524d1b9a5
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CmConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'apps.cm'
|
|
@ -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,
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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')
|
|
@ -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
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
|
@ -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)),
|
||||
]
|
|
@ -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}"})
|
|
@ -78,7 +78,8 @@ INSTALLED_APPS = [
|
|||
'apps.pm',
|
||||
'apps.enp',
|
||||
'apps.edu',
|
||||
'apps.dpm'
|
||||
'apps.dpm',
|
||||
'apps.cm'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
|
|
@ -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")),
|
||||
|
|
Loading…
Reference in New Issue