educode_sales 0.9.47 → 0.9.49

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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/controllers/educode_sales/idea_recycles_controller.rb +100 -0
  4. data/app/controllers/educode_sales/ideas_controller.rb +130 -0
  5. data/app/controllers/educode_sales/logs_controller.rb +21 -0
  6. data/app/controllers/educode_sales/teacher_follows_controller.rb +82 -2
  7. data/app/controllers/educode_sales/teachers_controller.rb +18 -3
  8. data/app/models/educode_sales/common.rb +2 -0
  9. data/app/models/educode_sales/idea.rb +87 -0
  10. data/app/models/educode_sales/idea_history.rb +8 -0
  11. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +18 -13
  12. data/app/views/educode_sales/businesses/index.json.jbuilder +4 -4
  13. data/app/views/educode_sales/idea_recycles/activities.json.jbuilder +9 -0
  14. data/app/views/educode_sales/idea_recycles/add_courses.html.erb +133 -0
  15. data/app/views/educode_sales/idea_recycles/add_event.html.erb +49 -0
  16. data/app/views/educode_sales/idea_recycles/add_keys.html.erb +334 -0
  17. data/app/views/educode_sales/idea_recycles/course_list.json.jbuilder +23 -0
  18. data/app/views/educode_sales/idea_recycles/course_subject.json.jbuilder +10 -0
  19. data/app/views/educode_sales/idea_recycles/daily_paper.html.erb +68 -0
  20. data/app/views/educode_sales/idea_recycles/detail.html.erb +144 -0
  21. data/app/views/educode_sales/idea_recycles/edit.html.erb +193 -0
  22. data/app/views/educode_sales/idea_recycles/edit_follow_record.html.erb +87 -0
  23. data/app/views/educode_sales/idea_recycles/history.html.erb +41 -0
  24. data/app/views/educode_sales/idea_recycles/import.html.erb +41 -0
  25. data/app/views/educode_sales/idea_recycles/index.html.erb +321 -0
  26. data/app/views/educode_sales/idea_recycles/index.json.jbuilder +16 -0
  27. data/app/views/educode_sales/idea_recycles/new.html.erb +204 -0
  28. data/app/views/educode_sales/idea_recycles/new_follow_record.html.erb +93 -0
  29. data/app/views/educode_sales/idea_recycles/search_new.html.erb +138 -0
  30. data/app/views/educode_sales/idea_recycles/show_class.html.erb +107 -0
  31. data/app/views/educode_sales/idea_recycles/show_follow.html.erb +504 -0
  32. data/app/views/educode_sales/idea_recycles/show_follow.json.jbuilder +23 -0
  33. data/app/views/educode_sales/idea_recycles/show_follow_record.html.erb +36 -0
  34. data/app/views/educode_sales/idea_recycles/unfinish_plans.json.jbuilder +14 -0
  35. data/app/views/educode_sales/ideas/activities.json.jbuilder +9 -0
  36. data/app/views/educode_sales/ideas/add_courses.html.erb +133 -0
  37. data/app/views/educode_sales/ideas/add_event.html.erb +49 -0
  38. data/app/views/educode_sales/ideas/add_keys.html.erb +334 -0
  39. data/app/views/educode_sales/ideas/course_list.json.jbuilder +23 -0
  40. data/app/views/educode_sales/ideas/course_subject.json.jbuilder +10 -0
  41. data/app/views/educode_sales/ideas/daily_paper.html.erb +68 -0
  42. data/app/views/educode_sales/ideas/detail.html.erb +144 -0
  43. data/app/views/educode_sales/ideas/edit.html.erb +182 -0
  44. data/app/views/educode_sales/ideas/edit_follow_record.html.erb +87 -0
  45. data/app/views/educode_sales/ideas/history.html.erb +41 -0
  46. data/app/views/educode_sales/ideas/import.html.erb +41 -0
  47. data/app/views/educode_sales/ideas/index.html.erb +335 -0
  48. data/app/views/educode_sales/ideas/index.json.jbuilder +16 -0
  49. data/app/views/educode_sales/ideas/new.html.erb +182 -0
  50. data/app/views/educode_sales/ideas/new_follow_record.html.erb +93 -0
  51. data/app/views/educode_sales/ideas/search_new.html.erb +138 -0
  52. data/app/views/educode_sales/ideas/show_class.html.erb +107 -0
  53. data/app/views/educode_sales/ideas/show_follow.html.erb +504 -0
  54. data/app/views/educode_sales/ideas/show_follow.json.jbuilder +23 -0
  55. data/app/views/educode_sales/ideas/show_follow_record.html.erb +36 -0
  56. data/app/views/educode_sales/ideas/unfinish_plans.json.jbuilder +14 -0
  57. data/app/views/educode_sales/logs/index.html.erb +48 -0
  58. data/app/views/educode_sales/logs/index.json.jbuilder +16 -0
  59. data/app/views/educode_sales/staffs/edit.html.erb +0 -1
  60. data/app/views/educode_sales/teacher_follows/index.json.jbuilder +20 -0
  61. data/app/views/educode_sales/teachers/_follows.html.erb +256 -0
  62. data/app/views/educode_sales/teachers/_index.html.erb +677 -0
  63. data/app/views/educode_sales/teachers/daily_paper.html.erb +22 -22
  64. data/app/views/educode_sales/teachers/index.html.erb +11 -651
  65. data/app/views/educode_sales/teachers/index.json.jbuilder +10 -0
  66. data/app/views/educode_sales/teachers/new.html.erb +9 -3
  67. data/app/views/educode_sales/teachers/new_follow_record.html.erb +6 -0
  68. data/app/views/layouts/educode_sales/application.html.erb +36 -7
  69. data/config/routes.rb +19 -0
  70. data/db/migrate/20230227061043_create_educode_sales_ideas.rb +28 -0
  71. data/db/migrate/20230227070206_change_to_educode_sales_ideas.rb +5 -0
  72. data/db/migrate/20230227125936_add_follow_at_to_teachers.rb +6 -0
  73. data/db/migrate/20230228063555_create_educode_sales_idea_histories.rb +10 -0
  74. data/db/migrate/20230302074324_change_manager_for_ideas.rb +6 -0
  75. data/lib/educode_sales/version.rb +1 -1
  76. metadata +66 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f238eee39f7340e6339b2b26e6140ac62ce0da5da1f009dbcdc0a146b1566b8
