10 líneas de código para implementar una aplicación de recordatorio de servicio

10 líneas de código para implementar una aplicación de recordatorio de servicio

Foto 1

En el trabajo, a menudo nos encontramos con escenarios de aplicaciones en los que los miembros del equipo deben ser programados y recordados cuando estén de servicio. Aunque hay algunas aplicaciones listas para usar que se pueden usar, es tedioso de usar para los programadores y puede que no sea flexible.

Entonces, ¿cómo creamos una aplicación simple de programación y recordatorios de servicio?imagen 2

Considere un caso simple donde se hacen las siguientes suposiciones sobre las restricciones:

  • La secuencia de turnos es fija, una vez determinada no se modificará
  • Cada persona está de servicio por un tiempo fijo, por ejemplo: cada persona está de servicio por una semana

Los requisitos se asumen de la siguiente manera:

  • En el momento adecuado, recuérdele a la persona de servicio el tiempo de servicio
  • Recordar a la persona de servicio y predecir la próxima persona de servicio

Las restricciones y requisitos se traducen en código de la siguiente manera:


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}
""")
复制代码

¿Cómo usar el programa para calcular quién debería estar de servicio en el momento actual?

Aquí se utilizan cálculos matemáticos simples: división de enteros, operación de resto

Divida la diferencia de tiempo entre la hora actual y la hora de inicio de la primera persona en servicio por 7 días para saber cuántas semanas han pasado, y luego tome el resto del número de personas en servicio para obtener el número de la persona en servicio. que debería estar de servicio en este momento.

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]
复制代码

¿Cómo calcular el rango de tiempo de servicio?

Esto implica cálculos de fecha simples, utilizando la biblioteca de fecha y hora.

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)]
复制代码

Estas 10 líneas de código son el núcleo de toda la aplicación.

El código completo de la aplicación es el siguiente:

#!/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)
复制代码

El efecto es el siguiente:Foto 1

Aquí hay una pregunta de reflexión para los lectores, bienvenidos a intercambiar en el área de comentarios.

  • ¿Cómo realizar la función de cambio de turno temporal?
  • Llame a API de terceros para implementar, como recordatorios de cuentas oficiales, recordatorios de SMS, etc.

Si cree que el artículo es útil para usted, puede seguir la cuenta pública de WeChat: Small and Beautiful Practical Python para obtener más artículos nuevos.

Supongo que te gusta

Origin juejin.im/post/7079930918894305294
Recomendado
Clasificación