feat: mtask增加已提交状态并在提交后不允许日志变动

This commit is contained in:
caoqianming 2023-10-08 16:38:55 +08:00
parent b7ba095de7
commit b4cc887f79
7 changed files with 94 additions and 14 deletions

View File

@ -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='状态'),
),
]

View File

@ -17,7 +17,7 @@ class Mtask(CommonADModel):
(MTASK_CREATED, '创建中'),
(MTASK_ASSGINED, '已下达'),
# (MTASK_WORKING, '生产中'),
# (MTASK_DONE, '已结束')
(MTASK_DONE, '已提交')
)
state = models.PositiveIntegerField(
'状态', choices=MTASK_STATES, default=MTASK_CREATED, help_text=str(MTASK_STATES))

View File

@ -114,3 +114,18 @@ class PmService:
from apps.sam.tasks import change_order_state_when_schedue
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()

View File

@ -59,3 +59,16 @@ class MtaskViewSet(CustomModelViewSet):
mtasks = mtasks | Mtask.objects.filter(parent__in=mtasks)
mtasks.update(state=Mtask.MTASK_ASSGINED)
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()

View File

@ -1,9 +1,11 @@
from apps.utils.constants import EXCLUDE_FIELDS
from apps.utils.serializers import CustomModelSerializer
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog
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.mtm.serializers import MaterialSerializer
@ -85,3 +87,13 @@ class MlogSerializer(CustomModelSerializer):
model = Mlog
fields = '__all__'
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

View File

@ -8,6 +8,7 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from rest_framework.exceptions import ParseError
from apps.inm.models import MIO, MIOItem
from apps.pm.models import Mtask
from apps.mtm.models import Mgroup, Shift, Material
from .models import SfLog, SfLogExp, WMaterial, Mlog
@ -103,28 +104,49 @@ def do_in(mio: MIO):
raise ParseError('车间物料不足')
def mlog_create(mlog: Mlog):
def mlog_confirm(mlog: Mlog):
"""
生产日志创建后需要执行的操作
"""
mtask = mlog.mtask
belong_dept = mtask.belong_dept
material = mtask.material
material_before = mtask.material_before
if material_before and material_before.is_hidden is False: # 需要进行车间库存管理
# 需要判断领用数是否合理
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()
if count_x == 1:
material_has = material_has_qs.first()
elif count_x == 0:
raise ParseError(f'{material_before.name}-批次库存不存在!')
raise ParseError(f'{material_before.name}-{mlog.batch}-批次库存不存在!')
else:
raise ParseError(f'{material_before.name}-存在多个相同批次!')
raise ParseError(f'{material_before.name}-{mlog.batch}-存在多个相同批次!')
if mlog.count_use > material_has.count:
raise ParseError(f'{material_before.name}-该批次车间库存不足!')
raise ParseError(f'{material_before.name}-{mlog.batch}-该批次车间库存不足!')
else:
material_has.count = material_has.count - mlog.count_use
material_has.save()
# if material.is_hidden is False: # 需要入库
# wmaterial = WMaterial.objects.get_or_create(batch=mlog.batch, material=material, defaults={})
if material.is_hidden is False: # 需要入库
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()

View File

@ -6,13 +6,13 @@ from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModel
from rest_framework.response import Response
from apps.mtm.models import Material
from apps.pm.models import Mtask
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.utils.mixins import BulkCreateModelMixin
from .filters import SfLogExpFilter, SfLogFilter
from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog
from .serializers import SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogSerializer
from .services import mlog_create
# Create your views here.
@ -97,7 +97,7 @@ class WMaterialViewSet(ListModelMixin, CustomGenericViewSet):
filterset_fields = ['material', 'belong_dept']
class MlogViewSet(ListModelMixin, BulkCreateModelMixin, DestroyModelMixin, CustomGenericViewSet):
class MlogViewSet(CustomModelViewSet):
"""
list: 生产日志
@ -109,7 +109,7 @@ class MlogViewSet(ListModelMixin, BulkCreateModelMixin, DestroyModelMixin, Custo
select_related_fields = ['create_by', 'update_by', 'mtask']
filterset_fields = ['mtask']
def perform_create(self, serializer):
with transaction.atomic():
ins = serializer.save()
mlog_create(ins)
def perform_destroy(self, instance):
if instance.mtask.state == Mtask.MTASK_DONE:
raise ParseError('任务已提交日志不可变动')
return super().perform_destroy(instance)