4
- data.tar.gz: 3fc72b20f031ecaa646083fcc34ca6d4a5702dd2cc770dc7ef83229f9f718674
3
+ metadata.gz: 991c62b2ec05619441690b9b61c2bfdc767facaeca2ec6e7e1389a1b28df77fd
4
+ data.tar.gz: bbd084aa585b81bb70b7b9fde8720b5e780f3db21ed9fde600de486e57845318
5
5
  SHA512:
6
- metadata.gz: 3bb437ceeb215fae404672b90276d28c7d454d85815cf846d2c9f7ec9cdd5c32041ba3c4ef1f2f67edbc23192d091351d98009b0f649d174990c7cdd7de73d91
7
- data.tar.gz: 641baf6fd5b3e9576401d7c0fc142d829237d01b4f3fc9bdc2bd43c91d0921935f51433b13fee229570be5a74b6112516dd5d2adc80851c0344e6e50a32a5eaa
6
+ metadata.gz: 80eaf5c8e779520520b470de676e98883da23576fc24bee8eb2583b482ee62859c7e443aa001787df94810c87cb3769585904202d31e261b4b43e6125b16c387
7
+ data.tar.gz: 2a6931fcbc1fc4ac9936dcafc42b46d6eb5e479fb6d6b799eea674b01351f9edcfd746e96d1eeceda5aee996c54efcaf6c3ef2bbedbd5c2eaddc7cb5dafbbae0
@@ -0,0 +1,100 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class IdeaRecyclesController < ApplicationController
5
+
6
+ before_action :find_idea, only: [:edit, :destroy, :detail, :history]
7
+
8
+ def index
9
+ respond_to do |format|
10
+ format.html do
11
+ staff_ids = EducodeSales::Idea.all.pluck(:staff_id)
12
+ creator_ids = EducodeSales::Idea.all.pluck(:creator_id)
13
+ @creator_arr = EducodeSales::Staff.joins(:user).where(id: creator_ids).pluck("concat(users.lastname,users.firstname)", :id)
14
+ @staff_arr = EducodeSales::Staff.joins(:user).where(id: staff_ids).pluck("concat(users.lastname,users.firstname)", :id)
15
+ end
16
+ format.json do
17
+ @ideas = Idea.deleted
18
+
19
+ if params[:q] && params[:q][:created_at].present?
20
+ date = params[:q][:created_at].split(" - ")
21
+ @ideas = @ideas.where("educode_sales_ideas.created_at >= ? AND educode_sales_ideas.created_at <= ?", date[0], date[1])
22
+ end
23
+ if params[:q].present? && params[:q][:name].present?
24
+ @ideas = @ideas.where("educode_sales_ideas.name like ?", "%#{params[:q][:name]}%")
25
+ end
26
+ if params[:q].present? && params[:q][:school].present?
27
+ @ideas = @ideas.left_joins(:school).where("schools.name like ?", "%#{params[:q][:school]}%")
28
+ end
29
+ if params[:q].present? && params[:q][:creator_id].present?
30
+ @ideas = @ideas.where("educode_sales_ideas.creator_id = ?", params[:q][:creator_id].to_i)
31
+ end
32
+ if params[:q].present? && params[:q][:staff_id].present?
33
+ @ideas = @ideas.where("educode_sales_ideas.staff_id = ?", params[:q][:staff_id].to_i)
34
+ end
35
+ if params[:q].present? && params[:q][:status].present?
36
+ @ideas = @ideas.where(status: params[:q][:status])
37
+ end
38
+ if params[:q].present? && params[:q][:types].present?
39
+ @ideas = @ideas.where(types: params[:q][:types])
40
+ end
41
+ if params[:q].present? && params[:q][:model].present?
42
+ @ideas = @ideas.where(model: params[:q][:model])
43
+ end
44
+ if params[:q].present? && params[:q][:history_type].present?
45
+ if params[:q][:history_type].to_i == 0
46
+ @ideas = @ideas.where("educode_sales_ideas.history_type=#{params[:q][:history_type]} or educode_sales_ideas.history_type is null ")
47
+ else
48
+ @ideas = @ideas.where(history_type: params[:q][:history_type])
49
+ end
50
+ end
51
+ if params[:q].present? && params[:q][:level].present?
52
+ @ideas = @ideas.where(level: params[:q][:level])
53
+ end
54
+
55
+ @ideas = @ideas.page(params[:page]).per(params[:limit])
56
+ end
57
+ end
58
+ end
59
+
60
+ def new
61
+ render layout: false
62
+ end
63
+
64
+ def create
65
+ end
66
+
67
+ def detail
68
+ render layout: false
69
+ end
70
+
71
+ def history
72
+ render layout: false
73
+ end
74
+
75
+ def update
76
+ end
77
+
78
+ def destroy
79
+ @idea.recycle
80
+ render_success
81
+ end
82
+
83
+ def edit
84
+ end
85
+
86
+ private
87
+
88
+ def idea_params
89
+ params.permit(:school_id, :name, :level, :staff_id,
90
+ :status, :types, :model, :hardware, :project,
91
+ :money, :end_time, :content, :department_id,
92
+ :manager_name, :manager_phone)
93
+ end
94
+
95
+ def find_idea
96
+ @idea = Idea.find(params[:id])
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,130 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class IdeasController < ApplicationController
5
+
6
+ before_action :find_idea, only: [:edit, :destroy, :detail, :history, :update]
7
+
8
+ def index
9
+ respond_to do |format|
10
+ format.html do
11
+ staff_ids = EducodeSales::Idea.all.pluck(:staff_id)
12
+ creator_ids = EducodeSales::Idea.all.pluck(:creator_id)
13
+ @creator_arr = EducodeSales::Staff.joins(:user).where(id: creator_ids).pluck("concat(users.lastname,users.firstname)", :id)
14
+ @staff_arr = EducodeSales::Staff.joins(:user).where(id: staff_ids).pluck("concat(users.lastname,users.firstname)", :id)
15
+ end
16
+ format.json do
17
+ @ideas = Idea.not_deleted
18
+
19
+ if params[:q] && params[:q][:created_at].present?
20
+ date = params[:q][:created_at].split(" - ")
21
+ @ideas = @ideas.where("educode_sales_ideas.created_at >= ? AND educode_sales_ideas.created_at <= ?", date[0], date[1])
22
+ end
23
+ if params[:q].present? && params[:q][:name].present?
24
+ @ideas = @ideas.where("educode_sales_ideas.name like ?", "%#{params[:q][:name]}%")
25
+ end
26
+ if params[:q].present? && params[:q][:school].present?
27
+ @ideas = @ideas.left_joins(:school).where("schools.name like ?", "%#{params[:q][:school]}%")
28
+ end
29
+ if params[:q].present? && params[:q][:creator_id].present?
30
+ @ideas = @ideas.where("educode_sales_ideas.creator_id = ?", params[:q][:creator_id].to_i)
31
+ end
32
+ if params[:q].present? && params[:q][:staff_id].present?
33
+ @ideas = @ideas.where("educode_sales_ideas.staff_id = ?", params[:q][:staff_id].to_i)
34
+ end
35
+ if params[:q].present? && params[:q][:status].present?
36
+ @ideas = @ideas.where(status: params[:q][:status])
37
+ end
38
+ if params[:q].present? && params[:q][:types].present?
39
+ @ideas = @ideas.where(types: params[:q][:types])
40
+ end
41
+ if params[:q].present? && params[:q][:model].present?
42
+ @ideas = @ideas.where(model: params[:q][:model])
43
+ end
44
+ if params[:q].present? && params[:q][:history_type].present?
45
+ if params[:q][:history_type].to_i == 0
46
+ @ideas = @ideas.where("educode_sales_ideas.history_type=#{params[:q][:history_type]} or educode_sales_ideas.history_type is null ")
47
+ else
48
+ @ideas = @ideas.where(history_type: params[:q][:history_type])
49
+ end
50
+ end
51
+ if params[:q].present? && params[:q][:level].present?
52
+ @ideas = @ideas.where(level: params[:q][:level])
53
+ end
54
+
55
+ @ideas = @ideas.page(params[:page]).per(params[:limit])
56
+ end
57
+ end
58
+ end
59
+
60
+ def new
61
+ gon.department = { value: '', name: '' }
62
+ gon.value = ''
63
+ render layout: false
64
+ end
65
+
66
+ def create
67
+ idea = Idea.new(idea_params)
68
+ idea.school_id = Department.find_by_id(idea.department_id)&.school_id
69
+ idea.creator = current_user
70
+ idea.save
71
+ render_success
72
+ end
73
+
74
+ def detail
75
+ render layout: false
76
+ end
77
+
78
+ def history
79
+ render layout: false
80
+ end
81
+
82
+ def update
83
+ @idea.assign_attributes(idea_params)
84
+ @idea.school_id = Department.find_by_id(@idea.department_id)&.school_id
85
+ check_changes
86
+ @idea.save
87
+ render_success
88
+ end
89
+
90
+ def destroy
91
+ @idea.soft_destroy(current_user.id)
92
+ render_success
93
+ end
94
+
95
+ def edit
96
+ gon.department = { value: @idea&.department_id, name: "#{@idea&.department&.school&.name}-#{@idea&.department&.name}" }
97
+ gon.value = @idea.department_id
98
+ render layout: false
99
+ end
100
+
101
+ private
102
+
103
+ def idea_params
104
+ params.permit(:name, :level, :staff_id,
105
+ :status, :types, :model, :hardware, :project,
106
+ :money, :end_time, :content, :department_id,
107
+ :manager_name, :manager_phone)
108
+ end
109
+
110
+ def find_idea
111
+ @idea = Idea.find(params[:id])
112
+ end
113
+
114
+ def check_changes
115
+ unless @idea.new_record?
116
+ history = []
117
+ arr = @idea.attributes.except(:creator_id, :id, :history_type, :deleter_id, :is_deleted, :deleted_at, :history_record, :created_at, :updated_at).keys
118
+ arr.each do |attr|
119
+ if @idea.send("#{attr}_changed?")
120
+ old_value, new_value = @idea.send("#{attr}_was"), @idea.send(attr)
121
+ res = @idea.save_history(attr, old_value, new_value)
122
+ history << res if res
123
+ end
124
+ end
125
+ @idea.idea_histories.create(content: history, staff: current_user) if history.present?
126
+ end
127
+ end
128
+
129
+ end
130
+ end
@@ -0,0 +1,21 @@
1
+ require_dependency "educode_sales/application_controller"
2
+
3
+ module EducodeSales
4
+ class LogsController < ApplicationController
5
+ def index
6
+ respond_to do |format|
7
+ format.html do
8
+ end
9
+ format.json do
10
+ @logs = Impression.where(impressionable_type: "EducodeSales::Staff")
11
+ if params[:sort].present? && params[:sort][:field]
12
+ @logs = @logs.order("#{params[:sort][:field]} #{params[:sort][:order]}")
13
+ else
14
+ @logs = @logs.order("created_at desc")
15
+ end
16
+ @logs = @logs.page(params[:page]).per(params[:limit])
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -15,7 +15,7 @@ module EducodeSales
15
15
  follow_up.courses_count = course_ids.size
