educode_sales 0.4.6 → 0.5.0

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +74 -2
  3. data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
  4. data/app/controllers/educode_sales/home_controller.rb +4 -0
  5. data/app/controllers/educode_sales/operation_plans_controller.rb +16 -4
  6. data/app/controllers/educode_sales/operation_reports_controller.rb +6 -0
  7. data/app/controllers/educode_sales/operations_controller.rb +1 -1
  8. data/app/controllers/educode_sales/plans_controller.rb +29 -13
  9. data/app/controllers/educode_sales/sale_reports_controller.rb +6 -0
  10. data/app/controllers/educode_sales/sale_trends_controller.rb +8 -7
  11. data/app/controllers/educode_sales/sales_controller.rb +2 -2
  12. data/app/controllers/educode_sales/upload_files_controller.rb +105 -0
  13. data/app/models/educode_sales/common.rb +4 -0
  14. data/app/models/educode_sales/sale_plan.rb +1 -0
  15. data/app/views/educode_sales/activities/show_teachers.html.erb +16 -16
  16. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +15 -0
  17. data/app/views/educode_sales/businesses/file.html.erb +154 -0
  18. data/app/views/educode_sales/businesses/index.html.erb +62 -10
  19. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -1
  20. data/app/views/educode_sales/businesses/new_follow_record.html.erb +17 -0
  21. data/app/views/educode_sales/businesses/show_follow.html.erb +49 -12
  22. data/app/views/educode_sales/businesses/show_follow.json.jbuilder +3 -0
  23. data/app/views/educode_sales/businesses/show_follow_record.html.erb +80 -2
  24. data/app/views/educode_sales/businesses/time_line.html.erb +62 -0
  25. data/app/views/educode_sales/businesses/upload_file.html.erb +43 -0
  26. data/app/views/educode_sales/home/search_operation_teacher.json.jbuilder +12 -0
  27. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +7 -7
  28. data/app/views/educode_sales/operation_plans/_monthly.html.erb +8 -8
  29. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +8 -8
  30. data/app/views/educode_sales/operation_plans/_weekly.html.erb +9 -9
  31. data/app/views/educode_sales/operation_plans/edit_month.html.erb +6 -6
  32. data/app/views/educode_sales/operation_plans/edit_week.html.erb +7 -7
  33. data/app/views/educode_sales/operation_plans/new_month.html.erb +50 -4
  34. data/app/views/educode_sales/operation_plans/new_monthly.html.erb +12 -0
  35. data/app/views/educode_sales/operation_plans/new_week.html.erb +48 -5
  36. data/app/views/educode_sales/operation_plans/new_weekly.html.erb +12 -0
  37. data/app/views/educode_sales/operation_reports/audit.html.erb +22 -10
  38. data/app/views/educode_sales/operation_reports/edit.html.erb +22 -10
  39. data/app/views/educode_sales/operation_reports/show.html.erb +22 -10
  40. data/app/views/educode_sales/plans/_monthPlan.html.erb +8 -8
  41. data/app/views/educode_sales/plans/_monthly.html.erb +7 -7
  42. data/app/views/educode_sales/plans/_weekPlan.html.erb +7 -7
  43. data/app/views/educode_sales/plans/_weekly.html.erb +8 -8
  44. data/app/views/educode_sales/plans/edit_month.html.erb +7 -7
  45. data/app/views/educode_sales/plans/edit_week.html.erb +8 -8
  46. data/app/views/educode_sales/plans/new_month.html.erb +2 -2
  47. data/app/views/educode_sales/plans/new_monthly.html.erb +18 -6
  48. data/app/views/educode_sales/plans/new_week.html.erb +3 -3
  49. data/app/views/educode_sales/plans/new_weekly.html.erb +19 -7
  50. data/app/views/educode_sales/sale_reports/audit.html.erb +20 -8
  51. data/app/views/educode_sales/sale_reports/edit.html.erb +20 -8
  52. data/app/views/educode_sales/sale_reports/show.html.erb +15 -3
  53. data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
  54. data/app/views/educode_sales/teachers/index.html.erb +2 -2
  55. data/app/views/educode_sales/teachers/show_follow.html.erb +10 -4
  56. data/app/views/educode_sales/upload_files/index.json.jbuilder +13 -0
  57. data/app/views/layouts/educode_sales/application.html.erb +4 -1
  58. data/config/routes.rb +13 -0
  59. data/db/migrate/20211102085743_add_bidded_date_educode_sales_follow_ups.rb +6 -0
  60. data/lib/educode_sales/version.rb +1 -1
  61. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5ec520db3019e20ddbbd8615880ee3060fdd6d6e5f859130dfb0b0845be8f6d
