SaveController.class.php 5.04 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhonglei
 * Date: 18/4/24
 * Time: 10:43
 */
namespace Apicp\Controller\Path;

use Com\PackageValidate;
use Common\Common\Constant;
use Common\Service\PathService;
use Common\Service\PathContentService;
use Common\Service\MapPathService;

class SaveController extends \Apicp\Controller\AbstractController
{
    /**
     * Save
     * @author zhonglei
     * @desc 保存路径接口
     * @param Int path_id:true 路径ID,新建时传0
     * @param String path_name:true 路径名称
     * @param Int is_step:true 是否开启闯关(1=未开启;2=已开启)
     * @param String description 路径介绍
     * @param Array contents:true 内容
     * @param String contents.app:true 应用(course=课程;exam=考试;questionnaire=调研)
     * @param Int contents.app_data_id:true 数据ID
     * @param String contents.title:true 标题
     * @param Int contents.is_learn:true 是否必学(1=否;2=是)
     * @param Int contents.order:true 顺序
     * @return Array
     * array(
     *     'path_id' => 1 // 路径ID
     * )
     */
    public function Index_post()
    {
        // 请求数据
        $post_data = I('post.');

        // 验证规则
        $rules = [
            'path_id' => 'require|integer',
            'path_name' => 'require',
            'is_step' => 'require|integer|in:1,2',
            'contents' => 'require|array',
        ];

        // 验证请求数据
        $validate = new PackageValidate();
        $validate->postData = $post_data;
        $validate->validateParams($rules);

        $path_id = $post_data['path_id'];
        list($path_data, $contents_data) = $this->_formatPostData($post_data);

        $pathServ = new PathService();
        $is_link = false;

        // 编辑
        if ($path_id > 0) {
            $path = $pathServ->get($path_id);

            if (empty($path)) {
                E('_ERR_PATH_NOT_FOUND');
            }

            $mapPathServ = new MapPathService();
            $is_link = !empty($mapPathServ->get_by_conds(['path_id' => $path_id]));

            // 已关联地图,编辑前未开启闯关,编辑时不可开启
            if ($is_link && $path['is_step'] == Constant::PATH_IS_STEP_FALSE && $path_data['is_step'] != $path['is_step']) {
                E('_ERR_PATH_IS_STEP_INVALID');
            }
        }

        // 新建
        if ($path_id == 0) {
            $path_id = $pathServ->insert($path_data);

        // 编辑
        } else {
            $pathServ->update($path_id, $path_data);
        }

        // 未关联地图 或 未开启闯关,可编辑学习内容
        if (!$is_link || $path_data['is_step'] == Constant::PATH_IS_STEP_FALSE) {
            $pathContentServ = new PathContentService();
            $pathContentServ->delete_by_conds(['path_id' => $path_id]);
            
            foreach ($contents_data as $v) {
                $v['path_id'] = $path_id;
                $pathContentServ->insert($v);
            }
        }

        $this->_result = [
            'path_id' => $path_id,
        ];
    }

    /**
     * 格式化请求数据,并返回路径数据和路径内容数据
     * @author zhonglei
     * @param array $post_data 请求数据
     * @return array
     */
    private function _formatPostData($post_data)
    {
        $path_keys = ['path_name', 'is_step', 'description'];
        $path_data = array_intersect_key_reserved($post_data, $path_keys, true);
        $path_data['update_time'] = MILLI_TIME;

        // 新建
        if ($post_data['path_id'] == 0) {
            $path_data['ea_id'] = $this->_login->user['eaId'];
            $path_data['ea_name'] = $this->_login->user['eaRealname'];
        }

        $content_keys = ['app', 'app_data_id', 'title', 'is_learn', 'order'];
        $contents_data = array_intersect_key_reserved($post_data['contents'], $content_keys);

        $rules = [
            'app' => 'require|in:course,exam,questionnaire',
            'app_data_id' => 'require|integer',
            'title' => 'require',
            'is_learn' => 'require|integer|in:1,2',
            'order' => 'require|integer',
        ];

        $validate = new PackageValidate();

        // 校验路径内容数据格式
        try {
            foreach ($contents_data as $v) {
                $validate->postData = $v;
                $validate->validateParams($rules);
            }
        } catch (\Exception $e) {
            E('_ERR_PATH_CONTENT_INVALID');
        }

        $is_learns = array_column($contents_data, 'is_learn');

        // 至少应有1项内容为必学
        if (!\in_array(Constant::PATH_CONTENT_IS_LEARN_TRUE, $is_learns)) {
            E('_ERR_PATH_CONTENT_LEARN');
        }

        // 验证学习内容是否已被其他路径使用
        $contentService = new PathContentService();
        $pathId = $post_data['path_id'] ? $post_data['path_id'] : 0;
        $usePathData = $contentService->getUsePathList($contents_data, $pathId);
        if (!empty($usePathData)) {
            E('_ERR_PATH_CONTENT_USE');
        }

        return [$path_data, $contents_data];
    }
}