feat: mlog init

This commit is contained in:
caoqianming 2024-07-10 15:32:33 +08:00
parent 4c93bb98de
commit 2f5edc041c
6 changed files with 110 additions and 28 deletions

View File

@ -5,9 +5,6 @@ from apps.mtm.models import Material, Process
from rest_framework.exceptions import ParseError
from apps.utils.tools import ranstr
from datetime import datetime
from apps.wpm.models import StLog
from apps.wpm.services import get_sflog
from apps.wpm.tasks import cal_exp_duration_sec
from apps.wf.models import Ticket
from django.db.models import Sum
from typing import List
@ -109,6 +106,9 @@ def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime):
"""
调用工段运行变动
"""
from apps.wpm.services import get_sflog
from apps.wpm.tasks import cal_exp_duration_sec
from apps.wpm.models import StLog
mgroup.is_running = new_run
mgroup.save(update_fields=["is_running"])

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.12 on 2024-07-10 07:08
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('mtm', '0033_auto_20240704_1003'),
('wpm', '0050_auto_20240701_0936'),
]
operations = [
migrations.AddField(
model_name='mlog',
name='reminder_interval_list',
field=models.JSONField(blank=True, default=list, verbose_name='提醒间隔'),
),
migrations.AddField(
model_name='mlog',
name='route',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mtm.route', verbose_name='生产路线'),
),
]

View File

