educode_sales 0.5.9 → 0.6.3
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 +7 -4
- data/app/controllers/educode_sales/customers_controller.rb +45 -34
- data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
- data/app/controllers/educode_sales/places_controller.rb +5 -1
- data/app/controllers/educode_sales/sale_trends_controller.rb +16 -1
- data/app/controllers/educode_sales/staffs_controller.rb +2 -2
- data/app/controllers/educode_sales/teachers_controller.rb +13 -2
- data/app/models/educode_sales/permission.rb +1 -1
- data/app/views/educode_sales/businesses/_follows.html.erb +4 -1
- data/app/views/educode_sales/businesses/edit.html.erb +3 -0
- data/app/views/educode_sales/businesses/index.html.erb +22 -16
- data/app/views/educode_sales/businesses/index.json.jbuilder +1 -0
- data/app/views/educode_sales/businesses/show_follow.html.erb +1 -1
- data/app/views/educode_sales/businesses/time_line.html.erb +1 -1
- data/app/views/educode_sales/customers/edit.html.erb +54 -21
- data/app/views/educode_sales/customers/edit_department.html.erb +4 -2
- data/app/views/educode_sales/customers/edit_follow_record.html.erb +7 -7
- data/app/views/educode_sales/customers/index.html.erb +26 -19
- data/app/views/educode_sales/customers/index.json.jbuilder +3 -4
- data/app/views/educode_sales/customers/new.html.erb +30 -24
- data/app/views/educode_sales/customers/new_department.html.erb +5 -2
- data/app/views/educode_sales/customers/new_follow_record.html.erb +9 -9
- data/app/views/educode_sales/customers/show_follow.html.erb +8 -5
- data/app/views/educode_sales/customers/show_follow.json.jbuilder +1 -1
- data/app/views/educode_sales/customers/show_follow_record.html.erb +5 -4
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -0
- data/app/views/educode_sales/places/index.html.erb +64 -0
- data/app/views/educode_sales/roles/edit.html.erb +1 -1
- data/app/views/educode_sales/sale_trends/trends.html.erb +20 -0
- data/app/views/educode_sales/sales/index.html.erb +34 -16
- data/app/views/educode_sales/sales/index.json.jbuilder +27 -2
- data/app/views/educode_sales/teachers/index.html.erb +4 -11
- data/app/views/educode_sales/teachers/index.json.jbuilder +1 -1
- data/db/migrate/20211220102720_add_position_to_commons.rb +12 -0
- data/db/migrate/20211221075146_add_school_id_to_educode_sales_businesses.rb +8 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +4 -2
@@ -16,20 +16,20 @@
|
|
16
16
|
<div class="layui-inline">
|
17
17
|
<label class="layui-form-label">负责人</label>
|
18
18
|
<div class="layui-input-inline">
|
19
|
-
<%= select_tag "staff_id", options_for_select(@staffs), { include_blank: true } %>
|
20
|
-
</div>
|
21
|
-
</div>
|
22
|
-
<div class="layui-inline">
|
23
|
-
<label class="layui-form-label">最后跟进</label>
|
24
|
-
<div class="layui-input-inline">
|
25
|
-
<input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
|
19
|
+
<%= select_tag "staff_id", options_for_select(@staffs,params[:staff_id]), { include_blank: true } %>
|
26
20
|
</div>
|
27
21
|
</div>
|
22
|
+
<!-- <div class="layui-inline">-->
|
23
|
+
<!-- <label class="layui-form-label">最后跟进</label>-->
|
24
|
+
<!-- <div class="layui-input-inline">-->
|
25
|
+
<!-- <input type="text" class="layui-input" id="date" name="date" placeholder=" - ">-->
|
26
|
+
<!-- </div>-->
|
27
|
+
<!-- </div>-->
|
28
28
|
|
29
29
|
<div class="layui-inline">
|
30
30
|
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
31
31
|
</button>
|
32
|
-
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_teachers">搜 索
|
32
|
+
<button type="submit" class="layui-btn layui-btn-primary" id="search_bt" lay-submit lay-filter="search_teachers">搜 索
|
33
33
|
</button>
|
34
34
|
</div>
|
35
35
|
</div>
|
@@ -40,7 +40,7 @@
|
|
40
40
|
<div class="layui-btn-container">
|
41
41
|
<span class="table-label">客户列表</span>
|
42
42
|
<% if can? :create, EducodeSales::Customer %>
|
43
|
-
|
43
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add">添加客户</button>
|
44
44
|
<% end %>
|
45
45
|
<% if can? :give, EducodeSales::Customer %>
|
46
46
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="give">分配/移交</button>
|
@@ -59,14 +59,14 @@
|
|
59
59
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_follow">添加跟进记录</a>
|
60
60
|
<% end %>
|
61
61
|
<% if can? :update, EducodeSales::Customer %>
|
62
|
-
|
62
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
63
63
|
<% end %>
|
64
64
|
</script>
|
65
65
|
<script type="text/html" id="business">
|
66
66
|
<a href="/missions/businesses?school={{d.name}}" class="layui-table-link">{{ d.business }}</a>
|
67
67
|
</script>
|
68
68
|
<script type="text/html" id="name">
|
69
|
-
<a href="
|
69
|
+
<a href="<%= base_url%>/colleges/{{d.id}}/statistics" class="layui-table-link" target="_blank">{{ d.name }}</a>
|
70
70
|
</script>
|
71
71
|
<script type="text/html" id="department">
|
72
72
|
<a href="javascript:void(0);" lay-event="department" class="layui-table-link">{{ d.department }}</a>
|
@@ -87,6 +87,13 @@
|
|
87
87
|
|
88
88
|
var laydate = layui.laydate;
|
89
89
|
|
90
|
+
// function hn(){
|
91
|
+
// $("#search_bt").trigger("click");
|
92
|
+
// }
|
93
|
+
// $(document).ready(function(){
|
94
|
+
// window.onload=hn;
|
95
|
+
// });
|
96
|
+
|
90
97
|
laydate.render({
|
91
98
|
elem: '#date',
|
92
99
|
range: true
|
@@ -99,22 +106,21 @@
|
|
99
106
|
table.render({
|
100
107
|
elem: '#customers_table',
|
101
108
|
url: '/missions/customers',
|
102
|
-
|
109
|
+
where: {q: form.val('search_teachers')},
|
103
110
|
toolbar: '#toolbarDemo',
|
104
111
|
// totalRow:true,
|
105
112
|
defaultToolbar: ['filter'],
|
106
113
|
cols: [
|
107
114
|
[
|
108
|
-
{type:'checkbox'},
|
115
|
+
{type: 'checkbox'},
|
109
116
|
{
|
110
117
|
field: 'id',
|
111
118
|
width: 60,
|
112
|
-
title:'序号',type: 'numbers',
|
119
|
+
title: '序号', type: 'numbers',
|
113
120
|
|
114
121
|
},
|
115
122
|
{
|
116
123
|
field: 'name',
|
117
|
-
width: 160,
|
118
124
|
title: '客户名称',
|
119
125
|
templet: "#name"
|
120
126
|
},
|
@@ -143,7 +149,7 @@
|
|
143
149
|
},
|
144
150
|
{
|
145
151
|
field: 'last_follow_time',
|
146
|
-
width:
|
152
|
+
width: 170,
|
147
153
|
title: '最后跟进时间',
|
148
154
|
},
|
149
155
|
{
|
@@ -153,7 +159,7 @@
|
|
153
159
|
},
|
154
160
|
{
|
155
161
|
title: '操作',
|
156
|
-
|
162
|
+
width: 300,
|
157
163
|
toolbar: '#currentTableBar',
|
158
164
|
align: "center",
|
159
165
|
fixed: 'right'
|
@@ -251,11 +257,12 @@
|
|
251
257
|
name: "",
|
252
258
|
professional_title: "",
|
253
259
|
regist_at: "",
|
260
|
+
staff_id: "",
|
254
261
|
status: "",
|
255
262
|
school: "",
|
256
263
|
assist: "",
|
257
264
|
teacher_source: ""
|
258
|
-
})
|
265
|
+
});
|
259
266
|
return false;
|
260
267
|
});
|
261
268
|
/**
|
@@ -330,7 +337,7 @@
|
|
330
337
|
var data = obj.data;
|
331
338
|
id = data.id
|
332
339
|
if (obj.event === 'edit') { // 监听添加操作
|
333
|
-
var content = miniPage.getHrefContent('/missions/customers' + data.id + '/edit');
|
340
|
+
var content = miniPage.getHrefContent('/missions/customers/' + data.id + '/edit');
|
334
341
|
var openWH = miniPage.getOpenWidthHeight();
|
335
342
|
sale_plan_index = layer.open({
|
336
343
|
title: '编辑客户',
|
@@ -1,11 +1,10 @@
|
|
1
1
|
json.data do
|
2
2
|
json.array! @customers do |d|
|
3
|
-
|
4
|
-
business_ids = EducodeSales::Business.where(department_id: department_ids).ids
|
3
|
+
business_ids = EducodeSales::Business.where(school_id: d.id).ids
|
5
4
|
follow_ups = EducodeSales::FollowUp.where(business_id: business_ids)
|
6
5
|
customer_follows = EducodeSales::CustomerFollow.where(school_id: d.id)
|
7
|
-
a_last_follow_time = follow_ups.last&.created_at&.to_s
|
8
|
-
b_last_follow_time = customer_follows.last&.created_at&.to_s
|
6
|
+
a_last_follow_time = follow_ups.last&.created_at&.to_s
|
7
|
+
b_last_follow_time = customer_follows.last&.created_at&.to_s
|
9
8
|
if a_last_follow_time.present? && b_last_follow_time.present?
|
10
9
|
json.last_follow_time a_last_follow_time < b_last_follow_time ? b_last_follow_time : a_last_follow_time
|
11
10
|
else
|
@@ -1,17 +1,32 @@
|
|
1
|
-
<form class="layui-form
|
1
|
+
<form class="layui-form layuimini-form" action="">
|
2
2
|
<div class="layui-form-item" style="padding: 25px">
|
3
3
|
<div class="layui-inline">
|
4
|
-
<label class="layui-form-label required"
|
5
|
-
<div class="layui-input-block">
|
6
|
-
<input type="text" name="name"
|
4
|
+
<label class="layui-form-label required">客户:</label>
|
5
|
+
<div class="layui-input-block" style="width: 500px;">
|
6
|
+
<input type="text" name="name" lay-verify="required" placeholder="请输入客户" autocomplete="off"
|
7
7
|
class="layui-input" id="inputFocus">
|
8
8
|
</div>
|
9
9
|
</div>
|
10
10
|
<br>
|
11
11
|
<div class="layui-inline">
|
12
|
-
<label class="layui-form-label required"
|
12
|
+
<label class="layui-form-label required">省:</label>
|
13
|
+
<div class="layui-input-block">
|
14
|
+
<%= select_tag "province", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name)), { include_blank: true } %>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<br>
|
18
|
+
<div class="layui-inline">
|
19
|
+
<label class="layui-form-label ">市:</label>
|
13
20
|
<div class="layui-input-block">
|
14
|
-
<input type="text" name="
|
21
|
+
<input type="text" name="city" style="width: 223px;" autocomplete="off"
|
22
|
+
class="layui-input" placeholder="请输入市" >
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
<br>
|
26
|
+
<div class="layui-inline">
|
27
|
+
<label class="layui-form-label ">地址:</label>
|
28
|
+
<div class="layui-input-block" style="width: 500px;">
|
29
|
+
<input type="text" name="address" autocomplete="off"
|
15
30
|
class="layui-input" placeholder="请输入地址" >
|
16
31
|
</div>
|
17
32
|
</div>
|
@@ -35,7 +50,7 @@
|
|
35
50
|
<input type="checkbox" name="enterprise" lay-skin="primary" value="1" title="企业">
|
36
51
|
</div>
|
37
52
|
</div>
|
38
|
-
<div class="layui-inline" style="padding-left:
|
53
|
+
<div class="layui-inline" style="padding-left: 120px">
|
39
54
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="data-reset-btn">提交
|
40
55
|
</button>
|
41
56
|
</div>
|
@@ -66,23 +81,14 @@
|
|
66
81
|
//监听提交
|
67
82
|
form.on('submit(data-reset-btn)', function (data) {
|
68
83
|
console.log(data.field);
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
// data.field['area_ids'] = area_ids;
|
78
|
-
// request.authPost("missions/places", data.field, function (res) {
|
79
|
-
// if (res.success === false) {
|
80
|
-
// layer.alert(res.msg)
|
81
|
-
// } else {
|
82
|
-
// layer.closeAll(); //关闭所有层
|
83
|
-
// table.reload('place')
|
84
|
-
// }
|
85
|
-
// })
|
84
|
+
request.authPost("missions/customers", data.field, function (res) {
|
85
|
+
if (res.success === false) {
|
86
|
+
layer.alert(res.msg)
|
87
|
+
} else {
|
88
|
+
layer.closeAll(); //关闭所有层
|
89
|
+
parent.table.reload('customers_table')
|
90
|
+
}
|
91
|
+
})
|
86
92
|
return false;
|
87
93
|
});
|
88
94
|
});
|
@@ -1,14 +1,16 @@
|
|
1
1
|
<div class="layuimini-main">
|
2
2
|
<form class="layui-form layuimini-form" action="">
|
3
|
+
<div class="layui-form-item" style="padding: 25px">
|
3
4
|
<div class="layui-form-item" style="padding: 25px">
|
4
5
|
<div class="layui-inline">
|
5
6
|
<label class="layui-form-label required">部门名称</label>
|
6
|
-
<div class="layui-input-block">
|
7
|
+
<div class="layui-input-block" style="width: 300px;">
|
7
8
|
<input type="text" name="department_name" required lay-verify="required" autocomplete="off" placeholder="请输入"
|
8
9
|
class="layui-input" id="inputFocus">
|
9
10
|
</div>
|
10
11
|
</div>
|
11
|
-
|
12
|
+
</div>
|
13
|
+
<div class="layui-form-item" style="padding-left: 130px">
|
12
14
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="data-reset-btn">提交
|
13
15
|
</button>
|
14
16
|
</div>
|
@@ -45,6 +47,7 @@
|
|
45
47
|
} else {
|
46
48
|
layer.close(parent.new_department_index); //关闭所有层
|
47
49
|
table.reload('sale_plan_follow_table')
|
50
|
+
parent.table.reload('customers_table')
|
48
51
|
}
|
49
52
|
})
|
50
53
|
return false;
|
@@ -1,18 +1,18 @@
|
|
1
1
|
<h1 class="text-center" style="padding: 25px"><%=@school.name %></h1>
|
2
|
-
<form class="layui-form " action="">
|
3
|
-
<div class="layui-form-item layui-form-text">
|
4
|
-
<label class="layui-form-label">跟进内容</label>
|
2
|
+
<form class="layui-form layuimini-form " action="">
|
3
|
+
<div class="layui-form-item layui-form-text" style="padding-right: 30px">
|
4
|
+
<label class="layui-form-label required" >跟进内容</label>
|
5
5
|
<div class="layui-input-block">
|
6
|
-
<textarea name="content" placeholder="请输入跟进内容" class="layui-textarea"></textarea>
|
6
|
+
<textarea name="content" placeholder="请输入跟进内容" lay-verify="required" style="height: 200px" class="layui-textarea"></textarea>
|
7
7
|
</div>
|
8
8
|
</div>
|
9
|
-
|
10
|
-
<label class="layui-form-label
|
11
|
-
<div class="layui-input-inline">
|
12
|
-
<%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id)), {
|
9
|
+
<div class="layui-form-item ">
|
10
|
+
<label class="layui-form-label ">跟进部门</label>
|
11
|
+
<div class="layui-input-inline" style="width: 300px">
|
12
|
+
<%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id)), { include_blank: true}%>
|
13
13
|
</div>
|
14
14
|
</div>
|
15
|
-
|
15
|
+
<div class="layui-form-item " style="padding-left: 110px">
|
16
16
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="add_follow_up">提交
|
17
17
|
</button>
|
18
18
|
</div>
|
@@ -54,7 +54,7 @@
|
|
54
54
|
},
|
55
55
|
{
|
56
56
|
title: '操作',
|
57
|
-
|
57
|
+
width: 190,
|
58
58
|
toolbar: '#currentTableBar_follow',
|
59
59
|
align: "center",
|
60
60
|
fixed: 'right'
|
@@ -251,8 +251,9 @@
|
|
251
251
|
},
|
252
252
|
{
|
253
253
|
field: 'created_at',
|
254
|
-
width:
|
255
|
-
title: '时间'
|
254
|
+
width: 180,
|
255
|
+
title: '时间',
|
256
|
+
sort: true
|
256
257
|
},
|
257
258
|
{
|
258
259
|
field: 'staff',
|
@@ -266,11 +267,12 @@
|
|
266
267
|
},
|
267
268
|
{
|
268
269
|
field: 'content',
|
269
|
-
|
270
|
-
|
270
|
+
title: '跟进内容',
|
271
|
+
templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
|
271
272
|
},
|
272
273
|
{
|
273
274
|
title: '操作',
|
275
|
+
width: 300,
|
274
276
|
toolbar: '#currentTableBar1234',
|
275
277
|
align: "center"
|
276
278
|
}
|
@@ -365,6 +367,7 @@
|
|
365
367
|
layer.confirm('确定删除ID为' + data.id + "的记录", function (index) {
|
366
368
|
request.authDelete("missions/customer_follows/" + data.id, {}, function() {
|
367
369
|
obj.del();
|
370
|
+
parent.table.reload('customers_table')
|
368
371
|
layer.close(index);
|
369
372
|
})
|
370
373
|
|
@@ -3,7 +3,7 @@ json.data do
|
|
3
3
|
json.id d.id
|
4
4
|
json.created_at d.created_at.to_s
|
5
5
|
json.staff d.staff.user.real_name
|
6
|
-
json.department Department.find(d.department_id)&.name
|
6
|
+
json.department d.department_id.present? ? Department.find(d.department_id)&.name : ''
|
7
7
|
json.content d.content
|
8
8
|
json.is_latest d.id == @latest.id
|
9
9
|
end
|
@@ -1,16 +1,17 @@
|
|
1
1
|
<h1 class="text-center" style="padding: 25px"><%=@school.name %></h1>
|
2
2
|
<form class="layui-form form-value" action="">
|
3
3
|
<div class="layui-form-item" style="padding: 25px">
|
4
|
-
<div class="layui-
|
4
|
+
<div class="layui-form-item layui-form-text">
|
5
5
|
<label class="layui-form-label">跟进内容:</label>
|
6
|
-
<div class="layui-input-
|
7
|
-
<
|
6
|
+
<div class="layui-input-block" style="padding-right: 20px;">
|
7
|
+
<pre><%= @follow_up.content %></pre>
|
8
8
|
</div>
|
9
9
|
</div>
|
10
|
+
<br>
|
10
11
|
<div class="layui-inline">
|
11
12
|
<label class="layui-form-label">跟进部门:</label>
|
12
13
|
<div class="layui-input-inline">
|
13
|
-
<span><%=
|
14
|
+
<span><%= Department.find(@follow_up.department_id)&.name if @follow_up.department_id.present? %></span>
|
14
15
|
</div>
|
15
16
|
</div>
|
16
17
|
</div>
|
@@ -7,6 +7,7 @@ json.data do
|
|
7
7
|
json.description d.description
|
8
8
|
json.advise d.advise
|
9
9
|
json.school d.business.department.school.name
|
10
|
+
json.school_id d.business.department.school.id
|
10
11
|
json.created_at d.created_at.to_s
|
11
12
|
json.business d.business.name
|
12
13
|
json.business_id d.business.id
|
@@ -1,3 +1,22 @@
|
|
1
|
+
<div style="margin: 10px 10px 10px 10px">
|
2
|
+
<form class="layui-form layui-form-pane" lay-filter="search_teachers">
|
3
|
+
<div class="layui-form-item">
|
4
|
+
<div class="layui-inline">
|
5
|
+
<label class="layui-form-label">渠道名称</label>
|
6
|
+
<div class="layui-input-inline">
|
7
|
+
<input type="text" name="name" autocomplete="off" class="layui-input">
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="layui-inline">
|
11
|
+
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
12
|
+
</button>
|
13
|
+
<button type="submit" class="layui-btn layui-btn-primary" id="search_bt" lay-submit lay-filter="search_teachers">搜 索
|
14
|
+
</button>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</form>
|
18
|
+
</div>
|
19
|
+
|
1
20
|
<script type="text/html" id="toolbarDemo">
|
2
21
|
<div class="layui-btn-container">
|
3
22
|
<span class="table-label">渠道列表</span>
|
@@ -35,6 +54,51 @@
|
|
35
54
|
request = layui.request,
|
36
55
|
miniPage = layui.miniPage;
|
37
56
|
|
57
|
+
|
58
|
+
|
59
|
+
var sort = {}, search = {};
|
60
|
+
table.on('sort(place)', function (obj) {
|
61
|
+
sort.field = obj.field;
|
62
|
+
sort.order = obj.type;
|
63
|
+
table.reload('place', {
|
64
|
+
initSort: obj,
|
65
|
+
where: {
|
66
|
+
sort: sort,
|
67
|
+
q: search
|
68
|
+
}
|
69
|
+
});
|
70
|
+
})
|
71
|
+
|
72
|
+
// 监听搜索操作
|
73
|
+
form.on('submit(search_teachers)', function (data) {
|
74
|
+
search = data.field
|
75
|
+
table.reload('place', {
|
76
|
+
page: {
|
77
|
+
curr: 1
|
78
|
+
},
|
79
|
+
where: {q: search, sort: sort}
|
80
|
+
}, 'data');
|
81
|
+
return false;
|
82
|
+
});
|
83
|
+
|
84
|
+
form.on('submit(reset_business_search)', function (data) {
|
85
|
+
var field = data.field;
|
86
|
+
form.val('search_teachers', {
|
87
|
+
area: "",
|
88
|
+
date: "",
|
89
|
+
attitude: "",
|
90
|
+
name: "",
|
91
|
+
professional_title: "",
|
92
|
+
regist_at: "",
|
93
|
+
staff_id: "",
|
94
|
+
status: "",
|
95
|
+
school: "",
|
96
|
+
assist: "",
|
97
|
+
teacher_source: ""
|
98
|
+
});
|
99
|
+
return false;
|
100
|
+
});
|
101
|
+
|
38
102
|
table.render({
|
39
103
|
elem: '#place',
|
40
104
|
url: '/missions/places',
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<div class="layui-tab-item layui-show">
|
8
8
|
<form class="layui-form line" action="">
|
9
9
|
<% id = 0 %>
|
10
|
-
<% EducodeSales::Permission.all.group_by{ |d| d.clazz}.each do |k, d| %>
|
10
|
+
<% EducodeSales::Permission.all.order(position: :asc).group_by{ |d| d.clazz}.each do |k, d| %>
|
11
11
|
<div class="layui-form-item">
|
12
12
|
<label class="layui-form-label"><%= k %></label>
|
13
13
|
<div class="layui-input-block">
|
@@ -272,6 +272,19 @@
|
|
272
272
|
|
273
273
|
</div>
|
274
274
|
</div>
|
275
|
+
<br>
|
276
|
+
<br>
|
277
|
+
<div class="layui-tab layui-tab-card " id="销售额分析" lay-filter="test1">
|
278
|
+
<ul class="layui-tab-title">
|
279
|
+
<li class="layui-this">商机区域分布</li>
|
280
|
+
</ul>
|
281
|
+
<div class="layui-tab-content" style="padding-right: 50px">
|
282
|
+
<div class="layui-tab-item layui-show" style="padding-left: 20px">
|
283
|
+
<canvas id="myChart3" width="960" height="200"></canvas>
|
284
|
+
</div>
|
285
|
+
|
286
|
+
</div>
|
287
|
+
</div>
|
275
288
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/chart.js@2.9.1/dist/Chart.min.css">
|
276
289
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.1/dist/Chart.min.js"></script>
|
277
290
|
<script>
|
@@ -498,5 +511,12 @@
|
|
498
511
|
data: <%=raw @goal_count_data.to_json %>,
|
499
512
|
options: opt
|
500
513
|
});
|
514
|
+
|
515
|
+
var ctx = document.getElementById('myChart3');
|
516
|
+
var myChart3 = new Chart(ctx, {
|
517
|
+
type: 'bar',
|
518
|
+
data: <%=raw @business_data.to_json %>,
|
519
|
+
options: opt
|
520
|
+
});
|
501
521
|
})
|
502
522
|
</script>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="section">
|
2
2
|
<form class="layui-form select_year" action="">
|
3
|
-
<span>销售人员列表</span
|
3
|
+
<!-- <span>销售人员列表</span>-->
|
4
4
|
<div class="layui-input-inline" style="float: right">
|
5
5
|
<%= select_tag "years", options_for_select(@years,@year), {'lay-filter': 'year' } %>
|
6
6
|
</div>
|
@@ -44,6 +44,16 @@
|
|
44
44
|
<a href="/missions/businesses?clazz_id={{d.o_clazz_id}}&staff_id={{d.id}}">{{d.business_o}}</a>
|
45
45
|
</div>
|
46
46
|
</script>
|
47
|
+
<script type="text/html" id="school_count">
|
48
|
+
<div class="layui-text">
|
49
|
+
<a href="/missions/customers?staff_id={{d.id}}">{{d.school_count}}</a>
|
50
|
+
</div>
|
51
|
+
</script>
|
52
|
+
<script type="text/html" id="bussinessBar">
|
53
|
+
<span>销售人员列表</span>
|
54
|
+
<div class="layui-btn-container">
|
55
|
+
</div>
|
56
|
+
</script>
|
47
57
|
<script>
|
48
58
|
layui.use('table', function () {
|
49
59
|
var form = layui.form,
|
@@ -58,7 +68,9 @@
|
|
58
68
|
table.render({
|
59
69
|
elem: '#table',
|
60
70
|
url: '/missions/sales?year=<%= @year %>',
|
61
|
-
|
71
|
+
defaultToolbar: ['filter'],
|
72
|
+
cellMinWidth: 80,
|
73
|
+
toolbar: '#bussinessBar',
|
62
74
|
totalRow:true,
|
63
75
|
cols: [
|
64
76
|
[{
|
@@ -132,33 +144,39 @@
|
|
132
144
|
{
|
133
145
|
field: 'school_count',
|
134
146
|
title: '负责学校数',
|
135
|
-
|
147
|
+
sort:true,
|
148
|
+
totalRow:true,
|
149
|
+
templet: "#school_count",
|
136
150
|
width: 120
|
137
151
|
},
|
138
152
|
{
|
139
153
|
field: 'follow_school_count',
|
140
154
|
title: '跟进学校数',
|
155
|
+
sort:true,
|
141
156
|
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
142
157
|
width: 120
|
143
158
|
},
|
144
159
|
{
|
145
160
|
field: 'follow_school_counts',
|
146
161
|
title: '跟进学校次数',
|
162
|
+
sort:true,
|
147
163
|
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
148
|
-
width:
|
149
|
-
},
|
150
|
-
{
|
151
|
-
field: 'follow_school_rate',
|
152
|
-
title: '学校覆盖率',
|
153
|
-
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
154
|
-
width: 120
|
155
|
-
},
|
156
|
-
{
|
157
|
-
field: 'follow_department_rate',
|
158
|
-
title: '学院覆盖率',
|
159
|
-
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
160
|
-
width: 120
|
164
|
+
width: 130
|
161
165
|
},
|
166
|
+
// {
|
167
|
+
// field: 'follow_school_rate',
|
168
|
+
// title: '学校覆盖率',
|
169
|
+
// sort:true,
|
170
|
+
// totalRow:true,
|
171
|
+
// width: 120
|
172
|
+
// },
|
173
|
+
// {
|
174
|
+
// field: 'follow_department_rate',
|
175
|
+
// title: '学院覆盖率',
|
176
|
+
// sort:true,
|
177
|
+
// totalRow:true,
|
178
|
+
// width: 120
|
179
|
+
// },
|
162
180
|
]
|
163
181
|
],
|
164
182
|
limit: 20,
|
@@ -4,6 +4,9 @@ businesses_c_count = 0
|
|
4
4
|
businesses_d_count = 0
|
5
5
|
businesses_e_count = 0
|
6
6
|
businesses_o_count = 0
|
7
|
+
school_counts = 0
|
8
|
+
follow_school_rates = 0
|
9
|
+
follow_department_rates = 0
|
7
10
|
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
8
11
|
json.data do
|
9
12
|
json.array! @staffs do |d|
|
@@ -33,9 +36,17 @@ json.data do
|
|
33
36
|
business_d = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @d_clazz&.id).count
|
34
37
|
business_e = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @e_clazz&.id).count
|
35
38
|
business_o = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @o_clazz&.id).count
|
39
|
+
school_count = EducodeSales::CustomerExtension.where(customer_staff_id: d.id).size
|
36
40
|
json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).sum(:total_amount).round(2)
|
37
41
|
json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).sum(:amount).round(2)
|
38
|
-
json.school_count
|
42
|
+
json.school_count school_count
|
43
|
+
follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
|
44
|
+
json.follow_school_count follow_school_count
|
45
|
+
json.follow_school_counts EducodeSales::CustomerFollow.where(staff_id: d.id).size + EducodeSales::FollowUp.where(staff_id: d.id).size
|
46
|
+
follow_school_rate = (follow_school_count!=0 ? school_count.to_f * 100 / follow_school_count : 0).round(2)
|
47
|
+
json.follow_school_rate follow_school_rate.to_s + '%'
|
48
|
+
follow_department_rate = (follow_school_count!=0 ? school_count.to_f * 110 / follow_school_count : 0).round(2)
|
49
|
+
json.follow_department_rate follow_department_rate.to_s + '%'
|
39
50
|
else
|
40
51
|
business_a = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @a_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
41
52
|
business_b = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @b_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
@@ -43,9 +54,17 @@ json.data do
|
|
43
54
|
business_d = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @d_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
44
55
|
business_e = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @e_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
45
56
|
business_o = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @o_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
57
|
+
school_count = EducodeSales::CustomerExtension.where(customer_staff_id: d.id).size
|
46
58
|
json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", "#{@year}-01-01", "#{@year}-12-31").sum(:total_amount).round(2)
|
47
59
|
json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").sum(:amount).round(2)
|
48
|
-
json.school_count
|
60
|
+
json.school_count school_count
|
61
|
+
follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
|
62
|
+
json.follow_school_count follow_school_count
|
63
|
+
json.follow_school_counts EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size + EducodeSales::FollowUp.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size
|
64
|
+
follow_school_rate = (follow_school_count!=0 ? school_count.to_f * 100 / follow_school_count : 0).round(2)
|
65
|
+
json.follow_school_rate follow_school_rate.to_s + '%'
|
66
|
+
follow_department_rate = (follow_school_count!=0 ? school_count.to_f * 110 / follow_school_count : 0).round(2)
|
67
|
+
json.follow_department_rate follow_department_rate.to_s + '%'
|
49
68
|
end
|
50
69
|
|
51
70
|
json.business_a business_a
|
@@ -67,6 +86,9 @@ json.data do
|
|
67
86
|
businesses_d_count += business_d
|
68
87
|
businesses_e_count += business_e
|
69
88
|
businesses_o_count += business_o
|
89
|
+
school_counts += school_count
|
90
|
+
follow_school_rates += follow_school_rate
|
91
|
+
follow_department_rates += follow_department_rate
|
70
92
|
end
|
71
93
|
end
|
72
94
|
|
@@ -77,6 +99,9 @@ json.totalRow do
|
|
77
99
|
json.business_d businesses_d_count.to_s
|
78
100
|
json.business_e businesses_e_count.to_s
|
79
101
|
json.business_o businesses_o_count.to_s
|
102
|
+
json.school_count school_counts.to_s
|
103
|
+
json.follow_school_rate (follow_school_rates.to_f / @staffs.size).round(2).to_s + '%'
|
104
|
+
json.follow_department_rate (follow_department_rates.to_f / @staffs.size).round(2).to_s + '%'
|
80
105
|
end
|
81
106
|
json.code 0
|
82
107
|
json.count @staffs.total_count
|