diff --git a/apps/em/migrations/0024_alter_ecate_create_by_alter_ecate_update_by_and_more.py b/apps/em/migrations/0024_alter_ecate_create_by_alter_ecate_update_by_and_more.py new file mode 100644 index 00000000..e6da9a18 --- /dev/null +++ b/apps/em/migrations/0024_alter_ecate_create_by_alter_ecate_update_by_and_more.py @@ -0,0 +1,72 @@ +# Generated by Django 4.2.27 on 2026-05-26 07:52 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0007_alter_dept_create_by_alter_dept_third_info_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('em', '0023_repair'), + ] + + operations = [ + migrations.AlterField( + model_name='ecate', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='ecate', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AlterField( + model_name='echeckrecord', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='echeckrecord', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AlterField( + model_name='einspect', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='einspect', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AlterField( + model_name='equipment', + name='belong_dept', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_belong_dept', to='system.dept', verbose_name='所属部门'), + ), + migrations.AlterField( + model_name='equipment', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='equipment', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AlterField( + model_name='repair', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='repair', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + ] diff --git a/apps/wpm/migrations/0132_mlogbw_tooling_alter_mlogbw_equip.py b/apps/wpm/migrations/0132_mlogbw_tooling_alter_mlogbw_equip.py new file mode 100644 index 00000000..190c4a6a --- /dev/null +++ b/apps/wpm/migrations/0132_mlogbw_tooling_alter_mlogbw_equip.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.27 on 2026-05-26 07:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('em', '0024_alter_ecate_create_by_alter_ecate_update_by_and_more'), + ('wpm', '0131_mlog_clear_defect'), + ] + + operations = [ + migrations.AddField( + model_name='mlogbw', + name='tooling', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mlogbw_tooling', to='em.equipment', verbose_name='工装'), + ), + migrations.AlterField( + model_name='mlogbw', + name='equip', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mlogbw_equip', to='em.equipment', verbose_name='设备'), + ), + ] diff --git a/apps/wpm/migrations/0133_mlogbw_pre_info.py b/apps/wpm/migrations/0133_mlogbw_pre_info.py new file mode 100644 index 00000000..a29bae65 --- /dev/null +++ b/apps/wpm/migrations/0133_mlogbw_pre_info.py @@ -0,0 +1,28 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0132_mlogbw_tooling_alter_mlogbw_equip'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + database_operations=[ + # Column already exists in DB; ensure it has a server-side default + # so INSERT statements that omit the column don't violate NOT NULL. + migrations.RunSQL( + sql="ALTER TABLE wpm_mlogbw ALTER COLUMN pre_info SET DEFAULT '{}'::jsonb", + reverse_sql="ALTER TABLE wpm_mlogbw ALTER COLUMN pre_info DROP DEFAULT", + ), + ], + state_operations=[ + migrations.AddField( + model_name='mlogbw', + name='pre_info', + field=models.JSONField(blank=True, default=dict, verbose_name='预处理信息'), + ), + ], + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index e5c4e513..684c812b 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -614,7 +614,9 @@ class Mlogbw(BaseModel): mlogbw_from = models.ForeignKey("self", verbose_name='来源个', on_delete=models.CASCADE, null=True, blank=True, related_name="w_mlogbw_from") wpr = models.ForeignKey("wpmw.wpr", verbose_name='关联产品', on_delete=models.SET_NULL , related_name='wpr_mlogbw', null=True, blank=True) - equip = models.ForeignKey(Equipment, verbose_name='设备', on_delete=models.SET_NULL, null=True, blank=True) + pre_info = models.JSONField('预处理信息', default=dict, blank=True) + equip = models.ForeignKey(Equipment, verbose_name='设备', on_delete=models.SET_NULL, null=True, blank=True, related_name='mlogbw_equip') + tooling = models.ForeignKey(Equipment, verbose_name='工装', on_delete=models.SET_NULL, null=True, blank=True, related_name='mlogbw_tooling') work_start_time = models.DateTimeField('开始加工时间', null=True, blank=True) work_end_time = models.DateTimeField('结束加工时间', null=True, blank=True) ftest = models.OneToOneField("qm.ftest", verbose_name='关联检验', diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index 2095b7bf..64a289ad 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -878,13 +878,17 @@ class MlogbwCreateUpdateSerializer(CustomModelSerializer): ftest = FtestProcessSerializer(required=False, allow_null=True) equip_name = serializers.CharField(source='equip.name', read_only=True) equip_number = serializers.CharField(source='equip.number', read_only=True) + tooling_name = serializers.CharField(source='tooling.name', read_only=True) + tooling_number = serializers.CharField(source='tooling.number', read_only=True) wpr_number_out = serializers.CharField(source='wpr.number_out', read_only=True) + wpr_pre_info = serializers.JSONField(source='wpr.pre_info', read_only=True) mlogb__batch = serializers.CharField(source='mlogb.batch', read_only=True) class Meta: model = Mlogbw - fields = ["id", "number", "wpr", "note", - "mlogb", "ftest", "equip", "work_start_time", - "work_end_time", "mlogbw_from", "equip_name", "equip_number", "wpr_number_out", "mlogb__batch"] + fields = ["id", "number", "wpr", "note", + "mlogb", "ftest", "equip", "tooling", "work_start_time", + "work_end_time", "mlogbw_from", "equip_name", "equip_number", + "tooling_name", "tooling_number", "wpr_number_out", "wpr_pre_info", "mlogb__batch"] read_only_fields = ["mlogbw_from"] def validate(self, attrs): diff --git a/apps/wpm/views.py b/apps/wpm/views.py index dc6181be..14fb4110 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -1112,7 +1112,7 @@ class MlogbwViewSet(CustomModelViewSet): list_serializer_class = MlogbwListSerializer retrieve_serializer_class = MlogbwListSerializer filterset_class = MlogbwFilter - select_related_fields = ["ftest", "equip", "wpr", "mlogb"] + select_related_fields = ["ftest", "equip", "tooling", "wpr", "mlogb"] prefetch_related_fields = [ Prefetch( "ftest__items_ftest", diff --git a/apps/wpmw/serializers.py b/apps/wpmw/serializers.py index c7cf2b0b..56b066d6 100644 --- a/apps/wpmw/serializers.py +++ b/apps/wpmw/serializers.py @@ -3,6 +3,7 @@ from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from apps.inm.serializers import MaterialBatchSerializer from apps.wpm.serializers import WMaterialSerializer +from apps.qm.models import FtestItem class WprDefectSerializer(CustomModelSerializer): defect_name = serializers.CharField(source="defect.name", read_only=True) @@ -58,4 +59,4 @@ class WprChangeNumberSerializer(serializers.Serializer): class WprPreInfoSerializer(serializers.Serializer): - pre_info = serializers.JSONField(label="预处理信息") \ No newline at end of file + tooling = serializers.CharField(label="工装ID") \ No newline at end of file diff --git a/apps/wpmw/views.py b/apps/wpmw/views.py index 6364bc5f..8d5bdbae 100644 --- a/apps/wpmw/views.py +++ b/apps/wpmw/views.py @@ -3,6 +3,7 @@ from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.mixins import CustomListModelMixin, CustomRetrieveModelMixin, ComplexQueryMixin, BulkUpdateModelMixin from apps.wpmw.models import Wpr, WprDefect +from apps.qm.models import FtestItem from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer, WprChangeNumberSerializer, WprPreInfoSerializer from rest_framework.response import Response from apps.mtm.models import Material @@ -154,7 +155,9 @@ class WprViewSet(BulkUpdateModelMixin, CustomListModelMixin, CustomRetrieveModel wpr = self.get_object() sr = WprPreInfoSerializer(data=request.data) sr.is_valid(raise_exception=True) - wpr.pre_info = sr.validated_data["pre_info"] + raw_info = sr.validated_data + from apps.utils.tools import update_dict + wpr.pre_info = update_dict(wpr.pre_info, raw_info) wpr.save(update_fields=["pre_info"]) return Response({"pre_info": wpr.pre_info})