mysq1123 5 years ago
parent
commit
b7aa078daf

+ 29 - 0
IUserTaskDb.php

@@ -0,0 +1,29 @@
+<?php
+
+/// @Brief 用户任务db
+interface IUserTaskDb
+{
+    // @function 获取用户任务
+    //
+    // @param userId 用户编号
+    // @return 用户任务列表
+   function getUserTaskByUserId($userId);
+
+    // @function 获取用户信息
+    //
+    // @param userId 用户编号
+    // @return 用户任务信息
+    function getUserInfoByUserId($userId);
+
+    // @function 获取任务信息
+    //
+    // @param id 任务编号
+    // @return 任务信息
+    function getTaskInfoById($id);
+
+//    // @function 更新用户任务
+//    //
+//    // @param userTaskInfo 用户任务信息
+//    //
+//    function updateUserTask($userTaskInfo);
+}

+ 7 - 0
OutTaskPreconditionInfo.php

@@ -0,0 +1,7 @@
+<?php
+
+/// @Brief 输出任何后缀条件信息
+class OutTaskPreconditionInfo
+{
+
+}

+ 38 - 1
README.md

@@ -1,2 +1,39 @@
-# php_task
+# 任务框架
 
+#### 项目介绍
+{**以下是码云平台说明,您可以替换为您的项目简介**
+码云是开源中国推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
+无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 使用说明
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### 参与贡献
+
+1. Fork 本项目
+2. 新建 Feat_xxx 分支
+3. 提交代码
+4. 新建 Pull Request
+
+
+#### 码云特技
+
+1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
+3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
+4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
+5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 10 - 0
TaskCondtionInfo.php

@@ -0,0 +1,10 @@
+<?php
+
+/// @Brief 任务条件信息
+///
+class TaskCondtionInfo
+{
+    public $minValue;       // 最小值
+    public $maxValue;       // 最大值
+    public $equalValue;     // 等于值
+}

+ 19 - 0
TaskInfo.php

@@ -0,0 +1,19 @@
+<?php
+
+/// @Brief 任务信息
+///
+class TaskInfo
+{
+    public $id;             // 编号
+    public $precondition;   // 前置条件
+    public $postcondition;  // 后置条件
+    public $cycleTimes;     // 循环次数
+    public $stepFuns;       // 步骤函数
+    public $stepCount;      // 步骤数量
+    public $taskName;       //任务名称
+    public $taskDescription; //任务描述
+    public $prefunction;     //前置任务
+    public $postfunction;     //后置任务
+    public $stepclassname;   // 步骤函数保存文件名称
+
+}

+ 19 - 0
TaskNoticeJson.php

@@ -0,0 +1,19 @@
+<?php
+
+/// @Brief 任务通知json
+///
+class TaskNoticeJson
+{
+    public $id;          // 任务编号
+    public $stepCount;   // 步骤数
+    public $stepFunc;    // 步骤函数
+    public $stepMsg;     // 步骤消息
+    public $stepReturn;  // 步骤函返回结果
+    public $taskMsg;     // 任务消息
+    public $taskReturn;  // 任务返回结果
+    public $taskMsgType; // 任务消息类型<参考TaskStepFuncType>
+    public $stepMsgType; // 步骤消息类型
+    public $taskState;   // 任务状态
+    // todo
+
+}

+ 510 - 0
TaskOperation.php

@@ -0,0 +1,510 @@
+<?php
+
+/// @Brief 任务操作
+///
+class TaskOperation
+{
+    private $userTasks = []; // 用户任务列表
+    private $userInfo;       // 用户信息
+    private $currTaskId;     // 当前任务编号
+    private $idb;            // 用户任务db<参见IUserTaskDb>
+    private $stepCount;      // 单个任务步骤数量
+    private $runningTaskInfo;   // 正在执行的任务信息
+    private $runningTaskId;     // 正在执行的任务信息编号
+    private $runningTaskState;  // 正在执行任务的状态
+    private $taskNoticeJson;    // 任务通知json<参考TaskNoticeJson>
+    private $isCancelTask;      // 是否取消任务
+
+    private static $instance = null; // 单例
+
+    // @function 获取单例
+    //
+    // @return TaskPreconditionCompare
+    public static function getInstance(){
+        if (is_null(self::$instance)) { self::$instance =  new TaskOperation();}
+        return self::$instance;
+    }
+
+    // @function 初始函数
+    //
+    // @param userId 用户编号
+    // @param idb 数据接口<参考IUserTaskDb>
+    public function init($userId,$idb){
+        $this ->idb = $idb;
+        $this ->userInfo     = $this ->getUserInfo($userId,$idb);
+        $this ->userTasks    = $this ->getUserTasks($userId,$idb);
+        $this ->taskNoticeJson = new TaskNoticeJson();
+    }
+
+    // @function 设置是否取消任务
+    //
+    // @param isCancelTask 当前任务编号
+    public function setIsCancelTask($isCancelTask = false){
+        $this ->isCancelTask = $isCancelTask;
+    }
+
+    // @function 设置当前任务编号
+    //
+    // @param currTaskId 当前任务编号
+    public function setCurrTaskId($currTaskId = 0){
+        $this ->resetTask();
+        $this ->currTaskId = $currTaskId;
+    }
+
+    // @function 重置任务
+    //
+    private function resetTask(){
+        $this ->stepCount = 0;
+        $this ->runningTaskInfo = null;
+        $this ->runningTaskId = null;
+        $this ->runningTaskState = null;
+        $this ->isCancelTask = null;
+    }
+    // @function 检测用户任务是否完成
+    //
+    // @return 状态
+    public function checkUserTaskIsComplete(){
+        $this ->runningTaskId = $this ->currTaskId;
+        // 获取任务信息
+        $taskInfo = new TaskInfo();
+        $this ->getTaskInfoById($this ->currTaskId,$taskInfo);
+        // 转换前置条件信息
+        $taskPreconditionInfo = new TaskPreconditionInfo();
+        $this ->transformPreconditionInfo($taskInfo,$taskPreconditionInfo);
+        $taskInfo ->precondition = $taskPreconditionInfo;
+        // 转换后置条件信息
+        $taskPostcondition = new TaskPostcondition();
+        $this ->transformTaskPostcondition($taskInfo,$taskPostcondition);
+        $taskInfo ->postcondition = $taskPostcondition;
+        $this ->runningTaskInfo = $taskInfo;
+
+        // 检测用户一个任务是否完成
+        $this ->checkUserOneTaskIsComplete($this ->userInfo,
+            $taskInfo ->precondition,$taskInfo ->postcondition,$taskInfo ->postcondition);
+    }
+
+    // @function 检测用户任务是否可接
+    //
+    // @return 状态
+    public function checkTaskIsAccessible(){
+
+        // 获取用户当前任务
+        $taskInfo = new TaskInfo();
+        $this ->getTaskInfoById($this ->currTaskId,$taskInfo);
+
+        // 转换前置条件信息
+        $taskPreconditionInfo = new TaskPreconditionInfo();
+        $this ->transformPreconditionInfo($taskInfo,$taskPreconditionInfo);
+
+        $taskInfo ->precondition = $taskPreconditionInfo;
+
+        // 转换后置条件信息
+        $taskPostcondition = new TaskPostcondition();
+        $this ->transformTaskPostcondition($taskInfo,$taskPostcondition);
+        $taskInfo ->postcondition = $taskPostcondition;
+
+        // 多任务触发
+        if (!is_null($taskInfo ->precondition ->mtaskIds)
+            &&!empty($taskInfo ->precondition ->mtaskIds)){
+            $taskCount =  0;
+            foreach ($taskInfo ->precondition ->mtaskIds as $mtaskId)
+            {
+                $utaskInfo = null;
+                $utaskInfo = $this ->getUserTaskInfo($mtaskId);
+                if (TaskState::COMPLETE == $utaskInfo ->taskState){
+                    $taskCount++;
+                }
+            }
+
+            if ($taskCount == count($taskInfo ->precondition ->mtaskIds))
+                return true;
+            else
+                return null;
+        }
+        return $this ->checkOneTaskIsAccessible($this ->userInfo,
+            $taskInfo ->precondition);
+
+    }
+
+    // @function 获取任务信息
+    //
+    // @param id 任务编号
+    // @param taskInfo 任务信息<参见TaskInfo>
+    // @return 任务信息
+    private function getTaskInfoById($id,$taskInfo){
+        $dbTaskInfo = $this ->idb ->getTaskInfoById($id);
+
+        if (!empty($dbTaskInfo) && !is_null($dbTaskInfo)){
+            $taskInfo ->id = $dbTaskInfo['id'];
+            $taskInfo ->taskName = $dbTaskInfo['task_name'];
+            $taskInfo ->taskDescription = $dbTaskInfo['task_description'];
+            $taskInfo ->precondition = $dbTaskInfo['precondition'];
+            $taskInfo ->prefunction = $dbTaskInfo['prefunction'];
+            $taskInfo ->postcondition = $dbTaskInfo['postcondition'];
+            $taskInfo ->postfunction = $dbTaskInfo['postfunction'];
+            $taskInfo ->stepFuns = $dbTaskInfo['stepfunction'];
+            $taskInfo ->stepCount = $dbTaskInfo['stepcount'];
+            $taskInfo ->stepclassname = $dbTaskInfo['stepclassname'];
+        }
+        return null;
+    }
+
+    // @function 检测用户一个任务是否完成
+    //
+    // @function userInfo 用户信息<参见UserDataInfo>
+    // @function taskPreconditionInfo 用户信息<参见TaskPreconditionInfo>
+    // @function taskPostcondition 任务后缀条件<参见TaskPostcondition>
+    // @function outTaskPreconditionInfo 输出任何后缀条件信息<参见OutTaskPreconditionInfo>
+    // @return 状态
+    private function checkUserOneTaskIsComplete($userInfo,
+                                                $taskPreconditionInfo,$taskPostcondition,$outTaskPreconditionInfo){
+        // 获取用户任务信息
+        $userTaskInfo = $this ->getUserTaskInfo($this ->runningTaskId);
+
+        // 如果任务当前的步骤数大于0,那么起始步骤数等于任务当前的步骤数
+        if(!is_null($userTaskInfo ->tcurrStepCount)
+            && 0 < $userTaskInfo ->tcurrStepCount){
+            $this ->stepCount = $userTaskInfo ->tcurrStepCount;
+        }
+
+        if (is_null($userTaskInfo ->taskState))
+            return false;
+
+//        // 如果用户的正在执行的任务已完成,就更新正在执行用户的任务状态
+//        if (TaskState::COMPLETE == $this ->runningTaskState
+//            && !is_null($this ->runningTaskState)){
+//            $userTaskInfo ->taskState = $this ->runningTaskState;
+//        }
+
+        // 取消任务
+        if (true == $this ->isCancelTask
+            && !is_null($this ->isCancelTask)){
+            $userTaskInfo ->taskState = TaskState::CANCEL;
+        }
+
+        if (TaskState::COMPLETE == $userTaskInfo ->taskState){
+
+             // 任务完成
+             // out_后置条件 设置
+             // 是否激活下一个任务
+            if (!is_null($taskPostcondition ->nextTask)
+                && 0 < $taskPostcondition ->nextTask){
+                $this ->resetTask();
+                $this ->runningTaskId = $taskPostcondition ->nextTask;
+                $this ->runningTaskInfo = new TaskInfo();
+                $this ->getTaskInfoById($taskPostcondition ->nextTask,$this ->runningTaskInfo);
+                // 转换前置条件信息
+                $taskPreconditionInfo = new TaskPreconditionInfo();
+                $this ->transformPreconditionInfo($this ->runningTaskInfo,$taskPreconditionInfo);
+                $this ->runningTaskInfo ->precondition = $taskPreconditionInfo;
+                // 转换后置条件信息
+                $taskPostcondition = new TaskPostcondition();
+                $this ->transformTaskPostcondition($this ->runningTaskInfo,$taskPostcondition);
+                $this ->runningTaskInfo ->postcondition = $taskPostcondition;
+                $this ->checkUserOneTaskIsComplete($this ->userInfo,
+                    $this ->runningTaskInfo ->precondition,
+                    $this ->runningTaskInfo ->postcondition,$outTaskPreconditionInfo);
+            }
+            // 返回 out_后置条件
+        }elseif (TaskState::CANCEL == $userTaskInfo ->taskState)
+        {
+            // 任务取消
+            // 通知到前端取消成功<由客户端执行更新用户任务状态>
+            $stepFuncInfo = $this ->findCurrStepFunc($this ->stepCount);
+            $this ->taskNoticeJson ->id = $this ->runningTaskId;
+            $this ->taskNoticeJson ->stepCount = $this ->stepCount;
+            $this ->taskNoticeJson ->stepFunc = isset($stepFuncInfo['name'])?$stepFuncInfo['name']:'';
+            $this ->taskNoticeJson ->stepMsgType = isset($stepFuncInfo['type'])?$stepFuncInfo['type']:'';
+            $this ->taskNoticeJson ->stepReturn = '';
+            $this ->taskNoticeJson ->stepMsg = "你好";
+        }elseif (TaskState::CONDUCT == $userTaskInfo ->taskState){
+
+            // 任务进行
+            $stepFuncInfo = $this ->findCurrStepFunc($this ->stepCount);
+            $stepFuncResult = $this ->execTaskStepFunc($this ->runningTaskInfo ->stepclassname,$stepFuncInfo);
+
+            if (!is_bool($stepFuncResult)
+                && false != $stepFuncResult){
+                $this ->taskNoticeJson ->id = $this ->runningTaskId;
+                $this ->taskNoticeJson ->stepCount = $this ->stepCount;
+                $this ->taskNoticeJson ->stepFunc = isset($stepFuncInfo['name'])?$stepFuncInfo['name']:'';
+                $this ->taskNoticeJson ->stepMsgType = isset($stepFuncInfo['type'])?$stepFuncInfo['type']:'';
+                $this ->taskNoticeJson ->stepReturn = $stepFuncResult;
+                $this ->taskNoticeJson ->stepMsg = "你好";
+                ++$this ->stepCount;
+                // 如果任务步骤数执行完了,任务就完成了
+                if ((int)$this ->runningTaskInfo ->stepCount
+                    == $this ->stepCount){
+                    $this ->taskNoticeJson ->taskState = TaskState::COMPLETE;
+                }
+                // 通知到前端()
+            }
+        }
+    }
+
+    // @function 获取用户信息
+    //
+    // @param userId 用户编号
+    // @param idb 数据接口<参考IUserTaskDb>
+    private function getUserInfo($userId,$idb){
+        $userInfo = (new UserTaskDb()) ->getUserInfoByUserId($userId);
+        $userDataInfo = new UserDataInfo();
+        if (!empty($userInfo) && !is_null($userInfo)){
+            $this ->transformUserInfo($userInfo,$userDataInfo);
+        }
+        return $userDataInfo;
+    }
+
+    // @function 查找当前步骤函数
+    //
+    // @param step 第几步
+    // @return 步骤函数
+    private function findCurrStepFunc($step){
+        if (is_null($this ->runningTaskInfo))
+            return '';
+        if (is_null($this ->runningTaskInfo ->stepFuns) || empty($this ->runningTaskInfo ->stepFuns))
+            return '';
+
+        $this ->runningTaskInfo ->stepFuns = json_decode($this ->runningTaskInfo ->stepFuns,true);
+
+        foreach ($this ->runningTaskInfo ->stepFuns
+                 as $key => $stepFun)
+        {
+            if ($key == $step)
+                return $stepFun;
+        }
+    }
+
+    // @function 执行任务步骤函数
+    //
+    // @param stepclassname 步骤函数保存文件名称
+    // @param stepFuncInfo 步骤函数信息
+    // @return 执行结果
+    private function execTaskStepFunc($stepclassname,$stepFuncInfo)
+    {
+
+       if (is_null($stepclassname) || empty($stepclassname))
+           return false;
+
+        if (is_null($stepFuncInfo) || empty($stepFuncInfo))
+            return false;
+
+        // 如果任务步骤函数对象,不存在
+        if (!class_exists($stepclassname))
+            return false;
+
+        // 建立任务步骤函数对象反射类
+        $reflectStepFuncClass = new ReflectionClass($stepclassname);
+        // 实例化任务步骤函数对象
+        $instanceStepFuncClass  = $reflectStepFuncClass->newInstanceArgs();
+        $stepFuncName = isset($stepFuncInfo['name'])?$stepFuncInfo['name']:'';
+        // 判断步骤函数对象,函数是否存在
+        if (method_exists($stepclassname,$stepFuncName)){
+            return $instanceStepFuncClass ->$stepFuncName();
+        }
+        return false;
+    }
+
+    // @function 转换用户信息
+    //
+    // source 源
+    // target 目标<参见UserDataInfo>
+    private function transformUserInfo($source,$target){
+
+        if (isset($source['baseInfo']) && !empty($source['baseInfo'])){
+            $userBaseInfo =  new UserBaseInfo();
+            $userBaseInfo ->age = $source['baseInfo']['age'];
+            $userBaseInfo ->sex = $source['baseInfo']['sex'];
+            $userBaseInfo ->time = $source['baseInfo']['time'];
+            $userBaseInfo ->ulevel = $source['baseInfo']['ulevel'];
+            $userBaseInfo ->place = $source['baseInfo']['place'];
+            $userBaseInfo ->weather = $source['baseInfo']['weather'];
+            $userBaseInfo ->age = $source['baseInfo']['age'];
+            $target ->baseInfo = $userBaseInfo;
+        }
+
+        if (isset($source['physical']) && !empty($source['physical'])){
+            $taskPhysicalDataPInfo =  new TaskPhysicalDataPInfo();
+            $taskPhysicalDataPInfo ->isLikeSports = $source['physical']['isLikeSports'];
+            $taskPhysicalDataPInfo ->isHypertension = $source['physical']['isHypertension'];
+            $taskPhysicalDataPInfo ->isHeartAttack = $source['physical']['isHeartAttack'];
+            $taskPhysicalDataPInfo ->isAgile = $source['physical']['isAgile'];
+            $taskPhysicalDataPInfo ->isHardBody = $source['physical']['isHardBody'];
+            $target ->userPhysicalDataPInfo = $taskPhysicalDataPInfo;
+        }
+    }
+
+    // @function 检测一个任务是否可接
+    //
+    // @param userDataInfo          用户数据信息<参见UserDataInfo>
+    // @param taskPreconditionInfo  任务前置条件信息<参考TaskPreconditionInfo>
+    // @return boolean
+    private function checkOneTaskIsAccessible($userDataInfo,
+                                             $taskPreconditionInfo){
+
+        return TaskPreconditionCompare::getInstance() ->getResult($userDataInfo,
+            $taskPreconditionInfo);
+    }
+
+    // @function 获取用户任务信息
+    //
+    // @param taskId  任务编号
+    // @return 用户当前任务
+    private function getUserTaskInfo($taskId)
+    {
+
+      foreach ($this ->userTasks as $userTask)
+      {
+          if ($userTask instanceof  UserTaskInfo){
+              if ($userTask ->taskId == $taskId)
+                  return $userTask;
+          }
+
+          if (is_array($userTask)){
+              if ($userTask['id'] == $taskId)
+                  return $userTask;
+          }
+      }
+    }
+
+    // @function 获取用户任务
+    //
+    // @param userId 用户编号
+    // @param idb 数据接口<参考IUserTaskDb>
+    private function getUserTasks($userId,$idb)
+    {
+        $userTasks = [];
+        $dbUserTasks  = $idb ->getUserTaskByUserId($userId);
+        foreach ($dbUserTasks as $userTask){
+            $taskInfo = new UserTaskInfo();
+            $this ->transformTasks($userTask,$taskInfo);
+            $userTasks[] = $taskInfo;
+        }
+        return $userTasks;
+    }
+
+    // @function 获取用户任务
+    //
+    // @param dbTaskInfo 数据库任务信息
+    // @param tTaskInfo  转化的信息信息<参考UserTaskInfo>
+    private function transformTasks($dbTaskInfo,$tTaskInfo){
+        $tTaskInfo ->userId = $dbTaskInfo['user_id'];
+        $tTaskInfo ->taskId = $dbTaskInfo['task_id'];
+        $tTaskInfo ->tcurrStepfun = $dbTaskInfo['tcurr_step_fun'];
+        $tTaskInfo ->tcurrStepCount = $dbTaskInfo['tcurr_step_count'];
+        $tTaskInfo ->taskState = 0 == $dbTaskInfo['task_state']?3:$dbTaskInfo['task_state'];
+    }
+
+    // @function 转换后置条件信息
+    //
+    // @param taskInfo  任务信息                    <参考TaskInfo>
+    // @param taskPostcondition 任务后置条件信息     <参考TaskPostcondition>
+    // @return void
+    private function transformTaskPostcondition($taskInfo,$taskPostcondition){
+        if (!is_null($taskInfo)
+            && !empty($taskInfo ->postfunction)) {
+            $postfunctions = explode(',', $taskInfo->postfunction);
+            $taskPostcondition ->nextTask = current($postfunctions);
+        }
+    }
+
+    // @function 转换前置条件信息
+    //
+    // @param taskInfo  任务信息                    <参考TaskInfo>
+    // @param taskPreconditionInfo 任务前置条件信息   <参考TaskPreconditionInfo>
+    // @return void
+    private function transformPreconditionInfo($taskInfo,$taskPreconditionInfo){
+
+        if (!is_null($taskInfo)
+            && !empty($taskInfo ->precondition)){
+            $precondition = json_decode($taskInfo ->precondition,true);
+            // 转化基本数据
+            if (isset($precondition['or'])){
+
+                $taskPreconditionInfo ->age     = $this ->transformPreconditionCompare('age',$precondition['or']);
+                $taskPreconditionInfo ->sex     = $this ->transformPreconditionCompare('sex',$precondition['or']);
+                $taskPreconditionInfo ->time    = $this ->transformPreconditionCompare('time',$precondition['or']);
+                $taskPreconditionInfo ->ulevel  = $this ->transformPreconditionCompare('ulevel',$precondition['or']);
+                $taskPreconditionInfo ->place   = $this ->transformPreconditionCompare('place',$precondition['or']);
+                $taskPreconditionInfo ->weather = $this ->transformPreconditionCompare('weather',$precondition['or']);
+            }
+
+            // 转化生理信息
+            if (isset($precondition['sl'])) {
+                $taskPhysicalDataPInfo = new TaskPhysicalDataPInfo();
+                $taskPhysicalDataPInfo ->isAgile = $this ->transformPreconditionCompare('isAgile',
+                    $precondition['sl']);
+                $taskPhysicalDataPInfo ->isLikeSports = $this ->transformPreconditionCompare('isLikeSports',
+                    $precondition['sl']);
+                $taskPhysicalDataPInfo ->isHypertension = $this ->transformPreconditionCompare('isHypertension',
+                    $precondition['sl']);
+                $taskPhysicalDataPInfo ->isHeartAttack = $this ->transformPreconditionCompare('isHeartAttack',
+                    $precondition['sl']);
+                $taskPhysicalDataPInfo ->isHardBody = $this ->transformPreconditionCompare('isHardBody',
+                    $precondition['sl']);
+                $taskPreconditionInfo ->taskPhysicalDataPInfo = $taskPhysicalDataPInfo;
+            }
+
+            // 前置任务
+            if (!empty($taskInfo ->prefunction)
+                && !is_null($taskInfo ->prefunction))
+            {
+                $taskPreconditionInfo ->mtaskIds = explode(',',$taskInfo ->prefunction);
+                $taskPreconditionInfo ->mtaskIds = array_filter($taskPreconditionInfo ->mtaskIds);
+            }
+
+        }
+    }
+
+    // @function 转化前置条件比较
+    //
+    // @param name
+    // @param values
+    // @return
+    private function transformPreconditionCompare($name,$values){
+
+        if(!empty($values))
+        {
+            // 获取值类型列表
+            $valueTypes = TaskPreConditionValueType::getValueTypes();
+            foreach ($values as $value)
+            {
+//                $value = json_decode($value,true);
+                if ($value['short'] == $name){
+                    $taskCondtionInfo = new TaskCondtionInfo();
+                    // 查找值类型
+                    $valueType = TaskPreConditionValueType::findValueType($value['preRelationId'],$valueTypes);
+
+                    if (2 == $valueType['id']){
+                        $taskCondtionInfo ->maxValue = $value['preRelationStart'];
+                    }elseif (4 == $valueType['id'])
+                    {
+                        $taskCondtionInfo ->minValue = $value['preRelationStart'];
+                    }elseif (5 == $valueType['id'])
+                    {
+                        $taskCondtionInfo ->minValue = $value['preRelationStart'];
+                    }elseif (6 == $valueType['id']){
+                        $taskCondtionInfo ->minValue = $value['preRelationStart'];
+                        $taskCondtionInfo ->maxValue = $value['preRelationEnd'];
+                    }elseif (in_array($valueType['id'],[0,1,7,8,9,10])){
+                        $taskCondtionInfo ->equalValue = $value['preRelationName'];
+                    } else{
+                        $taskCondtionInfo ->equalValue = $value['preRelationStart'];
+                    }
+
+                    return $taskCondtionInfo;
+                }
+            }
+        }
+    }
+
+    // @function 通知客户端
+    //
+    public function noticeClient(){
+        return $this ->taskNoticeJson;
+    }
+
+
+
+
+}

+ 12 - 0
TaskPhysicalDataPInfo.php

@@ -0,0 +1,12 @@
+<?php
+
+/// @Brief 任务生理数据前置条件信息
+///
+class TaskPhysicalDataPInfo
+{
+    public $isLikeSports;    // 是否喜欢运动
+    public $isHypertension;  // 是否高血压
+    public $isHeartAttack;   // 是否有心脏病
+    public $isAgile;         // 是否行动矫健
+    public $isHardBody;      // 是否身体硬朗
+}

+ 7 - 0
TaskPostcondition.php

@@ -0,0 +1,7 @@
+<?php
+/// @Brief 任务后缀条件
+///
+class TaskPostcondition
+{
+    public $nextTask; // 下一任务
+}

+ 42 - 0
TaskPreConditionValueType.php

@@ -0,0 +1,42 @@
+<?php
+/// @Brief 任务前置条件值类型
+///
+class TaskPreConditionValueType
+{
+    // @function 获取值类型列表
+    //
+    // @return 值类型列表
+    public static function getValueTypes(){
+        return [
+            array('id' => 0,'name' => '男'),
+            array('id' => 1,'name' => '女'),
+            array('id' => 2,'name' => '小于'),
+            array('id' => 3,'name' => '等于'),
+            array('id' => 4,'name' => '大于'),
+            array('id' => 5,'name' => '不等于'),
+            array('id' => 6,'name' => '区间'),
+            array('id' => 7,'name' => '是'),
+            array('id' => 8,'name' => '否'),
+            array('id' => 9,'name' => '白天'),
+            array('id' => 10,'name' => '晚上'),
+        ];
+    }
+
+    // @function 查找值类型
+    //
+    // @param id     编号
+    // @param values 值类型列表
+    // @return 值类型
+    public static function findValueType($id,$values)
+    {
+        if (empty($values))
+            return '';
+
+        foreach ($values as $value){
+            if ($value['id'] == $id)
+                return $value;
+        }
+
+        return '';
+    }
+}

+ 142 - 0
TaskPreconditionCompare.php

@@ -0,0 +1,142 @@
+<?php
+
+/// @Brief 任务前置条件比较
+///
+class TaskPreconditionCompare
+{
+
+    private static $instance = null; // 单例
+
+    // @function 获取单例
+    //
+    // @return TaskPreconditionCompare
+    public static function getInstance(){
+        if (is_null(self::$instance)) { self::$instance =  new TaskPreconditionCompare();}
+        return self::$instance;
+    }
+
+    // @function 构造
+    //
+    private function __construct()
+    {
+
+    }
+
+    // @function 获取结果
+    //
+    // @param userDataInfo          用户数据信息<参见UserDataInfo>
+    // @param taskPreconditionInfo  任务前置条件信息<参考TaskPreconditionInfo>
+    // @return boolean
+    public  function getResult($userTaskInfo,
+                                     $taskPreconditionInfo){
+        // 用户基本信息比较
+        if (!is_null($userTaskInfo ->baseInfo)){
+
+            if ($this ->compare($taskPreconditionInfo ->age,
+                $userTaskInfo ->baseInfo ->age))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->sex,
+                $userTaskInfo ->baseInfo ->sex))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->time,
+                $userTaskInfo ->baseInfo ->time))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->ulevel,
+                $userTaskInfo ->baseInfo ->ulevel))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->place,
+                $userTaskInfo ->baseInfo ->place))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->weather,
+                $userTaskInfo ->baseInfo ->weather))
+                return true;
+            // todo
+
+        }
+
+        // 任务生理数据前置条件信息比较
+        if (!is_null($userTaskInfo ->taskPhysicalDataPInfo)){
+            if ($this ->compare($taskPreconditionInfo ->isLikeSports,
+                $userTaskInfo ->baseInfo ->isLikeSports))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->isHypertension,
+                $userTaskInfo ->baseInfo ->isHypertension))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->isHeartAttack,
+                $userTaskInfo ->baseInfo ->isHeartAttack))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->isAgile,
+                $userTaskInfo ->baseInfo ->isAgile))
+                return true;
+
+            if ($this ->compare($taskPreconditionInfo ->isHardBody,
+                $userTaskInfo ->baseInfo ->isHardBody))
+                return true;
+
+            // todo
+        }
+
+        return false;
+    }
+
+    // @function 是否是任务条件信息
+    //
+    // @param value 值
+    // @return boolean
+    private function isTaskCondtionInfo($value)
+    {
+        if ($value instanceof TaskCondtionInfo)
+            return true;
+        return false;
+    }
+
+    // @function 比较
+    //
+    // @param value1 值1
+    // @param value2 值2
+    // @return boolean
+    private function compare($value1,$value2)
+    {
+        if (true == $this ->isTaskCondtionInfo($value1))
+        {
+            if (true == $this ->isEmpty($value1 ->equalValue)){
+                return $value2 == $value1 ->equalValue;
+            }
+
+            if (true == $this ->isEmpty($value1 ->minValue)
+                && true == $this ->isEmpty($value1 ->maxValue)){
+                return ($value2 > $value1 ->minValue && $value2 <= $value1 ->maxValue);
+            }
+
+            if (true == $this ->isEmpty($value1 ->minValue)){
+                return $value2 >= $value1 ->minValue;
+            }
+
+            if (true == $this ->isEmpty($value1 ->maxValue)){
+                return $value2 <= $value1 ->maxValue;
+            }
+        }else
+        {
+            return $value1 == $value2;
+        }
+    }
+
+    // @function 是否为空
+    //
+    // @param value 值
+    // @return boolean
+    private function isEmpty($value){
+        if (!is_null($value) && !empty($value)){
+            return true;
+        }
+        return false;
+    }
+}

+ 16 - 0
TaskPreconditionInfo.php

@@ -0,0 +1,16 @@
+<?php
+
+/// @Brief 任务前置条件信息
+///
+class TaskPreconditionInfo
+{
+    public $age;                   // 年龄<参照TaskCondtionInfo>
+    public $sex;                   // 性别 1:男,2:女,3:未知
+    public $time;                  // 时间<参照TaskCondtionInfo>
+    public $ulevel;                // 等级<参照TaskCondtionInfo>
+    public $place;                 // 地点
+    public $weather;               // 天气
+    public $taskPhysicalDataPInfo; // 任务生理数据前置条件信息
+    public $preTaskId;             // 上一个任务
+    public $mtaskIds;              // 多任务触发
+}

+ 10 - 0
TaskState.php

@@ -0,0 +1,10 @@
+<?php
+
+/// @Brief 任务状态
+///
+class TaskState
+{
+    const COMPLETE = 1; // 完成
+    const CANCEL   = 2; // 取消
+    const CONDUCT  = 3; // 进行
+}

+ 10 - 0
TaskStepFuncType.php

@@ -0,0 +1,10 @@
+<?php
+
+/// @Brief 步骤函数类型
+class TaskStepFuncType
+{
+    const INTEGRAL = 1;   // 积分
+    const COUPON   = 2;   // 优惠劵
+    const LEVEL    = 3;    // 会员等级
+
+}

+ 9 - 0
TaskType.php

@@ -0,0 +1,9 @@
+<?php
+
+
+class TaskType
+{
+    const ORDINARY = 0; // 普通任务
+    const SERIES   = 1; // 多个任务串联执行
+    const PARALLEL = 2; // 多个任务并行执行完后才能
+}

+ 13 - 0
UserBaseInfo.php

@@ -0,0 +1,13 @@
+<?php
+
+/// @Brief 用户基本信息
+///
+class UserBaseInfo
+{
+    public $age;                   // 年龄
+    public $sex;                   // 性别 1:男,2:女,3:未知
+    public $time;                  // 时间
+    public $ulevel;                // 等级
+    public $place;                 // 地点
+    public $weather;               // 天气
+}

+ 9 - 0
UserDataInfo.php

@@ -0,0 +1,9 @@
+<?php
+
+/// @Brief 用户数据信息
+///
+class UserDataInfo
+{
+    public $baseInfo;                // 基本信息<参见UserBaseInfo>
+    public $userPhysicalDataPInfo;   // 任务生理数据信息<参见TaskPhysicalDataPInfo>
+}

+ 12 - 0
UserPhysicalDataPInfo.php

@@ -0,0 +1,12 @@
+<?php
+
+/// @Brief 用户生理数据信息
+///
+class UserPhysicalDataPInfo
+{
+    public $isLikeSports;    // 是否喜欢运动
+    public $isHypertension;  // 是否高血压
+    public $isHeartAttack;   // 是否有心脏病
+    public $isAgile;         // 是否行动矫健
+    public $isHardBody;      // 是否身体硬朗
+}

+ 52 - 0
UserTaskDb.php

@@ -0,0 +1,52 @@
+<?php
+/// @Brief 用户任务db
+///
+class UserTaskDb implements IUserTaskDb
+{
+
+    // @function 获取用户任务
+    //
+    // @param userId 用户编号
+    // @return 用户任务列表
+    public function getUserTaskByUserId($userId){
+        $db = new MysqlPdo();
+        $sql = "select * from wp_user_task WHERE   user_id = {$userId} ORDER  BY  id desc ";
+        $res = $db->query($sql);
+        return $res;
+    }
+
+    // @function 获取用户信息
+    //
+    // @param userId 用户编号
+    // @return 用户任务信息
+    public function getUserInfoByUserId($userId){
+        return [
+            'baseInfo' => [
+                'age' => 29,
+                'sex' => '男',
+                'time' => date('Y-m-d H:i:s'),
+                'ulevel' => 2,
+                'place' => '长沙市岳麓区',
+                'weather' => '良好',
+            ],
+            'physical' => [
+                'isLikeSports' => '是',
+                'isHypertension' => '否',
+                'isHeartAttack' => '是',
+                'isAgile' => '是',
+                'isHardBody' => '是',
+            ]
+        ];
+    }
+
+    // @function 获取任务信息
+    //
+    // @param id 任务编号
+    // @return 任务信息
+    public function getTaskInfoById($id){
+        $db = new MysqlPdo();
+        $sql = "select * from wp_task WHERE  id = {$id}  ";
+        $res = $db->query($sql);
+        return isset($res[0])?$res[0]:[];
+    }
+}

