educode_sales 0.9.82 → 0.9.83

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5c4108bbab976a92d5f43a438e6d39e16331c222a0046a45745e6730e751a87
4
- data.tar.gz: 7e13154cfed9228addd477ffd99ae03ba8d0defcba553f586078ad440035f7d8
3
+ metadata.gz: e769e1841e12580e3813a004cc14dca465f65b884df4152f78bcc212aa4f2c75
4
+ data.tar.gz: 04c60143e5bac234b3384359b3edfa651d4daac44145672e2d6cce9a75ea6679
5
5
  SHA512:
6
- metadata.gz: 40591e809b707f2c944e7662373e3d3160eecd854407aa900fc520c2a498a681c1e75e5c012ecab902debaefa41bcb636bdcb9a5717100fcfb5ba25bf3cc4737
7
- data.tar.gz: e7c0c20ceae1b0fbadd8547cd6cf209e762bbe1b451d8659c20ff59b0f1244b94861f066134e4e7cf71fbe213f5e523cb64d5b3a52acdd99bd79d03e7d245de4
6
+ metadata.gz: 0a68e73f50aa323fb5fdb40d17885d04dda68460d2bb899aa2297a984f6497ea66dadaaaaaaeb03d41716d006b19235ff23063d2a0292e13671bce5d8a3732c1
7
+ data.tar.gz: 28cb221ad77fc7c40a592e045c7f0c381b6938292bbaff792513a01ac1611ba9fd884b0049de218ee9ab48fa783555110e410216184ce7f81d4f6cb2ef9f68fa
@@ -3,7 +3,7 @@ require_dependency "educode_sales/application_controller"
3
3
  module EducodeSales
4
4
  class SaleTrendsController < ApplicationController
5
5
  # authorize_resource class: false
6
-
6
+ include SaleTrendsHelper
7
7
  def trends
8
8
  # authorize! :trends, EducodeSales::SaleTrend
9
9
  @year = params[:year] ? params[:year] : Time.now.year
@@ -382,6 +382,64 @@ module EducodeSales
382
382
  end
383
383
  end
384
384
 
