您现在的位置是: 网站首页 >Django >Django轮班排班管理系统 Django

【Schedule轮班排班】07.值班推迟功能

admin2018年11月28日 15:22 Django | Html | JavaScript | Python 1258人已围观

Django轮班排班管理系统简介 基于内部业务需求,某些岗位需要进行工作日值班以及周六值班, 如果每次手动去制作Excel排班表,确实比较费时间,就考虑自动化生成的方式去做。 没有什么技术含量,可以了解下循环生成数据方法。我也没找到相关的代码参考,个人写的很烂,仅供参考。 环境要求:Django2.x.x

已经排好班后,临时某一天比如提前下班等,这天值班就取消,进行推迟 ## 创建推迟逻辑处理 这儿将获取上次值班人员独立出来作为一个函数使用,前面排班也可以使用 这个推迟和排版类似,只是开始日期+1天 ```python def get_last_time_duty(duty_type, this_date): """ 获取上次值班人员 :param duty_type:值班类型 :param this_date: 止于该日期的上次 :return: """ last_duty_name = '' # 得到该类值班且值班成员不空的数据,在给定日期之前,按照日期倒序(新的在前面) all_previous_duty = Schedule.objects.filter(duty_type=duty_type, date__lt=this_date).exclude(Q(staff__isnull=True) & Q(staff='')).order_by('-date') for previous_duty in all_previous_duty: # 日期最新的在前 # print(previous_duty) if Employee.objects.filter(name=previous_duty.staff, available=True): last_duty_name = previous_duty.staff # 获取值班表名字在成员中的一个,获取到后停止 break return last_duty_name class DelayOnceDuty(View): def get(self, request): # 获取推迟的这一天的日期 delay_date_str = request.GET.get('delay_date') yy, mm, dd = delay_date_str.split('-') delay_date = datetime.date(int(yy), int(mm), int(dd)) today = datetime.date.today() # 带时间的日期 # 开始日期就是要推迟这天的下一天,结束日期为排班表的最后 start_date = delay_date + datetime.timedelta(days=1) end_date = Schedule.objects.order_by('-date').first().date # 排班结束日期 # 获取要推迟这天的值班类型,然后得到这天之前的值班人员 delay_date_schedule = Schedule.objects.get(date=delay_date) if Schedule.objects.filter(date=delay_date, staff__isnull=False) and delay_date >= today: last_duty_name = get_last_time_duty(duty_type=delay_date_schedule.duty_type, this_date=delay_date) print('推迟日期之前的值班人员:', last_duty_name, ',值班类型为:', delay_date_schedule.get_duty_type_display()) # 将值班表中的值班人员置空,保存 delay_date_schedule.staff = '' delay_date_schedule.real_staff = '推迟' delay_date_schedule.save() generate_duty_data(last_duty_name=last_duty_name, duty_type=delay_date_schedule.duty_type, start_date=start_date, end_date=end_date) return redirect(reverse('duty:schedule')) ``` ## 推迟功能url ```python from .views import DelayOnceDuty urlpatterns = [ path('schedule/delay/once/', permission_required('usercenter.permission_user_manage', raise_exception=True)(DelayOnceDuty.as_view()), name='delay_once') ] ``` ## 首页添加推迟按钮 修改schedule-index.html模板,在操作这一列增加 ```html <td class="text-center"> {% if schedule.staff and schedule.date >= today %} <a class="btn btn-primary btn-xs" title="推迟一次值班,会自动覆盖后面的变动" href="{% url 'duty:delay_once' %}?delay_date={{ schedule.date|date:'Y-m-d' }}">推迟</a> {% endif %} </td> ``` ![BLOG_20181128_153711_72](/media/blog/images/2018/11/BLOG_20181128_153711_72.png "博客图集BLOG_20181128_153711_72.png") 点击推迟 ![BLOG_20181128_153734_97](/media/blog/images/2018/11/BLOG_20181128_153734_97.png "博客图集BLOG_20181128_153734_97.png")

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行2076天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:256 篇
  • 文章评论:60 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站