educode_sales 0.3.6 → 0.4.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 (71) 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/xm-select.js +8 -0
  4. data/app/assets/stylesheets/educode_sales/public.css +2 -1
  5. data/app/controllers/educode_sales/businesses_controller.rb +33 -11
  6. data/app/controllers/educode_sales/follow_ups_controller.rb +10 -1
  7. data/app/controllers/educode_sales/home_controller.rb +10 -1
  8. data/app/controllers/educode_sales/import_teachers_controller.rb +68 -0
  9. data/app/controllers/educode_sales/key_person_controller.rb +1 -1
  10. data/app/controllers/educode_sales/places_controller.rb +1 -0
  11. data/app/controllers/educode_sales/plans_controller.rb +1 -1
  12. data/app/controllers/educode_sales/sale_trends_controller.rb +8 -6
  13. data/app/controllers/educode_sales/sales_controller.rb +1 -0
  14. data/app/controllers/educode_sales/teachers_controller.rb +35 -11
  15. data/app/models/educode_sales/assign_follow_up.rb +6 -0
  16. data/app/models/educode_sales/follow_up.rb +1 -0
  17. data/app/models/educode_sales/key_person.rb +1 -1
  18. data/app/models/educode_sales/teacher_follow.rb +1 -0
  19. data/app/views/educode_sales/activities/edit.html.erb +0 -1
  20. data/app/views/educode_sales/activities/index.html.erb +32 -11
  21. data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
  22. data/app/views/educode_sales/businesses/edit.html.erb +15 -4
  23. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +52 -4
  24. data/app/views/educode_sales/businesses/index.html.erb +160 -14
  25. data/app/views/educode_sales/businesses/index.json.jbuilder +4 -0
  26. data/app/views/educode_sales/businesses/new.html.erb +11 -1
  27. data/app/views/educode_sales/businesses/new_follow_record.html.erb +53 -15
  28. data/app/views/educode_sales/businesses/show_follow.html.erb +12 -5
  29. data/app/views/educode_sales/businesses/show_follow_record.html.erb +6 -0
  30. data/app/views/educode_sales/commons/edit.html.erb +0 -1
  31. data/app/views/educode_sales/commons/index.html.erb +1 -0
  32. data/app/views/educode_sales/follow_ups/teachers.json.jbuilder +3 -2
  33. data/app/views/educode_sales/home/sales_staff.json.jbuilder +9 -0
  34. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +2 -2
  35. data/app/views/educode_sales/operation_plans/_monthly.html.erb +3 -2
  36. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +2 -1
  37. data/app/views/educode_sales/operation_plans/_weekly.html.erb +4 -2
  38. data/app/views/educode_sales/operation_plans/edit_week.html.erb +1 -0
  39. data/app/views/educode_sales/operation_plans/new_month.html.erb +2 -0
  40. data/app/views/educode_sales/operation_reports/edit.html.erb +27 -1
  41. data/app/views/educode_sales/places/edit.html.erb +0 -2
  42. data/app/views/educode_sales/places/index.html.erb +1 -0
  43. data/app/views/educode_sales/places/index.json.jbuilder +3 -3
  44. data/app/views/educode_sales/places/new.html.erb +0 -1
  45. data/app/views/educode_sales/plans/_monthPlan.html.erb +2 -2
  46. data/app/views/educode_sales/plans/_monthly.html.erb +2 -1
  47. data/app/views/educode_sales/plans/_weekPlan.html.erb +2 -1
  48. data/app/views/educode_sales/plans/_weekly.html.erb +3 -1
  49. data/app/views/educode_sales/plans/new_month.html.erb +3 -2
  50. data/app/views/educode_sales/roles/edit.html.erb +0 -1
  51. data/app/views/educode_sales/roles/index.html.erb +1 -1
  52. data/app/views/educode_sales/sale_reports/edit.html.erb +26 -0
  53. data/app/views/educode_sales/sales/index.html.erb +1 -0
  54. data/app/views/educode_sales/sales/index.json.jbuilder +2 -2
  55. data/app/views/educode_sales/sales/operations.html.erb +1 -0
  56. data/app/views/educode_sales/sales/trends.html.erb +0 -4
  57. data/app/views/educode_sales/staffs/index.html.erb +1 -0
  58. data/app/views/educode_sales/teachers/add_courses.html.erb +0 -1
  59. data/app/views/educode_sales/teachers/add_keys.html.erb +53 -8
  60. data/app/views/educode_sales/teachers/edit.html.erb +4 -2
  61. data/app/views/educode_sales/teachers/import.html.erb +41 -0
  62. data/app/views/educode_sales/teachers/index.html.erb +140 -27
  63. data/app/views/educode_sales/teachers/index.json.jbuilder +2 -1
  64. data/app/views/educode_sales/teachers/new.html.erb +1 -1
  65. data/app/views/layouts/educode_sales/login.html.erb +1 -1
  66. data/config/routes.rb +5 -0
  67. data/db/migrate/20211009031109_add_tel_key_peoples.rb +5 -0
  68. data/db/migrate/20211009063423_add_source_businesses.rb +5 -0
  69. data/db/migrate/20211013060712_create_educode_sales_assign_follow_ups.rb +10 -0
  70. data/lib/educode_sales/version.rb +1 -1
  71. metadata +10 -2
