diff --git a/apps/inm/migrations/0008_auto_20231103_1359.py b/apps/inm/migrations/0008_auto_20231103_1359.py new file mode 100644 index 00000000..565b275c --- /dev/null +++ b/apps/inm/migrations/0008_auto_20231103_1359.py @@ -0,0 +1,81 @@ +# Generated by Django 3.2.12 on 2023-11-03 05:59 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0023_auto_20231102_1128'), + ('inm', '0007_alter_mioitem_mio'), + ] + + operations = [ + migrations.AddField( + model_name='mioitem', + name='count_n_dl', + field=models.PositiveIntegerField(default=0, verbose_name='断裂'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_dxt', + field=models.PositiveIntegerField(default=0, verbose_name='大小头'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_jsqx', + field=models.PositiveIntegerField(default=0, verbose_name='结石气线'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_pb', + field=models.PositiveIntegerField(default=0, verbose_name='偏壁'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_qp', + field=models.PositiveIntegerField(default=0, verbose_name='气泡'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_qt', + field=models.PositiveIntegerField(default=0, verbose_name='其他'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_tw', + field=models.PositiveIntegerField(default=0, verbose_name='条纹'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_wq', + field=models.PositiveIntegerField(default=0, verbose_name='弯曲'), + ), + migrations.AddField( + model_name='mioitem', + name='count_n_zw', + field=models.PositiveIntegerField(default=0, verbose_name='炸纹'), + ), + migrations.AddField( + model_name='mioitem', + name='count_notok', + field=models.PositiveIntegerField(default=0, verbose_name='不合格数'), + ), + migrations.AddField( + model_name='mioitem', + name='test_date', + field=models.DateField(blank=True, null=True, verbose_name='检验日期'), + ), + migrations.AddField( + model_name='mioitem', + name='test_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='检验人'), + ), + migrations.AlterUniqueTogether( + name='materialbatch', + unique_together={('material', 'batch', 'warehouse')}, + ), + ] diff --git a/apps/inm/models.py b/apps/inm/models.py index a87f893f..58c3cbee 100644 --- a/apps/inm/models.py +++ b/apps/inm/models.py @@ -1,5 +1,5 @@ from django.db import models -from apps.utils.models import BaseModel, CommonBModel, CommonBDModel +from apps.utils.models import BaseModel, CommonBModel, CommonBDModel, CommonADModel from apps.pum.models import Supplier, PuOrder from apps.sam.models import Customer, Order from apps.mtm.models import Material @@ -28,6 +28,9 @@ class MaterialBatch(BaseModel): count = models.PositiveIntegerField('存量', default=0) expiration_date = models.DateField('有效期', null=True, blank=True) + class Meta: + unique_together = ('material', 'batch', 'warehouse') + class MaterialBatchA(BaseModel): """ @@ -102,6 +105,20 @@ class MIOItem(BaseModel): batch = models.CharField('批次号', max_length=50) count = models.PositiveIntegerField('数量', default=0) + test_date = models.DateField('检验日期', null=True, blank=True) + test_user = models.ForeignKey( + User, verbose_name='检验人', on_delete=models.CASCADE, null=True, blank=True) + count_notok = models.PositiveIntegerField('不合格数', default=0) + count_n_zw = models.PositiveIntegerField('炸纹', default=0) + count_n_tw = models.PositiveIntegerField('条纹', default=0) + count_n_qp = models.PositiveIntegerField('气泡', default=0) + count_n_wq = models.PositiveIntegerField('弯曲', default=0) + count_n_dl = models.PositiveIntegerField('断裂', default=0) + count_n_pb = models.PositiveIntegerField('偏壁', default=0) + count_n_dxt = models.PositiveIntegerField('大小头', default=0) + count_n_jsqx = models.PositiveIntegerField('结石气线', default=0) + count_n_qt = models.PositiveIntegerField('其他', default=0) + class MIOItemA(BaseModel): """ diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index 516df161..d01dcf98 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -225,3 +225,10 @@ class MIOOtherSerializer(CustomModelSerializer): class MIODetailSerializer(MIOListSerializer): items = MIOItemSerializer(source='item_mio', many=True, read_only=True) + + +class MIOItemTestSerializer(CustomModelSerializer): + class Meta: + model = MIOItem + fields = ['id', 'test_date', 'test_user', 'count_notok', 'count_n_zw', 'count_n_tw', + 'count_n_qp', 'count_n_wq', 'count_n_dl', 'count_n_pb', 'count_n_dxt', 'count_n_jsqx', 'count_n_qt'] diff --git a/apps/inm/views.py b/apps/inm/views.py index 2db3343e..febe01e5 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -10,7 +10,7 @@ from rest_framework.response import Response from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, - MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer) + MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer) from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin @@ -193,3 +193,28 @@ class MIOItemViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin if has_perm(self.request.user, ['mio.update']) is False and instance.mio.create_by != self.request.user: raise PermissionDenied('无权限删除') return super().perform_destroy(instance) + + @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemTestSerializer) + @transaction.atomic + def test(self, request, *args, **kwargs): + """检验 + + 检验 + """ + ins: MIOItem = self.get_object() + sr = MIOItemTestSerializer(instance=ins, data=request.data) + sr.is_valid(raise_exception=True) + sr.save() + # 开始变动库存 + count_notok = ins.count_notok + batch = ins.batch + material = ins.material + warehouse = ins.warehouse + mb = MaterialBatch.objects.get( + material=material, batch=batch, warehouse=warehouse) + count_new = mb.count - count_notok + if count_new < 0: + raise ParseError('库存扣减失败,请确认!') + mb.count = count_new + mb.save() + return Response() diff --git a/apps/wpm/migrations/0030_alter_mlogb_mlog.py b/apps/wpm/migrations/0030_alter_mlogb_mlog.py new file mode 100644 index 00000000..a0d37aa8 --- /dev/null +++ b/apps/wpm/migrations/0030_alter_mlogb_mlog.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2023-11-03 05:59 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0029_mlog_count_break'), + ] + + operations = [ + migrations.AlterField( + model_name='mlogb', + name='mlog', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='b_mlog', to='wpm.mlog', verbose_name='关联日志'), + ), + ]