4
- data.tar.gz: 7f678fb5d8c6b9dd77dc8c002b49f1e7228d8ce30b3eddb77fb2e7717b93d1d4
3
+ metadata.gz: 3c77c9d72b776a5250acf438fad00e27b871430b26bdf994a93d1189e0aaba14
4
+ data.tar.gz: 6ea39f9c64190ccec5427668596827663e702ddd5a0e0d8c0fa5cace8931d1ba
5
5
  SHA512:
6
- metadata.gz: 7ffcbfc616f3ab9241834c9642dfc13e8d18a1ea7c5bc16edcb46398503f80456e2fee80a09da8fec8377a748f0f60a56e4fdf53640470a1e7521a160642a7b7
7
- data.tar.gz: 3dd3605a2b1f4cd3469201c87dc7237bb76c01ea6da7cb968e81fd5702b57ab847c919a176a792cb3b7c47547bcc1dad06711cc38dda351935f7096d87001fc1
6
+ metadata.gz: 842442865a01e90e7aa227fd5f0b33fd994d509b9d1bad0bff8fe3ebfe59d818fd48b05fcef54c665504d0f5b0a0ec70c2efaccbdc5c017269ef507565866073
7
+ data.tar.gz: 365f1987a2fe002df56e11f72ba6456c1c15fefa880b06001dce1b4ae4ee1f95a92fae61b5afb3ff28c2ba51c04309b7d06f05067effee9f8aa8e618d0d38eae
@@ -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,43 @@ module EducodeSales
40
66
  end
41
67
  end
42
68
 
