<?php
/**
 * AbstractService.class.php
 * Service 层基类
 *
 * @author: zhuxun37
 */

namespace Common\Service;

use Common\Common\Cache;
use Common\Common\Department;
use Common\Common\ExportDownload;
use Common\Common\User;
use Com\PythonExcel;

abstract class AbstractService extends \Com\Service
{

    // 积分规则:默认策略
    const INTEGRAL_ACTION_TYPE_DEFAULT = 1;
    // 积分规则:不使用策略
    const INTEGRAL_ACTION_TYPE_NO = 2;
    // 积分规则:使用自定义策略
    const INTEGRAL_ACTION_TYPE_MY = 3;

    // 学分规则:默认策略
    const CREDIT_ACTION_TYPE_DEFAULT = 1;
    // 学分规则:不使用策略
    const CREDIT_ACTION_TYPE_NO = 2;
    // 学分规则:使用自定义策略
    const CREDIT_ACTION_TYPE_MY = 3;

    // 系统默认调研分类
    const CLASSIFY_SYSTEM_DEFAULT = 1;
    // 非系统默认调研分类
    const CLASSIFY_UN_SYSTEM_DEFAULT = 0;

    // 查询人员状态:已关注
    const USER_STATUS_FOLLOW = 1;
    // 查询人员状态:已禁用
    const USER_STATUS_DISABLE = 2;
    // 查询人员状态:未关注
    const USER_STATUS_UNFOLLOW = 4;

    // 构造方法
    public function __construct()
    {

        parent::__construct();
    }

    /**
     * 去掉冗余字段
     *
     * @param $data
     */
    public function format_data_other(&$data)
    {

        unset($data['deleted'], $data['updated'], $data['status'], $data['domain']);

        return $data;
    }

    /**
     * 获取调研分类列表
     *
     * @return array|bool|mixed
     */
    public function get_classify_list()
    {

        $list = [];
        $cache = &Cache::instance();

        try {
            // 获取调研分类缓存信息
            $list = $cache->get('Common.Questionnaire_Classify_List');
        } catch (\Exception $e) {

            \Think\Log::record($e);
        }

        // 缓存数据为空
        if (empty($list)) {
            // 实例化调研分类
            $class_s = new ClassifyService();
            // 分类列表
            $list = $class_s->list_all();

            // 格式化分类列表数据
            $list = $this->format_data_classify($list);
            // 将分类列表存入缓存
            $cache->set('Common.Questionnaire_Classify_List', $list);
        }

        return $list;
    }

    /**
     * 格式化数据
     *
     * @param array $data 分类列表数据
     *
     * @return mixed
     */
    protected function format_data_classify($data)
    {

        $list = [];
        if (empty($data)) {

            return $list;
        }

        foreach ($data as $val) {

            $list[] = [
                'qc_id' => rintval($val['qc_id']),
                'qc_name' => $val['qc_name'],
                'qc_desc' => $val['qc_desc'],
                'is_system' => rintval($val['is_system']),
                'created' => rintval($val['created'])
            ];
        }

        return $list;
    }

    /**
     * 获取多个用户信息
     *
     * @param array $uids
     *
     * @return array|bool
     */
    public function getUser($uids = [])
    {

        if (is_array($uids)) {
            // 根据uid获取用户信息
            $users = $this->get_all_user_by_cache($uids);

            return $users;
        }

        return [];
    }

