<?php
/**
 * 员工名单表Service
 * @author: houyingcai
 * @email:     594609175@qq.com
 * @date :  2017-08-29 16:35:26
 * @version $Id$
 */

namespace Common\Service;

use Common\Model\RightModel;
use Common\Model\RightUsersModel;

class RightUsersService extends AbstractService
{

    // 用户报名(结果)状态:未报名
    const SIGN_NO = 0;
    // 用户报名(结果)状态:报名成功
    const SIGN_SUCCESS = 1;
    // 用户报名状态:报名待审核
    const SIGN_WAIT_CHECK = 2;
    // 用户报名状态:报名未通过
    const SIGN_UN_PASS = 3;

    // 已报名
    const SIGN_STATUS_SIGNED = 1;
    // 未报名
    const SIGN_STATUS_UN_SIGN = 2;

    // 已支付
    const SIGN_CHARGE_PAY = 1;
    // 未支付
    const SIGN_CHARGE_UN_PAY = 2;

    // 待审核
    const SIGN_CHECK_WAIT = 0;
    // 审核通过
    const SIGN_CHECK_PASS = 1;
    // 审核不通过
    const SIGN_CHECK_UN_PASS = 2;

    /** @var RightUsersModel */
    protected $_d;

    public function __construct()
    {
        // 实例化员工名单model
        $this->_d = new RightUsersModel();
        parent::__construct();
    }

    /**
     * 根据培训权限范围添加保存班级人员
     *
     * @author houyingcai
     * @param int $ed_id 培训ID
     * @param int $is_sign 是否开启报名
     *
     * @return array
     */
    public function save_right_users($ed_id = 0, $is_sign = 0)
    {
        $right_serv = new RightService();
        // 获取权限数据
        $post_data = $right_serv->list_by_conds(['ed_id' => $ed_id]);

        // 格式化权限数据
        $post_right = [];
        $rights = $right_serv->format_db_data($post_data);
        if ($rights[RightService::RIGHT_TYPE_ALL]) {

            $post_right['is_all'] = self::IS_ALL;
        }
        if ($rights[RightService::RIGHT_TYPE_DEPARTMENT]) {

            $post_right['dp_ids'] = $rights[RightService::RIGHT_TYPE_DEPARTMENT];
        }
        if ($rights[RightService::RIGHT_TYPE_TAG]) {

            $post_right['tag_ids'] = $rights[RightService::RIGHT_TYPE_TAG];
        }
        if ($rights[RightService::RIGHT_TYPE_USER]) {

            $post_right['uids'] = $rights[RightService::RIGHT_TYPE_USER];
        }
        if ($rights[RightService::RIGHT_TYPE_JOB]) {

            $post_right['job_ids'] = $rights[RightService::RIGHT_TYPE_JOB];
        }
        if ($rights[RightService::RIGHT_TYPE_ROLE]) {

            $post_right['role_ids'] = $rights[RightService::RIGHT_TYPE_ROLE];
        }

        // 获取所有人员UID
        $uids = $right_serv->list_post_right_uids($post_right);
        // 人员UID去重
        $uids = array_filter(array_unique($uids));

        // 开启报名时,报名状态为未报名,否则为已报名
        $ru_sign_status = $is_sign ? self::SIGN_STATUS_UN_SIGN : self::SIGN_STATUS_SIGNED;
        // 开启报名时,报名时间为初始化,否则为当前时间
        $ru_sign_up_time = $is_sign ? 0 : MILLI_TIME;

        $data = [
            'ed_id' => $ed_id,
            'ru_sign_status' => $ru_sign_status,
            'ru_sign_up_time' => $ru_sign_up_time,
        ];

        $insert_data = [];
        foreach ($uids as $uid) {

            $insert_data[] = array_merge($data, ['ru_uid' => $uid]);
        }

        // 批量插入新增数据
        if (!empty($insert_data)) {

            $row = $this->insert_all($insert_data);
            if (!$row) {

                E('_ERR_RIGHT_USERS_SAVE');
            }
        }

        // 未开启报名时,并且用户不能为空,更新培训表的已报名人数
        if (!$is_sign && !empty($uids)) {

            $education_server = new EducationService();
            $education_server->update($ed_id, ['ed_joined_count' => count($uids)]);
        }

        return $uids;
    }

