在很多日程管理软件中,日程的安排是以具体的日期来定的。但是在本日程管理中日程信息其实存储的是未来日程安排的日期规则。比如隔1个月循环执行一次,在下个月第三周的周一上午进行执行。那么我们就要把这个规则存储起来。
同时,当用户制定计划的时候会给计划一个开始结束的周期,比如2021年1月1日到2022年3月1日。我们就要根据这个规则生成满足条件的所有时间信息,然后再根据这些时间来安排每一天需要执行的日程任务。
所以这里一定要区分的概念是日程日期生成规则和日程任务对应的日期时间。波波在开发这个功能的时候也是被绕进去了好久。废话不多说。本篇笔记主要是将前端页面POST提交的信息,生成JSON保存在数据库中。
- /**
- * 设备保养Model
- * Class KeepfitModel
- * @package app\admin\controller
- * @author wubo <[email protected]>
- * @date 2021/02/2 16:00
- */
- class KeepfitModel extends Model{
- public $table = "SystemKeepfit";
- /*
- * 日程转Json
- * @param $arr array 日程计划
- * @return String
- */
- public function sch2Json($arr){
- $data = "";
- switch ($arr['type']){
- case 'year':
- $data = json_encode($this->year_arr($arr));
- break;
- case 'month':
- $data = json_encode($this->month_arr($arr));
- break;
- case 'week':
- $data = json_encode($this->week_arr($arr));
- break;
- default:
- //day and hour type in this case;
- $data = json_encode(['type'=>$arr['type'],'gap'=>$arr['gap'],'begin_time'=>$arr['begin_time'],'title'=>"每隔".$arr['gap'].strtoupper(mb_substr($arr['type'],0,1))."重复,执行时间".$arr['begin_time']]);
- }
- return $data;
- }
- private function year_arr($data){
- $arr = [];
- if($data['cycle_type'] == "week"){
- foreach (['type','cycle_type','gap','month','week','weekday','begin_time'] as $key){
- $arr[$key] = $data[$key];
- }
- $arr['title'] = "在".$data['month']."月份第".$data['week']."周".week_trans($data['weekday'])."隔".$data['gap']."年执行";
- }
- if ($data['cycle_type'] == "month"){
- foreach (['type','cycle_type','gap','month','day','begin_time'] as $key){
- $arr[$key] = $data[$key];
- }
- $arr['title'] = "在".$data['month']."月份第".$data['day']."天".$data['begin_time']."执行,隔".$data['gap']."年重复";
- }
- return $arr;
- }
- private function month_arr($data){
- $arr = [];
- if($data['cycle_type'] == "week"){
- foreach (['type','cycle_type','gap','week','weekday','begin_time'] as $key){
- $arr[$key] = $data[$key];
- }
- $arr['title'] = "每".$data['gap']."月重复,第".$data['week'].week_trans($data['weekday']).$data['begin_time']."执行";
- }
- if ($data['cycle_type'] == "day"){
- foreach (['type','cycle_type','gap','day','begin_time'] as $key){
- $arr[$key] = $data[$key];
- }
- $arr['title'] = "每".$data['gap']."月重复,第".$data['day']."天".$data['begin_time']."执行";
- }
- return $arr;
- }
- private function week_arr($data){
- $arr = ['type'=>"week",'gap'=>$data['gap'],'begin_time'=>$data['begin_time']];
- $title = [];
- foreach ($data['cweek'] as $key=>$value){
- if($value == "on"){
- $arr['week'][$key] = 1;
- }
- $title[] = week_trans($key);
- }
- $arr['title'] = implode(",",$title)."每隔".$data['gap']."周".$data['begin_time']."执行";
- return $arr;
- }
- }
上述代码波波写在了Model层,使用时需要实例化。关于前端页面可参考笔记《PHP日程计划管理功能之设置页面(2)》。
截至到本篇笔记结束,关于日程日期的计算、页面组合以及数据的存储基本上就写完了。剩余的工作就是开发定时器。来定时对生成的任务进行提醒,以及日程计划是否执行完成,执行进度的定时更改。
最后祝大家2021年新年快乐!!!