educode_sales 0.5.1 → 0.5.2
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/controllers/educode_sales/businesses_controller.rb +4 -1
- data/app/controllers/educode_sales/follow_ups_controller.rb +2 -1
- data/app/controllers/educode_sales/operation_plans_controller.rb +22 -2
- data/app/controllers/educode_sales/operation_reports_controller.rb +33 -3
- data/app/controllers/educode_sales/plans_controller.rb +22 -2
- data/app/controllers/educode_sales/roles_controller.rb +5 -0
- data/app/controllers/educode_sales/sale_reports_controller.rb +33 -3
- data/app/controllers/educode_sales/sale_trends_controller.rb +171 -0
- data/app/controllers/educode_sales/sales_controller.rb +4 -0
- data/app/controllers/educode_sales/upload_files_controller.rb +10 -3
- data/app/models/educode_sales/common.rb +2 -1
- data/app/views/educode_sales/businesses/file.html.erb +5 -4
- data/app/views/educode_sales/businesses/index.html.erb +6 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +1 -1
- data/app/views/educode_sales/operation_plans/index.html.erb +6 -1
- data/app/views/educode_sales/operation_reports/audit.html.erb +5 -3
- data/app/views/educode_sales/operation_reports/show.html.erb +4 -7
- data/app/views/educode_sales/places/index.html.erb +6 -1
- data/app/views/educode_sales/places/index.json.jbuilder +11 -1
- data/app/views/educode_sales/plans/index.html.erb +6 -1
- data/app/views/educode_sales/roles/index.html.erb +19 -1
- data/app/views/educode_sales/roles/rename.html.erb +50 -0
- data/app/views/educode_sales/sale_reports/audit.html.erb +5 -3
- data/app/views/educode_sales/sale_reports/show.html.erb +3 -6
- data/app/views/educode_sales/sale_trends/trends.html.erb +222 -2
- data/app/views/educode_sales/sale_trends/trends.json.jbuilder +14 -0
- data/app/views/educode_sales/sales/index.html.erb +72 -6
- data/app/views/educode_sales/sales/index.json.jbuilder +35 -1
- data/app/views/educode_sales/sales/operations.json.jbuilder +11 -1
- data/app/views/educode_sales/staffs/index.html.erb +6 -1
- data/app/views/educode_sales/staffs/index.json.jbuilder +11 -1
- data/app/views/educode_sales/teachers/add_keys.html.erb +1 -1
- data/app/views/educode_sales/teachers/index.html.erb +6 -1
- data/app/views/educode_sales/teachers/new.html.erb +1 -0
- data/config/routes.rb +3 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1ae794ee6831f1fab6465eb9290de9f3155b4a32e13acafe865500e42decaff6
|
|
4
|
+
data.tar.gz: cb2e8ea7a97b6cd04942343417a7d427f18657dec46ddc2805d11a876a8672f1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 72e214c3bca3382997cc389f36eb92747a96323ef141f255154aff068b20c9e5488fe24de4a028bbcb67a6d4c8d457713d078c6c5a70d8be08c311e3402363f4
|
|
7
|
+
data.tar.gz: f570a34ca2014691e28f95c758a204a82f3953118deccc89b22650476fc32ca7f5cf7a003758023796f2deccb980fbb609cfd0f99a141cafd027c06f8293ef18
|
|
@@ -4,7 +4,7 @@ module EducodeSales
|
|
|
4
4
|
class BusinessesController < ApplicationController
|
|
5
5
|
|
|
6
6
|
def file
|
|
7
|
-
|
|
7
|
+
gon.folder = edu_setting('attachment_folder') + '/'
|
|
8
8
|
render layout: false
|
|
9
9
|
end
|
|
10
10
|
def upload_file
|
|
@@ -319,5 +319,8 @@ module EducodeSales
|
|
|
319
319
|
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id)
|
|
320
320
|
end
|
|
321
321
|
|
|
322
|
+
def edu_setting name
|
|
323
|
+
EduSetting.get(name)
|
|
324
|
+
end
|
|
322
325
|
end
|
|
323
326
|
end
|
|
@@ -132,7 +132,8 @@ module EducodeSales
|
|
|
132
132
|
)
|
|
133
133
|
teacher.save
|
|
134
134
|
key_peprson = KeyPerson.new(teacher_params)
|
|
135
|
-
|
|
135
|
+
teacher_id = EducodeSales::Teacher.find_by(name: user.real_name, department_id: user.department_id).id
|
|
136
|
+
key_peprson.teacher_id = teacher_id
|
|
136
137
|
end
|
|
137
138
|
|
|
138
139
|
follow_up.key_person << key_peprson
|
|
@@ -78,7 +78,17 @@ module EducodeSales
|
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
def new_weekly
|
|
81
|
-
|
|
81
|
+
d = @current_admin
|
|
82
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
83
|
+
if d.areas.present?
|
|
84
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
85
|
+
@area = '全国'
|
|
86
|
+
else
|
|
87
|
+
@area = d.areas.pluck(:name).join("、")
|
|
88
|
+
end
|
|
89
|
+
else
|
|
90
|
+
@area = ''
|
|
91
|
+
end
|
|
82
92
|
@name = @current_admin.user.real_name
|
|
83
93
|
sale_plans = OperationPlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", weekly: Time.now.strftime('%W').to_i, staff_id: @current_admin.id)
|
|
84
94
|
@rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
|
|
@@ -95,7 +105,17 @@ module EducodeSales
|
|
|
95
105
|
end
|
|
96
106
|
|
|
97
107
|
def new_monthly
|
|
98
|
-
|
|
108
|
+
d = @current_admin
|
|
109
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
110
|
+
if d.areas.present?
|
|
111
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
112
|
+
@area = '全国'
|
|
113
|
+
else
|
|
114
|
+
@area = d.areas.pluck(:name).join("、")
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
@area = ''
|
|
118
|
+
end
|
|
99
119
|
@name = @current_admin.user.real_name
|
|
100
120
|
sale_plans = OperationPlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
|
|
101
121
|
@rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
|
|
@@ -68,7 +68,17 @@ module EducodeSales
|
|
|
68
68
|
def show
|
|
69
69
|
@sale_report = OperationReport.find(params[:id])
|
|
70
70
|
@name = @sale_report.staff.user.real_name
|
|
71
|
-
|
|
71
|
+
d = @sale_report.staff
|
|
72
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
73
|
+
if d.areas.present?
|
|
74
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
75
|
+
@area = '全国'
|
|
76
|
+
else
|
|
77
|
+
@area = d.areas.pluck(:name).join("、")
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
@area = ''
|
|
81
|
+
end
|
|
72
82
|
render layout: false
|
|
73
83
|
end
|
|
74
84
|
|
|
@@ -81,7 +91,17 @@ module EducodeSales
|
|
|
81
91
|
def edit
|
|
82
92
|
@sale_report = OperationReport.find(params[:id])
|
|
83
93
|
@name = @sale_report.staff.user.real_name
|
|
84
|
-
|
|
94
|
+
d = @sale_report.staff
|
|
95
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
96
|
+
if d.areas.present?
|
|
97
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
98
|
+
@area = '全国'
|
|
99
|
+
else
|
|
100
|
+
@area = d.areas.pluck(:name).join("、")
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
@area = ''
|
|
104
|
+
end
|
|
85
105
|
render layout: false
|
|
86
106
|
end
|
|
87
107
|
|
|
@@ -118,7 +138,17 @@ module EducodeSales
|
|
|
118
138
|
def audit
|
|
119
139
|
@sale_report = OperationReport.find(params[:id])
|
|
120
140
|
@name = @sale_report.staff.user.real_name
|
|
121
|
-
|
|
141
|
+
d = @sale_report.staff
|
|
142
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
143
|
+
if d.areas.present?
|
|
144
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
145
|
+
@area = '全国'
|
|
146
|
+
else
|
|
147
|
+
@area = d.areas.pluck(:name).join("、")
|
|
148
|
+
end
|
|
149
|
+
else
|
|
150
|
+
@area = ''
|
|
151
|
+
end
|
|
122
152
|
render layout: false
|
|
123
153
|
end
|
|
124
154
|
|
|
@@ -86,7 +86,17 @@ module EducodeSales
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def new_weekly
|
|
89
|
-
|
|
89
|
+
d = @current_admin
|
|
90
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
91
|
+
if d.areas.present?
|
|
92
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
93
|
+
@area = '全国'
|
|
94
|
+
else
|
|
95
|
+
@area = d.areas.pluck(:name).join("、")
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
@area = ''
|
|
99
|
+
end
|
|
90
100
|
@name = @current_admin.user.real_name
|
|
91
101
|
sale_plans = SalePlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", weekly: Time.now.strftime('%W').to_i, staff_id: @current_admin.id)
|
|
92
102
|
@rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
|
|
@@ -104,7 +114,17 @@ module EducodeSales
|
|
|
104
114
|
end
|
|
105
115
|
|
|
106
116
|
def new_monthly
|
|
107
|
-
|
|
117
|
+
d = @current_admin
|
|
118
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
119
|
+
if d.areas.present?
|
|
120
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
121
|
+
@area = '全国'
|
|
122
|
+
else
|
|
123
|
+
@area = d.areas.pluck(:name).join("、")
|
|
124
|
+
end
|
|
125
|
+
else
|
|
126
|
+
@area = ''
|
|
127
|
+
end
|
|
108
128
|
@name = @current_admin.user.real_name
|
|
109
129
|
sale_plans = SalePlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
|
|
110
130
|
@rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
|
|
@@ -24,7 +24,17 @@ module EducodeSales
|
|
|
24
24
|
def show
|
|
25
25
|
@sale_report = SaleReport.find(params[:id])
|
|
26
26
|
@name = @sale_report.staff.user.real_name
|
|
27
|
-
|
|
27
|
+
d = @sale_report.staff
|
|
28
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
29
|
+
if d.areas.present?
|
|
30
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
31
|
+
@area = '全国'
|
|
32
|
+
else
|
|
33
|
+
@area = d.areas.pluck(:name).join("、")
|
|
34
|
+
end
|
|
35
|
+
else
|
|
36
|
+
@area = ''
|
|
37
|
+
end
|
|
28
38
|
render layout: false
|
|
29
39
|
end
|
|
30
40
|
|
|
@@ -86,7 +96,17 @@ module EducodeSales
|
|
|
86
96
|
def edit
|
|
87
97
|
@sale_report = SaleReport.find(params[:id])
|
|
88
98
|
@name = @sale_report.staff.user.real_name
|
|
89
|
-
|
|
99
|
+
d = @sale_report.staff
|
|
100
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
101
|
+
if d.areas.present?
|
|
102
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
103
|
+
@area = '全国'
|
|
104
|
+
else
|
|
105
|
+
@area = d.areas.pluck(:name).join("、")
|
|
106
|
+
end
|
|
107
|
+
else
|
|
108
|
+
@area = ''
|
|
109
|
+
end
|
|
90
110
|
render layout: false
|
|
91
111
|
end
|
|
92
112
|
|
|
@@ -123,7 +143,17 @@ module EducodeSales
|
|
|
123
143
|
def audit
|
|
124
144
|
@sale_report = SaleReport.find(params[:id])
|
|
125
145
|
@name = @sale_report.staff.user.real_name
|
|
126
|
-
|
|
146
|
+
d = @sale_report.staff
|
|
147
|
+
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
|
148
|
+
if d.areas.present?
|
|
149
|
+
if d.areas.ids.sort.to_s == area_ids
|
|
150
|
+
@area = '全国'
|
|
151
|
+
else
|
|
152
|
+
@area = d.areas.pluck(:name).join("、")
|
|
153
|
+
end
|
|
154
|
+
else
|
|
155
|
+
@area = ''
|
|
156
|
+
end
|
|
127
157
|
render layout: false
|
|
128
158
|
end
|
|
129
159
|
|
|
@@ -23,6 +23,124 @@ module EducodeSales
|
|
|
23
23
|
@a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).sum(:total_amount).round(2)
|
|
24
24
|
b = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name).pluck(:id)
|
|
25
25
|
@b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", b).sum(:total_amount).round(2)
|
|
26
|
+
|
|
27
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
|
28
|
+
names = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
|
|
29
|
+
x_business_ids = []
|
|
30
|
+
default_dates = (7.day.ago.to_date..Date.today).to_a #默认时间范围
|
|
31
|
+
Business.all.each do |d|
|
|
32
|
+
if d.last_follow_up&.clazz&.id == x
|
|
33
|
+
x_business_ids << d.id
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
colors = ['#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#8B00FF', 'rgba(255, 99, 132, 1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)']
|
|
37
|
+
@follow_count_range = params[:follow_count_range] || "day"
|
|
38
|
+
@goal_count_range = params[:goal_count_range] || "day"
|
|
39
|
+
# 商机跟进数图表
|
|
40
|
+
@follow_count_data = day_follow_count_chart(default_dates,names,x_business_ids,colors)
|
|
41
|
+
if params[:follow_count_range].present?
|
|
42
|
+
case params[:follow_count_range]
|
|
43
|
+
when "week"
|
|
44
|
+
when "month" #按月
|
|
45
|
+
if params[:date_month].present?
|
|
46
|
+
# (Date.new(2020,12,1)..Date.new(2021,12,1)).map { |d| d.strftime("%Y-%m")}.uniq
|
|
47
|
+
date = params[:date_month].split(" - ")
|
|
48
|
+
dates = ((date[0]+"-01").to_date..(date[1]+"-01").to_date).map { |d| d.strftime("%Y-%m")}.uniq
|
|
49
|
+
@follow_count_data = month_follow_count_chart(dates,names,x_business_ids,colors)
|
|
50
|
+
end
|
|
51
|
+
when "year" #按年
|
|
52
|
+
if params[:date_year].present?
|
|
53
|
+
date = params[:date_year].split(" - ")
|
|
54
|
+
dates = (date[0]..date[1]).to_a
|
|
55
|
+
@follow_count_data = year_follow_count_chart(dates,names,x_business_ids,colors)
|
|
56
|
+
end
|
|
57
|
+
else #按天
|
|
58
|
+
if params[:date].present?
|
|
59
|
+
date = params[:date].split(" - ")
|
|
60
|
+
dates = (date[0].to_date..date[1].to_date).to_a
|
|
61
|
+
@follow_count_data = day_follow_count_chart(dates,names,x_business_ids,colors)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# 已中标图表
|
|
68
|
+
goal_default_dates = ("#{Time.now.year}-01".."#{Time.now.year}-#{Time.now.month}").to_a
|
|
69
|
+
sale_names = ['已中标','已签单','已回款']
|
|
70
|
+
@goal_count_data =
|
|
71
|
+
{
|
|
72
|
+
labels: goal_default_dates,
|
|
73
|
+
datasets: sale_names.map do |name|{
|
|
74
|
+
label: name,
|
|
75
|
+
data: goal_default_dates.map{ |d|
|
|
76
|
+
case sale_names.index(name)
|
|
77
|
+
when 0
|
|
78
|
+
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 (?)", "#{d}-01", "#{d}-31", stage_ids).sum(:total_amount).round(2)
|
|
79
|
+
when 1
|
|
80
|
+
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 (?)", "#{d}-01", "#{d}-31", s_stage_ids).sum(:total_amount).round(2)
|
|
81
|
+
else
|
|
82
|
+
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 <= ? ", "#{d}-01", "#{d}-31").sum(:amount).round(2)
|
|
83
|
+
end
|
|
84
|
+
},
|
|
85
|
+
backgroundColor: colors[sale_names.index(name)+1],
|
|
86
|
+
borderColor: colors[sale_names.index(name)+1],
|
|
87
|
+
borderWidth: 1
|
|
88
|
+
}
|
|
89
|
+
end
|
|
90
|
+
}
|
|
91
|
+
if params[:goal_count_range].present?
|
|
92
|
+
case params[:goal_count_range]
|
|
93
|
+
when "week"
|
|
94
|
+
when "month" #按月
|
|
95
|
+
if params[:goal_date_month].present?
|
|
96
|
+
date = params[:goal_date_month].split(" - ")
|
|
97
|
+
dates = ((date[0]+"-01").to_date..(date[1]+"-01").to_date).map { |d| d.strftime("%Y-%m")}.uniq
|
|
98
|
+
@goal_count_data = {
|
|
99
|
+
labels: dates,
|
|
100
|
+
datasets: sale_names.map do |name|{
|
|
101
|
+
label: name,
|
|
102
|
+
data: dates.map{ |d|
|
|
103
|
+
case sale_names.index(name)
|
|
104
|
+
when 0
|
|
105
|
+
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 (?)", "#{d}-01", "#{d}-31", stage_ids).sum(:total_amount).round(2)
|
|
106
|
+
when 1
|
|
107
|
+
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 (?)", "#{d}-01", "#{d}-31", s_stage_ids).sum(:total_amount).round(2)
|
|
108
|
+
else
|
|
109
|
+
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 <= ? ", "#{d}-01", "#{d}-31").sum(:amount).round(2)
|
|
110
|
+
end },
|
|
111
|
+
backgroundColor: colors[sale_names.index(name)+1],
|
|
112
|
+
borderColor: colors[sale_names.index(name)+1],
|
|
113
|
+
borderWidth: 1
|
|
114
|
+
}
|
|
115
|
+
end
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
else #按年
|
|
119
|
+
if params[:goal_date_year].present?
|
|
120
|
+
date = params[:goal_date_year].split(" - ")
|
|
121
|
+
dates = (date[0]..date[1]).to_a
|
|
122
|
+
@goal_count_data = {
|
|
123
|
+
labels: dates,
|
|
124
|
+
datasets:sale_names.map do |name| {
|
|
125
|
+
label: name,
|
|
126
|
+
data: dates.map{ |d|
|
|
127
|
+
case sale_names.index(name)
|
|
128
|
+
when 0
|
|
129
|
+
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 (?)", "#{d}-01-01", "#{d}-12-31", stage_ids).sum(:total_amount).round(2)
|
|
130
|
+
when 1
|
|
131
|
+
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 (?)", "#{d}-01-01", "#{d}-12-31", s_stage_ids).sum(:total_amount).round(2)
|
|
132
|
+
else
|
|
133
|
+
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 <= ? ", "#{d}-01-01", "#{d}-12-31").sum(:amount).round(2)
|
|
134
|
+
end },
|
|
135
|
+
backgroundColor: colors[sale_names.index(name)+1],
|
|
136
|
+
borderColor: colors[sale_names.index(name)+1],
|
|
137
|
+
borderWidth: 1
|
|
138
|
+
}
|
|
139
|
+
end
|
|
140
|
+
}
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
26
144
|
end
|
|
27
145
|
|
|
28
146
|
def sale_trends
|
|
@@ -44,5 +162,58 @@ module EducodeSales
|
|
|
44
162
|
params.permit(:chance_money, :ballot_money, :sign_money, :returned_money)
|
|
45
163
|
end
|
|
46
164
|
|
|
165
|
+
def day_follow_count_chart(dates,names,x_business_ids,colors)
|
|
166
|
+
{
|
|
167
|
+
labels: dates,
|
|
168
|
+
datasets:names.map do |name|
|
|
169
|
+
{
|
|
170
|
+
hidden: names.index(name) < 3 ? false : true,
|
|
171
|
+
label: name[0],
|
|
172
|
+
data: dates.map{ |d| @follow_up = FollowUp.where(staff_id: name[1], created_at: d.beginning_of_day..d.end_of_day).where.not(business: x_business_ids).count },
|
|
173
|
+
backgroundColor: "#fff",
|
|
174
|
+
pointBorderColor: "#fff",
|
|
175
|
+
borderColor: colors[names.index(name)%10],
|
|
176
|
+
pointBackgroundColor: colors[names.index(name)%10],
|
|
177
|
+
borderWidth: 1
|
|
178
|
+
}
|
|
179
|
+
end
|
|
180
|
+
}
|
|
181
|
+
end
|
|
182
|
+
def month_follow_count_chart(dates,names,x_business_ids,colors)
|
|
183
|
+
{
|
|
184
|
+
labels: dates,
|
|
185
|
+
datasets:names.map do |name|
|
|
186
|
+
{
|
|
187
|
+
hidden: names.index(name) < 3 ? false : true,
|
|
188
|
+
label: name[0],
|
|
189
|
+
data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01", "#{d}-31").where.not(business: x_business_ids).count },
|
|
190
|
+
backgroundColor: "#fff",
|
|
191
|
+
pointBorderColor: "#fff",
|
|
192
|
+
borderColor: colors[names.index(name)%10],
|
|
193
|
+
pointBackgroundColor: colors[names.index(name)%10],
|
|
194
|
+
borderWidth: 1
|
|
195
|
+
}
|
|
196
|
+
end
|
|
197
|
+
}
|
|
198
|
+
end
|
|
199
|
+
def year_follow_count_chart(dates,names,x_business_ids,colors)
|
|
200
|
+
{
|
|
201
|
+
labels: dates,
|
|
202
|
+
datasets:names.map do |name|
|
|
203
|
+
{
|
|
204
|
+
hidden: names.index(name) < 3 ? false : true,
|
|
205
|
+
label: name[0],
|
|
206
|
+
data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01-01", "#{d}-12-31").where.not(business: x_business_ids).count },
|
|
207
|
+
backgroundColor: "#fff",
|
|
208
|
+
pointBorderColor: "#fff",
|
|
209
|
+
borderColor: colors[names.index(name)%10],
|
|
210
|
+
pointBackgroundColor: colors[names.index(name)%10],
|
|
211
|
+
borderWidth: 1
|
|
212
|
+
}
|
|
213
|
+
end
|
|
214
|
+
}
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
|
|
47
218
|
end
|
|
48
219
|
end
|
|
@@ -14,6 +14,10 @@ module EducodeSales
|
|
|
14
14
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
|
15
15
|
@a_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name)
|
|
16
16
|
@b_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name)
|
|
17
|
+
@c_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::CTYPE)&.name)
|
|
18
|
+
@d_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::DTYPE)&.name)
|
|
19
|
+
@e_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ETYPE)&.name)
|
|
20
|
+
@o_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::OTYPE)&.name)
|
|
17
21
|
@x = Common.find_by(extras: EducodeSales::Common::XTYPE)
|
|
18
22
|
@step_ids = Common.where(name: %w(已中标 已签单 已验收 回款中 服务中 已结束), clazz: 'business_step').pluck(:id)
|
|
19
23
|
|
|
@@ -20,9 +20,10 @@ module EducodeSales
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def create
|
|
23
|
+
folder = edu_setting('attachment_folder')
|
|
23
24
|
upload_file = params["file"]
|
|
24
25
|
raise "未上传文件" unless upload_file
|
|
25
|
-
save_path = File.join(
|
|
26
|
+
save_path = File.join(folder)
|
|
26
27
|
ext = file_ext(upload_file.original_filename)
|
|
27
28
|
local_path, digest = file_save_to_local(save_path, upload_file.tempfile, ext)
|
|
28
29
|
content_type = upload_file.content_type.presence || 'application/octet-stream'
|
|
@@ -47,16 +48,22 @@ module EducodeSales
|
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
def destroy
|
|
51
|
+
folder = edu_setting('attachment_folder')
|
|
50
52
|
file = Attachment.find(params[:id])
|
|
51
53
|
file.destroy
|
|
52
|
-
File.delete(
|
|
54
|
+
File.delete(folder.to_s + '/' + file.disk_filename) if FileTest::exist?(folder.to_s + '/' + file.disk_filename)
|
|
53
55
|
render_success
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
def download
|
|
59
|
+
folder = edu_setting('attachment_folder')
|
|
57
60
|
file = Attachment.find_by_id(params[:id])
|
|
58
61
|
raise "未找到文件" unless file
|
|
59
|
-
send_file(
|
|
62
|
+
send_file(folder.to_s + '/' + file.disk_filename, filename: file.title, stream: true, type: file.content_type.presence || 'application/octet-stream')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def edu_setting name
|
|
66
|
+
EduSetting.get(name)
|
|
60
67
|
end
|
|
61
68
|
|
|
62
69
|
|
|
@@ -8,6 +8,7 @@ module EducodeSales
|
|
|
8
8
|
BTYPE = 'b_class'
|
|
9
9
|
CTYPE = 'c_class'
|
|
10
10
|
DTYPE = 'd_class'
|
|
11
|
+
ETYPE = 'e_class'
|
|
11
12
|
|
|
12
13
|
validates :name, uniqueness: {scope: :clazz, message: '已存在'}
|
|
13
14
|
|
|
@@ -25,7 +26,7 @@ module EducodeSales
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
def self.job_type_name
|
|
28
|
-
self.where(clazz: 'staff_type'
|
|
29
|
+
self.where(clazz: 'staff_type').pluck(:id, :name).to_h
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def self.teacher_source_name
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<%= Gon::Base.render_data %>
|
|
1
2
|
<script type="text/html" id="toolbarDemo">
|
|
2
3
|
<div class="layui-btn-container">
|
|
3
4
|
<span class="table-label">附件信息</span>
|
|
@@ -112,20 +113,20 @@
|
|
|
112
113
|
});
|
|
113
114
|
|
|
114
115
|
|
|
115
|
-
|
|
116
116
|
table.on('tool(file)', function (obj) {
|
|
117
117
|
var data = obj.data;
|
|
118
118
|
var id = data.id
|
|
119
119
|
name = data.disk_filename
|
|
120
|
+
folder = gon.folder
|
|
121
|
+
console.log(folder);
|
|
120
122
|
if (obj.event === 'preview') {
|
|
121
123
|
if (data.content_type.split("/")[0] === "image"){
|
|
122
|
-
// var img = "<img src='/images/" + name + "' />";
|
|
123
124
|
layer.photos({
|
|
124
|
-
photos: { "data": [{"src": '/
|
|
125
|
+
photos: { "data": [{"src": '/business_file/' + name}] }
|
|
125
126
|
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
|
|
126
127
|
});
|
|
127
128
|
}else if (data.content_type.split("/")[1] === "pdf"){
|
|
128
|
-
var pdf = '/
|
|
129
|
+
var pdf = '/business_file/' + name;
|
|
129
130
|
console.log(pdf);
|
|
130
131
|
var openWH = miniPage.getOpenWidthHeight();
|
|
131
132
|
layer.open({
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
</div>
|
|
98
98
|
<div class="layui-form-item">
|
|
99
99
|
<label class="layui-form-label">指定跟进人</label>
|
|
100
|
-
<div class="layui-input-inline" style="z-index:
|
|
100
|
+
<div class="layui-input-inline" style="z-index: 100">
|
|
101
101
|
<div id="assign_follow" style="width: 512px;"></div>
|
|
102
102
|
</div>
|
|
103
103
|
<div class="layui-inline" style="padding: 9px 15px">
|
|
@@ -64,9 +64,11 @@
|
|
|
64
64
|
<%end %>
|
|
65
65
|
<br>
|
|
66
66
|
<div class="layui-inline m-t-10">
|
|
67
|
+
<% if (can? :level1_audit, EducodeSales::OperationReport) || (can? :level2_audit, EducodeSales::OperationReport) || (can? :level3_audit, EducodeSales::OperationReport) %>
|
|
67
68
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="audit_weekly_report"
|
|
68
69
|
style="margin-left: 18px">提交
|
|
69
70
|
</button>
|
|
71
|
+
<%end %>
|
|
70
72
|
</div>
|
|
71
73
|
</div>
|
|
72
74
|
</form>
|
|
@@ -91,7 +93,7 @@
|
|
|
91
93
|
rate.render({
|
|
92
94
|
elem: '#weekStar4',
|
|
93
95
|
half: true,
|
|
94
|
-
value: "<%= @sale_report.level1_score %>",
|
|
96
|
+
value: parseFloat("<%= @sale_report.level1_score || 0%>"),
|
|
95
97
|
length: 5,
|
|
96
98
|
choose: function(value){
|
|
97
99
|
level1_score = value
|
|
@@ -100,7 +102,7 @@
|
|
|
100
102
|
rate.render({
|
|
101
103
|
elem: '#weekStar5',
|
|
102
104
|
half: true,
|
|
103
|
-
value: "<%= @sale_report.level2_score %>",
|
|
105
|
+
value: parseFloat("<%= @sale_report.level2_score || 0%>"),
|
|
104
106
|
length: 5,
|
|
105
107
|
choose: function(value){
|
|
106
108
|
level2_score = value
|
|
@@ -109,7 +111,7 @@
|
|
|
109
111
|
rate.render({
|
|
110
112
|
elem: '#weekStar6',
|
|
111
113
|
half: true,
|
|
112
|
-
value: "<%= @sale_report.level3_score %>",
|
|
114
|
+
value: parseFloat("<%= @sale_report.level3_score || 0%>"),
|
|
113
115
|
length: 5,
|
|
114
116
|
choose: function(value){
|
|
115
117
|
level3_score = value
|
|
@@ -84,28 +84,25 @@
|
|
|
84
84
|
$ = layui.jquery,
|
|
85
85
|
miniPage = layui.miniPage,
|
|
86
86
|
request = layui.request;
|
|
87
|
-
table = layui.table
|
|
87
|
+
table = layui.table
|
|
88
88
|
|
|
89
89
|
rate.render({
|
|
90
90
|
elem: '#weekStar4',
|
|
91
91
|
half: true,
|
|
92
92
|
readonly: true,
|
|
93
|
-
value: "<%= @sale_report.level1_score %>",
|
|
94
|
-
length: "<%= @sale_report.level1_score %>"
|
|
93
|
+
value: parseFloat("<%= @sale_report.level1_score || 0%>"),
|
|
95
94
|
})
|
|
96
95
|
rate.render({
|
|
97
96
|
elem: '#weekStar5',
|
|
98
97
|
half: true,
|
|
99
98
|
readonly: true,
|
|
100
|
-
value: "<%= @sale_report.level2_score %>",
|
|
101
|
-
length: "<%= @sale_report.level2_score %>"
|
|
99
|
+
value: parseFloat("<%= @sale_report.level2_score || 0%>"),
|
|
102
100
|
})
|
|
103
101
|
rate.render({
|
|
104
102
|
elem: '#weekStar6',
|
|
105
103
|
half: true,
|
|
106
104
|
readonly: true,
|
|
107
|
-
value: "<%= @sale_report.level3_score %>",
|
|
108
|
-
length: "<%= @sale_report.level3_score %>"
|
|
105
|
+
value: parseFloat("<%= @sale_report.level3_score || 0%>"),
|
|
109
106
|
})
|
|
110
107
|
|
|
111
108
|
|