385
+ def goal_forecast
386
+ respond_to do |format|
387
+ format.html do
388
+
389
+ end
390
+ format.js do
391
+ staff_id = params[:staff_id] || nil
392
+ @forecast_count_range = params[:forecast_count_range] || "month"
393
+ forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%m") }.uniq
394
+ sale_names = %w[计划投标额 实际中标额]
395
+ case @forecast_count_range
396
+ when "week"
397
+ # 年初第一天周数是0会导致周数重复计算
398
+ if params[:forecast_date_day].present?
399
+ date = params[:forecast_date_day].split(" - ")
400
+ dates = (date[0].to_date..date[1].to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
401
+ @forecast_count_data = goal_forecast_week(dates, sale_names, staff_id)
402
+ else
403
+ forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
404
+ @forecast_count_data = goal_forecast_week(forecast_default_dates, sale_names, staff_id)
405
+ end
406
+ when "quarter"
407
+ # 按年
408
+ if params[:forecast_date_year].present?
409
+ date = params[:forecast_date_year].split(" - ")
410
+ dates = (date[0]..date[1]).to_a
411
+ dates = dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
412
+ @forecast_count_data = goal_forecast_quarter(dates, sale_names, staff_id)
413
+ else
414
+ forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y") }.uniq
415
+ forecast_default_dates = forecast_default_dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
416
+ @forecast_count_data = goal_forecast_quarter(forecast_default_dates, sale_names, staff_id)
417
+ end
418
+ when "month" # 按月
419
+ if params[:forecast_date_month].present?
420
+ date = params[:forecast_date_month].split(" - ")
421
+ date[0] = (date[0] + "-01").to_date.to_s
422
+ date[1] = (date[1] + "-01").to_date.end_of_month.to_s
423
+ dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
424
+ @forecast_count_data = goal_forecast_month(dates, sale_names, staff_id)
425
+ else
426
+ @forecast_count_data = goal_forecast_month(forecast_default_dates, sale_names, staff_id)
427
+ end
428
+ else
429
+ # 按年
430
+ if params[:forecast_date_year].present?
431
+ date = params[:forecast_date_year].split(" - ")
432
+ dates = (date[0]..date[1]).to_a
433
+ @forecast_count_data = goal_forecast_year(dates, sale_names, staff_id)
434
+ else
435
+ forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y") }.uniq
436
+ @forecast_count_data = goal_forecast_year(forecast_default_dates, sale_names, staff_id)
437
+ end
438
+ end
439
+ end
440
+ end
441
+ end
442
+
385
443
  private
386
444
 
387
445
  def sale_trend_params
@@ -390,7 +448,7 @@ module EducodeSales
390
448
 
391
449
  def business_followup_charts(dates, names, x_business_ids, colors, date, clazz)
392
450
  not_business = x_business_ids.present? ? x_business_ids.join(',') : ''
393
- staff_ids = names.present? ? names.map { |d| d[1]}.join(",") : ''
451
+ staff_ids = names.present? ? names.map { |d| d[1] }.join(",") : ''
394
452
 
395
453
  sql = "SELECT DATE_FORMAT(created_at, '#{clazz}') as week, count(*) as counts, staff_id
396
454
  FROM educode_sales_follow_ups
@@ -0,0 +1,220 @@
1
+ module EducodeSales
2
+ module SaleTrendsHelper
3
+
4
+ def goal_forecast_quarter(labels, selects, staff_id = nil)
5
+ plan_get = plan_get(staff_id, labels, "quarter")
6
+ actual_get = actual_get(staff_id, labels, "quarter")
7
+ datasets = selects.map do |select|
8
+ if select == "计划投标额"
9
+ {
10
+ label: select,
11
+ data: labels.map do |d|
12
+ quarter = d.split("-").last.to_i
13
+ year = d.split("-").first.to_i
14
+ plan_get[[year, quarter]]&.pluck(:budget_amount)&.reject(&:blank?)&.sum.to_f
15
+ end,
16
+ backgroundColor: [
17
+ 'rgba(255, 99, 132, 0.2)',
18
+ ],
19
+ borderColor: [
20
+ 'rgba(255,99,132,1)',
21
+ ],
22
+ borderWidth: 1
23
+ }
24
+ else
25
+ {
26
+ label: select,
27
+ data: labels.map do |d|
28
+ quarter = d.split("-").last.to_i
29
+ year = d.split("-").first.to_i
30
+ actual_get[[year, quarter]]&.pluck(:actual_amount)&.reject(&:blank?)&.sum.to_f
31
+ end,
32
+ backgroundColor: [
33
+ 'rgba(54, 162, 235, 0.2)',
34
+ ],
35
+ borderColor: [
36
+ 'rgba(54, 162, 235, 1)',
37
+ ],
38
+ borderWidth: 1
39
+ }
40
+ end
41
+ end
42
+
43
+ {
44
+ labels: labels,
45
+ datasets: datasets
46
+ }
47
+ end
48
+
49
+ def goal_forecast_week(labels, selects, staff_id = nil)
50
+
51
+ plan_get = plan_get(staff_id, labels, "week")
52
+ actual_get = actual_get(staff_id, labels, "week")
53
+ datasets = selects.map do |select|
54
+ if select == "计划投标额"
55
+ {
56
+ label: select,
57
+ data: labels.map do |d|
58
+ week = d.split("-").last
59
+ year = d.split("-").first
60
+ yearweek = "#{year}#{week}".to_i
61
+ plan_get[yearweek].to_f
62
+ end,
63
+ backgroundColor: [
64
+ 'rgba(255, 99, 132, 0.2)',
65
+ ],
66
+ borderColor: [
67
+ 'rgba(255,99,132,1)',
68
+ ],
69
+ borderWidth: 1
70
+ }
71
+ else
72
+ {
73
+ label: select,
74
+ data: labels.map do |d|
75
+ week = d.split("-").last
76
+ year = d.split("-").first
77
+ yearweek = "#{year}#{week}".to_i
78
+ actual_get[yearweek].to_f
79
+ end,
80
+ backgroundColor: [
81
+ 'rgba(54, 162, 235, 0.2)',
82
+ ],
83
+ borderColor: [
84
+ 'rgba(54, 162, 235, 1)',
85
+ ],
86
+ borderWidth: 1
87
+ }
88
+ end
89
+ end
90
+
91
+ {
92
+ labels: labels,
93
+ datasets: datasets
94
+ }
95
+ end
96
+
97
+ def goal_forecast_month(labels, selects, staff_id = nil)
98
+ plan_get = plan_get(staff_id, labels, "month")
99
+ actual_get = actual_get(staff_id, labels, "month")
100
+ datasets = selects.map do |select|
101
+ if select == "计划投标额"
102
+ {
103
+ label: select,
104
+ data: labels.map do |d|
105
+ month = d.split("-").last.to_i
106
+ year = d.split("-").first.to_i
107
+ plan_get[[year, month]]&.pluck(:budget_amount)&.reject(&:blank?)&.sum.to_f
108
+ end,
109
+ backgroundColor: [
110
+ 'rgba(255, 99, 132, 0.2)',
111
+ ],
112
+ borderColor: [
113
+ 'rgba(255,99,132,1)',
114
+ ],
115
+ borderWidth: 1
116
+ }
117
+ else
118
+ {
119
+ label: select,
120
+ data: labels.map do |d|
121
+ month = d.split("-").last.to_i
122
+ year = d.split("-").first.to_i
123
+ actual_get[[year, month]]&.pluck(:actual_amount)&.reject(&:blank?)&.sum.to_f
124
+ end,
125
+ backgroundColor: [
126
+ 'rgba(54, 162, 235, 0.2)',
127
+ ],
128
+ borderColor: [
129
+ 'rgba(54, 162, 235, 1)',
130
+ ],
131
+ borderWidth: 1
132
+ }
133
+ end
134
+ end
135
+
136
+ {
137
+ labels: labels,
138
+ datasets: datasets
139
+ }
140
+ end
141
+
142
+ def goal_forecast_year(labels, selects, staff_id = nil)
143
+ plan_get = plan_get(staff_id, labels, "year")
144
+ actual_get = actual_get(staff_id, labels, "year")
145
+ datasets = selects.map do |select|
146
+ if select == "计划投标额"
147
+ {
148
+ label: select,
149
+ data: labels.map { |d| plan_get[d.to_i] || 0 },
150
+ backgroundColor: [
151
+ 'rgba(255, 99, 132, 0.2)',
152
+ ],
153
+ borderColor: [
154
+ 'rgba(255,99,132,1)',
155
+ ],
156
+ borderWidth: 1
157
+ }
158
+ else
159
+ {
160
+ label: select,
161
+ data: labels.map { |d| actual_get[d.to_i] || 0 },
162
+ backgroundColor: [
163
+ 'rgba(54, 162, 235, 0.2)',
164
+ ],
165
+ borderColor: [
166
+ 'rgba(54, 162, 235, 1)',
167
+ ],
168
+ borderWidth: 1
169
+ }
170
+ end
171
+ end
172
+
173
+ {
174
+ labels: labels,
175
+ datasets: datasets
176
+ }
177
+ end
178
+
179
+ private
180
+
181
+ def plan_get(staff_id, time_range, type)
182
+ # budget_amount 预算额
183
+ staff_id = staff_id.present? ? Array(staff_id) : nil
184
+ data = Business.joins(:last_follow_up)
185
+ .where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", time_range.first, time_range.last)
186
+ case type
187
+ when "week"
188
+ data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum(:budget_amount)
189
+ when "quarter"
190
+ data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.invitation_at) as quarter, year(educode_sales_follow_ups.invitation_at) as year")
191
+ data.group_by { |d| [d.year, d.quarter] }
192
+ when "month"
193
+ data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year, month(educode_sales_follow_ups.invitation_at) as month")
194
+ data.group_by { |d| [d.year, d.month] }
195
+ when "year"
196
+ data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year").group("year(educode_sales_follow_ups.invitation_at)").sum(:budget_amount)
197
+ end
198
+ end
199
+
200
+ def actual_get(staff_id, time_range, type)
201
+ # actual_amount 合同额
202
+ staff_id = staff_id.present? ? Array(staff_id) : nil
203
+ data = Business.joins(:last_follow_up)
204
+ .where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ? #{staff_id.present? ? "AND educode_sales_follow_ups.staff_id in (#{staff_id.join(",")})" : ""}", time_range.first, time_range.last)
205
+ case type
206
+ when "week"
207
+ data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum(:actual_amount)
208
+ when "quarter"
209
+ data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.bidded_date) as quarter, year(educode_sales_follow_ups.bidded_date) as year")
210
+ data.group_by { |d| [d.year, d.quarter] }
211
+ when "month"
212
+ data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year, month(educode_sales_follow_ups.bidded_date) as month")
213
+ data.group_by { |d| [d.year, d.month] }
214
+ when "year"
215
+ data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year").group("year(educode_sales_follow_ups.bidded_date)").sum(:actual_amount)
216
+ end
217
+ end
218
+
219
+ end
220
+ end
@@ -516,8 +516,8 @@
516
516
  },