69
+ if params[:q].present? && params[:q][:name].present?
70
+ @year = params[:q][:name].split("-")[1].present? ? params[:q][:name].split("-")[1] : ''
71
+ end
72
+
73
+ if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-现有商机)"
74
+ a_id = Common.find_by(extras: EducodeSales::Common::ATYPE)&.id
75
+ b_id = Common.find_by(extras: EducodeSales::Common::BTYPE)&.id
76
+ c_id = Common.find_by(extras: EducodeSales::Common::CTYPE)&.id
77
+ d_id = Common.find_by(extras: EducodeSales::Common::DTYPE)&.id
78
+ ids = [a_id ,b_id ,c_id ,d_id]
79
+ @businesses = @businesses.joins("
80
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
81
+ ").where("educode_sales_follow_ups.clazz_id in (?)",ids)
82
+ end
83
+
84
+ if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已中标商机)"
85
+ @businesses = @businesses.joins("
86
+ 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
+ end
89
+
90
+ if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已签单商机)"
91
+ @businesses = @businesses.joins("
92
+ 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")
94
+ end
95
+
96
+ if params[:q].present? && params[:q][:name].present? && params[:q][:name] == "(销售态势-" + @year + "-已回款商机)"
97
+ x_id = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
98
+ # @businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ? AND educode_sales_businesses.return_money > 0", "#{@year}-01-01", "#{@year}-12-31").joins("
99
+ # JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
100
+ # ").where.not("educode_sales_follow_ups.clazz_id = ?",x_id)
101
+ year_time = "#{@year}-01-01 00:00:00"
102
+ year_over_time = "#{@year}-12-31 23:59:59"
103
+ @businesses = @businesses.joins(follow_ups: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", x_id).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).distinct
104
+ end
105
+
43
106
  if params[:q].present? && params[:q][:all].present?
44
107
  @businesses = @businesses
45
108
  end
@@ -51,7 +114,7 @@ module EducodeSales
51
114
  end
52
115
 
53
116
  @businesses = @businesses
54
- if params[:q].present? && params[:q][:name].present?
117
+ if params[:q].present? && params[:q][:name].present? && params[:q][:name] != "(销售态势-" + @year + "-已中标商机)" && params[:q][:name] != "(销售态势-" + @year + "-已签单商机)" && params[:q][:name] != "(销售态势-" + @year + "-已回款商机)" && params[:q][:name] != "(销售态势-现有商机)"
55
118
  @businesses = @businesses.where("educode_sales_businesses.name like ?", "%#{params[:q][:name]}%")
56
119
  end
57
120
  if params[:q].present? && params[:q][:department].present?
@@ -213,7 +276,16 @@ module EducodeSales
213
276
  end
214
277
 
215
278
  def show_follow_record
216
- @follow_up = FollowUp.find(params[:follow_up_id])
279
+ follow_up_id = params[:follow_up_id]
280
+ @follow_up = FollowUp.find(follow_up_id)
281
+ id = @follow_up.id
282
+ @follow_ups = Business.find(@follow_up.business_id).follow_ups
283
+ ids = @follow_ups.ids
284
+ size = ids.size
285
+ ids = ids.reverse
286
+ index = ids.index(id)
287
+ @next_id = (index != size - 1 && size > 1) ? ids[index + 1] : 0
288
+ @pre_id = (index != 0 && size > 1) ? ids[index - 1] : 0
217
289
  render layout: false
218
290
  end
219
291
 
@@ -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
@@ -33,6 +33,10 @@ module EducodeSales
33
33
  @data += User.joins(:user_extension).where.not(id: user_ids).where("identity='teacher'", user_ids).where("lastname like ?", "%#{params[:q]}%").limit(50)
34
34
  end
35
35
 
36
+ def search_operation_teacher
37
+ @data = @current_admin.teachers.where("name like ? and is_key = false", "%#{params[:q]}%").limit(20)
38
+ end
39
+
36
40
  def search_edu_teacher
37
41
  @data = User.joins(:user_extension).where("identity='teacher'").where("concat(lastname, firstname) like :q OR phone like :q OR mail like :q", q: "%#{params[:q]}%").limit(50)
38
42
  end
@@ -52,13 +52,14 @@ module EducodeSales
52
52
  end
53
53
  def new_week
54
54
  @teacher = Teacher.find_by(id: params[:teacher_id])
55
+ @week = Time.now.strftime('%W').to_i
55
56
  week = Time.now.strftime('%W').to_i
56
57
  if week > 3
57
- @weeks = [week, week - 1, week - 2]
58
+ @weeks = [[week+2,week+2], [week+1,week+1], [week.to_s + ' 本周',week], [week - 1,week - 1], [week - 2,week - 2]]
58
59
  elsif week == 2
59
- @weeks = [week, week - 1]
60
+ @weeks = [[week.to_s + ' 本周',week], [week - 1,week - 1]]
60
61
  else
61
- @weeks = [week]
62
+ @weeks = [[week.to_s + ' 本周',week]]
62
63
  end
63
64
  @teachers = @current_admin.teachers.where(is_key: 0).pluck(:name, :id)
64
65
  render layout: false
@@ -77,6 +78,8 @@ module EducodeSales
77
78
  end
78
79
 
79
80
  def new_weekly
81
+ @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
82
+ @name = @current_admin.user.real_name
80
83
  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)
81
84
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
82
85
  @departments_count = sale_plans.joins(:teacher).count("distinct(department_id)")
@@ -92,6 +95,8 @@ module EducodeSales
92
95
  end
93
96
 
94
97
  def new_monthly
98
+ @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
99
+ @name = @current_admin.user.real_name
95
100
  sale_plans = OperationPlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
96
101
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
97
102
  @departments_count = sale_plans.joins(:teacher).count("distinct(department_id)")
@@ -131,7 +136,7 @@ module EducodeSales
131
136
  if @sale_plan.weekly.present?
132
137
  week = Time.now.strftime('%W').to_i
133
138
  if week > 3
134
- @weeks = [week, week - 1, week - 2]
139
+ @weeks = [week+2, week+1, week, week - 1, week - 2]
135
140
  elsif week == 2
136
141
  @weeks = [week, week - 1]
137
142
  else
@@ -139,6 +144,13 @@ module EducodeSales
139
144
  end
140
145
  @weeks << @sale_plan.weekly
141
146
  @weeks = @weeks.uniq.sort
147
+ @weeks = @weeks.map do |d|
148
+ if d == week
149
+ ["#{d} 本周", d]
150
+ else
151
+ [d, d]
152
+ end
153
+ end
142
154
  end
143
155
  @months = [Time.now.strftime("%Y-%m"), Time.now.months_ago(1).strftime("%Y-%m")]
144
156
  @months << @sale_plan.month.strftime("%Y-%m")
@@ -67,6 +67,8 @@ module EducodeSales
67
67
 
68
68
  def show
69
69
  @sale_report = OperationReport.find(params[:id])
70
+ @name = @sale_report.staff.user.real_name
71
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
70
72
  render layout: false
71
73
  end
72
74
 
@@ -78,6 +80,8 @@ module EducodeSales
78
80
 
79
81
  def edit
80
82
  @sale_report = OperationReport.find(params[:id])
83
+ @name = @sale_report.staff.user.real_name
84
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
81
85
  render layout: false
82
86
  end
83
87
 
@@ -113,6 +117,8 @@ module EducodeSales
113
117
 
114
118
  def audit
115
119
  @sale_report = OperationReport.find(params[:id])
120
+ @name = @sale_report.staff.user.real_name
121
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
116
122
  render layout: false
117
123
  end
118
124
 
@@ -4,7 +4,7 @@ module EducodeSales
4
4
  class OperationsController < ApplicationController
5
5
 
6
6
  def trends
7
- @years = (1..(Time.now.year - 2020)).map { |d| 2020 + 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
@@ -59,7 +59,7 @@ module EducodeSales
59
59
  def create
60
60
  plan = @current_admin.sale_plans.build(plan_params)
61
61
  plan.month = params["month"] + "-1"
62
- plan.business = @current_admin.businesses.find_by(id: params[:business_id])
62
+ plan.business = Business.find_by(id: params[:business_id])
63
63
  if plan.save
64
64
  render_success
65
65
  else
@@ -70,21 +70,24 @@ module EducodeSales
70
70
 
71
71
  def new_week
72
72
  @business = Business.find_by(id: params[:business_id])
73
+ @week = Time.now.strftime('%W').to_i
73
74
  week = Time.now.strftime('%W').to_i
74
75
  if week > 3
75
- @weeks = [week, week - 1, week - 2]
76
+ @weeks = [[week+2,week+2], [week+1,week+1], [week.to_s + ' 本周',week], [week - 1,week - 1], [week - 2,week - 2]]
76
77
  elsif week == 2
77
- @weeks = [week, week - 1]
78
+ @weeks = [[week.to_s + ' 本周',week], [week - 1,week - 1]]
78
79
  else
79
- @weeks = [week]
80
+ @weeks = [[week.to_s + ' 本周',week]]
80
81
  end
81
- ids = AssignFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
82
- ids1 = FollowUp.where(id: ids).pluck(:business_id)
83
- @businesses =Business.where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", ids1, @current_admin.id).pluck(:name, :id)
82
+ business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
83
+ @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)
84
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
84
85
  render layout: false
85
86
  end
86
87
 
87
88
  def new_weekly
89
+ @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
90
+ @name = @current_admin.user.real_name
88
91
  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)