16
16
  end
17
17
  if follow_up.save
18
- @teacher.update(follow_up_id: follow_up.id)
18
+ @teacher.update(follow_up_id: follow_up.id, followup_at: Time.now)
19
19
  render_success
20
20
  else
21
21
  render_failure follow_up
@@ -41,6 +41,86 @@ module EducodeSales
41
41
  end
42
42
  end
43
43
 
44
+ def index
45
+ @staff_manages = {}
46
+ role = EducodeSales::Role.find_by(name: '生态经理')
47
+ EducodeSales::Common.joins(market_areas: :staff).includes(market_areas: :staff).where(clazz: '区域').where("educode_sales_staffs.role_id = #{role.id}").each do |d|
48
+ @staff_manages[d.name] = d.market_areas.map { |d| d.staff&.user&.real_name }.uniq.compact
49
+ end if role
50
+
51
+ if @current_admin.is_admin?
52
+ @follow_ups = TeacherFollow.all
53
+ else
54
+ level = @current_admin.role.role_areas.find_by(clazz: '教师运营').level
55
+ case level
56
+ when '自己'
57
+ @follow_ups = TeacherFollow.where(staff_id: @current_admin.id)
58
+ when '区域'
59
+ school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
60
+ teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_teachers.staff_id = #{@current_admin.id}", school_ids).pluck(:id)
61
+ @follow_ups = TeacherFollow.where(teacher_id: teacher_ids)
62
+ else
63
+ @follow_ups = TeacherFollow.all
64
+ end
65
+ end
66
+ if params[:q].present? && params[:q][:name].present?
67
+ @follow_ups = @follow_ups.joins(:teacher).where("educode_sales_teachers.name LIKE ?", "%#{params[:q][:name]}%")
68
+ end
69
+
70
+ if params[:q].present? && params[:q][:staff_id].present?
71
+ staff = Staff.find(params[:q][:staff_id])
72
+ school_ids = School.where(province: staff.areas.pluck(:name)).pluck(:id)
73
+ teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?)", school_ids).pluck(:id)
74
+ @follow_ups = TeacherFollow.where(teacher_id: teacher_ids)
75
+ end
76
+
77
+ if params[:q].present? && params[:q][:department].present?
78
+ departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:department]}%").pluck(:id)
79
+ @follow_ups = @follow_ups.joins(:teacher).where("department_id in (?)", departments_ids)
80
+ end
81
+
82
+ if params[:q].present? && params[:q][:area].present?
83
+ p = EducodeSales::Common.find(params[:q][:area]).name
84
+ # if @current_admin.is_admin?
85
+ @follow_ups = @follow_ups.joins(:teacher).joins("
86
+ JOIN departments ON educode_sales_teachers.department_id = departments.id
87
+ JOIN schools ON departments.school_id = schools.id
88
+ ").where("province = ?", p)
89
+ # else
90
+ # level = @current_admin.role.role_areas.find_by(clazz: '教师运营').level
91
+ # if level == "区域"
92
+ # school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
93
+ # @follow_ups = @follow_ups.joins(:teacher).joins("
94
+ # JOIN departments ON educode_sales_teachers.department_id = departments.id
95
+ # JOIN schools ON departments.school_id = schools.id
96
+ # ").where("province = ? AND departments.school_id in (?)", p, school_ids)
97
+ # else
98
+ # @follow_ups = @follow_ups.joins(:teacher).joins("
99
+ # JOIN departments ON educode_sales_teachers.department_id = departments.id
100
+ # JOIN schools ON departments.school_id = schools.id
101
+ # ").where("province = ?", p)
102
+ # end
103
+ # end
104
+ end
105
+
106
+ if params[:q].present? && params[:q][:description].present?
107
+ @follow_ups = @follow_ups.where("educode_sales_teacher_follows.description LIKE ?" ,"%#{params[:q][:description]}%")
108
+ end
109
+
110
+ if params[:q].present? && params[:q][:follows_date].present?
111
+ date = params[:q][:follows_date].split(" - ")
112
+ @follow_ups = @follow_ups.where("educode_sales_teacher_follows.created_at > ? AND educode_sales_teacher_follows.created_at < ?", date[0], date[1] + ' 23:59:59')
113
+ end
114
+
115
+ @follow_ups = @follow_ups.includes(:teacher, :attitude, :staff)
116
+ if params[:sort].present? && params[:sort][:field]
117
+ @follow_ups = @follow_ups.order("#{params[:sort][:field]} #{params[:sort][:order]}")
118
+ else
119
+ @follow_ups = @follow_ups.order("educode_sales_teacher_follows.created_at desc")
120
+ end
121
+ @follow_ups = @follow_ups.page(params[:page]).per(params[:limit])
122
+ end
123
+
44
124
  private
45
125
 
46
126
  def load_teacher
@@ -48,7 +128,7 @@ module EducodeSales
48
128
  end
49
129
 
50
130
  def follow_up_params
51
- params.permit(:attitude_id, :follow_id, :course_plan_id, :course_build_id, :description)
131
+ params.permit(:attitude_id, :follow_id, :course_plan_id, :course_build_id, :description, :advise)
52
132
  end
53
133
 
54
134
  end
@@ -22,6 +22,13 @@ module EducodeSales
22
22
  respond_to do |format|
23
23
  format.html do
24
24
  common = Common.find_by(clazz: 'staff_type', name: '运营')
25
+ role = EducodeSales::Role.find_by(name: '生态经理')
26
+ if role
27
+ @staff_manage = Staff.joins(:user).where(role_id: role.id).map { |d| [d.user.real_name, d.id]}
28
+ else
29
+ @staff_manage = Staff.none
30
+ end
31
+
25
32
  @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
26
33
  @more = can?(:create, EducodeSales::OperationPlan) || can?(:update, EducodeSales::Teacher) || can?(:destroy, EducodeSales::Teacher)
27
34
  gon.menus = []
@@ -37,6 +44,12 @@ module EducodeSales
37
44
  end
38
45
  end
39
46
  format.json do
47
+ @staff_manages = {}
48
+ role = EducodeSales::Role.find_by(name: '生态经理')
49
+ EducodeSales::Common.joins(market_areas: :staff).includes(market_areas: :staff).where(clazz: '区域').where("educode_sales_staffs.role_id = #{role.id}").each do |d|
50
+ @staff_manages[d.name] = d.market_areas.map { |d| d.staff&.user&.real_name }.uniq.compact
51
+ end if role
52
+
40
53
  if @current_admin.is_admin?
41
54
  @teachers = Teacher.where(is_key: false)
42
55
  else
@@ -62,8 +75,6 @@ module EducodeSales
62
75
  @teachers = @teachers.where.not(id: public_teacher_ids)
63
76
  end
64
77
 
65
-
66
-
67
78
  if params[:q].present? && params[:q][:assist].present?
68
79
  staff_id = params[:q][:assist].to_i
69
80
  teacher_ids = EducodeSales::TeacherAssignFollow.where(staff_id: staff_id).pluck(:teacher_id)
@@ -116,8 +127,12 @@ module EducodeSales
116
127
  @teachers = @teachers.select("
117
128
  educode_sales_teachers.*,
118
129
  users.created_on,
130
+ last_follow.created_at as latest_time,
131
+ users.grade,
132
+ users.experience,
119
133
  users.last_login_on").joins("
120
134
  LEFT JOIN users ON educode_sales_teachers.user_id = users.id
135
+ LEFT JOIN educode_sales_teacher_follows AS last_follow ON last_follow.teacher_id = educode_sales_teachers.id AND last_follow.deleted_at IS NULL
121
136
  ")
122
137
  if params[:sort].present? && params[:sort][:field]
123
138
  @teachers = @teachers.order("#{params[:sort][:field]} #{params[:sort][:order]}")
@@ -337,7 +352,7 @@ module EducodeSales
337
352
 
338
353
  private
339
354
  def teacher_params
340
- params.permit(:name, :professional_title, :job, :source_id, :wechat)
355
+ params.permit(:name, :professional_title, :job, :source_id, :wechat, :mobile)
341
356
  end
342
357
 
343
358
  def load_teacher
@@ -2,6 +2,8 @@ module EducodeSales
2
2
  class Common < ApplicationRecord
3
3
  acts_as_list scope: [:clazz]
4
4
 
5
+ has_many :market_areas, class_name: 'MarketArea', foreign_key: 'area_id'
6
+
5
7
  XTYPE = "x_class"
6
8
  OTYPE = 'o_class'
7
9
  ATYPE = 'a_class'
@@ -0,0 +1,87 @@
1
+ module EducodeSales
2
+ class Idea < ApplicationRecord
3
+ belongs_to :department, optional: true
4
+ belongs_to :staff, optional: true
5
+ belongs_to :school, optional: true
6
+ belongs_to :creator, class_name: 'Staff', optional: true
7
+ belongs_to :deleter, class_name: 'Staff', optional: true
8
+
9
+ has_many :idea_histories, dependent: :destroy
10
+
11
+ scope :deleted, -> { where(is_deleted: true) }
12
+ scope :not_deleted, -> { where(is_deleted: false) }
13
+
14
+ enum level: %w[高 中 低]
15
+ enum status: %w[已完成 未完成]
16
+ enum types: %w[定制 非定制]
17
+ enum model: %w[本地版 线上版 混合版]
18
+
19
+ # before_save :check_changes
20
+
21
+ def recycle
22
+ self.update(deleted_at: nil, deleter_id: nil, is_deleted: false)
23
+ end
24
+
25
+ def soft_destroy(staff_id)
26
+ self.update(deleted_at: Time.now, deleter_id: staff_id, is_deleted: true)
27
+ end
28
+
29
+ # def check_changes
30
+ # unless self.new_record?
31
+ # history = []
32
+ # arr = self.attributes.except(:creator_id, :id, :history_type, :deleter_id, :is_deleted, :deleted_at, :history_record, :created_at, :updated_at).keys
33
+ # arr.each do |attr|
34
+ # if self.send("#{attr}_changed?")
35
+ # old_value, new_value = self.send("#{attr}_was"), self.send(attr)
36
+ # res = save_history(attr, old_value, new_value)
37
+ # history << res if res
38
+ # end
39
+ # end
40
+ # self.idea_histories.create(content: history, staff: current_user)
41
+ # end
42
+ # end
43
+
44
+ def save_history(attr, old_value, new_value)
45
+ case attr
46
+ when "school_id"
47
+ old_value = School.find_by(id: old_value)&.name
48
+ new_value = School.find_by(id: new_value)&.name
49
+ "学校/单位由“#{old_value}”变更为“#{new_value}”"
50
+ when "name"
51
+ "项目名称由“#{old_value}”变更为“#{new_value}”"
52
+ when "level"
53
+ "优先级由“#{old_value}”变更为“#{new_value}”"
54
+ when "staff_id"
55
+ old_value = Staff.find_by(id: old_value)&.user&.real_name
56
+ new_value = Staff.find_by(id: new_value)&.user&.real_name
57
+ "指派人由“#{old_value}”变更为“#{new_value}”"
58
+ when "status"
59
+ "状态由“#{old_value}”变更为“#{new_value}”"
60
+ when "types"
61
+ "类型由“#{old_value}”变更为“#{new_value}”"
62
+ when "model"
63
+ "部署模式由“#{old_value}”变更为“#{new_value}”"
64
+ when "hardware"
65
+ "硬件规模(万)由“#{old_value}”变更为“#{new_value}”"
66
+ when "project"
67
+ "项目规模(人)由“#{old_value}”变更为“#{new_value}”"
68
+ when "money"
69
+ "项目预算(万)由“#{old_value}”变更为“#{new_value}”"
70
+ when "end_time"
71
+ "截止时间由“#{old_value}”变更为“#{new_value}”"
72
+ when "content"
73
+ "反馈情况由“#{old_value}”变更为“#{new_value}”"
74
+ when "department_id"
75
+ old_value = Department.find_by(id: old_value)&.name
76
+ new_value = Department.find_by(id: new_value)&.name
77
+ "院系/部门由“#{old_value}”变更为“#{new_value}”"
78
+ when "manager_name"
79
+ "学校负责人由“#{old_value}”变更为“#{new_value}”"
80
+ when "manager_phone"
81
+ "负责人电话由“#{old_value}”变更为“#{new_value}”"
82
+ else
83
+ nil
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,8 @@
1
+ module EducodeSales
2
+ class IdeaHistory < ApplicationRecord
3
+ belongs_to :idea
4
+ belongs_to :staff
5
+
6
+ serialize :content, Array
7
+ end
8
+ end
@@ -3,13 +3,13 @@ json.data do
3
3
  json.id d.id
4
4
  json.number d.number
5
5
  json.name d.name
6
- json.department d.department.name
7
- json.school d.department.school.name
8
- json.school_id d.department.school.id
6
+ json.department d.department&.name
7
+ json.school d.department&.school&.name
8
+ json.school_id d.department&.school_id
9
9
  follow_ups_count = d['follow_ups_count'] || 0
10
10
  json.follow_ups_count follow_ups_count
11
11
  json.follow_up_id d.last_follow_up_id
12
- json.clazz d.last_follow_up&.clazz&.name || ""
12
+ json.clazz d.clazz&.name || ""
13
13
  json.stage d.last_follow_up&.stage&.name
14
14
  json.invitation_at d.last_follow_up&.invitation_at.to_s
15
15
  json.reception_at d.last_follow_up&.reception_at.to_s
@@ -27,17 +27,22 @@ json.data do
27
27
  json.divide_rate d.divide_rate
28
28
  json.divide_money d.divide_amount
29
29
  json.budget_amount d.budget_amount
30
- json.area d.department.school.province
31
- school_property = d.department.school.school_property
32
- property = []
30
+ json.area d.department&.school&.province
31
+ # school_property = d.department&.school&.school_property
32
+ # property = []
33
33
 
34
- if school_property.present?
35
- property << '本科地方院校' if school_property.regular_college || school_property.project_985 || school_property.project_211
36
- property << '高职' if school_property.junior_college || school_property.secondary_school
37
- property << '本科军校' if school_property.military_school
38
- property << '企业' if school_property.enterprise
34
+ # if school_property.present?
35
+ # property << '本科地方院校' if school_property.regular_college || school_property.project_985 || school_property.project_211
36
+ # property << '高职' if school_property.junior_college || school_property.secondary_school
37
+ # property << '本科军校' if school_property.military_school
38
+ # property << '企业' if school_property.enterprise
39
+ # end
40
+ # json.property property.join("、")
41
+ if d.department&.school
42
+ json.property d.department.school.school_tags.where(for_missions: true).pluck(:name).join("、")
43
+ else
44
+ json.property ''
39
45
  end
40
- json.property property.join("、")
41
46
  json.sale_way d.last_follow_up&.place&.name.present? ? '渠道' : '直销'
42
47
  json.actual_amount d.last_follow_up&.actual_amount.to_f.round(2)
43
48
  json.return_money d.return_money
@@ -5,9 +5,9 @@ json.data do
5
5
  json.id d.id
6
6
  json.number d.number
7
7
  json.name d.name
8
- json.department d.department.name
9
- json.school d.department.school.name
10
- json.school_id d.department.school.id
8
+ json.department d.department&.name
9
+ json.school d.department&.school&.name
10
+ json.school_id d.department&.school_id
11
11
  follow_ups_count = d['follow_ups_counts'] || 0
12
12
  json.follow_ups_count follow_ups_count
13
13
  follow_count += follow_ups_count
@@ -27,7 +27,7 @@ json.data do
27
27
  json.divide_rate d.divide_rate
28
28
  json.divide_money d.divide_amount.to_f.round(2)
29
29
  json.budget_amount d.budget_amount.to_f.round(2) #d.follow_ups.where(stage_id: @budget_stage_ids).order("created_at desc").first&.total_amount&.round(2) || 0
30
- json.area d.department.school.province
30
+ json.area d.department&.school&.province
31
31
  # school_property = d.department.school.school_property
32
32
  # property = []
33
33
 
@@ -0,0 +1,9 @@
1
+ json.data do
2
+ json.array! @activities do |d|
3
+ json.id d.id
4
+ json.name d.name
5
+ json.start_at d.start_at.to_s
6
+ end
7
+ end
8
+ json.code 0
9
+ json.msg 'succcess'