你好,我是燕云长风。
寓意:结合李白著名的边塞诗《关山月》取【燕云长风】—— 长风几万里,吹度玉门关。
写这篇文章之前,酝酿了很久,希望把自己之前遇到的问题及解决方案分享给大家。
那年深秋,我接到了一个开发任务——XXX市公安交通智能化管控系统的排班管理系统。
最终我选择了angular技术栈来实践,天下武功,唯快不破。
为了大家更加直观了解,我截了几张运行效果图:

这是排班主页面

点击自动排班进入人员选择页面

点击确定后生成的人员信息
好了,话不多说,我们直接看核心需求(干货)
1.自定义前端日历UI组件库(日历算法)
2.实现自动排班算法(自己设计实现自动排班算法)
日历算法的实现:
前置知识:
我们知道一个月最多跨6周,即6*7格式
本月第一天 : fistDay : new Date(year, month–1 , 1)
本月最后一天: lastDay: new Date(year, month, 0) 下月的第0天即本月最后一天
上月最后一天: lastDayofLastMonth : new Date(year, month–1 ,0) 本月第0天即上月最后一天
了解了这些知识后,下面我们开始上代码,编写日历算法:
/**
* [getMonthData 计算日历的方法]
* @param {number} year [年]
* @param {number} month [月]
* @return {DateRet[]} [返回的日历数据]
*/
export interface DateRet {
year: number;
month: number;
date: number;
showDate: number;
}
const getMonthData = (year?:number , month?:number):DateRet[] => {
//定义ret变量用来保存最后的结果集
let ret: any[] = [];
if( !year || !month){
let date = new Date();
year = date.getFullYear();
month = date.getMonth()+1; //月份修正
}
//获取当前月的第一天,用于计算上月预留天数
let firstDayOfMonth = new Date(year, month-1, 1);
let preMonthDay = firstDayOfMonth.getDay();
//获取上月的最后一天,本月第0天即为上月最后一天
let lastDayOfLastMonth = new Date(year, month-1, 0);
let lastDateOfLastMonth = lastDayOfLastMonth.getDate();
//获取本月最后一天,下月第0天即为本月最后一天
let lastDayOfMonth = new Date(year, month, 0);
let lastDateOfMonth = lastDayOfMonth.getDate();
for(let i = 0; i < 6*7; i++){
// 获取当前排序的日期数,+1是为了修正
let thisYear:number = year ,
thisMonth:number = month,
date:number = i+1-preMonthDay,
showDate:number = date;
if(date <= 0){
//如果date小于等于0,则说明是上月预留天数,月和日都要加以修正
thisMonth -= 1;
showDate = date + lastDateOfLastMonth;
}else if(date > lastDateOfMonth){
//如果date大于本月最后一天说明为下月预留天数,月和日加以修正
thisMonth += 1;
showDate = date - lastDateOfMonth;
}
// 修正年月,因为当月份为1时,上月减1为0,需要同时修正月和年
// 当月份为12时,下月加1为13,需要同时修正年和月
if(thisMonth === 13) {thisMonth = 1 , thisYear += 1}
if(thisMonth === 0) {thisMonth = 12 , thisYear -= 1}
ret.push({
thisYear,
thisMonth,
date,
showDate
})
}
return ret
}
export default getMonthData
有日历算法作为基础,我们就开始设计自动排班算法了,因为自动排班算法是基于日历算法设计的
处长每日预排班两人算法
const test = ['test1','test2','test3','test4','test5'];
// 待排班人员
let days = 31;本月共计天数
let preUsernum = 2 ;每天排班两人
let totalNum= days * preUsernum 总人数
let planUser = new Array(totalNum)
let num=3;//从第几个开始排
for(let i = 0;i < totalNum; i++){
if (num < test.length){
planUser[i] = test[num++]
}else{
num = 0;
planUser[i] = test[num++]
}
}
for(let i = 1; i <= days; i++){
console.log (planUser[(i – 1) * 2], planUser[i * 2 – 1])
//依次取出 planUser数组中下标(0 1),( 2 3 )... 实现两人自动排班算法
}如果你需要更全面的代码,请访问
燕云长风/duty-managegitee.com/yanyunchangfeng/duty-manage
这是giteepage的在线演示地址,即时访问
DutyManageyanyunchangfeng.gitee.io/duty-manage
系列项目 :
1. NiceFish-React
damoqiongqiu/NiceFish-Reactgithub.com/damoqiongqiu/NiceFish-React
NiceFish-React 是 NiceFish 的 React 版本,基于React 18.0.0 ,使用 Antd、Inversify、 定制版 Bootstrap开发。
2. NiceFish
大漠穷秋/NiceFishgitee.com/mumu-osc/NiceFish
美人鱼,这是一个系列项目,目标是示范前后端分离的开发模式:前端浏览器、移动端、Electron 环境中的各种开发模式。后端有两个版本:SpringBoot 版本和 SpringCloud 版本。
3. OpenWMS-Frontend
大漠穷秋/OpenWMS-Frontendgitee.com/mumu-osc/OpenWMS-Frontend
OpenWMS用来示范管理后台型系统的最佳实践。
社交主页:
燕云长风github
https://github.com/yanyunchangfenggithub.com/yanyunchangfeng
今天的分享就到这里,祝大家顺利,工作愉快,天天开心。
长风几万里,吹度玉门关。
原网址: 访问
创建于: 2025-12-21 21:48:21
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论