CompositeScoreService.class.php
7.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<?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];
}
}