简单的员工轮换值班表

按周循环排班, 员工人数及每日值班人数可自定义.

<?php
class Schedule {
	public $dayNumArr; // 每周中各天的值班人数,从周日(索引为0)到周六(索引为6)为一个循环周
	public $employeeCount; // 定义员工人数
	private $currEmployeeNum = 1; // 当前员工编号
	
	/**
	 *
	 * @param unknown $employeeCount        	
	 * @param unknown $dayNumArr
	 *        	每周各天所需人数的数组
	 */
	function __construct($employeeCount, $dayNumArr) {
		$this->employeeCount = $employeeCount;
		$this->dayNumArr = $dayNumArr;
	}
	
	/**
	 * 获得当天值班的员工名单
	 * @param unknown $day 星期
	 */
	function getEmployees($day) {
		$result = "";
		for($i = 1; $i <= $this->dayNumArr [$day]; $i ++) {
			$result = $result . " ; " . $this->getAEmloyee ();
		}
		return $result;
	}
	
	/**
	 * 从员工队列里\数据库中取出一个
	 * @return string
	 */
	function getAEmloyee() {
		if ($this->currEmployeeNum > $this->employeeCount) {
			$this->currEmployeeNum = 1;
		}
		$result = "员工" . $this->currEmployeeNum;
		$this->currEmployeeNum ++;
		return $result;
	}
	
	/**
	 * 生成某月值班表
	 * @param unknown $month
	 * @param number $year
	 * @return string
	 */
	function monthChange($month, $year = 2014) {
		// 某月的天数
		$days = cal_days_in_month ( CAL_GREGORIAN, $month, $year );
		// 一周中的一天,初始化为当月第一天的星期起始数
		$aWeekDay = intval ( date ( "w", strtotime ( date ( "Y-n-1" ) ) ) );
		$schedule = "";
		for($i = 1; $i <= $days; $i ++) {
			if ($aWeekDay == 6) {
				$aWeekDay = 0;
			} else {
				$aWeekDay ++;
			}
			$employee = $this->getEmployees ( $aWeekDay );
			$str = sprintf("%d-%s-%d(星期%s),值班员工:%s", $year, $month, $i, $this->weekFormat ($aWeekDay), $employee);
			$schedule = $schedule . "\n" . $str;
		}
		return $schedule;
	}
	/**
	 * 把0-6装换为星期的日-六
	 * @param unknown $index
	 * @return string
	 */
	function weekFormat($index) {
		switch ($index) {
			case 0 :
				$xingqi = "日";
				break;
			case 1 :
				$xingqi = "一";
				break;
			case 2 :
				$xingqi = "二";
				break;
			case 3 :
				$xingqi = "三";
				break;
			case 4 :
				$xingqi = "四";
				break;
			case 5 :
				$xingqi = "五";
				break;
			case 6 :
				$xingqi = "六";
				break;
			default :
				echo "获取不到星期,有错误!";
		}
		return $xingqi;
	}
}

运行实例:

$weekArr = array (
		0 => 0,
		1 => 1,
		2 => 1,
		3 => 1,
		4 => 1,
		5 => 1,
		6 => 2 
);

$employeeCount = 13;
$currEmployee = 1; // 从第1个员工开始
$s = new Schedule ( 13, $weekArr );
echo $s->monthChange ( 11, 2014 );

排班结果:

2014-11-1(星期日),值班员工:

2014-11-2(星期一),值班员工: ; 员工1

2014-11-3(星期二),值班员工: ; 员工2

2014-11-4(星期三),值班员工: ; 员工3

2014-11-5(星期四),值班员工: ; 员工4

2014-11-6(星期五),值班员工: ; 员工5

2014-11-7(星期六),值班员工: ; 员工6 ; 员工7

2014-11-8(星期日),值班员工:

2014-11-9(星期一),值班员工: ; 员工8

。。。

转载于:https://my.oschina.net/freegeek/blog/350487

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值