educode_sales 1.10.49 → 1.10.58

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/educode_sales/modules/easyeditor/easyeditor.css +1 -1
  3. data/app/controllers/educode_sales/application_controller.rb +10 -0
  4. data/app/controllers/educode_sales/business_courses_controller.rb +58 -33
  5. data/app/controllers/educode_sales/businesses_controller.rb +43 -7
  6. data/app/controllers/educode_sales/contracts_controller.rb +6 -0
  7. data/app/controllers/educode_sales/money_plan_records_controller.rb +6 -2
  8. data/app/controllers/educode_sales/money_plans_controller.rb +3 -0
  9. data/app/controllers/educode_sales/sale_trends_controller.rb +1 -1
  10. data/app/controllers/educode_sales/shixun_dectects_controller.rb +77 -16
  11. data/app/controllers/educode_sales/shixuns_controller.rb +65 -4
  12. data/app/controllers/educode_sales/subject_trends_controller.rb +99 -892
  13. data/app/controllers/educode_sales/subjects_controller.rb +29 -18
  14. data/app/helpers/educode_sales/application_helper.rb +3 -1
  15. data/app/helpers/educode_sales/business_courses_helper.rb +29 -6
  16. data/app/helpers/educode_sales/sale_trends_helper.rb +52 -52
  17. data/app/helpers/educode_sales/subject_helper.rb +5 -1
  18. data/app/models/educode_sales/business.rb +5 -5
  19. data/app/models/educode_sales/business_deliver_subject.rb +3 -2
  20. data/app/models/educode_sales/business_subject.rb +9 -3
  21. data/app/models/educode_sales/business_subject_shixun.rb +37 -8
  22. data/app/models/educode_sales/business_subject_staff.rb +1 -0
  23. data/app/views/educode_sales/business_courses/edit.html.erb +30 -4
  24. data/app/views/educode_sales/business_courses/index.html.erb +34 -12
  25. data/app/views/educode_sales/business_courses/index.json.jbuilder +2 -2
  26. data/app/views/educode_sales/business_courses/list_shixuns.html.erb +132 -64
  27. data/app/views/educode_sales/business_courses/list_shixuns.json.jbuilder +12 -6
  28. data/app/views/educode_sales/business_courses/list_subjects.html.erb +29 -34
  29. data/app/views/educode_sales/business_courses/list_subjects.json.jbuilder +7 -2
  30. data/app/views/educode_sales/business_courses/new.html.erb +45 -20
  31. data/app/views/educode_sales/businesses/index.html.erb +11 -9
  32. data/app/views/educode_sales/contracts/_list.html.erb +16 -1
  33. data/app/views/educode_sales/contracts/index.html.erb +5 -2
  34. data/app/views/educode_sales/contracts/list.js.erb +4 -1
  35. data/app/views/educode_sales/money_plan_records/_index.html.erb +21 -5
  36. data/app/views/educode_sales/money_plan_records/index.js.erb +4 -1
  37. data/app/views/educode_sales/money_plans/list.html.erb +6 -2
  38. data/app/views/educode_sales/sale_trends/_return_money_forecast.html.erb +1 -1
  39. data/app/views/educode_sales/sale_trends/_user_stat.html.erb +1 -1
  40. data/app/views/educode_sales/sale_trends/_visit_analysis.html.erb +1 -1
  41. data/app/views/educode_sales/sale_trends/return_money_forecast.js.erb +1 -1
  42. data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
  43. data/app/views/educode_sales/sale_trends/user_stat.js.erb +1 -1
  44. data/app/views/educode_sales/sale_trends/visit_analysis.js.erb +1 -1
  45. data/app/views/educode_sales/shixun_dectects/index.html.erb +97 -47
  46. data/app/views/educode_sales/shixun_dectects/index.json.jbuilder +4 -3
  47. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +1 -1
  48. data/app/views/educode_sales/shixuns/edit.html.erb +35 -13
  49. data/app/views/educode_sales/shixuns/index.html.erb +348 -138
  50. data/app/views/educode_sales/shixuns/index.json.jbuilder +9 -5
  51. data/app/views/educode_sales/shixuns/new.html.erb +22 -12
  52. data/app/views/educode_sales/subject_trends/trends.html.erb +177 -575
  53. data/app/views/educode_sales/subjects/edit.html.erb +4 -4
  54. data/app/views/educode_sales/subjects/index.html.erb +50 -12
  55. data/app/views/educode_sales/subjects/index.json.jbuilder +3 -3
  56. data/app/views/educode_sales/subjects/list_shixuns.html.erb +143 -17
  57. data/app/views/educode_sales/subjects/list_shixuns.json.jbuilder +9 -4
  58. data/app/views/educode_sales/subjects/new.html.erb +4 -4
  59. data/app/views/layouts/educode_sales/application.html.erb +1 -1
  60. data/lib/educode_sales/version.rb +1 -1
  61. metadata +6 -7
  62. data/app/assets/images/educode_sales/indexlogo.png +0 -0
@@ -6,932 +6,139 @@ module EducodeSales
6
6
  include SaleTrendsHelper