517
517
  {
518
518
  field: 'invitation_at',
519
- width: 105,
520
- title: '招标时间',
519
+ width: 150,
520
+ title: '计划投标时间',
521
521
  sort: true,
522
522
  hide: gon.filter.invitation_at
523
523
  },
@@ -0,0 +1,166 @@
1
+ <div id="tab_6" lay-filter="test1">
2
+ <div class="" style="padding-right: 50px">
3
+ <div style="margin: 10px 10px 10px 10px">
4
+ <form class="layui-form layui-form-pane" lay-filter="search_form">
5
+ <div class="layui-form-item">
6
+ <div class="layui-inline m-t-10">
7
+ <label class="layui-form-label">销售人员</label>
8
+ <div class="layui-input-inline">
9
+ <%= select_tag "staff_id", options_for_select(EducodeSales::Staff.all.includes(:user).map { |d| [d.user.real_name, d.id] }, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true } %>
10
+ </div>
11
+ </div>
12
+ <div class="layui-inline m-t-10">
13
+ <label class="layui-form-label">视图</label>
14
+ <div class="layui-input-inline">
15
+ <%= select_tag "forecast_count_range", options_for_select([['按周', 'week'], ['按月', 'month'], ['按季', 'quarter'], ['按年', 'year']], params[:forecast_count_range] || "month"), { 'lay-filter': 'forecast_count' } %>
16
+ </div>
17
+ </div>
18
+ <div class="layui-inline">
19
+ <label class="layui-form-label">时间范围</label>
20
+ <div class="layui-input-inline">
21
+ <input type="text" class="layui-input forecast_month " id="forecast_date_month" name="forecast_date_month" placeholder=" - " value="<%= params[:forecast_date_month].present? ? params[:forecast_date_month] : Time.now.year.to_s + "-01" + " - " + Time.now.strftime("%Y-%m") %>" autocomplete="off">
22
+ <input type="text" class="layui-input forecast_year layui-hide" id="forecast_date_year" name="forecast_date_year" placeholder=" - " value="<%= params[:forecast_date_year] %>" autocomplete="off">
23
+ <input type="text" class="layui-input forecast_day layui-hide" id="forecast_date_day" name="forecast_date_day" placeholder=" - " value="<%= params[:forecast_date_day] %>" autocomplete="off">
24
+ </div>
25
+ </div>
26
+ <div class="layui-inline">
27
+ <button type="button" id="search_bt" class="forecast_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_sales">确定
28
+ </button>
29
+ </div>
30
+ </div>
31
+ </form>
32
+ </div>
33
+ <canvas id="forecast_myChart2" width="960" height="350"></canvas>
34
+ <!-- <canvas id="forecast_myChart2_1" width="960" height="350" style="margin-top: 30px;display: none"></canvas>-->
35
+ </div>
36
+ </div>
37
+ <script>
38
+ var forecast_type = "<%=@forecast_count_range %>";
39
+ layui.use(['form', 'jquery', 'request', 'element'], function () {
40
+ form = layui.form;
41
+
42
+ var opt = {
43
+ events: false,
44
+ tooltips: {
45
+ enabled: false
46
+ },
47
+ layout: {
48
+ padding: {
49
+ left: 50,
50
+ right: 50,
51
+ top: 0,
52
+ bottom: 0
53
+ }
54
+ },
55
+ hover: {
56
+ animationDuration: 0
57
+ },
58
+ animation: {
59
+ duration: 1,
60
+ onComplete: function () {
61
+ var chartInstance = this.chart, ctx = chartInstance.ctx;
62
+ ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);
63
+ ctx.textAlign = 'center';
64
+ ctx.textBaseline = 'bottom';
65
+
66
+ this.data.datasets.forEach(function (dataset, i) {
67
+ ctx.fillStyle = "#444";
68
+ var meta = chartInstance.controller.getDatasetMeta(i);
69
+ meta.data.forEach(function (bar, index) {
70
+ var data = dataset.data[index];
71
+ ctx.fillText(data, bar._model.x, bar._model.y - 5);
72
+ });
73
+ });
74
+ }
75
+ }
76
+ };
77
+
78
+ var res_data = <%=raw @forecast_count_data.to_json %>;
79
+ var datasets = [];
80
+ var color = ['#44D7B6', '#4CACFF', '#F7B500', '#FF0000', '#FF7F00'];
81
+ res_data.datasets.forEach(function (d, i) {
82
+ datasets.push({
83
+ label: d.label,
84
+ type: 'line',
85
+ data: d.data1,
86
+ borderColor: color[i],
87
+ pointRadius: 1,
88
+ fill: false,
89
+ lineTension: 0
90
+ })
91
+ })
92
+
93
+ laydate.render({
94
+ type: 'year',
95
+ elem: '#forecast_date_year',
96
+ range: true
97
+ });
98
+ laydate.render({
99
+ elem: '#forecast_date_day',
100
+ range: true
101
+ });
102
+ laydate.render({
103
+ type: 'month',
104
+ elem: '#forecast_date_month',
105
+ range: true
106
+ });
107
+
108
+ if (forecast_type == "month") {
109
+ $(".forecast_year").addClass('layui-hide')
110
+ $(".forecast_day").addClass('layui-hide')
111
+ $(".forecast_month").removeClass('layui-hide')
112
+ } else if (forecast_type == "year" || forecast_type == "quarter") {
113
+ $(".forecast_month").addClass('layui-hide')
114
+ $(".forecast_year").removeClass('layui-hide')
115
+ $(".forecast_day").addClass('layui-hide')
116
+ } else {
117
+ $(".forecast_day").removeClass('layui-hide')
118
+ $(".forecast_month").addClass('layui-hide')
119
+ $(".forecast_year").addClass('layui-hide')
120
+ }
121
+
122
+ form.on('select(forecast_count)', function (data) {
123
+ const value = data.value;
124
+ if (value == "month") {
125
+ $(".forecast_year").addClass('layui-hide')
126
+ $(".forecast_day").addClass('layui-hide')
127
+ $(".forecast_month").removeClass('layui-hide')
128
+ } else if (value == "year" || value == "quarter") {
129
+ $(".forecast_month").addClass('layui-hide')
130
+ $(".forecast_year").removeClass('layui-hide')
131
+ $(".forecast_day").addClass('layui-hide')
132
+ } else {
133
+ $(".forecast_day").removeClass('layui-hide')
134
+ $(".forecast_month").addClass('layui-hide')
135
+ $(".forecast_year").addClass('layui-hide')
136
+ }
137
+ })
138
+
139
+
140
+ var ctx = document.getElementById('forecast_myChart2');
141
+ var forecast_myChart2 = new Chart(ctx, {
142
+ type: 'line',
143
+ data: <%=raw @forecast_count_data.to_json %>,
144
+ options: {
145
+ elements: {
146
+ line: {
147
+ tension: 0
148
+ }
149
+ }
150
+ }
151
+ });
152
+ form.render();
153
+ form.on("submit(search_sales)", function (data) {
154
+ var layer_index = layer.load(0, {shade: [0.1, '#fff']});
155
+ Rails.ajax({
156
+ url: '/missions/sale_trends/goal_forecast',
157
+ type: 'GET',
158
+ data: $.param(data.field, true),
159
+ dataType: "script",
160
+ success: function (res) {
161
+ layer.close(layer_index);
162
+ }
163
+ });
164
+ })
165
+ })
166
+ </script>
@@ -0,0 +1 @@
1
+ $("#page_6").html("<%= j render 'goal_forecast' %>");
@@ -5,18 +5,19 @@
5
5
  <li class="">销售额分析</li>
