feat: 标签物料根据模板打印功能

This commit is contained in:
caoqianming 2025-05-06 10:32:50 +08:00
parent a4ba33550e
commit c05432ce56
5 changed files with 68 additions and 2 deletions

10
apps/cm/filters.py Normal file
View File

@ -0,0 +1,10 @@
from django_filters import rest_framework as filters
from django.utils import timezone
from .models import LabelTemplate
from apps.utils.filters import MyJsonListFilter
class LabelTemplateFilter(filters.FilterSet):
process_json__contains = MyJsonListFilter(field_name='按工序查询')
class Meta:
model = LabelTemplate

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2025-05-06 02:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cm', '0004_labeltemplate'),
]
operations = [
migrations.AddField(
model_name='labeltemplate',
name='process_json',
field=models.JSONField(blank=True, default=list, verbose_name='工序'),
),
]

View File

@ -17,5 +17,7 @@ class LableMat(BaseModel):
class LabelTemplate(BaseModel):
"""TN: 标签模板"""
name = models.TextField("名称")
commands = models.JSONField("指令模板", default=list, blank=True)
commands = models.JSONField("指令模板", default=list, blank=True)
process_json = models.JSONField("工序", default=list, blank=True)

View File

@ -7,6 +7,8 @@ from apps.utils.serializers import CustomModelSerializer
class TidSerializer(serializers.Serializer):
tid = serializers.CharField(label='表ID')
label_template = serializers.CharField(label='标签模板ID(可传default)', allow_null=True, required=False)
extra_data = serializers.JSONField(label='额外数据', allow_null=True, required=False)
class LabelMatSerializer(serializers.ModelSerializer):

View File

@ -6,6 +6,7 @@ from apps.wpm.models import WMaterial
from rest_framework.exceptions import ParseError, NotFound
from rest_framework.response import Response
from apps.utils.viewsets import CustomGenericViewSet, RetrieveModelMixin, CustomListModelMixin, CustomModelViewSet
from apps.cm.filters import LabelTemplateFilter
# Create your views here.
SPLIT_FIELD = "#"
@ -16,6 +17,20 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
queryset = LableMat.objects.all()
select_related_fields = ["material", "material_origin", "supplier"]
def gen_commands(self, label_template, tdata):
if label_template == "default":
lt = LabelTemplate.objects.get(name="默认标签模板")
else:
lt = LabelTemplate.objects.get(id=label_template)
commands:list = lt.commands
try:
for item in commands:
item = item.format(**tdata)
except Exception as e:
raise ParseError(f"标签解析错误-{str(e)}")
return commands
@action(methods=["post"], detail=False, serializer_class=TidSerializer)
def get_from_mb(self, request, pk=None):
"""
@ -24,6 +39,8 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
从仓库明细获取物料标签
"""
tid = request.data.get("tid")
label_template = request.data.get("label_template", None)
extra_data = request.data.get("extra_data", {})
try:
mb = MaterialBatch.objects.get(id=tid)
except MaterialBatch.DoesNotExist:
@ -31,6 +48,10 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
obj, _ = LableMat.objects.get_or_create(state=mb.state, material=mb.material, batch=mb.batch, defect=mb.defect, defaults={"supplier": mb.supplier})
rdata = LabelMatSerializer(obj).data
rdata["code_label"] = f"mat{SPLIT_FIELD}{obj.id}"
if label_template:
tdata = {**rdata, **extra_data}
commands = self.gen_commands(label_template, tdata)
rdata["commands"] = commands
return Response(rdata)
@action(methods=["post"], detail=False, serializer_class=TidSerializer)
@ -41,6 +62,8 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
从车间库存明细获取物料标签
"""
tid = request.data.get("tid")
label_template = request.data.get("label_template", None)
extra_data = request.data.get("extra_data", {})
try:
wm = WMaterial.objects.get(id=tid)
except WMaterial.DoesNotExist:
@ -50,6 +73,10 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
material_origin=wm.material_origin)
rdata = LabelMatSerializer(obj).data
rdata["code_label"] = f"mat{SPLIT_FIELD}{obj.id}"
if label_template:
tdata = {**rdata, **extra_data}
commands = self.gen_commands(label_template, tdata)
rdata["commands"] = commands
return Response(rdata)
@action(methods=["post"], detail=False, serializer_class=TidSerializer)
@ -60,6 +87,8 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
从出入库明细获取物料标签
"""
tid = request.data.get("tid")
label_template = request.data.get("label_template", None)
extra_data = request.data.get("extra_data", {})
try:
mioitem: MIOItem = MIOItem.objects.get(id=tid)
except MIOItem.DoesNotExist:
@ -67,6 +96,10 @@ class LableMatViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericVie
obj, _ = LableMat.objects.get_or_create(state=10, material=mioitem.material, batch=mioitem.batch, defaults={"supplier": mioitem.mio.supplier})
rdata = LabelMatSerializer(obj).data
rdata["code_label"] = f"mat{SPLIT_FIELD}{obj.id}"
if label_template:
tdata = {**rdata, **extra_data}
commands = self.gen_commands(label_template, tdata)
rdata["commands"] = commands
return Response(rdata)
@ -77,4 +110,5 @@ class LabelTemplateViewSet(CustomModelViewSet):
标签模板
"""
queryset = LabelTemplate.objects.all()
serializer_class = LabelTemplateSerializer
serializer_class = LabelTemplateSerializer
filterset_class = LabelTemplateFilter