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.sam.models import OrderItem
|
||||||
from apps.mtm.models import Route, Material, Mgroup
|
from apps.mtm.models import Route, Material, Mgroup
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
from apps.pm.models import Mtask, Utask
|
from apps.pm.models import Mtask, Utask
|
||||||
from django.db.models.query import QuerySet
|
from django.db.models.query import QuerySet
|
||||||
|
from django.utils import timezone
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta
|
||||||
import math
|
import math
|
||||||
from typing import List, Union
|
from typing import List, Union
|
||||||
|
@ -243,18 +244,19 @@ class PmService:
|
||||||
change_order_state_when_schedue(orderitemIds)
|
change_order_state_when_schedue(orderitemIds)
|
||||||
|
|
||||||
@classmethod
|
@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.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:
|
for mtask in mtasks:
|
||||||
mlogs = Mlog.objects.filter(mtask=mtask)
|
mlogs = Mlog.objects.filter(mtask=mtask)
|
||||||
if mlogs.count() == 0:
|
if mlogs.count() == 0:
|
||||||
raise ParseError(f'{mtask.mgroup.name}_未填写日志')
|
raise ParseError(f'{mtask.mgroup.name}_未填写日志')
|
||||||
for mlog in mlogs:
|
for mlog in mlogs:
|
||||||
mlog_confirm(mlog)
|
mlog_submit(mlog, user, now)
|
||||||
update_mtask(mtask)
|
update_mtask(mtask)
|
||||||
mtask.state = Mtask.MTASK_DONE
|
mtask.state = Mtask.MTASK_DONE
|
||||||
mtask.save()
|
mtask.save()
|
||||||
|
|
|
@ -165,9 +165,10 @@ class MtaskViewSet(CustomModelViewSet):
|
||||||
提交任务后不可更新日志
|
提交任务后不可更新日志
|
||||||
"""
|
"""
|
||||||
ids = request.data.get('ids', [])
|
ids = request.data.get('ids', [])
|
||||||
|
user = request.user
|
||||||
mtasks = Mtask.objects.filter(
|
mtasks = Mtask.objects.filter(
|
||||||
id__in=ids, state=Mtask.MTASK_ASSGINED)
|
id__in=ids, state=Mtask.MTASK_ASSGINED)
|
||||||
PmService.mtasks_submit(mtasks)
|
PmService.mtasks_submit(mtasks, user)
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
@action(methods=['post'], detail=True, perms_map={'post': 'mtask.submit'}, serializer_class=Serializer)
|
@action(methods=['post'], detail=True, perms_map={'post': 'mtask.submit'}, serializer_class=Serializer)
|
||||||
|
|
|
@ -59,5 +59,6 @@ class MlogFilter(filters.FilterSet):
|
||||||
"batch": ["exact"],
|
"batch": ["exact"],
|
||||||
"handle_date": ["exact"],
|
"handle_date": ["exact"],
|
||||||
"handle_user": ["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_outs = models.ManyToManyField(
|
||||||
Material, verbose_name='多个产出', blank=True, through='wpm.mlogb', related_name='mlog_material_outs')
|
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):
|
class Mlogb(BaseModel):
|
||||||
mlog = models.ForeignKey(Mlog, verbose_name='关联日志',
|
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')
|
Dept, verbose_name='接收部门', on_delete=models.CASCADE, related_name='handover_recive_dept')
|
||||||
recive_user = models.ForeignKey(
|
recive_user = models.ForeignKey(
|
||||||
User, verbose_name='接收人', on_delete=models.CASCADE, related_name='handover_recive_user')
|
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='关联日志记录',
|
mlog = models.ForeignKey(Mlog, verbose_name='关联日志记录',
|
||||||
on_delete=models.SET_NULL, null=True, blank=True, related_name='handover_mlog')
|
on_delete=models.SET_NULL, null=True, blank=True, related_name='handover_mlog')
|
||||||
doin_date = models.DateField('加料日期', null=True, blank=True)
|
doin_date = models.DateField('加料日期', null=True, blank=True)
|
||||||
|
|
|
@ -117,7 +117,7 @@ class MlogSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mlog
|
model = Mlog
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
read_only_fields = EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS + ['submit_time', 'submit_user']
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
mtask = validated_data.get('mtask', None)
|
mtask = validated_data.get('mtask', None)
|
||||||
|
|
|
@ -2,11 +2,14 @@ import datetime
|
||||||
|
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from django.db.models import Sum
|
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 django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
|
||||||
|
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
|
|
||||||
|
from apps.system.models import User
|
||||||
from apps.inm.models import MIO, MIOItem, MIOItemA
|
from apps.inm.models import MIO, MIOItem, MIOItemA
|
||||||
from apps.pm.models import Mtask
|
from apps.pm.models import Mtask
|
||||||
from apps.mtm.models import Mgroup, Shift, Material
|
from apps.mtm.models import Mgroup, Shift, Material
|
||||||
|
@ -116,10 +119,14 @@ def do_in(mio: MIO):
|
||||||
raise ParseError('车间物料不足')
|
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
|
mtask = mlog.mtask
|
||||||
belong_dept = mtask.mgroup.belong_dept
|
belong_dept = mtask.mgroup.belong_dept
|
||||||
material_out = mtask.material_out
|
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.count = material_has.count - mlog.count_use
|
||||||
material_has.save()
|
material_has.save()
|
||||||
if material_out.is_hidden is False: # 需要入车间库存
|
if material_out.is_hidden is False: # 需要入车间库存
|
||||||
|
# 有多个产物的情况
|
||||||
if material_out.brothers and Mlogb.objects.filter(mlog=mlog).exists():
|
if material_out.brothers and Mlogb.objects.filter(mlog=mlog).exists():
|
||||||
for item in Mlogb.objects.filter(mlog=mlog):
|
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={
|
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.count = wmaterial.count + mlog.count_ok
|
||||||
wmaterial.save()
|
wmaterial.save()
|
||||||
|
mlog.submit_time = now
|
||||||
|
mlog.submit_user = user
|
||||||
|
mlog.save()
|
||||||
|
|
||||||
|
|
||||||
def update_mtask(mtask: Mtask):
|
def update_mtask(mtask: Mtask):
|
||||||
|
|
Loading…
Reference in New Issue