feat: mtask增加已提交状态并在提交后不允许日志变动
This commit is contained in:
parent
b7ba095de7
commit
b4cc887f79
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.12 on 2023-10-08 08:36
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('pm', '0004_auto_20231008_1126'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mtask',
|
||||||
|
name='state',
|
||||||
|
field=models.PositiveIntegerField(choices=[(10, '创建中'), (20, '已下达'), (40, '已提交')], default=10, help_text="((10, '创建中'), (20, '已下达'), (40, '已提交'))", verbose_name='状态'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -17,7 +17,7 @@ class Mtask(CommonADModel):
|
||||||
(MTASK_CREATED, '创建中'),
|
(MTASK_CREATED, '创建中'),
|
||||||
(MTASK_ASSGINED, '已下达'),
|
(MTASK_ASSGINED, '已下达'),
|
||||||
# (MTASK_WORKING, '生产中'),
|
# (MTASK_WORKING, '生产中'),
|
||||||
# (MTASK_DONE, '已结束')
|
(MTASK_DONE, '已提交')
|
||||||
)
|
)
|
||||||
state = models.PositiveIntegerField(
|
state = models.PositiveIntegerField(
|
||||||
'状态', choices=MTASK_STATES, default=MTASK_CREATED, help_text=str(MTASK_STATES))
|
'状态', choices=MTASK_STATES, default=MTASK_CREATED, help_text=str(MTASK_STATES))
|
||||||
|
|
|
@ -114,3 +114,18 @@ class PmService:
|
||||||
|
|
||||||
from apps.sam.tasks import change_order_state_when_schedue
|
from apps.sam.tasks import change_order_state_when_schedue
|
||||||
change_order_state_when_schedue.delay(orderitemId_list)
|
change_order_state_when_schedue.delay(orderitemId_list)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def mtasks_submit(cls, mtasks: QuerySet[Mtask]):
|
||||||
|
"""
|
||||||
|
锁定生产任务
|
||||||
|
"""
|
||||||
|
from apps.wpm.models import Mlog
|
||||||
|
from apps.wpm.services import mlog_confirm, update_mtask_count
|
||||||
|
for mtask in mtasks:
|
||||||
|
mlogs = Mlog.objects.filter(mtask=mtask)
|
||||||
|
for mlog in mlogs:
|
||||||
|
mlog_confirm(mlog)
|
||||||
|
update_mtask_count(mtask)
|
||||||
|
mtask.state = Mtask.MTASK_DONE
|
||||||
|
mtask.save()
|
||||||
|
|
|
@ -59,3 +59,16 @@ class MtaskViewSet(CustomModelViewSet):
|
||||||
mtasks = mtasks | Mtask.objects.filter(parent__in=mtasks)
|
mtasks = mtasks | Mtask.objects.filter(parent__in=mtasks)
|
||||||
mtasks.update(state=Mtask.MTASK_ASSGINED)
|
mtasks.update(state=Mtask.MTASK_ASSGINED)
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.submit'}, serializer_class=PkSerializer)
|
||||||
|
@transaction.atomic
|
||||||
|
def submit(self, request):
|
||||||
|
"""提交任务
|
||||||
|
|
||||||
|
提交任务后不可更新日志
|
||||||
|
"""
|
||||||
|
ids = request.data.get('ids', [])
|
||||||
|
mtasks = Mtask.objects.filter(
|
||||||
|
id__in=ids, parent=None, state=Mtask.MTASK_ASSGINED)
|
||||||
|
PmService.mtasks_submit(mtasks)
|
||||||
|
return Response()
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
from apps.utils.constants import EXCLUDE_FIELDS
|
from apps.utils.constants import EXCLUDE_FIELDS
|
||||||
from apps.utils.serializers import CustomModelSerializer
|
from apps.utils.serializers import CustomModelSerializer
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.exceptions import ValidationError
|
||||||
|
|
||||||
from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog
|
from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog
|
||||||
from apps.system.models import Dictionary
|
from apps.system.models import Dictionary
|
||||||
|
from apps.pm.models import Mtask
|
||||||
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change
|
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change
|
||||||
from apps.mtm.serializers import MaterialSerializer
|
from apps.mtm.serializers import MaterialSerializer
|
||||||
|
|
||||||
|
@ -85,3 +87,13 @@ class MlogSerializer(CustomModelSerializer):
|
||||||
model = Mlog
|
model = Mlog
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
read_only_fields = EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
|
def update(self, instance, validated_data):
|
||||||
|
validated_data.pop('mtask', None)
|
||||||
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
mtask = attrs['mtask']
|
||||||
|
if mtask.state != Mtask.MTASK_ASSGINED:
|
||||||
|
raise ValidationError('该任务状态不可提交日志!')
|
||||||
|
return attrs
|
||||||
|
|
|
@ -8,6 +8,7 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
|
|
||||||
from apps.inm.models import MIO, MIOItem
|
from apps.inm.models import MIO, MIOItem
|
||||||
|
from apps.pm.models import Mtask
|
||||||
from apps.mtm.models import Mgroup, Shift, Material
|
from apps.mtm.models import Mgroup, Shift, Material
|
||||||
|
|
||||||
from .models import SfLog, SfLogExp, WMaterial, Mlog
|
from .models import SfLog, SfLogExp, WMaterial, Mlog
|
||||||
|
@ -103,28 +104,49 @@ def do_in(mio: MIO):
|
||||||
raise ParseError('车间物料不足')
|
raise ParseError('车间物料不足')
|
||||||
|
|
||||||
|
|
||||||
def mlog_create(mlog: Mlog):
|
def mlog_confirm(mlog: Mlog):
|
||||||
"""
|
"""
|
||||||
生产日志创建后需要执行的操作
|
生产日志创建后需要执行的操作
|
||||||
"""
|
"""
|
||||||
mtask = mlog.mtask
|
mtask = mlog.mtask
|
||||||
|
belong_dept = mtask.belong_dept
|
||||||
material = mtask.material
|
material = mtask.material
|
||||||
material_before = mtask.material_before
|
material_before = mtask.material_before
|
||||||
if material_before and material_before.is_hidden is False: # 需要进行车间库存管理
|
if material_before and material_before.is_hidden is False: # 需要进行车间库存管理
|
||||||
# 需要判断领用数是否合理
|
# 需要判断领用数是否合理
|
||||||
material_has_qs = WMaterial.objects.filter(
|
material_has_qs = WMaterial.objects.filter(
|
||||||
batch=mlog.batch, material=material_before)
|
batch=mlog.batch, material=material_before, belong_dept=belong_dept)
|
||||||
count_x = material_has_qs.count()
|
count_x = material_has_qs.count()
|
||||||
if count_x == 1:
|
if count_x == 1:
|
||||||
material_has = material_has_qs.first()
|
material_has = material_has_qs.first()
|
||||||
elif count_x == 0:
|
elif count_x == 0:
|
||||||
raise ParseError(f'{material_before.name}-批次库存不存在!')
|
raise ParseError(f'{material_before.name}-{mlog.batch}-批次库存不存在!')
|
||||||
else:
|
else:
|
||||||
raise ParseError(f'{material_before.name}-存在多个相同批次!')
|
raise ParseError(f'{material_before.name}-{mlog.batch}-存在多个相同批次!')
|
||||||
if mlog.count_use > material_has.count:
|
if mlog.count_use > material_has.count:
|
||||||
raise ParseError(f'{material_before.name}-该批次车间库存不足!')
|
raise ParseError(f'{material_before.name}-{mlog.batch}-该批次车间库存不足!')
|
||||||
else:
|
else:
|
||||||
material_has.count = material_has.count - mlog.count_use
|
material_has.count = material_has.count - mlog.count_use
|
||||||
material_has.save()
|
material_has.save()
|
||||||
# if material.is_hidden is False: # 需要入库
|
if material.is_hidden is False: # 需要入库
|
||||||
# wmaterial = WMaterial.objects.get_or_create(batch=mlog.batch, material=material, defaults={})
|
wmaterial, _ = WMaterial.objects.get_or_create(batch=mlog.batch, material=material, belong_dept=belong_dept, defaults={
|
||||||
|
'batch': mlog.batch, 'material': material, 'belong_dept': belong_dept
|
||||||
|
})
|
||||||
|
wmaterial.count = wmaterial.count + mlog.count_ok
|
||||||
|
wmaterial.save()
|
||||||
|
|
||||||
|
|
||||||
|
def update_mtask_count(mtask: Mtask):
|
||||||
|
res = Mlog.objects.filter(mtask=mtask).aaggregate(sum_count_real=Sum(
|
||||||
|
'count_real'), sum_count_ok=Sum('count_ok'), sum_count_notok=Sum('count_notok'))
|
||||||
|
mtask.count_real = res['sum_count_real'] if res['sum_count_real'] else 0
|
||||||
|
mtask.count_ok = res['sum_count_ok'] if res['sum_count_ok'] else 0
|
||||||
|
mtask.count_notok = res['sum_count_notok'] if res['sum_count_notok'] else 0
|
||||||
|
mtask.save()
|
||||||
|
if mtask.parent:
|
||||||
|
res2 = Mtask.objects.filter(parent=mtask.parent).aaggregate(sum_count_real=Sum(
|
||||||
|
'count_real'), sum_count_ok=Sum('count_ok'), sum_count_notok=Sum('count_notok'))
|
||||||
|
mtask.count_real = res2['sum_count_real'] if res2['sum_count_real'] else 0
|
||||||
|
mtask.count_ok = res2['sum_count_ok'] if res2['sum_count_ok'] else 0
|
||||||
|
mtask.count_notok = res2['sum_count_notok'] if res2['sum_count_notok'] else 0
|
||||||
|
mtask.save()
|
||||||
|
|
|
@ -6,13 +6,13 @@ from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModel
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
|
from apps.pm.models import Mtask
|
||||||
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
|
||||||
from apps.utils.mixins import BulkCreateModelMixin
|
from apps.utils.mixins import BulkCreateModelMixin
|
||||||
|
|
||||||
from .filters import SfLogExpFilter, SfLogFilter
|
from .filters import SfLogExpFilter, SfLogFilter
|
||||||
from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog
|
from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog
|
||||||
from .serializers import SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogSerializer
|
from .serializers import SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogSerializer
|
||||||
from .services import mlog_create
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ class WMaterialViewSet(ListModelMixin, CustomGenericViewSet):
|
||||||
filterset_fields = ['material', 'belong_dept']
|
filterset_fields = ['material', 'belong_dept']
|
||||||
|
|
||||||
|
|
||||||
class MlogViewSet(ListModelMixin, BulkCreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
class MlogViewSet(CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
list: 生产日志
|
list: 生产日志
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ class MlogViewSet(ListModelMixin, BulkCreateModelMixin, DestroyModelMixin, Custo
|
||||||
select_related_fields = ['create_by', 'update_by', 'mtask']
|
select_related_fields = ['create_by', 'update_by', 'mtask']
|
||||||
filterset_fields = ['mtask']
|
filterset_fields = ['mtask']
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_destroy(self, instance):
|
||||||
with transaction.atomic():
|
if instance.mtask.state == Mtask.MTASK_DONE:
|
||||||
ins = serializer.save()
|
raise ParseError('任务已提交日志不可变动')
|
||||||
mlog_create(ins)
|
return super().perform_destroy(instance)
|
||||||
|
|
Loading…
Reference in New Issue