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
|
|