from apps.utils.serializers import CustomModelSerializer from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route from apps.utils.constants import EXCLUDE_FIELDS from rest_framework import serializers from rest_framework.exceptions import ValidationError from apps.system.models import Dept class ShiftSerializer(CustomModelSerializer): class Meta: model = Shift fields = '__all__' read_only_fields = EXCLUDE_FIELDS class MaterialSerializer(CustomModelSerializer): class Meta: model = Material fields = '__all__' read_only_fields = EXCLUDE_FIELDS class MgroupSerializer(CustomModelSerializer): belong_dept = serializers.PrimaryKeyRelatedField( label="所属部门", queryset=Dept.objects.all(), required=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) class Meta: model = Mgroup fields = '__all__' read_only_fields = EXCLUDE_FIELDS class TeamSerializer(CustomModelSerializer): belong_dept = serializers.PrimaryKeyRelatedField( label="所属部门", queryset=Dept.objects.all(), required=True) leader_name = serializers.CharField(source='leader.name', read_only=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) class Meta: model = Team fields = '__all__' read_only_fields = EXCLUDE_FIELDS class GoalSerializer(CustomModelSerializer): goal_cate_name = serializers.CharField( source='goal_cate.name', read_only=True) mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) class Meta: model = Goal fields = '__all__' read_only_fields = EXCLUDE_FIELDS class MgroupGoalYearSerializer(serializers.Serializer): mgroup = serializers.CharField(label='ID或名称') year = serializers.IntegerField(label='年') class ProcessSerializer(CustomModelSerializer): belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) class Meta: model = Process fields = '__all__' read_only_fields = EXCLUDE_FIELDS class RouteSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', 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: model = Route fields = '__all__' read_only_fields = EXCLUDE_FIELDS def validate(self, attrs): material = attrs['material'] if material.type != Material.MA_TYPE_GOOD: raise ValidationError('请选择最终产品') return super().validate(attrs) def gen_material_out(self, instance): 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, 'is_hidden': True, 'name': instance.material.name, 'number': instance.material.number, 'specification': instance.material.specification, 'type': Material.MA_TYPE_HALFGOOD, 'create_by': self.request.user, 'update_by': self.request.user, }) instance.save() def create(self, validated_data): instance = super().create(validated_data) self.gen_material_out() return instance def update(self, instance, validated_data): validated_data.pop('material', None) validated_data.pop('process', None) instance = super().update(instance, validated_data) self.gen_material_out() return instance