python 自动生成一整月的排班表
发布于: 2020 年 08 月 20 日
此脚本适合排班逻辑单一的需求.我们现在是三个人,每一天一人一轮换.没有太复杂的逻辑.比如我要生成下个月的排班表.我现在去数据库里面读取前一天是谁值班,获取到这个人之后,在预先的人员列表里面进行循环写入到数据库就可以了.很简单的一个脚本.有很多不足,还希望各位看官多多指出不足的地方.
下面进入正题.直接贴脚本(不知道为什么 ,对于脚本型的解释性语言,我更愿意称之为脚本,而不是代码.想哭......)
# coding=utf8import datetimeimport pymysqlimport 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 Falsedef 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 + 1def 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;
本文完....
划线
评论
复制
发布于: 2020 年 08 月 20 日 阅读数: 97
openbytes
关注
大龄运维狗 2020.08.19 加入
今天比昨天好,这不是希望嘛
评论