feat: 增加handoverb

This commit is contained in:
caoqianming 2024-09-05 10:58:09 +08:00
parent d6e3657298
commit 2b9ec6d01c
3 changed files with 77 additions and 10 deletions

View File

@ -0,0 +1,40 @@
# Generated by Django 3.2.12 on 2024-09-05 02:57
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('wpm', '0068_auto_20240904_1549'),
]
operations = [
migrations.AlterField(
model_name='handover',
name='batch',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='批次号'),
),
migrations.AlterField(
model_name='handover',
name='type',
field=models.PositiveSmallIntegerField(choices=[(10, '正常交接'), (20, '返修交接'), (30, '检验交接'), (40, '报废交接')], default=10, verbose_name='交接类型'),
),
migrations.CreateModel(
name='Handoverb',
fields=[
('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('count', models.PositiveIntegerField(default=0, verbose_name='送料数')),
('handover', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.handover', verbose_name='关联交接记录')),
('wm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='handoverb_wm', to='wpm.wmaterial', verbose_name='关联车间库存')),
],
options={
'abstract': False,
},
),
]

View File

@ -297,7 +297,7 @@ class Handover(CommonADModel):
Mgroup, verbose_name='送料工段', on_delete=models.CASCADE, null=True, blank=True)
send_dept = models.ForeignKey(
Dept, verbose_name='送料部门', on_delete=models.CASCADE, related_name='handover_send_dept')
batch = models.CharField('批次号', max_length=50)
batch = models.CharField('批次号', max_length=50, null=True, blank=True)
material = models.ForeignKey(
Material, verbose_name='物料', on_delete=models.CASCADE, related_name='h_ma')
material_changed = models.ForeignKey(Material, verbose_name='变更后物料', on_delete=models.CASCADE, null=True, blank=True, related_name='h_ma_c')
@ -319,8 +319,15 @@ class Handover(CommonADModel):
submit_user = models.ForeignKey(
User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='handover_submit_user')
@property
def handoverb(self):
return Handoverb.objects.filter(handover=self)
class Handoverb(BaseModel):
pass
handover = models.ForeignKey(Handover, verbose_name='关联交接记录', on_delete=models.CASCADE)
wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL,
null=True, blank=True, related_name='handoverb_wm')
count = models.PositiveIntegerField('送料数', default=0)
class AttLog(CommonADModel):
"""

View File

@ -4,7 +4,8 @@ from rest_framework import serializers
from rest_framework.exceptions import ValidationError, ParseError
from datetime import datetime
from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog, Fmlog
from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog,
Handover, Handoverb, Mlogb, AttLog, OtherLog, Fmlog)
from apps.system.models import Dept, User
from apps.system.serializers import UserSimpleSerializer
from apps.pm.models import Mtask, Mtaskb
@ -542,6 +543,12 @@ class MlogRelatedSerializer(serializers.Serializer):
class DeptBatchSerializer(serializers.Serializer):
belong_dept_name = serializers.CharField(label='车间名称')
class HandoverbSerializer(CustomModelSerializer):
class Meta:
model = Handoverb
fields = "__all__"
read_only_fields = EXCLUDE_FIELDS_BASE + ['handover']
extra_kwargs = {'wm': {'required': True}}
class HandoverSerializer(CustomModelSerializer):
# wm = serializers.PrimaryKeyRelatedField(
@ -560,12 +567,20 @@ class HandoverSerializer(CustomModelSerializer):
material_name = serializers.StringRelatedField(
source='material', read_only=True)
wm_notok_sign = serializers.CharField(source='wm.notok_sign', read_only=True)
handoverb = HandoverbSerializer(many=True, read_only=True)
def validate(self, attrs):
if 'type' not in attrs:
attrs['type'] = Handover.H_NORMAL
wm:WMaterial = attrs['wm']
material = wm.material
wm:WMaterial = attrs.get('wm', None)
handoverb = attrs.get('handoverb', [])
if wm:
material = wm.material
attrs['handoverb'] = [{"wm": wm, "count": attrs["count"] }]
elif handoverb:
wm: WMaterial = handoverb[0]["wm"]
else:
raise ParseError('必须指定车间库存')
attrs['material'] = wm.material
attrs['batch'] = wm.batch
attrs['send_dept'] = wm.belong_dept
@ -579,10 +594,14 @@ class HandoverSerializer(CustomModelSerializer):
raise ValidationError('收料车间和收料工段必须有一个')
if 'send_dept' not in attrs and 'send_mgroup' not in attrs:
raise ValidationError('送料车间和送料工段必须有一个')
if wm.notok_sign is not None and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]:
raise ValidationError('物料不合格,不能进行正常/检验交接')
if wm.count_xtest is not None:
raise ValidationError('物料检验中,不能进行交接')
for ind, item in enumerate(handoverb):
wm = item["wm"]
if attrs["material"] != wm.material:
raise ParseError(f'{ind+1}物料与交接物料不一致')
if wm.notok_sign is not None and attrs['type'] in [Handover.H_NORMAL, Handover.H_TEST]:
raise ParseError(f'{ind+1}物料不合格,不能进行正常/检验交接')
if wm.count_xtest is not None:
raise ParseError(f'{ind+1}物料检验中,不能进行交接')
return attrs
class Meta:
@ -591,7 +610,7 @@ class HandoverSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS + ["mlog"]
extra_kwargs = {
"type": {"required": False},
"wm": {"required": True},
"wm": {"required": False},
"send_dept": {"required": False},
"recive_mgroup": {"required": False},
"recive_dept": {"required": False},
@ -614,6 +633,7 @@ class HandoverUpdateSerializer(CustomModelSerializer):
fields = ['id', 'send_date', 'send_user', 'count', 'count_eweight', 'recive_user']
class GenHandoverSerializer(serializers.Serializer):
mlogs = serializers.PrimaryKeyRelatedField(
label='mlog的ID列表', queryset=Mlog.objects.all(), many=True)