educode_sales 0.9.67 → 0.9.69

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/assets/javascripts/educode_sales/extent/treeTable.js +235 -0
  4. data/app/controllers/educode_sales/activities_controller.rb +52 -38
  5. data/app/controllers/educode_sales/businesses_controller.rb +1 -1
  6. data/app/controllers/educode_sales/customers_controller.rb +107 -0
  7. data/app/controllers/educode_sales/follow_ups_controller.rb +6 -0
  8. data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
  9. data/app/controllers/educode_sales/plans_controller.rb +173 -11
  10. data/app/controllers/educode_sales/projects_controller.rb +420 -0
  11. data/app/controllers/educode_sales/recycles_controller.rb +11 -1
  12. data/app/controllers/educode_sales/roles_controller.rb +4 -1
  13. data/app/controllers/educode_sales/teachers_controller.rb +42 -17
  14. data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
  15. data/app/helpers/educode_sales/application_helper.rb +1 -0
  16. data/app/models/educode_sales/activity.rb +4 -0
  17. data/app/models/educode_sales/assessments_setting.rb +2 -2
  18. data/app/models/educode_sales/business.rb +21 -5
  19. data/app/models/educode_sales/business_history.rb +8 -0
  20. data/app/models/educode_sales/business_info.rb +9 -0
  21. data/app/models/educode_sales/permission.rb +2 -1
  22. data/app/models/educode_sales/project.rb +53 -0
  23. data/app/models/educode_sales/role_area.rb +2 -1
  24. data/app/models/educode_sales/sale_plan.rb +3 -1
  25. data/app/models/educode_sales/staff.rb +2 -0
  26. data/app/views/educode_sales/activities/_follows.html.erb +50 -36
  27. data/app/views/educode_sales/activities/_index.html.erb +82 -9
  28. data/app/views/educode_sales/activities/edit.html.erb +25 -68
  29. data/app/views/educode_sales/activities/files.html.erb +157 -0
  30. data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
  31. data/app/views/educode_sales/activities/follow_ups.json.jbuilder +1 -1
  32. data/app/views/educode_sales/activities/index.json.jbuilder +2 -2
  33. data/app/views/educode_sales/activities/new.html.erb +21 -60
  34. data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
  35. data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
  36. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
  37. data/app/views/educode_sales/businesses/index.html.erb +5 -0
  38. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -0
  39. data/app/views/educode_sales/businesses/new.html.erb +1 -1
  40. data/app/views/educode_sales/businesses/time_line.html.erb +9 -5
  41. data/app/views/educode_sales/customers/edit_major.html.erb +872 -0
  42. data/app/views/educode_sales/customers/list.html.erb +602 -0
  43. data/app/views/educode_sales/customers/list.json.jbuilder +33 -0
  44. data/app/views/educode_sales/follow_ups/index.json.jbuilder +2 -2
  45. data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
  46. data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
  47. data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
  48. data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
  49. data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
  50. data/app/views/educode_sales/plans/index.html.erb +8 -0
  51. data/app/views/educode_sales/plans/new_year.html.erb +204 -0
  52. data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
  53. data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
  54. data/app/views/educode_sales/projects/detail.html.erb +269 -0
  55. data/app/views/educode_sales/projects/edit.html.erb +246 -0
  56. data/app/views/educode_sales/projects/history.html.erb +41 -0
  57. data/app/views/educode_sales/projects/index.html.erb +688 -0
  58. data/app/views/educode_sales/projects/index.json.jbuilder +69 -0
  59. data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
  60. data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
  61. data/app/views/educode_sales/recycles/index.html.erb +26 -22
  62. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
  63. data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
  64. data/app/views/educode_sales/teachers/_index.html.erb +17 -1
  65. data/app/views/educode_sales/teachers/index.json.jbuilder +2 -0
  66. data/app/views/layouts/educode_sales/application.html.erb +25 -0
  67. data/config/routes.rb +31 -0
  68. data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +6 -0
  69. data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
  70. data/db/migrate/20230411134203_add_realname_to_teacher.rb +5 -0
  71. data/db/migrate/20230412083510_add_p_staff_id_to_businesses.rb +20 -0
  72. data/db/migrate/20230412092000_create_business_histories.rb +10 -0
  73. data/db/migrate/20230413015619_add_permissions_to_projects.rb +11 -0
  74. data/db/migrate/20230413031029_add_pre_time_to_businesses.rb +5 -0
  75. data/lib/educode_sales/version.rb +1 -1
  76. metadata +38 -5
