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.
- checksums.yaml +4 -4
- data/app/assets/images/educode_sales/indexlogo.png +0 -0
- data/app/assets/javascripts/educode_sales/extent/treeTable.js +235 -0
- data/app/controllers/educode_sales/activities_controller.rb +52 -38
- data/app/controllers/educode_sales/businesses_controller.rb +1 -1
- data/app/controllers/educode_sales/customers_controller.rb +107 -0
- data/app/controllers/educode_sales/follow_ups_controller.rb +6 -0
- data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
- data/app/controllers/educode_sales/plans_controller.rb +173 -11
- data/app/controllers/educode_sales/projects_controller.rb +420 -0
- data/app/controllers/educode_sales/recycles_controller.rb +11 -1
- data/app/controllers/educode_sales/roles_controller.rb +4 -1
- data/app/controllers/educode_sales/teachers_controller.rb +42 -17
- data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
- data/app/helpers/educode_sales/application_helper.rb +1 -0
- data/app/models/educode_sales/activity.rb +4 -0
- data/app/models/educode_sales/assessments_setting.rb +2 -2
- data/app/models/educode_sales/business.rb +21 -5
- data/app/models/educode_sales/business_history.rb +8 -0
- data/app/models/educode_sales/business_info.rb +9 -0
- data/app/models/educode_sales/permission.rb +2 -1
- data/app/models/educode_sales/project.rb +53 -0
- data/app/models/educode_sales/role_area.rb +2 -1
- data/app/models/educode_sales/sale_plan.rb +3 -1
- data/app/models/educode_sales/staff.rb +2 -0
- data/app/views/educode_sales/activities/_follows.html.erb +50 -36
- data/app/views/educode_sales/activities/_index.html.erb +82 -9
- data/app/views/educode_sales/activities/edit.html.erb +25 -68
- data/app/views/educode_sales/activities/files.html.erb +157 -0
- data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
- data/app/views/educode_sales/activities/follow_ups.json.jbuilder +1 -1
- data/app/views/educode_sales/activities/index.json.jbuilder +2 -2
- data/app/views/educode_sales/activities/new.html.erb +21 -60
- data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
- data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
- data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/index.html.erb +5 -0
- data/app/views/educode_sales/businesses/index.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/new.html.erb +1 -1
- data/app/views/educode_sales/businesses/time_line.html.erb +9 -5
- data/app/views/educode_sales/customers/edit_major.html.erb +872 -0
- data/app/views/educode_sales/customers/list.html.erb +602 -0
- data/app/views/educode_sales/customers/list.json.jbuilder +33 -0
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +2 -2
- data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
- data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
- data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
- data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
- data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
- data/app/views/educode_sales/plans/index.html.erb +8 -0
- data/app/views/educode_sales/plans/new_year.html.erb +204 -0
- data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
- data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
- data/app/views/educode_sales/projects/detail.html.erb +269 -0
- data/app/views/educode_sales/projects/edit.html.erb +246 -0
- data/app/views/educode_sales/projects/history.html.erb +41 -0
- data/app/views/educode_sales/projects/index.html.erb +688 -0
- data/app/views/educode_sales/projects/index.json.jbuilder +69 -0
- data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
- data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
- data/app/views/educode_sales/recycles/index.html.erb +26 -22
- data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
- data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
- data/app/views/educode_sales/teachers/_index.html.erb +17 -1
- data/app/views/educode_sales/teachers/index.json.jbuilder +2 -0
- data/app/views/layouts/educode_sales/application.html.erb +25 -0
- data/config/routes.rb +31 -0
- data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +6 -0
- data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
- data/db/migrate/20230411134203_add_realname_to_teacher.rb +5 -0
- data/db/migrate/20230412083510_add_p_staff_id_to_businesses.rb +20 -0
- data/db/migrate/20230412092000_create_business_histories.rb +10 -0
- data/db/migrate/20230413015619_add_permissions_to_projects.rb +11 -0
- data/db/migrate/20230413031029_add_pre_time_to_businesses.rb +5 -0
- data/lib/educode_sales/version.rb +1 -1
- 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.
|
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.
|
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
|
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
|
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(
|
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
|
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
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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
|
-
|
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
|
-
|
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 => '
|
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
|
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
|
22
|
+
# 关联关注
|
23
|
+
has_many :users, :class_name => 'EducodeSales::BusinessRelationShip', foreign_key: 'business_id', :dependent => :destroy
|
19
24
|
|
20
|
-
|
21
|
-
default_scope
|
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,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
|
@@ -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"
|
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(
|
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
|
-
|
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
|
-
|
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'
|
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
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
108
|
+
field: 'advise',
|
109
|
+
width: 300,
|
110
|
+
title: '团队建议',
|
111
|
+
templet:'<div><span title="{{d.advise}}">{{d.advise}}</span></div>'
|
128
112
|
},
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
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
|
-
|
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"
|
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(@
|
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"
|
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:
|
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
|
|