10 lignes de code pour implémenter une application de rappel de devoir

10 lignes de code pour implémenter une application de rappel de devoir

Image 1

Au travail, nous rencontrons souvent des scénarios d'application où les membres de l'équipe doivent être programmés et rappelés au travail. Bien qu'il existe des applications prêtes à l'emploi qui peuvent être utilisées, elles sont fastidieuses à utiliser pour les programmeurs et peuvent ne pas être flexibles.

Alors, comment créer une application simple de planification et de rappel de service ?image 2

Considérons un cas simple où les hypothèses suivantes sont faites sur les contraintes :

  • La séquence de service est fixe, une fois déterminée, elle ne sera pas modifiée
  • Chaque personne est de service pour un temps fixe, par exemple : chaque personne est de service pendant une semaine

Les exigences sont supposées comme suit :

  • Au bon moment, rappelez à la personne de service l'heure de service
  • Rappeler la personne en service et prédire la prochaine personne en service

Les contraintes et les exigences sont traduites en code comme suit :


on_duty_list = ['孙悟空', '沙和尚', '猪八戒', '白龙马'] # 值班人列表
on_duty_period_in_days = 7 # 每人值一周
notify_days = [1, 5] # 假设值班第一天提醒一次,第5天再提醒一次
# 第一个值班人值班开始时间
on_duty_first_person = '孙悟空'
on_duty_first_day = '2022-03-24 00:00:00'
# 提醒消息模板
notify_template = Template(r"""
【===========报警值班提醒========】
【本周值班人】${on_duty_person_this_week}
【值班时间】 ${on_duty_range}
【下周值班人】${on_duty_person_next_week}
""")
复制代码

Comment utiliser le programme pour calculer qui devrait être de service à l'heure actuelle ?

Des calculs mathématiques simples sont utilisés ici : division entière, opération de reste

Divisez la différence de temps entre l'heure actuelle et l'heure de début de la première personne en service par 7 jours pour obtenir le nombre de semaines écoulées, puis prenez le reste du nombre de personnes en service pour obtenir le numéro de la personne en service qui devrait être en service à l'heure actuelle.

def WhoIsOnDuty(timeTs = int(time.time())):
    ref_timeTs = UnixTimeFromDate(on_duty_first_day)
    deltaTs = timeTs - ref_timeTs
    deltaDay = deltaTs / oneDayTs
    index = deltaDay / on_duty_period_in_days % len(on_duty_list)
    return on_duty_list[index]
复制代码

Comment calculer la plage de temps de service?

Cela implique des calculs de date simples, en utilisant la bibliothèque datetime

def WhoIsOnDuty(timeTs = int(time.time())):
    ref_timeTs = UnixTimeFromDate(on_duty_first_day)
    deltaTs = timeTs - ref_timeTs
    deltaDay = deltaTs / oneDayTs
    index = deltaDay / on_duty_period_in_days % len(on_duty_list)
    day_index = deltaDay % on_duty_period_in_days
    ts = time.localtime(timeTs)
    start_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = -day_index))
    end_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = - day_index + on_duty_period_in_days - 1))
    return on_duty_list[index], day_index + 1, start_day, end_day, on_duty_list[(index+1)%len(on_duty_list)]
复制代码

Ces 10 lignes de code sont au cœur de toute l'application.

Le code complet de l'application est le suivant :

#!/usr/bin/env python
# coding: utf-8

import time
from string import Template
import datetime

on_duty_list = ['孙悟空', '沙和尚', '猪八戒', '白龙马']
on_duty_period_in_days = 7 # day
notify_days = [1, 5]
on_duty_first_person = '孙悟空'
on_duty_first_day = '2022-03-24 10:00:00'
oneDayTs = 24 * 60 * 60

notify_template = Template(r"""
【===========报警值班提醒========】
【本周值班人】${on_duty_person_this_week}
【值班时间】 ${on_duty_range}
【下周值班人】${on_duty_person_next_week}
""")

def SendMessage(message='test'):
    print message

def PairListToMessage(pair_list):
    conent_arr = []
    for k, v in pair_list:
        conent_arr.append(' '.join(['【' + k + '】', v]))
    return '\n'.join(conent_arr)

def UnixTimeFromDate(time_str, format='%Y-%m-%d %H:%M:%S'):
    # 先转换为时间数组
    timeArray = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    # 转换为时间戳
    timeStamp = int(time.mktime(timeArray))
    return timeStamp

def DatetimeStr(timeTs, format='%Y-%m-%d %H:%M:%S'):
    return time.strftime(format, time.localtime(timeTs))

def WhoIsOnDuty(timeTs = int(time.time())):
    ref_timeTs = UnixTimeFromDate(on_duty_first_day)
    deltaTs = timeTs - ref_timeTs
    deltaDay = deltaTs / oneDayTs
    index = deltaDay / on_duty_period_in_days % len(on_duty_list)
    day_index = deltaDay % on_duty_period_in_days
    ts = time.localtime(timeTs)
    start_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = -day_index))
    end_day = str(datetime.date(ts.tm_year, ts.tm_mon, ts.tm_mday) + datetime.timedelta(days = - day_index + on_duty_period_in_days - 1))
    return on_duty_list[index], day_index + 1, start_day, end_day, on_duty_list[(index+1)%len(on_duty_list)]


# 周四、每周一提醒本周值班人员,下周值班人员
notify_counter = 0
on_duty_person_this_week = ''
While True:
    timeTs = int(time.time())
    timeStr = DatetimeStr(timeTs)
    on_duty_person, day, start_day, end_day, on_duty_person_next = WhoIsOnDuty(timeTs)
    if on_duty_person != on_duty_person_this_week:
        on_duty_person_this_week = on_duty_person
        notify_counter = 0
        SendMessage(notify_template.safe_substitute({
            'on_duty_person_this_week': on_duty_person,
            'on_duty_person_next_week': on_duty_person_next,
            'on_duty_range': '~'.join([start_day, end_day]),
        }))
        notify_counter += 1
    else:
        if notify_counter < 2 and day in notify_days:
            SendMessage(notify_template.safe_substitute({
                'on_duty_person_this_week': on_duty_person,
                'on_duty_person_next_week': on_duty_person_next,
                'on_duty_range': '~'.join([start_day, end_day]),
            }))
            notify_counter += 1
    time.sleep(1)
复制代码

L'effet est le suivant :Image 1

Voici une question de réflexion pour les lecteurs, bienvenue pour échanger dans la zone de commentaires.

  • Comment réaliser la fonction de quart de travail temporaire?
  • Appelez des API tierces à mettre en œuvre, telles que des rappels de compte officiels, des rappels par SMS, etc.

Si vous pensez que l'article vous est utile, vous pouvez suivre le compte public WeChat : Small and Beautiful Practical Python pour obtenir plus d'articles frais.

Je suppose que tu aimes

Origine juejin.im/post/7079930918894305294
conseillé
Classement