CommentOptionsService.class.php 6.17 KB
<?php
/**
 * 评价选项表Service
 * @author: houyingcai
 * @email:     594609175@qq.com
 * @date :  2017-08-29 16:31:28
 * @version $Id$
 */

namespace Common\Service;

use Common\Model\CommentOptionsModel;
use Common\Model\CompositeScoreModel;

class CommentOptionsService extends AbstractService
{

    // 培训过程
    const OPTION_TYPE_PROCESS = 1;
    // 培训内容
    const OPTION_TYPE_CONTENT = 2;
    // 培训讲师
    const OPTION_TYPE_TEACHER = 3;

    // 评价选项操作:添加
    const OPTION_ADD = 'add';
    // 评价选项操作:编辑
    const OPTION_EDIT = 'edit';
    // 评价选项最多9项
    const OPTION_MAX_COUNT = 9;

    /** @var CommentOptionsModel */
    protected $_d;
    /** @var CompositeScoreModel */
    protected $composite_score_d;

    public function __construct()
    {
        $this->_d = new CommentOptionsModel();
        $this->composite_score_d = new CompositeScoreModel();

        parent::__construct();
    }

    /**
     * 验证评价选项
     *
     * @author houyingcai
     *
     * @param array $data 评价选项数组
     *
     * @return bool
     */
    public function validate_com_opt_list($data = [])
    {
        if (!is_array($data)) {

            E('_ERR_OPTION_INVALID'); // 评价选项参数无效
        }
        if (count($data) > self::OPTION_MAX_COUNT) {

            E('_ERR_OPTION_MAX_COUNT'); // 评价选项最多9项
        }

        // 临时存放选项名称数组,用于判断名称是否有重复
        $temp_option_names = [];
        foreach ($data as $v) {
            if (empty($v['option_name'])) {

                E('_EMPTY_OPTION_NAME');    // 选项名称不能为空
            }

            if (!empty($temp_option_names) && in_array($v['option_name'], $temp_option_names)) {

                E('_ERR_OPTION_NAME_REPEAT'); // 选项名称有重复
            }

            if (empty($v['option_type'])) {

                E('_EMPTY_OPTION_TYPE'); // 评价类型不能为空
            }

            if (!in_array($v['option_type'],
                [self::OPTION_TYPE_PROCESS, self::OPTION_TYPE_CONTENT, self::OPTION_TYPE_TEACHER])
            ) {

                E('_ERR_OPTION_TYPE_INVALID'); // 无效的评价类型
            }

            if (!intval($v['option_score'])) {

                E('_EMPTY_OPTION_SCORE'); // 评价分值不能为空
            }

            $temp_option_names[] = $v['option_name'];
        }

        return true;
    }

    /**
     * 保存评价选项
     *
     * @author houyingcai
     *
     * @param int $ed_id 培训ID
     * @param array $options 评价选项数组
     * @param string $type add:新增(默认),edit:编辑
     *
     * @return bool
     */
    public function save_comment_option($ed_id = 0, $options = [], $type = 'add')
    {
        // 验证参数是否正确
        if (!$ed_id || empty($options) || !is_array($options)) {

            return false;
        }

        if (self::OPTION_EDIT == $type) {

            $this->delete_by_conds(['ed_id' => $ed_id]);
        }

        // 组装数据
        $insert_data = [];
        foreach ($options as $k => &$v) {

            $v['option_order'] = $k + 1;
            $v['option_name'] = !empty($v['option_name']) ? raddslashes($v['option_name']) : '';
            $v['option_type'] = $v['option_type'] ? intval($v['option_type']) : 0;
            $v['option_score'] = $v['option_score'] ? intval($v['option_score']) : 0;

            $insert_data[] = array_merge(['ed_id' => $ed_id], $v);
        }

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

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

                E('_ERR_COMMENT_OPTION_ADD');
            }
        }

        return true;
    }

    /**
     * 获取培训综合评分信息
     * @author wanghuan
     *
     * @param int $ed_id 培训id
     *
     * @return array 综合评分、各评分项综合评分
     */
    public function get_composite_score($ed_id = 0)
    {
        // 综合评分
        $score = 0;
        $composite_cond['ed_id'] = $ed_id;
        // 培训各项综合评分
        $composite_score = $this->composite_score_d->list_by_conds($composite_cond);

        // 评分项总数
        $options_count = count($composite_score);
        // 总数不为0,计算综合评分
        if ($options_count) {
            // 取综合分值列
            $options_score = array_column($composite_score, 'score');
            // 综合分值之和
            $score_sum = array_sum($options_score);

            if ($score_sum) {
                // 综合评分
                $score = round(($score_sum / $options_count), 1);
            }
        }

        // 培训评分项综合分
        $list = [];
        // 查询条件
        $options_cond['ed_id'] = $ed_id;
        // 分页
        $page_option = null;
        // 排序
        $order_option = [
            'option_order' => 'ASC'
        ];
        // 培训评分项
        $options = $this->_d->list_by_conds($options_cond, $page_option, $order_option);

        // 初始化选项总分
        $total_score = 0;

        if (!empty($options)) {
            // 各评分项综合分
            $composite_score = array_combine_by_key($composite_score, 'option_id');

            // 综合评分信息
            $comment_score = 0;
            // 返回数据格式化
            foreach ($options as $key => $val) {

                if (!empty($composite_score)) {

                    $composite = $composite_score[$val['option_id']];
                    $comment_score = $composite['score'];
                }

                $list[$key] = [
                    'option_id' => intval($val['option_id']),
                    'option_name' => $val['option_name'],
                    'option_score' => $val['option_score'],
                    'option_type' => $val['option_type'],
                    'comment_score' => round($comment_score, 1)
                ];

                // 获取选项总分
                $total_score = $val['option_score'];
            }
        }

        return [
            'score' => $score,
            'options_score' => $list,
            'total_score' => $total_score
        ];
    }
}