feat: mlog经审批后提交

This commit is contained in:
caoqianming 2024-09-03 09:10:28 +08:00
parent 2a8254b581
commit 6a573dd4dd
5 changed files with 77 additions and 17 deletions

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.12 on 2024-09-03 01:04
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('wf', '0002_alter_state_filter_dept'),
('wpm', '0064_auto_20240902_1411'),
]
operations = [
migrations.AddField(
model_name='mlog',
name='oinfo_json',
field=models.JSONField(blank=True, default=dict, verbose_name='其他信息'),
),
migrations.AddField(
model_name='mlog',
name='ticket',
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mlog_ticket', to='wf.ticket', verbose_name='关联工单'),
),
]

View File

@ -193,8 +193,6 @@ class Mlog(CommonADModel):
count_n_yd = models.PositiveIntegerField('圆度', default=0) count_n_yd = models.PositiveIntegerField('圆度', default=0)
count_n_txd = models.PositiveIntegerField('同心度', default=0) count_n_txd = models.PositiveIntegerField('同心度', default=0)
count_n_hd = models.PositiveIntegerField('厚度', default=0) count_n_hd = models.PositiveIntegerField('厚度', default=0)
count_n_qt = models.PositiveIntegerField('其他', default=0) count_n_qt = models.PositiveIntegerField('其他', default=0)
handle_date = models.DateField('操作日期', null=True, blank=True) handle_date = models.DateField('操作日期', null=True, blank=True)
@ -214,6 +212,10 @@ class Mlog(CommonADModel):
submit_user = models.ForeignKey( submit_user = models.ForeignKey(
User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_submit_user') User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='mlog_submit_user')
oinfo_json = models.JSONField('其他信息', default=dict, blank=True)
ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
on_delete=models.SET_NULL, related_name='mlog_ticket', null=True, blank=True, db_constraint=False)
@property @property
def mlogb(self): def mlogb(self):
return Mlogb.objects.filter(mlog=self).exclude(material_out=None) return Mlogb.objects.filter(mlog=self).exclude(material_out=None)

View File

@ -368,7 +368,7 @@ class MlogInitSerializer(CustomModelSerializer):
class MlogChangeSerializer(CustomModelSerializer): class MlogChangeSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Mlog model = Mlog
fields = ['id', 'work_end_time', 'handle_user', 'note'] fields = ['id', 'work_end_time', 'handle_user', 'note', 'oinfo_json']
def validate(self, attrs): def validate(self, attrs):
if attrs.get('work_end_time', None): if attrs.get('work_end_time', None):

View File

@ -4,7 +4,6 @@ from django.core.cache import cache
from django.db.models import Sum from django.db.models import Sum
from django.utils import timezone from django.utils import timezone
from typing import Union from typing import Union
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
@ -13,9 +12,11 @@ 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, Route, RoutePack from apps.mtm.models import Mgroup, Shift, Material, Route, RoutePack
from .models import SfLog, SfLogExp, WMaterial, Mlog, Mlogb, Handover from .models import SfLog, WMaterial, Mlog, Mlogb, Handover
from apps.mtm.models import Process
from apps.mtm.services import cal_material_count from apps.mtm.services import cal_material_count
from apps.wf.models import Ticket
from django.db import transaction
from apps.utils.thread import MyThread
def find_material_can_change(material: Material, mgroup_to: Mgroup): def find_material_can_change(material: Material, mgroup_to: Mgroup):
""" """
@ -633,3 +634,38 @@ def handover_submit(handover: Handover, user: User, now: Union[datetime.datetime
handover.submit_user = user handover.submit_user = user
handover.submit_time = now handover.submit_time = now
handover.save() handover.save()
def mlog_submit_validate(ins: Mlog):
if ins.submit_time:
raise ParseError('该日志已提交!')
if ins.mtask and ins.mtask.state == Mtask.MTASK_STOP:
raise ParseError('该任务已停止!')
if ins.fill_way == Mlog.MLOG_STEP:
if not Mlogb.objects.filter(material_out__isnull=False, mlog=ins).exists():
raise ParseError('该日志未指定产出!')
if not Mlogb.objects.filter(material_in__isnull=False, mlog=ins).exists():
raise ParseError('该日志未指定消耗!')
if Mlogb.objects.filter(material_out__isnull=False, count_real=0, mlog=ins).exists():
raise ParseError('产出数量不能为0!')
def bind_mlog(ticket: Ticket, transition, new_ticket_data: dict):
ins = Mlog.objects.get(id=new_ticket_data['t_id'])
mlog_submit_validate(ins) # 校验是否可submit
ticket_data = ticket.ticket_data
ticket_data.update({
't_model': 'mlog',
't_id': ins.id,
})
ticket.ticket_data = ticket_data
ticket.create_by = ins.create_by
ticket.save()
if ins.ticket is None:
ins.ticket = ticket
ins.save()
def mlog_audit_end(ticket: Ticket):
now = timezone.now()
ins = Mlog.objects.get(id=ticket.ticket_data['t_id'])
mlog_submit(ins, ticket.create_by, now)
MyThread(target=cal_mtask_progress_from_mlog,args=(ins,)).start()
MyThread(target=cal_material_count_from_mlog,args=(ins,)).start()

View File

@ -25,6 +25,7 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer,
from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog 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.utils.thread import MyThread
from apps.monitor.services import create_auditlog, delete_auditlog from apps.monitor.services import create_auditlog, delete_auditlog
from apps.wpm.services import mlog_submit_validate
# Create your views here. # Create your views here.
@ -204,17 +205,13 @@ class MlogViewSet(CustomModelViewSet):
ins: Mlog = self.get_object() ins: Mlog = self.get_object()
vdata_old = MlogSerializer(ins).data vdata_old = MlogSerializer(ins).data
now = timezone.now() now = timezone.now()
if ins.submit_time: if ins.ticket:
raise ParseError('该日志已提交!') raise ParseError('该日志存在审批!')
if ins.mtask and ins.mtask.state == Mtask.MTASK_STOP: else:
raise ParseError('该任务已停止!') p: Process = ins.mgroup.process
if ins.fill_way == Mlog.MLOG_STEP: if p.mlog_need_ticket:
if not Mlogb.objects.filter(material_out__isnull=False, mlog=ins).exists(): raise ParseError('该日志需要审批!')
raise ParseError('该日志未指定产出!') mlog_submit_validate(ins)
if not Mlogb.objects.filter(material_in__isnull=False, mlog=ins).exists():
raise ParseError('该日志未指定消耗!')
if Mlogb.objects.filter(material_out__isnull=False, count_real=0, mlog=ins).exists():
raise ParseError('产出数量不能为0!')
with transaction.atomic(): with transaction.atomic():
mlog_submit(ins, self.request.user, now) mlog_submit(ins, self.request.user, now)
vdata_new = MlogSerializer(ins).data vdata_new = MlogSerializer(ins).data