[李景山php]简单的PHP 任务分配系统

<?php
/**
 * Created by PhpStorm.
 * User: ziniu
 * Date: 2016/9/21
 * Time: 10:58
 */
//

/**
 * 任务描述:
 *   小白一家有五口人,分别是爸爸、妈妈、哥哥、姐姐,
 *   每天要执行的家庭任务分别是拖地、洗碗、买菜,其中,洗碗每天要做两次,
 *   而买菜又必须是爸爸或者妈妈才能购买!
 *   小白学习了编程,小白的爸爸要求小白用程序安排一个工作计划表,尽量做到
 *   每个人的任务相对均衡,以周为单位即可!
 *
 * 任务分析:
 * 问题1:对于只能父母执行的任务,如“买菜”,就是类似于级别问题
 *       需要给相应的人给提升到相应的级别!
 * 问题2:对于“洗碗”这样需要每天执行两次的任务,我们可以直接复制出来一份
 *       就类似于两个“洗碗”任务,每个任务每天仅执行一次,就可以了。
 * 问题3:对于“买菜”类高级任务,需要给任务加上对应执行的级别要求。
 *
 * 特别说明:
 *      本案例为了能最大化的展示基础阶段的知识点,暂时没有做代码及结构优化!
 */
// 第一步:1.1 代码化 家庭成员 初始化 单独定义
$father     = "爸爸";
$mother     = "妈妈";
$brother    = "哥哥";
$sister     = "姐姐";
$myself     = "小白";
// 第一步:1.2 组合家庭成员为数组,成为一个整体,方便编程操作
$family = array(
    $father,
    $mother,
    $brother,
    $sister,
    $myself
);
//第二步:2.1 代码化 任务 初始化 单独任务
$mission1 = "拖地";// 每天一次。
$mission2 = "洗碗";// 每天两次。
$mission3 = "买菜";// 只能父母去买。
//第二步:2.2 组合成为任务组合 成为一个整体,方便任务操作
$missions = array(
    $mission1,
    $mission2,
    $mission3
);

/**
 * 说明:因为每个任务每天执行的次数不一样,所以根据任务的执行次数
 *      重新设置任务数组为带执行次数的二维数组。
 * @param $missions
 * @return array
 */
function setTimes($missions){
    $missionsTmp = [];
    foreach($missions as $v){
        switch($v){
            case "洗碗";
                $missionsTmp[] = ['time'=>2,'name'=>$v];
                break;
            default:
                $missionsTmp[] = ['time'=>1,'name'=>$v];
                break;
        }
    }
    return $missionsTmp;
}
$missions = setTimes($missions);// 执行函数 获取新的任务数组

/**
 * 说明:根据设置的二维数组中每个对应的任务次数不同,转换成为不同的
 *      一维数组
 * @param $missions
 * @return array
 */
function getNewMissions($missions){
    $Temp = [];
    foreach($missions as $k => $v){
        $Temp = array_merge($Temp,array_pad([$v['name']],$v['time'],$v['name']));
    }
    return $Temp;
}
$missions = getNewMissions($missions);

/**
 * 说明:根据任务要求设置对应的任务跟人的执行权限。
 * @param $family
 * @param $missions
 * @return array
 */
function setLevel($family,$missions){
    // 设置成员级别
    $levelParent = 10;
    $levelOther = 1;
    // 设置任务需要级别
    $levelMissionEasy = 1;
    $levelMissionHard = 8;
    // 遍历家庭成员
    foreach($family as $k_f => $v_f){
        $defaultLevel = $levelOther;
        switch($v_f){// switch 方式 获取 设置的等级值
            case "爸爸":
                $defaultLevel = $levelParent;
                break;
            case "妈妈":
                $defaultLevel = $levelParent;
                break;
        }
        $family[$k_f] = ['personName'=>$v_f,'personLevel'=>$defaultLevel];// 设置新数据
    }
    // 遍历任务
    foreach($missions as $k_m => $v_m){
        $defaultMissionLevel = $levelMissionEasy;// 设置默认级别
        // if else 方式
        if($v_m == "买菜"){
            $defaultMissionLevel = $levelMissionHard;
        }
        $missions[$k_m] = ['missionName'=>$v_m,'missionLevel'=>$defaultMissionLevel];// 设置新数据
    }
    return ['family'=>$family,'mission'=>$missions];// 返回数据
}
$data = setLevel($family,$missions);
// 截至到目前位置,全部的“人员”跟“任务”的准备工作都完成了
// 接下来的需要执行的就是,按照一周7天,进行任务分配了。

/**
 * 说明:任务分配主程序,传入“人员”跟“任务”,返回对应排序结果。
 * @param array $data
 * @return array
 */