@@ -21,6 +21,18 @@ module EducodeSales
21
21
  def index
22
22
  respond_to do |format|
23
23
  format.html do
24
+ @more = can?(:create, EducodeSales::OperationPlan) || can?(:update, EducodeSales::Teacher) || can?(:destroy, EducodeSales::Teacher)
25
+ gon.menus = []
26
+ if can?(:create, EducodeSales::OperationPlan)
27
+ gon.menus << { title: '添加周计划', event: 'week' }
28
+ gon.menus << { title: '添加月计划', event: 'month' }
29
+ end
30
+ if can?(:update, EducodeSales::Teacher)
31
+ gon.menus << { title: '编辑', event: 'edit' }
32
+ end
33
+ if can?(:destroy, EducodeSales::Teacher)
34
+ gon.menus << { title: '删除', event: 'delete' }
35
+ end
24
36
  end
25
37
  format.json do
26
38
  if @current_admin.is_admin?
@@ -43,13 +55,16 @@ module EducodeSales
43
55
  @teachers = @teachers.where("educode_sales_teachers.name like ?", "%#{params[:q][:name]}%")
44
56
  end
45
57
  if params[:q].present? && params[:q][:professional_title].present?
46
- @teachers = @teachers.where("educode_sales_teachers.professional_title like ?", "%#{params[:q][:professional_title]}%")
58
+ @teachers = @teachers.where("educode_sales_teachers.professional_title = ?", "#{params[:q][:professional_title]}")
47
59
  end
48
60
  if params[:q].present? && params[:q][:regist_at].present?
49
61
  @teachers = @teachers.where("educode_sales_teachers.regist_at like ?", "%#{params[:q][:regist_at]}%")
50
62
  end
51
63
  if params[:q].present? && params[:q][:attitude].present?
