educode_sales 0.4.8 → 0.4.9
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 +67 -2
- data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
- data/app/controllers/educode_sales/home_controller.rb +1 -1
- data/app/controllers/educode_sales/operation_plans_controller.rb +11 -4
- data/app/controllers/educode_sales/operations_controller.rb +1 -1
- data/app/controllers/educode_sales/plans_controller.rb +15 -8
- data/app/controllers/educode_sales/sale_trends_controller.rb +5 -5
- data/app/controllers/educode_sales/sales_controller.rb +2 -2
- data/app/controllers/educode_sales/upload_files_controller.rb +99 -0
- data/app/models/educode_sales/common.rb +4 -0
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +15 -0
- data/app/views/educode_sales/businesses/file.html.erb +140 -0
- data/app/views/educode_sales/businesses/index.html.erb +55 -1
- data/app/views/educode_sales/businesses/index.json.jbuilder +3 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +17 -0
- data/app/views/educode_sales/businesses/show_follow.html.erb +38 -7
- data/app/views/educode_sales/businesses/show_follow.json.jbuilder +2 -0
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +79 -1
- data/app/views/educode_sales/businesses/time_line.html.erb +58 -0
- data/app/views/educode_sales/businesses/upload_file.html.erb +43 -0
- data/app/views/educode_sales/operation_plans/_monthly.html.erb +4 -4
- data/app/views/educode_sales/operation_plans/_weekly.html.erb +4 -4
- data/app/views/educode_sales/operation_plans/new_month.html.erb +15 -1
- data/app/views/educode_sales/operation_plans/new_week.html.erb +19 -4
- data/app/views/educode_sales/operation_reports/audit.html.erb +9 -9
- data/app/views/educode_sales/operation_reports/edit.html.erb +9 -9
- data/app/views/educode_sales/operation_reports/show.html.erb +9 -9
- data/app/views/educode_sales/plans/_monthly.html.erb +4 -4
- data/app/views/educode_sales/plans/_weekly.html.erb +4 -4
- data/app/views/educode_sales/sale_reports/audit.html.erb +7 -7
- data/app/views/educode_sales/sale_reports/edit.html.erb +7 -7
- data/app/views/educode_sales/sale_reports/show.html.erb +2 -2
- data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
- data/app/views/educode_sales/upload_files/index.json.jbuilder +13 -0
- data/config/routes.rb +12 -0
- data/db/migrate/20211102085743_add_bidded_date_educode_sales_follow_ups.rb +6 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e75cbf87f4530e2665dd16d6fa56d82a14a0479ba0ce6f9f2cb39f5282ddb034
|
4
|
+
data.tar.gz: b4ab6a572903f23688eeb0441f66776f43ca4cabc70467cb013fff2f1c922473
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05cac4d3624e3c08a12957400aef7a091ef51b7edd288e767a6f31f8f8bdfdab6af587335abac527005ed657d115d8a938ef6a8e62f0c6c33514041857335309
|
7
|
+
data.tar.gz: d23d1bd4ce8bcb827e5423e01351eb5c661b95cb64f4c61076cf974752c360b35587c74263e69f6a6392255d08686edc77a4e5813032534f00663afe8724ca2b
|
@@ -3,6 +3,30 @@ require_dependency "educode_sales/application_controller"
|
|
3
3
|
module EducodeSales
|
4
4
|
class BusinessesController < ApplicationController
|
5
5
|
|
6
|
+
def file
|
7
|
+
@root = Rails.root
|
8
|
+
render layout: false
|
9
|
+
end
|
10
|
+
def upload_file
|
11
|
+
render layout: false
|
12
|
+
end
|
13
|
+
def time_line
|
14
|
+
@business = Business.find(params[:business_id])
|
15
|
+
respond_to do |format|
|
16
|
+
format.html do
|
17
|
+
@follow_ups = @business.follow_ups.order(created_at: :desc)
|
18
|
+
# @latest = @follow_ups.order(created_at: :desc).first
|
19
|
+
# if params[:field]
|
20
|
+
# @follow_ups = @follow_ups.order("#{params[:field]} #{params[:order]}")
|
21
|
+
# else
|
22
|
+
# @follow_ups = @follow_ups.order("created_at desc")
|
23
|
+
# end
|
24
|
+
# @follow_ups = @follow_ups.page(params[:page]).per(params[:limit])
|
25
|
+
render layout: false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
6
30
|
def index
|
7
31
|
authorize! :read, Business
|
8
32
|
respond_to do |format|
|
@@ -15,6 +39,8 @@ module EducodeSales
|
|
15
39
|
gon.menus << { title: '添加周计划', event: 'week' }
|
16
40
|
gon.menus << { title: '添加月计划', event: 'month' }
|
17
41
|
end
|
42
|
+
gon.menus << { title: '跟进时间线', event: 'time_line' }
|
43
|
+
gon.menus << { title: '附件管理', event: 'file' }
|
18
44
|
if can?(:update, EducodeSales::Business)
|
19
45
|
gon.menus << { title: '编辑', event: 'edit' }
|
20
46
|
end
|
@@ -40,6 +66,36 @@ module EducodeSales
|
|
40
66
|
end
|
41
67
|
end
|
42
68
|
|
69
|
+
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-现有商机)"
|
70
|
+
a_id = Common.find_by(extras: EducodeSales::Common::ATYPE)&.id
|
71
|
+
b_id = Common.find_by(extras: EducodeSales::Common::BTYPE)&.id
|
72
|
+
c_id = Common.find_by(extras: EducodeSales::Common::CTYPE)&.id
|
73
|
+
d_id = Common.find_by(extras: EducodeSales::Common::DTYPE)&.id
|
74
|
+
ids = [a_id ,b_id ,c_id ,d_id]
|
75
|
+
@businesses = @businesses.joins("
|
76
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
77
|
+
").where("educode_sales_follow_ups.clazz_id in (?)",ids)
|
78
|
+
end
|
79
|
+
|
80
|
+
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-已中标商机)"
|
81
|
+
@businesses = @businesses.joins("
|
82
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
83
|
+
").where("educode_sales_follow_ups.bidded_date > ? AND educode_sales_follow_ups.bidded_date < ?", "#{Time.now.year}-01-01", "#{Time.now.year}-12-31")
|
84
|
+
end
|
85
|
+
|
86
|
+
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-已签单商机)"
|
87
|
+
@businesses = @businesses.joins("
|
88
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
89
|
+
").where("educode_sales_follow_ups.signed_date > ? AND educode_sales_follow_ups.signed_date < ?", "#{Time.now.year}-01-01", "#{Time.now.year}-12-31")
|
90
|
+
end
|
91
|
+
|
92
|
+
if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-已回款商机)"
|
93
|
+
x_id = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
94
|
+
@businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ? AND educode_sales_businesses.return_money > 0", "#{Time.now.year}-01-01", "#{Time.now.year}-12-31").joins("
|
95
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
96
|
+
").where.not("educode_sales_follow_ups.clazz_id = ?",x_id)
|
97
|
+
end
|
98
|
+
|
43
99
|
if params[:q].present? && params[:q][:all].present?
|
44
100
|
@businesses = @businesses
|
45
101
|
end
|
@@ -51,7 +107,7 @@ module EducodeSales
|
|
51
107
|
end
|
52
108
|
|
53
109
|
@businesses = @businesses
|
54
|
-
if params[:q].present? && params[:q][:name].present?
|
110
|
+
if params[:q].present? && params[:q][:name].present? && params[:q][:name] != "(销售态势-已中标商机)" && params[:q][:name] != "(销售态势-已签单商机)" && params[:q][:name] != "(销售态势-已回款商机)" && params[:q][:name] != "(销售态势-现有商机)"
|
55
111
|
@businesses = @businesses.where("educode_sales_businesses.name like ?", "%#{params[:q][:name]}%")
|
56
112
|
end
|
57
113
|
if params[:q].present? && params[:q][:department].present?
|
@@ -213,7 +269,16 @@ module EducodeSales
|
|
213
269
|
end
|
214
270
|
|
215
271
|
def show_follow_record
|
216
|
-
|
272
|
+
follow_up_id = params[:follow_up_id]
|
273
|
+
@follow_up = FollowUp.find(follow_up_id)
|
274
|
+
id = @follow_up.id
|
275
|
+
@follow_ups = Business.find(@follow_up.business_id).follow_ups
|
276
|
+
ids = @follow_ups.ids
|
277
|
+
size = ids.size
|
278
|
+
ids = ids.reverse
|
279
|
+
index = ids.index(id)
|
280
|
+
@next_id = (index != size - 1 && size > 1) ? ids[index + 1] : 0
|
281
|
+
@pre_id = (index != 0 && size > 1) ? ids[index - 1] : 0
|
217
282
|
render layout: false
|
218
283
|
end
|
219
284
|
|
@@ -156,7 +156,7 @@ module EducodeSales
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def follow_up_params
|
159
|
-
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id)
|
159
|
+
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id, :bidded_date, :signed_date)
|
160
160
|
end
|
161
161
|
|
162
162
|
def teacher_params
|
@@ -34,7 +34,7 @@ module EducodeSales
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def search_operation_teacher
|
37
|
-
@data =
|
37
|
+
@data = @current_admin.teachers.where("name like ? and is_key = false", "%#{params[:q]}%").limit(20)
|
38
38
|
end
|
39
39
|
|
40
40
|
def search_edu_teacher
|
@@ -54,11 +54,11 @@ module EducodeSales
|
|
54
54
|
@teacher = Teacher.find_by(id: params[:teacher_id])
|
55
55
|
week = Time.now.strftime('%W').to_i
|
56
56
|
if week > 3
|
57
|
-
@weeks = [week, week - 1, week - 2]
|
57
|
+
@weeks = [[week+2,week+2], [week+1,week+1], [week.to_s + ' 本周',week], [week - 1,week - 1], [week - 2,week - 2]]
|
58
58
|
elsif week == 2
|
59
|
-
@weeks = [week, week - 1]
|
59
|
+
@weeks = [[week.to_s + ' 本周',week], [week - 1,week - 1]]
|
60
60
|
else
|
61
|
-
@weeks = [week]
|
61
|
+
@weeks = [[week.to_s + ' 本周',week]]
|
62
62
|
end
|
63
63
|
@teachers = @current_admin.teachers.where(is_key: 0).pluck(:name, :id)
|
64
64
|
render layout: false
|
@@ -135,7 +135,7 @@ module EducodeSales
|
|
135
135
|
if @sale_plan.weekly.present?
|
136
136
|
week = Time.now.strftime('%W').to_i
|
137
137
|
if week > 3
|
138
|
-
@weeks = [week, week - 1, week - 2]
|
138
|
+
@weeks = [week+2, week+1, week, week - 1, week - 2]
|
139
139
|
elsif week == 2
|
140
140
|
@weeks = [week, week - 1]
|
141
141
|
else
|
@@ -143,6 +143,13 @@ module EducodeSales
|
|
143
143
|
end
|
144
144
|
@weeks << @sale_plan.weekly
|
145
145
|
@weeks = @weeks.uniq.sort
|
146
|
+
@weeks = @weeks.map do |d|
|
147
|
+
if d == week
|
148
|
+
["#{d} 本周", d]
|
149
|
+
else
|
150
|
+
[d, d]
|
151
|
+
end
|
152
|
+
end
|
146
153
|
end
|
147
154
|
@months = [Time.now.strftime("%Y-%m"), Time.now.months_ago(1).strftime("%Y-%m")]
|
148
155
|
@months << @sale_plan.month.strftime("%Y-%m")
|
@@ -4,7 +4,7 @@ module EducodeSales
|
|
4
4
|
class OperationsController < ApplicationController
|
5
5
|
|
6
6
|
def trends
|
7
|
-
@years = (1..(Time.now.year - 2014)).map { |d| 2014 + d }
|
7
|
+
@years = (1..(Time.now.year - 2014)).reverse_each.map { |d| 2014 + d }
|
8
8
|
@year = params[:year] ? params[:year] : Time.now.year
|
9
9
|
@operation_trend = OperationTrend.find_or_create_by(year: @year)
|
10
10
|
@inc_users_count = User.where("created_on > ? AND created_on <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").count
|
@@ -72,14 +72,14 @@ module EducodeSales
|
|
72
72
|
@business = Business.find_by(id: params[:business_id])
|
73
73
|
week = Time.now.strftime('%W').to_i
|
74
74
|
if week > 3
|
75
|
-
@weeks = [week, week - 1, week - 2]
|
75
|
+
@weeks = [[week+2,week+2], [week+1,week+1], [week.to_s + ' 本周',week], [week - 1,week - 1], [week - 2,week - 2]]
|
76
76
|
elsif week == 2
|
77
|
-
@weeks = [week, week - 1]
|
77
|
+
@weeks = [[week.to_s + ' 本周',week], [week - 1,week - 1]]
|
78
78
|
else
|
79
|
-
@weeks = [week]
|
79
|
+
@weeks = [[week.to_s + ' 本周',week]]
|
80
80
|
end
|
81
81
|
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
82
|
-
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id)
|
82
|
+
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
|
83
83
|
@businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : '无'), b.id] }
|
84
84
|
render layout: false
|
85
85
|
end
|
@@ -97,7 +97,7 @@ module EducodeSales
|
|
97
97
|
def new_month
|
98
98
|
@business = Business.find_by(id: params[:business_id])
|
99
99
|
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
100
|
-
@businesses =Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id)
|
100
|
+
@businesses =Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
|
101
101
|
@businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : '无'), b.id] }
|
102
102
|
render layout: false
|
103
103
|
end
|
@@ -132,13 +132,13 @@ module EducodeSales
|
|
132
132
|
|
133
133
|
def edit_week
|
134
134
|
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
135
|
-
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id)
|
135
|
+
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
|
136
136
|
@businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : '无'), b.id] }
|
137
137
|
@sale_plan = SalePlan.find(params[:id])
|
138
138
|
if @sale_plan.weekly.present?
|
139
139
|
week = Time.now.strftime('%W').to_i
|
140
140
|
if week > 3
|
141
|
-
@weeks = [week, week - 1, week - 2]
|
141
|
+
@weeks = [week+2, week+1, week, week - 1, week - 2]
|
142
142
|
elsif week == 2
|
143
143
|
@weeks = [week, week - 1]
|
144
144
|
else
|
@@ -146,6 +146,13 @@ module EducodeSales
|
|
146
146
|
end
|
147
147
|
@weeks << @sale_plan.weekly
|
148
148
|
@weeks = @weeks.uniq.sort
|
149
|
+
@weeks = @weeks.map do |d|
|
150
|
+
if d == week
|
151
|
+
["#{d} 本周", d]
|
152
|
+
else
|
153
|
+
[d, d]
|
154
|
+
end
|
155
|
+
end
|
149
156
|
end
|
150
157
|
@months = [Time.now.strftime("%Y-%m"), Time.now.months_ago(1).strftime("%Y-%m")]
|
151
158
|
@months << @sale_plan.month.strftime("%Y-%m")
|
@@ -180,7 +187,7 @@ module EducodeSales
|
|
180
187
|
|
181
188
|
def edit_month
|
182
189
|
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
183
|
-
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id)
|
190
|
+
@businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
|
184
191
|
@businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : '无'), b.id] }
|
185
192
|
@sale_plan = SalePlan.find(params[:id])
|
186
193
|
@finish_rates = []
|
@@ -7,7 +7,7 @@ module EducodeSales
|
|
7
7
|
def trends
|
8
8
|
# authorize! :trends, EducodeSales::SaleTrend
|
9
9
|
@year = params[:year] ? params[:year] : Time.now.year
|
10
|
-
@years = (1..(Time.now.year - 2014)).map { |d| 2014 + d }
|
10
|
+
@years = (1..(Time.now.year - 2014)).reverse_each.map { |d| 2014 + d }
|
11
11
|
year_time = "#{@year}-01-01 00:00:00"
|
12
12
|
year_over_time = "#{@year}-12-31 23:59:59"
|
13
13
|
x = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
@@ -15,13 +15,13 @@ module EducodeSales
|
|
15
15
|
@sale_trend = SaleTrend.find_or_create_by(year: @year)
|
16
16
|
@business_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).sum(:total_amount).round(2)
|
17
17
|
stage_ids = Common.where(clazz: '商机阶段', name: ['已中标','已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
|
18
|
-
@goal_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.
|
18
|
+
@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(:total_amount).round(2)
|
19
19
|
s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
|
20
|
-
@service_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_follow_ups.
|
20
|
+
@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)
|
21
21
|
@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)
|
22
|
-
a = Common.where(clazz: '商机类型', name:
|
22
|
+
a = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name).pluck(:id)
|
23
23
|
@a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).sum(:total_amount).round(2)
|
24
|
-
b = Common.where(clazz: '商机类型', name:
|
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
26
|
end
|
27
27
|
|
@@ -12,8 +12,8 @@ module EducodeSales
|
|
12
12
|
end
|
13
13
|
format.json do
|
14
14
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
15
|
-
@a_clazz = Common.find_by(clazz: 'business_type', name:
|
16
|
-
@b_clazz = Common.find_by(clazz: 'business_type', name:
|
15
|
+
@a_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name)
|
16
|
+
@b_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name)
|
17
17
|
@x = Common.find_by(extras: EducodeSales::Common::XTYPE)
|
18
18
|
@step_ids = Common.where(name: %w(已中标 已签单 已验收 回款中 服务中 已结束), clazz: 'business_step').pluck(:id)
|
19
19
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class UploadFilesController < ApplicationController
|
5
|
+
|
6
|
+
def index
|
7
|
+
respond_to do |format|
|
8
|
+
format.html do
|
9
|
+
end
|
10
|
+
format.json do
|
11
|
+
@files = Attachment.where(description: "business", container_id:params[:business_id]).page(params[:page]).per(params[:limit])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
upload_file = params["file"]
|
18
|
+
raise "未上传文件" unless upload_file
|
19
|
+
save_path = File.join("#{Rails.root}/public/images")
|
20
|
+
ext = file_ext(upload_file.original_filename)
|
21
|
+
local_path, digest = file_save_to_local(save_path, upload_file.tempfile, ext)
|
22
|
+
content_type = upload_file.content_type.presence || 'application/octet-stream'
|
23
|
+
disk_filename = local_path[save_path.size + 1, local_path.size]
|
24
|
+
@attachment = Attachment.where(disk_filename: disk_filename,
|
25
|
+
author_id: @current_admin.id).first
|
26
|
+
if @attachment.blank?
|
27
|
+
@attachment = Attachment.new
|
28
|
+
@attachment.filename = upload_file.original_filename
|
29
|
+
@attachment.description = "business"
|
30
|
+
@attachment.disk_filename = local_path[save_path.size + 1, local_path.size]
|
31
|
+
@attachment.filesize = upload_file.tempfile.size
|
32
|
+
@attachment.content_type = content_type
|
33
|
+
@attachment.digest = digest
|
34
|
+
@attachment.author_id = @current_admin.id
|
35
|
+
@attachment.container_id = params[:business_id]
|
36
|
+
@attachment.save!
|
37
|
+
else
|
38
|
+
logger.info "文件已存在,id = #{@attachment.id}, filename = #{@attachment.filename}"
|
39
|
+
end
|
40
|
+
render_success
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
file = Attachment.find(params[:id])
|
45
|
+
file.destroy
|
46
|
+
File.delete("#{Rails.root}/public/images/" + file.disk_filename)
|
47
|
+
render_success
|
48
|
+
end
|
49
|
+
|
50
|
+
def download
|
51
|
+
file = Attachment.find_by_id(params[:id])
|
52
|
+
raise "未找到文件" unless file
|
53
|
+
send_file("#{Rails.root}/public/images/" + file.disk_filename, filename: file.title, stream: true, type: file.content_type.presence || 'application/octet-stream')
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def file_ext(file_name)
|
58
|
+
ext = ''
|
59
|
+
exts = file_name.split(".")
|
60
|
+
if exts.size > 1
|
61
|
+
ext = ".#{exts.last}"
|
62
|
+
end
|
63
|
+
ext
|
64
|
+
end
|
65
|
+
|
66
|
+
def file_save_to_local(save_path, temp_file, ext)
|
67
|
+
unless Dir.exists?(save_path)
|
68
|
+
FileUtils.mkdir_p(save_path) ##不成功这里会抛异常
|
69
|
+
end
|
70
|
+
|
71
|
+
digest = md5_file(temp_file)
|
72
|
+
digest = "#{digest}_#{(Time.now.to_f * 1000).to_i}"
|
73
|
+
local_file_path = File.join(save_path, digest) + ext
|
74
|
+
save_temp_file(temp_file, local_file_path)
|
75
|
+
|
76
|
+
[local_file_path, digest]
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def md5_file(temp_file)
|
81
|
+
md5 = Digest::MD5.new
|
82
|
+
temp_file.rewind
|
83
|
+
while (buffer = temp_file.read(8192))
|
84
|
+
md5.update(buffer)
|
85
|
+
end
|
86
|
+
md5.hexdigest
|
87
|
+
end
|
88
|
+
|
89
|
+
def save_temp_file(temp_file, save_file_path)
|
90
|
+
File.open(save_file_path, 'wb') do |f|
|
91
|
+
temp_file.rewind
|
92
|
+
while (buffer = temp_file.read(8192))
|
93
|
+
f.write(buffer)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
@@ -41,6 +41,21 @@
|
|
41
41
|
id="invitation_at_edit" placeholder="请选择日期">
|
42
42
|
</div>
|
43
43
|
</div>
|
44
|
+
<div class="layui-inline">
|
45
|
+
<label class="layui-form-label">中标时间</label>
|
46
|
+
<div class="layui-input-inline">
|
47
|
+
<input type="text" class="layui-input" value="<%= @follow_up.bidded_date %>" name="bidded_date"
|
48
|
+
id="invitation_at_edit" placeholder="请选择日期">
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
<br>
|
52
|
+
<div class="layui-inline">
|
53
|
+
<label class="layui-form-label">签单时间</label>
|
54
|
+
<div class="layui-input-inline">
|
55
|
+
<input type="text" class="layui-input" value="<%= @follow_up.signed_date %>" name="signed_date"
|
56
|
+
id="invitation_at_edit" placeholder="请选择日期">
|
57
|
+
</div>
|
58
|
+
</div>
|
44
59
|
<div class="layui-inline">
|
45
60
|
<label class="layui-form-label">验收时间</label>
|
46
61
|
<div class="layui-input-inline">
|
@@ -0,0 +1,140 @@
|
|
1
|
+
<script type="text/html" id="toolbarDemo">
|
2
|
+
<div class="layui-btn-container">
|
3
|
+
<span class="table-label">附件信息</span>
|
4
|
+
<%# if can? :create, EducodeSales::Place %>
|
5
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
|
6
|
+
<%# end %>
|
7
|
+
</div>
|
8
|
+
</script>
|
9
|
+
|
10
|
+
<table class="layui-hide" id="place" lay-filter="currentTableFilter"></table>
|
11
|
+
|
12
|
+
<script type="text/html" id="currentTableBar_file">
|
13
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
|
14
|
+
<a href="/missions/upload_files/download?id={{d.id}}" class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="download">下载</a>
|
15
|
+
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
16
|
+
</script>
|
17
|
+
|
18
|
+
<script type="text/html" id="showchance">
|
19
|
+
<a href="/missions/businesses" class="layui-table-link">{{ d.chance }}</a>
|
20
|
+
</script>
|
21
|
+
|
22
|
+
<script>
|
23
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
|
24
|
+
var $ = layui.jquery,
|
25
|
+
form = layui.form,
|
26
|
+
table = layui.table,
|
27
|
+
request = layui.request,
|
28
|
+
upload = layui.upload;
|
29
|
+
miniPage = layui.miniPage;
|
30
|
+
|
31
|
+
|
32
|
+
var business_id = parent.id
|
33
|
+
table.render({
|
34
|
+
elem: '#place',
|
35
|
+
url: '/missions/upload_files?business_id='+business_id,
|
36
|
+
toolbar: '#toolbarDemo',
|
37
|
+
defaultToolbar: [],
|
38
|
+
cols: [
|
39
|
+
[
|
40
|
+
{
|
41
|
+
field: 'id',
|
42
|
+
width: 80,
|
43
|
+
title:'序号',type: 'numbers',
|
44
|
+
},
|
45
|
+
{
|
46
|
+
field: 'name',
|
47
|
+
width: 500,
|
48
|
+
title: '文件名'
|
49
|
+
},
|
50
|
+
{
|
51
|
+
field: 'size',
|
52
|
+
width: 100,
|
53
|
+
title: '文件大小',
|
54
|
+
},
|
55
|
+
{
|
56
|
+
field: 'upload_time',
|
57
|
+
width: 300,
|
58
|
+
title: '上传时间'
|
59
|
+
},
|
60
|
+
{
|
61
|
+
field: 'upload_person',
|
62
|
+
width: 120,
|
63
|
+
totalRow:true,
|
64
|
+
title: '上传人',
|
65
|
+
},
|
66
|
+
{
|
67
|
+
title: '操作',
|
68
|
+
toolbar: '#currentTableBar_file',
|
69
|
+
align: "center"
|
70
|
+
}
|
71
|
+
]
|
72
|
+
],
|
73
|
+
limit: 20,
|
74
|
+
limits: [10,15,20,30,40,50,60,70,80,90],
|
75
|
+
page: true
|
76
|
+
});
|
77
|
+
|
78
|
+
|
79
|
+
table.on('toolbar(currentTableFilter)', function (obj) {
|
80
|
+
if (obj.event === 'upload_file') { //
|
81
|
+
id =parent.id
|
82
|
+
var content = miniPage.getHrefContent('/missions/businesses/upload_file');
|
83
|
+
var openWH = miniPage.getOpenWidthHeight();
|
84
|
+
import_index = layer.open({
|
85
|
+
title: '上传文件',
|
86
|
+
type: 1,
|
87
|
+
shade: 0.2,
|
88
|
+
shadeClose: true,
|
89
|
+
area: ['200px', '100px'],
|
90
|
+
offset: 'auto',
|
91
|
+
closeBtn: 0,
|
92
|
+
content: content,
|
93
|
+
});
|
94
|
+
$(window).on("resize", function () {
|
95
|
+
layer.full(index);
|
96
|
+
});
|
97
|
+
}
|
98
|
+
});
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
table.on('tool(currentTableFilter)', function (obj) {
|
103
|
+
var data = obj.data;
|
104
|
+
var id = data.id
|
105
|
+
name = data.disk_filename
|
106
|
+
if (obj.event === 'preview') {
|
107
|
+
if (data.content_type.split("/")[0] === "image"){
|
108
|
+
// var img = "<img src='/images/" + name + "' />";
|
109
|
+
layer.photos({
|
110
|
+
photos: { "data": [{"src": '/images/'+name}] }
|
111
|
+
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
|
112
|
+
});
|
113
|
+
}else if (data.content_type.split("/")[1] === "pdf"){
|
114
|
+
var pdf = '/images/' + name;
|
115
|
+
console.log(pdf);
|
116
|
+
var openWH = miniPage.getOpenWidthHeight();
|
117
|
+
layer.open({
|
118
|
+
title: data.name,
|
119
|
+
type: 2,
|
120
|
+
area: ['1000px', '750px'],
|
121
|
+
fixed: false, //不固定
|
122
|
+
maxmin: true,
|
123
|
+
content: pdf
|
124
|
+
});
|
125
|
+
}else{
|
126
|
+
layer.msg("附件不支持预览,请下载查看!")
|
127
|
+
}
|
128
|
+
return false;
|
129
|
+
}else if (obj.event === 'delete') {
|
130
|
+
layer.confirm('确定删除' + data.name, function (index) {
|
131
|
+
request.delete('missions/upload_files/' + data.id + '?disk_filename=' + data.disk_filename, {}, function (res) {
|
132
|
+
layer.close(index);
|
133
|
+
table.reload("place")
|
134
|
+
})
|
135
|
+
});
|
136
|
+
}
|
137
|
+
});
|
138
|
+
|
139
|
+
});
|
140
|
+
</script>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<div class="layui-inline">
|
6
6
|
<label class="layui-form-label">商机名称</label>
|
7
7
|
<div class="layui-input-inline">
|
8
|
-
<input type="text" name="name" autocomplete="off" class="layui-input">
|
8
|
+
<input type="text" name="name" autocomplete="off" class="layui-input" value="<%=params[:name] %>">
|
9
9
|
</div>
|
10
10
|
</div>
|
11
11
|
<div class="layui-inline">
|
@@ -169,6 +169,18 @@
|
|
169
169
|
title: '招标时间',
|
170
170
|
sort: true
|
171
171
|
},
|
172
|
+
{
|
173
|
+
field: 'bidded_date',
|
174
|
+
width: 105,
|
175
|
+
title: '中标时间',
|
176
|
+
sort: true
|
177
|
+
},
|
178
|
+
{
|
179
|
+
field: 'signed_date',
|
180
|
+
width: 105,
|
181
|
+
title: '签单时间',
|
182
|
+
sort: true
|
183
|
+
},
|
172
184
|
{
|
173
185
|
field: 'reception_at',
|
174
186
|
width: 105,
|
@@ -248,6 +260,12 @@
|
|
248
260
|
case 'edit':
|
249
261
|
edit(id);
|
250
262
|
break;
|
263
|
+
case 'file':
|
264
|
+
file(id, elem.data('name'));
|
265
|
+
break;
|
266
|
+
case 'time_line':
|
267
|
+
time_line(id, elem.data('name'));
|
268
|
+
break;
|
251
269
|
case 'delete':
|
252
270
|
deleteBusiness(id, elem.data('name'));
|
253
271
|
break;
|
@@ -292,6 +310,41 @@
|
|
292
310
|
layer.full(sindex);
|
293
311
|
});
|
294
312
|
}
|
313
|
+
function time_line(id,name) {
|
314
|
+
var content = miniPage.getHrefContent('/missions/businesses/time_line?business_id=' + id);
|
315
|
+
var openWH = miniPage.getOpenWidthHeight();
|
316
|
+
sindex = layer.open({
|
317
|
+
title: '商机列表/'+name+'的跟进时间线',
|
318
|
+
type: 1,
|
319
|
+
shade: 0.2,
|
320
|
+
maxmin: true,
|
321
|
+
shadeClose: true,
|
322
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
323
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
324
|
+
content: content
|
325
|
+
});
|
326
|
+
$(window).on("resize", function () {
|
327
|
+
layer.full(sindex);
|
328
|
+
});
|
329
|
+
}
|
330
|
+
function file(id, name) {
|
331
|
+
id = id
|
332
|
+
var content = miniPage.getHrefContent('/missions/businesses/file?business_id=' + id);
|
333
|
+
var openWH = miniPage.getOpenWidthHeight();
|
334
|
+
sindex = layer.open({
|
335
|
+
title: '商机列表/'+name+'的附件信息',
|
336
|
+
type: 1,
|
337
|
+
shade: 0.2,
|
338
|
+
maxmin: true,
|
339
|
+
shadeClose: true,
|
340
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
341
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
342
|
+
content: content
|
343
|
+
});
|
344
|
+
$(window).on("resize", function () {
|
345
|
+
layer.full(sindex);
|
346
|
+
});
|
347
|
+
}
|
295
348
|
|
296
349
|
function month(id) {
|
297
350
|
var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + id);
|
@@ -533,6 +586,7 @@
|
|
533
586
|
});
|
534
587
|
} else if (obj.event === 'show_follow') {
|
535
588
|
business_id = obj.data.id
|
589
|
+
business_name = data.name
|
536
590
|
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + id);
|
537
591
|
openWH = miniPage.getOpenWidthHeight();
|
538
592
|
index = layer.open({
|