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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +67 -2
  3. data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
  4. data/app/controllers/educode_sales/home_controller.rb +1 -1
  5. data/app/controllers/educode_sales/operation_plans_controller.rb +11 -4
  6. data/app/controllers/educode_sales/operations_controller.rb +1 -1
  7. data/app/controllers/educode_sales/plans_controller.rb +15 -8
  8. data/app/controllers/educode_sales/sale_trends_controller.rb +5 -5
  9. data/app/controllers/educode_sales/sales_controller.rb +2 -2
  10. data/app/controllers/educode_sales/upload_files_controller.rb +99 -0
  11. data/app/models/educode_sales/common.rb +4 -0
  12. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +15 -0
  13. data/app/views/educode_sales/businesses/file.html.erb +140 -0
  14. data/app/views/educode_sales/businesses/index.html.erb +55 -1
  15. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -1
  16. data/app/views/educode_sales/businesses/new_follow_record.html.erb +17 -0
  17. data/app/views/educode_sales/businesses/show_follow.html.erb +38 -7
  18. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +2 -0
  19. data/app/views/educode_sales/businesses/show_follow_record.html.erb +79 -1
  20. data/app/views/educode_sales/businesses/time_line.html.erb +58 -0
  21. data/app/views/educode_sales/businesses/upload_file.html.erb +43 -0
  22. data/app/views/educode_sales/operation_plans/_monthly.html.erb +4 -4
  23. data/app/views/educode_sales/operation_plans/_weekly.html.erb +4 -4
  24. data/app/views/educode_sales/operation_plans/new_month.html.erb +15 -1
  25. data/app/views/educode_sales/operation_plans/new_week.html.erb +19 -4
  26. data/app/views/educode_sales/operation_reports/audit.html.erb +9 -9
  27. data/app/views/educode_sales/operation_reports/edit.html.erb +9 -9
  28. data/app/views/educode_sales/operation_reports/show.html.erb +9 -9
  29. data/app/views/educode_sales/plans/_monthly.html.erb +4 -4
  30. data/app/views/educode_sales/plans/_weekly.html.erb +4 -4
  31. data/app/views/educode_sales/sale_reports/audit.html.erb +7 -7
  32. data/app/views/educode_sales/sale_reports/edit.html.erb +7 -7
  33. data/app/views/educode_sales/sale_reports/show.html.erb +2 -2
  34. data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
  35. data/app/views/educode_sales/upload_files/index.json.jbuilder +13 -0
  36. data/config/routes.rb +12 -0
  37. data/db/migrate/20211102085743_add_bidded_date_educode_sales_follow_ups.rb +6 -0
  38. data/lib/educode_sales/version.rb +1 -1
  39. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09889c1d05306828a3d6dba9b149cdd6600ada4a043c545bfb6914521fdbfe43'
4
- data.tar.gz: 9ee3dfb7975c1270ea5adfd43b3cc0bee417a0cb7c544628486465037afd4166
3
+ metadata.gz: e75cbf87f4530e2665dd16d6fa56d82a14a0479ba0ce6f9f2cb39f5282ddb034
4
+ data.tar.gz: b4ab6a572903f23688eeb0441f66776f43ca4cabc70467cb013fff2f1c922473
5
5
  SHA512:
6
- metadata.gz: 6acf74a3a544e7cc6fc44809976f549fe4f0ca55cc9e96e91044daf2a0b0acddf4807deda3967cb00310c8403fab92930f5f01fb7d17125ca904746a93b30e3d
7
- data.tar.gz: 480ec2fc713a76af3cf6207805ee11c805cdeeaa50daefae6b148c70b976140b0ab01ba29aa4bc263b8b6fe9a6ef077c5dae8035acbbc219c5a32c2449cee336
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
- @follow_up = FollowUp.find(params[:follow_up_id])
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 = Teacher.where("name like ? and is_key = false", "%#{params[:q]}%").limit(20)
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.created_at >= ? AND educode_sales_follow_ups.created_at <= ? AND educode_sales_follow_ups.stage_id IN (?)", year_time, year_over_time, stage_ids).sum(:total_amount).round(2)
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.created_at >= ? AND educode_sales_follow_ups.created_at <= ? AND educode_sales_follow_ups.stage_id IN (?)", year_time, year_over_time, s_stage_ids).sum(:total_amount).round(2)
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: 'A类-有预算主推').pluck(:id)
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: 'B类-有预算不主推').pluck(:id)
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: 'A类-有预算主推')
16
- @b_clazz = Common.find_by(clazz: 'business_type', name: 'B类-有预算不主推')
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
@@ -4,6 +4,10 @@ module EducodeSales
4
4
 
5
5
  XTYPE = "x_class"
6
6
  OTYPE = 'o_class'
7
+ ATYPE = 'a_class'
8
+ BTYPE = 'b_class'
9
+ CTYPE = 'c_class'
10
+ DTYPE = 'd_class'
7
11
 
8
12
  validates :name, uniqueness: {scope: :clazz, message: '已存在'}
9
13
 
@@ -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({