52
- @teachers = @teachers.where("educode_sales_teachers.attitude_id = ?", "#{params[:q][:attitude]}")
64
+ # @teachers = @teachers.where("educode_sales_teachers.attitude_id = ?", "#{params[:q][:attitude]}")
65
+ @teachers = @teachers.joins("
66
+ JOIN educode_sales_teacher_follows ON educode_sales_teachers.follow_up_id = educode_sales_teacher_follows.id
67
+ ").where("educode_sales_teacher_follows.attitude_id = ?", params[:q][:attitude])
53
68
  end
54
69
  if params[:q].present? && params[:q][:teacher_source].present?
55
70
  @teachers = @teachers.where("educode_sales_teachers.source_id = ?", "#{params[:q][:teacher_source]}")
@@ -70,16 +85,18 @@ module EducodeSales
70
85
  end
71
86
  if params[:q].present? && params[:q][:date].present?
72
87
  date = params[:q][:date].split(" - ")
73
- @teachers = @teachers.where("created_at > ? AND created_at < ?", date[0], date[1])
88
+ @teachers = @teachers.where("educode_sales_teachers.created_at > ? AND educode_sales_teachers.created_at < ?", date[0], date[1])
74
89
  end
75
90
 
76
- @teachers = @teachers.order("created_at desc").page(params[:page]).per(params[:limit])
91
+ @teachers = @teachers.order("educode_sales_teachers.created_at desc").page(params[:page]).per(params[:limit])
77
92
 
78
93
  end
79
94
  end
80
95
  end
81
96
 
82
-
97
+ def import
98
+ render layout: false
99
+ end
83
100
 
84
101
  def new
85
102
  render layout: false
@@ -97,17 +114,24 @@ module EducodeSales
97
114
  teacher.regist_at = Time.now
98
115
  end
99
116
 
100
- if params[:activity_id].present? && params[:user_id].present?
101
- @teacher_id = EducodeSales::Teacher.find_by(name: params[:name]).id
117
+ unless params[:activity_id].present?
118
+ return render json: {msg: '该教师已存在', success: false } if EducodeSales::Teacher.find_by(department_id: params[:department_id],name: params[:name])
119
+ end
102
120
 
121
+ if params[:activity_id].present?
122
+ if params[:user_id].present?
103
123
  # 把老师添加到活动列表,提取判断下老师列表是否存在
104
- find_teacher = Teacher.find_by(user_id: params[:user_id])
105
- if find_teacher
106
- teacher = find_teacher
124
+ find_teacher = Teacher.find_by(user_id: params[:user_id])
125
+ if find_teacher
126
+ teacher = find_teacher
127
+ end
128
+ else
129
+ _teacher = EducodeSales::Teacher.find_by(department_id: params[:department_id],name: params[:name])
130
+ teacher = _teacher if _teacher.present?
107
131
  end
132
+ return render json: {msg: '该教师已在活动中', success: false } if teacher && teacher.activity_teachers.find_by(activity_id: params[:activity_id]).present?
108
133
  end
109
134
  if params[:activity_id].present?
110
- return render json: {msg: '该教师已在活动中', success: false } if teacher.activity_teachers.find_by(activity_id: params[:activity_id]).present?
111
135
  teacher.activity_teachers.build(activity_id: params[:activity_id])
112
136
  end
113
137
 
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class AssignFollowUp < ApplicationRecord
3
+ belongs_to :staff
4
+ belongs_to :follow_up
5
+ end
6
+ end
@@ -5,6 +5,7 @@ module EducodeSales
5
5
  has_many :money_plans, dependent: :destroy
6
6
  has_many :key_person
7
7
  has_many :teachers, through: :key_person
8
+ has_many :assign_follow_ups, dependent: :destroy
8
9
  belongs_to :staff
9
10
  belongs_to :stage, class_name: 'Common'
10
11
  belongs_to :clazz, class_name: 'Common'
@@ -1,7 +1,7 @@
1
1
  module EducodeSales
2
2
  class KeyPerson < ApplicationRecord
3
3
  belongs_to :teacher
4
- belongs_to :attitude, class_name: 'Common'
4
+ belongs_to :attitude, class_name: 'Common', optional: true
5
5
  belongs_to :follow_up, counter_cache: true
6
6
 
7
7
  enum sex: ['男', '女']
@@ -2,5 +2,6 @@ module EducodeSales
2
2
  class TeacherFollow < ApplicationRecord
3
3
  belongs_to :teacher, counter_cache: true
4
4
  belongs_to :staff
5
+ belongs_to :attitude, class_name: 'Common'
5
6
  end
6
7
  end
@@ -67,7 +67,6 @@
67
67
 
68
68
  //监听提交
69
69
  form.on('submit(data-reset-btn)', function (data) {
70
- console.log(data.field);
71
70
  request.authPut("missions/activities/" + <%= @activity.id %>, data.field, function (res) {
72
71
  if (res.success === false) {
73
72
  layer.alert(res.msg)
@@ -2,12 +2,14 @@
2
2
  <div class="layui-btn-container">
3
3
  <span class="table-label">活动列表</span>
4
4
  <% if can? :create, EducodeSales::Activity %>
5
- <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add"> 添加活动</button>
5
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import">导入数据</button>
6
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add"> 添加活动</button>
6
7
  <% end %>
7
8
  </div>
8
9
  </script>
9
-
10
+ <div class="min-height-table">
10
11
  <table class="layui-hide" id="activities_table" lay-filter="activities_table"></table>
12
+ </div>
11
13
 
12
14
  <script type="text/html" id="currentTableBar">
13
15
  <% if can? :update, EducodeSales::Activity %>
@@ -48,40 +50,42 @@
48
50
  {
49
51
  field: 'name',
50
52
  title: '活动名称',
51
- width: 300,
53
+ width: 400,
52
54
  templet: '#teachers'
53
55
  },
54
56
  {
55
57
  field: 'start_at',
56
- width: 200,
58
+ width: 120,
57
59
  title: '时间',
58
60
  sort: true,
59
61
  },
60
62
  {
61
63
  field: 'days',
62
64
  title: '天数',
63
- width: 200
65
+ width: 100
64
66
  },
65
67
  {
66
68
  field: 'teachers_count',
67
69
  title: '教师数',
68
- width: 200,
70
+ width: 100,
69
71
  templet: '#teachers_count'
70
72
  },
71
73
  {
72
74
  field: 'students_count',
73
75
  title: '学生数',
74
- width: 200
76
+ width: 100
75
77
  },
76
78
  {
77
- title: '操作',
78
- width: 120,
79
- toolbar: '#currentTableBar',
80
- align: "center"
79
+ title: '操作',
80
+ width: 120,
81
+ fixed: 'right',
82
+ toolbar: '#currentTableBar',
83
+ align: "center"
81
84
  }
82
85
  ]
83
86
  ],
84
87
  limit: 20,
88
+ limits: [10,15,20,30,40,50,60,70,80,90],
85
89
  page: true
86
90
  });
87
91
 
@@ -117,6 +121,23 @@
117
121
  layer.full(index);
118
122
  });