89
92
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
90
93
  @departments_count = sale_plans.joins(:business).count("distinct(department_id)")
@@ -94,13 +97,15 @@ module EducodeSales
94
97
 
95
98
  def new_month
96
99
  @business = Business.find_by(id: params[:business_id])
97
- ids = AssignFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
98
- ids1 = FollowUp.where(id: ids).pluck(:business_id)
99
- @businesses =Business.where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", ids1, @current_admin.id).pluck(:name, :id)
100
+ business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
101
+ @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)
102
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
100
103
  render layout: false
101
104
  end
102
105
 
103
106
  def new_monthly
107
+ @area =@current_admin.areas.present? ? @current_admin.areas.pluck(:name).join("、") : ''
108
+ @name = @current_admin.user.real_name
104
109
  sale_plans = SalePlan.where(month: Time.now.strftime("%Y-%m") + "-01 00:00:00", staff_id: @current_admin.id, weekly: nil)
105
110
  @rate = sale_plans.present? ? (sale_plans.sum("finish_rate") / sale_plans.size) : 0
106
111
  @departments_count = sale_plans.joins(:business).count("distinct(department_id)")
@@ -127,12 +132,14 @@ module EducodeSales
127
132
  end
128
133
 
129
134
  def edit_week
130
- @businesses = @current_admin.businesses.pluck(:name, :id)
135
+ business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
136
+ @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)
137
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
131
138
  @sale_plan = SalePlan.find(params[:id])
