# 10行代码实现一个值班提醒应用

10行代码实现一个值班提醒应用

[En]

So, how do we hand-do a simple application of duty scheduling and reminders?

[En]

Consider a simple situation and make the following assumptions about constraints:

• 职责令是固定的，一旦确定就不会修改。
[En]

the duty order is fixed and will not be modified once it is determined.*

• 每个人都是固定时间轮班，例如，每个人相当于一周
[En]

each person is on a fixed-time shift, for example, each person is worth one week*

• 适时提醒值班人员值班
[En]

remind the person on duty of the duty at the right time*

• 提醒值班人员，并通知下一名值班人员
[En]

remind the person on duty and give notice of the next person on duty*

[En]

The constraints and requirements are translated into the code as follows:


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} """)  如何使用该程序计算当前应由谁值班？ [En] How to use the program to calculate which person should be on duty at the current time? 这里使用简单的数学计算：整数除法和余数运算。 [En] Simple mathematical calculations are used here: integral division and remainder operations. 将当前时间与第一个值班人员开始值班时间的时间差除以7天，得到经过了几周的时间，再取总值班人数的余额，得到当前值班人数。 [En] The time difference between the current time and the start time of the first person on duty is divided by 7 days to get how many weeks have passed, and then take the balance of the total number of people on duty to get the current number of people on duty. 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]  值班时间范围如何计算？ [En] How to calculate the duty time range? 这里涉及到简单的日期计算，使用了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)]  这10行代码，是整个应用的核心。 整个应用代码如下： #!/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
index = deltaDay / on_duty_period_in_days % len(on_duty_list)
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)


[En]

Here is a thinking question for readers. You are welcome to communicate in the comment area.

• 如何实现临时换班功能？
[En]

how to realize the function of temporary shift transfer?
• 调用第三方API实现如公众号提醒、短信提醒等

Original: https://www.cnblogs.com/jianxinjun/p/16073971.html
Author: 简信君
Title: 10行代码实现一个值班提醒应用

(0)

### 大家都在看

• #### OpenCV笔记整理【pyplot模块】

1. 介绍： Matplotlib 是 Python 的绘图库，是一个非常强大的 Python 画图工具，可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画…

Python 2023年9月7日
097
• #### python能处理csv文件吗_python处理csv文件非常慢

因此,我尝试打开一个csv文件,读取它的字段,并基于此修复其他一些字段,然后将数据保存回csv。我的问题是csv文件有200万行。最好的方法是什么来加快速度。 csv文件包括 ID…

Python 2023年8月22日
098
• #### TypeError: Cannot interpret ‘＜attribute ‘dtype‘ of ‘numpy.generic‘ objects＞‘ as a data type

### 回答1： 这是一个错误消息，表明无法将 ‘< attribute ‘ dtype‘ of ‘ numpy. gener…

Python 2023年8月24日
0118
• #### scrapy框架爬虫

一、什么是scrapy？ Scrapy，Python开发的一个快速、高层次的屏幕抓取和web抓取框架，用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛，可以用于数…

Python 2023年5月24日
099
• #### Django讲课笔记10：使用QuerySet删除和查询数据表

文章目录 零、本讲学习目标 一、课程导入 二、新课讲授 * （一）删除数据 – 1、删除全部数据：all()与delete() 2、删除一行数据：get()与delet…

Python 2023年8月5日
0124
• #### Django 总结

（一） 模板的语法：{{}}==变量 {% %}==标签 {# #}==注释 |==过滤器 模板中的标签：if for else HTML中的标签：h1,p,h2,b等 orm：o…

Python 2023年8月4日
097
• #### （三） 使用Pandas进行数据分析 – 新增（修改）数据列

在进行数据分析时，经常需要按照一定条件创建新的数据列，然后进行进一步分析。 这里介绍四种方法： 直接赋值 df.apply方法 df.assign方法 按条件选择分组分别赋值 直接…

Python 2023年8月7日
0109

前言 基础描述 从 k8s 1.24开始，dockershim已经从kubelet中移除，但因为历史问题docker却不支持kubernetes主推的CRI（容器运行时接口）标准，…

Python 2023年10月10日
0106
• #### Python—-异常处理、断言和路径处理，简单、清晰版

1.路径处理 1.找模块：sys.path import sys print(sys.path) – 1.理解 – 1.是python去查找包或模块 – 2.项目开始根…

Python 2023年11月2日
072
• #### pygame 小游戏前的准备工作要做足

本系列专栏将通过不断编写游戏的方式，带你夯实 Python 知识。 这篇博客的目的 本文继续为你补充 pygame 中的一些小知识点，后面开始写一个知名案例，较于其他博客，本篇博客…

Python 2023年9月21日
088
• #### docker部署常用服务器(redis,nginx,mysql,tomcat)

docker部署服务器 * – docker部署redis – docker部署nginx – docker部署mysql – do…

Python 2023年11月5日
088
• #### python3教程：默认参数为列表

定义一个函数，传入一个list,添加一个end再返回 def add_end(L=[]): L.append(‘END’) return L 正常调用时，结果似乎是好的 [En] …

Python 2023年5月23日
0117
• #### 【PyTorch教程】pytorch入门系列 ——土堆教程的目录及索引

抵扣说明： 1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。 Original: https://blo…

Python 2023年8月2日
0127
• #### 深度学习计算广告（更新中）

本文转自王喆的《深度学习计算广告》，仅用于学习。 文章目录 一、计算广告系统简介 二、经典的广告系统架构 三、dl时代广告系统各模块技术演进 * 1. Ad Ranking &#8…

Python 2023年10月27日
097
• #### 【数据分析】基于RFM模型的线上零售中的客户细分（二）：RFM模型实战

基于RFM模型的线上零售中的客户细分（二） 摘要：在上一篇博客《基于RFM模型的线上零售中的客户细分（一）：客户细分》中，我们了解了什么是客户细分，这篇博客将会结合具体的商业实例介…

Python 2023年8月17日
0139
• #### 科研小白-day1（Linux系统安装miniconda，利用conda下载fastqc等）

什么是conda？ Conda 是一个开源的软件包管理系统和环境管理系统，用于安装多个版本的软件包及其依赖关系，并在它们之间轻松切换。我的理解是conda是一个类似于应用市场的AP…

Python 2023年9月7日
0139