当前位置: 首页 > news >正文

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 星期五 -> [张三, 李四] [春节]
http://www.rkmt.cn/news/114725.html

相关文章:

  • 如何利用动环监控系统提升数据中心的能效与安全性?
  • 二维数组案例:石头迷阵游戏,对象(类)
  • Docker Buildx镜像优化实战(高效压缩与多平台构建双突破)
  • 【智能Agent监控实战】:Docker环境下告警系统搭建全攻略
  • 【AI模型Docker更新实战指南】:掌握高效自动化部署的5大核心步骤
  • 备份不踩坑,Agent服务Docker化后的4大恢复难题全解析
  • 2025 年 12 月电机控制与电源管理芯片厂家权威推荐榜:驱动芯片/微控制器/智能功率模块/稳压器,尖端集成方案与高效能技术深度解析 - 品牌企业推荐师(官方)
  • 【云原生Agent资源调度实战】:Docker环境下高效分配CPU与内存的5大黄金法则
  • 基于Java web的旅游景区票务保险酒店线路管理系统的设计与实现
  • 增长有毒?流血三闯港股!希迪智驾带病叩钟:115亿市值撑得住“白条狂欢”吗?
  • 为什么顶级AI团队都在用Docker网络隔离保护多模态Agent?真相揭晓
  • 从零到上线:Docker中配置LangGraph Agent必须掌握的7个关键技术点
  • 高职440505智慧建筑运维管理专业产教协同育人解决方案
  • Docker与Vercel AI SDK版本适配难题,一次性彻底解决(稀缺方案曝光)
  • 2025 年 12 月小青柑普洱茶叶权威推荐榜:匠心柑普融合,品味陈醇回甘的东方茶韵之选 - 品牌企业推荐师(官方)
  • 量子计算镜像参数调优紧急指南:避免系统崩溃的6个要点
  • 【专家亲授】智能Agent在Docker监控中的5大核心应用场景
  • 《60天AI学习计划启动 | Day 27: Function Calling 工具设计最佳实践》
  • Docker-LangGraph Agent多实例部署方案(生产环境可用架构曝光)
  • 从入门到精通:Docker Buildx镜像压缩全流程技术解密
  • 为什么你的Agent服务总被干扰?揭秘Docker环境隔离失败的6大根源
  • 参数设置决定成败,量子计算镜像运行效率提升90%的秘密
  • Docker容器性能突降?智能Agent快速定位与自动告警策略
  • 查找二叉树(tree_a)(信息学奥赛一本通- P1367)
  • 02 相向双指针
  • Blender建筑建模终极指南:building_tools插件快速上手
  • 2025年成都桥架厂家权威推荐榜单:锌铝镁桥架/201不锈钢桥架/工地不锈钢桥架源头厂家精选 - 品牌推荐官
  • 扫描频率决定安全性?,深度解析Docker Scout自动扫描机制与风险盲区
  • OOP-实验6
  • 医疗和教育行业自动化、精准匹配、易掌握的数据分类分级最佳实践与案例