educode_sales 1.10.48 → 1.10.49

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/educode_sales/modules/easyeditor/easyeditor.css +130 -0
  3. data/app/assets/stylesheets/educode_sales/modules/easyeditor/fangge-style.css +4 -0
  4. data/app/controllers/educode_sales/application_controller.rb +12 -0
  5. data/app/controllers/educode_sales/business_courses_controller.rb +230 -0
  6. data/app/controllers/educode_sales/home_controller.rb +7 -0
  7. data/app/controllers/educode_sales/shixun_dectects_controller.rb +111 -0
  8. data/app/controllers/educode_sales/shixuns_controller.rb +157 -0
  9. data/app/controllers/educode_sales/subject_trends_controller.rb +937 -0
  10. data/app/controllers/educode_sales/subjects_controller.rb +202 -0
  11. data/app/helpers/educode_sales/application_helper.rb +8 -0
  12. data/app/helpers/educode_sales/business_courses_helper.rb +37 -0
  13. data/app/helpers/educode_sales/subject_helper.rb +29 -0
  14. data/app/models/educode_sales/business.rb +22 -0
  15. data/app/models/educode_sales/business_deliver_subject.rb +48 -0
  16. data/app/models/educode_sales/business_subject.rb +62 -0
  17. data/app/models/educode_sales/business_subject_shixun.rb +46 -0
  18. data/app/models/educode_sales/business_subject_staff.rb +35 -0
  19. data/app/models/educode_sales/permission.rb +2 -1
  20. data/app/models/educode_sales/shixun_dectect.rb +12 -0
  21. data/app/views/educode_sales/business_courses/edit.html.erb +148 -0
  22. data/app/views/educode_sales/business_courses/index.html.erb +312 -0
  23. data/app/views/educode_sales/business_courses/index.json.jbuilder +16 -0
  24. data/app/views/educode_sales/business_courses/list_shixuns.html.erb +224 -0
  25. data/app/views/educode_sales/business_courses/list_shixuns.json.jbuilder +17 -0
  26. data/app/views/educode_sales/business_courses/list_subjects.html.erb +217 -0
  27. data/app/views/educode_sales/business_courses/list_subjects.json.jbuilder +12 -0
  28. data/app/views/educode_sales/business_courses/new.html.erb +212 -0
  29. data/app/views/educode_sales/shixun_dectects/index.html.erb +466 -0
  30. data/app/views/educode_sales/shixun_dectects/index.json.jbuilder +22 -0
  31. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +60 -0
  32. data/app/views/educode_sales/shixuns/edit.html.erb +186 -0
  33. data/app/views/educode_sales/shixuns/index.html.erb +513 -0
  34. data/app/views/educode_sales/shixuns/index.json.jbuilder +22 -0
  35. data/app/views/educode_sales/shixuns/new.html.erb +251 -0
  36. data/app/views/educode_sales/subject_trends/trends.html.erb +1074 -0
  37. data/app/views/educode_sales/subjects/edit.html.erb +86 -0
  38. data/app/views/educode_sales/subjects/index.html.erb +247 -0
  39. data/app/views/educode_sales/subjects/index.json.jbuilder +16 -0
  40. data/app/views/educode_sales/subjects/list_shixuns.html.erb +228 -0
  41. data/app/views/educode_sales/subjects/list_shixuns.json.jbuilder +17 -0
  42. data/app/views/educode_sales/subjects/new.html.erb +254 -0
  43. data/app/views/layouts/educode_sales/application.html.erb +38 -0
  44. data/config/routes.rb +37 -0
  45. data/lib/educode_sales/version.rb +1 -1
  46. metadata +37 -1
