From 008219e9ba9e8d66230725ba70ac564b3b963b56 Mon Sep 17 00:00:00 2001 From: zty Date: Wed, 25 Sep 2024 16:03:59 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix=20:=20em=20enm=20wpm=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=9B=B4=E6=96=B0=E8=AE=BE=E5=A4=87=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/em/services.py | 11 +++++++++-- apps/enm/serializers.py | 4 ++-- apps/wpm/tasks.py | 7 ++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/em/services.py b/apps/em/services.py index f4e79450..857d3e98 100644 --- a/apps/em/services.py +++ b/apps/em/services.py @@ -8,6 +8,9 @@ from django.core.cache import cache from apps.utils.tasks import ctask_run import logging from apps.mtm.services import mgroup_run_change +import random +import time + myLogger = logging.getLogger("log") baseTime = datetime.datetime(year=1990, month=4, day=4, hour=0, minute=0, second=0, tzinfo=tz.gettz(settings.TIME_ZONE)) @@ -27,20 +30,22 @@ def set_eq_rs(equipId, last_timex: datetime, last_mrs: int): eq_rs_change = False ten_minutes = datetime.timedelta(minutes=10) now = datetime.datetime.now() + mgroup_sort_trigger = False if eq_rs_cache["running_state"] != last_mrs: # 如果状态变动了要调用方法否则只需更新缓存 eq_rs_change = True update_time = now elif now > eq_rs_cache.get('update_time', baseTime) + ten_minutes: # 如果当前时间大于缓存时间10分钟则更新 eq_rs_change = True update_time = now + mgroup_sort_trigger = True else: update_time = eq_rs_cache.get('update_time', baseTime) cache.set(f"equipment_{equipId}", {"running_state": last_mrs, "running_state_timex": last_timex, "update_time":update_time}, timeout=None) # 更新缓存 if eq_rs_change: - ctask_run.delay("apps.em.services.shutdown_or_startup", equipId, last_timex, last_mrs) + ctask_run.delay("apps.em.services.shutdown_or_startup", equipId, last_timex, last_mrs, mgroup_sort_trigger) -def shutdown_or_startup(equipId: str, last_timex: datetime, last_mrs, note: str = ""): +def shutdown_or_startup(equipId: str, last_timex: datetime, last_mrs, note: str = "", mgroup_sort_trigger: bool = False): """ last_mrs 设备运行状态值 """ @@ -70,6 +75,8 @@ def shutdown_or_startup(equipId: str, last_timex: datetime, last_mrs, note: str new_run = True if new_run is not None: + if mgroup_sort_trigger: + time.sleep(mgroup.sort) mgroup_run_change(mgroup, new_run, last_timex, note) diff --git a/apps/enm/serializers.py b/apps/enm/serializers.py index fa739a37..500006e6 100644 --- a/apps/enm/serializers.py +++ b/apps/enm/serializers.py @@ -82,8 +82,8 @@ class MpointStatSerializer(CustomModelSerializer): ep_belong_name = serializers.CharField(source="mpoint.ep_belong.name", read_only=True) mgroup_name = serializers.CharField(source="mgroup.name", read_only=True) belong_dept_name = serializers.CharField(source="mgroup.belong_dept.name", read_only=True) - sflog_start_time = serializers.CharField(source="sflog.start_time", read_only=True) - sflog_end_time = serializers.CharField(source="sflog.end_time", read_only=True) + sflog_start_time = serializers.DateTimeField(source="sflog.start_time", read_only=True) + sflog_end_time = serializers.DateTimeField(source="sflog.end_time", read_only=True) class Meta: model = MpointStat diff --git a/apps/wpm/tasks.py b/apps/wpm/tasks.py index 9dd6e657..28fa85a0 100644 --- a/apps/wpm/tasks.py +++ b/apps/wpm/tasks.py @@ -10,6 +10,8 @@ from apps.wpm.models import SfLog, StLog, SfLogExp from django.utils import timezone from django.db.models import F from apps.wpm.services import get_pcoal_heat +from django.core.cache import cache +import time @shared_task(base=CustomTask) @@ -101,16 +103,15 @@ def cal_exp_duration_sec(stlogId: str='', all=False, now: datetime=None): ret = SfLogExp.objects.filter( sflog=sflog, stlog__is_shutdown=True).aggregate(sum=Sum('duration_sec')) if ret.get('sum', 0): + get_total_sec_now(sflog.id) sflog.shut_sec = ret['sum'] sflog.save() # 更新sflog总时长 - if sflog.end_time > now: - get_total_sec_now(sflog.id) + # if stlogId: # cal_enstat('sflog', sflog.id, sflog.mgroup.id, None, None, None, # None, None, None, None, cascade=True, cal_attrs=['run_hour']) - @shared_task(base=CustomTask) def cal_enstat_when_pcoal_heat_change(year_s, month_s, day_s): from apps.enm.models import EnStat From 9f90d842448c4c3c46ee519e6c79c09a834a67ed Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 26 Sep 2024 11:02:59 +0800 Subject: [PATCH 2/8] fix: em/bug --- apps/em/services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/em/services.py b/apps/em/services.py index 857d3e98..235e32b1 100644 --- a/apps/em/services.py +++ b/apps/em/services.py @@ -42,7 +42,7 @@ def set_eq_rs(equipId, last_timex: datetime, last_mrs: int): update_time = eq_rs_cache.get('update_time', baseTime) cache.set(f"equipment_{equipId}", {"running_state": last_mrs, "running_state_timex": last_timex, "update_time":update_time}, timeout=None) # 更新缓存 if eq_rs_change: - ctask_run.delay("apps.em.services.shutdown_or_startup", equipId, last_timex, last_mrs, mgroup_sort_trigger) + ctask_run.delay("apps.em.services.shutdown_or_startup", equipId, last_timex, last_mrs, '', mgroup_sort_trigger) def shutdown_or_startup(equipId: str, last_timex: datetime, last_mrs, note: str = "", mgroup_sort_trigger: bool = False): From 9a3e15f92682f22d3c992123892fa3d26a82b717 Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 26 Sep 2024 11:51:36 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96mgroup=5Frun=5Fch?= =?UTF-8?q?ange?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/services.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/mtm/services.py b/apps/mtm/services.py index 0891e21d..218fb39b 100644 --- a/apps/mtm/services.py +++ b/apps/mtm/services.py @@ -116,12 +116,13 @@ def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime, note: """ from apps.wpm.services import get_sflog from apps.wpm.tasks import cal_exp_duration_sec - from apps.wpm.models import StLog + from apps.wpm.models import StLog, SfLogExp mgroup.is_running = new_run mgroup.save(update_fields=["is_running"]) last_stlog = StLog.objects.filter(mgroup=mgroup, is_shutdown=True).order_by("-start_time").first() # 找到最后一次停机记录 + need_cal_exp = True if last_stlog: if last_timex >= last_stlog.start_time: # 认为是有效信号 if last_stlog.end_time is None and new_run: # 从停到开 @@ -129,22 +130,29 @@ def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime, note: last_stlog.duration_sec = (last_stlog.end_time - last_stlog.start_time).total_seconds() last_stlog.save() elif last_stlog.end_time and new_run is False and last_timex > last_stlog.end_time: # 从开到停 - last_stlog, _ = StLog.objects.get_or_create( + cur_sflog = get_sflog(mgroup, last_timex) + last_stlog, is_created = StLog.objects.get_or_create( mgroup=mgroup, is_shutdown=True, start_time=last_timex, defaults={ 'title': '停机', 'end_time': None, - 'sflog': get_sflog(mgroup, last_timex), + 'sflog': cur_sflog, 'reason':note, } ) + if is_created: + SfLogExp.objects.get_or_create(stlog=last_stlog, sflog=cur_sflog) + need_cal_exp = False elif new_run is False: - last_stlog = StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=get_sflog(mgroup, last_timex), reason = note) + cur_sflog = get_sflog(mgroup, last_timex) + last_stlog = StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=cur_sflog, reason = note) mgroup.is_running = False mgroup.save() - if last_stlog: + SfLogExp.objects.get_or_create(stlog=last_stlog, sflog=cur_sflog) + need_cal_exp = False + if last_stlog and need_cal_exp: cal_exp_duration_sec(last_stlog.id) # 触发时间分配 def bind_routepack(ticket: Ticket, transition, new_ticket_data: dict): From 956500d3aad7b5d2dd637a887a3721440273967d Mon Sep 17 00:00:00 2001 From: zty Date: Thu, 26 Sep 2024 15:56:18 +0800 Subject: [PATCH 4/8] fix :enm/serializer round --- apps/enm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/enm/serializers.py b/apps/enm/serializers.py index 500006e6..3b1264c0 100644 --- a/apps/enm/serializers.py +++ b/apps/enm/serializers.py @@ -162,7 +162,7 @@ class EnStatSerializer(CustomModelSerializer): ret[f'{item["material_name"]}_{item["testitem_name"].replace("-", "")}_rate_pass'] = 0 else: value = item["rate_pass"] - rounded_value = round(value) if value is not None else 0 + rounded_value = round(value, 2) if value is not None else 0 formatted_value = "{:.2f}".format(rounded_value) ret[f'{item["material_name"]}_{item["testitem_name"].replace("-", "")}_rate_pass'] = formatted_value if equip_elec_data: From 9c6e8f5992955e6ae82df63db446fb6dccaa96c3 Mon Sep 17 00:00:00 2001 From: zty Date: Mon, 30 Sep 2024 16:21:18 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix:=20=E7=94=B5=E8=A1=A8=E6=B0=B4=E8=A1=A8?= =?UTF-8?q?0=E5=80=BC=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enm/services.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/enm/services.py b/apps/enm/services.py index 86fdff79..3cf70b66 100644 --- a/apps/enm/services.py +++ b/apps/enm/services.py @@ -185,7 +185,14 @@ class MpointCache: last_data = current_cache_val["last_data"] if isinstance(last_val, (int, float)): last_val = last_val*current_cache_val.get('coefficient', 1.0) - last_data["last_val"] = last_val + if (last_val == 0 and + current_cache_val.get("type", 0) == 10 and + current_cache_val.get('is_rep_ep_running_state', None) is False and + get_sysconfig('enm.use_cache_when_w_el_0', False) is True and + current_cache_val.get("material_name", "") in ["动力电", "工业水"]): # 如果电表断电 + pass + else: + last_data["last_val"] = last_val last_data["last_timex"] = last_timex last_mrs = None # 设备状态信号 mpoint_is_rep_ep_running_state = current_cache_val["is_rep_ep_running_state"] From cc5b521f5dd2da63a9f09817f8f09ff9cf17ca0b Mon Sep 17 00:00:00 2001 From: zty Date: Mon, 30 Sep 2024 16:21:44 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=E7=85=A4=E7=B2=89=E7=83=AD?= =?UTF-8?q?=E5=80=BC=E6=A0=A1=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/serializers.py | 64 +++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index dca9ef6b..1f54b89a 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -19,6 +19,8 @@ from django.core.cache import cache from django.utils.timezone import localdate from apps.qm.models import NotOkOption from apps.wf.serializers import TicketSimpleSerializer +import logging +mylogger = logging.getLogger("log") class OtherLogSerializer(CustomModelSerializer): class Meta: @@ -57,8 +59,8 @@ class StLogSerializer(CustomModelSerializer): def update(self, instance, validated_data): if instance.is_shutdown: # 停机不可编辑end_time validated_data.pop('end_time', None) - if instance.end_time: - raise ParseError('该异常已结束无需编辑') + # if instance.end_time: + # raise ParseError('该异常已结束无需编辑') with transaction.atomic(): validated_data.pop('mgroup', None) validated_data.pop('start_time', None) @@ -70,7 +72,7 @@ class StLogSerializer(CustomModelSerializer): cal_exp_duration_sec(instance.id) try: sflogexp = SfLogExp.objects.get( - stlog=instance.stlog, sflog=current_sflog) + stlog=instance, sflog=current_sflog) sflogexp.note = current_note sflogexp.save() except SfLogExp.DoesNotExist: @@ -111,36 +113,36 @@ class SfLogSerializer(CustomModelSerializer): } def update(self, instance, validated_data): - with transaction.atomic(): - old_pcoal_heat = instance.pcoal_heat - old_team = instance.team - instance: SfLog = super().update(instance, validated_data) - new_pcoal_heat = instance.pcoal_heat - new_team = instance.team - mgroup: Mgroup = instance.mgroup + old_pcoal_heat = instance.pcoal_heat + old_team = instance.team + instance: SfLog = super().update(instance, validated_data) + new_pcoal_heat = instance.pcoal_heat + new_team = instance.team + mgroup: Mgroup = instance.mgroup - # 更新煤粉热值触发计算 - if instance.mgroup == '回转窑' and instance.shift.name in ['早班', '白班']: - year_s, month_s, day_s = instance.get_ymd - if new_pcoal_heat: # 更新一下缓存 - cache.set(f'pcoal_heat_{year_s}_{month_s}_{day_s}', new_pcoal_heat) - if new_pcoal_heat != old_pcoal_heat: - cal_enstat_when_pcoal_heat_change.delay(year_s, month_s, day_s) + # 更新煤粉热值触发计算 + if instance.mgroup.name == '回转窑' and instance.shift.name in ['早班', '白班']: + mylogger.info(f'回转窑白班/早班{instance.get_ymd}更新{new_pcoal_heat}-{old_pcoal_heat}') + year_s, month_s, day_s = instance.get_ymd + if new_pcoal_heat: # 更新一下缓存 + cache.set(f'pcoal_heat_{year_s}_{month_s}_{day_s}', new_pcoal_heat, timeout=60 * 60 * 48) + if new_pcoal_heat != old_pcoal_heat: + cal_enstat_when_pcoal_heat_change.delay(year_s, month_s, day_s) - # 更新班组触发计算 - if new_team != old_team: - default_state = 'pending' - if timezone.now() > instance.end_time: - default_state = 'normal' - # 分配班组时创建人员到岗情况 - for item in TeamMember.objects.filter(team=new_team, mgroup=instance.mgroup): - AttLog.objects.get_or_create(sflog=instance, user=item.user, defaults={ - 'sflog': instance, 'user': item.user, 'post': item.post, 'state': default_state, 'create_by': self.context['request'].user}) - if mgroup.need_enm: - from apps.qm.tasks import cal_quastat_sflog - cal_enstat_when_team_change.delay(instance.id) - cal_quastat_sflog.delay(instance.id) - return instance + # 更新班组触发计算 + if new_team != old_team: + default_state = 'pending' + if timezone.now() > instance.end_time: + default_state = 'normal' + # 分配班组时创建人员到岗情况 + for item in TeamMember.objects.filter(team=new_team, mgroup=instance.mgroup): + AttLog.objects.get_or_create(sflog=instance, user=item.user, defaults={ + 'sflog': instance, 'user': item.user, 'post': item.post, 'state': default_state, 'create_by': self.context['request'].user}) + if mgroup.need_enm: + from apps.qm.tasks import cal_quastat_sflog + cal_enstat_when_team_change.delay(instance.id) + cal_quastat_sflog.delay(instance.id) + return instance def to_representation(self, instance): ret = super().to_representation(instance) From 780564f6e18f01e2839a08e63bd18b144a8820f8 Mon Sep 17 00:00:00 2001 From: zty Date: Mon, 30 Sep 2024 16:22:30 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20=E7=85=A4=E7=B2=89=E7=83=AD?= =?UTF-8?q?=E5=80=BC=E5=A4=84=E7=90=862?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wpm/services.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index a85f9c46..1f85a113 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -17,6 +17,8 @@ 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 +import logging +myLogger = logging.getLogger('log') def generate_new_batch(old_batch: str, mlog: Mlog): new_batch = old_batch @@ -97,11 +99,16 @@ def get_pcoal_heat(year_s: int, month_s: int, day_s: int): qs = SfLog.objects.get(work_date__year=year_s, work_date__month=month_s, work_date__day=day_s, mgroup__name='回转窑', shift__name__in=['白班', '早班']) # hardcode if qs.pcoal_heat is None or qs.pcoal_heat <=0: - qs.pcoal_heat = 6000 + s = SfLog.objects.filter(pcoal_heat__isnull=False).order_by('-start_time').first() + if s: + qs.pcoal_heat = s.pcoal_heat + else: + qs.pcoal_heat = 6000 qs.save(update_fields=['pcoal_heat']) - cache.set(f'pcoal_heat_{year_s}_{month_s}_{day_s}', qs.pcoal_heat) + cache.set(key, qs.pcoal_heat, timeout=60 * 60 * 48) return qs.pcoal_heat - except Exception: + except Exception as e: + myLogger.error(f'获取煤粉热值失败,{e}', exc_info=True) return 6000 From 924d7f2b61aff917ccf60f3f40565655a9163d9c Mon Sep 17 00:00:00 2001 From: zty Date: Mon, 30 Sep 2024 17:05:43 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=E7=99=BE=E5=BA=A6=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ecm/service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/ecm/service.py b/apps/ecm/service.py index c85e5592..f7c981f9 100644 --- a/apps/ecm/service.py +++ b/apps/ecm/service.py @@ -159,8 +159,9 @@ def save_voice_and_speak(event: Event): if event.voice: # 如果已经生成了报警声音不用再请求 pass else: - _, event.voice, _ = generate_voice(event.voice_msg, v_p) - event.save() + if getattr(settings, 'BD_SP_ENABLED', False): + _, event.voice, _ = generate_voice(event.voice_msg, v_p) + event.save() if main_cate.speaker_on: sps = [] if event.area: # 如果事件存在发生区域