132
139
  if @sale_plan.weekly.present?
133
140
  week = Time.now.strftime('%W').to_i
134
141
  if week > 3
135
- @weeks = [week, week - 1, week - 2]
142
+ @weeks = [week+2, week+1, week, week - 1, week - 2]
136
143
  elsif week == 2
137
144
  @weeks = [week, week - 1]
138
145
  else
@@ -140,6 +147,13 @@ module EducodeSales
140
147
  end
141
148
  @weeks << @sale_plan.weekly
142
149
  @weeks = @weeks.uniq.sort
150
+ @weeks = @weeks.map do |d|
151
+ if d == week
152
+ ["#{d} 本周", d]
153
+ else
154
+ [d, d]
155
+ end
156
+ end
143
157
  end
144
158
  @months = [Time.now.strftime("%Y-%m"), Time.now.months_ago(1).strftime("%Y-%m")]
145
159
  @months << @sale_plan.month.strftime("%Y-%m")
@@ -173,7 +187,9 @@ module EducodeSales
173
187
  end
174
188
 
175
189
  def edit_month
176
- @businesses = @current_admin.businesses.pluck(:name, :id)
190
+ business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
191
+ @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)
192
+ @businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
177
193
  @sale_plan = SalePlan.find(params[:id])
178
194
  @finish_rates = []
179
195
  11.times { |d| @finish_rates << ["#{d*10}%", d * 10]}
@@ -23,6 +23,8 @@ module EducodeSales
23
23
 
24
24
  def show
25
25
  @sale_report = SaleReport.find(params[:id])
26
+ @name = @sale_report.staff.user.real_name
27
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
26
28
  render layout: false
27
29
  end
28
30
 
@@ -83,6 +85,8 @@ module EducodeSales
83
85
 
84
86
  def edit
85
87
  @sale_report = SaleReport.find(params[:id])
88
+ @name = @sale_report.staff.user.real_name
89
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
86
90
  render layout: false
87
91
  end
88
92
 
@@ -118,6 +122,8 @@ module EducodeSales
118
122
 
119
123
  def audit
120
124
  @sale_report = SaleReport.find(params[:id])
125
+ @name = @sale_report.staff.user.real_name
126
+ @area = @sale_report.staff.areas.present? ? @sale_report.staff.areas.pluck(:name).join("、") : ''
121
127
  render layout: false
122
128
  end
123
129
 