@@ -0,0 +1,937 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class SubjectTrendsController < ApplicationController
5
+ # authorize_resource class: false
6
+ include SaleTrendsHelper
7
+ include SaleTrendsCountHelper
8
+
9
+
10
+
11
+ def trends
12
+ @year = params[:year] ? params[:year] : Time.now.year
13
+ @month = params[:month] ? params[:month] : Time.now.month
14
+ @months = ['全部','1','2','3','4','5','6','7','8','9','10','11','12']
15
+ @years = ['全部'] + (1..(Time.now.year - 2014)).reverse_each.map { |d| 2014 + d }
16
+
17
+
18
+
19
+ end
20
+
21
+
22
+ def trendss
23
+ # authorize! :trends, EducodeSales::SaleTrend
24
+ @year = params[:year] ? params[:year] : Time.now.year
25
+ @years = ['全部'] + (1..(Time.now.year - 2014)).reverse_each.map { |d| 2014 + d }
26
+ x = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
27
+ o = Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
28
+ if (@year == '全部')
29
+ @business_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).sum(:budget_amount).round(2)
30
+ stage_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
31
+ # 中标总金额, 已回款总金额
32
+ total_return = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).select("sum(total_amount) AS total, sum(educode_sales_businesses.return_money) AS return_money")
33
+ @goal_amount = total_return[0]['total']&.round(2) || 0
34
+
35
+ @actual_goal_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).sum(:actual_amount).round(2)
36
+ s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
37
+ @service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).sum(:total_amount).round(2)
38
+ @actual_service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).sum(:actual_amount).round(2)
39
+
40
+
41
+ @return_amount = EducodeSales::MoneyPlanRecord.from("(
42
+ SELECT distinct(educode_sales_money_plan_records.id), educode_sales_money_plan_records.amount
43
+ FROM educode_sales_money_plan_records
44
+ JOIN educode_sales_money_plan_claims ON educode_sales_money_plan_claims.money_plan_record_id = educode_sales_money_plan_records.id
45
+ GROUP BY educode_sales_money_plan_records.id
46
+ ) AS educode_sales_money_plan_records
47
+ ").sum("amount").round(2)
48
+ # @return_amount = Business.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)
49
+ # # @return_amount = total_return[0]['return_money']&.round(2) || 0
50
+ # @receivable_amount = @goal_amount - @return_amount
51
+
52
+ @receivable_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).select("(SUM(educode_sales_follow_ups.actual_amount) - SUM(educode_sales_businesses.return_money)) AS num")
53
+ @receivable_amount = @receivable_amount.present? && @receivable_amount[0]['num'] ? @receivable_amount[0]['num'].round(2) : 0
54
+
55
+ a = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name).pluck(:id)
56
+ @a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).sum(:budget_amount).round(2)
57
+ b = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name).pluck(:id)
58
+ @b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", b).sum(:budget_amount).round(2)
59
+ else
60
+ year_time = "#{@year}-01-01 00:00:00"
61
+ year_over_time = "#{@year}-12-31 23:59:59"
62
+
63
+ @sale_trend = SaleTrend.find_or_create_by(year: @year)
64
+ @business_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).where("educode_sales_follow_ups.year <= ?", @year).sum(:budget_amount).round(2)
65
+ stage_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
66
+
67
+ # 中标总金额, 已回款总金额
68
+ total_return = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", stage_ids).select("sum(total_amount) AS total, sum(educode_sales_businesses.return_money) AS return_money")
69
+ @goal_amount = total_return[0]['total']&.round(2) || 0
70
+
71
+ @actual_goal_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", stage_ids).sum(:actual_amount).round(2)
72
+ s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
73
+ @service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", s_stage_ids).sum(:total_amount).round(2)
74
+ @actual_service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-01-01", "#{@year}-12-31", s_stage_ids).sum(:actual_amount).round(2)
75
+ # @return_amount = Business.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_time, year_over_time).sum(:amount).round(2)
76
+
77
+ @return_amount = EducodeSales::MoneyPlanRecord.from("(
78
+ SELECT distinct(educode_sales_money_plan_records.id), educode_sales_money_plan_records.amount, date_at
79
+ FROM educode_sales_money_plan_records
80
+ JOIN educode_sales_money_plan_claims ON educode_sales_money_plan_claims.money_plan_record_id = educode_sales_money_plan_records.id
81
+ GROUP BY educode_sales_money_plan_records.id
82
+ ) AS educode_sales_money_plan_records
83
+ ").where("educode_sales_money_plan_records.date_at >= ? AND educode_sales_money_plan_records.date_at <= ? ", year_time, year_over_time).sum(:amount).round(2)
84
+ # 往年累计已中标合同
85
+ # @former_goal_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-12-31", stage_ids).sum(:actual_amount).round(2)
86
+ # # 往年累计已回款
87
+ # @former_return_amount = Business.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 <= ? ", year_over_time).sum(:amount).round(2)
88
+ # @receivable_amount = @former_goal_amount - @former_return_amount
89
+
90
+ @receivable_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.bidded_date <= ? AND educode_sales_follow_ups.stage_id IN (?)", "#{@year}-12-31", stage_ids).select("(SUM(educode_sales_follow_ups.actual_amount) - SUM(educode_sales_businesses.return_money)) AS num")
91
+ @receivable_amount = @receivable_amount.present? && @receivable_amount[0]['num'] ? @receivable_amount[0]['num'].round(2) : 0
92
+
93
+ a = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name).pluck(:id)
94
+ @a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).where("educode_sales_follow_ups.year <= ?", @year).sum(:budget_amount).round(2)
95
+ b = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name).pluck(:id)
96
+ @b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", b).where("educode_sales_follow_ups.year <= ?", @year).sum(:budget_amount).round(2)
97
+ end
98
+
99
+ end
100
+
101
+ def sale_trends
102
+ sale_trend = SaleTrend.find_by(year: params[:year])
103
+ if sale_trend.update(sale_trend_params)
104
+ render_success
105
+ else
106
+ render_failure sale_trend
107
+ end
108
+ end
109
+
110
+ def operations
111
+
112
+ end
113
+
114
+ # 商机跟进数
115
+ def business_followup_analysis
116
+ common = EducodeSales::Common.find_by(clazz: 'staff_type', name: '销售')
117
+ names = EducodeSales::Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id, d.role_id] }
118
+ x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
119
+ x_business_ids = EducodeSales::Business.joins(last_follow_up: :clazz).where("educode_sales_commons.id = ?",x).pluck :id
120
+
121
+ @follow_count_range = params[:follow_count_range] || "week"
122
+ # 商机跟进数图表
123
+ respond_to do |format|
124
+ format.html do
125
+
126
+ end
127
+ format.js do
128
+ default_dates = (30.day.ago.to_date..Date.today).map { |d| d.strftime("%Y-%W") }.uniq #默认时间范围
129
+ @follow_count_data = business_followup_charts(default_dates, names, x_business_ids, SaleTrend::COLORS, [30.day.ago.to_date.beginning_of_week, Date.today], "%Y%u") do |default_dates|
130
+ default_dates.map { |date|
131
+ d = date.split("-")
132
+ year = d[0].to_i
133
+ week = d[1].to_i
134
+ if week == 0
135
+ 0
136
+ else
137
+ month = Date.commercial(year, week).strftime("%m月%d日")
138
+ day = Date.commercial(year, week, 7).strftime("%m月%d日")
139
+ date.to_s + "(#{month}-#{day})"
140
+ end
141
+ } - [0]
142
+ end
143
+ end
144
+ format.json do
145
+ if params[:follow_count_range].present?
146
+ case params[:follow_count_range]
147
+ when "week" #按周
148
+ if params[:date_week].present?
149
+ date = params[:date_week].split(" - ")
150
+ # 年初第一天周数是0会导致周数重复计算
151
+ dates = (date[0].to_date..date[1].to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
152
+ @follow_count_data = business_followup_charts(dates, names, x_business_ids, SaleTrend::COLORS, date, "%Y%u") do |dates|
153
+ dates.map { |date|
154
+ d = date.split("-")
155
+ year = d[0].to_i
156
+ week = d[1].to_i
157
+ if week == 0
158
+ 0
159
+ else
160
+ month = Date.commercial(year, week).strftime("%m月%d日")
161
+ day = Date.commercial(year, week, 7).strftime("%m月%d日")
162
+ date.to_s + "(#{month}-#{day})"
163
+ end
164
+ } - [0]
165
+ end
166
+ else
167
+ return render json: {msg: '请选择时间范围', success: false }
168
+ end
169
+ when "month" #按月
170
+ if params[:date_month].present?
171
+ date = params[:date_month].split(" - ")
172
+ dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
173
+ @follow_count_data = business_followup_charts(dates, names, x_business_ids, SaleTrend::COLORS, [(date[0] + "-01").to_date, (date[1] + "-01").to_date.end_of_month], '%Y%m')
174
+ else
175
+ return render json: {msg: '请选择时间范围', success: false }
176
+ end
177
+ when "year" #按年
178
+ if params[:date_year].present?
179
+ date = params[:date_year].split(" - ")
180
+ dates = (date[0]..date[1]).to_a.map { |d| d.to_s}
181
+ @follow_count_data = business_followup_charts(dates, names, x_business_ids, SaleTrend::COLORS, ["#{date[0]}-01-01".to_date.beginning_of_year, "#{date[1]}-01-01".to_date.end_of_year], '%Y')
182
+ else
183
+ return render json: {msg: '请选择时间范围', success: false }
184
+ end
185
+ else
186
+ #按天
187
+ if params[:date].present?
188
+ date = params[:date].split(" - ")
189
+ dates = (date[0].to_date..date[1].to_date).to_a.map { |d| d.to_s}
190
+ @follow_count_data = business_followup_charts(dates, names, x_business_ids, SaleTrend::COLORS, [date[0].to_date, date[1].to_date], '%Y%m%d')
191
+ else
192
+ return render json: {msg: '请选择时间范围', success: false }
193
+ end
194
+ end
195
+ end
196
+ render json: {data: @follow_count_data }
197
+ end
198
+ end
199
+
200
+ end
201
+
202
+ # 销售额分析
203
+ def sales_analysis
204
+ respond_to do |format|
205
+ format.html do
206
+
207
+ end
208
+ format.js do
209
+ x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
210
+ count_type = params[:count_type] || "actual_amount"
211
+ stage_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
212
+ s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
213
+ @goal_count_range = params[:goal_count_range] || "month"
214
+
215
+ goal_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
216
+ sale_names = ['已中标', '已签单', '已回款']
217
+
218
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
219
+ staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
220
+ @staffs = staffs.map { |d| [d.user.real_name, d.id]}
221
+
222
+ if params[:goal_count_range].present?
223
+ case params[:goal_count_range]
224
+ when "week"
225
+ when "month" #按月
226
+ if params[:goal_date_month].present?
227
+ date = params[:goal_date_month].split(" - ")
228
+ date[0] = (date[0] + "-01").to_date.to_s
229
+ date[1] = (date[1] + "-01").to_date.end_of_month.to_s
230
+
231
+ dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
232
+ @goal_count_data = month_sale_chart(dates, sale_names, SaleTrend::COLORS, x, stage_ids, s_stage_ids, count_type, date)
233
+ else
234
+ @goal_count_data = month_sale_chart(goal_default_dates, sale_names, SaleTrend::COLORS, x, stage_ids, s_stage_ids, count_type, ["#{Time.now.year}-01", "#{Time.now.year}-#{Time.now.month}"])
235
+ end
236
+ else
237
+ #按年
238
+ if params[:goal_date_year].present?
239
+ date = params[:goal_date_year].split(" - ")
240
+ dates = (date[0]..date[1]).to_a
241
+ @goal_count_data = year_sale_chart(dates, sale_names, SaleTrend::COLORS, x, stage_ids, s_stage_ids, count_type, date)
242
+ else
243
+ goal_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y") }.uniq
244
+ @goal_count_data = year_sale_chart(goal_default_dates, sale_names, SaleTrend::COLORS, x, stage_ids, s_stage_ids, count_type, ["#{Time.now.year}", "#{Time.now.year}"])
245
+ end
246
+ end
247
+ else
248
+ @goal_count_data = month_sale_chart(goal_default_dates, sale_names, SaleTrend::COLORS, x, stage_ids, s_stage_ids, count_type, ["#{Time.now.year}-01", "#{Time.now.year}-#{Time.now.month}"])
249
+ end
250
+ end
251
+ end
252
+ end
253
+
254
+ # 商机区域分布
255
+ def business_area
256
+ respond_to do |format|
257
+ format.html do
258
+ end
259
+ format.js do
260
+ @business_types = EducodeSales::Common.where(clazz: 'business_type').where.not(extras: "x_class").map { |d| {name: d.name, value: d.id } }
261
+ @select_business_type = params[:business_type].present? ? params[:business_type].split(",") : []
262
+ x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
263
+ o = Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
264
+ provinces = EducodeSales::Common.where(clazz: 'area').pluck(:name)
265
+ if params[:business_count_type] == 'money' || params[:business_count_type].blank?
266
+ data = provinces.map { |province|
267
+ if params[:business_type].blank?
268
+ Business.joins(:last_follow_up).where("educode_sales_businesses.department_id in (?)", School.joins(:departments).where(province: province).pluck("departments.id")).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).sum(:budget_amount).round(2)
269
+ else
270
+ Business.joins(:last_follow_up).where("educode_sales_businesses.department_id in (?)", School.joins(:departments).where(province: province).pluck("departments.id")).where("educode_sales_follow_ups.clazz_id in (?)", params[:business_type].split(",")).sum(:budget_amount).round(2)
271
+ end
272
+ }
273
+ if params[:sort_by].present?
274
+ data_hash = []
275
+ data.each_with_index do |d, i|
276
+ data_hash << {id: i, num: d}
277
+ end
278
+
279
+ data_hash.sort! { |a, b| params[:sort_by] == 'asc' ? a[:num] <=> b[:num] : b[:num] <=> a[:num] }
280
+ data = []
281
+ provinces_sort = []
282
+ data_hash.each_with_index do |d|
283
+ data << d[:num]
284
+ provinces_sort << provinces[d[:id]]
285
+ end
286
+ provinces = provinces_sort
287
+ end
288
+ @business_data = {
289
+ labels: provinces,
290
+ datasets: [
291
+ {
292
+ label: "商机总额",
293
+ data: data,
294
+ backgroundColor: SaleTrend::COLORS[0],
295
+ borderColor: SaleTrend::COLORS[0],
296
+ borderWidth: 1
297
+ }
298
+ ]
299
+ }
300
+ else
301
+ data = provinces.map { |province|
302
+ if params[:business_type].blank?
303
+ Business.joins(:last_follow_up).where("educode_sales_businesses.department_id in (?)", School.joins(:departments).where(province: province).pluck("departments.id")).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).count
304
+ else
305
+ Business.joins(:last_follow_up).where("educode_sales_businesses.department_id in (?)", School.joins(:departments).where(province: province).pluck("departments.id")).where("educode_sales_follow_ups.clazz_id in (?)", params[:business_type].split(",")).count
306
+ end
307
+ }
308
+ if params[:sort_by].present?
309
+ data_hash = []
310
+ data.each_Wit_index do |d, i|
311
+ data_hash << {id: i, num: d}
312
+ end
313
+
314
+ data_hash.sort! { |a, b| params[:sort_by] == 'asc' ? a[:num] <=> b[:num] : b[:num] <=> a[:num] }
315
+ data = []
316
+ provinces_sort = []
317
+ data_hash.each_with_index do |d|
318
+ data << d[:num]
319
+ provinces_sort << provinces[d[:id]]
320
+ end
321
+ provinces = provinces_sort
322
+ end
323
+ @business_data = {
324
+ labels: provinces,
325
+ datasets: [
326
+ {
327
+ label: "商机数量",
328
+ data: data,
329
+ backgroundColor: SaleTrend::COLORS[0],
330
+ borderColor: SaleTrend::COLORS[0],
331
+ borderWidth: 1
332
+ }
333
+ ]
334
+ }
335
+ end
336
+ end
337
+ end
338
+ end
339
+
340
+ # 销售人员跟进分析
341
+ def sales_followup_analysis
342
+ respond_to do |format|
343
+ format.html do
344
+
345
+ end
346
+ format.js do
347
+ # 销售人员跟进分析
348
+ @goal_count_range = params[:goal_count_range] || "month"
349
+ begin_time = Time.now.at_beginning_of_year.to_s
350
+ end_time = Time.now.at_end_of_year.to_s
351
+ customer_time_range = params[:customer_time_range]
352
+ case customer_time_range
353
+ when 'last_week'
354
+ begin_time = (Time.now - 1.week).at_beginning_of_week.to_s
355
+ end_time = (Time.now - 1.week).at_end_of_week.to_s
356
+ when 'this_week'
357
+ begin_time = Time.now.at_beginning_of_week.to_s
358
+ end_time = Time.now.at_end_of_week.to_s
359
+ when 'last_month'
360
+ begin_time = (Time.now - 1.month).at_beginning_of_month.to_s
361
+ end_time = (Time.now - 1.month).at_end_of_month.to_s
362
+ when 'this_month'
363
+ begin_time = Time.now.at_beginning_of_month.to_s
364
+ end_time = Time.now.at_end_of_month.to_s
365
+ when 'last_year'
366
+ begin_time = (Time.now - 1.year).at_beginning_of_year.to_s
367
+ end_time = (Time.now - 1.year).at_end_of_year.to_s
368
+ when 'this_year'
369
+ begin_time = Time.now.at_beginning_of_year.to_s
370
+ end_time = Time.now.at_end_of_year.to_s
371
+ when 'all'
372
+ begin_time = (Time.now - 5.year).at_beginning_of_year.to_s
373
+ end_time = (Time.now + 5.year).at_end_of_year.to_s
374
+ when 'diy'
375
+ if params[:customer_date].present?
376
+ date = params[:customer_date].split(" - ")
377
+ begin_time = date[0] + " 00:00:00"
378
+ end_time = date[1] + " 23:59:59"
379
+ end
380
+ end
381
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
382
+ staff_names = Staff.joins(:user).where(job_type: common.id).map { |d| d.user.real_name }
383
+ staff_ids = Staff.joins(:user).where(job_type: common.id).pluck(:id)
384
+ if params[:customer_count_type] == 'money' || params[:customer_count_type].blank?
385
+ @customer_data = {
386
+ labels: staff_names,
387
+ datasets: [
388
+ {
389
+ label: "跟进客户数",
390
+ data: staff_ids.map { |staff_id|
391
+ (EducodeSales::CustomerFollow.where(staff_id: staff_id).where("created_at >= ? AND created_at <= ?", begin_time, end_time).pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where(staff_id: staff_id).where("created_at >= ? AND created_at <= ?", begin_time, end_time).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
392
+ },
393
+ backgroundColor: SaleTrend::COLORS[0],
394
+ borderColor: SaleTrend::COLORS[0],
395
+ borderWidth: 1
396
+ }
397
+ ]
398
+ }
399
+ else
400
+ @customer_data = {
401
+ labels: staff_names,
402
+ datasets: [
403
+ {
404
+ label: "跟进客户次数",
405
+ data: staff_ids.map { |staff_id|
406
+ EducodeSales::CustomerFollow.where(staff_id: staff_id).where("created_at >= ? AND created_at <= ?", begin_time, end_time).size + EducodeSales::FollowUp.where(staff_id: staff_id).where("created_at >= ? AND created_at <= ?", begin_time, end_time).size
407
+ },
408
+ backgroundColor: SaleTrend::COLORS[0],
409
+ borderColor: SaleTrend::COLORS[0],
410
+ borderWidth: 1
411
+ }
412
+ ]
413
+ }
414
+ end
415
+ end
416
+ end
417
+ end
418
+
419
+ def goal_forecast
420
+ respond_to do |format|
421
+ format.html do
422
+ end
423
+ format.js do
424
+ if params[:forecast_type].blank? || params[:forecast_type] == "money"
425
+ p "按金额"
426
+ goal_forecast_money
427
+ else
428
+ p "按数量"
429
+ goal_forecast_count
430
+ end
431
+ end
432
+ end
433
+ end
434
+
435
+ def user_stat
436
+ respond_to do |format|
437
+ format.html do
438
+
439
+ end
440
+ format.js do
441
+ user_stat = EducodeSales::UserStatService.new
442
+ gon.table_1 = user_stat.table_1
443
+ gon.table_2 = user_stat.table_2(1)
444
+ gon.table_3 = user_stat.table_3
445
+ end
446
+ end
447
+ end
448
+
449
+ #拜访分析
450
+ def visit_analysis
451
+ sort_by = params[:sort_by].present? ? params[:sort_by] : "desc"
452
+ user_name = params[:user_name]
453
+ visit_type = params[:visit_type].present? ? params[:visit_type].split(",") : ""
454
+ title_names = %w[本年拜访数 本季拜访数 本月拜访数 本周拜访数]
455
+ respond_to do |format|
456
+ format.js do
457
+ @user_names = EducodeSales::Attendance.pluck(:name).uniq.map{|d| {name: d, value: d}}
458
+ @visit_types = SaleTrend::VISIT_TYPE.map {|d| {name: d[0], value: d[1]}}
459
+ sql = "SELECT name, count(*) as name_count FROM `educode_sales_attendances` WHERE (attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}') group by name order by name_count desc limit 30"
460
+ visit_count = EducodeSales::Attendance.find_by_sql(sql).map{|d| [d.name, d.name_count]}
461
+ #年拜访量前30的用户名
462
+ top_thirty_username = visit_count.map{ |d| d[0]}
463
+ @visit_count_data = visit_user_type_name(top_thirty_username, sort_by, visit_type, title_names)
464
+ end
465
+ format.json do
466
+ if params[:user_type].present? && params[:user_type] == "name"
467
+ if user_name.present?
468
+ sql_by_name = "SELECT name, count(*) as name_count FROM `educode_sales_attendances` WHERE (attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}') and name like '%#{user_name}%' group by name"
469
+ else
470
+ sql_by_name = "SELECT name, count(*) as name_count FROM `educode_sales_attendances` WHERE (attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}') group by name order by name_count desc limit 30"
471
+ end
472
+ visit_count = EducodeSales::Attendance.find_by_sql(sql_by_name).map{|d| [d.name, d.name_count]}
473
+ #年拜访量前30的用户名
474
+ top_thirty_username = visit_count.map{ |d| d[0]}
475
+ @visit_count_data = visit_user_type_name(top_thirty_username, sort_by, visit_type, title_names)
476
+ else
477
+ if user_name.present?
478
+ sql_by_customer = "SELECT name, customer, count(*) as customer_count FROM `educode_sales_attendances` WHERE (attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}') and name like '%#{user_name}%' group by customer order by customer_count desc limit 30"
479
+ else
480
+ sql_by_customer = "SELECT name, customer, count(*) as customer_count FROM `educode_sales_attendances` WHERE (attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}') group by customer order by customer_count desc limit 30"
481
+ end
482
+ visit_count = EducodeSales::Attendance.find_by_sql(sql_by_customer).map{|d| [d.customer, d.customer_count]}
483
+ #年拜访量前30的用户名
484
+ top_thirty_customer = visit_count.map{ |d| d[0]}
485
+ @visit_count_data = visit_user_type_customer(top_thirty_customer, sort_by, visit_type, title_names)
486
+ end
487
+ render json: {data: @visit_count_data }
488
+ end
489
+ end
490
+ end
491
+
492
+ private
493
+
494
+ def sale_trend_params
495
+ params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
496
+ end
497
+
498
+ def business_followup_charts(dates, names, x_business_ids, colors, date, clazz)
499
+ not_business = x_business_ids.present? ? x_business_ids.join(',') : ''
500
+ staff_ids = names.present? ? names.map { |d| d[1] }.join(",") : ''
501
+
502
+ sql = "SELECT DATE_FORMAT(created_at, '#{clazz}') as week, count(*) as counts, staff_id
503
+ FROM educode_sales_follow_ups
504
+ WHERE date(created_at) >= '#{date[0]}' and date(created_at) <= '#{date[1]}'
505
+ AND business_id NOT IN (#{not_business}) and educode_sales_follow_ups.deleted_at IS NULL
506
+ AND staff_id IN (#{staff_ids})
507
+ GROUP BY DATE_FORMAT(created_at, '#{clazz}'), staff_id"
508
+ data = EducodeSales::FollowUp.find_by_sql(sql).group_by { |d| "#{d['staff_id']}-#{d['week']}" }
509
+ {
510
+ labels: block_given? ? yield(dates) : dates,
511
+ datasets: names.map.with_index do |name, i|
512
+ {
513
+ label: name[0],
514
+ hidden: name[2] == 11, #role_id:11 离职角色
515
+ data: dates.map { |date| data["#{name[1]}-#{ date.gsub("-", '')}"]&.[](0)&.[]('counts') || 0 },
516
+ backgroundColor: "#fff",
517
+ pointBorderColor: colors[i % 50 + 1],
518
+ borderColor: colors[i % 50 + 1],
519
+ pointBackgroundColor: colors[i % 50 + 1],
520
+ borderWidth: 2
521
+ }
522
+ end
523
+ }
524
+ end
525
+
526
+
527
+ def month_sale_chart(dates, names, colors, x, stage_ids, s_stage_ids, count_type, range)
528
+ begin_at = range[0]
529
+ end_at = range[1]
530
+
531
+ business = EducodeSales::Business.joins(:last_follow_up)
532
+ if params[:sales_staff_id].present?
533
+ # 销售经理
534
+ business = business.joins("LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = educode_sales_businesses.last_follow_up_id").
535
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:sales_staff_id], params[:sales_staff_id])
536
+
537
+ end
538
+
539
+ if params[:property].present?
540
+ # 客户类型
541
+ business = business.joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:property])
542
+ end
543
+
544
+ data_1 = business.
545
+ where("educode_sales_follow_ups.clazz_id != ?", x).
546
+ where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).
547
+ where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", begin_at, end_at).
548
+ select("SUM(#{count_type}) AS count_type, DATE_FORMAT(bidded_date, '%Y-%m') AS month").
549
+ group("DATE_FORMAT(bidded_date, '%Y-%m')").
550
+ order("DATE_FORMAT(bidded_date, '%Y-%m')")
551
+ data_1_hash = {}
552
+ data_1_total_hash = {}
553
+ data_1.each do |d|
554
+ data_1_hash[d.month] = d.count_type.round(2)
555
+ end
556
+
557
+ last_month = 0
558
+ last_sum = 0
559
+ dates.each do |month|
560
+ # 只累计当前年份
561
+ if last_month != month.split("-")[0]
562
+ last_sum = 0
563
+ end
564
+ data_1_total_hash[month] = ((data_1_hash[month] || 0) + last_sum).round(2)
565
+ last_sum += data_1_hash[month] || 0
566
+ last_month = month.split("-")[0]
567
+ end
568
+
569
+ data_2 = business.
570
+ where("educode_sales_follow_ups.clazz_id != ?", x).
571
+ where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).
572
+ where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ?", begin_at, end_at).
573
+ select("SUM(#{count_type}) AS count_type, DATE_FORMAT(signed_date, '%Y-%m') AS month").
574
+ group("DATE_FORMAT(signed_date, '%Y-%m')").
575
+ order("DATE_FORMAT(signed_date, '%Y-%m')")
576
+ data_2_hash = {}
577
+ data_2_total_hash = {}
578
+ data_2.each do |d|
579
+ data_2_hash[d.month] = d.count_type.round(2)
580
+ end
581
+
582
+ last_month = 0
583
+ last_sum = 0
584
+ dates.each do |month|
585
+ # 只累计当前年份
586
+ if last_month != month.split("-")[0]
587
+ last_sum = 0
588
+ end
589
+ data_2_total_hash[month] = ((data_2_hash[month] || 0) + last_sum).round(2)
590
+ last_sum += data_2_hash[month] || 0
591
+ last_month = month.split("-")[0]
592
+ end
593
+
594
+ data_3 = business.joins(last_follow_up: :money_plans).
595
+ where("educode_sales_follow_ups.clazz_id != ?", x).
596
+ where.not("educode_sales_money_plans.clazz!= ?", 1).
597
+ where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ?", begin_at, end_at).
598
+ select("SUM(amount) AS count_type, DATE_FORMAT(date_at, '%Y-%m') AS month").
599
+ group("DATE_FORMAT(date_at, '%Y-%m')").
600
+ order("DATE_FORMAT(date_at, '%Y-%m')")
601
+ data_3_hash = {}
602
+ data_3.each do |d|
603
+ data_3_hash[d.month] = d.count_type.round(2)
604
+ end
605
+
606
+ data_3_total_hash = {}
607
+ last_month = 0
608
+ last_sum = 0
609
+ dates.each do |month|
610
+ # 只累计当前年份
611
+ if last_month != month.split("-")[0]
612
+ last_sum = 0
613
+ end
614
+ data_3_total_hash[month] = ((data_3_hash[month] || 0) + last_sum).round(2)
615
+ last_sum += data_3_hash[month] || 0
616
+ last_month = month.split("-")[0]
617
+ end
618
+
619
+
620
+ {
621
+ labels: dates,
622
+ datasets: names.map.with_index do |name, i|
623
+ {
624
+ label: name,
625
+ data: dates.map { |d|
626
+ case i
627
+ when 0
628
+ data_1_hash[d] || 0
629
+ when 1
630
+ data_2_hash[d] || 0
631
+ else
632
+ data_3_hash[d] || 0
633
+ end
634
+ },
635
+ data1: dates.map { |d|
636
+ case i
637
+ when 0
638
+ data_1_total_hash[d] || 0
639
+ when 1
640
+ data_2_total_hash[d] || 0
641
+ else
642
+ data_3_total_hash[d] || 0
643
+ end
644
+ },
645
+ backgroundColor: colors[i],
646
+ borderColor: colors[i],
647
+ borderWidth: 1
648
+ }
649
+ end
650
+ }
651
+ end
652
+
653
+ def year_sale_chart(dates, names, colors, x, stage_ids, s_stage_ids, count_type, range)
654
+ begin_at = range[0].split("-")
655
+ end_at = range[1].split("-")
656
+ begin_at = DateTime.new(begin_at[0].to_i).beginning_of_year.to_date.to_s
657
+ end_at = DateTime.new(end_at[0].to_i).end_of_year.to_date.to_s
658
+
659
+ data_1 = EducodeSales::Business.joins(:last_follow_up).
660
+ where("educode_sales_follow_ups.clazz_id != ?", x).
661
+ where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).
662
+ where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", begin_at, end_at).
663
+ select("SUM(#{count_type}) AS count_type, DATE_FORMAT(bidded_date, '%Y') AS year").
664
+ group("DATE_FORMAT(bidded_date, '%Y')").
665
+ order("DATE_FORMAT(bidded_date, '%Y')")
666
+ data_1_hash = {}
667
+ data_1.each do |d|
668
+ data_1_hash[d.year] = d.count_type.round(2)
669
+ end
670
+
671
+ data_1_total_hash = {}
672
+ last_month = 0
673
+ last_sum = 0
674
+ dates.each do |month|
675
+ # 只累计当前年份
676
+ if last_month != month.split("-")[0]
677
+ last_sum = 0
678
+ end
679
+ data_1_total_hash[month] = ((data_1_hash[month] || 0) + last_sum).round(2)
680
+ last_sum += data_1_hash[month] || 0
681
+ last_month = month.split("-")[0]
682
+ end
683
+
684
+ data_2 = EducodeSales::Business.joins(:last_follow_up).
685
+ where("educode_sales_follow_ups.clazz_id != ?", x).
686
+ where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).
687
+ where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ?", begin_at, end_at).
688
+ select("SUM(#{count_type}) AS count_type, DATE_FORMAT(signed_date, '%Y') AS year").
689
+ group("DATE_FORMAT(signed_date, '%Y')").
690
+ order("DATE_FORMAT(signed_date, '%Y')")
691
+ data_2_hash = {}
692
+ data_2.each do |d|
693
+ data_2_hash[d.year] = d.count_type.round(2)
694
+ end
695
+
696
+ data_2_total_hash = {}
697
+ last_month = 0
698
+ last_sum = 0
699
+ dates.each do |month|
700
+ # 只累计当前年份
701
+ if last_month != month.split("-")[0]
702
+ last_sum = 0
703
+ end
704
+ data_2_total_hash[month] = ((data_2_hash[month] || 0) + last_sum).round(2)
705
+ last_sum += data_2_hash[month] || 0
706
+ last_month = month.split("-")[0]
707
+ end
708
+
709
+ data_3 = EducodeSales::Business.joins(last_follow_up: :money_plans).
710
+ where("educode_sales_follow_ups.clazz_id != ?", x).
711
+ where.not("educode_sales_money_plans.clazz!= ?", 1).
712
+ where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ?", begin_at, end_at).
713
+ select("SUM(amount) AS count_type, DATE_FORMAT(date_at, '%Y') AS year").
714
+ group("DATE_FORMAT(date_at, '%Y')").
715
+ order("DATE_FORMAT(date_at, '%Y')")
716
+ data_3_hash = {}
717
+ data_3.each do |d|
718
+ data_3_hash[d.year] = d.count_type.round(2)
719
+ end
720
+
721
+ data_3_total_hash = {}
722
+ last_month = 0
723
+ last_sum = 0
724
+ dates.each do |month|
725
+ # 只累计当前年份
726
+ if last_month != month.split("-")[0]
727
+ last_sum = 0
728
+ end
729
+
730
+ data_3_total_hash[month] = ((data_3_hash[month] || 0) + last_sum).round(2)
731
+ last_sum += data_3_hash[month] || 0
732
+ last_month = month.split("-")[0]
733
+ end
734
+
735
+
736
+
737
+ {
738
+ labels: dates,
739
+ datasets: names.map.with_index do |name, i|
740
+ {
741
+ label: name,
742
+ data: dates.map { |d|
743
+ case i
744
+ when 0
745
+ data_1_hash[d] || 0
746
+ when 1
747
+ data_2_hash[d] || 0
748
+ else
749
+ data_3_hash[d]|| 0
750
+ end },
751
+ data1: dates.map { |d|
752
+ case i
753
+ when 0
754
+ data_1_total_hash[d] || 0
755
+ when 1
756
+ data_2_total_hash[d] || 0
757
+ else
758
+ data_3_total_hash[d] || 0
759
+ end
760
+ },
761
+ backgroundColor: colors[i],
762
+ borderColor: colors[i],
763
+ borderWidth: 1
764
+ }
765
+ end
766
+ }
767
+ end
768
+
769
+ def goal_forecast_money
770
+ property = params[:property] || nil
771
+ staff_id = params[:staff_id] || nil
772
+ @forecast_count_range = params[:forecast_count_range] || "month"
773
+ 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
774
+ sale_names = %w[计划投标额 计划投标额累计 实际中标额 实际中标额累计]
775
+ case @forecast_count_range
776
+ when "week"
777
+ # 年初第一天周数是0会导致周数重复计算
778
+ if params[:forecast_date_day].present?
779
+ date = params[:forecast_date_day].split(" - ")
780
+ dates = (date[0].to_date..date[1].to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
781
+ @forecast_count_data = goal_forecast_week(dates, sale_names, staff_id, property)
782
+ else
783
+ 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' }
784
+ @forecast_count_data = goal_forecast_week(forecast_default_dates, sale_names, staff_id, property)
785
+ end
786
+ when "quarter"
787
+ # 按年
788
+ if params[:forecast_date_year].present?
789
+ date = params[:forecast_date_year].split(" - ")
790
+ dates = (date[0]..date[1]).to_a
791
+ dates = dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
792
+ @forecast_count_data = goal_forecast_quarter(dates, sale_names, staff_id, property)
793
+ else
794
+ 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
795
+ 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
796
+ @forecast_count_data = goal_forecast_quarter(forecast_default_dates, sale_names, staff_id, property)
797
+ end
798
+ when "month" # 按月
799
+ if params[:forecast_date_month].present?
800
+ date = params[:forecast_date_month].split(" - ")
801
+ date[0] = (date[0] + "-01").to_date.to_s
802
+ date[1] = (date[1] + "-01").to_date.end_of_month.to_s
803
+ dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
804
+ @forecast_count_data = goal_forecast_month(dates, sale_names, staff_id, property)
805
+ else
806
+ @forecast_count_data = goal_forecast_month(forecast_default_dates, sale_names, staff_id, property)
807
+ end
808
+ else
809
+ # 按年
810
+ if params[:forecast_date_year].present?
811
+ date = params[:forecast_date_year].split(" - ")
812
+ dates = (date[0]..date[1]).to_a
813
+ @forecast_count_data = goal_forecast_year(dates, sale_names, staff_id, property)
814
+ else
815
+ 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
816
+ @forecast_count_data = goal_forecast_year(forecast_default_dates, sale_names, staff_id, property)
817
+ end
818
+ end
819
+ @forecast_count_data_0 = @forecast_count_data[0]
820
+ @forecast_count_data_1 = @forecast_count_data[1]
821
+ end
822
+
823
+ def goal_forecast_count
824
+ property = params[:property] || nil
825
+ staff_id = params[:staff_id] || nil
826
+ @forecast_count_range = params[:forecast_count_range] || "month"
827
+ 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
828
+ sale_names = %w[计划投标额 计划投标额累计 实际中标额 实际中标额累计]
829
+ case @forecast_count_range
830
+ when "week"
831
+ # 年初第一天周数是0会导致周数重复计算
832
+ if params[:forecast_date_day].present?
833
+ date = params[:forecast_date_day].split(" - ")
834
+ dates = (date[0].to_date..date[1].to_date).map { |d| d.strftime("%Y-%W") }.uniq.select { |d| d.split("-")[1] != '00' }
835
+ @forecast_count_data = goal_forecast_week_count(dates, sale_names, staff_id, property)
836
+ else
837
+ 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' }
838
+ @forecast_count_data = goal_forecast_week_count(forecast_default_dates, sale_names, staff_id, property)
839
+ end
840
+ when "quarter"
841
+ # 按年
842
+ if params[:forecast_date_year].present?
843
+ date = params[:forecast_date_year].split(" - ")
844
+ dates = (date[0]..date[1]).to_a
845
+ dates = dates.map { |d| [d.to_s + "-" + "1", d.to_s + "-" + "2", d.to_s + "-" + "3", d.to_s + "-" + "4"] }.flatten
846
+ @forecast_count_data = goal_forecast_quarter_count(dates, sale_names, staff_id, property)
847
+ else
848
+ 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
849
+ 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
850
+ @forecast_count_data = goal_forecast_quarter_count(forecast_default_dates, sale_names, staff_id, property)
851
+ end
852
+ when "month" # 按月
853
+ if params[:forecast_date_month].present?
854
+ date = params[:forecast_date_month].split(" - ")
855
+ date[0] = (date[0] + "-01").to_date.to_s
856
+ date[1] = (date[1] + "-01").to_date.end_of_month.to_s
857
+ dates = ((date[0] + "-01").to_date..(date[1] + "-01").to_date).map { |d| d.strftime("%Y-%m") }.uniq
858
+ @forecast_count_data = goal_forecast_month_count(dates, sale_names, staff_id, property)
859
+ else
860
+ @forecast_count_data = goal_forecast_month_count(forecast_default_dates, sale_names, staff_id, property)
861
+ end
862
+ else
863
+ # 按年
864
+ if params[:forecast_date_year].present?
865
+ date = params[:forecast_date_year].split(" - ")
866
+ dates = (date[0]..date[1]).to_a
867
+ @forecast_count_data = goal_forecast_year_count(dates, sale_names, staff_id, property)
868
+ else
869
+ 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
870
+ @forecast_count_data = goal_forecast_year_count(forecast_default_dates, sale_names, staff_id, property)
871
+ end
872
+ end
873
+ @forecast_count_data_0 = @forecast_count_data[0]
874
+ @forecast_count_data_1 = @forecast_count_data[1]
875
+ end
876
+
877
+ def visit_user_type_name(top_thirty_username, sort_by, visit_type, title_names)
878
+ #本年拜访数
879
+ visit_count_year = EducodeSales::Attendance.where("name in (?)", top_thirty_username)
880
+ .where(" attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}' ")
881
+ .group(:name).select("name, count(*) name_count").order("name_count #{sort_by}")&.map{ |d| [d.name, d.name_count]}
882
+
883
+ #本季拜访数
884
+ current_year = Time.now.year
885
+ current_month = Time.now.month
886
+ start_month = (current_month - 1) / 3 * 3 + 1
887
+ end_month = start_month + 2
888
+ start_date = Date.new(current_year, start_month, 1).strftime("%Y-%m-%d") + " 00:00:00"
889
+ end_date = Date.new(current_year, end_month, -1).strftime("%Y-%m-%d") + " 23:59:59"
890
+ visit_count_season = EducodeSales::Attendance.where("name in (?)", top_thirty_username)
891
+ .where("attendance_date >= '#{start_date}' and attendance_date <= '#{end_date}'")
892
+ .group(:name).select("name, count(*) name_count").order("name_count #{sort_by}")&.map{ |d| [d.name, d.name_count]}
893
+
894
+ #本月拜访数
895
+ visit_count_month = EducodeSales::Attendance.where("name in (?)", top_thirty_username)
896
+ .where("attendance_date >= '#{Time.now.beginning_of_month}' and attendance_date <= '#{Time.now.end_of_month}'")
897
+ .group(:name).select("name, count(*) name_count").order("name_count #{sort_by}")&.map{ |d| [d.name, d.name_count]}
898
+
899
+ #本周拜访数
900
+ visit_count_week = EducodeSales::Attendance.where("name in (?)", top_thirty_username)
901
+ .where("attendance_date >= '#{Time.now.beginning_of_week}' and attendance_date <= '#{Time.now.end_of_week}'")
902
+ .group(:name).select("name, count(*) name_count").order("name_count #{sort_by}")&.map{ |d| [d.name, d.name_count]}
903
+
904
+ visit_analysis_charts(visit_count_year, visit_count_season, visit_count_month, visit_count_week, visit_type, title_names)
905
+ end
906
+
907
+ def visit_user_type_customer(top_thirty_customer, sort_by, visit_type, title_names)
908
+ #本年拜访数
909
+ visit_count_year = EducodeSales::Attendance.where("customer in (?)", top_thirty_customer)
910
+ .where(" attendance_date >= '#{Time.now.beginning_of_year}' and attendance_date <= '#{Time.now.end_of_year}' ")
911
+ .group(:customer).select("customer, count(*) customer_count").order("customer_count #{sort_by}")&.map{ |d| [d.customer, d.customer_count]}
912
+
913
+ #本季拜访数
914
+ current_year = Time.now.year
915
+ current_month = Time.now.month
916
+ start_month = (current_month - 1) / 3 * 3 + 1
917
+ end_month = start_month + 2
918
+ start_date = Date.new(current_year, start_month, 1).strftime("%Y-%m-%d") + " 00:00:00"
919
+ end_date = Date.new(current_year, end_month, -1).strftime("%Y-%m-%d") + " 23:59:59"
920
+ visit_count_season = EducodeSales::Attendance.where("customer in (?)", top_thirty_customer)
921
+ .where("attendance_date >= '#{start_date}' and attendance_date <= '#{end_date}'")
922
+ .group(:customer).select("customer, count(*) customer_count").order("customer_count #{sort_by}")&.map{ |d| [d.customer, d.customer_count]}
923
+
924
+ #本月拜访数
925
+ visit_count_month = EducodeSales::Attendance.where("customer in (?)", top_thirty_customer)
926
+ .where("attendance_date >= '#{Time.now.beginning_of_month}' and attendance_date <= '#{Time.now.end_of_month}'")
927
+ .group(:customer).select("customer, count(*) customer_count").order("customer_count #{sort_by}")&.map{ |d| [d.customer, d.customer_count]}
928
+
929
+ #本周拜访数
930
+ visit_count_week = EducodeSales::Attendance.where("customer in (?)", top_thirty_customer)
931
+ .where("attendance_date >= '#{Time.now.beginning_of_week}' and attendance_date <= '#{Time.now.end_of_week}'")
932
+ .group(:customer).select("customer, count(*) customer_count").order("customer_count #{sort_by}")&.map{ |d| [d.customer, d.customer_count]}
933
+
934
+ visit_analysis_charts(visit_count_year, visit_count_season, visit_count_month, visit_count_week, visit_type, title_names)
935
+ end
936
+ end
937
+ end