ExamPaperModel.class.php 4.75 KB
<?php
/**
 * Created by PhpStorm.
 * User: yingcai
 * Date: 2017/10/10
 * Time: 下午4:00
 */

namespace Common\Model;

use Common\Common\Constant;
use Common\Common\Department;

class ExamPaperModel extends \Com\Model
{
    // 构造方法
    public function __construct()
    {
        parent::__construct('Paper', 'oa_exam_');
    }


    /**
     * 获取用户所在部门以及父级部门的ID集合
     * @param array $user
     * @return array
     */
    private function get_user_dp_list($user = array())
    {
        $dpIds = array();
        // 部门ID
        if (isset($user['dpName']) && !empty($user['dpName'])) {

            $myDpIds = array_column($user['dpName'], 'dpId');

            $dpServ = &Department::instance();
            $parentDpIds = [];

            // 取父级部门ID
            foreach ($myDpIds as $myDpId) {
                $dpServ->list_parent_cdids($myDpId, $parentDpIds);
            }

            $dpIds = array_unique(array_merge($myDpIds, array_values($parentDpIds)));
        }

        return $dpIds;
    }


    /**
     * 获取当前用户的标签,部门,岗位,用户ID
     *
     * @author 英才
     * @param array $user 传入当前用户信息
     *
     * @return array
     */
    private function get_by_right($user = array())
    {
        // 获取用户所在部门ID以及上级部门ID
        $dpIds = $this->get_user_dp_list($user);

        // 职位
        if (isset($user['job']['jobId'])) {
            $job_ids = [$user['job']['jobId']];
            // 兼容UC人员列表接口返回的职位数据
        } elseif (isset($user['jobList']) && !empty($user['jobList'])) {
            $job_ids = array_column($user['jobList'], 'jobId');
        }

        // 角色
        if (isset($user['role']['roleId'])) {
            $role_ids = [$user['role']['roleId']];

            // 兼容UC人员列表接口返回的角色数据
        } elseif (isset($user['roleList']) && !empty($user['roleList'])) {
            $role_ids = array_column($user['roleList'], 'roleId');
        }

        return array(
            'memID' => $user['memUid'],
            'dpIds' => $dpIds,
            'jobIds' => $job_ids,
            'roleIds' => $role_ids
        );
    }


    /**
     * 根据权限获取用户有权限
     * @param $user 用户信息
     * @return bool
     */
    public function list_paper_by_user($user)
    {

        $right = $this->get_by_right($user);

        // 获取权限查询权限试卷列表
        list($sql_right, $params_right) = $this->get_right_paper_sql($right);

        if (!empty($sql_right)) {
            return  $this->_m->fetch_array($sql_right, $params_right);
        }

        return [];
    }


    /**
     * 组装可见范围不为全公司的试卷-权限sql
     * @param $cond 查询条件
     * @return array sql语句、参数
     */
    protected function get_right_paper_sql($right)
    {
        $where_right = '';
        $right_params = array();
        // 用户
        if (!empty($right['memID'])) {

            $where_right .= empty($where_right) ? " uid =? " : " OR uid =? ";
            $right_params[] = $right['memID'];
        }

        // 部门
        if (!empty($right['dpIds'])) {

            $where_right .= empty($where_right) ? " `cd_id` IN (?) " : " OR `cd_id` IN (?) ";
            $right_params[] = $right['dpIds'];
        }

        // 岗位
        if (!empty($right['jobIds'])) {

            $where_right .= empty($where_right) ? " `job_id` IN (?) " : " OR `job_id` IN (?) ";
            $right_params[] = $right['jobIds'];
        }

        // 角色
        if (!empty($right['roleIds'])) {

            $where_right .= empty($where_right) ? " `role_id` IN (?) " : " OR `role_id` IN (?) ";
            $right_params[] = $right['roleIds'];
        }

        if (empty($where_right)) {
            return array('', []);
        }

        $params[] = Constant::EC_OPEN_STATES;
        $params[] = Constant::PAPER_DRAFT;
        $params[] = QY_DOMAIN;
        $params[] = self::ST_DELETE;
        $params[] = Constant::EXAM_RIGHT_PAPER;

        $sql = 'SELECT `ep`.ep_id,`ep`.ep_name FROM __TABLE__ AS `ep` 
                LEFT JOIN `oa_exam_right` AS `r` 
                ON `ep`.`ep_id`=`r`.epc_id 
                WHERE `ep`.`cate_status`=? 
                    AND `ep`.`exam_type`=1
                    AND `ep`.`exam_status`>? 
                    AND ep.`domain`=? 
                    AND ep.`status`<? 
                    AND r.`er_type`=? 
                    AND (' . $where_right . ') 
                    AND r.`domain`=? 
                    AND r.`status`<?';
        // 合并权限where参数
        $params = array_merge($params, $right_params);

        $params[] = QY_DOMAIN;
        $params[] = self::ST_DELETE;

        return array($sql, $params);
    }

}