feat: 添加mloguser字段及逻辑
This commit is contained in:
parent
c1a4edf9e5
commit
e07f9c877c
|
@ -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,
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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: 子级生产/检验日志
|
||||
|
|
|
@ -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)
|
|
@ -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)),
|
||||
]
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue