SaveQuestionSettingController.class.php 5.36 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 17/7/24
 * Time: 17:15
 */
namespace Apicp\Controller\Dailytask;

use Com\Validate;
use Com\PackageValidate;
use Common\Common\Constant;
use Common\Common\DailytaskConfig;
use Common\Service\DailytaskService;

class SaveQuestionSettingController extends \Apicp\Controller\AbstractController
{
    /**
     * SaveQuestionSetting
     * @author liyifei
     * @desc 保存问答中心设置接口
     * @param Int is_open:true 功能开关(1=关闭;2=开启)
     * @param Array answer_question 提问规则(任务设置:非空数组表示开启发起提问)
     * @param Int answer_question.count:true 周期内设置的提问数
     * @param Int answer_question.integral:true 获得积分数
     * @param Array answer_answer 回答规则(任务设置:非空数组表示开启添加回答)
     * @param Int answer_answer.count:true 周期内设置的回答数
     * @param Int answer_answer.integral:true 获得积分数
     * @param Int answer_answer.is_unique:true 是否同一提问仅记一条回答(1=否;2=是)
     * @return void
     */
    public function Index_post()
    {
        // 验证规则
        $rules = [
            'is_open' => 'require|integer|in:1,2',
            'answer_question' => 'array',
            'answer_answer' => 'array',
        ];

        // 验证请求数据
        $validate = new PackageValidate($rules, [], array_keys($rules));

        // 格式化请求数据
        $data = $this->_formatPostData($validate->postData);

        // 获取问答中心每日任务配置
        $dailyServ = new DailytaskService();
        $daily = $dailyServ->get_by_conds(['app' => Constant::APP_ANSWER]);
        if (empty($daily)) {
            // 新增数据
            $dailyServ->insert($data);

        } else {
            // 修改数据
            $dailyServ->update($daily['dailytask_id'], $data);
        }

        // 清除缓存
        $taskConfig = &DailytaskConfig::instance();
        $taskConfig->clearCacheData(Constant::APP_ANSWER);
    }

    /**
     * 校验并格式化请求数据
     * @author liyifei
     * @param array $postData 请求数据
     * @return array
     */
    private function _formatPostData($postData)
    {
        // 关闭任务时,仅操作关闭,不处理规则数据
        if ($postData['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) {
            return [
                'app' => Constant::APP_ANSWER,
                'is_open' => Constant::DAILYTASK_IS_OPEN_FALSE,
                'update_time' => MILLI_TIME,
            ];
        }

        // 开启任务时,必须设置规则
        if (empty($postData['answer_question']) && empty($postData['answer_answer'])) {
            E('_ERR_DAILYTASK_MUST_SET_RULES');
        }

        // 公共规则
        $rules = [
            'count' => 'require|integer|gt:0',
            'integral' => 'require|integer|gt:0',
        ];

        // 校验、格式化提问规则
        $answerQuestion = [];
        if (isset($postData['answer_question']) && !empty($postData['answer_question'])) {
            // 只保留前端有效字段
            $answerQuestion = array_intersect_key_reserved($postData['answer_question'], array_keys($rules), true);

            // 校验数据
            $validate = new Validate($rules, []);
            if (!$validate->check($answerQuestion)) {
                E($validate->getError());
            }

            // 补全后端参数:action_keys
            $answerQuestion['action_keys'] = [
                Constant::ACTION_KEYS_ANSWER_SEND_QUESTION,
            ];
        }

        // 校验、格式化回答规则
        $answerAnswer = [];
        if (isset($postData['answer_answer']) && !empty($postData['answer_answer'])) {
            // 添加回答的特殊规则
            $rules['is_unique'] = 'integer|in:1,2';

            // 只保留前端有效字段
            $answerAnswer = array_intersect_key_reserved($postData['answer_answer'], array_keys($rules), true);

            // 校验数据
            $validate = new Validate($rules, []);
            if (!$validate->check($answerAnswer)) {
                E($validate->getError());
            }

            // 补全后端参数:特殊条件配置
            if (isset($answerAnswer['is_unique'])) {
                switch ($answerAnswer['is_unique']) {
                    case Constant::DAILYTASK_SAME_QUESTION_FALSE:
                        $answerAnswer['config']['unique'] = false;
                        break;
                    case Constant::DAILYTASK_SAME_QUESTION_TRUE:
                        $answerAnswer['config']['unique'] = true;
                        break;
                }
            }

            // 补全后端参数:action_keys
            $answerAnswer['action_keys'] = [
                Constant::ACTION_KEYS_ANSWER_SEND_ANSWER,
            ];
        }

        $ruleData = [];
        if (!empty($answerQuestion)) {
            $ruleData[Constant::RULE_NAME_ANSWER_QUESTION] = $answerQuestion;
        }
        if (!empty($answerAnswer)) {
            $ruleData[Constant::RULE_NAME_ANSWER_ANSWER] = $answerAnswer;
        }

        return [
            'app' => Constant::APP_ANSWER,
            'is_open' => Constant::DAILYTASK_IS_OPEN_TRUE,
            'update_time' => MILLI_TIME,
            'rules' => empty($ruleData) ? '' : serialize($ruleData),
        ];
    }
}