@@ -7,20 +7,21 @@ 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 - 2020)).map { |d| 2020 + 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
+ year_over_time = "#{@year}-12-31 23:59:59"
12
13
  x = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
13
14
  o = Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
14
15
  @sale_trend = SaleTrend.find_or_create_by(year: @year)
15
- @business_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.clazz_id != ?", x, o).where("educode_sales_follow_ups.created_at >= ?", year_time).sum(:total_amount).round(2)
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)
16
17
  stage_ids = Common.where(clazz: '商机阶段', name: ['已中标','已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
17
- @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.stage_id IN (?)", year_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)
18
19
  s_stage_ids = Common.where(clazz: '商机阶段', name: ['已签单','已验收','回款中', '服务中','已结束']).pluck(:id)
19
- @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.stage_id IN (?)", year_time, s_stage_ids).sum(:total_amount).round(2)
20
- @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 >= ?", year_time).sum(:amount).round(2)
21
- a = Common.where(clazz: '商机类型', name: 'A类').pluck(:id)
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
+ @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: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name).pluck(:id)
22
23
  @a_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", a).sum(:total_amount).round(2)
23
- b = Common.where(clazz: '商机类型', name: 'B类').pluck(:id)
24
+ b = Common.where(clazz: '商机类型', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name).pluck(:id)
24
25
  @b_amount = Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id IN (?)", b).sum(:total_amount).round(2)
25
26
  end
26
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,105 @@
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])
12
+ if params[:sort].present? && params[:sort][:field]
13
+ @files = @files.order("#{params[:sort][:field]} #{params[:sort][:order]}")
14
+ else
15
+ @files = @files.order("created_on desc")
16
+ end
17
+ @files = @files.page(params[:page]).per(params[:limit])
18
+ end
19
+ end
20
+ end
21
+
22
+ def create
23
+ upload_file = params["file"]
24
+ raise "未上传文件" unless upload_file
25
+ save_path = File.join("#{Rails.root}/public/images")
26
+ ext = file_ext(upload_file.original_filename)
27
+ local_path, digest = file_save_to_local(save_path, upload_file.tempfile, ext)
28
+ content_type = upload_file.content_type.presence || 'application/octet-stream'
29
+ disk_filename = local_path[save_path.size + 1, local_path.size]
30
+ @attachment = Attachment.where(disk_filename: disk_filename,
31
+ author_id: @current_admin.id).first
32
+ if @attachment.blank?
33
+ @attachment = Attachment.new
34
+ @attachment.filename = upload_file.original_filename
35
+ @attachment.description = "business"
36
+ @attachment.disk_filename = local_path[save_path.size + 1, local_path.size]
37
+ @attachment.filesize = upload_file.tempfile.size
38
+ @attachment.content_type = content_type
39
+ @attachment.digest = digest
40
+ @attachment.author_id = @current_admin.id
41
+ @attachment.container_id = params[:business_id]
42
+ @attachment.save!
43
+ else
44
+ logger.info "文件已存在,id = #{@attachment.id}, filename = #{@attachment.filename}"
45
+ end
46
+ render_success
47
+ end
48
+
49
+ def destroy
50
+ file = Attachment.find(params[:id])
51
+ file.destroy
52
+ File.delete("#{Rails.root}/public/images/" + file.disk_filename)
53
+ render_success
54
+ end
55
+
56
+ def download
57
+ file = Attachment.find_by_id(params[:id])
58
+ raise "未找到文件" unless file
59
+ send_file("#{Rails.root}/public/images/" + file.disk_filename, filename: file.title, stream: true, type: file.content_type.presence || 'application/octet-stream')
60
+ end
61
+
62
+
63
+ def file_ext(file_name)
64
+ ext = ''
65
+ exts = file_name.split(".")
66
+ if exts.size > 1
67
+ ext = ".#{exts.last}"
68
+ end
69
+ ext
70
+ end
71
+
72
+ def file_save_to_local(save_path, temp_file, ext)
73
+ unless Dir.exists?(save_path)
74
+ FileUtils.mkdir_p(save_path) ##不成功这里会抛异常
75
+ end
76
+
77
+ digest = md5_file(temp_file)
78
+ digest = "#{digest}_#{(Time.now.to_f * 1000).to_i}"
79
+ local_file_path = File.join(save_path, digest) + ext
80
+ save_temp_file(temp_file, local_file_path)
81
+
82
+ [local_file_path, digest]
83
+ end
84
+
85
+
86
+ def md5_file(temp_file)
87
+ md5 = Digest::MD5.new
88
+ temp_file.rewind
89
+ while (buffer = temp_file.read(8192))
90
+ md5.update(buffer)
91
+ end
92
+ md5.hexdigest
93
+ end
94
+
95
+ def save_temp_file(temp_file, save_file_path)
96
+ File.open(save_file_path, 'wb') do |f|
97
+ temp_file.rewind
98
+ while (buffer = temp_file.read(8192))
99
+ f.write(buffer)
100
+ end
101
+ end
102
+ end
103
+
104
+ end
105
+ 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
 
