生产入库

This commit is contained in:
caoqianming 2021-11-16 08:42:45 +08:00
parent 25211e9e5a
commit 5904ab1475
10 changed files with 100 additions and 14 deletions

View File

@ -1,6 +1,6 @@
from rest_framework import serializers
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse,Inventory
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse,Inventory
from apps.qm.models import TestRecord, TestRecordItem
from apps.system.serializers import UserSimpleSerializer
@ -105,14 +105,19 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
raise serializers.ValidationError('数目对不上')
else:
i['fifo'] = obj
fifod = FIFOItem.objects.create(**i)
fifoitem = FIFOItem.objects.create(**i)
p_list0 = []
for x in p_details:
x['material'] = i['material']
x['fifoitem'] = fifoitem
p_list0.append(FIFOItemProduct(**x))
FIFOItemProduct.objects.bulk_create(p_list0)
p_list = []
for x in p_details:
x['state'] = 1
x['material'] = i['material']
x['warehouse'] = validated_data['warehouse']
x['batch'] = i['batch']
x['fifos'] = [fifod.id]
p_list.append(IProduct(**x))
IProduct.objects.bulk_create(p_list)
else:

View File

@ -23,8 +23,6 @@ def update_inm(instance:FIFO, type:int=1):
o2.save()
material.count = material.count + i.count
material.save()
# 如果有详细半成品
pass
elif instance.type in [FIFO.FIFO_TYPE_DO_OUT]: # 生产领料
# 更新相关表
for i in FIFOItem.objects.filter(fifo=instance):

View File

@ -0,0 +1,24 @@
# Generated by Django 3.2.6 on 2021-11-16 00:41
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('mtm', '0030_step_need_test'),
]
operations = [
migrations.AlterField(
model_name='recordform',
name='name',
field=models.CharField(max_length=100, verbose_name='表格名称'),
),
migrations.AlterField(
model_name='usedstep',
name='subproduction',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='usedstep_subproduction', to='mtm.subproduction', verbose_name='关联生产分解'),
),
]

View File

@ -102,7 +102,7 @@ class RecordForm(CommonAModel):
(RF_TYPE_DO, '生产记录'),
(RF_TYPE_TEST, '检验记录')
)
name = models.CharField('表格名称', max_length=100, unique=True)
name = models.CharField('表格名称', max_length=100)
type = models.IntegerField('表格类型', choices=type_choices, default=1)
step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE, null=True, blank=True)
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.6 on 2021-11-16 00:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('qm', '0008_auto_20211111_1405'),
]
operations = [
migrations.AlterField(
model_name='testrecorditem',
name='is_testok',
field=models.BooleanField(blank=True, null=True, verbose_name='是否合格'),
),
]

View File

@ -66,5 +66,5 @@ class TestRecordItem(BaseModel):
field_value = models.JSONField('录入值', default=dict, blank=True)
need_judge = models.BooleanField('是否需要判定', default=False)
sort = models.IntegerField('排序号', default=1)
is_testok = models.BooleanField('是否合格', default=True)
is_testok = models.BooleanField('是否合格', null=True, blank=True)
test_record = models.ForeignKey(TestRecord, verbose_name='关联的检测记录', on_delete=models.CASCADE, related_name='item_test_record')

View File

@ -121,7 +121,7 @@ class WfService(object):
for i in transition.condition_expression:
expression = i['expression'].format(**ticket_all_value)
import datetime, time # 用于支持条件表达式中对时间的操作
if eval(expression, {"__builtins__":None}, {'datetime':datetime, 'time':time}):
if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}):
destination_state = State.objects.get(pk=i['target_state'])
return destination_state

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.6 on 2021-11-16 00:41
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('inm', '0016_auto_20211112_1124'),
('wpm', '0012_auto_20211111_1056'),
]
operations = [
migrations.AddField(
model_name='wproduct',
name='warehouse',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inm.warehouse', verbose_name='所在仓库'),
),
migrations.AlterField(
model_name='wproduct',
name='act_state',
field=models.IntegerField(choices=[(1, '生产中'), (2, '待检测'), (3, '已合格'), (4, '库存中')], default=0, verbose_name='进行状态'),
),
]

View File

@ -2,6 +2,7 @@ from django.db import models
from django.db.models.base import Model
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
from apps.inm.models import WareHouse
from apps.pm.models import ProductionPlan, SubProductionPlan
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
from utils.model import SoftModel, BaseModel
@ -24,10 +25,12 @@ class WProduct(CommonAModel):
WPR_ACT_STATE_DOING = 1
WPR_ACT_STATE_TOTEST = 2
WPR_ACT_STATE_OK = 3
WPR_ACT_STATE_INM = 4
act_state_choices=(
(WPR_ACT_STATE_DOING, '生产中'),
(WPR_ACT_STATE_TOTEST, '待检测'),
(WPR_ACT_STATE_OK, '已合格')
(WPR_ACT_STATE_OK, '已合格'),
(WPR_ACT_STATE_INM, '库存中'),
)
number = models.CharField('物品编号', unique=True, null=True, blank=True, max_length=50)
m_state = models.ForeignKey(Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
@ -40,6 +43,7 @@ class WProduct(CommonAModel):
remark = models.CharField('备注', max_length=200, null=True, blank=True)
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE)
production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE)
warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True)
class Operation(CommonAModel):

View File

@ -5,7 +5,7 @@ from rest_framework.utils import serializer_helpers
from rest_framework.utils.field_mapping import get_relation_kwargs
from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct
from apps.inm.signals import update_inm
from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial
from apps.mtm.serializers import RecordFormDetailSerializer
@ -77,9 +77,21 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
ip['material'] = material
ips.append(FIFOItemProduct(**ip))
FIFOItemProduct.objects.bulk_create(ips)
# 更新库存隐藏半成品
# 创建IProduct
ips2 = []
for i in wproducts:
ip = {}
ip['warehouse'] = vdata['warehouse']
ip['batch'] = batch
ip['wproduct'] = i
ip['number'] = i.number
ip['material'] = material
ips2.append(IProduct(**ip))
IProduct.objects.bulk_create(ips2)
# 更新库存并修改半成品进行状态
update_inm(fifo)
wproducts.update(is_hidden=True)
wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=vdata['warehouse'])
return Response()
@ -143,7 +155,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
m['field_value'] = m['field_value']
m['sort'] = form_field.sort
m['need_judge'] = form_field.need_judge
m['is_testok'] = m['is_testok'] if 'is_testok' in m else True
m['is_testok'] = m['is_testok'] if 'is_testok' in m else None
m['test_record'] = obj
tris.append(TestRecordItem(**m))
TestRecordItem.objects.bulk_create(tris)