educode_sales 0.7.8 → 0.8.2

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/application_controller.rb +14 -0
  3. data/app/controllers/educode_sales/assessments_controller.rb +126 -259
  4. data/app/controllers/educode_sales/businesses_controller.rb +66 -2
  5. data/app/controllers/educode_sales/customers_controller.rb +0 -3
  6. data/app/helpers/educode_sales/application_helper.rb +2 -2
  7. data/app/models/educode_sales/business.rb +8 -0
  8. data/app/models/educode_sales/business_relation_ship.rb +6 -0
  9. data/app/models/educode_sales/customer_follow.rb +1 -0
  10. data/app/models/educode_sales/filter.rb +15 -0
  11. data/app/models/educode_sales/follow_up.rb +2 -0
  12. data/app/models/educode_sales/role_area.rb +1 -1
  13. data/app/views/educode_sales/assessments/_setup.html.erb +92 -22
  14. data/app/views/educode_sales/assessments/edit.html.erb +3 -2
  15. data/app/views/educode_sales/assessments/index.html.erb +1 -2
  16. data/app/views/educode_sales/assessments/index.json.jbuilder +1 -1
  17. data/app/views/educode_sales/assessments/new.html.erb +2 -1
  18. data/app/views/educode_sales/assessments/progress.json.jbuilder +2 -198
  19. data/app/views/educode_sales/businesses/following_businesses.jbuilder +44 -0
  20. data/app/views/educode_sales/businesses/index.html.erb +189 -33
  21. data/app/views/educode_sales/businesses/index.json.jbuilder +1 -0
  22. data/app/views/educode_sales/businesses/show_follow.html.erb +1 -3
  23. data/app/views/educode_sales/money_plans/index.json.jbuilder +1 -1
  24. data/app/views/layouts/educode_sales/application.html.erb +1 -1
  25. data/config/routes.rb +4 -0
  26. data/db/migrate/20220420071909_create_educode_sales_business_relation_ships.rb +10 -0
  27. data/db/migrate/20220507020149_create_filter.rb +10 -0
  28. data/db/migrate/20220507091959_change_educode_sales_filter_column_length.rb +5 -0
  29. data/db/migrate/20220509073936_update_educode_sales_filters_filter_data.rb +9 -0
  30. data/lib/educode_sales/version.rb +1 -1
  31. metadata +9 -2
@@ -2,6 +2,7 @@ require_dependency "educode_sales/application_controller"
2
2
 
3
3
  module EducodeSales
4
4
  class BusinessesController < ApplicationController
5
+ skip_before_action :verify_authenticity_token,only: [:following]
5
6
 
6
7
 
7
8
  def index
@@ -20,13 +21,16 @@ module EducodeSales
20
21
  end
21
22
 
22
23
  gon.type = params[:clazz_id].present? ? [{ value: params[:clazz_id], name: Common.find(params[:clazz_id]).name }] : []
23
- gon.business_step = Common.where(clazz: 'business_step').map do |d|
24
+ gon.business_step = Common.where(clazz: 'business_step').order("position").map do |d|
24
25
  {value: d.id, name: d.name}
25
26
  end
27
+
26
28
  if can?(:create, EducodeSales::SalePlan)
27
29
  gon.menus << { title: '添加周计划', event: 'week' }
28
30
  gon.menus << { title: '添加月计划', event: 'month' }
29
31
  end
32
+
33
+ gon.menus << { title: '关注', event: 'following' }
30
34
  gon.menus << { title: '跟进时间线', event: 'time_line' }
31
35
  if can?(:show_file, EducodeSales::Business)
32
36
  gon.menus << { title: '附件管理', event: 'file' }
@@ -42,6 +46,12 @@ module EducodeSales
42
46
  gon.export_menus << { title: '导出到Excel文件', event: 'export_excel' }
43
47
  end
44
48
  gon.export_menus << { title: '导出记录', event: 'export_records' }
49
+ filter = Filter.find_or_create_by(staff_id: @current_admin.id, clazz: "businesses_list")
50
+ if filter.extras.present?
51
+ gon.filter = filter.extras
52
+ else
53
+ gon.filter = {}
54
+ end
45
55
  end
46
56
  format.json do