@@ -2,6 +2,7 @@ module EducodeSales
2
2
  class SalePlan < ApplicationRecord
3
3
  belongs_to :business
4
4
  belongs_to :staff
5
+ validates :business_id, presence: true
5
6
 
6
7
  validates :month, presence: true
7
8
  end
@@ -1,3 +1,4 @@
1
+ <div class="min-height-table">
1
2
  <script type="text/html" id="teacher_toolbar">
2
3
  <div class="layui-btn-container">
3
4
  <span class="table-label">教师列表</span>
@@ -5,7 +6,6 @@
5
6
  </button>
6
7
  </div>
7
8
  </script>
8
- <div class="layuimini-main edit-table">
9
9
  <table class="layui-hide" id="show_teachers_table" style="min-height: 300px;" lay-filter="teachers_table"></table>
10
10
  </div>
11
11
  <script type="text/html" id="show_teachersTableBar">
@@ -53,84 +53,84 @@
53
53
  elem: '#show_teachers_table',
54
54
  url: '/missions/teachers?activity_id=' + parent.activity_id,
55
55
  toolbar: '#teacher_toolbar',
56
- defaultToolbar: [],
56
+ defaultToolbar: ['filter'],
57
57
  cols: [
58
58
  [
59
59
  {
60
60
  field: 'id',
61
- width: 120,
61
+ width: 60,
62
62
  title:'序号',type: 'numbers',
63
63
  },
64
64
  {
65
65
  field: 'name',
66
- width: 120,
66
+ width: 90,
67
67
  title: '姓名',
68
68
  templet: "#name"
69
69
  },
70
70
  {
71
71
  field: 'school',
72
- width: 190,
72
+ width: 120,
73
73
  title: '单位',
74
74
  },
75
75
  {
76
76
  field: 'department',
77
- width: 190,
77
+ width: 120,
78
78
  title: '部门'
79
79
  },
80
80
  {
81
81
  field: 'professional_title',
82
82
  title: '职称',
83
- width: 120,
83
+ width: 80,
84
84
  templet: '#show_follow'
85
85
  },
86
86
  {
87
87
  field: 'job',
88
- width: 120,
88
+ width: 80,
89
89
  title: '职务',
90
90
  templet: '#show_keys'
91
91
 
92
92
  },
93
93
  {
94
94
  field: 'source',
95
- width: 120,
95
+ width: 100,
96
96
  title: '来源',
97
97
  },
98
98
  {
99
99
  field: 'attitude',
100
- width: 120,
100
+ width: 80,
101
101
  title: '态度',
102
102
  },
103
103
  {
104
104
  field: 'course_subjects_count',
105
- width: 120,
105
+ width: 90,
106
106
  title: '课程方向',
107
107
  templet: "#courses"
108
108
  },
109
109
  {
110
110
  field: 'teacher_follows_count',
111
- width: 120,
111
+ width: 90,
112
112
  title: '跟进情况',
113
113
  templet: "#follow"
114
114
  },
115
115
  {
116
116
  field: 'teacher_used',
117
- width: 120,
117
+ width: 110,
118
118
  title: '学院渗透率',
119
119
  },
120
120
  {
121
121
  field: 'students',
122
- width: 120,
122
+ width: 60,
123
123
  title: '学生',
124
124
  },
125
125
  {
126
126
  field: 'courses_count',
127
- width: 120,
127
+ width: 60,
128
128
  title: '课堂',
129
129
  templet: "#class"
130
130
  },
131
131
  {
132
132
  field: 'activities_count',
133
- width: 120,
133
+ width: 100,
134
134
  title: '参与活动',
135
135
  templet: "#event"
136
136
  },