feat: 出入库明细检验

This commit is contained in:
caoqianming 2023-11-03 14:01:03 +08:00
parent 9315efe6f4
commit d9ef7548e4
5 changed files with 151 additions and 2 deletions

View File

@ -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')},
),
]

View File

@ -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):
"""

View File

@ -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']

View File

@ -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()

View File

@ -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='关联日志'),
),
]