feat: 出入库明细检验
This commit is contained in:
parent
9315efe6f4
commit
d9ef7548e4
|
@ -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')},
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,5 +1,5 @@
|
||||||
from django.db import models
|
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.pum.models import Supplier, PuOrder
|
||||||
from apps.sam.models import Customer, Order
|
from apps.sam.models import Customer, Order
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
|
@ -28,6 +28,9 @@ class MaterialBatch(BaseModel):
|
||||||
count = models.PositiveIntegerField('存量', default=0)
|
count = models.PositiveIntegerField('存量', default=0)
|
||||||
expiration_date = models.DateField('有效期', null=True, blank=True)
|
expiration_date = models.DateField('有效期', null=True, blank=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('material', 'batch', 'warehouse')
|
||||||
|
|
||||||
|
|
||||||
class MaterialBatchA(BaseModel):
|
class MaterialBatchA(BaseModel):
|
||||||
"""
|
"""
|
||||||
|
@ -102,6 +105,20 @@ class MIOItem(BaseModel):
|
||||||
batch = models.CharField('批次号', max_length=50)
|
batch = models.CharField('批次号', max_length=50)
|
||||||
count = models.PositiveIntegerField('数量', default=0)
|
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):
|
class MIOItemA(BaseModel):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -225,3 +225,10 @@ class MIOOtherSerializer(CustomModelSerializer):
|
||||||
|
|
||||||
class MIODetailSerializer(MIOListSerializer):
|
class MIODetailSerializer(MIOListSerializer):
|
||||||
items = MIOItemSerializer(source='item_mio', many=True, read_only=True)
|
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']
|
||||||
|
|
|
@ -10,7 +10,7 @@ from rest_framework.response import Response
|
||||||
from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem
|
from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem
|
||||||
from apps.inm.serializers import (
|
from apps.inm.serializers import (
|
||||||
MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer,
|
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.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
||||||
from apps.inm.services import InmService
|
from apps.inm.services import InmService
|
||||||
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin
|
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:
|
if has_perm(self.request.user, ['mio.update']) is False and instance.mio.create_by != self.request.user:
|
||||||
raise PermissionDenied('无权限删除')
|
raise PermissionDenied('无权限删除')
|
||||||
return super().perform_destroy(instance)
|
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()
|
||||||
|
|
|
@ -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='关联日志'),
|
||||||
|
),
|
||||||
|
]
|
Loading…
Reference in New Issue