7
7
  include SaleTrendsCountHelper
8
8
 
9
+ before_action :subject_url
10
+
9
11
 
10
12
 
11
13
  def trends
14
+ authorize! :status, BusinessDeliverSubject
15
+
16
+
12
17
  @year = params[:year] ? params[:year] : Time.now.year
13
18
  @month = params[:month] ? params[:month] : Time.now.month
14
19
  @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 }
20
+ @years = (1..(Time.now.year - 2014)).reverse_each.map { |d| 2014 + d }
16
21
 
22
+ search_year = Time.now.change(year: @year)
23
+ # 统计时间
24
+ start_time = @month == "全部" ? search_year.change(month: 1).beginning_of_month : search_year.change(month: @month).beginning_of_month
25
+ end_time = @month == "全部" ? search_year.change(month: 12).end_of_month : search_year.change(month: @month).end_of_month
17
26
 
18
-
19
- end
27
+ # 商机交付课程(已交付项目)
28
+ b_d_s = BusinessDeliverSubject.joins(business: :last_follow_up).where("educode_sales_follow_ups.reception_at BETWEEN '#{start_time}' AND '#{end_time}' ")
29
+ @completed_b_count = b_d_s.delivered.count
30
+ @uncompleted_b_count = b_d_s.undelivered.count
20
31
 
32
+ # 实践课程
33
+ b_subjects = b_d_s.joins(:subjects)
21
34
 
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
35
+ un_b_subjects = BusinessSubject.joins(:subject)
36
+ .where.not(subject_id: b_subjects.pluck("subjects.id"))
37
+ .where("educode_sales_business_subjects.deliver_date BETWEEN '#{start_time}' AND '#{end_time}' ")
98
38
 
99
- end
39
+ @completed_s_count = un_b_subjects.where("subjects.status = 2 or public = 2").count + b_subjects.where("subjects.status = 2 or public = 2").count
40
+ @uncompleted_s_count = un_b_subjects.where.not("subjects.status = 2 or public = 2").count + b_subjects.where.not("subjects.status = 2 or public = 2").count
100
41
 
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
42
 
110
- def operations
111
43
 
112
- end
44
+ # 实践项目
113
45
 
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
46
+ un_b_shixun_ids = b_d_s.joins(business_subjects: :business_subject_shixuns).pluck("educode_sales_business_subject_shixuns.id")
47
+ un_s_shixun_ids = un_b_subjects.joins(:business_subject_shixuns).pluck("educode_sales_business_subject_shixuns.id")
48
+ un_shixun_ids = BusinessSubjectShixun.left_joins(:business_subject)
49
+ .where("educode_sales_business_subjects.id is null and educode_sales_business_subject_shixuns.deliver_date BETWEEN '#{start_time}' AND '#{end_time}' ")
50
+ .pluck("educode_sales_business_subject_shixuns.id")
199
51
 
200
- end
52
+ shixuns = BusinessSubjectShixun.where(id: un_b_shixun_ids + un_s_shixun_ids + un_shixun_ids).left_joins(shixun_producer: [staff: :user])
201
53
 
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
54
+ # todo 待优化
55
+ shixuns = shixuns.distinct("DISTINCT educode_sales_business_subject_shixuns.id")
56
+ all_shixun = shixuns.where("educode_sales_business_subject_shixuns.shixun_type = 1")
57
+ un_shixun = shixuns.where("educode_sales_business_subject_shixuns.shixun_type = 2")
58
+ @money = shixuns.pluralist.completed.sum(:deliver_money)
253
59
 
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
60
 
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
61
+ # all_shixun_users = all_shixun.left_joins(shixun_producer: [staff: :user])
62
+ # un_shixun_users = un_shixun.left_joins(shixun_producer: [staff: :user])
418
63
 
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
64
+ # 管培
65
+ @training_completed_shixuns = all_shixun.training.completed.count
66
+ @training_un_completed_shixuns = all_shixun.training.un_completed.count
67
+ @training_completed_un_shixuns = un_shixun.training.completed.count
68
+ @training_un_completed_un_shixuns = un_shixun.training.un_completed.count
434
69
 
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
70
+ @training_shixuns = all_shixun.training.pluck("DISTINCT users.id ").count == 0 ? 0 : all_shixun.training.count / all_shixun.training.pluck("DISTINCT users.id ").count
71
+ @training_un_shixuns = un_shixun.training.pluck("DISTINCT users.id ").count == 0 ? 0 : un_shixun.training.count / un_shixun.training.pluck("DISTINCT users.id ").count
448
72
 
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
73
+ # 全职
74
+ @worker_completed_shixuns = all_shixun.worker.completed.count
75
+ @worker_un_completed_shixuns = all_shixun.worker.un_completed.count
76
+ @worker_completed_un_shixuns = un_shixun.worker.completed.count
77
+ @worker_un_completed_un_shixuns = un_shixun.worker.un_completed.count
491
78
 
