news 2026/4/16 11:10:02

Java 批量生成值班表(Rota)示例 —— 支持节假日、周末补班、月底双人值班

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 批量生成值班表(Rota)示例 —— 支持节假日、周末补班、月底双人值班

Java 值班排班算法 Demo(纯内存模拟,无数据库|真实节假日)

本示例基于2025 年中国 1 月真实法定节假日安排


一、2025 年 1 月真实节假日说明(重要)

根据国务院公布的节假日安排(以示例简化):

日期说明
2025-01-01元旦(休息)
2025-01-26周日补班
2025-01-28 ~ 01-31春节(休息)

⚠️ 注意:

  • 01-31(星期五)虽然是工作日,但因春节属于法定节假日,应值班
  • 月底双人值班只能发生在“本来就需要值班的日期”

二、模拟实体类(不变)

1️⃣ Rota

classRota{LocalDatedate;List<String>users;Stringweek;StringholidayType;// 0-普通 1-节假日 2-补班Stringremark;@OverridepublicStringtoString(){returndate+" "+week+" -> "+users+" ["+remark+"]";}}

2️⃣ Holidays

classHolidays{LocalDatedate;Stringname;booleanoffDay;// true=休息 false=补班Holidays(LocalDatedate,Stringname,booleanoffDay){this.date=date;this.name=name;this.offDay=offDay;}}

三、修正后的核心排班方法(关键修改点已标注)

publicstaticList<Rota>batchInsertRota(LocalDatestartDate,LocalDateendDate,List<String>employees,booleantwoDutyAtMonthEnd,List<Holidays>holidaysList){Set<LocalDate>holidayDates=holidaysList.stream().filter(h->h.offDay).map(h->h.date).collect(Collectors.toSet());Set<LocalDate>weekendWorkDates=holidaysList.stream().filter(h->!h.offDay).map(h->h.date).collect(Collectors.toSet());Map<String,LocalDate>lastDuty=newHashMap<>();employees.forEach(e->lastDuty.put(e,startDate.minusDays(1)));List<String>dutyQueue=newArrayList<>(employees);List<Rota>result=newArrayList<>();LocalDatecurrent=startDate;while(!current.isAfter(endDate)){LocalDatelastDayOfMonth=current.with(TemporalAdjusters.lastDayOfMonth());booleanisWeekend=current.getDayOfWeek()==DayOfWeek.SATURDAY||current.getDayOfWeek()==DayOfWeek.SUNDAY;booleanisHoliday=holidayDates.contains(current);booleanisWeekendWork=weekendWorkDates.contains(current);// 是否“本来就需要值班”booleanneedDutyDay=(isWeekend||isHoliday)&&!isWeekendWork;if(needDutyDay){List<String>dutyUsers=newArrayList<>();Stringuser1=Collections.min(dutyQueue,Comparator.comparing(lastDuty::get));dutyQueue.remove(user1);lastDuty.put(user1,current);dutyUsers.add(user1);// 月底双人:仅在“已是值班日”的前提下if(twoDutyAtMonthEnd&&ChronoUnit.DAYS.between(current,lastDayOfMonth)<=1&&!dutyQueue.isEmpty()){Stringuser2=Collections.min(dutyQueue,Comparator.comparing(lastDuty::get));dutyQueue.remove(user2);lastDuty.put(user2,current);dutyUsers.add(user2);}Rotarota=newRota();rota.date=current;rota.users=dutyUsers;rota.week="星期"+"一二三四五六日".charAt(current.getDayOfWeek().getValue()-1);if(isHoliday){rota.holidayType="1";rota.remark=holidaysList.stream().filter(h->h.date.equals(current)).map(h->h.name).findFirst().orElse("节假日");}else{rota.holidayType="0";rota.remark="周末";}result.add(rota);dutyQueue.addAll(dutyUsers);}current=current.plusDays(1);}returnresult;}

四、Demo 主方法(真实节假日数据)

publicstaticvoidmain(String[]args){LocalDatestart=LocalDate.of(2025,1,1);LocalDateend=LocalDate.of(2025,1,31);List<String>employees=Arrays.asList("张三","李四","王五","赵六");// 真实 2025 年 1 月节假日(示例)List<Holidays>holidays=Arrays.asList(newHolidays(LocalDate.of(2025,1,1),"元旦",true),newHolidays(LocalDate.of(2025,1,26),"春节调休补班",false),newHolidays(LocalDate.of(2025,1,28),"春节",true),newHolidays(LocalDate.of(2025,1,29),"春节",true),newHolidays(LocalDate.of(2025,1,30),"春节",true),newHolidays(LocalDate.of(2025,1,31),"春节",true));List<Rota>rotaList=batchInsertRota(start,end,employees,true,holidays);rotaList.forEach(System.out::println);}

五、最终正确 & 真实的控制台输出

2025-01-01 星期三 -> [张三] [元旦] 2025-01-04 星期六 -> [李四] [周末] 2025-01-05 星期日 -> [王五] [周末] 2025-01-11 星期六 -> [赵六] [周末] 2025-01-12 星期日 -> [张三] [周末] 2025-01-18 星期六 -> [李四] [周末] 2025-01-19 星期日 -> [王五] [周末] 2025-01-25 星期六 -> [赵六] [周末] 2025-01-28 星期二 -> [张三] [春节] 2025-01-29 星期三 -> [李四] [春节] 2025-01-30 星期四 -> [王五, 赵六] [春节] 2025-01-31 星期五 -> [张三, 李四] [春节]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:57:04

AI模型持续交付最佳实践(Docker动态更新全解析)

第一章&#xff1a;AI模型的 Docker 更新机制在持续集成与交付&#xff08;CI/CD&#xff09;流程中&#xff0c;AI模型的部署更新频繁依赖Docker容器化技术。通过封装模型、推理代码及依赖环境&#xff0c;Docker确保了跨平台一致性&#xff0c;同时简化了版本迭代过程。镜像构…

作者头像 李华
网站建设 2026/4/16 11:55:52

揭秘多模态Agent在Docker中的存储瓶颈:3种高效配置方案详解

第一章&#xff1a;多模态Agent与Docker存储的挑战 在构建现代AI驱动的应用系统中&#xff0c;多模态Agent正成为核心组件&#xff0c;它们能够处理文本、图像、音频等多种数据类型。这类Agent通常以微服务形式部署于容器化环境中&#xff0c;Docker因其轻量级和可移植性成为首…

作者头像 李华
网站建设 2026/4/16 11:54:55

【深度干货】AI模型容器化部署:从零搭建可扩展服务架构

第一章&#xff1a;AI模型容器化部署的核心挑战 在将AI模型从开发环境迁移至生产环境的过程中&#xff0c;容器化部署已成为主流实践。然而&#xff0c;尽管Docker和Kubernetes等技术提供了强大的编排能力&#xff0c;AI模型的特殊性仍带来了诸多挑战。 资源需求的动态性 AI模…

作者头像 李华
网站建设 2026/4/15 21:10:03

【边缘Agent资源监控终极指南】:Docker容器实时监控的5大核心技巧

第一章&#xff1a;边缘Agent与Docker监控的融合演进在物联网与边缘计算快速发展的背景下&#xff0c;边缘Agent作为连接终端设备与云平台的核心组件&#xff0c;正逐步承担起更复杂的运行时监控职责。随着容器化技术的普及&#xff0c;Docker成为边缘服务部署的主流方式&#…

作者头像 李华
网站建设 2026/4/16 13:42:15

Docker与Vercel AI SDK版本适配难题,一次性彻底解决(稀缺方案曝光)

第一章&#xff1a;Docker与Vercel AI SDK版本适配难题&#xff0c;一次性彻底解决&#xff08;稀缺方案曝光&#xff09;在构建基于 Vercel AI SDK 的生成式应用并部署至 Docker 环境时&#xff0c;开发者常遭遇运行时依赖冲突、SDK 版本不兼容及 Node.js 运行环境错配等问题。…

作者头像 李华