educode_sales 0.5.4 → 0.5.8
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 +20 -1
- data/app/controllers/educode_sales/follow_ups_controller.rb +58 -1
- data/app/controllers/educode_sales/home_controller.rb +18 -2
- data/app/controllers/educode_sales/sale_trends_controller.rb +119 -84
- data/app/controllers/educode_sales/sales_controller.rb +3 -0
- data/app/controllers/educode_sales/teachers_controller.rb +41 -14
- data/app/controllers/educode_sales/upload_files_controller.rb +3 -3
- data/app/models/educode_sales/teacher.rb +2 -1
- data/app/models/educode_sales/teacher_assign_follow.rb +6 -0
- data/app/views/educode_sales/activities/index.html.erb +4 -5
- data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
- data/app/views/educode_sales/businesses/_follows.html.erb +255 -0
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +69 -6
- data/app/views/educode_sales/businesses/file.html.erb +2 -4
- data/app/views/educode_sales/businesses/index.html.erb +161 -66
- data/app/views/educode_sales/businesses/index.json.jbuilder +2 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +70 -6
- data/app/views/educode_sales/businesses/show_follow.html.erb +9 -9
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -0
- data/app/views/educode_sales/businesses/time_line.html.erb +1 -1
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +20 -0
- data/app/views/educode_sales/home/sales_place.json.jbuilder +9 -0
- data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_monthly.html.erb +2 -0
- data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_weekly.html.erb +2 -0
- data/app/views/educode_sales/places/index.html.erb +14 -4
- data/app/views/educode_sales/places/index.json.jbuilder +7 -1
- data/app/views/educode_sales/plans/_monthPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_monthly.html.erb +1 -0
- data/app/views/educode_sales/plans/_weekPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_weekly.html.erb +1 -0
- data/app/views/educode_sales/recycles/index.html.erb +1 -1
- data/app/views/educode_sales/sale_trends/trends.html.erb +54 -5
- data/app/views/educode_sales/sales/index.html.erb +18 -3
- data/app/views/educode_sales/sales/index.json.jbuilder +27 -14
- data/app/views/educode_sales/sales/operations.html.erb +4 -1
- data/app/views/educode_sales/teachers/course_list.json.jbuilder +1 -1
- data/app/views/educode_sales/teachers/edit.html.erb +53 -7
- data/app/views/educode_sales/teachers/index.html.erb +42 -3
- data/app/views/educode_sales/teachers/index.json.jbuilder +4 -1
- data/app/views/educode_sales/teachers/new.html.erb +55 -17
- data/config/routes.rb +1 -0
- data/db/migrate/20211201023750_create_educode_sales_teacher_assign_follows.rb +11 -0
- data/db/migrate/20211206054756_add_year_to_follow_ups.rb +5 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +8 -2
@@ -52,24 +52,23 @@
|
|
52
52
|
{
|
53
53
|
field: 'name',
|
54
54
|
title: '活动名称',
|
55
|
-
width: 400,
|
56
55
|
templet: '#teachers'
|
57
56
|
},
|
58
57
|
{
|
59
58
|
field: 'start_at',
|
60
|
-
width:
|
59
|
+
width: 200,
|
61
60
|
title: '时间',
|
62
61
|
sort: true,
|
63
62
|
},
|
64
63
|
{
|
65
64
|
field: 'days',
|
66
65
|
title: '天数',
|
67
|
-
width:
|
66
|
+
width: 200
|
68
67
|
},
|
69
68
|
{
|
70
69
|
field: 'teachers_count',
|
71
70
|
title: '教师数',
|
72
|
-
width:
|
71
|
+
width: 200,
|
73
72
|
totalRow:true,
|
74
73
|
templet: '#teachers_count'
|
75
74
|
},
|
@@ -77,7 +76,7 @@
|
|
77
76
|
field: 'students_count',
|
78
77
|
title: '学生数',
|
79
78
|
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
80
|
-
width:
|
79
|
+
width: 200
|
81
80
|
},
|
82
81
|
{
|
83
82
|
title: '操作',
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<script type="text/html" id="teacher_toolbar">
|
3
3
|
<div class="layui-btn-container">
|
4
4
|
<span class="table-label">教师列表</span>
|
5
|
-
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="search_new">
|
5
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="search_new"> 添加教师
|
6
6
|
</button>
|
7
7
|
</div>
|
8
8
|
</script>
|
@@ -0,0 +1,255 @@
|
|
1
|
+
<div style="margin: 10px 10px 10px 10px">
|
2
|
+
<form class="layui-form layui-form-pane" lay-filter="search_follows">
|
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
|
+
<label class="layui-form-label">单位</label>
|
12
|
+
<div class="layui-input-inline">
|
13
|
+
<input type="text" name="department" autocomplete="off" class="layui-input">
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<div class="layui-inline">
|
17
|
+
<label class="layui-form-label">销售人员</label>
|
18
|
+
<div class="layui-input-inline">
|
19
|
+
<%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', 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
|
+
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<div class="layui-inline">
|
29
|
+
<label class="layui-form-label">跟进时间</label>
|
30
|
+
<div class="layui-input-inline">
|
31
|
+
<input type="text" class="layui-input" id="follows_date" name="follows_date" autocomplete="off" placeholder=" - ">
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div class="layui-inline">
|
36
|
+
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_follows_search">重置
|
37
|
+
</button>
|
38
|
+
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_follows">搜 索
|
39
|
+
</button>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</form>
|
43
|
+
</div>
|
44
|
+
<div class="">
|
45
|
+
<table class="layui-hide" id="teachers_table" style="min-height: 300px;" lay-filter="teachers_table"></table>
|
46
|
+
</div>
|
47
|
+
<script type="text/html" id="toolbarDemo_follows">
|
48
|
+
<div class="layui-btn-container">
|
49
|
+
<span class="table-label">跟进动态</span>
|
50
|
+
</div>
|
51
|
+
</script>
|
52
|
+
<script type="text/html" id="currentTableBar_follows">
|
53
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">详情</a>
|
54
|
+
</script>
|
55
|
+
<script type="text/html" id="business">
|
56
|
+
<a href="javascript:void(0);" lay-event="business" class="layui-table-link">{{ d.business }}</a>
|
57
|
+
</script>
|
58
|
+
|
59
|
+
|
60
|
+
<script>
|
61
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate'], function () {
|
62
|
+
var $ = layui.jquery,
|
63
|
+
form = layui.form,
|
64
|
+
request = layui.request,
|
65
|
+
dropdown = layui.dropdown,
|
66
|
+
miniPage = layui.miniPage,
|
67
|
+
laydate = layui.laydate;
|
68
|
+
|
69
|
+
var laydate = layui.laydate;
|
70
|
+
|
71
|
+
laydate.render({
|
72
|
+
elem: '#follows_date',
|
73
|
+
range: true
|
74
|
+
});
|
75
|
+
|
76
|
+
table = layui.table;
|
77
|
+
table.render({
|
78
|
+
elem: '#teachers_table',
|
79
|
+
url: '/missions/follow_ups',
|
80
|
+
// where: {q: form.val('search_form')},
|
81
|
+
toolbar: '#toolbarDemo_follows',
|
82
|
+
defaultToolbar: ['filter'],
|
83
|
+
initSort: {
|
84
|
+
field: 'created_at' //排序字段,对应 cols 设定的各字段名
|
85
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
86
|
+
},
|
87
|
+
cols: [
|
88
|
+
[
|
89
|
+
{
|
90
|
+
field: 'id',
|
91
|
+
width: 60,
|
92
|
+
title:'序号',type: 'numbers',
|
93
|
+
},
|
94
|
+
{
|
95
|
+
field: 'description',
|
96
|
+
title: '最新进展',
|
97
|
+
templet:'<div><span title="{{d.description}}">{{d.description}}</span></div>'
|
98
|
+
},
|
99
|
+
{
|
100
|
+
field: 'advise',
|
101
|
+
width: 170,
|
102
|
+
title: '团队建议',
|
103
|
+
templet:'<div><span title="{{d.advise}}">{{d.advise}}</span></div>'
|
104
|
+
},
|
105
|
+
{
|
106
|
+
field: 'clazz',
|
107
|
+
width: 80,
|
108
|
+
title: '类型',
|
109
|
+
templet:'<div><span title="{{d.clazz}}">{{d.clazz}}</span></div>'
|
110
|
+
},
|
111
|
+
{
|
112
|
+
field: 'stage',
|
113
|
+
title: '阶段',
|
114
|
+
width: 90,
|
115
|
+
templet:'<div><span title="{{d.stage}}">{{d.stage}}</span></div>'
|
116
|
+
},
|
117
|
+
{
|
118
|
+
field: 'key_people',
|
119
|
+
width: 90,
|
120
|
+
title: '关键人',
|
121
|
+
templet:'<div><span title="{{d.key_people}}">{{d.key_people}}</span></div>'
|
122
|
+
},
|
123
|
+
{
|
124
|
+
field: 'business',
|
125
|
+
width: 150,
|
126
|
+
title: '所属商机',
|
127
|
+
templet:'#business'
|
128
|
+
},
|
129
|
+
{
|
130
|
+
field: 'school',
|
131
|
+
width: 150,
|
132
|
+
title: '单位',
|
133
|
+
},
|
134
|
+
{
|
135
|
+
field: 'staff',
|
136
|
+
width: 90,
|
137
|
+
title: '跟进人',
|
138
|
+
},
|
139
|
+
{
|
140
|
+
field: 'created_at',
|
141
|
+
width: 170,
|
142
|
+
title: '跟进时间',
|
143
|
+
sort: true,
|
144
|
+
},
|
145
|
+
{
|
146
|
+
title: '操作',
|
147
|
+
width: 80,
|
148
|
+
toolbar: '#currentTableBar_follows',
|
149
|
+
align: "center",
|
150
|
+
fixed: 'right'
|
151
|
+
}
|
152
|
+
]
|
153
|
+
],
|
154
|
+
limit: 20,
|
155
|
+
limits: [10,15,20,30,40,50,60,70,80,90],
|
156
|
+
page: true,
|
157
|
+
});
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
var sort = {}, search = {};
|
164
|
+
table.on('sort(teachers_table)', function (obj) {
|
165
|
+
sort.field = obj.field;
|
166
|
+
sort.order = obj.type;
|
167
|
+
table.reload('teachers_table', {
|
168
|
+
initSort: obj,
|
169
|
+
where: {
|
170
|
+
sort: sort,
|
171
|
+
q: search
|
172
|
+
}
|
173
|
+
});
|
174
|
+
})
|
175
|
+
|
176
|
+
// 监听搜索操作
|
177
|
+
form.on('submit(search_follows)', function (data) {
|
178
|
+
search = data.field
|
179
|
+
table.reload('teachers_table', {
|
180
|
+
page: {
|
181
|
+
curr: 1
|
182
|
+
},
|
183
|
+
where: {q: search, sort: sort}
|
184
|
+
}, 'data');
|
185
|
+
table.reload('businesses_table', {
|
186
|
+
page: {
|
187
|
+
curr: 1
|
188
|
+
},
|
189
|
+
where: {q: search, sort: sort}
|
190
|
+
}, 'data');
|
191
|
+
form.val('search_form', {
|
192
|
+
name: data.field.name, department: data.field.department, staff_id: data.field.staff_id, area: data.field.area
|
193
|
+
})
|
194
|
+
return false;
|
195
|
+
});
|
196
|
+
|
197
|
+
form.on('submit(reset_follows_search)', function (data) {
|
198
|
+
var field = data.field;
|
199
|
+
form.val('search_follows', {
|
200
|
+
area: "",
|
201
|
+
follows_date: "",
|
202
|
+
name: "",
|
203
|
+
department: "",
|
204
|
+
staff_id: ""
|
205
|
+
})
|
206
|
+
return false;
|
207
|
+
});
|
208
|
+
table.on('tool(teachers_table)', function (obj) {
|
209
|
+
var data = obj.data;
|
210
|
+
id = data.id
|
211
|
+
if (obj.event === 'add_event') { // 监听添加操作
|
212
|
+
var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
|
213
|
+
var openWH = miniPage.getOpenWidthHeight();
|
214
|
+
show_index = layer.open({
|
215
|
+
title: '查看商机跟进记录',
|
216
|
+
type: 1,
|
217
|
+
shade: 0.2,
|
218
|
+
maxmin: true,
|
219
|
+
shadeClose: true,
|
220
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
221
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
222
|
+
content: content
|
223
|
+
});
|
224
|
+
$(window).on("resize", function () {
|
225
|
+
layer.full(index);
|
226
|
+
});
|
227
|
+
} else if (obj.event === 'business') {
|
228
|
+
console.log(data);
|
229
|
+
business_id = data.business_id
|
230
|
+
business_name = data.business
|
231
|
+
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + data.business_id);
|
232
|
+
openWH = miniPage.getOpenWidthHeight();
|
233
|
+
index = layer.open({
|
234
|
+
title: '商机列表/' + data.business + '的跟进记录',
|
235
|
+
type: 1,
|
236
|
+
shade: 0.2,
|
237
|
+
maxmin: true,
|
238
|
+
shadeClose: true,
|
239
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
240
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
241
|
+
content: content
|
242
|
+
});
|
243
|
+
$(window).on("resize", function () {
|
244
|
+
layer.full(index);
|
245
|
+
});
|
246
|
+
}
|
247
|
+
});
|
248
|
+
|
249
|
+
});
|
250
|
+
</script>
|
251
|
+
<style>
|
252
|
+
.layui-table-tool-temp{
|
253
|
+
padding-right: 30px; !important;
|
254
|
+
}
|
255
|
+
</style>
|
@@ -77,10 +77,10 @@
|
|
77
77
|
</div>
|
78
78
|
</div>
|
79
79
|
<br>
|
80
|
-
<div class="layui-inline">
|
80
|
+
<div class="layui-inline place_select">
|
81
81
|
<label class="layui-form-label">渠道</label>
|
82
|
-
<div class="layui-input-inline">
|
83
|
-
|
82
|
+
<div class="layui-input-inline" style="z-index: 101">
|
83
|
+
<div id="edit_place" style="width: 190px;"></div>
|
84
84
|
</div>
|
85
85
|
</div>
|
86
86
|
<div class="layui-inline">
|
@@ -89,6 +89,15 @@
|
|
89
89
|
<input name="divide_amount" class="layui-input" value="<%= @follow_up.divide_amount%>">
|
90
90
|
</div>
|
91
91
|
</div>
|
92
|
+
<div class="layui-form-item">
|
93
|
+
<div class="layui-inline">
|
94
|
+
<label class="layui-form-label">所属年度</label>
|
95
|
+
<div class="layui-input-inline">
|
96
|
+
<input type="text" class="layui-input" name="year" autocomplete="off" id="edit_year"
|
97
|
+
value="<%= @follow_up&.year%>"
|
98
|
+
placeholder="请选择年度"> </div>
|
99
|
+
</div>
|
100
|
+
</div>
|
92
101
|
<div class="layui-form-item">
|
93
102
|
<label class="layui-form-label">指定跟进人</label>
|
94
103
|
<div class="layui-input-inline">
|
@@ -141,6 +150,10 @@
|
|
141
150
|
laydate.render({
|
142
151
|
elem: '#invitation_at_edit'
|
143
152
|
})
|
153
|
+
laydate.render({
|
154
|
+
elem: '#edit_year',
|
155
|
+
type: 'year'
|
156
|
+
})
|
144
157
|
|
145
158
|
laydate.render({
|
146
159
|
elem: '#reception_at_edit'
|
@@ -174,6 +187,49 @@
|
|
174
187
|
}
|
175
188
|
})
|
176
189
|
sales_list.setValue(gon.sales)
|
190
|
+
var places_list = xmSelect.render({
|
191
|
+
el: '#edit_place',
|
192
|
+
remoteSearch: true,
|
193
|
+
clickClose: true,
|
194
|
+
model: {
|
195
|
+
icon: 'hidden',
|
196
|
+
label: {
|
197
|
+
type: 'text',
|
198
|
+
text: {
|
199
|
+
//左边拼接的字符
|
200
|
+
left: '',
|
201
|
+
//右边拼接的字符
|
202
|
+
right: '',
|
203
|
+
//中间的分隔符
|
204
|
+
separator: ', ',
|
205
|
+
},
|
206
|
+
}
|
207
|
+
},
|
208
|
+
delay: 1000,
|
209
|
+
radio: true,
|
210
|
+
paging: true,
|
211
|
+
pageRemote: true,
|
212
|
+
filterable: true,
|
213
|
+
remoteMethod: function (val, cb, show, pageIndex) {
|
214
|
+
$.ajax( '/missions/sales_place', {
|
215
|
+
method: 'get',
|
216
|
+
data: {
|
217
|
+
q: val,
|
218
|
+
page: pageIndex
|
219
|
+
},
|
220
|
+
dataType: 'json',
|
221
|
+
success: function (res) {
|
222
|
+
var data = res.data;
|
223
|
+
if (res.code == 0) {
|
224
|
+
cb(res.data, res.count);
|
225
|
+
} else {
|
226
|
+
layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
|
227
|
+
}
|
228
|
+
}
|
229
|
+
})
|
230
|
+
}
|
231
|
+
})
|
232
|
+
places_list.setValue(gon.place)
|
177
233
|
|
178
234
|
form.render();
|
179
235
|
form.on('submit(update_follow_up)', function (data) {
|
@@ -181,8 +237,9 @@
|
|
181
237
|
sales_list.getValue().forEach(function(d) {
|
182
238
|
assign_follow.push(d.value);
|
183
239
|
})
|
184
|
-
|
185
|
-
|
240
|
+
data.field.assign_follow_up = assign_follow;
|
241
|
+
data.field.place_id = places_list.getValue()[0].value;
|
242
|
+
request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
|
186
243
|
if (res.success == false) {
|
187
244
|
layer.alert(res.msg)
|
188
245
|
} else {
|
@@ -190,6 +247,7 @@
|
|
190
247
|
parent.layer.close(parent.layer.getFrameIndex(window.name))
|
191
248
|
parent.table.reload('sale_plan_follow_table')
|
192
249
|
parent.table.reload('businesses_table')
|
250
|
+
parent.table.reload('teachers_table')
|
193
251
|
}
|
194
252
|
})
|
195
253
|
|
@@ -198,4 +256,9 @@
|
|
198
256
|
});
|
199
257
|
|
200
258
|
});
|
201
|
-
</script>
|
259
|
+
</script>
|
260
|
+
<style>
|
261
|
+
.place_select xm-select > .xm-body{
|
262
|
+
width: 300px; !important;
|
263
|
+
}
|
264
|
+
</style>
|
@@ -118,16 +118,14 @@
|
|
118
118
|
var id = data.id
|
119
119
|
name = data.disk_filename
|
120
120
|
folder = gon.folder
|
121
|
-
console.log(folder);
|
122
121
|
if (obj.event === 'preview') {
|
123
122
|
if (data.content_type.split("/")[0] === "image"){
|
124
123
|
layer.photos({
|
125
|
-
photos: { "data": [{"src": '/
|
124
|
+
photos: { "data": [{"src": '/files/educode_sales/' + name}] }
|
126
125
|
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
|
127
126
|
});
|
128
127
|
}else if (data.content_type.split("/")[1] === "pdf"){
|
129
|
-
var pdf = '/
|
130
|
-
console.log(pdf);
|
128
|
+
var pdf = '/files/educode_sales/' + name;
|
131
129
|
var openWH = miniPage.getOpenWidthHeight();
|
132
130
|
layer.open({
|
133
131
|
title: data.name,
|