diff --git a/apps/mtm/migrations/0050_auto_20250207_1002.py b/apps/mtm/migrations/0050_auto_20250207_1002.py new file mode 100644 index 00000000..49f529d1 --- /dev/null +++ b/apps/mtm/migrations/0050_auto_20250207_1002.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.12 on 2025-02-07 02:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0049_auto_20250107_0949'), + ] + + operations = [ + migrations.AlterField( + model_name='route', + name='process', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='route_p', to='mtm.process', verbose_name='工序'), + ), + migrations.AlterField( + model_name='routemat', + name='route', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='routemat_route', to='mtm.route', verbose_name='关联路线'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index d07888a5..20921b45 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -221,7 +221,7 @@ class Route(CommonADModel): material = models.ForeignKey( Material, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True) 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, related_name="route_p") mgroup = models.ForeignKey(Mgroup, verbose_name='指定工段', on_delete=models.CASCADE, null=True, blank=True, related_name='route_mgroup') sort = models.PositiveSmallIntegerField('顺序', default=1) @@ -256,5 +256,5 @@ class Route(CommonADModel): return rq class RouteMat(BaseModel): - route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE) + route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE, related_name="routemat_route") material = models.ForeignKey(Material, verbose_name='辅助物料', on_delete=models.CASCADE) \ No newline at end of file diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 72698c8d..813d61fd 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -933,3 +933,8 @@ class BatchStSerializer(CustomModelSerializer): model = BatchSt fields = "__all__" + +class HandoverMgroupSerializer(serializers.Serializer): + material_in = serializers.CharField(label="物料ID") + type = serializers.IntegerField(label="交送类型") + diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 69ffeb4d..6d06dd45 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -10,7 +10,7 @@ from django.db.models import Sum from django.utils import timezone from apps.system.models import User -from apps.mtm.models import Material, Process, Route +from apps.mtm.models import Material, Process, Route, Mgroup, RoutePack from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import CustomListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin @@ -25,7 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer, MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer, - MlogbwCreateUpdateSerializer) + MlogbwCreateUpdateSerializer, HandoverMgroupSerializer) from .services import mlog_submit, handover_submit, mlog_revert from apps.wpm.services import mlog_submit_validate, generate_new_batch from apps.wf.models import State @@ -382,6 +382,29 @@ class HandoverViewSet(CustomModelViewSet): handover_submit(ins, user, None) return Response() + @action(methods=['post'], detail=True, perms_map={'post': '*'}, serializer_class=HandoverMgroupSerializer) + @transaction.atomic + def mgroups(self, request, *args, **kwargs): + """获取可交接到的工段 + + 获取可交接到的工段 + """ + sr = HandoverMgroupSerializer(data=request.data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data + materialInId = vdata['material_in'] + type = vdata['type'] + m_qs = Mgroup.objects.all() + if type in [Handover.H_NORMAL, Handover.H_CHANGE]: + m_qs = m_qs.filter(process__route_p_routepack__state=RoutePack.RP_S_CONFIRM) + m_qs = m_qs.filter( + process__route_p__material_in__id=materialInId)|m_qs.filter( + process__route_p__routemat_route__material__id=materialInId + ) + elif type in [Handover.H_SCRAP]: + m_qs = m_qs.filter(process=None) + return Response(list(m_qs.values('id', 'name'))) + @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverWmSerializer) @transaction.atomic def gen_by_wm(self, request):