492
- private
79
+ @worker_shixuns = all_shixun.worker.pluck("DISTINCT users.id ").count == 0 ? 0 : all_shixun.worker.count / all_shixun.worker.pluck("DISTINCT users.id ").count
80
+ @worker_un_shixuns = un_shixun.worker.pluck("DISTINCT users.id ").count == 0 ? 0 : un_shixun.worker.count / un_shixun.worker.pluck("DISTINCT users.id ").count
493
81
 
494
- def sale_trend_params
495
- params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
496
- end
497
82
 
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
83
+ # 专职(兼职)
84
+ @pluralist_completed_shixuns = all_shixun.pluralist.completed.count
85
+ @pluralist_un_completed_shixuns = all_shixun.pluralist.un_completed.count
525
86
 
87
+ @pluralist_completed_shixun_money = all_shixun.pluralist.completed.sum(:deliver_money)
88
+ @pluralist_completed_un_shixuns = un_shixun.pluralist.completed.count
89
+ @pluralist_un_completed_un_shixuns = un_shixun.pluralist.un_completed.count
90
+ @pluralist_completed_un_shixun_money = un_shixun.pluralist.completed.sum(:deliver_money)
526
91
 
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
92
+ @pluralist_shixuns = all_shixun.pluralist.pluck("DISTINCT users.id ").count == 0 ? 0 : all_shixun.pluralist.count / all_shixun.pluralist.pluck("DISTINCT users.id ").count
93
+ @pluralist_un_shixuns = un_shixun.pluralist.pluck("DISTINCT users.id ").count == 0 ? 0 : un_shixun.pluralist.count / un_shixun.pluralist.pluck("DISTINCT users.id ").count
652
94
 
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
95
+ # 排名
768
96
 
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]
97
+ producer = BusinessSubjectStaff.joins(staff: :user).shixun_producer.group("users.id").select("COUNT(users.id) num, CONCAT(users.lastname, users.firstname) user_name")
98
+ @max_users = producer.order("num desc").limit(3).map{|d| d.user_name }.join("、")
99
+ @min_users = producer.order("num asc").limit(3).map{|d| d.user_name }.join("、")
821
100
  end
822
101
 
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
102
 
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)
103
+
104
+ def distinct_count(item)
105
+ item.count("DISTINCT educode_sales_business_subject_shixuns.id")
905
106
  end
906
107
 
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)
108
+
109
+ def demo
110
+ # 管培
111
+ @training_completed_shixuns = distinct_count(all_shixun.training.completed)
112
+ p @training_completed_shixuns
113
+ @training_un_completed_shixuns = distinct_count all_shixun.training.un_completed
114
+ @training_completed_un_shixuns = distinct_count un_shixun.training.completed
115
+ @training_un_completed_un_shixuns = distinct_count un_shixun.training.un_completed
116
+ #
117
+ @training_shixuns = all_shixun.training.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count(all_shixun.training) / all_shixun.training.pluck("DISTINCT users.id ").count
118
+ @training_un_shixuns = un_shixun.training.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count(un_shixun.training) / un_shixun.training.pluck("DISTINCT users.id ").count
119
+ #
120
+ # # 全职
121
+ # @worker_completed_shixuns = distinct_count all_shixun.worker.completed
122
+ # @worker_un_completed_shixuns = distinct_count all_shixun.worker.un_completed
123
+ # @worker_completed_un_shixuns = distinct_count un_shixun.worker.completed
124
+ # @worker_un_completed_un_shixuns = distinct_count un_shixun.worker.un_completed
125
+ #
126
+ # @worker_shixuns = all_shixun.worker.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count all_shixun.worker / all_shixun.worker.pluck("DISTINCT users.id ").count
127
+ # @worker_un_shixuns = un_shixun.worker.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count un_shixun.worker / un_shixun.worker.pluck("DISTINCT users.id ").count
128
+ #
129
+ #
130
+ # # 专职(兼职)
131
+ # @pluralist_completed_shixuns = distinct_count all_shixun.pluralist.completed
132
+ # @pluralist_un_completed_shixuns = distinct_count all_shixun.pluralist.un_completed
133
+ #
134
+ # @pluralist_completed_shixun_money = all_shixun.pluralist.completed.distinct("DISTINCT educode_sales_business_subject_shixuns.id").sum(:deliver_money)
135
+ # @pluralist_completed_un_shixuns = distinct_count un_shixun.pluralist.completed
136
+ # @pluralist_un_completed_un_shixuns = distinct_count un_shixun.pluralist.un_completed
137
+ # @pluralist_completed_un_shixun_money = un_shixun.pluralist.completed.distinct("DISTINCT educode_sales_business_subject_shixuns.id").sum(:deliver_money)
138
+ #
139
+ # @pluralist_shixuns = all_shixun.pluralist.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count all_shixun.pluralist.count / all_shixun.pluralist.pluck("DISTINCT users.id ").count
140
+ # @pluralist_un_shixuns = un_shixun.pluralist.pluck("DISTINCT users.id ").count == 0 ? 0 : distinct_count un_shixun.pluralist.count / un_shixun.pluralist.pluck("DISTINCT users.id ").count
935
141
  end
936
142
  end
143
+
937
144
  end