feat: mlog增加submit_time/submit_user及相应逻辑
This commit is contained in:
parent
03d7fbece8
commit
1a640d9a70
|
@ -1,9 +1,10 @@
|
|||
from apps.system.models import Dept
|
||||
from apps.system.models import Dept, User
|
||||
from apps.sam.models import OrderItem
|
||||
from apps.mtm.models import Route, Material, Mgroup
|
||||
from rest_framework.exceptions import ParseError
|
||||
from apps.pm.models import Mtask, Utask
|
||||
from django.db.models.query import QuerySet
|
||||
from django.utils import timezone
|
||||
from datetime import date, timedelta
|
||||
import math
|
||||
from typing import List, Union
|
||||
|
@ -243,18 +244,19 @@ class PmService:
|
|||
change_order_state_when_schedue(orderitemIds)
|
||||
|
||||
@classmethod
|
||||
def mtasks_submit(cls, mtasks: QuerySet[Mtask]):
|
||||
def mtasks_submit(cls, mtasks: QuerySet[Mtask], user: User):
|
||||
"""
|
||||
锁定生产任务
|
||||
"""
|
||||
from apps.wpm.models import Mlog
|
||||
from apps.wpm.services import mlog_confirm, update_mtask
|
||||
from apps.wpm.services import mlog_submit, update_mtask
|
||||
now = timezone.now()
|
||||
for mtask in mtasks:
|
||||
mlogs = Mlog.objects.filter(mtask=mtask)
|
||||
if mlogs.count() == 0:
|
||||
raise ParseError(f'{mtask.mgroup.name}_未填写日志')
|
||||
for mlog in mlogs:
|
||||
mlog_confirm(mlog)
|
||||
mlog_submit(mlog, user, now)
|
||||
update_mtask(mtask)
|
||||
mtask.state = Mtask.MTASK_DONE
|
||||
mtask.save()
|
||||
|
|
|
@ -165,9 +165,10 @@ class MtaskViewSet(CustomModelViewSet):
|
|||
提交任务后不可更新日志
|
||||
"""
|
||||
ids = request.data.get('ids', [])
|
||||
user = request.user
|
||||
mtasks = Mtask.objects.filter(
|
||||
id__in=ids, state=Mtask.MTASK_ASSGINED)
|
||||
PmService.mtasks_submit(mtasks)
|
||||
PmService.mtasks_submit(mtasks, user)
|
||||
return Response()
|
||||
|
||||
@action(methods=['post'], detail=True, perms_map={'post': 'mtask.submit'}, serializer_class=Serializer)
|
||||
|
|
|
@ -59,5 +59,6 @@ class MlogFilter(filters.FilterSet):
|
|||
"batch": ["exact"],
|
||||
"handle_date": ["exact"],
|
||||
"handle_user": ["exact"],
|
||||
"mtask__mgroup__belong_dept__name": ["exact"]
|
||||
"mtask__mgroup__belong_dept__name": ["exact"],
|
||||
"submit_time": ["isnull"]
|
||||
}
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# Generated by Django 3.2.12 on 2023-11-01 05:25
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('wpm', '0023_auto_20231031_1847'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='handover',
|
||||
name='wm',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='handover_wm', to='wpm.wmaterial', verbose_name='关联车间库存'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='mlog',
|
||||
name='submit_time',
|
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='提交时间'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='mlog',
|
||||
name='submit_user',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='mlog_submit_user', to=settings.AUTH_USER_MODEL, verbose_name='提交人'),
|
||||
),
|
||||
]
|
|
@ -128,6 +128,10 @@ class Mlog(CommonADModel):
|
|||
material_outs = models.ManyToManyField(
|
||||
Material, verbose_name='多个产出', blank=True, through='wpm.mlogb', related_name='mlog_material_outs')
|
||||
|
||||
submit_time = models.DateTimeField('提交时间', null=True, blank=True)
|
||||
submit_user = models.ForeignKey(
|
||||
User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_submit_user')
|
||||
|
||||
|
||||
class Mlogb(BaseModel):
|
||||
mlog = models.ForeignKey(Mlog, verbose_name='关联日志',
|
||||
|
@ -155,6 +159,8 @@ class Handover(CommonADModel):
|
|||
Dept, verbose_name='接收部门', on_delete=models.CASCADE, related_name='handover_recive_dept')
|
||||
recive_user = models.ForeignKey(
|
||||
User, verbose_name='接收人', on_delete=models.CASCADE, related_name='handover_recive_user')
|
||||
wm = models.ForeignKey(WMaterial, verbose_name='关联车间库存', on_delete=models.SET_NULL,
|
||||
null=True, blank=True, related_name='handover_wm')
|
||||
mlog = models.ForeignKey(Mlog, verbose_name='关联日志记录',
|
||||
on_delete=models.SET_NULL, null=True, blank=True, related_name='handover_mlog')
|
||||
doin_date = models.DateField('加料日期', null=True, blank=True)
|
||||
|
|
|
@ -117,7 +117,7 @@ class MlogSerializer(CustomModelSerializer):
|
|||
class Meta:
|
||||
model = Mlog
|
||||
fields = '__all__'
|
||||
read_only_fields = EXCLUDE_FIELDS
|
||||
read_only_fields = EXCLUDE_FIELDS + ['submit_time', 'submit_user']
|
||||
|
||||
def create(self, validated_data):
|
||||
mtask = validated_data.get('mtask', None)
|
||||
|
|
|
@ -2,11 +2,14 @@ import datetime
|
|||
|
||||
from django.core.cache import cache
|
||||
from django.db.models import Sum
|
||||
from django.utils.timezone import localtime
|
||||
from datetime import datetime
|
||||
from django.utils import timezone
|
||||
from typing import Union
|
||||
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
|
||||
|
||||
from rest_framework.exceptions import ParseError
|
||||
|
||||
from apps.system.models import User
|
||||
from apps.inm.models import MIO, MIOItem, MIOItemA
|
||||
from apps.pm.models import Mtask
|
||||
from apps.mtm.models import Mgroup, Shift, Material
|
||||
|
@ -116,10 +119,14 @@ def do_in(mio: MIO):
|
|||
raise ParseError('车间物料不足')
|
||||
|
||||
|
||||
def mlog_confirm(mlog: Mlog):
|
||||
def mlog_submit(mlog: Mlog, user: User, now: Union[datetime, None]):
|
||||
"""
|
||||
生产日志创建后需要执行的操作
|
||||
生产日志提交后需要执行的操作
|
||||
"""
|
||||
if mlog.submit_time is not None: # 说明已经做过操作了
|
||||
return
|
||||
if now is None:
|
||||
now = timezone.now()
|
||||
mtask = mlog.mtask
|
||||
belong_dept = mtask.mgroup.belong_dept
|
||||
material_out = mtask.material_out
|
||||
|
@ -141,6 +148,7 @@ def mlog_confirm(mlog: Mlog):
|
|||
material_has.count = material_has.count - mlog.count_use
|
||||
material_has.save()
|
||||
if material_out.is_hidden is False: # 需要入车间库存
|
||||
# 有多个产物的情况
|
||||
if material_out.brothers and Mlogb.objects.filter(mlog=mlog).exists():
|
||||
for item in Mlogb.objects.filter(mlog=mlog):
|
||||
wmaterial, _ = WMaterial.objects.get_or_create(batch=mlog.batch, material=item.material_out, belong_dept=belong_dept, defaults={
|
||||
|
@ -154,6 +162,9 @@ def mlog_confirm(mlog: Mlog):
|
|||
})
|
||||
wmaterial.count = wmaterial.count + mlog.count_ok
|
||||
wmaterial.save()
|
||||
mlog.submit_time = now
|
||||
mlog.submit_user = user
|
||||
mlog.save()
|
||||
|
||||
|
||||
def update_mtask(mtask: Mtask):
|
||||
|
|
Loading…
Reference in New Issue