educode_sales 0.9.96 → 0.9.98
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/businesses_controller.rb +31 -1
- data/app/controllers/educode_sales/home_controller.rb +13 -0
- data/app/controllers/educode_sales/sale_trends_controller.rb +4 -4
- data/app/models/educode_sales/business.rb +4 -0
- data/app/models/educode_sales/user_stat_service.rb +32 -10
- data/app/views/educode_sales/businesses/edit.html.erb +145 -3
- data/app/views/educode_sales/contracts/_list.html.erb +7 -1
- data/app/views/educode_sales/contracts/index.json.jbuilder +1 -1
- data/app/views/educode_sales/home/search_activity.json.jbuilder +8 -0
- data/app/views/educode_sales/home/search_customer.json.jbuilder +8 -0
- data/app/views/educode_sales/sale_trends/_user_stat.html.erb +73 -27
- data/config/routes.rb +2 -0
- data/db/migrate/20230520023902_add_activity_educode_sales_business.rb +13 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc83991c421ec745be1b0b4e1b78bd38327b29c3463e1ed43e0253a602305ffa
|
4
|
+
data.tar.gz: 237c8dfda5375b0ca1fdf8672361890f2acbb2054fa974b089d41de26fbbb130
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5798c8ef35a26bbd366b2ff2e5fcca79a16d55984ba9a13ae4a2d9b2161bdd1bd45bd285b914f8b9bfa11c1e10b3f4d1d7114fb18c086065562f85afe71cfbaf
|
7
|
+
data.tar.gz: 2469abce54faa1b52c5431a276ee01752829fb3e399c1831f6d33a84ef5b52aed43abb6980baf679afd3fd3d00dbc5a032ef4eb5157cf77469b7527c71de575b
|
@@ -428,6 +428,33 @@ module EducodeSales
|
|
428
428
|
gon.watche_ids = Staff.all.map { |d| {name: d.user&.real_name, value: d.id, selected: staff_ids.include?(d.id)}}
|
429
429
|
gon.department = {value: @business.department_id, name: "#{@business.department&.school&.name}-#{@business.department&.name}"}
|
430
430
|
gon.value = @business.department_id
|
431
|
+
|
432
|
+
|
433
|
+
|
434
|
+
if @business.activity
|
435
|
+
gon.activity = [{value: @business.activity_id, name: @business.activity.name}]
|
436
|
+
gon.activity_id = @business.activity_id
|
437
|
+
else
|
438
|
+
gon.activity = []
|
439
|
+
gon.activity_id = ''
|
440
|
+
end
|
441
|
+
|
442
|
+
if @business.place
|
443
|
+
gon.place = [{value: @business.place_id, name: @business.place.name}]
|
444
|
+
gon.place_id = @business.place_id
|
445
|
+
else
|
446
|
+
gon.place = []
|
447
|
+
gon.place_id = ''
|
448
|
+
end
|
449
|
+
|
450
|
+
if @business.customer
|
451
|
+
gon.customer = [{value: @business.customer_id, name: "#{@business.customer.school.name} #{@business.customer.name}"}]
|
452
|
+
gon.customer_id = @business.customer_id
|
453
|
+
else
|
454
|
+
gon.customer = []
|
455
|
+
gon.customer_id = ''
|
456
|
+
end
|
457
|
+
|
431
458
|
render layout: false
|
432
459
|
end
|
433
460
|
|
@@ -454,7 +481,10 @@ module EducodeSales
|
|
454
481
|
end
|
455
482
|
end
|
456
483
|
|
457
|
-
if business.update(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id
|
484
|
+
if business.update(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id,
|
485
|
+
activity_id: params[:activity_id], place_id: params[:place_id], customer_id: params[:customer_id],
|
486
|
+
company_source: params[:company_source], phone: params[:phone], email: params[:email], partner: params[:partner], invite_info: params[:invite_info], friend: params[:friend]
|
487
|
+
)
|
458
488
|
if params[:merge_business_ids].present?
|
459
489
|
merge_business = Business.where(id: params[:merge_business_ids].split(","))
|
460
490
|
merge_business.each do |b|
|
@@ -92,5 +92,18 @@ module EducodeSales
|
|
92
92
|
@places = @places.page(params[:page]).per(10)
|
93
93
|
end
|
94
94
|
|
95
|
+
|
96
|
+
def search_activity
|
97
|
+
@data = Activity.where("name like ?", "%#{params[:q]}%").limit(20)
|
98
|
+
end
|
99
|
+
|
100
|
+
def search_customer
|
101
|
+
part_a_ids = EducodeSales::CustomerFollow.all.pluck(:school_id)
|
102
|
+
part_b_ids = EducodeSales::Business.pluck(:school_id)
|
103
|
+
school_ids = (part_a_ids + part_b_ids + EducodeSales::CustomerAdd.all.pluck(:school_id)).uniq
|
104
|
+
@data = Department.joins(:school).where("schools.name like ?", "%#{params[:q]}%").where("schools.id in (?)", school_ids).limit(20)
|
105
|
+
p @data
|
106
|
+
end
|
107
|
+
|
95
108
|
end
|
96
109
|
end
|
@@ -173,7 +173,7 @@ module EducodeSales
|
|
173
173
|
def sales_analysis
|
174
174
|
respond_to do |format|
|
175
175
|
format.html do
|
176
|
-
|
176
|
+
|
177
177
|
end
|
178
178
|
format.js do
|
179
179
|
x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
@@ -455,8 +455,8 @@ module EducodeSales
|
|
455
455
|
format.js do
|
456
456
|
user_stat = EducodeSales::UserStatService.new
|
457
457
|
gon.table_1 = user_stat.table_1
|
458
|
-
gon.table_2 = user_stat.table_2(
|
459
|
-
gon.table_3 = user_stat.table_2(
|
458
|
+
gon.table_2 = user_stat.table_2(1)
|
459
|
+
gon.table_3 = user_stat.table_2(0)
|
460
460
|
end
|
461
461
|
end
|
462
462
|
end
|
@@ -511,7 +511,7 @@ module EducodeSales
|
|
511
511
|
if params[:property].present?
|
512
512
|
# 客户类型
|
513
513
|
business = business.joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:property])
|
514
|
-
end
|
514
|
+
end
|
515
515
|
|
516
516
|
data_1 = business.
|
517
517
|
where("educode_sales_follow_ups.clazz_id != ?", x).
|
@@ -12,6 +12,10 @@ module EducodeSales
|
|
12
12
|
belongs_to :p_sale_staff, class_name: 'Staff', optional: true
|
13
13
|
belongs_to :p_deleter, class_name: 'Staff', optional: true
|
14
14
|
|
15
|
+
belongs_to :place, class_name: 'Place', optional: true
|
16
|
+
belongs_to :customer, class_name: 'Department', optional: true
|
17
|
+
belongs_to :activity, class_name: 'Activity', optional: true
|
18
|
+
|
15
19
|
has_many :sale_plans
|
16
20
|
has_many :follow_ups
|
17
21
|
has_many :business_clazz_changes
|
@@ -12,23 +12,23 @@ module EducodeSales
|
|
12
12
|
|
13
13
|
def table_1
|
14
14
|
# 公有云
|
15
|
-
user_years_1 =
|
15
|
+
user_years_1 = public_user
|
16
16
|
# 私有云
|
17
|
-
user_years_2 = year_users(2)
|
18
|
-
school_years_1 =
|
19
|
-
school_years_2 = school_users(2)
|
20
|
-
department_years_1 =
|
21
|
-
department_years_2 = department_users(2)
|
17
|
+
user_years_2 = {} #year_users(2)
|
18
|
+
school_years_1 = public_school
|
19
|
+
school_years_2 = {}# school_users(2)
|
20
|
+
department_years_1 = public_department
|
21
|
+
department_years_2 = {} #department_users(2)
|
22
22
|
|
23
23
|
years = {}
|
24
24
|
(2018..Time.current.year).each do |d|
|
25
25
|
years[d] = {
|
26
26
|
'year' => d,
|
27
|
-
'user_1' => user_years_1[d.to_s] || 0,
|
27
|
+
'user_1' => (user_years_1[d.to_s] || 0) + (years[d-1] && years[d-1]['user_1']).to_i,
|
28
28
|
'user_2' => user_years_2[d.to_s] || 0,
|
29
|
-
'school_1' => school_years_1[d.to_s] || 0,
|
29
|
+
'school_1' => (school_years_1[d.to_s] || 0) + (years[d-1] && years[d-1]['school_1']).to_i,
|
30
30
|
'school_2' => school_years_2[d.to_s] || 0,
|
31
|
-
'department_1' => department_years_1[d.to_s] || 0,
|
31
|
+
'department_1' => (department_years_1[d.to_s] || 0) + (years[d-1] && years[d-1]['department_1']).to_i,
|
32
32
|
'department_2' => department_years_2[d.to_s] || 0
|
33
33
|
}
|
34
34
|
end
|
@@ -94,7 +94,7 @@ module EducodeSales
|
|
94
94
|
signed_users['10000-49999'][1] += 1
|
95
95
|
end
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
|
99
99
|
['1-9', '10-99', '100-999', '1000-9999', '10000-49999'].map do |d|
|
100
100
|
{
|
@@ -109,10 +109,30 @@ module EducodeSales
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
+
|
113
|
+
def public_user
|
114
|
+
UserExtension.where(school_id: @school_ids).
|
115
|
+
group("DATE_FORMAT(user_extensions.created_at, '%Y')").
|
116
|
+
select("count(*) as count, DATE_FORMAT(user_extensions.created_at, '%Y') as year").count("*")
|
117
|
+
end
|
118
|
+
|
119
|
+
def public_school
|
120
|
+
School.where(id: @school_ids).
|
121
|
+
group("DATE_FORMAT(schools.created_at, '%Y')").
|
122
|
+
select("count(*) as count, DATE_FORMAT(schools.created_at, '%Y') as year").count("*")
|
123
|
+
end
|
124
|
+
|
125
|
+
def public_department
|
126
|
+
Department.where(school_id: @school_ids).
|
127
|
+
group("DATE_FORMAT(departments.created_at, '%Y')").
|
128
|
+
select("count(*) as count, DATE_FORMAT(departments.created_at, '%Y') as year").count("*")
|
129
|
+
end
|
130
|
+
|
112
131
|
def year_users(clazz)
|
113
132
|
EducodeSales::Business.joins(:last_follow_up).
|
114
133
|
joins("join user_extensions ON user_extensions.department_id = educode_sales_businesses.department_id").
|
115
134
|
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
135
|
+
where(school_id: @school_ids).
|
116
136
|
group("DATE_FORMAT(user_extensions.created_at, '%Y')").
|
117
137
|
select("count(*) as count, DATE_FORMAT(user_extensions.created_at, '%Y') as year").
|
118
138
|
distinct.count("user_extensions.id")
|
@@ -122,6 +142,7 @@ module EducodeSales
|
|
122
142
|
EducodeSales::Business.joins(:last_follow_up).
|
123
143
|
joins("join schools ON schools.id = educode_sales_businesses.school_id").
|
124
144
|
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
145
|
+
where(school_id: @school_ids).
|
125
146
|
group("DATE_FORMAT(schools.created_at, '%Y')").
|
126
147
|
select("count(*) as count, DATE_FORMAT(schools.created_at, '%Y') as year").
|
127
148
|
distinct.count("school_id")
|
@@ -131,6 +152,7 @@ module EducodeSales
|
|
131
152
|
EducodeSales::Business.joins(:last_follow_up).
|
132
153
|
joins("join departments ON departments.id = educode_sales_businesses.department_id").
|
133
154
|
where("educode_sales_follow_ups.o_business_deployment = #{clazz}").
|
155
|
+
where(school_id: @school_ids).
|
134
156
|
group("DATE_FORMAT(departments.created_at, '%Y')").
|
135
157
|
select("count(*) as count, DATE_FORMAT(departments.created_at, '%Y') as year").
|
136
158
|
distinct.count("school_id")
|
@@ -16,12 +16,68 @@
|
|
16
16
|
</div>
|
17
17
|
<br>
|
18
18
|
<div class="layui-inline" style="padding-top: 20px">
|
19
|
-
<label class="layui-form-label ">商机来源</label>
|
20
|
-
<input id="source" type="text" name="source" autocomplete="off"
|
19
|
+
<label class="layui-form-label required">商机来源</label>
|
20
|
+
<input id="source" type="text" name="source" autocomplete="off" lay-verify="required" class="layui-input" value="<%=@business.source %>" style="width: 300px;" placeholder="请输入商机来源">
|
21
21
|
</div>
|
22
22
|
<div class="layui-inline" style="padding-top: 20px">
|
23
23
|
<p style="padding-left: 40px">请填写提供本商机的人名(如‘张明’);如果为非头歌用户,请增加单位信息(如‘张明,华为公司’)</p>
|
24
24
|
</div>
|
25
|
+
<div class="layui-form-item" style="padding-top: 20px">
|
26
|
+
<label class="layui-form-label">会议活动</label>
|
27
|
+
<div class="layui-input-inline" style="line-height: 38px;">
|
28
|
+
<div id="activity" style="width: 300px"></div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="layui-form-item">
|
32
|
+
<label class="layui-form-label">渠道代理:</label>
|
33
|
+
<div class="layui-input-inline" style="line-height: 38px;">
|
34
|
+
<div id="place" style="width: 300px"></div>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<div class="layui-form-item">
|
38
|
+
<label class="layui-form-label">客户</label>
|
39
|
+
<div class="layui-input-inline" style="line-height: 38px;">
|
40
|
+
<div id="customer" style="width: 300px"></div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
<div class="layui-inline">
|
44
|
+
<label class="layui-form-label">公司资源</label>
|
45
|
+
<div class="layui-input-block">
|
46
|
+
<input type="text" name="company_source" autocomplete="off" class="layui-input" value="<%= @business.company_source %>">
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
<div class="layui-inline">
|
50
|
+
<label class="layui-form-label">400电话</label>
|
51
|
+
<div class="layui-input-block">
|
52
|
+
<input type="text" name="phone" autocomplete="off" class="layui-input" value="<%= @business.phone %>">
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
<div class="layui-inline">
|
56
|
+
<label class="layui-form-label">商务邮箱</label>
|
57
|
+
<div class="layui-input-block">
|
58
|
+
<input type="text" name="email" autocomplete="off" class="layui-input" value="<%= @business.email %>">
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div class="layui-inline">
|
63
|
+
<label class="layui-form-label">合作伙伴</label>
|
64
|
+
<div class="layui-input-block">
|
65
|
+
<input type="text" name="partner" autocomplete="off" class="layui-input" value="<%= @business.partner %>">
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
<div class="layui-inline">
|
69
|
+
<label class="layui-form-label">招标信息</label>
|
70
|
+
<div class="layui-input-block">
|
71
|
+
<input type="text" name="invite_info" autocomplete="off" class="layui-input" value="<%= @business.invite_info %>">
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
|
75
|
+
<div class="layui-inline">
|
76
|
+
<label class="layui-form-label">朋友</label>
|
77
|
+
<div class="layui-input-block">
|
78
|
+
<input type="text" name="friend" autocomplete="off" class="layui-input" value="<%= @business.friend %>">
|
79
|
+
</div>
|
80
|
+
</div>
|
25
81
|
<% if can?(:merge_business, EducodeSales::Business) %>
|
26
82
|
<div class="layui-inline-block" style="padding-top: 20px">
|
27
83
|
<label class="layui-form-label ">合并商机</label>
|
@@ -133,6 +189,90 @@
|
|
133
189
|
data: []
|
134
190
|
})
|
135
191
|
|
192
|
+
var activity_id = gon.activity_id;
|
193
|
+
var activity_select = selectInput.render({
|
194
|
+
elem: '#activity',
|
195
|
+
name: 'activity_id', // 渲染的input的name值
|
196
|
+
layFilter: 'test', //同layui form参数lay-filter
|
197
|
+
// layVerify: 'required', //同layui form参数lay-verify
|
198
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
199
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
200
|
+
initValue: gon.activity_id, // 渲染初始化默认值
|
201
|
+
hasSelectIcon: false,
|
202
|
+
placeholder: '请输入会议活动', // 渲染的inputplaceholder值
|
203
|
+
data: gon.activity,
|
204
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
205
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
206
|
+
if (!value) {
|
207
|
+
activity_id = "";
|
208
|
+
return cb([]);
|
209
|
+
}
|
210
|
+
request.get('missions/search_activity?q=' + value, {}, function (res) {
|
211
|
+
if (res.data.length == 0) {
|
212
|
+
activity_select.emptyValue();
|
213
|
+
return cb([])
|
214
|
+
}
|
215
|
+
return cb(res)
|
216
|
+
})
|
217
|
+
}
|
218
|
+
});
|
219
|
+
|
220
|
+
var place_id = gon.place_id;
|
221
|
+
var place_select = selectInput.render({
|
222
|
+
elem: '#place',
|
223
|
+
name: 'place_id', // 渲染的input的name值
|
224
|
+
layFilter: 'test', //同layui form参数lay-filter
|
225
|
+
// layVerify: 'required', //同layui form参数lay-verify
|
226
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
227
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
228
|
+
initValue: gon.place_id, // 渲染初始化默认值
|
229
|
+
hasSelectIcon: false,
|
230
|
+
placeholder: '请输入渠道代理', // 渲染的inputplaceholder值
|
231
|
+
data: gon.place,
|
232
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
233
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
234
|
+
if (!value) {
|
235
|
+
place_id = "";
|
236
|
+
return cb([]);
|
237
|
+
}
|
238
|
+
request.get('missions/sales_place?q=' + value, {}, function (res) {
|
239
|
+
if (res.data.length == 0) {
|
240
|
+
place_select.emptyValue();
|
241
|
+
return cb([])
|
242
|
+
}
|
243
|
+
return cb(res)
|
244
|
+
})
|
245
|
+
}
|
246
|
+
});
|
247
|
+
|
248
|
+
var customer_id = gon.customer_id;
|
249
|
+
var customer_select = selectInput.render({
|
250
|
+
elem: '#customer',
|
251
|
+
name: 'customer_id', // 渲染的input的name值
|
252
|
+
layFilter: 'test', //同layui form参数lay-filter
|
253
|
+
// layVerify: 'required', //同layui form参数lay-verify
|
254
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
255
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
256
|
+
initValue: gon.customer_id, // 渲染初始化默认值
|
257
|
+
hasSelectIcon: false,
|
258
|
+
placeholder: '请输入客户', // 渲染的inputplaceholder值
|
259
|
+
data: gon.customer,
|
260
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
261
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
262
|
+
if (!value) {
|
263
|
+
customer_id = "";
|
264
|
+
return cb([]);
|
265
|
+
}
|
266
|
+
request.get('missions/search_customer?q=' + value, {}, function (res) {
|
267
|
+
if (res.data.length == 0) {
|
268
|
+
customer_select.emptyValue();
|
269
|
+
return cb([])
|
270
|
+
}
|
271
|
+
return cb(res)
|
272
|
+
})
|
273
|
+
}
|
274
|
+
});
|
275
|
+
|
136
276
|
// 当前弹出层,防止ID被覆盖
|
137
277
|
var parentIndex = layer.index;
|
138
278
|
|
@@ -143,9 +283,11 @@
|
|
143
283
|
return false;
|
144
284
|
} else {
|
145
285
|
var field = data.field;
|
146
|
-
console.log('field', field)
|
147
286
|
field.department_id = department.getValue() || department_id;
|
148
287
|
field.merge_business_ids = data.field.merge_business_ids;
|
288
|
+
field.activity_id = activity_select.getValue() || activity_id;
|
289
|
+
field.place_id = place_select.getValue() || place_id;
|
290
|
+
field.customer_id = customer_select.getValue() || customer_id;
|
149
291
|
request.authPut("missions/businesses/" + parent.id, field, function (res) {
|
150
292
|
if (res.success == false) {
|
151
293
|
layer.alert(res.msg)
|
@@ -57,7 +57,7 @@
|
|
57
57
|
<%= select_tag "business_year", options_for_select((2015..Time.now.year).to_a.reverse, params[:business_year]), { include_blank: true } %>
|
58
58
|
</div>
|
59
59
|
</div>
|
60
|
-
|
60
|
+
|
61
61
|
<div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
62
62
|
<label class="layui-form-label">中标时间</label>
|
63
63
|
<div class="layui-input-inline">
|
@@ -349,6 +349,12 @@
|
|
349
349
|
title: '部署类型',
|
350
350
|
sort: true,
|
351
351
|
},
|
352
|
+
{
|
353
|
+
field: 'p_deploy_time',
|
354
|
+
width: 150,
|
355
|
+
title: '部署时间',
|
356
|
+
sort: true,
|
357
|
+
},
|
352
358
|
{
|
353
359
|
field: 'budget_amount',
|
354
360
|
width: 105,
|
@@ -25,7 +25,7 @@ json.data do
|
|
25
25
|
json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
|
26
26
|
json.created_at d.created_at.to_s
|
27
27
|
json.no_followup_days (d['latest_time'] ? DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d['latest_time'].strftime("%Y-%m-%d")) : DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d.created_at.strftime("%Y-%m-%d"))).to_i
|
28
|
-
|
28
|
+
|
29
29
|
json.staff_manages d.last_follow_up&.assign_follow_ups.present? ? (d.last_follow_up.assign_follow_ups.map{ |d| d.staff.user.real_name}.join("、")) : d.staff&.user&.real_name
|
30
30
|
json.divide_rate d.divide_rate
|
31
31
|
json.divide_money d.divide_amount.to_f.round(2)
|
@@ -3,10 +3,10 @@
|
|
3
3
|
<div class="" style="padding-right: 50px">
|
4
4
|
<table class="layui-hide" id="table_7_year"></table>
|
5
5
|
</div>
|
6
|
-
<div class="" style="padding-right: 50px">
|
6
|
+
<div class="" style="padding-right: 50px;margin-top:30px;">
|
7
7
|
<table class="layui-hide" id="table_7_school"></table>
|
8
8
|
</div>
|
9
|
-
<div class="" style="padding-right: 50px">
|
9
|
+
<div class="" style="padding-right: 50px;margin-top:30px;">
|
10
10
|
<table class="layui-hide" id="table_7_signed"></table>
|
11
11
|
</div>
|
12
12
|
</div>
|
@@ -24,13 +24,18 @@
|
|
24
24
|
title: '年份',
|
25
25
|
align: 'center',
|
26
26
|
width: 150,
|
27
|
-
rowspan: 2
|
28
|
-
|
27
|
+
rowspan: 2,
|
28
|
+
totalRowText:'合计',
|
29
|
+
}
|
29
30
|
, {
|
30
31
|
title: '公有云',
|
31
32
|
align: 'center',
|
32
33
|
width: 220,
|
33
34
|
colspan: 3
|
35
|
+
}, {
|
36
|
+
align: 'center',
|
37
|
+
title: '混合云',
|
38
|
+
colspan: 3
|
34
39
|
}, {
|
35
40
|
align: 'center',
|
36
41
|
title: '私有云',
|
@@ -41,40 +46,66 @@
|
|
41
46
|
field: 'user_1',
|
42
47
|
title: '用户数',
|
43
48
|
align: 'center',
|
44
|
-
width:
|
49
|
+
width: 110,
|
50
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
45
51
|
}, {
|
46
52
|
field: 'school_1',
|
47
53
|
title: '学校数',
|
48
54
|
align: 'center',
|
49
|
-
width:
|
55
|
+
width: 110,
|
56
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
50
57
|
}, {
|
51
58
|
field: 'department_1',
|
52
59
|
title: '学院数',
|
53
60
|
align: 'center',
|
54
|
-
width:
|
61
|
+
width: 110,
|
62
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
55
63
|
},{
|
56
64
|
field: 'user_2',
|
57
65
|
title: '用户数',
|
58
66
|
align: 'center',
|
59
|
-
width:
|
67
|
+
width: 110,
|
68
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
60
69
|
}, {
|
61
70
|
field: 'school_2',
|
62
71
|
title: '学校数',
|
63
72
|
align: 'center',
|
64
|
-
width:
|
73
|
+
width: 110,
|
74
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
65
75
|
}, {
|
66
76
|
field: 'department_2',
|
67
77
|
align: 'center',
|
68
78
|
title: '学院数',
|
69
|
-
width:
|
79
|
+
width: 110,
|
80
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
81
|
+
},{
|
82
|
+
field: 'user_2',
|
83
|
+
title: '用户数',
|
84
|
+
align: 'center',
|
85
|
+
width: 110,
|
86
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
87
|
+
}, {
|
88
|
+
field: 'school_2',
|
89
|
+
title: '学校数',
|
90
|
+
align: 'center',
|
91
|
+
width: 110,
|
92
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
93
|
+
}, {
|
94
|
+
field: 'department_2',
|
95
|
+
align: 'center',
|
96
|
+
title: '学院数',
|
97
|
+
width: 110,
|
98
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
70
99
|
}]
|
71
100
|
],
|
72
101
|
data: gon.table_1,
|
102
|
+
totalRow: true,
|
73
103
|
page: false
|
74
104
|
});
|
75
105
|
|
76
106
|
table.render({
|
77
107
|
elem: '#table_7_school',
|
108
|
+
totalRow: true,
|
78
109
|
cols: [
|
79
110
|
[
|
80
111
|
{
|
@@ -82,8 +113,9 @@
|
|
82
113
|
title: '用户数分布',
|
83
114
|
align: 'center',
|
84
115
|
width: 150,
|
85
|
-
rowspan: 2
|
86
|
-
|
116
|
+
rowspan: 2,
|
117
|
+
totalRowText:'合计',
|
118
|
+
}
|
87
119
|
, {
|
88
120
|
title: '客户数',
|
89
121
|
align: 'center',
|
@@ -98,32 +130,38 @@
|
|
98
130
|
field: 'schools',
|
99
131
|
title: '学校数',
|
100
132
|
align: 'center',
|
101
|
-
width: 150
|
133
|
+
width: 150,
|
134
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
102
135
|
}, {
|
103
136
|
field: 'departments',
|
104
137
|
title: '学院数',
|
105
138
|
align: 'center',
|
106
|
-
width: 150
|
139
|
+
width: 150,
|
140
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
107
141
|
}, {
|
108
142
|
field: 'majors',
|
109
143
|
title: '专业数',
|
110
144
|
align: 'center',
|
111
|
-
width: 150
|
145
|
+
width: 150,
|
146
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
112
147
|
},{
|
113
148
|
field: 'signed_schools',
|
114
149
|
title: '学校数',
|
115
150
|
align: 'center',
|
116
|
-
width: 150
|
151
|
+
width: 150,
|
152
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
117
153
|
}, {
|
118
154
|
field: 'signed_departments',
|
119
155
|
title: '学院数',
|
120
156
|
align: 'center',
|
121
|
-
width: 150
|
157
|
+
width: 150,
|
158
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
122
159
|
}, {
|
123
160
|
field: 'signed_majors',
|
124
161
|
align: 'center',
|
125
162
|
title: '专业数',
|
126
|
-
width: 150
|
163
|
+
width: 150,
|
164
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
127
165
|
}]
|
128
166
|
],
|
129
167
|
data: gon.table_2,
|
@@ -132,15 +170,17 @@
|
|
132
170
|
|
133
171
|
table.render({
|
134
172
|
elem: '#table_7_signed',
|
173
|
+
totalRow: true,
|
135
174
|
cols: [
|
136
175
|
[
|
137
176
|
{
|
138
177
|
field: 'num',
|
139
|
-
title: '
|
178
|
+
title: '教师数分布',
|
140
179
|
align: 'center',
|
141
180
|
width: 150,
|
142
|
-
rowspan: 2
|
143
|
-
|
181
|
+
rowspan: 2,
|
182
|
+
totalRowText:'合计',
|
183
|
+
}
|
144
184
|
, {
|
145
185
|
title: '客户数',
|
146
186
|
align: 'center',
|
@@ -155,32 +195,38 @@
|
|
155
195
|
field: 'schools',
|
156
196
|
title: '学校数',
|
157
197
|
align: 'center',
|
158
|
-
width: 150
|
198
|
+
width: 150,
|
199
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
159
200
|
}, {
|
160
201
|
field: 'departments',
|
161
202
|
title: '学院数',
|
162
203
|
align: 'center',
|
163
|
-
width: 150
|
204
|
+
width: 150,
|
205
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
164
206
|
}, {
|
165
207
|
field: 'majors',
|
166
208
|
title: '专业数',
|
167
209
|
align: 'center',
|
168
|
-
width: 150
|
210
|
+
width: 150,
|
211
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
169
212
|
},{
|
170
213
|
field: 'signed_schools',
|
171
214
|
title: '学校数',
|
172
215
|
align: 'center',
|
173
|
-
width: 150
|
216
|
+
width: 150,
|
217
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
174
218
|
}, {
|
175
219
|
field: 'signed_departments',
|
176
220
|
title: '学院数',
|
177
221
|
align: 'center',
|
178
|
-
width: 150
|
222
|
+
width: 150,
|
223
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
179
224
|
}, {
|
180
225
|
field: 'signed_majors',
|
181
226
|
align: 'center',
|
182
227
|
title: '专业数',
|
183
|
-
width: 150
|
228
|
+
width: 150,
|
229
|
+
totalRow: '{{ parseInt(d.TOTAL_NUMS) }}',
|
184
230
|
}]
|
185
231
|
],
|
186
232
|
data: gon.table_3,
|
data/config/routes.rb
CHANGED
@@ -17,6 +17,8 @@ EducodeSales::Engine.routes.draw do
|
|
17
17
|
get :staff_business, to: "home#staff_business"
|
18
18
|
get :staff_departments, to: "home#staff_departments"
|
19
19
|
get :filter, to: "application#filter"
|
20
|
+
get :search_activity, to: "home#search_activity"
|
21
|
+
get :search_customer, to: "home#search_customer"
|
20
22
|
|
21
23
|
|
22
24
|
resources :sessions do
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddActivityEducodeSalesBusiness < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
add_column :educode_sales_businesses, :activity_id, :integer
|
4
|
+
add_column :educode_sales_businesses, :place_id, :integer
|
5
|
+
add_column :educode_sales_businesses, :customer_id, :integer
|
6
|
+
add_column :educode_sales_businesses, :company_source, :string
|
7
|
+
add_column :educode_sales_businesses, :phone, :string
|
8
|
+
add_column :educode_sales_businesses, :email, :string
|
9
|
+
add_column :educode_sales_businesses, :partner, :string
|
10
|
+
add_column :educode_sales_businesses, :invite_info, :string
|
11
|
+
add_column :educode_sales_businesses, :friend, :string
|
12
|
+
end
|
13
|
+
end
|
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.98
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -355,6 +355,8 @@ files:
|
|
355
355
|
- app/views/educode_sales/home/sales_place.json.jbuilder
|
356
356
|
- app/views/educode_sales/home/sales_staff.json.jbuilder
|
357
357
|
- app/views/educode_sales/home/search.json.jbuilder
|
358
|
+
- app/views/educode_sales/home/search_activity.json.jbuilder
|
359
|
+
- app/views/educode_sales/home/search_customer.json.jbuilder
|
358
360
|
- app/views/educode_sales/home/search_edu_teacher.json.jbuilder
|
359
361
|
- app/views/educode_sales/home/search_edu_user.json.jbuilder
|
360
362
|
- app/views/educode_sales/home/search_operation_teacher.json.jbuilder
|
@@ -679,6 +681,7 @@ files:
|
|
679
681
|
- db/migrate/20230501034307_create_educode_sales_follow_up_trends.rb
|
680
682
|
- db/migrate/20230502142912_create_educode_sales_product_catalogs.rb
|
681
683
|
- db/migrate/20230510144317_create_educode_sales_sales_details.rb
|
684
|
+
- db/migrate/20230520023902_add_activity_educode_sales_business.rb
|
682
685
|
- lib/educode_sales.rb
|
683
686
|
- lib/educode_sales/engine.rb
|
684
687
|
- lib/educode_sales/version.rb
|
@@ -702,7 +705,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
702
705
|
- !ruby/object:Gem::Version
|
703
706
|
version: '0'
|
704
707
|
requirements: []
|
705
|
-
rubygems_version: 3.0.
|
708
|
+
rubygems_version: 3.0.9
|
706
709
|
signing_key:
|
707
710
|
specification_version: 4
|
708
711
|
summary: Summary of EducodeSales.
|