10 líneas de código para implementar una aplicación de recordatorio de servicio
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?
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:
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.