    /**
     * 获取用户信息列表
     *
     * @param array
     *
     * @return array
     */
    public function get_all_user_by_cache($uids = [])
    {

        // 用户信息初始化
        $user = User::instance();

        $user_list = [];
        // 防止缓存不存在时出错
        try {
            $cache = &Cache::instance();

            $user_list = $cache->get('Common.Questionnaire_User_List');
        } catch (\Think\Exception $e) {
            \Think\Log::record($e);

        } catch (\Exception $e) {
            \Think\Log::record($e);

        }

        $user_res = $user->listBasicByConds([], 1, 1);

        // 如果缓存不存在
        if (empty($user_list) || (count($user_list) != $user_res['total'])) {

            $users = $user->listAll();
            $user_list = [];
            foreach ($users as $v) {
                $user_list[$v['memUid']] = [
                    'memUid' => $v['memUid'],
                    'memUserid' => $v['memUserid'],
                    'memMobile' => $v['memMobile'],
                    'memEmail' => $v['memEmail'],
                    'memActive' => $v['memActive'],
                    'memUsername' => $v['memUsername'],
                    'memFace' => $v['memFace'],
                    'memSubscribeStatus' => $v['memSubscribeStatus'],
                    'memJob' => $v['memJob'],
                    'memRole' => $v['memRole'],
                    'dpName' => $v['dpName']
                ];
            }

            if (!empty($user_list)) {
                // 实例化缓存
                $cache = &Cache::instance();
                $cache->set('Common.Questionnaire_User_List', $user_list);
            }
        }

        if (empty($uids)) {

            return $user_list;
        }

        // 初始化指定人员的信息列表
        $user_info_list = [];
        foreach ($user_list as $k => $v) {
            if (in_array($k, $uids)) {
                $user_info_list[$v['memUid']] = $v;
            }
        }

        // 获取缓存中不存在的用户信息
        $all_uids = array_filter(array_column($user_list, 'memUid'));
        $no_uids = array_diff($uids, $all_uids);

        // 查询用户列表
        $arr_users = $user->listByUid($no_uids);
        $arr_users = array_combine_by_key($arr_users, 'memUid');

        // 获取缓存中不存在的或者已被删除的用户信息
        foreach ($no_uids as $_v) {

            $user_info = $arr_users[$_v];
            if (empty($user_info)) {

                $user_info = $user->getByUid($_v);
                $username = $user_info['memUsername'] . '【已删除】';
            } else {

                $username = $user_info['memUsername'];
            }

            $user_info_list[$user_info['memUid']] = [
                'memUid' => $user_info['memUid'],
                'memUserid' => $user_info['memUserid'],
                'memMobile' => $user_info['memMobile'],
                'memEmail' => $user_info['memEmail'],
                'memActive' => $user_info['memActive'],
                'memUsername' => $username,
                'memFace' => $user_info['memFace'],
                'memSubscribeStatus' => $user_info['memSubscribeStatus'],
                'memJob' => $user_info['memJob'],
                'memRole' => $user_info['memRole'],
                'dpName' => $user_info['dpName']
            ];
        }

        return $user_info_list;
    }

    /**
     * 根据部门ID集合,角色ID,岗位ID获取人员ID集合
     *
     * @author daijun
     *
     * @param array $dp_ids 部门ID集合
     * @param String $role_id 角色ID
     * @param String $job_id 岗位ID
     * @param String $memUsername 用户名
     *
     * @return array
     */
    public function list_uids_by_dp_job_role($dp_ids = [], $role_id = '', $job_id = '', $memUsername = '')
    {

        $User = new User();
        // 部门查询
        $uids = [];
        if ($dp_ids) {

            $department = new Department();
            $dpIDs = array_unique($dp_ids);
            sort($dpIDs);
            // 查询子部门
            $department_data = $department->list_childrens_by_cdid($dpIDs, true);
            // 搜索当前部门
            $department_data = array_merge($dpIDs, $department_data);
            $department_data = array_unique($department_data);
            // 升序
            sort($department_data);

            // 查询部门所有用户
            $user_list = $User->listAll(
                [
                    'dpIdList' => $department_data,
                ]);
            $dpid_uid = array_column($user_list, 'memUid');
            $uids = $dpid_uid;
        }

        // 角色查询
        if ($role_id) {
            $role_ids = [$role_id];
            $user_list = $User->listAll(
                [
                    'roleIdList' => $role_ids,
                ]);

            $role_uid = array_column($user_list, 'memUid');
            if (!empty($uids)) {
                $uids = array_intersect($uids, $role_uid);
            } else {
                $uids = $role_uid;
            }
        }

        // 岗位查询
        if ($job_id) {

            $job_ids = [$job_id];
            $user_list = $User->listAll(
                [
                    'jobIdList' => $job_ids,
                ]);

            $job_uid = array_column($user_list, 'memUid');
            if (!empty($uids)) {
                $uids = array_intersect($uids, $job_uid);
            } else {
                $uids = $job_uid;
            }
        }

        // 按照名称搜索
        if ($memUsername) {
            $user_list = $User->listAll(
                [
                    'memUsername' => $memUsername,
                ]);
            $user_uid = array_column($user_list, 'memUid');
            if (!empty($uids)) {
                $uids = array_intersect($uids, $user_uid);
            } else {
                $uids = $user_uid;
            }
        }

        return $uids;
    }

