生产入库
This commit is contained in:
parent
25211e9e5a
commit
5904ab1475
|
@ -1,6 +1,6 @@
|
||||||
from rest_framework import serializers
|
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.qm.models import TestRecord, TestRecordItem
|
||||||
|
|
||||||
from apps.system.serializers import UserSimpleSerializer
|
from apps.system.serializers import UserSimpleSerializer
|
||||||
|
@ -105,14 +105,19 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
|
||||||
raise serializers.ValidationError('数目对不上')
|
raise serializers.ValidationError('数目对不上')
|
||||||
else:
|
else:
|
||||||
i['fifo'] = obj
|
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 = []
|
p_list = []
|
||||||
for x in p_details:
|
for x in p_details:
|
||||||
x['state'] = 1
|
|
||||||
x['material'] = i['material']
|
x['material'] = i['material']
|
||||||
x['warehouse'] = validated_data['warehouse']
|
x['warehouse'] = validated_data['warehouse']
|
||||||
x['batch'] = i['batch']
|
x['batch'] = i['batch']
|
||||||
x['fifos'] = [fifod.id]
|
|
||||||
p_list.append(IProduct(**x))
|
p_list.append(IProduct(**x))
|
||||||
IProduct.objects.bulk_create(p_list)
|
IProduct.objects.bulk_create(p_list)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -23,8 +23,6 @@ def update_inm(instance:FIFO, type:int=1):
|
||||||
o2.save()
|
o2.save()
|
||||||
material.count = material.count + i.count
|
material.count = material.count + i.count
|
||||||
material.save()
|
material.save()
|
||||||
# 如果有详细半成品
|
|
||||||
pass
|
|
||||||
elif instance.type in [FIFO.FIFO_TYPE_DO_OUT]: # 生产领料
|
elif instance.type in [FIFO.FIFO_TYPE_DO_OUT]: # 生产领料
|
||||||
# 更新相关表
|
# 更新相关表
|
||||||
for i in FIFOItem.objects.filter(fifo=instance):
|
for i in FIFOItem.objects.filter(fifo=instance):
|
||||||
|
|
|
@ -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='关联生产分解'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -102,7 +102,7 @@ class RecordForm(CommonAModel):
|
||||||
(RF_TYPE_DO, '生产记录'),
|
(RF_TYPE_DO, '生产记录'),
|
||||||
(RF_TYPE_TEST, '检验记录')
|
(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)
|
type = models.IntegerField('表格类型', choices=type_choices, default=1)
|
||||||
step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE, null=True, blank=True)
|
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)
|
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
|
|
@ -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='是否合格'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -66,5 +66,5 @@ class TestRecordItem(BaseModel):
|
||||||
field_value = models.JSONField('录入值', default=dict, blank=True)
|
field_value = models.JSONField('录入值', default=dict, blank=True)
|
||||||
need_judge = models.BooleanField('是否需要判定', default=False)
|
need_judge = models.BooleanField('是否需要判定', default=False)
|
||||||
sort = models.IntegerField('排序号', default=1)
|
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')
|
test_record = models.ForeignKey(TestRecord, verbose_name='关联的检测记录', on_delete=models.CASCADE, related_name='item_test_record')
|
|
@ -121,7 +121,7 @@ class WfService(object):
|
||||||
for i in transition.condition_expression:
|
for i in transition.condition_expression:
|
||||||
expression = i['expression'].format(**ticket_all_value)
|
expression = i['expression'].format(**ticket_all_value)
|
||||||
import datetime, time # 用于支持条件表达式中对时间的操作
|
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'])
|
destination_state = State.objects.get(pk=i['target_state'])
|
||||||
return destination_state
|
return destination_state
|
||||||
|
|
||||||
|
|
|
@ -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='进行状态'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -2,6 +2,7 @@ from django.db import models
|
||||||
from django.db.models.base import Model
|
from django.db.models.base import Model
|
||||||
import django.utils.timezone as timezone
|
import django.utils.timezone as timezone
|
||||||
from django.db.models.query import QuerySet
|
from django.db.models.query import QuerySet
|
||||||
|
from apps.inm.models import WareHouse
|
||||||
from apps.pm.models import ProductionPlan, SubProductionPlan
|
from apps.pm.models import ProductionPlan, SubProductionPlan
|
||||||
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
|
from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File
|
||||||
from utils.model import SoftModel, BaseModel
|
from utils.model import SoftModel, BaseModel
|
||||||
|
@ -24,10 +25,12 @@ class WProduct(CommonAModel):
|
||||||
WPR_ACT_STATE_DOING = 1
|
WPR_ACT_STATE_DOING = 1
|
||||||
WPR_ACT_STATE_TOTEST = 2
|
WPR_ACT_STATE_TOTEST = 2
|
||||||
WPR_ACT_STATE_OK = 3
|
WPR_ACT_STATE_OK = 3
|
||||||
|
WPR_ACT_STATE_INM = 4
|
||||||
act_state_choices=(
|
act_state_choices=(
|
||||||
(WPR_ACT_STATE_DOING, '生产中'),
|
(WPR_ACT_STATE_DOING, '生产中'),
|
||||||
(WPR_ACT_STATE_TOTEST, '待检测'),
|
(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)
|
number = models.CharField('物品编号', unique=True, null=True, blank=True, max_length=50)
|
||||||
m_state = models.ForeignKey(Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
|
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)
|
remark = models.CharField('备注', max_length=200, null=True, blank=True)
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE)
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE)
|
||||||
production_plan = models.ForeignKey(ProductionPlan, 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):
|
class Operation(CommonAModel):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from rest_framework.utils import serializer_helpers
|
||||||
from rest_framework.utils.field_mapping import get_relation_kwargs
|
from rest_framework.utils.field_mapping import get_relation_kwargs
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
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.inm.signals import update_inm
|
||||||
from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial
|
from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial
|
||||||
from apps.mtm.serializers import RecordFormDetailSerializer
|
from apps.mtm.serializers import RecordFormDetailSerializer
|
||||||
|
@ -77,9 +77,21 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
ip['material'] = material
|
ip['material'] = material
|
||||||
ips.append(FIFOItemProduct(**ip))
|
ips.append(FIFOItemProduct(**ip))
|
||||||
FIFOItemProduct.objects.bulk_create(ips)
|
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)
|
update_inm(fifo)
|
||||||
wproducts.update(is_hidden=True)
|
wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=vdata['warehouse'])
|
||||||
|
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,7 +155,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
|
||||||
m['field_value'] = m['field_value']
|
m['field_value'] = m['field_value']
|
||||||
m['sort'] = form_field.sort
|
m['sort'] = form_field.sort
|
||||||
m['need_judge'] = form_field.need_judge
|
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
|
m['test_record'] = obj
|
||||||
tris.append(TestRecordItem(**m))
|
tris.append(TestRecordItem(**m))
|
||||||
TestRecordItem.objects.bulk_create(tris)
|
TestRecordItem.objects.bulk_create(tris)
|
||||||
|
|
Loading…
Reference in New Issue