react 日历组件_自动排班算法的设计与实现(日历算法)

de6483765a1590601ede1d9fab443933.png

你好,我是燕云长风。

寓意:结合李白著名的边塞诗《关山月》取【燕云长风】—— 长风几万里,吹度玉门关。

写这篇文章之前,酝酿了很久,希望把自己之前遇到的问题及解决方案分享给大家。

那年深秋,我接到了一个开发任务——XXX市公安交通智能化管控系统的排班管理系统。

最终我选择了angular技术栈来实践,天下武功,唯快不破。

为了大家更加直观了解,我截了几张运行效果图:

9036c33d666ca9af72b6f0f37f478881.png
这是排班主页面

225768988db0108ea1f919c376364b5a.png
点击自动排班进入人员选择页面

fcbfce2e5fb7a763b6751c26c9bb4405.png
点击确定后生成的人员信息

好了,话不多说,我们直接看核心需求(干货)

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-manage​gitee.com
2951a7eb89739af51194df266809e00f.png

这是giteepage的在线演示地址,即时访问

DutyManage​yanyunchangfeng.gitee.io

我的个人博客:

https://yanyunchangfeng.github.io​yanyunchangfeng.github.io
aef845832819e09684611947f6dc5dc4.png

我参与的开源项目 :

1. NiceFish-React

damoqiongqiu/NiceFish-React​github.com
205a29422936ff78a4a58e7c80c97cfc.png

NiceFish-React 是React版的实现,和 NiceFish Angular 版本保持风格一致。采用React Hooks 16.8.3 版本,使用TypeScript、Ant Design组件库以及Bootstrap v4.2.1 开发。 ( 7 ☆)

2. NiceFish

大漠穷秋/NiceFish​m.gitee.com
2c89a01a7718a0e5b37b8c6d13b679e7.png

美人鱼,这是一个微型Blog系统,前端基于Angular7.0 + PrimeNG7.1.0。(GVIP 码云最有价值的开源项目 3160 ☆)

3. OpenWMS-Frontend

大漠穷秋/OpenWMS-Frontend​m.gitee.com
2c89a01a7718a0e5b37b8c6d13b679e7.png

OpenWMS项目前端基于 Angular 7.0 + PrimeNG 7.1.0。 (已推荐 199 ☆)

我的社交主页:

燕云长风github

https://github.com/yanyunchangfeng​github.com

今天的分享就到这里,祝大家顺利,工作愉快,天天开心。

长风几万里,吹度玉门关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动表使用说明 1、在设置好年份与表头。 "2、每年1月1日,在中按一个周期设置好人员名单,将自动生成全年表,   第一行就是1月1日上人员,如使用该表时不是1月1日,可以通过调整中   的次序来获得之后日期的正确表。单元格内的多行人员代表当天几个   (如三行就是早中晚),当天增加一个,就在人员单元格内按[Alt-Enter]换行。" 3、在表中,请自行增加本年的节日,假日会以红底黑字增亮显示 4、在中设置好次与工时。 5、在中可以自动统计每人每月或全年的工作量 "6、对于不规则情况的,如换,可以在当月人员名单中手动更改,另外,如果每天   的次大于三个,会出现单元格显示不下的情况,这时可以用快捷键来修改字体大小。" "7、快捷键:   Ctrl-q 所有表保护状态,只有人员显示栏可以更改   Ctrl-e 取消所有表的保护状态,所有栏都可编辑   Ctrl-r 所有表人员名称字体加大   Ctrl-t 所有表人员名称字体减小 Ctrl-p 下打印表 Alt-F4 退出EXECL" "8、注意事项:理论上没有限制,但由于单元格显示宽高度有限(字体太小影响显示效果),       本表建议适用一个最多三人,一天最多四个(四行)的情况,不符合       该条件的可以使用《表(考勤版)》解决。"

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值