educode_sales 0.6.3 → 0.6.7
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/assets/images/educode_sales/money_plans.png +0 -0
- data/app/controllers/educode_sales/activities_controller.rb +0 -2
- data/app/controllers/educode_sales/businesses_controller.rb +103 -47
- data/app/controllers/educode_sales/money_plans_controller.rb +65 -0
- data/app/controllers/educode_sales/roles_controller.rb +4 -1
- data/app/controllers/educode_sales/sale_trends_controller.rb +145 -30
- data/app/controllers/educode_sales/staffs_controller.rb +3 -4
- data/app/controllers/educode_sales/teacher_follows_controller.rb +1 -93
- data/app/models/educode_sales/business_export_record.rb +5 -0
- data/app/models/educode_sales/permission.rb +2 -1
- data/app/models/educode_sales/role_area.rb +1 -0
- data/app/views/educode_sales/activities/index.html.erb +7 -1
- data/app/views/educode_sales/activities/new.html.erb +1 -1
- data/app/views/educode_sales/businesses/_follows.html.erb +15 -15
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +13 -4
- data/app/views/educode_sales/businesses/edit_plan.html.erb +5 -2
- data/app/views/educode_sales/businesses/export_records.html.erb +53 -0
- data/app/views/educode_sales/businesses/export_records.json.jbuilder +11 -0
- data/app/views/educode_sales/businesses/file.html.erb +8 -4
- data/app/views/educode_sales/businesses/index.html.erb +121 -14
- data/app/views/educode_sales/businesses/index.json.jbuilder +34 -4
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +10 -5
- data/app/views/educode_sales/businesses/show_follow.html.erb +1 -0
- data/app/views/educode_sales/commons/index.html.erb +7 -1
- data/app/views/educode_sales/customers/edit.html.erb +690 -10
- data/app/views/educode_sales/customers/edit_follow_record.html.erb +1 -1
- data/app/views/educode_sales/customers/index.json.jbuilder +2 -1
- data/app/views/educode_sales/customers/new.html.erb +691 -11
- data/app/views/educode_sales/customers/new_follow_record.html.erb +1 -1
- data/app/views/educode_sales/customers/show_follow.html.erb +1 -1
- data/app/views/educode_sales/money_plans/index.html.erb +222 -0
- data/app/views/educode_sales/money_plans/index.json.jbuilder +21 -0
- data/app/views/educode_sales/places/index.html.erb +16 -2
- data/app/views/educode_sales/places/index.json.jbuilder +3 -1
- data/app/views/educode_sales/plans/_monthPlan.html.erb +2 -1
- data/app/views/educode_sales/plans/_weekPlan.html.erb +2 -1
- data/app/views/educode_sales/recycles/business.json.jbuilder +2 -2
- data/app/views/educode_sales/roles/edit.html.erb +8 -0
- data/app/views/educode_sales/roles/index.html.erb +7 -1
- data/app/views/educode_sales/sale_trends/trends.html.erb +145 -33
- data/app/views/educode_sales/sale_trends/trends.json.jbuilder +4 -14
- data/app/views/educode_sales/sales/index.html.erb +2 -0
- data/app/views/educode_sales/sales/index.json.jbuilder +2 -2
- data/app/views/educode_sales/sales/operations.json.jbuilder +2 -2
- data/app/views/educode_sales/teachers/index.html.erb +15 -7
- data/app/views/layouts/educode_sales/application.html.erb +18 -2
- data/config/routes.rb +4 -0
- data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +10 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +9 -2
@@ -20,7 +20,7 @@
|
|
20
20
|
<h5>商机目标</h5>
|
21
21
|
</div>
|
22
22
|
<div class="panel-content y-t-10">
|
23
|
-
<h1 class="no-margins" id="chance_money_value"
|
23
|
+
<h1 class="no-margins" id="chance_money_value"><%=@sale_trend.present? ? @sale_trend.chance_money : EducodeSales::SaleTrend.sum(:chance_money)%>万</h1>
|
24
24
|
<div id="chance_money_field" class="layui-hide">
|
25
25
|
<input type="text" name="chance_money" autocomplete="off"
|
26
26
|
class="layui-input" id="chance_money">
|
@@ -39,7 +39,7 @@
|
|
39
39
|
<h5>中标目标</h5>
|
40
40
|
</div>
|
41
41
|
<div class="panel-content y-t-10">
|
42
|
-
<h1 class="no-margins" id="ballot_money_value"
|
42
|
+
<h1 class="no-margins" id="ballot_money_value"><%=@sale_trend.present? ? @sale_trend.ballot_money : EducodeSales::SaleTrend.sum(:ballot_money)%>万</h1>
|
43
43
|
<div id="ballot_money_field" class="layui-hide">
|
44
44
|
<input type="text" name="ballot_money" autocomplete="off" class="layui-input" id="ballot_money">
|
45
45
|
</div>
|
@@ -57,7 +57,7 @@
|
|
57
57
|
<h5>签单目标</h5>
|
58
58
|
</div>
|
59
59
|
<div class="panel-content y-t-10">
|
60
|
-
<h1 class="no-margins" id="sign_money_value"
|
60
|
+
<h1 class="no-margins" id="sign_money_value"><%=@sale_trend.present? ? @sale_trend.sign_money : EducodeSales::SaleTrend.sum(:sign_money)%>万</h1>
|
61
61
|
<div id="sign_money_field" class="layui-hide">
|
62
62
|
<input type="text" name="sign_money" autocomplete="off" class="layui-input" id="sign_money">
|
63
63
|
</div>
|
@@ -75,7 +75,7 @@
|
|
75
75
|
<h5>回款目标</h5>
|
76
76
|
</div>
|
77
77
|
<div class="panel-content y-t-10">
|
78
|
-
<h1 class="no-margins" id="returned_money_value"
|
78
|
+
<h1 class="no-margins" id="returned_money_value"><%=@sale_trend.present? ? @sale_trend.returned_money : EducodeSales::SaleTrend.sum(:returned_money)%>万</h1>
|
79
79
|
<div id="returned_money_field" class="layui-hide">
|
80
80
|
<input type="text" name="returned_money" autocomplete="off" class="layui-input" id="returned_money">
|
81
81
|
</div>
|
@@ -88,7 +88,7 @@
|
|
88
88
|
<div class="panel layui-bg-number">
|
89
89
|
<div class="panel-body">
|
90
90
|
<div class="panel-title">
|
91
|
-
<h5>现有商机<a href="/missions/businesses?name=(
|
91
|
+
<h5>现有商机<a href="/missions/businesses?name=(销售态势-<%=@year %>-现有商机)" style="color: #0000FF;float: right">查看商机</a></h5>
|
92
92
|
</div>
|
93
93
|
<div class="panel-content y-t-10">
|
94
94
|
<h1 class="no-margins"><%= @business_amount %>万</h1>
|
@@ -195,12 +195,12 @@
|
|
195
195
|
</div>
|
196
196
|
</form>
|
197
197
|
<br>
|
198
|
-
<div class="
|
198
|
+
<div class="" id="商机跟进数">
|
199
199
|
<ul class="layui-tab-title">
|
200
200
|
<li class="layui-this">商机跟进数</li>
|
201
201
|
</ul>
|
202
|
-
<div class="
|
203
|
-
<div class="
|
202
|
+
<div class="" style="padding-right: 50px">
|
203
|
+
<div class=" layui-show " style="padding-left: 20px">
|
204
204
|
<div style="margin: 10px 10px 10px 10px">
|
205
205
|
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
206
206
|
<div class="layui-form-item">
|
@@ -213,14 +213,14 @@
|
|
213
213
|
<div class="layui-inline">
|
214
214
|
<label class="layui-form-label">时间范围</label>
|
215
215
|
<div class="layui-input-inline">
|
216
|
-
<input type="text" class="layui-input month layui-hide" id="date_month" name="date_month" placeholder=" - " value="<%=params[:date_month] %>" >
|
217
|
-
<input type="text" class="layui-input year layui-hide" id="date_year" name="date_year" placeholder=" - " value="<%=params[:date_year] %>">
|
218
|
-
<input type="text" class="layui-input week " id="date_week" name="date_week" placeholder=" - " value="<%=params[:date_week].present? ? params[:date_week] : (Time.now - 30.days).beginning_of_week.to_s(:date) + ' - ' + Time.now.end_of_week.to_s(:date) %>">
|
219
|
-
<input type="text" class="layui-input day layui-hide" id="date" name="date" placeholder=" - " value="<%=params[:date] %>">
|
216
|
+
<input type="text" class="layui-input month layui-hide" id="date_month" name="date_month" placeholder=" - " value="<%=params[:date_month] %>" autocomplete="off" >
|
217
|
+
<input type="text" class="layui-input year layui-hide" id="date_year" name="date_year" placeholder=" - " value="<%=params[:date_year] %>" autocomplete="off">
|
218
|
+
<input type="text" class="layui-input week " id="date_week" name="date_week" placeholder=" - " value="<%=params[:date_week].present? ? params[:date_week] : (Time.now - 30.days).beginning_of_week.to_s(:date) + ' - ' + Time.now.end_of_week.to_s(:date) %>" autocomplete="off">
|
219
|
+
<input type="text" class="layui-input day layui-hide" id="date" name="date" placeholder=" - " value="<%=params[:date] %>" autocomplete="off">
|
220
220
|
</div>
|
221
221
|
</div>
|
222
222
|
<div class="layui-inline">
|
223
|
-
<button type="
|
223
|
+
<button type="button" id="search_bt" class=" follow_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">确定
|
224
224
|
</button>
|
225
225
|
</div>
|
226
226
|
</div>
|
@@ -232,12 +232,12 @@
|
|
232
232
|
</div>
|
233
233
|
<br>
|
234
234
|
<br>
|
235
|
-
<div class="
|
235
|
+
<div class=" " id="销售额分析" lay-filter="test1">
|
236
236
|
<ul class="layui-tab-title">
|
237
237
|
<li class="layui-this">销售额分析</li>
|
238
238
|
</ul>
|
239
|
-
<div class="
|
240
|
-
<div class="
|
239
|
+
<div class="" style="padding-right: 50px">
|
240
|
+
<div class=" layui-show" style="padding-left: 20px">
|
241
241
|
<div style="margin: 10px 10px 10px 10px">
|
242
242
|
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
243
243
|
<div class="layui-form-item">
|
@@ -256,12 +256,12 @@
|
|
256
256
|
<div class="layui-inline">
|
257
257
|
<label class="layui-form-label">时间范围</label>
|
258
258
|
<div class="layui-input-inline">
|
259
|
-
<input type="text" class="layui-input goal_month " id="goal_date_month" name="goal_date_month" placeholder=" - " value="<%=params[:goal_date_month].present? ? params[:goal_date_month] : Time.now.year.to_s + "-01" + " - " + Time.now.strftime("%Y-%m") %>">
|
260
|
-
<input type="text" class="layui-input goal_year layui-hide" id="goal_date_year" name="goal_date_year" placeholder=" - " value="<%=params[:goal_date_year] %>">
|
259
|
+
<input type="text" class="layui-input goal_month " id="goal_date_month" name="goal_date_month" placeholder=" - " value="<%=params[:goal_date_month].present? ? params[:goal_date_month] : Time.now.year.to_s + "-01" + " - " + Time.now.strftime("%Y-%m") %>" autocomplete="off">
|
260
|
+
<input type="text" class="layui-input goal_year layui-hide" id="goal_date_year" name="goal_date_year" placeholder=" - " value="<%=params[:goal_date_year] %>" autocomplete="off">
|
261
261
|
</div>
|
262
262
|
</div>
|
263
263
|
<div class="layui-inline">
|
264
|
-
<button type="
|
264
|
+
<button type="button" id="search_bt" class="goal_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">确定
|
265
265
|
</button>
|
266
266
|
</div>
|
267
267
|
</div>
|
@@ -274,17 +274,79 @@
|
|
274
274
|
</div>
|
275
275
|
<br>
|
276
276
|
<br>
|
277
|
-
<div class="
|
277
|
+
<div class=" " id="销售额分析" lay-filter="test1">
|
278
278
|
<ul class="layui-tab-title">
|
279
279
|
<li class="layui-this">商机区域分布</li>
|
280
280
|
</ul>
|
281
|
-
<div class="
|
282
|
-
<div class="
|
281
|
+
<div class="" style="padding-right: 50px">
|
282
|
+
<div class=" layui-show" style="padding-left: 20px">
|
283
|
+
<div style="margin: 10px 10px 10px 10px">
|
284
|
+
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
285
|
+
<div class="layui-form-item">
|
286
|
+
<div class="layui-inline m-t-10">
|
287
|
+
<label class="layui-form-label">维度</label>
|
288
|
+
<div class="layui-input-inline">
|
289
|
+
<%= select_tag "business_count_type", options_for_select([['按商机总额统计','money'],['按商机数量统计','count']],params[:goal_count_range]), {'lay-filter': 'goal_count'}%>
|
290
|
+
</div>
|
291
|
+
</div>
|
292
|
+
<div class="layui-inline m-t-10">
|
293
|
+
<label class="layui-form-label">商机类型</label>
|
294
|
+
<div class="layui-input-inline">
|
295
|
+
<%= select_tag "business_type", options_for_select(EducodeSales::Common.where(clazz: 'business_type').where.not(extras: "x_class").pluck(:name, :id), params[:clazz_id]), { 'lay-filter': 'clazz_id', include_blank: true } %>
|
296
|
+
</div>
|
297
|
+
</div>
|
298
|
+
<div class="layui-inline">
|
299
|
+
<button type="button" id="search_bt" class="business_bt layui-btn layui-btn-primary" lay-submit lay-filter="business_chart">确定
|
300
|
+
</button>
|
301
|
+
</div>
|
302
|
+
</div>
|
303
|
+
</form>
|
304
|
+
</div>
|
283
305
|
<canvas id="myChart3" width="960" height="200"></canvas>
|
284
306
|
</div>
|
285
307
|
|
286
308
|
</div>
|
287
309
|
</div>
|
310
|
+
<div class=" " id="销售人员跟进分析" lay-filter="test1">
|
311
|
+
<ul class="layui-tab-title">
|
312
|
+
<li class="layui-this">销售人员跟进分析</li>
|
313
|
+
</ul>
|
314
|
+
<div class="" style="padding-right: 50px">
|
315
|
+
<div class=" layui-show" style="padding-left: 20px">
|
316
|
+
<div style="margin: 10px 10px 10px 10px">
|
317
|
+
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
318
|
+
<div class="layui-form-item">
|
319
|
+
<div class="layui-inline m-t-10">
|
320
|
+
<label class="layui-form-label">维度</label>
|
321
|
+
<div class="layui-input-inline">
|
322
|
+
<%= select_tag "customer_count_type", options_for_select([['按跟进客户数统计','money'],['按跟进客户次数统计','count']],params[:goal_count_range]), {'lay-filter': 'goal_count'}%>
|
323
|
+
</div>
|
324
|
+
</div>
|
325
|
+
<div class="layui-inline m-t-10">
|
326
|
+
<label class="layui-form-label">时间范围</label>
|
327
|
+
<div class="layui-input-inline">
|
328
|
+
<% options = [['上周','last_week'],['本周','this_week'],['上月','last_month'],['本月','this_month'],['去年','last_year'],['今年','this_year'],['全部','all'],['自定义','diy']]%>
|
329
|
+
<%= select_tag "customer_time_range", options_for_select(options,'this_year'), { 'lay-filter': 'customer_time_range'} %>
|
330
|
+
</div>
|
331
|
+
</div>
|
332
|
+
<div class="layui-inline m-t-10 layui-hide diy_range" id="diy_range">
|
333
|
+
<label class="layui-form-label">自定义范围</label>
|
334
|
+
<div class="layui-input-inline">
|
335
|
+
<input type="text" class="layui-input" id="customer_date" name="customer_date" placeholder=" - " autocomplete="off">
|
336
|
+
</div>
|
337
|
+
</div>
|
338
|
+
<div class="layui-inline">
|
339
|
+
<button type="button" id="search_bt" class="customer_bt layui-btn layui-btn-primary" lay-submit lay-filter="customer_chart">确定
|
340
|
+
</button>
|
341
|
+
</div>
|
342
|
+
</div>
|
343
|
+
</form>
|
344
|
+
</div>
|
345
|
+
<canvas id="myChart4" width="960" height="200"></canvas>
|
346
|
+
</div>
|
347
|
+
|
348
|
+
</div>
|
349
|
+
</div>
|
288
350
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/chart.js@2.9.1/dist/Chart.min.css">
|
289
351
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.1/dist/Chart.min.js"></script>
|
290
352
|
<script>
|
@@ -307,17 +369,15 @@
|
|
307
369
|
var element = layui.element;
|
308
370
|
laydate = layui.laydate;
|
309
371
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
});
|
320
|
-
});
|
372
|
+
form.on('select(customer_time_range)', function(data){
|
373
|
+
const value = data.value;
|
374
|
+
if(value == "diy"){
|
375
|
+
$(".diy_range").removeClass("layui-hide")
|
376
|
+
}else {
|
377
|
+
$(".diy_range").addClass('layui-hide')
|
378
|
+
}
|
379
|
+
})
|
380
|
+
|
321
381
|
if(follow_type == "day"){
|
322
382
|
$(".year").addClass('layui-hide')
|
323
383
|
$(".month").addClass('layui-hide')
|
@@ -383,6 +443,10 @@
|
|
383
443
|
elem: '#date',
|
384
444
|
range: true
|
385
445
|
});
|
446
|
+
laydate.render({
|
447
|
+
elem: '#customer_date',
|
448
|
+
range: true
|
449
|
+
});
|
386
450
|
laydate.render({
|
387
451
|
elem: '#date_week',
|
388
452
|
range: true
|
@@ -518,5 +582,53 @@
|
|
518
582
|
data: <%=raw @business_data.to_json %>,
|
519
583
|
options: opt
|
520
584
|
});
|
585
|
+
|
586
|
+
var ctx = document.getElementById('myChart4');
|
587
|
+
var myChart4 = new Chart(ctx, {
|
588
|
+
type: 'bar',
|
589
|
+
data: <%=raw @customer_data.to_json %>,
|
590
|
+
options: opt
|
591
|
+
});
|
592
|
+
|
593
|
+
$(document).ready(function () {
|
594
|
+
$(".follow_count_bt").click(function () {
|
595
|
+
layer.load(0, {});
|
596
|
+
$.get('/missions/sale_trends/trends.json?follow_count_range=' + $("#follow_count_range").val() + '&date_month=' + $("#date_month").val() + '&date_week=' + $("#date_week").val() + '&date_year=' + $("#date_year").val() + '&date=' + $("#date").val()).done(function(res) {
|
597
|
+
layer.closeAll('loading');
|
598
|
+
var data1 = res.data1;
|
599
|
+
myChart.data = data1
|
600
|
+
myChart.update()
|
601
|
+
});
|
602
|
+
});
|
603
|
+
$(".goal_count_bt").click(function () {
|
604
|
+
layer.load(0, {});
|
605
|
+
$.get('/missions/sale_trends/trends.json?count_type=' + $("#count_type").val() + '&goal_count_range=' + $("#goal_count_range").val() + '&goal_date_month=' + $("#goal_date_month").val() + '&goal_date_year=' + $("#goal_date_year").val()).done(function(res) {
|
606
|
+
layer.closeAll('loading');
|
607
|
+
var data2 = res.data2;
|
608
|
+
myChart2.data = data2
|
609
|
+
myChart2.update()
|
610
|
+
|
611
|
+
});
|
612
|
+
});
|
613
|
+
$(".business_bt").click(function () {
|
614
|
+
layer.load(0, {});
|
615
|
+
$.get('/missions/sale_trends/trends.json?business_count_type=' + $("#business_count_type").val() + '&business_type=' + $("#business_type").val()).done(function(res) {
|
616
|
+
layer.closeAll('loading');
|
617
|
+
var data3 = res.data3;
|
618
|
+
myChart3.data = data3
|
619
|
+
myChart3.update()
|
620
|
+
});
|
621
|
+
});
|
622
|
+
$(".customer_bt").click(function () {
|
623
|
+
layer.load(0, {});
|
624
|
+
$.get('/missions/sale_trends/trends.json?customer_count_type=' + $("#customer_count_type").val() + '&customer_time_range=' + $("#customer_time_range").val()).done(function(res) {
|
625
|
+
layer.closeAll('loading');
|
626
|
+
var data4 = res.data4;
|
627
|
+
myChart4.data = data4
|
628
|
+
myChart4.update()
|
629
|
+
});
|
630
|
+
});
|
631
|
+
});
|
632
|
+
|
521
633
|
})
|
522
634
|
</script>
|
@@ -1,14 +1,4 @@
|
|
1
|
-
|
2
|
-
json.
|
3
|
-
|
4
|
-
|
5
|
-
json.array! [1,2] do |d|
|
6
|
-
json.label '人名'
|
7
|
-
json.backgroundColor "#fff"
|
8
|
-
json.borderColor "#36A2EB"
|
9
|
-
json.pointBackgroundColor "#36A2EB"
|
10
|
-
json.pointBorderColor "#fff"
|
11
|
-
json.data my_array
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
json.data1 @follow_count_data
|
2
|
+
json.data2 @goal_count_data
|
3
|
+
json.data3 @business_data
|
4
|
+
json.data4 @customer_data
|
@@ -36,7 +36,7 @@ json.data do
|
|
36
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
|
37
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
|
38
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
|
39
|
+
school_count = EducodeSales::CustomerExtension.joins(:school).where(customer_staff_id: d.id).size
|
40
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)
|
41
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)
|
42
42
|
json.school_count school_count
|
@@ -58,7 +58,7 @@ json.data do
|
|
58
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)
|
59
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)
|
60
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
|
61
|
+
follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
|
62
62
|
json.follow_school_count follow_school_count
|
63
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
64
|
follow_school_rate = (follow_school_count!=0 ? school_count.to_f * 100 / follow_school_count : 0).round(2)
|
@@ -17,9 +17,9 @@ json.data do
|
|
17
17
|
else
|
18
18
|
json.area ''
|
19
19
|
end
|
20
|
-
departments = EducodeSales::Business.joins(:
|
20
|
+
departments = (EducodeSales::Business.joins(:follow_ups, [department: :school]).where("educode_sales_follow_ups.staff_id = #{d.id}").select("departments.id, departments.name, schools.name AS school, educode_sales_follow_ups.updated_at") + EducodeSales::Teacher.joins(:follow_up, [department: :school]).where("educode_sales_teacher_follows.staff_id = #{d.id}").select("departments.id, departments.name, schools.name AS school, educode_sales_teacher_follows.updated_at")).uniq{|s| s.id}.size
|
21
21
|
json.departments departments
|
22
|
-
schools = EducodeSales::Business.joins(:
|
22
|
+
schools = EducodeSales::Business.joins(:follow_ups, :department).where("educode_sales_follow_ups.staff_id = #{d.id}").select("COUNT(distinct(departments.school_id)) AS count")[0]['count'] + EducodeSales::Teacher.joins(:follow_up, :department).where("educode_sales_teacher_follows.staff_id = #{d.id}").select("COUNT(distinct(departments.school_id)) AS count")[0]['count']
|
23
23
|
json.schools schools
|
24
24
|
departments_count += departments
|
25
25
|
schools_count += schools
|
@@ -19,44 +19,44 @@
|
|
19
19
|
<%= select_tag "professional_title", options_for_select(['教授', '研究员', '副教授', '副研究员', '讲师', '助理研究员', '助理教授'], @person&.professional_title), { include_blank: true } %>
|
20
20
|
</div>
|
21
21
|
</div>
|
22
|
-
<div class="layui-inline">
|
22
|
+
<div class="layui-inline show_item" style="display:none;">
|
23
23
|
<label class="layui-form-label">导流来源</label>
|
24
24
|
<div class="layui-input-inline">
|
25
25
|
<%= select_tag "teacher_source", options_for_select(EducodeSales::Common.where(clazz: 'teacher_source').pluck(:name, :id)), { include_blank: true } %>
|
26
26
|
</div>
|
27
27
|
</div>
|
28
|
-
<div class="layui-inline">
|
28
|
+
<div class="layui-inline show_item" style="display:none;">
|
29
29
|
<label class="layui-form-label">态度</label>
|
30
30
|
<div class="layui-input-inline">
|
31
31
|
|
32
32
|
<%= select_tag "attitude", options_for_select(EducodeSales::Common.where(clazz: 'teacher_attitude').pluck(:name, :id)), { include_blank: true } %>
|
33
33
|
</div>
|
34
34
|
</div>
|
35
|
-
<div class="layui-inline">
|
35
|
+
<div class="layui-inline show_item" style="display:none;">
|
36
36
|
<label class="layui-form-label">注册时间</label>
|
37
37
|
<div class="layui-input-inline">
|
38
38
|
<input type="text" class="layui-input" id="time" placeholder="请选择时间" autocomplete="off" name="regist_at">
|
39
39
|
</div>
|
40
40
|
</div>
|
41
|
-
<div class="layui-inline">
|
41
|
+
<div class="layui-inline show_item" style="display:none;">
|
42
42
|
<label class="layui-form-label">注册状态</label>
|
43
43
|
<div class="layui-input-inline">
|
44
44
|
<%= select_tag "status", options_for_select([["已注册","1"],["未注册","0"]]), { include_blank: true } %>
|
45
45
|
</div>
|
46
46
|
</div>
|
47
|
-
<div class="layui-inline">
|
47
|
+
<div class="layui-inline show_item" style="display:none;">
|
48
48
|
<label class="layui-form-label">区域</label>
|
49
49
|
<div class="layui-input-inline">
|
50
50
|
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
51
51
|
</div>
|
52
52
|
</div>
|
53
|
-
<div class="layui-inline">
|
53
|
+
<div class="layui-inline show_item" style="display:none;">
|
54
54
|
<label class="layui-form-label">起止时间</label>
|
55
55
|
<div class="layui-input-inline">
|
56
56
|
<input type="text" class="layui-input" id="date" name="date" autocomplete="off" placeholder=" - ">
|
57
57
|
</div>
|
58
58
|
</div>
|
59
|
-
<div class="layui-inline">
|
59
|
+
<div class="layui-inline show_item" style="display:none;">
|
60
60
|
<label class="layui-form-label">教研助理</label>
|
61
61
|
<div class="layui-input-inline">
|
62
62
|
<%= select_tag "assist", options_for_select(@staffs, params[:assist]), { 'lay-filter': 'assist', include_blank: true } %>
|
@@ -68,6 +68,8 @@
|
|
68
68
|
</button>
|
69
69
|
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_teachers">搜 索
|
70
70
|
</button>
|
71
|
+
<a style="padding-left: 20px;color: #0000FF" href="javascript:;" type="submit" class="" lay-submit lay-filter="show_hide">高级搜索
|
72
|
+
</a>
|
71
73
|
</div>
|
72
74
|
</div>
|
73
75
|
</form>
|
@@ -150,12 +152,14 @@
|
|
150
152
|
width: 60,
|
151
153
|
title:'序号',type: 'numbers',
|
152
154
|
totalRowText:'合计',
|
155
|
+
fixed: 'left'
|
153
156
|
|
154
157
|
},
|
155
158
|
{
|
156
159
|
field: 'name',
|
157
160
|
width: 80,
|
158
161
|
title: '姓名',
|
162
|
+
fixed: 'left',
|
159
163
|
templet: "#name"
|
160
164
|
},
|
161
165
|
{
|
@@ -409,6 +413,10 @@
|
|
409
413
|
})
|
410
414
|
return false;
|
411
415
|
});
|
416
|
+
form.on('submit(show_hide)', function (data) {
|
417
|
+
$(".show_item").toggle()
|
418
|
+
return false;
|
419
|
+
});
|
412
420
|
/**
|
413
421
|
* toolbar事件监听
|
414
422
|
*/
|
@@ -9,12 +9,15 @@
|
|
9
9
|
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
|
10
10
|
<%= stylesheet_link_tag "educode_sales/application", media: "all" %>
|
11
11
|
<%= javascript_include_tag "educode_sales/application" %>
|
12
|
+
<script src="https://cdn.jsdelivr.net/npm/cxselect@1.4.0/js/jquery.cxselect.js"></script>
|
13
|
+
<script src="https://cdn.jsdelivr.net/npm/cxselect@1.4.0/js/jquery.cxselect.min.js"></script>
|
14
|
+
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.js"></script>
|
12
15
|
</head>
|
13
16
|
<body class="" id="body">
|
14
17
|
<div class="layui-layout layui-layout-admin " >
|
15
18
|
<div class="layui-header">
|
16
19
|
<a href="/missions">
|
17
|
-
<div class="layui-
|
20
|
+
<div class="layui-bg-black layuimini-logo layui-logo" id="head_a">
|
18
21
|
<%= image_tag "educode_sales/logo.png", class: 'header-logo' %>
|
19
22
|
<span class="app-title">营销系统</span>
|
20
23
|
</div>
|
@@ -22,6 +25,7 @@
|
|
22
25
|
|
23
26
|
|
24
27
|
<ul class="layui-nav i_class" style="left: 200px">
|
28
|
+
<%= image_tag "educode_sales/logo.png", class: 'header-logo tubiao layui-hide-sm layui-hide-xs' %>
|
25
29
|
<li class="layui-nav-item layui-show-xs-inline-block " lay-header-event="menuLeft">
|
26
30
|
<a href="javascript:;"> <i id="leftEnumIcon" class="layui-icon layui-icon-shrink-right"></i></a>
|
27
31
|
</li>
|
@@ -45,7 +49,7 @@
|
|
45
49
|
</ul>
|
46
50
|
</div>
|
47
51
|
|
48
|
-
<div class="layui-side layui-bg-black">
|
52
|
+
<div class="layui-side layui-bg-black" id="head_b">
|
49
53
|
<div class="layui-side-scroll ">
|
50
54
|
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
|
51
55
|
<ul class="layui-nav layui-nav-tree ul"
|
@@ -66,6 +70,10 @@
|
|
66
70
|
<dd><a href="/missions/businesses" class="<%= current?('layui-this', businesses_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/4.商机管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>商机管理</a>
|
67
71
|
</dd>
|
68
72
|
<% end %>
|
73
|
+
<% if can? :read, EducodeSales::MoneyPlan %>
|
74
|
+
<dd><a href="/missions/money_plans" class="<%= current?('layui-this', money_plans_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/money_plans.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>回款计划</a>
|
75
|
+
</dd>
|
76
|
+
<% end %>
|
69
77
|
<% if can? :read, EducodeSales::Customer %>
|
70
78
|
<dd><a href="/missions/customers" class="<%= current?('layui-this', customers_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/客户管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>客户管理</a>
|
71
79
|
</dd>
|
@@ -205,6 +213,10 @@
|
|
205
213
|
$(".i_class").animate({left: '200px'},"fast");
|
206
214
|
$(".layui-nav-item").addClass('layui-nav-itemed')
|
207
215
|
$("#logout").removeClass('layui-nav-itemed')
|
216
|
+
$("#head_b").removeClass('layui-hide-xs')
|
217
|
+
$("#head_a").removeClass('layui-hide-xs')
|
218
|
+
$(".tubiao").addClass('layui-hide')
|
219
|
+
$(".tubiao").addClass('layui-hide-xs')
|
208
220
|
}
|
209
221
|
|
210
222
|
function menuHide(btn) {
|
@@ -212,6 +224,10 @@
|
|
212
224
|
btn.removeClass('layui-icon-shrink-right').addClass('layui-icon-spread-left');
|
213
225
|
body.addClass('layuimini-mini');
|
214
226
|
$(".i_class").animate({left: '60px'});
|
227
|
+
$("#head_b").addClass('layui-hide-xs')
|
228
|
+
$("#head_a").addClass('layui-hide-xs')
|
229
|
+
$(".tubiao").removeClass('layui-hide')
|
230
|
+
$(".tubiao").removeClass('layui-hide-xs')
|
215
231
|
}
|
216
232
|
}
|
217
233
|
});
|
data/config/routes.rb
CHANGED
@@ -20,6 +20,8 @@ EducodeSales::Engine.routes.draw do
|
|
20
20
|
end
|
21
21
|
resources :customer_follows do
|
22
22
|
end
|
23
|
+
resources :money_plans do
|
24
|
+
end
|
23
25
|
|
24
26
|
resources :customers do
|
25
27
|
collection do
|
@@ -80,6 +82,8 @@ EducodeSales::Engine.routes.draw do
|
|
80
82
|
|
81
83
|
resources :businesses do
|
82
84
|
collection do
|
85
|
+
get :export_records
|
86
|
+
get :add_export_records
|
83
87
|
get :show_keys
|
84
88
|
get :add_keys
|
85
89
|
get :show_follow
|
@@ -7,6 +7,16 @@ class CreateEducodeSalesRolePermissions < ActiveRecord::Migration[5.2]
|
|
7
7
|
t.timestamps
|
8
8
|
end
|
9
9
|
if EducodeSales::Permission.last.nil?
|
10
|
+
EducodeSales::Permission.create(name: '导出商机', subject: 'Business', action: 'export_business', clazz: 'business', position: '11')
|
11
|
+
|
12
|
+
|
13
|
+
#附件管理权限
|
14
|
+
EducodeSales::Permission.create(name: '查看附件', subject: 'Business', action: 'show_file', clazz: 'business', position: '11')
|
15
|
+
EducodeSales::Permission.create(name: '上传附件', subject: 'Business', action: 'upload_file', clazz: 'business', position: '11')
|
16
|
+
EducodeSales::Permission.create(name: '下载附件', subject: 'Business', action: 'download_file', clazz: 'business', position: '11')
|
17
|
+
EducodeSales::Permission.create(name: '删除附件', subject: 'Business', action: 'delete_file', clazz: 'business', position: '11')
|
18
|
+
#回款管理权限
|
19
|
+
EducodeSales::Permission.create(name: '查看回款列表', subject: 'MoneyPlan', action: 'read', clazz: 'money_plan', position: '15')
|
10
20
|
|
11
21
|
#客户管理权限
|
12
22
|
EducodeSales::Permission.create(name: '查看客户', subject: 'Customer', action: 'read', clazz: 'customer')
|
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.6.
|
4
|
+
version: 0.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- app/assets/images/educode_sales/loading-2.gif
|
110
110
|
- app/assets/images/educode_sales/loginbg.png
|
111
111
|
- app/assets/images/educode_sales/logo.png
|
112
|
+
- app/assets/images/educode_sales/money_plans.png
|
112
113
|
- app/assets/images/educode_sales/回收站.png
|
113
114
|
- app/assets/images/educode_sales/客户管理.png
|
114
115
|
- app/assets/javascripts/educode_sales/application.js
|
@@ -145,6 +146,7 @@ files:
|
|
145
146
|
- app/controllers/educode_sales/home_controller.rb
|
146
147
|
- app/controllers/educode_sales/import_teachers_controller.rb
|
147
148
|
- app/controllers/educode_sales/key_person_controller.rb
|
149
|
+
- app/controllers/educode_sales/money_plans_controller.rb
|
148
150
|
- app/controllers/educode_sales/operation_plans_controller.rb
|
149
151
|
- app/controllers/educode_sales/operation_reports_controller.rb
|
150
152
|
- app/controllers/educode_sales/operations_controller.rb
|
@@ -175,6 +177,7 @@ files:
|
|
175
177
|
- app/models/educode_sales/application_record.rb
|
176
178
|
- app/models/educode_sales/assign_follow_up.rb
|
177
179
|
- app/models/educode_sales/business.rb
|
180
|
+
- app/models/educode_sales/business_export_record.rb
|
178
181
|
- app/models/educode_sales/common.rb
|
179
182
|
- app/models/educode_sales/course_subject.rb
|
180
183
|
- app/models/educode_sales/customer.rb
|
@@ -210,6 +213,8 @@ files:
|
|
210
213
|
- app/views/educode_sales/businesses/edit.html.erb
|
211
214
|
- app/views/educode_sales/businesses/edit_follow_record.html.erb
|
212
215
|
- app/views/educode_sales/businesses/edit_plan.html.erb
|
216
|
+
- app/views/educode_sales/businesses/export_records.html.erb
|
217
|
+
- app/views/educode_sales/businesses/export_records.json.jbuilder
|
213
218
|
- app/views/educode_sales/businesses/file.html.erb
|
214
219
|
- app/views/educode_sales/businesses/index.html.erb
|
215
220
|
- app/views/educode_sales/businesses/index.json.jbuilder
|
@@ -253,6 +258,8 @@ files:
|
|
253
258
|
- app/views/educode_sales/home/search_teacher.json.jbuilder
|
254
259
|
- app/views/educode_sales/home/search_users.json.jbuilder
|
255
260
|
- app/views/educode_sales/home/statistics.html.erb
|
261
|
+
- app/views/educode_sales/money_plans/index.html.erb
|
262
|
+
- app/views/educode_sales/money_plans/index.json.jbuilder
|
256
263
|
- app/views/educode_sales/operation_plans/_monthPlan.html.erb
|
257
264
|
- app/views/educode_sales/operation_plans/_monthly.html.erb
|
258
265
|
- app/views/educode_sales/operation_plans/_weekPlan.html.erb
|