47
57
  if @current_admin.is_admin?
@@ -222,11 +232,13 @@ module EducodeSales
222
232
  last_follow.created_at as latest_time,
223
233
  last_follow.actual_amount,
224
234
  (last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
225
- last_follow.total_amount").joins("
235
+ last_follow.total_amount
236
+ ").joins("
226
237
  LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
227
238
  ").page(params[:page]).per(params[:limit])
228
239
 
229
240
  end
241
+
230
242
  end
231
243
  end
232
244
 
@@ -581,6 +593,54 @@ module EducodeSales
581
593
  end
582
594
  end
583
595
  end
596
+ #关注接口
597
+ def following
598
+ if brs=follow_business(@current_admin.user_id,params[:business_id])
599
+ if brs.delete
600
+ render json: {code:200,msg:"已取消关注"}
601
+ else
602
+ render json: {code:300,msg:"操作失败"}
603
+ end
604
+ else
605
+ brs=BusinessRelationShip.new(user_id:@current_admin.user_id, business_id:params[:business_id])
606
+ if brs.save
607
+ render json: {code:200,msg:"关注成功"}
608
+ else
609
+ render json: {code:300,msg:"操作失败"}
610
+ end
611
+ end
612
+ end
613
+
614
+ #我已关注的商机
615
+ def following_businesses
616
+ p=[]
617
+ BusinessRelationShip.select(:business_id).where(user_id:@current_admin.user_id).to_a.each { |d| p << d.business_id}
618
+ @businesses=Business.where(id:p)
619
+ @businesses=@businesses.select("
620
+ educode_sales_businesses.*,
621
+ last_follow.invitation_at,
622
+ last_follow.reception_at,
623
+ last_follow.service_time_long,
624
+ last_follow.service_end_time,
625
+ last_follow.service_start_time,
626
+ last_follow.bidded_date,
627
+ last_follow.signed_date,
628
+ last_follow.created_at as latest_time,
629
+ last_follow.actual_amount,
630
+ (last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
631
+ last_follow.total_amount").joins("
632
+ LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
633
+ ").page(params[:page]).per(params[:limit])
634
+ end
635
+
636
+ def followed
637
+ if brs=follow_business(@current_admin.user_id,params[:business_id])
638
+ render json: {msg:'确定取消关注?'}
639
+ else
640
+ render json: {msg:'确定关注?'}
641
+ end
642
+ end
643
+
584
644
 
585
645
  private
586
646
 
@@ -595,5 +655,9 @@ module EducodeSales
595
655
  def edu_setting name
596
656
  EduSetting.get(name)
597
657
  end
658
+
659
+ def follow_business(user_id,business_id)
660
+ BusinessRelationShip.where(user_id:user_id,business_id:business_id).first
661
+ end
598
662
  end
599
663
  end
@@ -68,9 +68,6 @@ module EducodeSales
68
68
  @customers = @customers.where("schools.province = ?", "#{params[:q][:area]}")
69
69
  end
70
70
  if params[:q].present? && params[:q][:staff_id].present?
71
- p "--------------------------------------------------------------------------------------"
72
- p params[:q][:staff_id]
73
- p "--------------------------------------------------------------------------------------"
74
71
  school_ids = EducodeSales::CustomerExtension.where(customer_staff_id: params[:q][:staff_id]).pluck(:school_id)
75
72
  @customers = @customers.where(id: school_ids)
76
73
  end
@@ -83,7 +83,7 @@ module EducodeSales
83
83
  #新增商机数 得分规则
84
84
  def add_businesses_score(staff_id,start_time,end_time)
85
85
  if @current_admin.is_admin?
86
- @businesses = Business
86
+ @businesses = Business.all
87
87
  else
88
88
  level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
89
89
  case level
@@ -96,7 +96,7 @@ module EducodeSales
96
96
  business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
97
97
  @businesses = Business.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_businesses.staff_id = #{@current_admin.id} OR educode_sales_businesses.id in (?)", school_ids, business_ids)
98
98
  else
99
- @businesses = Business
99
+ @businesses = Business.all
100
100
  end
101
101
  end
102
102
 
@@ -8,6 +8,10 @@ module EducodeSales
8
8
  has_many :sale_plans
9
9
  has_many :follow_ups
10
10
 
11
+ #关联关注
12
+ has_many :users,:class_name => 'EducodeSales::BusinessRelationShip',foreign_key: 'business_id',:dependent => :destroy
13
+
14
+
11
15
  #每次查询时 默认的查询条件
12
16
  default_scope -> {where(deleted_at: nil)}
13
17
 
@@ -20,5 +24,9 @@ module EducodeSales
20
24
  EducodeSales::Recycle.create(source: self, deleter_id: user_id)
21
25
  end
22
26
 
27
+
28
+
29
+
30
+
23
31
  end
24
32
  end
@@ -0,0 +1,6 @@
1
+ module EducodeSales
2
+ class BusinessRelationShip < ApplicationRecord
3
+ belongs_to :user
4
+ belongs_to :follow_business, :class_name => 'EducodeSales::Business',foreign_key: "business_id"
5
+ end
6
+ end
@@ -1,5 +1,6 @@
1
1
  module EducodeSales
2
2
  class CustomerFollow < ApplicationRecord
3
3
  belongs_to :staff
4
+ belongs_to :school
4
5
  end
5
6
  end
@@ -0,0 +1,15 @@
1
+
2
+
3
+ module EducodeSales
4
+ class Filter< ApplicationRecord
5
+ # belongs_to :educode_sales_staff, :class_name => 'EducodeSales::Staff'
6
+ belongs_to :staff
7
+
8
+ serialize :extras, Hash
9
+
10
+
11
+
12
+
13
+ end
14
+ end
15
+
@@ -10,6 +10,8 @@ module EducodeSales
10
10
  belongs_to :staff
11
11
  belongs_to :stage, class_name: 'Common'
12
12
  belongs_to :clazz, class_name: 'Common'
13
+
14
+
13
15
  default_scope -> {where(deleted_at: nil)}
14
16
 
15
17
 
@@ -2,7 +2,7 @@ module EducodeSales
2
2
  class RoleArea < ApplicationRecord
3
3
  belongs_to :role
4
4
 
5
- enum level: ['自己', '区域', '全部']
5
+ enum level: ['自己', '区域', '全部'] # 0 1 2
6
6
  enum clazz: {
7
7
  '商机管理': 'Business',
8
8
  '销售计划': 'SalePlan',
@@ -93,96 +93,115 @@
93
93
  title: '序号',
94
94
  width: 100,
95
95
  sort: true,
96
- fixed: 'left'
96
+ fixed: 'left',
97
97
  },
98
98
  {
99
99
  field: 'username',
100
100
  title: '考核人员',
101
101
  width: 100,
102
- fixed: 'left'
102
+ fixed: 'left',
103
+ hide: gon.filter["username"],
103
104
  },
104
105
  {
105
106
  field: 'annual',
106
107
  title: '全年',
107
108
  width: 100,
109
+ hide: gon.filter["annual"],
108
110
  },
109
111
  {
110
112
  field: 'first_quarter',
111
113
  title: '第1季度',
112
114
  width: 100,
115
+ hide: gon.filter["first_quarter"],
113
116
  },
114
117
  {
115
118
  field: 'january',
116
119
  title: '1月',
120
+ width: 70,
121
+ hide: gon.filter.january,
117
122
  },
118
123
  {
119
124
  field: 'february',
120
125
  title: '2月',
121
126
  width: 70,
127
+ hide: gon.filter.february,
122
128
  },
123
129
  {
124
130
  field: 'march',
125
131
  title: '3月',
126
132
  width: 70,
133
+ hide: gon.filter.march,
127
134
  },
128
135
  {
129
136
  field: 'second_quarter',
130
137
  title: '第2季度',
131
138
  width: 100,
139
+ hide: gon.filter.second_quarter,
132
140
  },
133
141
  {
134
142
  field: 'april',
135
143
  title: '4月',
144
+ hide: gon.filter.april,
136
145
  },
137
146
  {
138
147
  field: 'may',
139
148
  title: '5月',
140
149
  width: 70,
150
+ hide: gon.filter.may,
141
151
  },
142
152
  {
143
153
  field: 'june',
144
154
  title: '6月',
145
155
  width: 70,
156
+ hide: gon.filter.june,
146
157
  },
147
158
  {
148
159
  field: 'third_quarter',
149
160
  title: '第3季度',
150
161
  width: 100,
162
+ hide: gon.filter.third_quarter,
151
163
  },
152
164
  {
153
165
  field: 'july',
154
166
  title: '7月',
155
167
  width: 70,
168
+ hide: gon.filter.july,
156
169
  },
157
170
  {
158
171
  field: 'august',
159
172
  title: '8月',
160
173
  width: 70,
174
+ hide: gon.filter.august,
161
175
  },
162
176
  {
163
177
  field: 'september',
164
178
  title: '9月',
165
179
  width: 70,
180
+ hide: gon.filter.september,
166
181
  },
167
182
  {
168
183
  field: 'fourth_quarter',
169
184
  title: '第4季度',
170
185
  width: 100,
186
+ hide: gon.filter.fourth_quarter,
171
187
  },
172
188
  {
173
189
  field: 'october',
174
190
  title: '10月',
175
191
  width: 70,
192
+ hide: gon.filter.october,
176
193
  },
177
194
  {
178
195
  field: 'november',
179
196
  title: '11月',
180
197
  width: 70,
198
+ hide: gon.filter.november,
181
199
  },
182
200
  {
183
201
  field: 'december',
184
202
  title: '12月',
185
203
  width: 70,
204
+ hide: gon.filter.december,
186
205
  },
187
206
  {
188
207
  field: 'option',
@@ -237,7 +256,9 @@
237
256
  })
238
257
 
239
258
 
259
+
240
260
  table.on('tool(assessments)', function (obj) {
261
+
241
262
  var data = obj.data;
242
263
  console.log(obj)
243
264
  console.log(data)
@@ -275,8 +296,55 @@
275
296
  });
276
297
 
277
298
  // * toolbar事件监听
278
- table.on('toolbar(assessments)', function (obj) {
279
- if (obj.event === 'add') { // 监听添加操作
299
+ table.on('toolbar(assessments)', function (obj) {
300
+ // switch (obj.event) {
301
+ // case 'LAYTABLE_COLS':
302
+ // layui.form.on('checkbox(LAY_TABLE_TOOL_COLS)', function(obj) {
303
+ // var value = obj.elem.checked
304
+ // var name = obj.elem.attributes[1].value
305
+ // $.ajax({
306
+ // url: "filter",
307
+ // type: "GET",
308
+ // data: "type=assessments_setup&name=" + name + "&hidden=" + value,
309
+ // success: function (data){
310
+ // let hide_type = "[data-field='"+name+"']"
311
+ // if (data.hidden === '1'){
312
+ // $(hide_type).addClass('layui-hide');
313
+ // }else{
314
+ // $(hide_type).removeClass('layui-hide');
315
+ // }
316
+ // },
317
+ // dataType: 'Json'
318
+ // })
319
+ // });
320
+ // break;
321
+ //
322
+ // }
323
+
324
+ if (obj.event === 'LAYTABLE_COLS'){
325
+ layui.form.on('checkbox(LAY_TABLE_TOOL_COLS)', function(obj) {
326
+ var value = obj.elem.checked
327
+ var name = obj.elem.attributes[1].value
328
+ $.ajax({
329
+ url: "filter",
330
+ type: "GET",
331
+ data: "type=assessments_setup&name=" + name + "&check=" + value,
332
+ success: function (data){
333
+ let hide_type = "[data-field='"+name+"']"
334
+ if (data.hidden === 1){
335
+ $(hide_type).addClass('layui-hide');
336
+ }else if (data.hidden === 0){
337
+ $(hide_type).removeClass('layui-hide');
338
+ }
339
+ },
340
+ error: function (data){
341
+ layer.msg("操作失败")
342
+ },
343
+ dataType: 'Json'
344
+ })
345
+ });
346
+ }else if( obj.event === 'add'){
347
+ // 监听添加操作
280
348
  var content = miniPage.getHrefContent('/missions/assessments/new');
281
349
  var openWH = miniPage.getOpenWidthHeight();
282
350
  var index = layer.open({
@@ -289,28 +357,30 @@
289
357
  offset: [openWH[2] + 'px', openWH[3] + 'px'],
290
358
  content: content,
291
359
  success: function (layero, index) {
292
- // 重新加载select下拉框(绩效考核标准)
360
+ // 重新加载select下拉框(绩效考核标准)
293
361
  form.render('select')
294
- // clear上次弹层中的多选人员数据 // staffs不清楚为什么要写在单独的script下才有效
295
- staffs.setValue([ ])
362
+ // clear上次弹层中的多选人员数据 // staffs不清楚为什么要写在单独的script下才有效
363
+ staffs.setValue([])
296
364
 
297
365
  }
298
366
  });
299
- // 这样写无法实现 要写在success中记住(open弹出层) 294
300
- // document.getElementById('clear_staffs').onclick = function() {
301
- // console.log("delete")
302
- // staffs.setValue([ {name:'', value:''} ])
303
- // // console.log(staffs)
304
- // // alert(staffs.setValue([ {name:'', value:''} ]))
305
- // // staffs.setValue([ ])
306
- // // alert(staffs.setValue([ ]))
307
- // clear(staffs)
308
- // console.log("ok")
309
- // };
310
- $(window).on("resize", function () {
311
- layer.full(index);
312
- });
313
- }
367
+ // 这样写无法实现 要写在success中记住(open弹出层) 294
368
+ // document.getElementById('clear_staffs').onclick = function() {
369
+ // console.log("delete")
370
+ // staffs.setValue([ {name:'', value:''} ])
371
+ // // console.log(staffs)
372
+ // // alert(staffs.setValue([ {name:'', value:''} ]))
373
+ // // staffs.setValue([ ])
374
+ // // alert(staffs.setValue([ ]))
375
+ // clear(staffs)
376
+ // console.log("ok")
377
+ // };
378
+
379
+ // 目前不清除有什么用
380
+ // $(window).on("resize", function () {
381
+ // layer.full(index);
382
+ // });
383
+ }
314
384
  });
315
385
 
316
386
 
@@ -127,7 +127,7 @@
127
127
  <div class="layui-input-inline">
128
128
  <label class="layui-form-label ">12月(万)</label>
129
129
  <div class="layui-input-block" style="width: 200px;">
130
- <input type="text" name="december" value="<%= @assessment.december %>" autocomplete="off" class="layui-input" lay-verify="number|data" id="month12" onkeyup="sum()">
130
+ <input type="text" name="december" value="<%= @assessment.december %>" autocomplete="off" class="layui-input" lay-verify="data|number" id="month12" onkeyup="sum()">
131
131
  </div>
132
132
  </div>
133
133
  </div>
@@ -179,7 +179,8 @@
179
179
  layer.alert(res.msg)
180
180
  } else {
181
181
  layer.closeAll();
182
- table.reload("assessments")
182
+ table.reload("assessments");
183
+ table.reload("progressTable");
183
184
  }
184
185
  })
185
186
  return false;
@@ -41,9 +41,8 @@
41
41
  $("#setup_table_wraper .layui-table-fixed-r .layui-table-body")[0].style.height="auto";
42
42
  break;
43
43
  }
44
-
45
-
46
44
  });
45
+
47
46
  // 重置按钮写在index下无效!!!
48
47
  // 监控重置
49
48
  form.on('submit(reset_assessments_search)', function (data) {
@@ -23,4 +23,4 @@ json.data do
23
23
  end
24
24
 
25
25
  json.code 0
26
- json.count 0
26
+ json.count @assessments.count
@@ -183,7 +183,7 @@
183
183
  // 单独写在这里配合upen(才实现打开open时清空select中数据)
184
184
  // staffs(select多选)
185
185
  // 因为new是弹出层 所以可以获取index页面的gon.demo数据
186
- var test = gon.demo;
186
+ var test = gon.staff_ids;
187
187
  var staffs = xmSelect.render({
188
188
  el: '#staffs',
189
189
  data: test,
@@ -244,6 +244,7 @@
244
244
  layer.closeAll();
245
245
  layer.alert("添加成功");
246
246
  table.reload("assessments");
247
+ table.reload("progressTable");
247
248
  }
248
249
  });
249
250
  return false;