+ 13 - 0
UserTaskInfo.php

@@ -0,0 +1,13 @@
+<?php
+
+/// @Brief 用户任务信息
+///
+class UserTaskInfo
+{
+    public $userId;                  // 用户编号
+    public $taskId;                  // 任务编号
+//    public $completeProgress;        // 完成进度
+    public $tcurrStepfun;            // 任务当前步骤函数
+    public $tcurrStepCount;          // 任务当前步骤数
+    public $taskState;               // 任务状态<参见TaskState>
+}

+ 25 - 0
stepfuns/mrqd14.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrqd14 {
+                 
+                     public function  mrqd14_proc_0(){
+
+         return "1";
+
+       }
+       
+       
+       
+              public function  mrqd14_proc_1(){
+
+         return "恭喜领取成功";
+
+       }
+       
+       
+       
+          
+       
+   }

+ 25 - 0
stepfuns/mrqd15.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrqd15 {
+                 
+                     public function  mrqd15_proc_0(){
+
+         return "1";
+
+       }
+       
+       
+       
+              public function  mrqd15_proc_1(){
+
+         return "恭喜领取成功";
+
+       }
+       
+       
+       
+          
+       
+   }

+ 25 - 0
stepfuns/mrqd16.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrqd16 {
+                 
+                     public function  mrqd16_proc_0(){
+
+         return "1";
+
+       }
+       
+       
+       
+              public function  mrqd16_proc_1(){
+
+         return "恭喜领取成功";
+
+       }
+       
+       
+       
+          
+       
+   }

