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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/money_plans.png +0 -0
  3. data/app/controllers/educode_sales/activities_controller.rb +0 -2
  4. data/app/controllers/educode_sales/businesses_controller.rb +103 -47
  5. data/app/controllers/educode_sales/money_plans_controller.rb +65 -0
  6. data/app/controllers/educode_sales/roles_controller.rb +4 -1
  7. data/app/controllers/educode_sales/sale_trends_controller.rb +145 -30
  8. data/app/controllers/educode_sales/staffs_controller.rb +3 -4
  9. data/app/controllers/educode_sales/teacher_follows_controller.rb +1 -93
  10. data/app/models/educode_sales/business_export_record.rb +5 -0
  11. data/app/models/educode_sales/permission.rb +2 -1
  12. data/app/models/educode_sales/role_area.rb +1 -0
  13. data/app/views/educode_sales/activities/index.html.erb +7 -1
  14. data/app/views/educode_sales/activities/new.html.erb +1 -1
  15. data/app/views/educode_sales/businesses/_follows.html.erb +15 -15
  16. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +13 -4
  17. data/app/views/educode_sales/businesses/edit_plan.html.erb +5 -2
  18. data/app/views/educode_sales/businesses/export_records.html.erb +53 -0
  19. data/app/views/educode_sales/businesses/export_records.json.jbuilder +11 -0
  20. data/app/views/educode_sales/businesses/file.html.erb +8 -4
  21. data/app/views/educode_sales/businesses/index.html.erb +121 -14
  22. data/app/views/educode_sales/businesses/index.json.jbuilder +34 -4
  23. data/app/views/educode_sales/businesses/new_follow_record.html.erb +10 -5
  24. data/app/views/educode_sales/businesses/show_follow.html.erb +1 -0
  25. data/app/views/educode_sales/commons/index.html.erb +7 -1
  26. data/app/views/educode_sales/customers/edit.html.erb +690 -10
  27. data/app/views/educode_sales/customers/edit_follow_record.html.erb +1 -1
  28. data/app/views/educode_sales/customers/index.json.jbuilder +2 -1
  29. data/app/views/educode_sales/customers/new.html.erb +691 -11
  30. data/app/views/educode_sales/customers/new_follow_record.html.erb +1 -1
  31. data/app/views/educode_sales/customers/show_follow.html.erb +1 -1
  32. data/app/views/educode_sales/money_plans/index.html.erb +222 -0
  33. data/app/views/educode_sales/money_plans/index.json.jbuilder +21 -0
  34. data/app/views/educode_sales/places/index.html.erb +16 -2
  35. data/app/views/educode_sales/places/index.json.jbuilder +3 -1
  36. data/app/views/educode_sales/plans/_monthPlan.html.erb +2 -1
  37. data/app/views/educode_sales/plans/_weekPlan.html.erb +2 -1
  38. data/app/views/educode_sales/recycles/business.json.jbuilder +2 -2
  39. data/app/views/educode_sales/roles/edit.html.erb +8 -0
  40. data/app/views/educode_sales/roles/index.html.erb +7 -1
  41. data/app/views/educode_sales/sale_trends/trends.html.erb +145 -33
  42. data/app/views/educode_sales/sale_trends/trends.json.jbuilder +4 -14
  43. data/app/views/educode_sales/sales/index.html.erb +2 -0
  44. data/app/views/educode_sales/sales/index.json.jbuilder +2 -2
  45. data/app/views/educode_sales/sales/operations.json.jbuilder +2 -2
  46. data/app/views/educode_sales/teachers/index.html.erb +15 -7
  47. data/app/views/layouts/educode_sales/application.html.erb +18 -2
  48. data/config/routes.rb +4 -0
  49. data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +10 -0
  50. data/lib/educode_sales/version.rb +1 -1
  51. 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"><%= @sale_trend.chance_money %>万</h1>
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"><%= @sale_trend.ballot_money %>万</h1>
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"><%= @sale_trend.sign_money %>万</h1>
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"><%= @sale_trend.returned_money %>万</h1>
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=(销售态势-现有商机)" style="color: #0000FF;float: right">查看商机</a></h5>
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="layui-tab layui-tab-card" id="商机跟进数">
198
+ <div class="" id="商机跟进数">
199
199
  <ul class="layui-tab-title">
200
200
  <li class="layui-this">商机跟进数</li>
201
201
  </ul>
202
- <div class="layui-tab-content" style="padding-right: 50px">
203
- <div class="layui-tab-item layui-show " style="padding-left: 20px">
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="submit" id="search_bt" class=" follow_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">确定
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="layui-tab layui-tab-card " id="销售额分析" lay-filter="test1">
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="layui-tab-content" style="padding-right: 50px">
240
- <div class="layui-tab-item layui-show" style="padding-left: 20px">
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="submit" id="search_bt" class="follow_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">确定
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="layui-tab layui-tab-card " id="销售额分析" lay-filter="test1">
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="layui-tab-content" style="padding-right: 50px">
282
- <div class="layui-tab-item layui-show" style="padding-left: 20px">
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
- $(document).ready(function () {
311
- $(".follow_count_bt").click(function () {
312
- layer.msg("图表绘制中...", {
313
- offset:['40%','46%']
314
- })
315
- layer.load(0, {});
316
- setTimeout(function () {
317
- layer.closeAll('loading');
318
- }, 3000);
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
- my_array = [1,2,3,4,5]
2
- json.data do
3
- json.labels my_array
4
- json.datasets do
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
@@ -77,10 +77,12 @@
77
77
  field: 'id',
78
78
  title:'序号',type: 'numbers',
79
79
  totalRowText:'合计',
80
+ fixed: 'left',
80
81
  width: 80
81
82
  }, {
82
83
  field: 'name',
83
84
  title: '姓名',
85
+ fixed: 'left',
84
86
  width: 100
85
87
  }, {
86
88
  field: 'area',
@@ -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(:last_follow_up).where("educode_sales_follow_ups.staff_id = #{d.id}").select("COUNT(educode_sales_follow_ups.staff_id) AS count")[0]&.send('count') + EducodeSales::Teacher.joins(:follow_up).where("educode_sales_teacher_follows.staff_id = #{d.id}").select("COUNT(educode_sales_teacher_follows.staff_id) AS count")[0]&.send('count') || 0
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(:last_follow_up, :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']
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-hide-xs layui-bg-black layuimini-logo layui-logo">
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')
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.6.3'
2
+ VERSION = '0.6.7'
3
3
  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.6.3
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: 2021-12-24 00:00:00.000000000 Z
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