@@ -16,7 +16,7 @@ module EducodeSales
16
16
 
17
17
  def create
18
18
  role = Role.new(name: params[:name])
19
- role.role_areas.build([{ clazz: 'Business' }, { clazz: 'SalePlan' }, { clazz: 'Teacher' }, { clazz: 'Operation' }, { clazz: 'Customer' }, { clazz: 'MoneyPlan' }, { clazz: 'AssessmentsSetting' }, { clazz: 'Idea' }])
19
+ role.role_areas.build([{ clazz: 'Business' }, { clazz: 'SalePlan' }, { clazz: 'Teacher' }, { clazz: 'Operation' }, { clazz: 'Customer' }, { clazz: 'MoneyPlan' }, { clazz: 'AssessmentsSetting' }, { clazz: 'Idea' }, { clazz: 'Project' }])
20
20
  if role.save
21
21
  render_success
22
22
  else
@@ -90,6 +90,9 @@ module EducodeSales
90
90
  r = role.role_areas.find_or_initialize_by(clazz: 'Idea')
91
91
  r.level = params[:idea]
92
92
  r.save
93
+ r = role.role_areas.find_or_initialize_by(clazz: 'Project')
94
+ r.level = params[:project]
95
+ r.save
93
96
  render_success
94
97
  end
95
98
 
@@ -24,12 +24,12 @@ module EducodeSales
24
24
  common = Common.find_by(clazz: 'staff_type', name: '运营')
25
25
  role = EducodeSales::Role.find_by(name: '生态经理')
26
26
  if role
27
- @staff_manage = Staff.joins(:user).where(role_id: role.id).map { |d| [d.user.real_name, d.id]}
27
+ @staff_manage = Staff.includes(:user).where(role_id: role.id).map { |d| [d.user.real_name, d.id]}
28
28
  else
29
29
  @staff_manage = Staff.none
30
30
  end
31
-
32
- @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
31
+ @follow_upers = Staff.includes(:user).map { |d| [d.user.real_name, d.id]}
32
+ @staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
33
33
  @more = can?(:create, EducodeSales::OperationPlan) || can?(:update, EducodeSales::Teacher) || can?(:destroy, EducodeSales::Teacher)
34
34
  gon.menus = []
35
35
  if can?(:create, EducodeSales::OperationPlan)
@@ -51,25 +51,27 @@ module EducodeSales
51
51
  end if role
52
52
 
53
53
  if @current_admin.is_admin?
54
- @teachers = Teacher.where(is_key: false)
54
+ @teachers = Teacher
55
55
  else
56
56
  level = @current_admin.role.role_areas.find_by(clazz: '教师运营').level
57
57
  case level
58
58
  when '自己'
59
- @teachers = Teacher.where(is_key: false)
59
+ @teachers = Teacher
60
60
  @teachers = @teachers.where(staff_id: @current_admin.id)
61
61
  teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.all.pluck(:Teacher_id) + EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id) + @teachers.ids
62
62
  @teachers = Teacher.where(id: teacher_ids)
63
63
  when '区域'
64
64
  school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
65
- @teachers = Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where(is_key: false).where("departments.school_id in (?) OR educode_sales_teachers.staff_id = #{@current_admin.id}", school_ids)
65
+ @teachers = 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)
66
66
  teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.all.pluck(:Teacher_id) + EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id) + @teachers.ids
67
67
  @teachers = Teacher.where(id: teacher_ids)
68
68
  else
69
- @teachers = Teacher.where(is_key: false)
69
+ @teachers = Teacher
70
70
  end