+ 25 - 0
stepfuns/mrqd17.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrqd17 {
+                 
+                     public function  mrqd17_proc_0(){
+
+         return "1";
+
+       }
+       
+       
+       
+              public function  mrqd17_proc_1(){
+
+         return "恭喜领取成功";
+
+       }
+       
+       
+       
+          
+       
+   }

+ 25 - 0
stepfuns/mrsqb1.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrsqb1 {
+                 
+                     public function  mrsqb1_proc_0(){
+
+         return "30";
+
+       }
+       
+       
+       
+               public function  mrsqb1_proc_1(){
+
+         return "恭喜完成";
+
+       }
+       
+       
+       
+           
+       
+   }

+ 25 - 0
stepfuns/mrsqb6.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class mrsqb6 {
+                 
+                     public function  mrsqb6_proc_0(){
+
+         return "30";
+
+       }
+       
+       
+       
+              public function  mrsqb6_proc_1(){
+
+         return "恭喜完成";
+
+       }
+       
+       
+       
+          
+       
+   }

+ 25 - 0
stepfuns/qdrw1.php

@@ -0,0 +1,25 @@
+<?php
+/**
+*步骤函数
+*/
+class qdrw1 {
+                 
+                     public function  qdrw1_proc_0(){
+
+         return "10";
+
+       }
+       
+       
+       
+               public function  qdrw1_proc_1(){
+
+         return "恭喜您完成任务";
+
+       }
+       
+       
+       
+           
+       
+   }

+ 33 - 0
stepfuns/xxxx.php

@@ -0,0 +1,33 @@
+<?php
+/**
+*步骤函数
+*/
+class xxxx {
+                 
+                     public function  xxxx_proc_0(){
+
+         return "100";
+
+       }
+       
+       
+       
+              public function  xxxx_proc_1(){
+
+         return "4";
+
+       }
+       
+       
+       
+              public function  xxxx_proc_2(){
+
+         return "sdfsdf";
+
+       }
+       
+       
+       
+          
+       
+   }