educode_sales 0.5.0 → 0.5.4
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/images/educode_sales//345/233/236/346/224/266/347/253/231.png +0 -0
- data/app/controllers/educode_sales/businesses_controller.rb +13 -6
- data/app/controllers/educode_sales/follow_ups_controller.rb +3 -2
- 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 +23 -3
- data/app/controllers/educode_sales/recycles_controller.rb +95 -0
- data/app/controllers/educode_sales/roles_controller.rb +5 -0
- data/app/controllers/educode_sales/sale_reports_controller.rb +34 -4
- 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/staffs_controller.rb +4 -4
- data/app/controllers/educode_sales/upload_files_controller.rb +33 -26
- data/app/models/concerns/deletable.rb +8 -0
- data/app/models/educode_sales/application_record.rb +2 -0
- data/app/models/educode_sales/business.rb +15 -2
- data/app/models/educode_sales/common.rb +2 -1
- data/app/models/educode_sales/follow_up.rb +4 -2
- data/app/models/educode_sales/recycle.rb +5 -0
- data/app/models/educode_sales/sale_plan.rb +3 -0
- data/app/models/educode_sales/sale_report.rb +2 -0
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +3 -3
- data/app/views/educode_sales/businesses/edit_plan.html.erb +2 -2
- data/app/views/educode_sales/businesses/file.html.erb +5 -4
- data/app/views/educode_sales/businesses/index.html.erb +18 -3
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +6 -2
- data/app/views/educode_sales/businesses/show_follow.html.erb +7 -2
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +1 -1
- data/app/views/educode_sales/businesses/upload_file.html.erb +4 -4
- data/app/views/educode_sales/operation_plans/index.html.erb +6 -1
- data/app/views/educode_sales/operation_reports/audit.html.erb +14 -6
- data/app/views/educode_sales/operation_reports/show.html.erb +13 -10
- 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/recycles/_business.html.erb +122 -0
- data/app/views/educode_sales/recycles/_monthPlan.html.erb +123 -0
- data/app/views/educode_sales/recycles/_monthly.html.erb +121 -0
- data/app/views/educode_sales/recycles/_weekPlan.html.erb +128 -0
- data/app/views/educode_sales/recycles/_weekly.html.erb +122 -0
- data/app/views/educode_sales/recycles/business.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/index.html.erb +58 -0
- data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/monthly.json.jbuilder +15 -0
- data/app/views/educode_sales/recycles/weekPlan.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/weekly.json.jbuilder +15 -0
- 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 +17 -6
- data/app/views/educode_sales/sale_reports/show.html.erb +11 -8
- data/app/views/educode_sales/sale_trends/trends.html.erb +233 -2
- data/app/views/educode_sales/sale_trends/trends.json.jbuilder +14 -0
- data/app/views/educode_sales/sales/index.html.erb +75 -9
- 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 +3 -3
- data/app/views/educode_sales/teachers/index.html.erb +7 -2
- data/app/views/educode_sales/teachers/new.html.erb +1 -0
- data/app/views/educode_sales/upload_files/index.json.jbuilder +1 -1
- data/app/views/layouts/educode_sales/application.html.erb +3 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +6 -0
- data/db/migrate/20211109015617_create_educode_sales_recycles.rb +25 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 660c43183c6a1edf9d5aab4b549bce9d2b68edf789010d85379198372be1a120
|
4
|
+
data.tar.gz: 28beeb3a7026076f4e6da6dc966bf75523e7be06717b787041d2e14500902532
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7f6b1515f819aac77b135ba6d52a3562c4fef76d650fd1a74c44bf3dcaffacc41ec34e1623337538a36bf40cff2591d14d40e83575cd7920a69fcfadb5662c4
|
7
|
+
data.tar.gz: ff102c87e89e482809f4b8e84e0f27c5f42a3dd22863f6ebfe0a4fd115eae1d026de70cd738c5b0d83e9e3ab78aee3a276eb0fed4f6a66c467ab8926c7737ed2
|
@@ -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
|
@@ -82,15 +82,17 @@ module EducodeSales
|
|
82
82
|
end
|
83
83
|
|
84
84
|
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已中标商机)"
|
85
|
+
stage_ids = Common.where(clazz: '商机阶段', name: ['已中标','已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
|
85
86
|
@businesses = @businesses.joins("
|
86
87
|
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
87
|
-
").where("educode_sales_follow_ups.bidded_date > ? AND educode_sales_follow_ups.bidded_date < ?", "#{@year}-01-01", "#{@year}-12-31")
|
88
|
+
").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)
|
88
89
|
end
|
89
90
|
|
90
91
|
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已签单商机)"
|
92
|
+
s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
|
91
93
|
@businesses = @businesses.joins("
|
92
94
|
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
93
|
-
").where("educode_sales_follow_ups.signed_date > ? AND educode_sales_follow_ups.signed_date < ?", "#{@year}-01-01", "#{@year}-12-31")
|
95
|
+
").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)
|
94
96
|
end
|
95
97
|
|
96
98
|
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已回款商机)"
|
@@ -122,10 +124,10 @@ module EducodeSales
|
|
122
124
|
@businesses = @businesses.joins(:department).where("departments.id in (?)", departments_ids)
|
123
125
|
end
|
124
126
|
if params[:q].present? && params[:q][:staff_id].present?
|
125
|
-
part_a_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is null AND staff_id = ?",params[:q][:staff_id]).ids
|
127
|
+
part_a_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is null AND educode_sales_businesses.staff_id = ?",params[:q][:staff_id]).ids
|
126
128
|
part_b_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is not null").joins("
|
127
129
|
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
128
|
-
").where("educode_sales_follow_ups.staff_id = ?", params[:q][:staff_id]).
|
130
|
+
").where("educode_sales_follow_ups.staff_id = ?", params[:q][:staff_id]).ids
|
129
131
|
business_ids = part_a_ids + part_b_ids
|
130
132
|
@businesses = EducodeSales::Business.where(id:business_ids)
|
131
133
|
end
|
@@ -172,6 +174,8 @@ module EducodeSales
|
|
172
174
|
educode_sales_businesses.*,
|
173
175
|
last_follow.invitation_at,
|
174
176
|
last_follow.reception_at,
|
177
|
+
last_follow.bidded_date,
|
178
|
+
last_follow.signed_date,
|
175
179
|
last_follow.total_amount").joins("
|
176
180
|
LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
|
177
181
|
").page(params[:page]).per(params[:limit])
|
@@ -221,7 +225,7 @@ module EducodeSales
|
|
221
225
|
|
222
226
|
def destroy
|
223
227
|
business = Business.find(params[:id])
|
224
|
-
business.
|
228
|
+
business.soft_destroy(@current_admin.id)
|
225
229
|
render_success
|
226
230
|
rescue ActiveRecord::DeleteRestrictionError => e
|
227
231
|
render_failure '该商机已其它关联数据产生,暂不能删除'
|
@@ -315,5 +319,8 @@ module EducodeSales
|
|
315
319
|
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id)
|
316
320
|
end
|
317
321
|
|
322
|
+
def edu_setting name
|
323
|
+
EduSetting.get(name)
|
324
|
+
end
|
318
325
|
end
|
319
326
|
end
|
@@ -36,7 +36,7 @@ module EducodeSales
|
|
36
36
|
def destroy
|
37
37
|
follow_up = FollowUp.find(params[:id])
|
38
38
|
business = follow_up.business
|
39
|
-
if follow_up.
|
39
|
+
if follow_up.soft_destroy(@current_admin.id)
|
40
40
|
if follow_up.id == business.last_follow_up_id
|
41
41
|
business.update(last_follow_up: business.follow_ups.last, return_money: MoneyPlan.where(clazz: '已完成', follow_up_id: business.follow_ups.last&.id).sum(:amount))
|
42
42
|
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
|
@@ -175,7 +195,7 @@ module EducodeSales
|
|
175
195
|
|
176
196
|
def destroy
|
177
197
|
sale_plan = SalePlan.find(params[:id])
|
178
|
-
if sale_plan.
|
198
|
+
if sale_plan.soft_destroy(@current_admin.id)
|
179
199
|
render_success
|
180
200
|
else
|
181
201
|
render_failure sale_plan
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class RecyclesController < ApplicationController
|
5
|
+
|
6
|
+
def destroy
|
7
|
+
@recycle = Recycle.find(params[:id])
|
8
|
+
@recycle.destroy
|
9
|
+
render_success
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
def restore_reports
|
15
|
+
@recycle = Recycle.find(params[:id])
|
16
|
+
report_id = @recycle.source_id
|
17
|
+
EducodeSales::SaleReport.unscoped.find(report_id).update(deleted_at: nil)
|
18
|
+
@recycle.destroy
|
19
|
+
render_success
|
20
|
+
end
|
21
|
+
|
22
|
+
def restore_plans
|
23
|
+
@recycle = Recycle.find(params[:id])
|
24
|
+
plan = EducodeSales::SalePlan.unscoped.find(@recycle.source_id)
|
25
|
+
business = EducodeSales::Business.unscoped.find(plan.business_id)
|
26
|
+
Recycle.find_by(source_id: business.id).destroy if Recycle.find_by(source_id: business.id).present?
|
27
|
+
business.update(deleted_at: nil)
|
28
|
+
follow_ups = EducodeSales::FollowUp.unscoped.where(business_id: business.id)
|
29
|
+
follow_ups.update_all(deleted_at: nil)
|
30
|
+
plan.update(deleted_at: nil)
|
31
|
+
@recycle.destroy
|
32
|
+
render_success
|
33
|
+
end
|
34
|
+
|
35
|
+
def restore_businesses
|
36
|
+
@recycle = Recycle.find(params[:id])
|
37
|
+
business_id = @recycle.source_id
|
38
|
+
EducodeSales::Business.unscoped.find(business_id).update(deleted_at: nil)
|
39
|
+
follow_ups = EducodeSales::FollowUp.unscoped.where(business_id: business_id)
|
40
|
+
follow_ups.update_all(deleted_at: nil)
|
41
|
+
@recycle.destroy
|
42
|
+
render_success
|
43
|
+
end
|
44
|
+
|
45
|
+
def business
|
46
|
+
@businesses = Recycle.where(source_type:"EducodeSales::Business")
|
47
|
+
if params[:sort].present? && params[:sort][:field]
|
48
|
+
@businesses = @businesses.order("created_at #{params[:sort][:order]}")
|
49
|
+
else
|
50
|
+
@businesses = @businesses.order("educode_sales_recycles.created_at desc")
|
51
|
+
end
|
52
|
+
@businesses = @businesses.page(params[:page]).per(params[:limit])
|
53
|
+
end
|
54
|
+
|
55
|
+
def weekly
|
56
|
+
@weekly = Recycle.where(source_type:"EducodeSales::SaleReport").order(created_at: :desc).page(params[:page]).per(params[:limit])
|
57
|
+
if params[:sort].present? && params[:sort][:field]
|
58
|
+
@weekly = @weekly.order("created_at #{params[:sort][:order]}")
|
59
|
+
else
|
60
|
+
@weekly = @weekly.order("educode_sales_recycles.created_at desc")
|
61
|
+
end
|
62
|
+
@weekly = @weekly.page(params[:page]).per(params[:limit])
|
63
|
+
end
|
64
|
+
|
65
|
+
def monthly
|
66
|
+
@monthly = Recycle.where(source_type:"EducodeSales::SaleReport")
|
67
|
+
if params[:sort].present? && params[:sort][:field]
|
68
|
+
@monthly = @monthly.order("created_at #{params[:sort][:order]}")
|
69
|
+
else
|
70
|
+
@monthly = @monthly.order("educode_sales_recycles.created_at desc")
|
71
|
+
end
|
72
|
+
@monthly = @monthly.page(params[:page]).per(params[:limit])
|
73
|
+
end
|
74
|
+
|
75
|
+
def weekPlan
|
76
|
+
@weekPlans = Recycle.where(source_type:"EducodeSales::SalePlan")
|
77
|
+
if params[:sort].present? && params[:sort][:field]
|
78
|
+
@weekPlans = @weekPlans.order("created_at #{params[:sort][:order]}")
|
79
|
+
else
|
80
|
+
@weekPlans = @weekPlans.order("educode_sales_recycles.created_at desc")
|
81
|
+
end
|
82
|
+
@weekPlans = @weekPlans.page(params[:page]).per(params[:limit])
|
83
|
+
end
|
84
|
+
|
85
|
+
def monthPlan
|
86
|
+
@monthPlans = Recycle.where(source_type:"EducodeSales::SalePlan")
|
87
|
+
if params[:sort].present? && params[:sort][:field]
|
88
|
+
@monthPlans = @monthPlans.order("created_at #{params[:sort][:order]}")
|
89
|
+
else
|
90
|
+
@monthPlans = @monthPlans.order("educode_sales_recycles.created_at desc")
|
91
|
+
end
|
92
|
+
@monthPlans = @monthPlans.page(params[:page]).per(params[:limit])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -24,13 +24,23 @@ 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
|
|
31
41
|
def destroy
|
32
42
|
sale_report = SaleReport.find(params[:id])
|
33
|
-
if sale_report.
|
43
|
+
if sale_report.soft_destroy(@current_admin.id)
|
34
44
|
render_success
|
35
45
|
else
|
36
46
|
render_failure sale_report
|
@@ -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 = ['#44D7B6','#4CACFF','#F7B500','#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)],
|
86
|
+
borderColor: colors[sale_names.index(name)],
|
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)],
|
112
|
+
borderColor: colors[sale_names.index(name)],
|
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)],
|
136
|
+
borderColor: colors[sale_names.index(name)],
|
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: colors[names.index(name)%15],
|
175
|
+
borderColor: colors[names.index(name)%15],
|
176
|
+
pointBackgroundColor: colors[names.index(name)%15],
|
177
|
+
borderWidth: 4
|
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: colors[names.index(name)%15],
|
192
|
+
borderColor: colors[names.index(name)%15],
|
193
|
+
pointBackgroundColor: colors[names.index(name)%15],
|
194
|
+
borderWidth: 4,
|
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: colors[names.index(name)%15],
|
209
|
+
borderColor: colors[names.index(name)%15],
|
210
|
+
pointBackgroundColor: colors[names.index(name)%15],
|
211
|
+
borderWidth: 4
|
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
|
|
@@ -8,7 +8,7 @@ module EducodeSales
|
|
8
8
|
format.html do
|
9
9
|
end
|
10
10
|
format.json do
|
11
|
-
@staffs = Staff.where(is_admin: false).page(params[:page]).per(params[:limit])
|
11
|
+
@staffs = Staff.where(is_admin: false, deleted_at: nil).page(params[:page]).per(params[:limit])
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -37,10 +37,10 @@ module EducodeSales
|
|
37
37
|
|
38
38
|
def destroy
|
39
39
|
staff = Staff.find(params[:id])
|
40
|
-
staff.
|
40
|
+
staff.update(deleted_at: Time.now, expired_at: Time.now.days_ago(1))
|
41
41
|
render_success
|
42
|
-
rescue ActiveRecord::DeleteRestrictionError => e
|
43
|
-
|
42
|
+
# rescue ActiveRecord::DeleteRestrictionError => e
|
43
|
+
# render_failure '该用户已有数据产生,暂不能删除'
|
44
44
|
end
|
45
45
|
|
46
46
|
def disable
|