6
6
  <li class="">商机区域分布</li>
7
7
  <li class="">销售人员跟进分析</li>
8
+ <li class="">中标预测图</li>
8
9
  </ul>
9
- <div class="layui-tab-content">
10
+ <div class="layui-tab-content">
10
11
  <div class="layui-tab-item layui-show">
11
12
  <form class="layui-form" action="">
12
13
  <div class="welcome">
13
14
  <div class="content-body" style="padding: 15px;">
14
- <div class="m-b-10">
15
- <i class="fa fa-warning icon"></i>年度
16
- <div class="layui-input-inline">
17
- <%= select_tag "years", options_for_select(@years, @year), {'lay-filter': 'year'} %>
18
- </div>
15
+ <div class="m-b-10">
16
+ <i class="fa fa-warning icon"></i>年度
17
+ <div class="layui-input-inline">
18
+ <%= select_tag "years", options_for_select(@years, @year), { 'lay-filter': 'year' } %>
19
19
  </div>
20
+ </div>
20
21
  <div class="layui-card-bodys">
21
22
  <div class="">
22
23
  <div class="layui-row layui-col-space30">
@@ -25,7 +26,7 @@
25
26
  <div class="panel-body">
26
27
  <div class="panel-title">
27
28
  <% if can? :sale_trends, EducodeSales::SaleTrend %>
