educode_sales 1.10.49 → 1.10.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/educode_sales/modules/easyeditor/easyeditor.css +1 -1
- data/app/controllers/educode_sales/application_controller.rb +10 -0
- data/app/controllers/educode_sales/business_courses_controller.rb +58 -33
- data/app/controllers/educode_sales/businesses_controller.rb +43 -7
- data/app/controllers/educode_sales/contracts_controller.rb +6 -0
- data/app/controllers/educode_sales/money_plan_records_controller.rb +6 -2
- data/app/controllers/educode_sales/money_plans_controller.rb +3 -0
- data/app/controllers/educode_sales/sale_trends_controller.rb +1 -1
- data/app/controllers/educode_sales/shixun_dectects_controller.rb +77 -16
- data/app/controllers/educode_sales/shixuns_controller.rb +65 -4
- data/app/controllers/educode_sales/subject_trends_controller.rb +99 -892
- data/app/controllers/educode_sales/subjects_controller.rb +29 -18
- data/app/helpers/educode_sales/application_helper.rb +3 -1
- data/app/helpers/educode_sales/business_courses_helper.rb +29 -6
- data/app/helpers/educode_sales/sale_trends_helper.rb +52 -52
- data/app/helpers/educode_sales/subject_helper.rb +5 -1
- data/app/models/educode_sales/business.rb +5 -5
- data/app/models/educode_sales/business_deliver_subject.rb +3 -2
- data/app/models/educode_sales/business_subject.rb +9 -3
- data/app/models/educode_sales/business_subject_shixun.rb +37 -8
- data/app/models/educode_sales/business_subject_staff.rb +1 -0
- data/app/views/educode_sales/business_courses/edit.html.erb +30 -4
- data/app/views/educode_sales/business_courses/index.html.erb +34 -12
- data/app/views/educode_sales/business_courses/index.json.jbuilder +2 -2
- data/app/views/educode_sales/business_courses/list_shixuns.html.erb +132 -64
- data/app/views/educode_sales/business_courses/list_shixuns.json.jbuilder +12 -6
- data/app/views/educode_sales/business_courses/list_subjects.html.erb +29 -34
- data/app/views/educode_sales/business_courses/list_subjects.json.jbuilder +7 -2
- data/app/views/educode_sales/business_courses/new.html.erb +45 -20
- data/app/views/educode_sales/businesses/index.html.erb +11 -9
- data/app/views/educode_sales/contracts/_list.html.erb +16 -1
- data/app/views/educode_sales/contracts/index.html.erb +5 -2
- data/app/views/educode_sales/contracts/list.js.erb +4 -1
- data/app/views/educode_sales/money_plan_records/_index.html.erb +21 -5
- data/app/views/educode_sales/money_plan_records/index.js.erb +4 -1
- data/app/views/educode_sales/money_plans/list.html.erb +6 -2
- data/app/views/educode_sales/sale_trends/_return_money_forecast.html.erb +1 -1
- data/app/views/educode_sales/sale_trends/_user_stat.html.erb +1 -1
- data/app/views/educode_sales/sale_trends/_visit_analysis.html.erb +1 -1
- data/app/views/educode_sales/sale_trends/return_money_forecast.js.erb +1 -1
- data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
- data/app/views/educode_sales/sale_trends/user_stat.js.erb +1 -1
- data/app/views/educode_sales/sale_trends/visit_analysis.js.erb +1 -1
- data/app/views/educode_sales/shixun_dectects/index.html.erb +97 -47
- data/app/views/educode_sales/shixun_dectects/index.json.jbuilder +4 -3
- data/app/views/educode_sales/shixun_dectects/markdown.html.erb +1 -1
- data/app/views/educode_sales/shixuns/edit.html.erb +35 -13
- data/app/views/educode_sales/shixuns/index.html.erb +348 -138
- data/app/views/educode_sales/shixuns/index.json.jbuilder +9 -5
- data/app/views/educode_sales/shixuns/new.html.erb +22 -12
- data/app/views/educode_sales/subject_trends/trends.html.erb +177 -575
- data/app/views/educode_sales/subjects/edit.html.erb +4 -4
- data/app/views/educode_sales/subjects/index.html.erb +50 -12
- data/app/views/educode_sales/subjects/index.json.jbuilder +3 -3
- data/app/views/educode_sales/subjects/list_shixuns.html.erb +143 -17
- data/app/views/educode_sales/subjects/list_shixuns.json.jbuilder +9 -4
- data/app/views/educode_sales/subjects/new.html.erb +4 -4
- data/app/views/layouts/educode_sales/application.html.erb +1 -1
- data/lib/educode_sales/version.rb +1 -1
- metadata +6 -7
- 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 =
|
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
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
-
|
44
|
+
# 实践项目
|
113
45
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
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
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
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
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
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
|
-
|
436
|
-
|
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
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
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
|
-
|
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
|
-
|
499
|
-
|
500
|
-
|
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
|
-
|
528
|
-
|
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
|
-
|
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
|
-
|
770
|
-
|
771
|
-
|
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
|
-
|
878
|
-
|
879
|
-
|
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
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
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
|