feat: 添加mloguser字段及逻辑

This commit is contained in:
caoqianming 2025-03-24 14:37:18 +08:00
parent c1a4edf9e5
commit e07f9c877c
5 changed files with 94 additions and 7 deletions

View File

@ -0,0 +1,35 @@
# Generated by Django 3.2.12 on 2025-03-24 06:36
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('mtm', '0054_process_parent'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wpm', '0101_auto_20250321_1414'),
]
operations = [
migrations.CreateModel(
name='MlogUser',
fields=[
('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('handle_date', models.DateField(verbose_name='操作日期')),
('handle_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='操作人')),
('mlog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.mlog', verbose_name='关联日志')),
('process', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='子工序')),
('shift', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.shift', verbose_name='关联班次')),
],
options={
'abstract': False,
},
),
]

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, Route
from apps.mtm.models import Mgroup, Team, Shift, Material, Route, Process
from apps.pm.models import Mtask, Mtaskb
from apps.system.models import User
from django.utils.timezone import localtime
@ -302,6 +302,13 @@ class Mlog(CommonADModel):
mlog_count_fields.remove("count_ok_full")
return mlog_count_fields
class MlogUser(BaseModel):
mlog = models.ForeignKey(Mlog, verbose_name='关联日志', on_delete=models.CASCADE)
handle_user = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE)
process = models.ForeignKey(Process, verbose_name='子工序', on_delete=models.CASCADE)
shift = models.ForeignKey(Shift, verbose_name='关联班次', on_delete=models.CASCADE)
handle_date = models.DateField('操作日期')
class Mlogb(BaseModel):
"""
TN: 子级生产/检验日志

View File

@ -6,13 +6,13 @@ from datetime import datetime
from .models import (SfLog, StLog, SfLogExp, WMaterial, Mlog,
Handover, Handoverb, Mlogb, AttLog,
OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw, MlogbDefect)
OtherLog, Fmlog, BatchSt, Mlogbw, Handoverbw, MlogbDefect, MlogUser)
from apps.system.models import Dept, User
from apps.system.serializers import UserSimpleSerializer
from apps.pm.models import Mtask, Mtaskb
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, find_material_can_change, generate_new_batch
from apps.mtm.models import Mgroup, TeamMember, Shift, Material, Route
from apps.mtm.models import Mgroup, TeamMember, Shift, Material, Route, Process
from apps.mtm.serializers import MaterialSimpleSerializer
from django.db import transaction
from django.utils import timezone
@ -1185,3 +1185,27 @@ class HandoverMgroupSerializer(serializers.Serializer):
material = serializers.CharField(label="物料ID")
type = serializers.IntegerField(label="交送类型")
class MlogUserSerializer(CustomModelSerializer):
handle_user_name = serializers.CharField(source='user.name', read_only=True)
process_name = serializers.CharField(source='process.name', read_only=True)
shift_name = serializers.CharField(source='shift.name', read_only=True)
class Meta:
model = MlogUser
fields = "__all__"
read_only_fields = EXCLUDE_FIELDS_BASE
def create(self, validated_data):
mlog:Mlog = validated_data["mlog"]
if mlog.submit_time is not None:
raise ParseError("该日志已提交")
process:Process = validated_data["process"]
if mlog.route:
p = mlog.route.process
if process.parent != p:
raise ParseError("该步骤不匹配")
else:
raise ParseError("该日志没有工艺步骤")
if MlogUser.objects.filter(mlog=mlog, process=process).exists():
raise ParseError("该工序已选择")
return super().create(validated_data)

View File

@ -5,7 +5,7 @@ from apps.wpm.views import (SfLogViewSet, StLogViewSet, SfLogExpViewSet,
WMaterialViewSet, MlogViewSet, HandoverViewSet,
AttlogViewSet, OtherLogViewSet, MlogbViewSet, MlogbInViewSet,
MlogbOutViewSet, FmlogViewSet, BatchStViewSet,
MlogbwViewSet)
MlogbwViewSet, MlogUserViewSet)
from apps.wpm.datax import AnaViewSet
@ -28,6 +28,7 @@ router.register('otherlog', OtherLogViewSet, basename='otherlog')
router.register('ana', AnaViewSet, basename='ana')
router.register('batchst', BatchStViewSet, basename='batchst')
router.register('mlogbw', MlogbwViewSet, basename='mlogbw')
router.register('mloguser', MlogUserViewSet, basename='mloguser')
urlpatterns = [
path(API_BASE_URL, include(router.urls)),
]

View File

@ -16,7 +16,7 @@ from apps.utils.mixins import CustomListModelMixin, BulkCreateModelMixin, BulkDe
from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter, MlogbFilter, BatchStFilter
from .models import (SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb,
Mlogbw, AttLog, OtherLog, Fmlog, BatchSt, MlogbDefect)
Mlogbw, AttLog, OtherLog, Fmlog, BatchSt, MlogbDefect, MlogUser)
from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer,
MlogRevertSerializer,
MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer,
@ -25,7 +25,8 @@ from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer,
AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer,
MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer,
MlogbOutUpdateSerializer, FmlogSerializer, FmlogUpdateSerializer, BatchStSerializer,
MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer, MlogbSerializer)
MlogbwCreateUpdateSerializer, HandoverMgroupSerializer, MlogListSerializer,
MlogbSerializer, MlogUserSerializer)
from .services import mlog_submit, handover_submit, mlog_revert
from apps.wpm.services import mlog_submit_validate, generate_new_batch
from apps.wf.models import State
@ -775,4 +776,23 @@ class MlogbwViewSet(CustomModelViewSet):
if need_cal_mlogb:
mlogb_qs = Mlogb.objects.filter(id__in=mlogbIds)
for mlogb in mlogb_qs:
Mlogbw.cal_count_notok(mlogb)
Mlogbw.cal_count_notok(mlogb)
class MlogUserViewSet(BulkCreateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet):
perms_map = {"get": "*", "post": "mlog.update", "delete": "mlog.update"}
queryset = MlogUser.objects.all()
serializer_class = MlogUserSerializer
select_related_fields = ["handle_user", "shift", "process"]
filterset_fields = ["mlog"]
def get_queryset(self):
mlog = self.request.query_params.get("mlog", None)
if not mlog:
raise ParseError("缺少mlog查询参数")
return super().get_queryset()
def perform_destroy(self, instance):
mlog:Mlog = instance.mlog
if mlog.submit_time is not None:
raise ParseError("不能删除该记录")
return super().perform_destroy(instance)