CompositeScoreService.class.php 7.36 KB
<?php
/**
 * 培训综合评分表Service
 * @author: houyingcai
 * @email:     594609175@qq.com
 * @date :  2017-08-29 16:40:17
 * @version $Id$
 */

namespace Common\Service;

use Common\Model\CommentOptionsModel;
use Common\Model\CommentScoreModel;
use Common\Model\CompositeScoreModel;
use  Common\Model\CommentModel;

class CompositeScoreService extends AbstractService
{
    /** @var CommentOptionsModel */
    protected $comment_opion_d;
    /** @var CommentScoreModel */
    protected $comment_score_d;
    /** @var CommentModel */
    protected $comment_d;

    public function __construct()
    {
        $this->_d = new CompositeScoreModel();
        $this->comment_d = New CommentModel();
        $this->comment_opion_d = New CommentOptionsModel();
        $this->comment_score_d = New CommentScoreModel();
        parent::__construct();
    }

    /**
     * 新增或更新综合评分数据
     * @author:wanghuan
     *
     * @param int $ed_id 培训id
     */
    public function update_composite_score($ed_id = 0)
    {

        // 查询条件
        $cond['ed_id'] = $ed_id;
        // 培训评价评分数据
        $ed_comment_score = $this->comment_score_d->list_by_conds($cond);

        // 统计各评分项总分及评分数量
        $composite = [];
        foreach ($ed_comment_score as $val) {

            $composite[$val['option_id']]['score'] += $val['cs_score'];
            $composite[$val['option_id']]['count'] += 1;
        }

        // 待新增/更新数据
        $data = [];
        $i = 0;
        foreach ($composite as $k => $v) {

            $score = round(($v['score'] / $v['count']), 1);
            $data[$i] = [
                'score' => $score,
                'ed_id' => $ed_id,
                'option_id' => $k
            ];
            $i++;
        }

        // 查询综合评分数据
        $composite_old = $this->_d->list_by_conds($cond);
        // 综合评分数据存在,更新
        if (!empty($composite_old)) {
            // 原有综合评分数据
            $composite_old = array_combine_by_key($composite_old, 'option_id');

            $add_data = [];
            foreach ($data as $key => $value) {

                $composite_info = $composite_old[$value['option_id']];
                // 原数据存在,更新
                if (!empty($composite_info)) {

                    $this->_d->update($composite_info['id'], $value);
                } else { // 原数据不存在,新增
                    // 待新增数据
                    $add_data[$key] = $value;
                }
            }

            // 对比原有数据,筛选需要新增的数据进行插入
            $this->_d->insert_all($add_data);
        } else {
            // 综合评分数据不存在,则全部新增
            $this->_d->insert_all($data);
        }
    }

    /**
     * 培训综合评分接口
     *
     * @author 蔡建华
     *
     * @param $ed_id int 培训ID
     *
     * @return array
     */
    public function overall_rating($ed_id = 0)
    {
        // 查询整体总分
        $conds = ['ed_id' => $ed_id];
        // 获取整体总分总和
        $composite = $this->_d->get_score($conds, 'sum(score)');
        // 总条数
        $composite_total = $this->_d->count_by_conds($conds);
        // 评分总人数
        $total = $this->comment_d->count_by_conds($conds);

        // 整体评分
        if ($total) {
            // 计算整体平均分
            $total_score = round($composite / $composite_total, 1);
        } else {
            $total_score = '';
        }

        $order_option = [
            'option_order' => 'ASC'
        ];

        // 查询评分选项
        $option = $this->comment_opion_d->list_by_conds($conds, null, $order_option,
            'option_id,option_name,option_score');

        // 评价平均分
        $comment_score = $this->comment_score_d->list_group_score($conds,
            'option_id,sum(cs_score) as t_score', 'option_id');

        $comment_score = array_combine_by_key($comment_score, 'option_id');
        // 综合评分列表
        $average_list = [];

        foreach ($option as $key => $val) {
            // 初始化数据组装
            $value = [
                'option_name' => $val['option_name'],
                'option_score' => $val['option_score'],
                'average_score' => 0
            ];
            if (array_key_exists($val['option_id'], $comment_score)) {
                // 平均分分数存在
                $average_score = round($comment_score[$val['option_id']]['t_score'] / $total, 1);
            } else {
                $average_score = 0;
            }
            $value['average_score'] = $average_score;
            $average_list[$key] = $value;
        }

        // 评分统计参与人数
        $list_score = $this->comment_score_d->list_by_conds($conds);

        // 获取评价项最大分值
        $option_score = intval($option[0]['option_score']);

        $rectangle_list = $this->rectangle_data($list_score, $option, $option_score);

        return [
            'total_score' => $total_score,// 整体评分
            'average_list' => $average_list,
            'rectangle_list' => $rectangle_list,
            'option_score' => $option_score
        ];
    }

    /**
     *  评分统计参与人数
     *
     * @param $list_score array 评分数据
     * @param $option  array 评分选项
     * @param $option_score  int 最大分值
     *
     * @return array
     */
    protected function rectangle_data($list_score, $option, $option_score)
    {

        // 初始化选项值数据
        $data = [];

        // 获取选项IDS
        $option_ids = array_column($option, 'option_id');

        // 初始化分数数组
        $data_score_list = [];
        for ($i = 0; $i <= $option_score; $i = $i + 0.5) {
            // 初始化
            $data_score_list[] = $i;
        }

        // 遍历选项 因数组对小数支持不太好故此成10转换为整数
        foreach ($option_ids as $id) {
            // 遍历平分数据
            foreach ($list_score as $v) {
                // 如果是一个选项的
                if ($id == $v['option_id']) {
                    // 如果当前分数的数据存在则+1
                    if (!empty($data[$v['option_id']][$v['cs_score'] * 10])) {
                        $data[$v['option_id']][$v['cs_score']* 10] = intval($data[$v['option_id']][$v['cs_score'] * 10]) + 1;
                    } else {
                        // 如果当前分数数据不存在
                        $data[$v['option_id']][$v['cs_score'] * 10] = 1;
                    }
                }
            }
        }

        // 初始化返回值数据
        $arr = [];
        // 选项名称
        $name = array_column($option, 'option_name');

        // 遍历选项数组
        foreach ($option as $key => $val) {
            // 初始化数据
            $list = [];
            // 遍历分数数组拼接数据
            foreach ($data_score_list as $value) {
                // 如果数据存在
                if (!empty($data[$val['option_id']][$value * 10])) {
                    $list[] = $data[$val['option_id']][$value * 10];
                } else {
                    // 初始化数据
                    $list[] = 0;
                }
            }

            $arr[$key] = $list;
        }
        
        return ['name' => $name, 'value' => $arr];
    }
}