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

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

class SaveWorkmateSettingController extends \Apicp\Controller\AbstractController
{
    /**
     * SaveWorkmateSetting
     * @author tangxingguo
     * @desc 保存同事圈设置接口
     * @param Int is_open:true 是否开启(1=关闭;2=开启)
     * @param Array workmate_circle 话题规则(有值开启发表话题激励规则;)
     * @param Int workmate_circle.count 周期内设置的提问数
     * @param Int workmate_circle.integral 获得积分数
     * @param Array workmate_comment 评论规则(有值则开启添加评论激励规则;)
     * @param Int workmate_comment.count 周期内设置的回答数
     * @param Int workmate_comment.integral 获得积分数
     * @param Int workmate_comment.is_unique 是否同一个话题仅计一条评论数(1=否;2=是)
     * @param Array workmate_like 点赞规则(有值则开启点赞激励规则;)
     * @param Int workmate_like.count 周期内设置的回答数
     * @param Int workmate_like.integral 获得积分数
     * @param Int workmate_like.unique_circle 是否仅计话题的点赞数(1=否;2=是)
     * @return array
     */
    public function Index_post()
    {
        // 验证规则
        $rules = [
            'is_open' => 'require|integer|in:1,2',
            'workmate_circle' => 'array',
            'workmate_comment' => 'array',
            'workmate_like' => 'array',
        ];

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

        // 格式化数据
        if ($postData['is_open'] == Constant::DAILYTASK_IS_OPEN_FALSE) {
            $sqlData = ['is_open' => Constant::DAILYTASK_IS_OPEN_FALSE];
        } else {
            $sqlData = $this->_formatPostData($postData);
        }

        // 入库
        $dailyServ = new DailytaskService();
        $workmateSetting = $dailyServ->get_by_conds(['app' => Constant::APP_WORKMATE]);
        if (empty($workmateSetting)) {
            // 新增数据
            $dailyServ->insert($sqlData);

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

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

    /**
     * 格式化请求数据
     * @author tangxingguo
     * @param array $postData 请求数据
     * @return array
     */
    private function _formatPostData($postData)
    {
        $sqlData = [
            'is_open' => $postData['is_open'],
            'app' => Constant::APP_WORKMATE,
            'update_time' => MILLI_TIME,
        ];

        // 话题规则
        $circleRule = [];
        if (isset($postData['workmate_circle']) && !empty($postData['workmate_circle'])) {
            $circleRule = $postData['workmate_circle'];
            $this->_ruleCheck($circleRule);

            // keys
            $circleRule['action_keys'] = [Constant::ACTION_KEYS_WORKMATE_CIRCLE];
        }

        // 评论规则
        $commentRule = [];
        if (isset($postData['workmate_comment']) && !empty($postData['workmate_comment'])) {
            $commentRule = $postData['workmate_comment'];
            $this->_ruleCheck($commentRule);
            if (!in_array($commentRule['is_unique'], [Constant::DAILYTASK_SAME_CIRCLE_FALSE, Constant::DAILYTASK_SAME_CIRCLE_TRUE])) {
                E('_ERR_DAILYTASK_PARAM_VALUE_ERROR');
            }

            // 是否同一个话题仅计一条评论数
            switch ($commentRule['is_unique']) {
                case Constant::DAILYTASK_SAME_CIRCLE_FALSE:
                    $commentRule['config']['unique'] = false;
                    break;
                case Constant::DAILYTASK_SAME_CIRCLE_TRUE:
                    $commentRule['config']['unique'] = true;
                    break;
            }

            // keys
            $commentRule['action_keys'] = [Constant::ACTION_KEYS_WORKMATE_COMMENT];
        }

        // 点赞规则
        $likeRule = [];
        if (isset($postData['workmate_like']) && !empty($postData['workmate_like'])) {
            $likeRule = $postData['workmate_like'];
            $this->_ruleCheck($likeRule);
            if (!in_array($likeRule['unique_circle'], [Constant::DAILYTASK_LIKE_CIRCLE_FALSE, Constant::DAILYTASK_LIKE_CIRCLE_TRUE])) {
                E('_ERR_DAILYTASK_PARAM_VALUE_ERROR');
            }

            // 是否仅计话题的点赞数
            switch ($likeRule['unique_circle']) {
                case Constant::DAILYTASK_LIKE_CIRCLE_FALSE:
                    $likeRule['action_keys'] = [
                        Constant::ACTION_KEYS_WORKMATE_LIKE_CIRCLE,
                        Constant::ACTION_KEYS_WORKMATE_LIKE_COMMENT,
                    ];
                    break;
                case Constant::DAILYTASK_LIKE_CIRCLE_TRUE:
                    $likeRule['action_keys'] = [Constant::ACTION_KEYS_WORKMATE_LIKE_CIRCLE];
                    break;
            }
        }

        // 组合数据、序列化
        $rules = [];
        if (!empty($circleRule)) {
            $rules[Constant::RULE_NAME_WORKMATE_CIRCLE] = $circleRule;
        }
        if (!empty($commentRule)) {
            $rules[Constant::RULE_NAME_WORKMATE_COMMENT] = $commentRule;
        }
        if (!empty($likeRule)) {
            $rules[Constant::RULE_NAME_WORKMATE_LIKE] = $likeRule;
        }
        if (!empty($rules)) {
            $sqlData['rules'] = serialize($rules);
        }

        return $sqlData;
    }

    /**
     * @desc 公共规则校验
     * @author tangxingguo
     * @param array $data 规则数据
     */
    private function _ruleCheck($data)
    {
        $rules = [
            'count' => 'require|integer|gt:0',
            'integral' => 'require|integer|gt:0|max:6',
        ];

        $validate = new Validate($rules, []);
        $validate->check($data);

        if (!empty($validate->getError())) {
            E($validate->getError());
        }
    }
}