71
71
  end
72
72
 
73
+ @teachers = @teachers.includes(department: [:department_majors, :school])
74
+
73
75
  if @current_admin.job_type == Common.find_by(clazz: 'staff_type', name: '销售').id
74
76
  public_teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id)
75
77
  @teachers = @teachers.where.not(id: public_teacher_ids)
@@ -131,16 +133,39 @@ module EducodeSales
131
133
  @teachers = @teachers.where("educode_sales_teachers.created_at > ? AND educode_sales_teachers.created_at < ?", date[0], date[1])
132
134
  end
133
135
 
134
- @teachers = @teachers.select("
135
- educode_sales_teachers.*,
136
- users.created_on,
137
- last_follow.created_at as latest_time,
138
- users.grade,
139
- users.experience,
140
- users.last_login_on").joins("
141
- LEFT JOIN users ON educode_sales_teachers.user_id = users.id
142
- 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
143
- ")
136
+ if params[:q].present? && params[:q][:staff_manage].present?
137
+ staff = Staff.find(params[:q][:staff_manage])
138
+ school_ids = School.where(province: staff.areas.pluck(:name)).pluck(:id)
139
+ teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?)", school_ids).pluck(:id)
140
+ @teachers = @teachers.where(id: teacher_ids)
141
+ end
142
+
143
+
144
+
145
+ if params[:q].present? && params[:q][:staff_id].present?
146
+ @teachers = @teachers.select("
147
+ educode_sales_teachers.*,
148
+ users.created_on,
149
+ last_follow.created_at as latest_time,
150
+ users.grade,
151
+ users.experience,
152
+ users.last_login_on").joins("
153
+ JOIN educode_sales_teacher_follows AS last_follow ON last_follow.id = educode_sales_teachers.follow_up_id AND last_follow.deleted_at IS NULL
154
+ LEFT JOIN users ON educode_sales_teachers.user_id = users.id
155
+ ")
156
+ @teachers = @teachers.where("last_follow.staff_id = ?", params[:q][:staff_id].to_i)
157
+ else
158
+ @teachers = @teachers.select("
159
+ educode_sales_teachers.*,
160
+ users.created_on,
161
+ last_follow.created_at as latest_time,
162
+ users.grade,
163
+ users.experience,
164
+ users.last_login_on").joins("
165
+ LEFT JOIN users ON educode_sales_teachers.user_id = users.id
166
+ LEFT JOIN educode_sales_teacher_follows AS last_follow ON last_follow.id = educode_sales_teachers.follow_up_id AND last_follow.deleted_at IS NULL
167
+ ")
168
+ end
144
169
  if params[:sort].present? && params[:sort][:field]
145
170
  @teachers = @teachers.order("#{params[:sort][:field]} #{params[:sort][:order]}")
146
171
  else
@@ -33,13 +33,20 @@ module EducodeSales
33
33
  if @attachment.blank?
34
34
  @attachment = Attachment.new
35
35
  @attachment.filename = upload_file.original_filename
36
- @attachment.description = "business"
36
+ if params[:activity_id].present?
37
+ @attachment.container_id = params[:activity_id]
38
+ @attachment.container_type = 'EducodeSales::Activity'
39
+ else
40
+ @attachment.description = "business"
41
+ @attachment.container_id = params[:business_id]
42
+ end
43
+
37
44
  @attachment.disk_filename = local_path[save_path.size + 1, local_path.size]
38
45
  @attachment.filesize = upload_file.tempfile.size
39
46
  @attachment.content_type = content_type
40
47
  @attachment.digest = digest
41
48
  @attachment.author_id = @current_admin.user_id
42
- @attachment.container_id = params[:business_id]
49
+
43
50
  @attachment.save!
44
51
  else
45
52
  logger.info "文件已存在,id = #{@attachment.id}, filename = #{@attachment.filename}"
@@ -19,6 +19,7 @@ module EducodeSales
19
19
  File.join("images/avatars", ["#{source&.class}", "#{source&.id}"]) + "?t=#{ctime}"
20
20
  end
21
21
  elsif source.class.to_s == 'User'
22
+
22
23
  str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g"
23
24
  File.join(relative_path, "#{source.class}", str)
24
25
  elsif source.class.to_s == 'Subject'
@@ -11,6 +11,10 @@ module EducodeSales
11
11
  has_many :activity_staffs, dependent: :destroy
12
12
  has_many :activity_follow_ups, dependent: :destroy
13
13
 
14
+ has_many :attachments, as: :container, dependent: :destroy
15
+
16
+ belongs_to :last_follow_up, class_name: 'ActivityFollowUp', optional: true
17
+
14
18
  belongs_to :sales, class_name: 'Staff', optional: true
15
19
 
16
20
  has_one :attachment, as: :container, dependent: :destroy
@@ -8,7 +8,7 @@ module EducodeSales
8
8
 
9
9
 
10
10
  CLAZZ = {
11
- 7 => '销售指标', 1 => '签单指标', 2 => '回款指标', 3 => '商机跟进', 4 => '商机挖掘-A类商机', 5 => '商机挖掘-B类商机', 6 => '客户拜访-线下拜访', 8 => '客户拜访-线上拜访',
11
+ 7 => '商机目标', 18 => '中标目标', 1 => '签单目标', 2 => '回款目标', 3 => '商机跟进', 4 => '商机挖掘-A类商机', 5 => '商机挖掘-B类商机', 6 => '客户拜访-线下拜访', 8 => '客户拜访-线上拜访',
12
12
  9 => '注册数据-学生', 10 => '注册数据-老师', 11 => '会议组织-区域性会议', 12 => '会议组织-单校会议', 13 => '生态合作-虚拟教研室', 14 => '生态合作-特软', 15 => '生态合作-大V合作',
13
13
  16 => '重要事项', 17 => '临时任务'
14
14
  }
@@ -17,7 +17,7 @@ module EducodeSales
17
17
 
18
18
  def unit_name
19
19
  case self.assessment
20
- when 1, 2, 7
20
+ when 1, 2, 7, 18
21
21
  '万元'
22
22
  when 3
23
23
  '条'
@@ -1,25 +1,34 @@
1
1
  module EducodeSales
2
2
  class Business < ApplicationRecord
3
3
 
4
- validates_uniqueness_of :number ,allow_nil: true
4
+ validates_uniqueness_of :number, allow_nil: true
5
5
 
6
6
  belongs_to :clazz, class_name: 'Common'
7
7
  belongs_to :staff
8
8
  belongs_to :department
9
9
  belongs_to :last_follow_up, class_name: 'FollowUp', optional: true # 允许last_follow_up_id字段中的数为nil
10
10
 
11
+ belongs_to :p_staff, class_name: 'Staff', optional: true
12
+ belongs_to :p_sale_staff, class_name: 'Staff', optional: true
13
+ belongs_to :p_deleter, class_name: 'Staff', optional: true
14
+
11
15
  has_many :sale_plans
12
16
  has_many :follow_ups
13
17
  has_many :business_clazz_changes
14
18
  has_many :business_levels, dependent: :destroy
15
19
  has_many :business_watches, dependent: :destroy
20
+ has_many :business_histories, dependent: :destroy
16
21
 
17
- #关联关注
18
- has_many :users,:class_name => 'EducodeSales::BusinessRelationShip',foreign_key: 'business_id',:dependent => :destroy
22
+ # 关联关注
23
+ has_many :users, :class_name => 'EducodeSales::BusinessRelationShip', foreign_key: 'business_id', :dependent => :destroy
19
24
 
20
- #每次查询时 默认的查询条件
21
- default_scope -> {where(deleted_at: nil)}
25
+ # 每次查询时 默认的查询条件
26
+ default_scope -> { where(deleted_at: nil) }
22
27
 
28
+ enum p_stage: %w[合同阶段 验收阶段 回款阶段]
29
+ enum p_difficulty: %w[困难 适中 容易]
30
+ enum p_special: %w[是 否]
31
+ enum p_status: %w[未完成 已完成]
23
32
 
24
33
  def soft_destroy(user_id)
25
34
  self.update(deleted_at: Time.now, state_id: 2)
@@ -30,6 +39,13 @@ module EducodeSales
30
39
  EducodeSales::Recycle.create(source: self, deleter_id: user_id)
31
40
  end
32
41
 
42
+ def p_soft_destroy(staff_id)
43
+ self.update(p_deleted_at: Time.now, p_deleter_id: staff_id)
44
+ end
45
+
46
+ def p_recycle
47
+ self.update(p_deleted_at: nil, p_deleter_id: nil)
48
+ end
33
49
 
34
50
  def self.include_types(type)
35
51
  {
@@ -0,0 +1,8 @@
1
+ module EducodeSales
2
+ class BusinessHistory < ApplicationRecord
3
+ belongs_to :business
4
+ belongs_to :staff
5
+
6
+ serialize :content, Array
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module EducodeSales
2
+ class BusinessInfo < ApplicationRecord
3
+ belongs_to :staff
4
+ belongs_to :business
5
+ belongs_to :sale_plan, optional: true
6
+ end
7
+
8
+ end
9
+
@@ -14,7 +14,8 @@ module EducodeSales
14
14
  '客户管理': 'customer',
15
15
  '回款管理': 'money_plan',
16
16
  '绩效考核': 'assessments_setting',
17
- '方案管理': 'idea'
17
+ '方案管理': 'idea',
18
+ '项目管理': 'project'
18
19
  }
19
20
  end
20
21
  end
@@ -0,0 +1,53 @@
1
+ module EducodeSales
2
+ class Project < ApplicationRecord
3
+ self.table_name = "educode_sales_businesses"
4
+
5
+ enum p_stage: %w[合同阶段 验收阶段 回款阶段]
6
+ enum p_difficulty: %w[困难 适中 容易]
7
+ enum p_special: %w[是 否]
8
+ enum p_status: %w[未完成 已完成]
9
+
10
+ def self.save_history(attr, old_value, new_value)
11
+ # old_value = St.find_by(id: old_value)&.name
12
+ # new_value = Department.find_by(id: new_value)&.name
13
+ case attr
14
+ when "p_stage"
15
+ "项目阶段由“#{old_value}”变更为“#{new_value}”"
16
+ when "p_difficulty"
17
+ "项目难度由“#{old_value}”变更为“#{new_value}”"
18
+ when "p_special"
19
+ "定制由“#{old_value}”变更为“#{new_value}”"
20
+ when "p_status"
21
+ "交付由“#{old_value}”变更为“#{new_value}”"
22
+ when "p_staff_id"
23
+ old_value = Staff.find_by(id: old_value)&.user&.real_name
24
+ new_value = Staff.find_by(id: new_value)&.user&.real_name
25
+ "指派人由“#{old_value}”变更为“#{new_value}”"
26
+ when "p_sale_staff_id"
27
+ old_value = Staff.find_by(id: old_value)&.user&.real_name
28
+ new_value = Staff.find_by(id: new_value)&.user&.real_name
29
+ "销售经理由“#{old_value}”变更为“#{new_value}”"
30
+ when "p_course_time"
31
+ "课程交付时间由“#{old_value}”变更为“#{new_value}”"
32
+ when "p_platform_time"
33
+ "平台交付时间由“#{old_value}”变更为“#{new_value}”"
34
+ when "p_deploy_time"
35
+ "现场部署时间由“#{old_value}”变更为“#{new_value}”"
36
+ when "p_accept_time"
37
+ "实际验收时间由“#{old_value}”变更为“#{new_value}”"
38
+ when "p_pre_money_time"
39
+ "拟定回款时间由“#{old_value}”变更为“#{new_value}”"
40
+ when "p_actual_money_time"
41
+ "实际回款时间由“#{old_value}”变更为“#{new_value}”"
42
+ when "p_money"
43
+ "回款由“#{old_value}”变更为“#{new_value}”"
44
+ when "p_content"
45
+ "问题备注由“#{old_value}”变更为“#{new_value}”"
46
+ when "p_pre_accept_time"
47
+ "预计验收时间由“#{old_value}”变更为“#{new_value}”"
48
+ else
49
+ nil
50
+ end
51
+ end
52
+ end
53
+ end
@@ -11,7 +11,8 @@ module EducodeSales
11
11
  '客户管理': 'Customer',
12
12
  '回款管理': 'MoneyPlan',
13
13
  '绩效考核': 'AssessmentsSetting',
14
- '方案管理': 'Idea'
14
+ '方案管理': 'Idea',
15
+ '项目管理': 'Project'
15
16
  }
16
17
  end
17
18
  end
@@ -5,7 +5,9 @@ module EducodeSales
5
5
  belongs_to :staff
6
6
  validates :business_id, presence: true
7
7
 
8
- validates :month, presence: true
8
+ # validates :month, presence: true
9
+
10
+ CLAZZ_NAME = {'商机目标' => 7, '中标目标' => 18, '签单目标' => 1, '回款目标' => 2}
9
11
 
10
12
  default_scope -> {where(deleted_at: nil)}
11
13
  end
@@ -25,6 +25,8 @@ module EducodeSales
25
25
 
26
26
  has_many :staff_school_tags, dependent: :destroy
27
27
 
28
+ has_many :business_infos, dependent: :destroy
29
+
28
30
  has_many :market_areas, dependent: :destroy
29
31
  has_many :areas, through: :market_areas
30
32
  validates :user_id, uniqueness: { message: '已存在' }
@@ -1,5 +1,5 @@
1
1
  <div style="margin: 10px 10px 10px 10px">
2
- <form class="layui-form layui-form-pane" lay-filter="search_follows">
2
+ <form class="layui-form layui-form-pane">
3
3
  <div class="layui-form-item">
4
4
  <div class="layui-inline">
5
5
  <label class="layui-form-label">活动名称</label>
@@ -16,7 +16,7 @@
16
16
  <div class="layui-inline">
17
17
  <label class="layui-form-label">销售经理</label>
18
18
  <div class="layui-input-inline">
19
- <%= select_tag "sales_id", options_for_select(EducodeSales::Staff.all.map{|d| [d.user&.real_name, d.id]}), { include_blank: true } %>
19
+ <%= select_tag "sales_id", options_for_select(@staffs), { include_blank: true } %>
20
20
  </div>
21
21
  </div>
22
22
 
@@ -33,19 +33,10 @@
33
33
  <table class="layui-hide" id="activity_followp_table" style="min-height: 300px;" lay-filter="activity_followp_table"></table>
34
34
  </div>
35
35
  <script type="text/html" id="currentTableBar_follows">
36
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a>
36
+ <% if can? :advise, EducodeSales::ActivityFollowUp %>
37
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="advise">团队建议</a>
38
+ <% end %>
37
39
  </script>
38
- <script type="text/html" id="teacher_name">
39
- {{# if (d.login) { }}
40
- <a href="<%= base_url%>/users/{{d.login}}" class="layui-table-link" target="_blank">{{ d.teacher }}</a>
41
- {{# } else {}}
42
- <a href="javascript:;" class="">{{ d.teacher }}</a>
43
- {{# }}}
44
- </script>
45
- <script type="text/html" id="school">
46
- <a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
47
- </script>
48
-
49
40
 
50
41
  <script>
51
42
  layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate'], function () {
@@ -56,20 +47,13 @@
56
47
  miniPage = layui.miniPage,
57
48
  laydate = layui.laydate;
58
49
 
59
- var laydate = layui.laydate;
60
-
61
- laydate.render({
62
- elem: '#follows_date',
63
- range: true
64
- });
65
-
66
- table = layui.table;
50
+ var table = layui.table;
67
51
  table.render({
68
52
  elem: '#activity_followp_table',
69
53
  url: '/missions/activities/follow_ups',
70
54
  defaultToolbar: ['filter'],
71
55
  initSort: {
72
- field: 'created_at' ,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
56
+ field: 'created_at' ,type: 'desc'
73
57
  },
74
58
  cols: [
75
59
  [
@@ -117,22 +101,22 @@
117
101
  {
118
102
  field: 'created_at',
119
103
  width: 180,
120
- title: '跟进时间',
104
+ title: '最新跟进时间',
121
105
  sort: true,
122
106
  },
123
107
  {
124
- field: 'advise',
125
- width: 120,
126
- title: '团队建议',
127
- templet:'<div><span title="{{d.advise}}">{{d.advise}}</span></div>'
108
+ field: 'advise',
109
+ width: 300,
110
+ title: '团队建议',
111
+ templet:'<div><span title="{{d.advise}}">{{d.advise}}</span></div>'
128
112
  },
129
- // {
130
- // title: '操作',
131
- // width: 80,
132
- // toolbar: '#currentTableBar_follows',
133
- // align: "center",
134
- // fixed: 'right'
135
- // }
113
+ {
114
+ title: '操作',
115
+ width: 200,
116
+ toolbar: '#currentTableBar_follows',
117
+ align: "center",
118
+ fixed: 'right'
119
+ }
136
120
  ]
137
121
  ],
138
122
  limit: 20,
@@ -196,6 +180,36 @@
196
180
  $(window).on("resize", function () {
197
181
  layer.full(index);
198
182
  });
183
+ } else if (obj.event == 'advise') {
184
+ layer.open({
185
+ title: '添加团队建议',
186
+ closeBtn: 0,
187
+ type: 1,
188
+ area: '400px;',
189
+ id: 'LAY_layuipro',
190
+ content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea">' + data.advise + '</textarea></div>' ,
191
+ btn: ['保存', '取消'],
192
+ btn1: function(index, l) {
193
+ if (l.find("textarea").val().trim() == '') {
194
+ layer.msg('内容不能为空')
195
+ return false;
196
+ } else {
197
+ request.authPost("/missions/activities/add_advise", {content: l.find("textarea").val().trim(), id: data.id}, function(res) {
198
+ if (res.success == false) {
199
+ layer.alert(res.msg);
200
+ } else {
201
+ layer.close(index);
202
+ table.reload('activity_followp_table');
203
+ }
204
+ })
205
+ }
206
+
207
+ return false
208
+ },
209
+ btn2: function(index, l) {
210
+ layer.close(index)
211
+ }
212
+ });
199
213
  }
200
214
  });
201
215
 
@@ -203,6 +217,6 @@
203
217
  </script>
204
218
  <style>
205
219
  .layui-table-tool-temp{
206
- padding-right: 30px; !important;
220
+ padding-right: 30px; !important;
207
221
  }
208
222
  </style>
@@ -8,7 +8,7 @@
8
8
  </div>
9
9
  </script>
10
10
  <div style="margin: 10px 10px 10px 10px">
11
- <form class="layui-form layui-form-pane" lay-filter="search_ideas">
11
+ <form class="layui-form layui-form-pane">
12
12
  <div class="layui-form-item">
13
13
  <div class="layui-inline ">
14
14
  <label class="layui-form-label">活动名称</label>
@@ -37,7 +37,7 @@
37
37
  <div class="layui-inline">
38
38
  <label class="layui-form-label">生态经理</label>
39
39
  <div class="layui-input-inline">
40
- <%= select_tag "manage", options_for_select(@staffs, ""), { include_blank: true } %>
40
+ <%= select_tag "manage", options_for_select(@staff_manage, ""), { include_blank: true } %>
41
41
  </div>
42
42
  </div>
43
43
  <div class="layui-inline">
@@ -67,11 +67,19 @@
67
67
 
68
68
  <script type="text/html" id="currentTableBar">
69
69
  <% if can? :create, EducodeSales::ActivityFollowUp %>
70
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
70
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进</a>
71
71
  <% end %>
72
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_plan">添加计划</a>
73
+ <% if can? :advise, EducodeSales::ActivityFollowUp %>
74
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="advise">建议</a>
75
+ <% end %>
76
+
72
77
  <% if can? :update, EducodeSales::Activity %>
73
78
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
74
79
  <% end %>
80
+ <% if can? :show_file, EducodeSales::Activity %>
81
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="file">附件</a>
82
+ <% end %>
75
83
  <% if can? :destroy, EducodeSales::Activity %>
76
84
  <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
77
85
  <% end %>
@@ -174,11 +182,6 @@
174
182
  width: 180,
175
183
  title: '邀请专家'
176
184
  },
177
- {
178
- field: 'expert',
179
- width: 180,
180
- title: '报告专家'
181
- },
182
185
  {
183
186
  field: 'start_at',
184
187
  width: 200,
@@ -212,7 +215,7 @@
212
215
  },
213
216
  {
214
217
  title: '操作',
215
- width: 260,
218
+ width: 380,
216
219
  toolbar: '#currentTableBar',
217
220
  align: "center",
218
221
  fixed: 'right'
@@ -311,6 +314,26 @@
311
314
  layer.full(index);
312
315
  });
313
316
  return false;
317
+ } else if (obj.event === 'add_plan') {
318
+ var content = miniPage.getHrefContent('/missions/operation_plans/new_week');
319
+ var openWH = miniPage.getOpenWidthHeight();
320
+ new_weelPlan_index = layer.open({
321
+ title: '添加计划',
322
+ type: 1,
323
+ shade: 0.2,
324
+ maxmin: true,
325
+ shadeClose: true,
326
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
327
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
328
+ content: content,
329
+ success: function (layero, index) {
330
+ // 重新渲染弹层中的下拉选择框select
331
+ form.render('select');
332
+ }
333
+ });
334
+ $(window).on("resize", function () {
335
+ layer.full(index);
336
+ });
314
337
  } else if (obj.event === 'delete') {
315
338
  layer.confirm('确定删除' + data.name, function (index) {
316
339
  request.delete('missions/activities/' + data.id, {}, function (res) {
@@ -405,6 +428,56 @@
405
428
  $(window).on("resize", function () {
406
429
  layer.full(followup_index);
407
430
  });
431
+ } else if (obj.event == 'advise') {
432
+ layer.open({
433
+ title: '添加团队建议',
434
+ closeBtn: 0,
435
+ type: 1,
436
+ area: '400px;',
437
+ id: 'LAY_layuipro',
438
+ content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea">' + data.advise + '</textarea></div>' ,
439
+ btn: ['保存', '取消'],
440
+ btn1: function(index, l) {
441
+ if (l.find("textarea").val().trim() == '') {
442
+ layer.msg('内容不能为空')
443
+ return false;
444
+ } else {
445
+ request.authPut("/missions/activities/" + data.id + "/update_advise", {content: l.find("textarea").val().trim()}, function(res) {
446
+ if (res.success == false) {
447
+ layer.alert(res.msg);
448
+ } else {
449
+ layer.close(index);
450
+ table.reload('activity_followp_table');
451
+ }
452
+ })
453
+ }
454
+
455
+ return false
456
+ },
457
+ btn2: function(index, l) {
458
+ layer.close(index)
459
+ }
460
+ });
461
+ } else if (obj.event == 'file') {
462
+ activity_id = data.id
463
+ var content = miniPage.getHrefContent('/missions/activities/' + data.id + "/files");
464
+ var openWH = miniPage.getOpenWidthHeight();
465
+ followup_index = layer.open({
466
+ title: '附件管理',
467
+ type: 1,
468
+ shade: 0.2,
469
+ maxmin: true,
470
+ shadeClose: true,
471
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
472
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
473
+ content: content,
474
+ success: function (layero, index) {
475
+ form.render('select');
476
+ }
477
+ });
478
+ $(window).on("resize", function () {
479
+ layer.full(followup_index);
480
+ });
408
481
  }
409
482
  });
410
483