28
- <span class="layui-icon layui-icon-edit pull-right" id="chance_money_edit"></span>
29
+ <span class="layui-icon layui-icon-edit pull-right" id="chance_money_edit"></span>
29
30
  <% end %>
30
31
  <h5>商机目标</h5>
31
32
  </div>
@@ -220,58 +221,63 @@
220
221
  <div id="page_2"></div>
221
222
  </div>
222
223
 
223
- <div class="layui-tab-item">
224
+ <div class="layui-tab-item">
224
225
  <div id="page_3"></div>
225
- </div>
226
+ </div>
226
227
 
227
- <div class="layui-tab-item">
228
- <div id="page_4"></div>
229
- </div>
230
- <div class="layui-tab-item">
231
- <div id="page_5"></div>
232
- </div>
228
+ <div class="layui-tab-item">
229
+ <div id="page_4"></div>
230
+ </div>
231
+ <div class="layui-tab-item">
232
+ <div id="page_5"></div>
233
+ </div>
234
+ <div class="layui-tab-item">
235
+ <div id="page_6"></div>
236
+ </div>
233
237
  </div>
234
238
  </div>
235
239
 
236
240
 
237
- <script>
241
+ <script>
238
242
  layui.use(['form', 'jquery', 'request', 'element'], function () {
239
- var $ = layui.jquery,
240
- form = layui.form,
241
- request = layui.request;
243
+ var $ = layui.jquery,
244
+ form = layui.form,
245
+ request = layui.request;
242
246
  var year = "<%= @year %>";
243
247
  var element = layui.element;
244
248
  laydate = layui.laydate;
245
249
  element.render();
246
- element.on('tab(sale_trend_tab)', function(data) {
247
- if (data.index == 1 && $("#tab_2").length == 0) {
248
- loadPage('/missions/sale_trends/business_followup_analysis')
249
- } else if (data.index == 2 && $("#tab_3").length == 0 ) {
250
- loadPage('/missions/sale_trends/sales_analysis')
251
- } else if (data.index == 3 && $("#tab_4").length == 0 ) {
252
- loadPage('/missions/sale_trends/business_area')
253
- } else if (data.index == 4 && $("#tab_5").length == 0 ) {
254
- loadPage('/missions/sale_trends/sales_followup_analysis')
255
- }
250
+ element.on('tab(sale_trend_tab)', function (data) {
251
+ if (data.index == 1 && $("#tab_2").length == 0) {
252
+ loadPage('/missions/sale_trends/business_followup_analysis')
253
+ } else if (data.index == 2 && $("#tab_3").length == 0) {
254
+ loadPage('/missions/sale_trends/sales_analysis')
255
+ } else if (data.index == 3 && $("#tab_4").length == 0) {
256
+ loadPage('/missions/sale_trends/business_area')
257
+ } else if (data.index == 4 && $("#tab_5").length == 0) {
258
+ loadPage('/missions/sale_trends/sales_followup_analysis')
259
+ } else if (data.index == 5 && $("#tab_6").length == 0) {
260
+ loadPage('/missions/sale_trends/goal_forecast')
261
+ }
256
262
  });
257
263
 
258
264
 
259
265
  function loadPage(url) {
260
- var layer_index = layer.load(0, {shade: [0.1, '#fff']});
261
- Rails.ajax({
262
- url: url,
263
- type: 'GET',
264
- dataType: "script",
265
- success: function (res) {
266
- layer.close(layer_index);
267
- }
268
- });
266
+ var layer_index = layer.load(0, {shade: [0.1, '#fff']});
267
+ Rails.ajax({
268
+ url: url,
269
+ type: 'GET',
270
+ dataType: "script",
271
+ success: function (res) {
272
+ layer.close(layer_index);
273
+ }
274
+ });
269
275
  }
270
276
 
271
277
  function editForm(el) {
272
- $("#" + el + "_edit").click(function() {
273
- if ($("#" + el + "_field")[0].classList.contains("layui-hide")) {
274
- $("#" + el + "_field").removeClass("layui-hide")
278
+ $("#" + el + "_edit").click(function () {
279
+ if ($("#" + el + "_field")[0].classList.contains("layui-hide")) {
280
+ $("#" + el + "_field").removeClass("layui-hide")
275
281
  $("#" + el + "_value").addClass("layui-hide")
276
282
  } else {
277
283
  $("#" + el + "_field").addClass("layui-hide")
data/config/routes.rb CHANGED
@@ -122,6 +122,7 @@ EducodeSales::Engine.routes.draw do
122
122
  get :sales_analysis
123
123
  get :business_area
124
124
  get :sales_followup_analysis
125
+ get :goal_forecast
125
126
  end
126
127
  end
127
128
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.82'
2
+ VERSION = '0.9.83'
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.9.82
4
+ version: 0.9.83
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-09 00:00:00.000000000 Z
11
+ date: 2023-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -185,6 +185,7 @@ files:
185
185
  - app/helpers/educode_sales/business_helper.rb
186
186
  - app/helpers/educode_sales/follow_up_helper.rb
187
187
  - app/helpers/educode_sales/home_helper.rb
188
+ - app/helpers/educode_sales/sale_trends_helper.rb
188
189
  - app/helpers/educode_sales/sessions_helper.rb
189
190
  - app/helpers/educode_sales/teachers_helper.rb
190
191
  - app/jobs/educode_sales/application_job.rb
@@ -516,10 +517,12 @@ files:
516
517
  - app/views/educode_sales/sale_reports/show.html.erb
517
518
  - app/views/educode_sales/sale_trends/_business_area.html.erb
518
519
  - app/views/educode_sales/sale_trends/_business_followup_analysis.html.erb
520
+ - app/views/educode_sales/sale_trends/_goal_forecast.html.erb
519
521
  - app/views/educode_sales/sale_trends/_sales_analysis.html.erb
520
522
  - app/views/educode_sales/sale_trends/_sales_followup_analysis.html.erb
521
523
  - app/views/educode_sales/sale_trends/business_area.js.erb
522
524
  - app/views/educode_sales/sale_trends/business_followup_analysis.js.erb
525
+ - app/views/educode_sales/sale_trends/goal_forecast.js.erb
523
526
  - app/views/educode_sales/sale_trends/operations.html.erb
524
527
  - app/views/educode_sales/sale_trends/sales_analysis.js.erb
525
528
  - app/views/educode_sales/sale_trends/sales_followup_analysis.js.erb