    /**
     * 根据条件查询班级人员列表
     *
     * @author houyingcai
     * @param array $params 查询条件
     *
     * @return mixed
     */
    public function list_by_right_users($params = [])
    {
        // 分页
        list($start, $limit) = page_limit($params['page'], $params['limit']);

        // 分页参数
        $page_option = [$start, $limit];

        // 发布时间倒序
        $order_option = ['ed_id' => 'ASC'];
        // 组装查询条件
        $conds = $this->get_search_where($params);

        $fields = 'ru_id,ru_uid,ed_id,ru_sign_up_time,ru_sign_status,ru_pay_status,ru_check_status,ru_comments';

        return $this->_d->list_by_conds($conds, $page_option, $order_option, $fields);
    }

    /**
     * 统计班级人员数量
     *
     * @param array $params 查询条件
     *
     * @return number
     */
    public function count_by_right_users($params = [])
    {
        // 组装查询条件
        $conds = $this->get_search_where($params);
        return $this->_d->count_by_conds($conds);
    }

    /**
     * 组装查询条件
     *
     * @author houyingcai
     * @param array $params 查询条件
     *
     * @return array
     */
    public function get_search_where($params = [])
    {
        $conds = [];

        $conds['ed_id'] = $params['ed_id'];

        // 支付状态
        $ru_pay_status = intval($params['ru_pay_status']);
        if (!empty($params['ru_pay_status']) && in_array($ru_pay_status,
                [self::SIGN_CHARGE_PAY, self::SIGN_CHARGE_UN_PAY])
        ) {

            $conds['ru_pay_status'] = $ru_pay_status;
        }
        // 审核状态
        $ru_check_status = intval($params['ru_check_status']);
        if (!empty($params['ru_check_status']) && in_array($ru_check_status,
                [self::SIGN_CHECK_PASS, self::SIGN_CHECK_UN_PASS])
        ) {

            $conds['ru_check_status'] = $ru_check_status;
        }

        // 报名状态
        $ru_sign_status = intval($params['ru_sign_status']);
        if (!empty($params['ru_sign_status']) && in_array($ru_sign_status,
                [self::SIGN_STATUS_SIGNED, self::SIGN_STATUS_UN_SIGN])
        ) {

            $conds['ru_sign_status'] = $ru_sign_status;
        }

        // 报名时间
        if (!empty($params['sign_start_time']) && $params['sign_start_time'] != 'NaN' && !empty($params['sign_end_time']) && $params['sign_end_time'] != 'NaN') {

            $conds['ru_sign_up_time >= ?'] = $params['sign_start_time'];
            $conds['ru_sign_up_time <= ?'] = $params['sign_end_time'];
        }

        // 用户UID
        if (!empty($params['ru_uids'])) {

            $conds['ru_uid in(?)'] = $params['ru_uids'];
        }

        return $conds;
    }

    /**
     * 班级添加人员接口
     *
     * @author caijianhua
     * @param array $params
     *
     * @return mixed
     */
    public function add_user($params = [])
    {

        $ed_id = $params['ed_id'];
        if (empty($ed_id)) {
            // 培训ID不能为空
            E('_EMPTY_EDUCATION_ID');
        }

        $education_ser = New EducationService();
        $education = $education_ser->get($ed_id);

        if (empty($education)) {
            // 培训不存在
            E('_ERR_EDUCATION_NOT_EXIST');
        }

        $education_status = $education_ser->get_ed_status($education);
        // 判断培训状态 如果终止或者结束时,不允许添加班级
        if ($education_status == EducationService::EDUCATION_PROCESS_END || $education_status == EducationService::EDUCATION_PROCESS_STOP) {

            E('_ERR_EDUCATION_STOP_END');
        }

        $user_uids = array_column($params['user_list'], 'memID');
        $user_uids = array_filter(array_unique($user_uids));
        if (empty($user_uids)) {
            // 人员不能为空
            E('_EMPTY_RIGHT_USER');
        }

        // 查询已经添加的人员
        $list = $this->_d->list_by_conds(['ed_id' => $ed_id, 'ru_uid' => $user_uids], null, 'ru_uid');
        $uids = array_column($list, 'ru_uid');

        // 取差集获取新的用户
        $news_uid = array_diff($user_uids, $uids);
        if (empty($news_uid)) {

            return true;
        }

        $user_list = $this->get_all_user_by_cache($news_uid);
        $news_uid = array_column($user_list, 'memUid');

        if (empty($news_uid)) {

            return true;
        }

        // 是否开启报名
        $is_sign = $education['ed_is_sign_up'];
        // 是否开始审核
        $is_check = $education['ed_is_check'];

        // 开启报名时,报名状态为未报名,否则为已报名
        $ru_sign_status = $is_sign ? self::SIGN_STATUS_UN_SIGN : self::SIGN_STATUS_SIGNED;
        // 开启报名时,报名时间为初始化,否则为当前时间
        $ru_sign_up_time = $is_sign ? 0 : MILLI_TIME;
        // 开启报名并且需要手动审核,审核状态为待审核,否则为已审核
        $ru_check_status = $is_sign && $is_check ? self::SIGN_CHECK_WAIT : self::SIGN_CHECK_PASS;

        $data = [
            'ed_id' => $ed_id,
            'ru_sign_status' => $ru_sign_status,
            'ru_check_status' => $ru_check_status,
            'ru_sign_up_time' => $ru_sign_up_time,
        ];

        $insert_data = [];
        foreach ($news_uid as $uid) {

            $insert_data[] = array_merge($data, ['ru_uid' => $uid]);
        }

        try {
            $this->start_trans();

            // 批量插入新增数据
            if (!empty($insert_data)) {

                $this->insert_all($insert_data);
            }

            $conds = ['ed_id' => $ed_id];
            // 查询班级人数
            $count = $this->_d->count_by_conds($conds);

            $update_data = [];

            // 应参与人数
            $update_data['ed_join_count'] = $count;

            // 没有开启报名 参与人数为列表总数
            if (EducationService::EDUCATION_SIGN_CLOSE == $is_sign) {
                // 已参加人数
                $update_data['ed_joined_count'] = $count;
            }
            // 更新数据不为空更新
            if (!empty($update_data)) {

                $education_ser->update_by_conds($conds, $update_data);
            }


            $this->commit();
        } catch (\Exception $e) {

            $this->rollback();
            return false;
        }

        $msg_params = [
            'ed_id' => $ed_id,
            'name' => $education['ed_name'],
            'begin_time' => $education['ed_begin_time'],
            'end_time' => $education['ed_end_time'],
            'address' => $education['ed_address'],
            'img_id' => $education['ed_cover_id'],
            'uids' => $news_uid,
        ];

        $this->send_msg($msg_params, EducationService::MSG_EDUCATION_PUBLISH);

        return true;
    }