119
123
  }
124
+ else if (obj.event === 'import') { //
125
+ var content = miniPage.getHrefContent('/missions/teachers/import');
126
+ var openWH = miniPage.getOpenWidthHeight();
127
+ import_index = layer.open({
128
+ title: '导入数据',
129
+ type: 1,
130
+ shade: 0.2,
131
+ shadeClose: true,
132
+ area: ['200px', '100px'],
133
+ offset: 'auto',
134
+ closeBtn: 0,
135
+ content: content,
136
+ });
137
+ $(window).on("resize", function () {
138
+ layer.full(index);
139
+ });
140
+ }
120
141
  });
121
142
 
122
143
  table.on('tool(activities_table)', function (obj) {
@@ -15,7 +15,7 @@
15
15
  {{# if (d.login) { }}
16
16
  <a href="<%= base_url%>/users/{{d.login}}" class="layui-table-link" target="_blank">{{ d.name }}</a>
17
17
  {{# } else {}}
18
- <a href="<%= base_url%>/users/{{d.login}}" class="">{{ d.name }}</a>
18
+ <a href="javascript:;" class="">{{ d.name }}</a>
19
19
  {{# }}}
20
20
  </script>
21
21
  <script type="text/html" id="courses">
@@ -2,15 +2,23 @@
2
2
  <div class="layui-form layuimini-form">
3
3
  <div class="layui-form-item" style="padding: 25px">
4
4
  <div class="layui-inline">
5
- <label class="layui-form-label required">名称</label>
5
+ <label class="layui-form-label required">商机名称</label>
6
6
  <div class="layui-input-block">
7
- <input type="text" name="name" autocomplete="off" lay-verify="required" class="layui-input" value="<%= @business.name %>">
7
+ <input type="text" name="name" autocomplete="off" lay-verify="required" class="layui-input" value="<%= @business.name %>" style="width: 300px;">
8
8
  </div>
9
9
  </div>
10
10
  <div class="layui-inline">
11
11
  <label class="layui-form-label required">单位部门</label>
12
12
  <div class="layui-input-block" id="department" style="width: 300px;"></div>
13
13
  </div>
14
+ <br>
15
+ <div class="layui-inline" style="padding-top: 20px">
16
+ <label class="layui-form-label ">商机来源</label>
17
+ <input id="source" type="text" name="source" autocomplete="off" class="layui-input" value="<%=@business.source %>" style="width: 300px;" placeholder="请输入商机来源">
18
+ </div>
19
+ <div class="layui-inline" style="padding-top: 20px">
20
+ <p style="padding-left: 40px">请填写提供本商机的人名(如‘张明’);如果为非头歌用户,请增加单位信息(如‘张明,华为公司’)</p>
21
+ </div>
14
22
  <div class="layui-form-item m-t-20">
15
23
  <div class="layui-input-block">
16
24
  <button class="layui-btn layui-btn-normal" lay-submit lay-filter="edit_business">提交</button>
@@ -64,14 +72,17 @@
64
72
  } else {
65
73
  request.authPut("missions/businesses/" + parent.id, {
66
74
  department_id: department.getValue() || department_id,
67
- name: data.field.name
75
+ name: data.field.name,
76
+ source: data.field.source
68
77
  }, function (res) {
69
78
  if (res.success == false) {
70
79
  layer.alert(res.msg)
71
80
  } else {
72
81
  layer.close(parent.sindex);
73
82
  parent.layer.close(parent.layer.getFrameIndex(window.name))
74
- parent.table.reload('businesses_table')
83
+ parent.table.reload('businesses_table', {done: function() {
84
+ parent.drowpdwonRender()
85
+ }});
75
86
  }
76
87
  })
77
88
  }
@@ -1,3 +1,4 @@
1
+ <%= Gon::Base.render_data %>
1
2
  <h1 class="m-t-20 text-center"><%= @follow_up.business.name %></h1>
2
3
  <div class="layui-form layuimini-form">
3
4
  <div class="layui-form-item" style="padding: 25px">
@@ -16,9 +17,15 @@
16
17
  <br>
17
18
  <div class="layui-inline">
18
19
  <label class="layui-form-label required">项目类型</label>
19
- <div class="layui-input-inline">
20
- <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up.clazz_id), class: 'required' %>
21
- </div>
20
+ <%if EducodeSales::FollowUp.where(business_id: @follow_up.business.id,clazz_id: EducodeSales::Common.find_by(name: "O类").id).count >= 2 %>
21
+ <div class="layui-input-inline">
22
+ <%= select_tag "clazz_id", options_for_select([['O类',EducodeSales::Common.find_by(name: "O类").id]]),:disabled => true, class: 'required' %>
23
+ </div>
24
+ <%else %>
25
+ <div class="layui-input-inline">
26
+ <%= select_tag "clazz_id", options_for_select(@clazz, @follow_up&.clazz_id), class: 'required' %>
27
+ </div>
28
+ <%end %>
22
29
  </div>
23
30
  <div class="layui-inline">
24
31
  <label class="layui-form-label required">项目阶段</label>
@@ -68,6 +75,12 @@
68
75
  </div>
69
76
  <span style="margin-top: 10px; float:left;">%</span>
70
77
  </div>
78
+ <div class="layui-form-item">
79
+ <label class="layui-form-label">指定跟进人</label>
80
+ <div class="layui-input-inline">
81
+ <div id="edit_assign_follow" style="width: 512px;"></div>
82
+ </div>
83
+ </div>
71
84
  <div class="layui-form-item layui-form-text">
72
85
  <label class="layui-form-label required">商机说明</label>
73
86
  <div class="layui-input-block">
@@ -101,10 +114,11 @@
101
114
  </div>
102
115
 
103
116
  <script>
104
- layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate'], function () {
117
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
105
118
  var form = layui.form,
106
119
  layer = layui.layer,
107
120
  table = layui.table,
121
+ xmSelect = layui.xmSelect,
108
122
  laytpl = layui.laytpl,
109
123
  request = layui.request,
110
124
  laydate = layui.laydate,
@@ -118,8 +132,42 @@
118
132
  elem: '#reception_at_edit'
119
133
  });
120
134
 
135
+ var sales_list = xmSelect.render({
136
+ el: '#edit_assign_follow',
137
+ remoteSearch: true,
138
+ clickClose: true,
139
+ delay: 1000,
140
+ paging: true,
141
+ pageRemote: true,
142
+ filterable: true,
143
+ remoteMethod: function (val, cb, show, pageIndex) {
144
+ $.ajax( '/missions/sales_staff', {
145
+ method: 'get',
146
+ data: {
147
+ q: val,
148
+ page: pageIndex
149
+ },
150
+ dataType: 'json',
151
+ success: function (res) {
152
+ var data = res.data;
153
+ if (res.code == 0) {
154
+ cb(res.data, res.count);
155
+ } else {
156
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
157
+ }
158
+ }
159
+ })
160
+ }
161
+ })
162
+ sales_list.setValue(gon.sales)
163
+
121
164
  form.render();
122
165
  form.on('submit(update_follow_up)', function (data) {
166
+ var assign_follow = [];
167
+ sales_list.getValue().forEach(function(d) {
168
+ assign_follow.push(d.value);
169
+ })
170
+ data.field.assign_follow_up = assign_follow;
123
171
  request.authPut("missions/follow_ups/<%= @follow_up.id%>", data.field, function (res) {
124
172
  if (res.success == false) {
125
173
  layer.alert(res.msg)
@@ -50,7 +50,7 @@
50
50
  <input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
51
51
  </div>
52
52
  </div>
53
- <div class="layui-form-item m-t-10">
53
+ <div class="layui-inline">
54
54
  <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
55
55
  </button>
56
56
  <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">搜索
@@ -71,15 +71,18 @@
71
71
  </div>
72
72
  </script>
73
73
  <script type="text/html" id="currentTableBar">
74
- <% if can? :create, EducodeSales::SalePlan %>
75
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="addWeek">添加周计划</a>
76
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="addMonth">添加月计划</a>
74
+ <% if can? :add_follow, EducodeSales::Business %>
75
+ <% if @current_admin.is_admin %>
76
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
77
+ <% else %>
78
+ {{# if ( d.assign_follow_ups.length > 0 && d.assign_follow_ups.indexOf(d.current_staff_id) >=0 || (d.assign_follow_ups.length == 0) || (d.current_staff_id == d.staff_id) ) {}}
79
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
80
+ {{# }}}
77
81
  <% end %>
78
- <% if can? :update, EducodeSales::Business %>
79
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
82
+
80
83
  <% end %>
81
- <% if can? :destroy, EducodeSales::SalePlan %>
82
- <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
84
+ <% if @more %>
85
+ <a class="layui-btn-xs data-count-edit more-btn" data-name={{d.name}} data-id={{d.id}}>更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
83
86
  <% end %>
84
87
  </script>
85
88
  <script type="text/html" id="show_keys">
@@ -91,16 +94,17 @@
91
94
 
92
95
 
93
96
  <script>
94
- layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate'], function () {
97
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown'], function () {
95
98
  var $ = layui.jquery,
96
99
  form = layui.form,
97
100
  request = layui.request,
98
101
  miniPage = layui.miniPage,
102
+ dropdown = layui.dropdown,
99
103
  laydate = layui.laydate;
100
104
 
101
105
  laydate.render({
102
106
  elem: '#date',
103
- range: true
107
+ range: true
104
108
  });
105
109
 
106
110
  table = layui.table;
@@ -183,6 +187,11 @@
183
187
  width: 110,
184
188
  title: '渠道'
185
189
  },
190
+ {
191
+ field: 'source',
192
+ width: 110,
193
+ title: '商机来源'
194
+ },
186
195
  {
187
196
  field: 'last_follow_person',
188
197
  width: 120,
@@ -190,7 +199,7 @@
190
199
  },
191
200
  {
192
201
  title: '操作',
193
- minWidth: 300,
202
+ minWidth: 170,
194
203
  toolbar: '#currentTableBar',
195
204
  align: "center",
196
205
  fixed: 'right'
@@ -199,10 +208,107 @@
199
208
  ],
200
209
 
201
210
  limit: 20,
211
+ limits: [10,15,20,30,40,50,60,70,80,90],
202
212
  page: true,
203
- skin: 'line'
213
+ skin: 'line',
214
+ done: function (res) {
215
+ drowpdwonRender()
216
+ }
217
+
204
218
  });
205
219
 
220
+ var dropmenu = gon.menus;
221
+
222
+ drowpdwonRender = function() {
223
+ dropdown.render({
224
+ elem: '.more-btn',
225
+ data: dropmenu,
226
+ click: function(data, othis){
227
+ var elem = $(this.elem);
228
+ id = elem.data('id');
229
+ switch (data.event) {
230
+ case 'week':
231
+ week(id);
232
+ break;
233
+ case 'month':
234
+ month(id);
235
+ break;
236
+ case 'edit':
237
+ edit(id);
238
+ break;
239
+ case 'delete':
240
+ deleteBusiness(id, elem.data('name'));
241
+ break;
242
+ }
243
+ }
244
+ });
245
+ }
246
+
247
+ function week(id) {
248
+ var content = miniPage.getHrefContent('/missions/plans/new_week?business_id=' + id);
249
+ var openWH = miniPage.getOpenWidthHeight();
250
+
251
+ sindex = layer.open({
252
+ title: '添加周计划',
253
+ type: 1,
254
+ shade: 0.2,
255
+ maxmin: true,
256
+ shadeClose: true,
257
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
258
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
259
+ content: content
260
+ });
261
+ $(window).on("resize", function () {
262
+ layer.full(sindex);
263
+ });
264
+ }
265
+
266
+ function edit(id) {
267
+ var content = miniPage.getHrefContent('/missions/businesses/' + id + '/edit');
268
+ var openWH = miniPage.getOpenWidthHeight();
269
+ sindex = layer.open({
270
+ title: '编辑',
271
+ type: 1,
272
+ shade: 0.2,
273
+ maxmin: true,
274
+ shadeClose: true,
275
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
276
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
277
+ content: content
278
+ });
279
+ $(window).on("resize", function () {
280
+ layer.full(sindex);
281
+ });
282
+ }
283
+
284
+ function month(id) {
285
+ var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + id);
286
+ var openWH = miniPage.getOpenWidthHeight();
287
+ sindex = layer.open({
288
+ title: '添加月计划',
289
+ type: 1,
290
+ shade: 0.2,
291
+ maxmin: true,
292
+ shadeClose: true,
293
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
294
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
295
+ content: content
296
+ });
297
+ $(window).on("resize", function () {
298
+ layer.full(sindex);
299
+ });
300
+ }
301
+
302
+ function deleteBusiness(id, name) {
303
+ layer.confirm('确定删除' + name, function (index) {
304
+ request.delete('missions/businesses/' + id, {}, function (res) {
305
+ layer.close(index);
306
+ table.reload("businesses_table")
307
+ })
308
+ });
309
+ }
310
+
311
+
206
312
  var sort = {}, search = {};
207
313
  table.on('sort(businesses_table)', function (obj) {
208
314
  sort.field = obj.field;
@@ -265,7 +371,27 @@
265
371
  table.on('tool(businesses_table)', function (obj) {
266
372
  var data = obj.data;
267
373
  id = data.id
268
- if (obj.event === 'edit') {
374
+ if (obj.event === 'add_event') { // 监听添加操作
375
+ business_id = data.id
376
+ var content = miniPage.getHrefContent('/missions/businesses/new_follow_record?id=' + data.id);
377
+ var openWH = miniPage.getOpenWidthHeight();
378
+ sale_plan_index = layer.open({
379
+ title: '添加商机跟进记录',
380
+ type: 1,
381
+ shade: 0.2,
382
+ maxmin: true,
383
+ shadeClose: true,
384
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
385
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
386
+ content: content,
387
+ success: function (layero, index) {
388
+ form.render('select');
389
+ }
390
+ });
391
+ $(window).on("resize", function () {
392
+ layer.full(sale_plan_index);
393
+ });
394
+ } else if (obj.event === 'edit') {
269
395
  var content = miniPage.getHrefContent('/missions/businesses/' + id + '/edit');
270
396
  var openWH = miniPage.getOpenWidthHeight();
271
397
  sindex = layer.open({
@@ -289,7 +415,27 @@
289
415
  table.reload("businesses_table")
290
416
  })
291
417
  });
292
- } else if (obj.event === 'addWeek') {
418
+ }else if (obj.event === 'add_follow') { // 监听添加操作
419
+ business_id = parent.business_id
420
+ var content = miniPage.getHrefContent('/missions/businesses/new_follow_record?id=' + parent.id);
421
+ var openWH = miniPage.getOpenWidthHeight();
422
+ sale_plan_index = layer.open({
423
+ title: '添加商机跟进记录',
424
+ type: 1,
425
+ shade: 0.2,
426
+ maxmin: true,
427
+ shadeClose: true,
428
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
429
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
430
+ content: content,
431
+ success: function (layero, index) {
432
+ form.render('select');
433
+ }
434
+ });
435
+ $(window).on("resize", function () {
436
+ layer.full(index);
437
+ });
438
+ }else if (obj.event === 'addWeek') {
293
439
  var content = miniPage.getHrefContent('/missions/plans/new_week?business_id=' + obj.data.id);
294
440
  var openWH = miniPage.getOpenWidthHeight();
295
441
 
@@ -16,6 +16,10 @@ json.data do
16
16
  json.return_money d.return_money
17
17
  json.place d.last_follow_up&.place&.name
18
18
  json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff.user.real_name : ''
19
+ json.source d.source
20
+ json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
21
+ json.current_staff_id @current_admin.id
22
+ json.staff_id d.staff_id
19
23
  end
20
24
  end
21
25
  json.code 0
@@ -10,6 +10,14 @@
10
10
  <label class="layui-form-label required">单位部门</label>
11
11
  <div class="layui-input-block" id="add_department" style="width: 300px;"></div>
12
12
  </div>
13
+ <br>
14
+ <div class="layui-inline" style="padding-top: 20px">
15
+ <label class="layui-form-label ">商机来源</label>
16
+ <input type="text" name="source" autocomplete="off" class="layui-input" style="width: 300px;" placeholder="请输入商机来源">
17
+ </div>
18
+ <div class="layui-inline" style="padding-top: 20px">
19
+ <p style="padding-left: 40px">请填写提供本商机的人名(如‘张明’);如果为非头歌用户,请增加单位信息(如‘张明,华为公司’)</p>
20
+ </div>
13
21
  <div class="layui-form-item m-t-20">
14
22
  <div class="layui-input-block">
15
23
  <button class="layui-btn layui-btn-normal" lay-submit lay-filter="create_business">提交</button>
@@ -62,7 +70,9 @@
62
70
  }
63
71
  request.authPost("missions/businesses", {
64
72
  department_id: add_department.getValue(),
65
- name: data.field.name
73
+ name: data.field.name,
74
+ source: data.field.source
75
+
66
76
  }, function (res) {
67
77
  if (res.success == false) {
68
78
  layer.alert(res.msg)