feat: 增加字段和material查询条件
This commit is contained in:
parent
84db42e7c4
commit
8fd6f82bc2
|
@ -2,18 +2,22 @@ from django_filters import rest_framework as filters
|
||||||
from apps.mtm.models import Goal, Material
|
from apps.mtm.models import Goal, Material
|
||||||
from django.db.models.expressions import F
|
from django.db.models.expressions import F
|
||||||
|
|
||||||
|
|
||||||
class MaterialFilter(filters.FilterSet):
|
class MaterialFilter(filters.FilterSet):
|
||||||
tag = filters.CharFilter(method='filter_tag')
|
tag = filters.CharFilter(method='filter_tag')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Material
|
model = Material
|
||||||
fields = {
|
fields = {
|
||||||
"type": ["exact", "in"],
|
"type": ["exact", "in"],
|
||||||
"is_hidden": ["exact"]
|
"is_hidden": ["exact"],
|
||||||
|
"is_assemb": ["exact"]
|
||||||
}
|
}
|
||||||
|
|
||||||
def filter_tag(self, queryset, name, value):
|
def filter_tag(self, queryset, name, value):
|
||||||
if value == 'low_inm':
|
if value == 'low_inm':
|
||||||
queryset = queryset.exclude(count_safe=None).filter(count__lte = F('count_safe'))
|
queryset = queryset.exclude(count_safe=None).filter(
|
||||||
|
count__lte=F('count_safe'))
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ class Material(CommonAModel):
|
||||||
(MA_TYPE_HELPTOOL, '辅助工装'),
|
(MA_TYPE_HELPTOOL, '辅助工装'),
|
||||||
(MA_TYPE_OFFICE, '办公用品')
|
(MA_TYPE_OFFICE, '办公用品')
|
||||||
)
|
)
|
||||||
|
|
||||||
name = models.CharField('名称', max_length=50)
|
name = models.CharField('名称', max_length=50)
|
||||||
number = models.CharField('编号', max_length=100, null=True, blank=True)
|
number = models.CharField('编号', max_length=100, null=True, blank=True)
|
||||||
specification = models.CharField(
|
specification = models.CharField(
|
||||||
|
@ -54,10 +55,12 @@ class Material(CommonAModel):
|
||||||
count = models.PositiveIntegerField('物料库存总数', default=0)
|
count = models.PositiveIntegerField('物料库存总数', default=0)
|
||||||
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True)
|
count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True)
|
||||||
process = models.ForeignKey(
|
process = models.ForeignKey(
|
||||||
Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True)
|
Process, verbose_name='所用工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
parent = models.ForeignKey(
|
parent = models.ForeignKey(
|
||||||
'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料')
|
'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料')
|
||||||
is_hidden = models.BooleanField('是否隐藏', default=False)
|
is_hidden = models.BooleanField('是否隐藏', default=False)
|
||||||
|
is_assemb = models.BooleanField('是否组合件', default=False)
|
||||||
|
components = models.JSONField('组件', default=dict, null=False, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '物料表'
|
verbose_name = '物料表'
|
||||||
|
@ -136,9 +139,9 @@ class Goal(CommonADModel):
|
||||||
unique_together = ("mgroup", "year", "goal_cate")
|
unique_together = ("mgroup", "year", "goal_cate")
|
||||||
|
|
||||||
|
|
||||||
class Route(CommonAModel):
|
class Route(CommonADModel):
|
||||||
"""
|
"""
|
||||||
工艺路线
|
加工路线
|
||||||
"""
|
"""
|
||||||
material = models.ForeignKey(
|
material = models.ForeignKey(
|
||||||
Material, verbose_name='关联产品', on_delete=models.CASCADE)
|
Material, verbose_name='关联产品', on_delete=models.CASCADE)
|
||||||
|
@ -165,4 +168,4 @@ class Route(CommonAModel):
|
||||||
raise ValidationError('首步缺少输入/最后一步缺少输出')
|
raise ValidationError('首步缺少输入/最后一步缺少输出')
|
||||||
if autotask:
|
if autotask:
|
||||||
kwargs['is_autotask'] = True
|
kwargs['is_autotask'] = True
|
||||||
return Route.objects.annotate(mgroups=Subquery(Mgroup.objects.filter(process=OuterRef('pk')))).filter(**kwargs).order_by('sort', 'process__sort', 'create_time')
|
return rq
|
||||||
|
|
|
@ -14,6 +14,8 @@ class ShiftSerializer(CustomModelSerializer):
|
||||||
|
|
||||||
|
|
||||||
class MaterialSerializer(CustomModelSerializer):
|
class MaterialSerializer(CustomModelSerializer):
|
||||||
|
process_name = serializers.CharField(source='process.name', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Material
|
model = Material
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
@ -25,6 +27,8 @@ class MgroupSerializer(CustomModelSerializer):
|
||||||
label="所属部门", queryset=Dept.objects.all(), required=True)
|
label="所属部门", queryset=Dept.objects.all(), required=True)
|
||||||
belong_dept_name = serializers.CharField(
|
belong_dept_name = serializers.CharField(
|
||||||
source='belong_dept.name', read_only=True)
|
source='belong_dept.name', read_only=True)
|
||||||
|
process_name = serializers.CharField(source='process.name', read_only=True)
|
||||||
|
process_cate = serializers.CharField(source='process.cate', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mgroup
|
model = Mgroup
|
||||||
|
@ -75,6 +79,14 @@ class RouteSerializer(CustomModelSerializer):
|
||||||
material_ = MaterialSerializer(source='material', read_only=True)
|
material_ = MaterialSerializer(source='material', read_only=True)
|
||||||
process_name = serializers.CharField(source='process.name', read_only=True)
|
process_name = serializers.CharField(source='process.name', read_only=True)
|
||||||
process_cate = serializers.CharField(source='process.cate', read_only=True)
|
process_cate = serializers.CharField(source='process.cate', read_only=True)
|
||||||
|
material_in_name = serializers.CharField(
|
||||||
|
source='material_in.name', read_only=True)
|
||||||
|
material_out_name = serializers.CharField(
|
||||||
|
source='material_out.name', read_only=True)
|
||||||
|
material_out_type = serializers.CharField(
|
||||||
|
source='material_out.type', read_only=True)
|
||||||
|
material_out_is_hidden = serializers.BooleanField(
|
||||||
|
source='material_out.is_hidden', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Route
|
model = Route
|
||||||
|
@ -88,9 +100,10 @@ class RouteSerializer(CustomModelSerializer):
|
||||||
return super().validate(attrs)
|
return super().validate(attrs)
|
||||||
|
|
||||||
def gen_material_out(self, instance):
|
def gen_material_out(self, instance):
|
||||||
|
name = f'{instance.material.name}-中'
|
||||||
instance.material_out, _ = Material.objects.get_or_create(type=Material.MA_TYPE_HALFGOOD, parent=instance.material, process=instance.process,
|
instance.material_out, _ = Material.objects.get_or_create(type=Material.MA_TYPE_HALFGOOD, parent=instance.material, process=instance.process,
|
||||||
defaults={'parent': instance.material, 'process': instance.process,
|
defaults={'parent': instance.material, 'process': instance.process,
|
||||||
'is_hidden': True, 'name': instance.material.name,
|
'is_hidden': True, 'name': name,
|
||||||
'number': instance.material.number,
|
'number': instance.material.number,
|
||||||
'specification': instance.material.specification,
|
'specification': instance.material.specification,
|
||||||
'type': Material.MA_TYPE_HALFGOOD,
|
'type': Material.MA_TYPE_HALFGOOD,
|
||||||
|
@ -101,12 +114,18 @@ class RouteSerializer(CustomModelSerializer):
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
instance = super().create(validated_data)
|
instance = super().create(validated_data)
|
||||||
self.gen_material_out()
|
if 'material_out' in validated_data and validated_data['material_out']:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.gen_material_out(instance)
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
validated_data.pop('material', None)
|
validated_data.pop('material', None)
|
||||||
validated_data.pop('process', None)
|
validated_data.pop('process', None)
|
||||||
instance = super().update(instance, validated_data)
|
instance = super().update(instance, validated_data)
|
||||||
self.gen_material_out()
|
if 'material_out' in validated_data and validated_data['material_out']:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.gen_material_out(instance)
|
||||||
return instance
|
return instance
|
||||||
|
|
Loading…
Reference in New Issue