    /**
     * 获取用户报名状态
     * @author:wanghuan
     *
     * @param array $education 培训信息
     * @param array $right_users 用户报名数据
     *
     * @return int 用户报名状态
     */
    public function get_sign_up_status($education, $right_users)
    {

        // 默认未报名
        $sign_up_status = self::SIGN_NO;
        // 是否开启报名
        $ed_is_sign_up = $education['ed_is_sign_up'];

        // 未开启报名
        if (EducationService::EDUCATION_SIGN_CLOSE == $ed_is_sign_up) {
            // 报名成功
            $sign_up_status = self::SIGN_SUCCESS;
        }

        // 开启报名
        if (EducationService::EDUCATION_SIGN_OPEN == $ed_is_sign_up) {

            // 报名状态
            $ru_sign_status = $right_users['ru_sign_status'];
            // 支付状态
            $ru_pay_status = $right_users['ru_pay_status'];
            // 审核状态
            $ru_check_status = $right_users['ru_check_status'];

            // 是否收费
            $ed_is_charge = $education['ed_is_charge'];
            // 是否审核
            $ed_is_check = $education['ed_is_check'];

            // 不收费、不审核、状态为已报名
            if (EducationService::EDUCATION_UN_CHARGE == $ed_is_charge && EducationService::EDUCATION_UN_CHECK == $ed_is_check
                && self::SIGN_STATUS_SIGNED == $ru_sign_status
            ) {

                // 报名成功
                $sign_up_status = self::SIGN_SUCCESS;
            }

            // 收费、不审核、状态为已支付
            if (EducationService::EDUCATION_CHARGE == $ed_is_charge && EducationService::EDUCATION_UN_CHECK == $ed_is_check
                && self::SIGN_CHARGE_PAY == $ru_pay_status
            ) {

                // 报名成功
                $sign_up_status = self::SIGN_SUCCESS;
            }

            // 不收费、审核
            if (EducationService::EDUCATION_UN_CHARGE == $ed_is_charge && EducationService::EDUCATION_CHECK == $ed_is_check) {

                // 待审核
                if (self::SIGN_CHECK_WAIT == $ru_check_status && self::SIGN_STATUS_SIGNED == $right_users['ru_sign_status']) {
                    // 报名待审核
                    $sign_up_status = self::SIGN_WAIT_CHECK;
                }

                // 审核通过
                if (self::SIGN_CHECK_PASS == $ru_check_status) {
                    // 报名成功
                    $sign_up_status = self::SIGN_SUCCESS;
                }

                // 审核不通过
                if (self::SIGN_CHECK_UN_PASS == $ru_check_status) {
                    // 报名未通过
                    $sign_up_status = self::SIGN_UN_PASS;
                }
            }
        }

        return $sign_up_status;
    }
}