您现在的位置是: 网站首页 >Django >Django轮班排班管理系统 Django
【Schedule轮班排班】05.生成日期数据表
admin2018年11月28日 14:43 【Django | Html | JavaScript | Python 】 1611人已围观
Django轮班排班管理系统简介 基于内部业务需求,某些岗位需要进行工作日值班以及周六值班, 如果每次手动去制作Excel排班表,确实比较费时间,就考虑自动化生成的方式去做。 没有什么技术含量,可以了解下循环生成数据方法。我也没找到相关的代码参考,个人写的很烂,仅供参考。 环境要求:Django2.x.x
http://127.0.0.1:8000/duty/generate/date/ ![BLOG_20181128_134557_42](/media/blog/images/2018/11/BLOG_20181128_134557_42.png "博客图集BLOG_20181128_134557_42.png") ## 创建输入日期模板 ```html {% extends 'base-duty.html' %} {% load static %} {% load duty_template_tags %} {% block css %} <link href="{% static 'hAdmin/css/plugins/datapicker/datepicker3.css' %}" rel="stylesheet"> {% endblock %} {% block title %}{{ block.super }} - 生成日期{% endblock %} {% block breadcrumb %} <li> <a href="/">主页</a> </li> <li> <strong>生成日期</strong> </li> {% endblock %} {% block content %} <div class="ibox float-e-margins"> <div class="ibox-title"> <h5>根据法定工作日·休息日生成日期数据</h5> </div> <div class="ibox-content"> <p>若修改了法定修改日,重新提交即可刷新从今天(复选框取消) / 本月第一天(复选框勾选)开始到填写月份的工作值班数据。</p> <p>上次已生成到:{{ last_date.date }}</p> <form method="post" autocomplete="off"> <div class="form-group" id="choose_date_month"> <label>选择月份</label> <div class="input-group date"> <span class="input-group-addon"><i class="fa fa-calendar"></i></span> <input type="text" class="form-control" name="to_one_month" placeholder="填入大于等于本月的值,例如2020.12,如果填写错误将使用默认到这个月底"> <span class="input-group-addon" title="不勾选从今天开始生成数据,勾选将从本月1号开始生成数据"> <input type="checkbox" name="start_flag"> </span> </div> </div> {% csrf_token %} <div class="form-group"> <button class="btn btn-primary" type="submit">开始生成</button> </div> </form> </div> </div> {% endblock %} {% block js %} <script src="{% static 'hAdmin/js/plugins/datapicker/bootstrap-datepicker.js' %}"></script> <script> $('#choose_date_month .input-group.date').datepicker({ language: "zh-CN", minViewMode: 1, keyboardNavigation: false, forceParse: false, autoclose: true, todayHighlight: true, startDate: "{% if last_date %}{{ last_date.date }}{% else %}{{ today }}{% endif %}", format: "yyyy-mm", }); </script> {% endblock %} ``` 使用了一个日期选择器 ![BLOG_20181128_145148_81](/media/blog/images/2018/11/BLOG_20181128_145148_81.png "博客图集BLOG_20181128_145148_81.png") 只能选择大于今天的月份 ![BLOG_20181128_145217_29](/media/blog/images/2018/11/BLOG_20181128_145217_29.png "博客图集BLOG_20181128_145217_29.png") ## 日期生成视图 分析: - 获取提交的日期 - 如果输入为空或者输入错误,则使用本月的月份 - 如果输入正确,则使用输入的月份 - 判断是否勾选标识,如果勾选了复选框,从本月1号开始生成,否则从今天开始生成 - 判断工作日,和法定工作日(休息日变工作日的) - 判断休息日,和法定休息日(工作日变休息日的) - 遍历填充数据,设置`duty_type`字段 - 对于存在的对象则更新,并将值班信息置空,对于不存在的对象则进行创建 ```python class GenerateDateInfo(View): """ 根据法定工作日·休息日生成数据 """ def get(self, request): last_date = Schedule.objects.order_by('-date').first() today = datetime.date.today() return render(request, 'create-date.html', locals()) def post(self, request): today = datetime.date.today() y, m = today.year, today.month # 如果没有获得日期,则使用今天日期的年月 today_date = '{}-{}'.format(y, m) to_one_month = request.POST.get('to_one_month', today_date) # 2018-11 # print(to_one_month.split('-')) try: y, m = int(to_one_month.split('-')[0]), int(to_one_month.split('-')[1]) if y not in range(today.year, int(today.year) + 2) or m not in range(1, 13) or (y == today.year and m in range(1, today.month + 1)): # 年不在近2年,或者月不在1-12月,或者在今年,但日期在1-本月,则就使用本月的日期 y, m = today.year, today.month except: y, m = today.year, today.month print('日期止于 %s 年 %s 月' % (str(y), str(m))) first_day, day_nums = calendar.monthrange(int(y), int(m)) weekday = {1: '星期一', 2: '星期二', 3: '星期三', 4: '星期四', 5: '星期五', 6: '星期六', 7: '星期日'} # print('选择月份第一天:', weekday[first_day + 1]) # print('本月一共 %s 天' % str(day_nums)) # 根据开始标识生成,勾选后就本月1号创建,默认不勾选,从今天开始创建 start_flag = request.POST.get('start_flag') if start_flag: start_date = datetime.date(today.year, today.month, 1) # 从本月1号开始创建 else: start_date = today end_date = datetime.date(int(y), int(m), calendar.monthrange(int(y), int(m))[1]) days = (end_date - start_date).days + 1 # print(start_date, end_date) print('从{}到结束日期一共{}天'.format(start_date, days)) # 遍历这个区间的所有日期 this_date = start_date while this_date <= end_date: # print(this_date, type(this_date), '周内' if this_date.isoweekday() < 6 else '周末') # 判断工作日,和法定工作日(休息日变工作日的) if (this_date.isoweekday() <= 5 and not LegalDay.objects.filter(date=this_date, legal_type=0)) or LegalDay.objects.filter(date=this_date, legal_type=1): # print('工作日:', this_date) if Schedule.objects.filter(date=this_date): # 如果存在当前日期数据,就进行更新 schedule = Schedule.objects.get(date=this_date) schedule.is_workday = True schedule.duty_type = 1 schedule.staff = '' # 更新时清空值班人员 schedule.real_staff = '' schedule.save() else: Schedule.objects.create( date=this_date, is_workday=True, duty_type=1 ) # 判断休息日,和法定休息日(工作日变休息日的) elif (this_date.isoweekday() >= 6 and not LegalDay.objects.filter(date=this_date, legal_type=1)) or LegalDay.objects.filter(date=this_date, legal_type=0): # print('休息日:', this_date) if Schedule.objects.filter(date=this_date): # 存在即更新更新 schedule = Schedule.objects.get(date=this_date) schedule.staff = '' # 更新时清空值班人员 schedule.real_staff = '' else: # 不存在即创建对象 schedule = Schedule() schedule.date = this_date schedule.is_workday = False if this_date.isoweekday() == 6 and not LegalDay.objects.filter(date=this_date): # 为周六,且不在法定工作日和法定休息日中,就要加班了,调休半天(坑) schedule.duty_type = 2 else: # 真正休息的时候 schedule.duty_type = 0 schedule.save() this_date += datetime.timedelta(days=1) return redirect(reverse('duty:create_date')) ``` ## 日期生成路由 ```python from .views import GenerateDateInfo urlpatterns = [ path('generate/date/', permission_required('usercenter.permission_user_manage', raise_exception=True)(GenerateDateInfo.as_view()), name='create_date'), # 生成日期数据 ] ``` ![BLOG_20181128_145848_20](/media/blog/images/2018/11/BLOG_20181128_145848_20.png "博客图集BLOG_20181128_145848_20.png") 点击开始生成 然后访问 http://127.0.0.1:8000/duty/schedule/ 就会看到已生成的数据 ![BLOG_20181128_145941_19](/media/blog/images/2018/11/BLOG_20181128_145941_19.png "博客图集BLOG_20181128_145941_19.png")
很赞哦! (0)
相关文章
文章交流
- emoji
当前用户
未登录,点击 登录专题目录
猜你喜欢
-
【K8s+Docker技术全解】10.Master主控节点服务-部署kube-scheduler、检查集群状态
-
【Vue+DRF生鲜电商】05.商品列表序列化普通方法
-
【CRM客户关系管理】22.action功能开发,执行action功能,添加默认的delete action
-
【K8s+Docker技术全解】09.Master主控节点服务-部署controller-manager
-
Django Signals(信号)实现推送链接到百度资源搜索平台
-
【Django在线教育平台】19.个人中心显示我的课程、收藏、消息页面
-
【Django在线教育平台】04.模板配置,完成用户登录相关页面和逻辑
-
【ntp】Linux & Windows时间服务器NTP配置