@ -1,6 +1,6 @@
from django.db import models
from apps.utils.models import CommonADModel, CommonBDModel, BaseModel
from apps.mtm.models import Mgroup, Team, Shift, Material
from apps.mtm.models import Mgroup, Team, Shift, Material, Route
from apps.pm.models import Mtask
from apps.system.models import User
from django.utils.timezone import localtime
@ -106,7 +106,8 @@ class Mlog(CommonADModel):
work_start_time = models.DateTimeField('生产开始时间', null=True, blank=True)
work_end_time = models.DateTimeField('生产结束时间', null=True, blank=True)
hour_work = models.FloatField('预计工时', null=True, blank=True)
reminder_interval_list = models.JSONField('提醒间隔', default=list, blank=True)
route = models.ForeignKey(Route, verbose_name='生产路线', on_delete=models.SET_NULL, null=True, blank=True)
mtask = models.ForeignKey(
Mtask, verbose_name='关联任务', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_mtask')
mgroup = models.ForeignKey(

View File

@ -10,7 +10,7 @@ from apps.system.serializers import UserSimpleSerializer
from apps.pm.models import Mtask
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change, cal_exp_duration_sec
from apps.wpm.services import get_sflog
from apps.mtm.models import Mgroup, TeamMember, Shift, Material
from apps.mtm.models import Mgroup, TeamMember, Shift, Material, Route
from apps.mtm.serializers import MaterialSimpleSerializer
from django.db import transaction
from django.utils import timezone
@ -310,7 +310,24 @@ class MlogSerializer(CustomModelSerializer):
class MlogInitSerializer(CustomModelSerializer):
pass
class Meta:
model = Mlog
fields = ['id', 'work_start_time', 'reminder_interval_list', 'route', 'equipment', 'handle_user', 'note']
extra_kwargs = {
'work_start_time': {'required': True},
'route':{'required': True},
'mgroup': {'required': True}
}
def validate(self, attrs):
route: Route = attrs['route']
mgroup: Mgroup = attrs['mgroup']
if route.process != mgroup.process:
raise ValidationError('工序不匹配')
attrs['hour_work'] = route.hour_work
attrs['material_in'] = route.material_in
attrs['material_out'] = route.material_out
return attrs
class MlogRevertSerializer(serializers.Serializer):
change_reason = serializers.CharField(label='撤回原因')

View File

@ -15,6 +15,7 @@ from apps.mtm.models import Mgroup, Shift, Material, Route
from .models import SfLog, SfLogExp, WMaterial, Mlog, Mlogb, Handover
from apps.mtm.models import Process
from apps.mtm.services import cal_material_count
def get_sflog(mgroup: Mgroup, happen_time: datetime):
@ -317,11 +318,35 @@ def mlog_revert(mlog: Mlog, user: User, now: Union[datetime.datetime, None]):
mlog.save()
def cal_mtask_progress(mtaskId_list = []):
def cal_mtask_progress(mtask: Mtask):
"""
计算任务进度
"""
pass
def cal_mtask_progress_from_mlog(mlog: Mlog):
"""
更新mlog关联的任务进度(可线程中执行)
"""
def cal_material_count_from_mlog(mlog: Mlog):
"""
更新mlog关联的物料数量(可单独执行)
"""
matid_list = []
if mlog.material_in:
matid_list.append(mlog.material_in.id)
if mlog.material_out:
matid_list.append(mlog.material_out.id)
matid_list2 = Mlogb.objects.filter(mlog=mlog).values_list('material_in__id', 'material_out__id').distinct()
for matid in matid_list2:
if matid[0]:
matid_list.append(matid[0])
if matid[1]:
matid_list.append(matid[1])
cal_material_count(matid_list)
def update_mtask(mtask: Mtask):
from apps.pm.models import Utask

View File

@ -19,8 +19,10 @@ from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, Hand
from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog
from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogRevertSerializer,
MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer,
GenHandoverSerializer, GenHandoverWmSerializer, MlogAnaSerializer, AttLogSerializer, OtherLogSerializer)
from .services import mlog_submit, update_mtask, handover_submit, mlog_revert
GenHandoverSerializer, GenHandoverWmSerializer, MlogAnaSerializer,
AttLogSerializer, OtherLogSerializer, MlogInitSerializer)
from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog
from apps.utils.thread import MyThread
from apps.monitor.services import create_auditlog, delete_auditlog
# Create your views here.
@ -166,8 +168,17 @@ class MlogViewSet(CustomModelViewSet):
val_new = MlogSerializer(instance=ins).data
create_auditlog('update', ins, val_new, val_old)
@action(methods=['post'], detail=False, perms_map={'post': 'mlog.init'}, serializer_class=MlogInitSerializer)
def init(self, request, *args, **kwargs):
"""
先初始化创建生产日志
"""
sr = MlogInitSerializer(data=request.data)
sr.is_valid(raise_exception=True)
ins = sr.save()
return Response(MlogSerializer(ins).data)
@action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=Serializer)
@transaction.atomic
def submit(self, request, *args, **kwargs):
"""日志提交(变动车间库存)
@ -180,16 +191,17 @@ class MlogViewSet(CustomModelViewSet):
raise ParseError('该日志已提交!')
if ins.mtask and ins.mtask.state == Mtask.MTASK_STOP:
raise ParseError('该任务已停止!')
mlog_submit(ins, self.request.user, now)
if ins.mtask:
update_mtask(ins.mtask)
vdata_new = MlogSerializer(ins).data
create_auditlog('submit', ins, vdata_new,
vdata_old, now, self.request.user)
return Response(MlogSerializer(instance=ins).data)
with transaction.atomic():
mlog_submit(ins, self.request.user, now)
if ins.mtask:
update_mtask(ins.mtask)
vdata_new = MlogSerializer(ins).data
create_auditlog('submit', ins, vdata_new,
vdata_old, now, self.request.user)
MyThread(cal_material_count_from_mlog,args=(ins,)).start()
return Response(vdata_new)
@action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=MlogRevertSerializer)
@transaction.atomic
def revert(self, request, *args, **kwargs):
"""撤回日志提交
@ -202,15 +214,17 @@ class MlogViewSet(CustomModelViewSet):
if user != ins.submit_user:
raise ParseError('非提交人不可撤销!')
now = timezone.now()
mlog_revert(ins, user, now)
if ins.mtask:
mtask = ins.mtask
if mtask.state == Mtask.MTASK_SUBMIT:
mtask.state = Mtask.MTASK_ASSGINED
mtask.save()
update_mtask(ins.mtask)
create_auditlog('revert', ins, {}, {}, now, user,
with transaction.atomic():
mlog_revert(ins, user, now)
if ins.mtask:
mtask = ins.mtask
if mtask.state == Mtask.MTASK_SUBMIT:
mtask.state = Mtask.MTASK_ASSGINED
mtask.save()
update_mtask(ins.mtask)
create_auditlog('revert', ins, {}, {}, now, user,
request.data.get('change_reason', ''))
MyThread(cal_material_count_from_mlog,args=(ins,)).start()
return Response(MlogSerializer(instance=ins).data)
@action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MlogRelatedSerializer)