educode_sales 0.9.95 → 0.9.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/customers_controller.rb +35 -12
- data/app/controllers/educode_sales/sale_trends_controller.rb +14 -0
- data/app/models/educode_sales/user_stat_service.rb +164 -0
- data/app/views/educode_sales/customers/list.json.jbuilder +14 -14
- data/app/views/educode_sales/sale_trends/_user_stat.html.erb +190 -0
- data/app/views/educode_sales/sale_trends/trends.html.erb +6 -0
- data/app/views/educode_sales/sale_trends/user_stat.js.erb +1 -0
- data/config/routes.rb +1 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +9 -7
- data/app/assets/images/educode_sales/indexlogo.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63f1a9066c14a86f9c577ae32986fe5f6887b9a24eff3ceb84eee0bd1f35e645
|
4
|
+
data.tar.gz: 8caaf272560cd43c59c86747910f4f398ee49be736f0b0b00190636d13ddf6b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48235ecc3dbdec34879a9c4e07bcf0ec2c7e9673308e7ff32f878efda9c88305b405d8c3f38848565e5e5a53e8f97d8579fe229c9dd943f15574b3c57f97f477
|
7
|
+
data.tar.gz: dc623573607a70e5ade7dfc55aa4e7f1c18f73d9170d04741ada0c6e2f7e27187978587a3ee068a3a9a2946855082fb680c48e30c8914824fcb0d4617685b189
|
@@ -170,12 +170,33 @@ module EducodeSales
|
|
170
170
|
gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
|
171
171
|
end
|
172
172
|
format.json do
|
173
|
-
@
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
173
|
+
@o = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
|
174
|
+
@customers = School.from("
|
175
|
+
(
|
176
|
+
SELECT m.*, sc.school_business_count, de.department_business_count
|
177
|
+
FROM
|
178
|
+
(
|
179
|
+
SELECT schools.id, departments.id AS department_id, COUNT(department_majors.id) AS major_count
|
180
|
+
FROM schools
|
181
|
+
LEFT JOIN departments ON schools.id = departments.school_id
|
182
|
+
LEFT JOIN department_majors ON department_majors.department_id = departments.id
|
183
|
+
GROUP BY schools.id, departments.id
|
184
|
+
) AS m
|
185
|
+
LEFT JOIN (
|
186
|
+
SELECT schools.id, COUNT(educode_sales_businesses.id) AS school_business_count
|
187
|
+
FROM schools
|
188
|
+
LEFT JOIN educode_sales_businesses ON educode_sales_businesses.school_id = schools.id AND educode_sales_businesses.deleted_at is NULL
|
189
|
+
GROUP BY schools.id
|
190
|
+
) AS sc ON m.id = sc.id
|
191
|
+
LEFT JOIN (
|
192
|
+
SELECT schools.id, departments.id AS department_id, COUNT(d.id) AS department_business_count
|
193
|
+
FROM schools
|
194
|
+
LEFT JOIN departments ON schools.id = departments.school_id
|
195
|
+
LEFT JOIN educode_sales_businesses AS d ON d.department_id = departments.id AND d.deleted_at is NULL
|
196
|
+
GROUP BY schools.id, departments.id
|
197
|
+
) AS de ON m.id = de.id AND m.department_id = de.department_id
|
198
|
+
|
199
|
+
|
179
200
|
) AS s")
|
180
201
|
if @current_admin.is_admin?
|
181
202
|
# @customers = School.all
|
@@ -197,6 +218,8 @@ module EducodeSales
|
|
197
218
|
|
198
219
|
@customers = @customers.select("
|
199
220
|
schools.*,
|
221
|
+
s.school_business_count,
|
222
|
+
s.department_business_count,
|
200
223
|
s.major_count,
|
201
224
|
s.department_id,
|
202
225
|
departments.name AS department_name,
|
@@ -208,9 +231,9 @@ module EducodeSales
|
|
208
231
|
")
|
209
232
|
|
210
233
|
part_a_ids = CustomerFollow.all.pluck(:school_id)
|
211
|
-
part_b_ids = Business.
|
234
|
+
part_b_ids = Business.pluck(:school_id)
|
212
235
|
ids = part_a_ids + part_b_ids + CustomerAdd.all.pluck(:school_id)
|
213
|
-
@customers = @customers.where(id: ids)
|
236
|
+
@customers = @customers.where(id: ids.uniq)
|
214
237
|
if params[:q].present? && params[:q][:name].present?
|
215
238
|
@customers = @customers.where("schools.name like ?", "%#{params[:q][:name]}%")
|
216
239
|
end
|
@@ -316,7 +339,7 @@ module EducodeSales
|
|
316
339
|
else
|
317
340
|
@follow_ups = EducodeSales::CustomerFollow.where(school_id: params[:id])
|
318
341
|
end
|
319
|
-
|
342
|
+
|
320
343
|
@latest = @follow_ups.order(created_at: :desc).first
|
321
344
|
@follow_ups = @follow_ups.order("created_at desc")
|
322
345
|
@follow_ups = @follow_ups.page(params[:page]).per(params[:limit])
|
@@ -419,7 +442,7 @@ module EducodeSales
|
|
419
442
|
end
|
420
443
|
|
421
444
|
SchoolTagMiddle.where(school_id: nil).delete_all
|
422
|
-
|
445
|
+
|
423
446
|
render json: { succcess: true}
|
424
447
|
end
|
425
448
|
|
@@ -432,8 +455,8 @@ module EducodeSales
|
|
432
455
|
department.department_majors.find_by(id: params[:major_id])&.update(name: params[:major]) if params[:major_id].present?
|
433
456
|
end
|
434
457
|
end
|
435
|
-
|
436
|
-
|
458
|
+
|
459
|
+
|
437
460
|
ActiveRecord::Base.transaction do
|
438
461
|
property = SchoolProperty.find_or_create_by!(project_985: params[:project_985].present? ? 1 : 0,
|
439
462
|
project_211: params[:project_211].present? ? 1 : 0,
|
@@ -447,6 +447,20 @@ module EducodeSales
|
|
447
447
|
end
|
448
448
|
end
|
449
449
|
|
450
|
+
def user_stat
|
451
|
+
respond_to do |format|
|
452
|
+
format.html do
|
453
|
+
|
454
|
+
end
|
455
|
+
format.js do
|
456
|
+
user_stat = EducodeSales::UserStatService.new
|
457
|
+
gon.table_1 = user_stat.table_1
|
458
|
+
gon.table_2 = user_stat.table_2(0)
|
459
|
+
gon.table_3 = user_stat.table_2(1)
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
450
464
|
private
|
451
465
|
|
452
466
|
def sale_trend_params
|
@@ -0,0 +1,164 @@
|
|
1
|
+
module EducodeSales
|
2
|
+
class UserStatService
|
3
|
+
|
4
|
+
attr_reader :o_type, :school_ids
|
5
|
+
def initialize
|
6
|
+
@o_type = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
|
7
|
+
|
8
|
+
part_a_ids = EducodeSales::CustomerFollow.all.pluck(:school_id)
|
9
|
+
part_b_ids = EducodeSales::Business.pluck(:school_id)
|
10
|
+
@school_ids = (part_a_ids + part_b_ids + EducodeSales::CustomerAdd.all.pluck(:school_id)).uniq
|
11
|
+
end
|
12
|
+
|
13
|
+
def table_1
|
14
|
+
# 公有云
|
15
|
+
user_years_1 = year_users(1)
|
16
|
+
# 私有云
|
17
|
+
user_years_2 = year_users(2)
|
18
|
+
school_years_1 = school_users(1)
|
19
|
+
school_years_2 = school_users(2)
|
20
|
+
department_years_1 = department_users(1)
|
21
|
+
department_years_2 = department_users(2)
|
22
|
+
|
23
|
+
years = {}
|
24
|
+
(2018..Time.current.year).each do |d|
|
25
|
+
years[d] = {
|
26
|
+
'year' => d,
|
27
|
+
'user_1' => user_years_1[d.to_s] || 0,
|
28
|
+
'user_2' => user_years_2[d.to_s] || 0,
|
29
|
+
'school_1' => school_years_1[d.to_s] || 0,
|
30
|
+
'school_2' => school_years_2[d.to_s] || 0,
|
31
|
+
'department_1' => department_years_1[d.to_s] || 0,
|
32
|
+
'department_2' => department_years_2[d.to_s] || 0
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
years.values
|
37
|
+
end
|
38
|
+
|
39
|
+
def table_2(clazz)
|
40
|
+
users = {'1-9' => [0, 0, 0], '10-99' => [0, 0, 0], '100-999' => [0, 0, 0], '1000-9999' => [0, 0, 0], '10000-49999' => [0, 0, 0] }
|
41
|
+
signed_users = {'1-9' => [0, 0, 0], '10-99' => [0, 0, 0], '100-999' => [0, 0, 0], '1000-9999' => [0, 0, 0], '10000-49999' => [0, 0, 0] }
|
42
|
+
schools(clazz).each do |d|
|
43
|
+
if d[1] <= 9
|
44
|
+
users['1-9'][0] += 1
|
45
|
+
elsif d[1] <= 99
|
46
|
+
users['10-99'][0] += 1
|
47
|
+
elsif d[1] <= 999
|
48
|
+
users['100-999'][0] += 1
|
49
|
+
elsif d[1] <= 9999
|
50
|
+
users['1000-9999'][0] += 1
|
51
|
+
elsif d[1] <= 49999
|
52
|
+
users['10000-49999'][0] += 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
departments(clazz).each do |d|
|
57
|
+
if d[1] <= 9
|
58
|
+
users['1-9'][1] += 1
|
59
|
+
elsif d[1] <= 99
|
60
|
+
users['10-99'][1] += 1
|
61
|
+
elsif d[1] <= 999
|
62
|
+
users['100-999'][1] += 1
|
63
|
+
elsif d[1] <= 9999
|
64
|
+
users['1000-9999'][1] += 1
|
65
|
+
elsif d[1] <= 49999
|
66
|
+
users['10000-49999'][1] += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
signed_schools(clazz).each do |d|
|
71
|
+
if d[1] <= 9
|
72
|
+
signed_users['1-9'][0] += 1
|
73
|
+
elsif d[1] <= 99
|
74
|
+
signed_users['10-99'][0] += 1
|
75
|
+
elsif d[1] <= 999
|
76
|
+
signed_users['100-999'][0] += 1
|
77
|
+
elsif d[1] <= 9999
|
78
|
+
signed_users['1000-9999'][0] += 1
|
79
|
+
elsif d[1] <= 49999
|
80
|
+
signed_users['10000-49999'][0] += 1
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
signed_departments(clazz).each do |d|
|
85
|
+
if d[1] <= 9
|
86
|
+
signed_users['1-9'][1] += 1
|
87
|
+
elsif d[1] <= 99
|
88
|
+
signed_users['10-99'][1] += 1
|
89
|
+
elsif d[1] <= 999
|
90
|
+
signed_users['100-999'][1] += 1
|
91
|
+
elsif d[1] <= 9999
|
92
|
+
signed_users['1000-9999'][1] += 1
|
93
|
+
elsif d[1] <= 49999
|
94
|
+
signed_users['10000-49999'][1] += 1
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
['1-9', '10-99', '100-999', '1000-9999', '10000-49999'].map do |d|
|
100
|
+
{
|
101
|
+
'num' => d,
|
102
|
+
'schools' => users[d][0],
|
103
|
+
'departments' => users[d][1],
|
104
|
+
'majors' => 0,
|
105
|
+
'signed_schools' => signed_users[d][0],
|
106
|
+
'signed_departments' => signed_users[d][1],
|
107
|
+
'signed_majors' => 0,
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def year_users(clazz)
|
113
|
+
EducodeSales::Business.joins(:last_follow_up).
|
114
|
+
joins("join user_extensions ON user_extensions.department_id = educode_sales_businesses.department_id").
|
115
|
+
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
116
|
+
group("DATE_FORMAT(user_extensions.created_at, '%Y')").
|
117
|
+
select("count(*) as count, DATE_FORMAT(user_extensions.created_at, '%Y') as year").
|
118
|
+
distinct.count("user_extensions.id")
|
119
|
+
end
|
120
|
+
|
121
|
+
def school_users(clazz)
|
122
|
+
EducodeSales::Business.joins(:last_follow_up).
|
123
|
+
joins("join schools ON schools.id = educode_sales_businesses.school_id").
|
124
|
+
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
125
|
+
group("DATE_FORMAT(schools.created_at, '%Y')").
|
126
|
+
select("count(*) as count, DATE_FORMAT(schools.created_at, '%Y') as year").
|
127
|
+
distinct.count("school_id")
|
128
|
+
end
|
129
|
+
|
130
|
+
def department_users(clazz)
|
131
|
+
EducodeSales::Business.joins(:last_follow_up).
|
132
|
+
joins("join departments ON departments.id = educode_sales_businesses.department_id").
|
133
|
+
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
134
|
+
group("DATE_FORMAT(departments.created_at, '%Y')").
|
135
|
+
select("count(*) as count, DATE_FORMAT(departments.created_at, '%Y') as year").
|
136
|
+
distinct.count("school_id")
|
137
|
+
end
|
138
|
+
|
139
|
+
def schools(clazz)
|
140
|
+
School.joins("JOIN user_extensions ON schools.id = user_extensions.school_id AND user_extensions.identity = #{clazz}").
|
141
|
+
where(id: @school_ids).group(:id).count
|
142
|
+
end
|
143
|
+
|
144
|
+
def departments(clazz)
|
145
|
+
School.joins("JOIN user_extensions ON schools.id = user_extensions.school_id AND user_extensions.identity = #{clazz}").
|
146
|
+
where(id: @school_ids).group("user_extensions.department_id").count
|
147
|
+
end
|
148
|
+
|
149
|
+
def signed_schools(clazz)
|
150
|
+
School.joins("JOIN user_extensions on schools.id = user_extensions.school_id AND user_extensions.identity = #{clazz}
|
151
|
+
JOIN educode_sales_businesses ON educode_sales_businesses.clazz_id = #{@o_type} AND educode_sales_businesses.school_id = schools.id
|
152
|
+
").where(id: @school_ids).group(:id).distinct.count("user_extensions.id")
|
153
|
+
end
|
154
|
+
|
155
|
+
def signed_departments(clazz)
|
156
|
+
School.joins("JOIN user_extensions on schools.id = user_extensions.school_id AND user_extensions.identity = #{clazz}
|
157
|
+
JOIN educode_sales_businesses ON educode_sales_businesses.clazz_id = #{@o_type} AND educode_sales_businesses.school_id = schools.id
|
158
|
+
").where(id: @school_ids).where("user_extensions.department_id > 0").
|
159
|
+
group("user_extensions.department_id").
|
160
|
+
distinct.count("user_extensions.id")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
|
2
|
+
department_ids = @customers.map(&:department_id).uniq
|
3
|
+
customer_ids = @customers.map(&:id).uniq
|
4
|
+
|
5
|
+
business_ids_group_a = EducodeSales::Business.where(department_id: department_ids).group_by(&:department_id)
|
6
|
+
business_ids_group_b = EducodeSales::Business.where(school_id: customer_ids).group_by(&:school_id)
|
5
7
|
all_follow_ups = EducodeSales::FollowUp.where(business_id: business_ids_group_a.values.flatten.map(&:id) + business_ids_group_b.values.flatten.map(&:id))
|
6
|
-
customer_follows_a = EducodeSales::CustomerFollow.where(department_id:
|
7
|
-
customer_follows_b = EducodeSales::CustomerFollow.where(school_id:
|
8
|
-
all_school_tags = SchoolTag.joins(:school_tag_middles).where(school_tag_middles: { school_id:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
o_business_count_group_b = EducodeSales::Business.where(school_id: @customers.map(&:id)).where("educode_sales_businesses.clazz_id = ?", o).group(:school_id).count
|
13
|
-
all_staffs_group = EducodeSales::CustomerExtension.where(school_id: @customers.map(&:id)).includes(customer_staff: :user).group_by(&:school_id)
|
8
|
+
customer_follows_a = EducodeSales::CustomerFollow.where(department_id: department_ids).group_by(&:department_id)
|
9
|
+
customer_follows_b = EducodeSales::CustomerFollow.where(school_id: customer_ids).group_by(&:school_id)
|
10
|
+
all_school_tags = SchoolTag.joins(:school_tag_middles).where(school_tag_middles: { school_id: customer_ids }).select(:school_id, :name, :for_missions)
|
11
|
+
o_business_count_group_a = EducodeSales::Business.where(department_id: department_ids).where("educode_sales_businesses.clazz_id = ?", @o).group(:department_id).count
|
12
|
+
o_business_count_group_b = EducodeSales::Business.where(school_id: customer_ids).where("educode_sales_businesses.clazz_id = ?", @o).group(:school_id).count
|
13
|
+
all_staffs_group = EducodeSales::CustomerExtension.where(school_id: customer_ids).includes(customer_staff: :user).group_by(&:school_id)
|
14
14
|
|
15
15
|
json.data do
|
16
16
|
json.array! @customers do |d|
|
@@ -35,10 +35,10 @@ json.data do
|
|
35
35
|
json.area d.province
|
36
36
|
json.property all_school_tags.select { |t| t.school_id == d.id && t.for_missions? }.pluck(:name).join("、")
|
37
37
|
if d['department_id']
|
38
|
-
json.business
|
38
|
+
json.business d['department_business_count'] || 0
|
39
39
|
json.o_business o_business_count_group_a[d['department_id']] || 0
|
40
40
|
else
|
41
|
-
json.business
|
41
|
+
json.business d['school_business_count'] || 0
|
42
42
|
json.o_business o_business_count_group_b[d.id] || 0
|
43
43
|
end
|
44
44
|
json.unit "#{d.name}---#{d['department_name']}"
|
@@ -0,0 +1,190 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div id="tab_7" lay-filter="test7">
|
3
|
+
<div class="" style="padding-right: 50px">
|
4
|
+
<table class="layui-hide" id="table_7_year"></table>
|
5
|
+
</div>
|
6
|
+
<div class="" style="padding-right: 50px">
|
7
|
+
<table class="layui-hide" id="table_7_school"></table>
|
8
|
+
</div>
|
9
|
+
<div class="" style="padding-right: 50px">
|
10
|
+
<table class="layui-hide" id="table_7_signed"></table>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<script>
|
15
|
+
layui.use('table', function() {
|
16
|
+
var table = layui.table;
|
17
|
+
|
18
|
+
table.render({
|
19
|
+
elem: '#table_7_year',
|
20
|
+
cols: [
|
21
|
+
[
|
22
|
+
{
|
23
|
+
field: 'year',
|
24
|
+
title: '年份',
|
25
|
+
align: 'center',
|
26
|
+
width: 150,
|
27
|
+
rowspan: 2
|
28
|
+
}
|
29
|
+
, {
|
30
|
+
title: '公有云',
|
31
|
+
align: 'center',
|
32
|
+
width: 220,
|
33
|
+
colspan: 3
|
34
|
+
}, {
|
35
|
+
align: 'center',
|
36
|
+
title: '私有云',
|
37
|
+
colspan: 3
|
38
|
+
}
|
39
|
+
],
|
40
|
+
[{
|
41
|
+
field: 'user_1',
|
42
|
+
title: '用户数',
|
43
|
+
align: 'center',
|
44
|
+
width: 150
|
45
|
+
}, {
|
46
|
+
field: 'school_1',
|
47
|
+
title: '学校数',
|
48
|
+
align: 'center',
|
49
|
+
width: 150
|
50
|
+
}, {
|
51
|
+
field: 'department_1',
|
52
|
+
title: '学院数',
|
53
|
+
align: 'center',
|
54
|
+
width: 150
|
55
|
+
},{
|
56
|
+
field: 'user_2',
|
57
|
+
title: '用户数',
|
58
|
+
align: 'center',
|
59
|
+
width: 150
|
60
|
+
}, {
|
61
|
+
field: 'school_2',
|
62
|
+
title: '学校数',
|
63
|
+
align: 'center',
|
64
|
+
width: 150
|
65
|
+
}, {
|
66
|
+
field: 'department_2',
|
67
|
+
align: 'center',
|
68
|
+
title: '学院数',
|
69
|
+
width: 150
|
70
|
+
}]
|
71
|
+
],
|
72
|
+
data: gon.table_1,
|
73
|
+
page: false
|
74
|
+
});
|
75
|
+
|
76
|
+
table.render({
|
77
|
+
elem: '#table_7_school',
|
78
|
+
cols: [
|
79
|
+
[
|
80
|
+
{
|
81
|
+
field: 'num',
|
82
|
+
title: '用户数分布',
|
83
|
+
align: 'center',
|
84
|
+
width: 150,
|
85
|
+
rowspan: 2
|
86
|
+
}
|
87
|
+
, {
|
88
|
+
title: '客户数',
|
89
|
+
align: 'center',
|
90
|
+
colspan: 3
|
91
|
+
}, {
|
92
|
+
align: 'center',
|
93
|
+
title: '签单客户数',
|
94
|
+
colspan: 3
|
95
|
+
}
|
96
|
+
],
|
97
|
+
[{
|
98
|
+
field: 'schools',
|
99
|
+
title: '学校数',
|
100
|
+
align: 'center',
|
101
|
+
width: 150
|
102
|
+
}, {
|
103
|
+
field: 'departments',
|
104
|
+
title: '学院数',
|
105
|
+
align: 'center',
|
106
|
+
width: 150
|
107
|
+
}, {
|
108
|
+
field: 'majors',
|
109
|
+
title: '专业数',
|
110
|
+
align: 'center',
|
111
|
+
width: 150
|
112
|
+
},{
|
113
|
+
field: 'signed_schools',
|
114
|
+
title: '学校数',
|
115
|
+
align: 'center',
|
116
|
+
width: 150
|
117
|
+
}, {
|
118
|
+
field: 'signed_departments',
|
119
|
+
title: '学院数',
|
120
|
+
align: 'center',
|
121
|
+
width: 150
|
122
|
+
}, {
|
123
|
+
field: 'signed_majors',
|
124
|
+
align: 'center',
|
125
|
+
title: '专业数',
|
126
|
+
width: 150
|
127
|
+
}]
|
128
|
+
],
|
129
|
+
data: gon.table_2,
|
130
|
+
page: false
|
131
|
+
});
|
132
|
+
|
133
|
+
table.render({
|
134
|
+
elem: '#table_7_signed',
|
135
|
+
cols: [
|
136
|
+
[
|
137
|
+
{
|
138
|
+
field: 'num',
|
139
|
+
title: '用户数分布',
|
140
|
+
align: 'center',
|
141
|
+
width: 150,
|
142
|
+
rowspan: 2
|
143
|
+
}
|
144
|
+
, {
|
145
|
+
title: '客户数',
|
146
|
+
align: 'center',
|
147
|
+
colspan: 3
|
148
|
+
}, {
|
149
|
+
align: 'center',
|
150
|
+
title: '签单客户数',
|
151
|
+
colspan: 3
|
152
|
+
}
|
153
|
+
],
|
154
|
+
[{
|
155
|
+
field: 'schools',
|
156
|
+
title: '学校数',
|
157
|
+
align: 'center',
|
158
|
+
width: 150
|
159
|
+
}, {
|
160
|
+
field: 'departments',
|
161
|
+
title: '学院数',
|
162
|
+
align: 'center',
|
163
|
+
width: 150
|
164
|
+
}, {
|
165
|
+
field: 'majors',
|
166
|
+
title: '专业数',
|
167
|
+
align: 'center',
|
168
|
+
width: 150
|
169
|
+
},{
|
170
|
+
field: 'signed_schools',
|
171
|
+
title: '学校数',
|
172
|
+
align: 'center',
|
173
|
+
width: 150
|
174
|
+
}, {
|
175
|
+
field: 'signed_departments',
|
176
|
+
title: '学院数',
|
177
|
+
align: 'center',
|
178
|
+
width: 150
|
179
|
+
}, {
|
180
|
+
field: 'signed_majors',
|
181
|
+
align: 'center',
|
182
|
+
title: '专业数',
|
183
|
+
width: 150
|
184
|
+
}]
|
185
|
+
],
|
186
|
+
data: gon.table_3,
|
187
|
+
page: false
|
188
|
+
});
|
189
|
+
});
|
190
|
+
</script>
|
@@ -6,6 +6,7 @@
|
|
6
6
|
<li class="">商机区域分布</li>
|
7
7
|
<li class="">销售人员跟进分析</li>
|
8
8
|
<li class="">中标预测图</li>
|
9
|
+
<li class="">用户分析</li>
|
9
10
|
</ul>
|
10
11
|
<div class="layui-tab-content">
|
11
12
|
<div class="layui-tab-item layui-show">
|
@@ -234,6 +235,9 @@
|
|
234
235
|
<div class="layui-tab-item">
|
235
236
|
<div id="page_6"></div>
|
236
237
|
</div>
|
238
|
+
<div class="layui-tab-item">
|
239
|
+
<div id="page_7"></div>
|
240
|
+
</div>
|
237
241
|
</div>
|
238
242
|
</div>
|
239
243
|
|
@@ -258,6 +262,8 @@
|
|
258
262
|
loadPage('/missions/sale_trends/sales_followup_analysis')
|
259
263
|
} else if (data.index == 5 && $("#tab_6").length == 0) {
|
260
264
|
loadPage('/missions/sale_trends/goal_forecast')
|
265
|
+
} else if (data.index == 6 && $("#tab_7").length == 0) {
|
266
|
+
loadPage('/missions/sale_trends/user_stat')
|
261
267
|
}
|
262
268
|
});
|
263
269
|
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#page_7").html("<%= j render 'user_stat' %>");
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: educode_sales
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.96
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -105,7 +105,6 @@ files:
|
|
105
105
|
- app/assets/images/educode_sales/icon-login.png
|
106
106
|
- app/assets/images/educode_sales/icon.png
|
107
107
|
- app/assets/images/educode_sales/indexLogo.png
|
108
|
-
- app/assets/images/educode_sales/indexlogo.png
|
109
108
|
- app/assets/images/educode_sales/loading-0.gif
|
110
109
|
- app/assets/images/educode_sales/loading-1.gif
|
111
110
|
- app/assets/images/educode_sales/loading-2.gif
|
@@ -252,6 +251,7 @@ files:
|
|
252
251
|
- app/models/educode_sales/teacher.rb
|
253
252
|
- app/models/educode_sales/teacher_assign_follow.rb
|
254
253
|
- app/models/educode_sales/teacher_follow.rb
|
254
|
+
- app/models/educode_sales/user_stat_service.rb
|
255
255
|
- app/services/return_forecast_service.rb
|
256
256
|
- app/views/educode_sales/activities/_follows.html.erb
|
257
257
|
- app/views/educode_sales/activities/_index.html.erb
|
@@ -525,6 +525,7 @@ files:
|
|
525
525
|
- app/views/educode_sales/sale_trends/_goal_forecast.html.erb
|
526
526
|
- app/views/educode_sales/sale_trends/_sales_analysis.html.erb
|
527
527
|
- app/views/educode_sales/sale_trends/_sales_followup_analysis.html.erb
|
528
|
+
- app/views/educode_sales/sale_trends/_user_stat.html.erb
|
528
529
|
- app/views/educode_sales/sale_trends/business_area.js.erb
|
529
530
|
- app/views/educode_sales/sale_trends/business_followup_analysis.js.erb
|
530
531
|
- app/views/educode_sales/sale_trends/goal_forecast.js.erb
|
@@ -533,6 +534,7 @@ files:
|
|
533
534
|
- app/views/educode_sales/sale_trends/sales_followup_analysis.js.erb
|
534
535
|
- app/views/educode_sales/sale_trends/trends.html.erb
|
535
536
|
- app/views/educode_sales/sale_trends/trends.json.jbuilder
|
537
|
+
- app/views/educode_sales/sale_trends/user_stat.js.erb
|
536
538
|
- app/views/educode_sales/sales/index.html.erb
|
537
539
|
- app/views/educode_sales/sales/index.json.jbuilder
|
538
540
|
- app/views/educode_sales/sales/operations.html.erb
|
@@ -685,7 +687,7 @@ homepage: https://www.educoder.net
|
|
685
687
|
licenses:
|
686
688
|
- MIT
|
687
689
|
metadata: {}
|
688
|
-
post_install_message:
|
690
|
+
post_install_message:
|
689
691
|
rdoc_options: []
|
690
692
|
require_paths:
|
691
693
|
- lib
|
@@ -700,8 +702,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
700
702
|
- !ruby/object:Gem::Version
|
701
703
|
version: '0'
|
702
704
|
requirements: []
|
703
|
-
rubygems_version: 3.0.
|
704
|
-
signing_key:
|
705
|
+
rubygems_version: 3.0.0
|
706
|
+
signing_key:
|
705
707
|
specification_version: 4
|
706
708
|
summary: Summary of EducodeSales.
|
707
709
|
test_files: []
|
Binary file
|