CopyController.class.php 5.63 KB
<?php
/**
 * Created by PhpStorm.
 * Date: 2018/6/6
 */

namespace Apicp\Controller\Paper;

use Common\Service\RightService;
use Common\Service\PaperService;
use Common\Service\PaperTempService;
use Common\Service\SnapshotService;
use Common\Service\RandomSnapshotService;

class CopyController extends AbstractController
{

    /** @var PaperService */
    protected $paper_service;
    /** @var RightService */
    protected $right_service;
    /** @var PaperTempService */
    protected $paper_temp_service;
    /** @var SnapshotService */
    protected $snapshot_service;
    /** @var RandomSnapshotService */
    protected $random_snapshot_service;

    public function before_action($action = '')
    {

        if (!parent::before_action($action)) {

            return false;
        }

        // 试卷表
        $this->paper_service = new PaperService();
        // 试卷权限表
        $this->right_service = new RightService();
        // 试卷临时备选题目储存表
        $this->paper_temp_service = new PaperTempService();
        // 试卷试题快照表
        $this->snapshot_service = new SnapshotService();
        // 试卷随机题库快照表
        $this->random_snapshot_service = new RandomSnapshotService();

        return true;
    }

    public function Index_post()
    {
        // 试卷id
        $ep_id = I('post.ep_id', 0, 'intval');

        // 试卷id不能为空
        if (empty($ep_id)) {

            E('_EMPTY_PAPER_ID');
        }

        // 试卷信息
        $paper_info = $this->paper_service->get($ep_id);
        // 试卷权限
        $field = 'epc_id,er_type,source_type,uid,cd_id,tag_id,job_id,role_id';
        $paper_right = $this->right_service->list_by_conds(['er_type != ?' => PaperService::RIGHT_CATEGORY, 'epc_id' => $ep_id], null, [], $field);
        // 试卷临时备选题目
        $paper_temp_list = $this->paper_temp_service->list_by_conds(['ep_id' => $ep_id]);
        // 试卷试题快照
        $snapshot_list = $this->snapshot_service->list_by_conds(['ep_id' => $ep_id]);
        // 试卷随机题库快照
        $random_snapshot_list = $this->random_snapshot_service->list_by_conds(['ep_id' => $ep_id]);

        try {
            // 开始事务
            $this->paper_service->start_trans();

            $paper_info['unjoin_count'] = $paper_info['join_count'] + $paper_info['unjoin_count'];
            $paper_info['exam_status'] = PaperService::STATUS_DRAFT;
            $paper_info['is_old'] = 2;
            $paper_info['last_time'] = MILLI_TIME;

            unset(
                $paper_info['ep_id'],
                $paper_info['join_count'],
                $paper_info['begin_corn'],
                $paper_info['end_cron'],
                $paper_info['corn_stop'],
                $paper_info['corn_exam'],
                $paper_info['publish_time'],
                $paper_info['corn_create_exam'],
                $paper_info['cron_statistics'],
                $paper_info['cron_send_msg'],
                $paper_info['cron_rank_id'],
                $paper_info['updated']

            );
            // 新增试卷
            $new_ep_id = $this->paper_service->insert($paper_info);

            // 新增试卷权限
            if (!empty($paper_right)) {
                array_walk(
                    $paper_right,
                    function (&$val_right, $key, $param) {
                        $val_right[$param['key']] = $param['val'];
                    },
                    ['key' => 'epc_id', 'val' => $new_ep_id]
                );

                $this->right_service->insert_all($paper_right);
            }

            // 新增试卷临时备选题目
            if (!empty($paper_temp_list)) {
                array_walk(
                    $paper_temp_list,
                    function (&$val_temp, $key, $param) {
                        $val_temp[$param['key']] = $param['val'];
                        unset($val_temp['epd_id']);
                    },
                    ['key' => 'ep_id', 'val' => $new_ep_id]
                );

                $this->paper_temp_service->insert_all($paper_temp_list);
            }

            // 新增试卷试题快照
            if (!empty($snapshot_list)) {
                array_walk(
                    $snapshot_list,
                    function (&$val_snapshot, $key, $param) {
                        $val_snapshot[$param['key']] = $param['val'];
                        unset($val_snapshot['es_id']);
                    },
                    ['key' => 'ep_id', 'val' => $new_ep_id]
                );
                $this->snapshot_service->insert_all($snapshot_list);
            }

            // 新增试卷试题快照
            if (!empty($random_snapshot_list)) {
                array_walk(
                    $random_snapshot_list,
                    function (&$val_random, $key, $param) {
                        $val_random[$param['key']] = $param['val'];
                        unset($val_random['er_id']);
                    },
                    ['key' => 'ep_id', 'val' => $new_ep_id]
                );
                $this->random_snapshot_service->insert_all($random_snapshot_list);
            }

            // 提交事务
            $this->paper_service->commit();
        } catch (\Think\Exception $e) {
            // 事务回滚
            $this->paper_service->rollback();
            E('_ERR_COPY_PAPER_FAILED');

            return false;
        } catch (\Exception $e) {
            // 事务回滚
            $this->paper_service->rollback();
            E('_ERR_COPY_PAPER_FAILED');

            return false;
        }

        $this->_result = ['ep_id' => intval($new_ep_id)];

        return true;
    }
}