python 自动生成一整月的排班表

用户头像
openbytes
关注
发布于: 2020 年 08 月 20 日
python自动生成一整月的排班表

此脚本适合排班逻辑单一的需求.我们现在是三个人,每一天一人一轮换.没有太复杂的逻辑.比如我要生成下个月的排班表.我现在去数据库里面读取前一天是谁值班,获取到这个人之后,在预先的人员列表里面进行循环写入到数据库就可以了.很简单的一个脚本.有很多不足,还希望各位看官多多指出不足的地方.



下面进入正题.直接贴脚本(不知道为什么 ,对于脚本型的解释性语言,我更愿意称之为脚本,而不是代码.想哭......)



# coding=utf8
import datetime
import pymysql
import calendar
'''创建连接'''
db_config = {
"host": '192.168.1.1',
"port": 3306,
"user": 'root',
"passwd": '123456',
"db": 'test',
"charset": 'utf8'
}
conn = pymysql.connect(
host='192.168.1.1',
port=3306,
user='root',
passwd='123456',
db='test',
charset='utf8'
)
phone_info = {
"张三": "13128888888",
"李四": "13228888888",
"王五": "13328888888"
}
duty_people_info = ['张三', '李四', '王五']
weekdays = {0: "星期一", 1: "星期二", 2: "星期三", 3: "星期四", 4: "星期五", 5: "星期六", 6: "星期天"}
def duty_yestoday():
""":arg
昨天值班的人
"""
cursor = conn.cursor()
cursor.execute(
"select * from duty_dutytable where duty_day='{0}'".format(datetime.date.today() + datetime.timedelta(days=-1)))
res = cursor.fetchone()
return res[3]
# 这里没有使用到这个函数.可以忽略这个判断闰年的方法.以后说不定哪里可以用的着呢
def leap_year():
"""
判断是否为闰年
:return:
"""
current_year = datetime.datetime.now().year
try:
datetime.datetime.strptime("{}-02-29".format(current_year), "%Y-%m-%d")
return True
except:
return False
def nums_of_days():
"当月有几天"
year = datetime.datetime.now().year
month = datetime.datetime.now().month
return calendar.monthrange(year, month)[1]
def left_days():
"""执行脚本当前的日期距离月底剩余的天数"""
year = datetime.datetime.now().year
month = datetime.datetime.now().month
day = datetime.datetime.now().day
end = nums_of_days()
current_date = f"{year}-{month}-{day}"
end_date = f"{year}-{month}-{end}"
format_start_date = datetime.datetime.strptime(current_date, "%Y-%m-%d")
format_end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
return (format_end_date - format_start_date).days + 1
def main():
cursor = conn.cursor()
for i in range(left_days()):
# 今天的日期: datetime.date.today()
# 距离今天几天的日期: datetime.date.today() + datetime.timedelta(days=+i)
today = datetime.date.today() + datetime.timedelta(days=+i) # 当天日期
if not duty_yestoday():
# 当天值班的人
current_duty_people = duty_people_info[
(duty_people_info.index(duty_yestoday()) + 1 + i) % len(duty_people_info)]
# 当天值班是周几
current_duty_weekday = weekdays[datetime.date.weekday(today)]
SQL = "insert into duty_dutytable (duty_day,duty_week_day,duty_people,phone) values ('{0}','{1}','{2}','{3}')".format(
today, current_duty_weekday, current_duty_people, phone_info[current_duty_people])
print(today, current_duty_people, phone_info[current_duty_people])
cursor.execute(SQL) # 执行sql
conn.commit() # 提交事务
else:
raise TypeError("duty_yesterday()方法数据返回为空,请检查数据是否正确")
cursor.close() # 游标关闭
conn.close() # 连接关闭
if __name__ == '__main__':
print(main())

脚本其实很简单,唯一有点绕的就是用了一个取余的方法去循环.这个也是在<程序员数学>这本书里面偶然翻到的.循环最好的办法就是取余.

附上数据库的建表语句

CREATE TABLE `duty_dutytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`duty_day` date NOT NULL,
`duty_week_day` varchar(10) NOT NULL,
`duty_people` varchar(50) NOT NULL,
`phone` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `duty_day` (`duty_day`)
) ENGINE=InnoDB AUTO_INCREMENT=452 DEFAULT CHARSET=utf8;

本文完....



用户头像

openbytes

关注

大龄运维狗 2020.08.19 加入

今天比昨天好,这不是希望嘛

评论

发布
暂无评论
python自动生成一整月的排班表