    /**
     * 根据部门ID集合,角色ID,岗位ID,人员姓名(模糊搜索),人员uids获取查询条件数组
     *
     * @author wangjiayu
     *
     * @param array $dp_ids 部门ID集合
     * @param string $role_id 角色ID
     * @param string $job_id 岗位ID
     * @param string $memUsername 用户名
     * @param array $memUids 用户id集合
     *
     * @return array $conds 组成后的搜索条件数组
     */
    public function list_uids_by_dp_job_role_name($dp_ids = [], $role_id = '', $job_id = '', $memUsername = '',
                                                  $memUids = [])
    {

        // 姓名处理(去除0和%因素)
        $memUsername = !empty($memUsername) ? $memUsername : '';
        $memUsername = str_replace('%', '\%', $memUsername);

        // 组装查询条件
        $conditions = [];

        // 部门查询
        if ($dp_ids) {

            $department = new Department();
            $dpIDs = array_unique($dp_ids);
            sort($dpIDs);
            // 查询子部门
            $department_data = $department->list_childrens_by_cdid($dpIDs, true);
            // 搜索当前部门
            $department_data = array_unique(array_merge($dpIDs, $department_data));
            sort($department_data);

            // 组装查询条件
            $conditions['dpIdList'] = $department_data;
        }

        // 角色查询
        if ($role_id) {

            $role_ids = [$role_id];
            $conditions['roleIdList'] = $role_ids;
        }

        // 岗位查询
        if ($job_id) {

            $job_ids = [$job_id];
            $conditions['jobIdList'] = $job_ids;
        }

        // 按照名称搜索
        if ($memUsername) {

            $conditions['memUsername'] = $memUsername;
        }

        if ($memUids) {

            $conditions['memUids'] = $memUids;
        }

        return $conditions;
    }

    /**
     * 数据导出
     *
     * @param array $list 导出数据
     *              + $title array 表头
     *              + $rows array 数据行
     * @param string $file_name 文件名称
     * @param int $ea_id 管理员ID
     * @param string $username 管理员姓名
     *
     * @return bool
     */
    public function download($list = [], $file_name, $ea_id = 0, $username = '')
    {

        // Excel表头
        $title = $list['title'];
        // Excel数据行
        $rows = $list['rows'];

        // 生成Excel 下载
        $real_path = ExportDownload::get_down_dir($ea_id.microtime(true)) . $file_name . '.xls';

        $ret = PythonExcel::instance()->write($real_path, $title, $rows);

        if ($ret) {
            $conditon = [
                'title' => $file_name,
                'ea_id' => $ea_id,
                'type' => ExportDownload::EXCEL_TYPE,
                'size' => filesize($real_path),
                'url' => $real_path,
                'app_dir' => APP_DIR,
                'username' => $username
            ];

            ExportDownload::insert_down_load($conditon);
        }

        return true;
    }
}