function makeMission(array $data){
    // 初始化数据
    $missionTable = [];// 任务排表
    $family = $data['family'];// 家庭成员
    $mission = $data['mission'];// 任务清单
    // 因为会根据每人每周的执行任务的次数,在这个次数里面选择最少的,所以需要初始化成员执行任务的次数。
    foreach($family as $k => $v){
        $v['personTimes'] = 0;
        $family[$k] = $v;
    }
    // 如果计划安排 7天的工作任务 执行 7天循环
    for($i = 1; $i <= 7; $i++){
        // 打印提示字符串
        echo "********************************************************<br />";
        echo "选择进行分配第{$i}天任务:<br />";
        echo "********************************************************<br />";
        $temp = [];// 初始化 返回结果 数组
        foreach($mission as $k => $v){// 循环保证到每个任务都可以分配到人
            // 打印提示字符串
            echo "####################任务分配开始######################<br />";
            echo "--进行第《{$i}》天第《".($k+1)."》个任务《{$v['missionName']}》任务分配:<br />";
            // 获取最适合的人选,通过分步获取适合候选人,及最小任务的人的方式实现。
            $tmp = array(
                'missionName' => $v['missionName'],
                'personName'  => getFamilyName($family,$v)
            );
            // 对被选中的人,执行操作任务累加操作
            foreach($family as $k_f => $v_f ){
                if($v_f['personName']==$tmp['personName']){
                    $family[$k_f]['personTimes']++;
                }
            }
            $temp[] = $tmp;// 任务分配完成,存入临时数据仓库,代表一个任务分配完成。
            // 打印提示字符串
            echo "任务分配给了{$tmp['personName']}<br />";
            echo "####################任务分配结束######################<br />";
            echo "<br /><br />";
        }
        $missionTable[] = $temp;// 代表一天的任务分配完成。
    }// 代表一周的任务分配完成。
    return $missionTable;// 返回数据
}

/**
 * 说明:根据任务的级别,选择可以执行任务的候选人。
 * @param $family
 * @param $mission
 * @return mixed
 */
function getFamilyName($family,$mission){
    $tmp = [];// 符合任务标准的人的存储仓库
    foreach($family as $k => $v){
        if($v['personLevel'] >= $mission['missionLevel']){
            $tmp[] = $v;
        }
    }
    // 将适合的人按照执行任务从小到大的次数进行排序
    $person = null;//初始化 排序列表
    $person = oderBy($tmp);
    return $person[0]['personName'];// 返回最小任务执行次数的人的名字
}

/**
 * 说明:根据人员名单,找到目前任务最少的那个人。就是多维数组排序问题
 * @param $family
 * @return mixed
 */
function oderBy($family){
    $sort = array(
        'direction' => 'SORT_ASC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
        'field'     => 'personTimes',//排序字段
    );// 存储 选项
    $arrSort = array();
    foreach($family AS $uniqid => $row){// 调整 排序字符串
        foreach($row AS $key=>$value){
            $arrSort[$key][$uniqid] = $value;
        }
    }
    if($sort['direction']){// 如果具有排序规则
        array_multisort($arrSort[$sort['field']], constant($sort['direction']), $family);
    }// 执行排序处理
    return $family;
}
// 格式化显示最终结果
echo "<pre />";
var_dump(makeMission($data));
taskPHP taskPHP基于php开发的定时计划任务框架,利用多进程实现任务的分配和运行,利用内存共享实现进程间通信,支持多线程模式需要安装pthreads扩展(可选),支持linux和windows。有较好的伸缩性、扩展性、健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。   框架概况 框架目录结构: taskPHP 根目录 |-- core 框架系统目录 | |-- lib 框架核心文件目录 | | |-- .... 众多的框架核心类库文件 | |-- guide.php 框架引导文件 | |-- distribute_listen.php 任务派发进程入口 | |-- worker_listen.php 任务执行进程入口 |-- docs 开发文档存放目录 |-- logs 日志目录 |-- tasks 用户任务目录 | |-- demo demo任务 | | |-- Lib demo任务的扩展目录 | | |-- demoTask.php demo任务类文件 | | |-- config.php demo任务配置文件 | | ... 更多任务 | |-- config.php 全局配置文件 |-- main.php 框架入口文件 |-- windows_single.cmd windows快速启动文件 框架说明 linux下子进程执行任务,修改脚本无需重启后台服务立即生效,windows下修改任务脚本后需重启后台脚本 但往系统添加执行不受影响。 框架支持多线程模式,需要安装pthreads扩展(可选)。 使用内存共享实现进程通信,堵塞式消息队列,整个框架的运行无需第三方扩展。 任务派发及具体任务执行不在同个进程[distribute_listen.php]和[worker_listen.php],windows和linux下启用入口文件[main.php],windows下可运行[windows_single.cmd]快速启动。 执行时间语法跟crontab类似,且支持秒设置。 添加任务简单,只需继承Task基类,实现任务入口run方法。 环境要求 php版本>= 5.5 开启shmop 注意事项 由于任务存在派发时间,所以任务运行的时间可能会有1-2秒的误差。 windows下执行任务在循环里,编写任务有问题或调用exit将导致后台脚本停止,linux下无此问题。 建议生产部署在linux下运行多进程模式,因为运行在多线程模式运行一段时间后报错,pthreads has detected that the core\lib\Pthread could not be started, the system lacks the necessary resources or the system-imposed limit would be exceeded in xxx 文档列表 -->数据库类使用教程 支持(Mysql,Mongo,Oracle,Pgsql,Sqlsrv,Sqllite) -->windows下安装php多线程扩展pthreads教程 -->工具类Utils使用说明 -->http请求客户端类Client使用说明 使用说明 时间配置格式说明: * * * * * * * //格式 :秒 分 时 天 月 年 周 10 * * * * * * //表示每一分钟的第10秒运行 /10 * * * * * * //表示每10秒运行 /1 * 15,16 * * * * //表示 每天的15点,16点的每一秒运行 系统命令说明: main.php [start] 启动 可不带参数 main.php close 结束 main.php reload 重新加载任务 main.php delete demo 删除任务 main.php select 查看任务列表 main.php exec demo 运行任务 主要用于任务开发中调试单个任务 全局配置文件规范 标签:taskphp  计划任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值