From 4c38cee983436fd68db912d4d4f1be4eda291d06 Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 28 Nov 2024 14:28:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?add:=20mtm/model=20serializer=20view=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0tkx=20=E8=87=AA=E5=8A=A8=E6=8E=92=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/migrations/0043_srule.py | 34 +++++++++++++++++++++++++++++++ apps/mtm/models.py | 8 +++++++- apps/mtm/serializers.py | 9 +++++++- apps/mtm/urls.py | 3 ++- apps/mtm/views.py | 20 ++++++++++++++---- apps/wpm/services.py | 12 +++++------ 6 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 apps/mtm/migrations/0043_srule.py diff --git a/apps/mtm/migrations/0043_srule.py b/apps/mtm/migrations/0043_srule.py new file mode 100644 index 00000000..a78d959d --- /dev/null +++ b/apps/mtm/migrations/0043_srule.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.12 on 2024-11-27 07:52 + +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 = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('system', '0005_alter_permission_type'), + ('mtm', '0042_auto_20241010_1140'), + ] + + operations = [ + migrations.CreateModel( + name='Srule', + 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='删除标记')), + ('rule', models.JSONField(blank=True, default=list, verbose_name='排班规则')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='srule_belong_dept', to='system.dept', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='srule_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='srule_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index e3b9df25..ac76a2b6 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -2,7 +2,7 @@ from django.db import models from apps.system.models import CommonAModel, Dictionary, CommonBModel, CommonADModel, File, BaseModel from django.db.models import Subquery, OuterRef from rest_framework.exceptions import ValidationError, ParseError - +from apps.utils.models import CommonBDModel class Process(CommonBModel): """ @@ -98,6 +98,12 @@ class Shift(CommonBModel): class Meta: verbose_name = '班次' +class Srule(CommonBDModel): + """ + 班组规则 + """ + rule = models.JSONField('排班规则', default=list, blank=True) + class Team(CommonBModel): """班组, belong_dept为所属车间 diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index e63b3bab..6a3025f0 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -1,5 +1,5 @@ from apps.utils.serializers import CustomModelSerializer -from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route, TeamMember, RoutePack +from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route, TeamMember, RoutePack, Srule from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT from rest_framework import serializers from rest_framework.exceptions import ValidationError, ParseError @@ -259,3 +259,10 @@ class RouteSerializer(CustomModelSerializer): if instance.material: self.gen_material_out(instance) return instance + + +class SruleSerializer(CustomModelSerializer): + class Meta: + model = Srule + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS \ No newline at end of file diff --git a/apps/mtm/urls.py b/apps/mtm/urls.py index 0e879705..79eb27e6 100644 --- a/apps/mtm/urls.py +++ b/apps/mtm/urls.py @@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet, GoalViewSet, ProcessViewSet, RouteViewSet, TeamMemberViewSet, - RoutePackViewSet) + RoutePackViewSet, SruleViewSet) API_BASE_URL = 'api/mtm/' HTML_BASE_URL = 'mtm/' @@ -18,6 +18,7 @@ router.register('process', ProcessViewSet, basename='process') router.register('routepack', RoutePackViewSet, basename='routepack') router.register('route', RouteViewSet, basename='route') router.register('teammember', TeamMemberViewSet, basename='teammember') +router.register('srule', SruleViewSet, basename='srule') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/mtm/views.py b/apps/mtm/views.py index 5530b7bb..19fde0ed 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -6,11 +6,11 @@ from rest_framework.response import Response from rest_framework.exceptions import ParseError from apps.mtm.filters import GoalFilter, MaterialFilter, RouteFilter -from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route, TeamMember, RoutePack +from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route, TeamMember, RoutePack, Srule from apps.mtm.serializers import (GoalSerializer, MaterialSerializer, MgroupGoalYearSerializer, MgroupSerializer, ShiftSerializer, TeamSerializer, ProcessSerializer, - RouteSerializer, TeamMemberSerializer, RoutePackSerializer) + RouteSerializer, TeamMemberSerializer, RoutePackSerializer, SruleSerializer) from apps.mtm.services import get_mgroup_goals, daoru_material from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin @@ -124,7 +124,7 @@ class TeamViewSet(CustomModelViewSet): serializer_class = TeamSerializer select_related_fields = ['belong_dept', 'leader'] filterset_fields = ['belong_dept'] - search_fields = ['name'] + search_fields = ['rule'] class TeamMemberViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet): @@ -222,4 +222,16 @@ class RouteViewSet(CustomModelViewSet): routepack = obj.routepack if routepack and routepack.state != RoutePack.RP_S_CREATE: raise ParseError('该状态下不可编辑') - return super().update(request, *args, **kwargs) \ No newline at end of file + return super().update(request, *args, **kwargs) + + +class SruleViewSet(CustomModelViewSet): + """ + list: 排班规则 + """ + queryset = Srule.objects.all() + serializer_class = SruleSerializer + select_related_fields = ['belong_dept'] + filterset_fields = ['belong_dept'] + search_fields = ['rule'] + \ No newline at end of file diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 244df81f..b4e1417e 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -52,12 +52,12 @@ def get_sflog(mgroup: Mgroup, happen_time: datetime): start_time__lte=happen_time, end_time__gt=happen_time, mgroup=mgroup).order_by('-start_time').first() return sflog -def get_team(mgroup: Mgroup, team_ids: list): +def get_team(team_ids: list): from apps.mtm.models import Srule # 获取 r_list 列表 - teams_ins = Srule.objects.get(mgroup=mgroup) + teams_ = Srule.objects.all().values_list('rule', flat=True) # 提取team_id - teams = [team['team'] for team in teams_ins.r_list] + teams = [team['team'] for team in teams_[0]] # 找到 team_ids 匹配段的结束位置 start_idx = -1 for i in range(len(teams)-len(team_ids)+1): @@ -91,9 +91,9 @@ def make_sflogs(mgroup: Mgroup, start_date: datetime.date, end_date: datetime.da all_teams = SfLog.objects.filter(mgroup=mgroup, start_time__lt=start_time).order_by('-start_time').values_list('team', flat=True) # 如果最后一条记录的team_id为空,则继续向前取三条 from itertools import islice - # 获取前三个非空值 + # 获取前三个非空值并且列表反转 last_teams = list(islice(all_teams, 3)) - new_team = get_team(mgroup=mgroup, team_ids=last_teams) + new_team = get_team(team_ids=last_teams[::-1]) # 创建SfLog记录 SfLog.objects.get_or_create(mgroup=mgroup, shift=shift, start_time=start_time, defaults={ "mgroup": mgroup, @@ -104,7 +104,7 @@ def make_sflogs(mgroup: Mgroup, start_date: datetime.date, end_date: datetime.da "total_sec_now": total_sec, "total_sec": total_sec, "create_by": create_by, - "team": new_team + "team_id": new_team }) current_date = current_date + datetime.timedelta(days=1) From 2f31997b4314c0270c00b699a7fbbdebd01341cc Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 28 Nov 2024 16:13:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20enm/task=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8A=A5=E8=AD=A6=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enm/tasks.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index a9e96a06..541a1f7a 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -849,9 +849,14 @@ def cal_enstat_pcoal_change(enstat: EnStat, new_pcoal_heat): enm_alarms_list = [ + + ["电石渣", "elec_consume_unit", "单位产品分布电耗"], + ["原料磨", "elec_consume_unit", "单位产品分布电耗"], ["回转窑", "celec_consume_unit", "单位产品综合电耗"], ["回转窑", "coal_consume_unit", "单位产品标煤耗"], - ["水泥磨", "elec_consume_unit", "单位产品分布电耗"] + ["煤磨", "elec_consume_unit", "单位产品分布电耗"], + ["水泥磨", "elec_consume_unit", "单位产品分布电耗"], + ["水泥包装", "elec_consume_unit", "单位产品分布电耗"] ] @@ -894,6 +899,8 @@ def enm_alarm(year_s: int, month_s: int, day_s: int): "val": real_val, "goal_val": goal_val, "enstat": enstat.id, + "team_name": enstat.team.name if enstat.team else "", + "shift_name": enstat.sflog.shift.name if enstat.sflog.shift.name else "" } event.save() Eventdo.objects.get_or_create(cate=event_cate, event=event, defaults={"cate": event_cate, "event": event})