educode_sales 0.7.7 → 0.8.1

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/application_controller.rb +24 -0
  3. data/app/controllers/educode_sales/assessments_controller.rb +151 -285
  4. data/app/controllers/educode_sales/businesses_controller.rb +68 -2
  5. data/app/controllers/educode_sales/customers_controller.rb +0 -3
  6. data/app/helpers/educode_sales/application_helper.rb +3 -3
  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 +18 -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/_progress.html.erb +7 -4
  14. data/app/views/educode_sales/assessments/_setup.html.erb +115 -13
  15. data/app/views/educode_sales/assessments/edit.html.erb +47 -54
  16. data/app/views/educode_sales/assessments/index.html.erb +1 -2
  17. data/app/views/educode_sales/assessments/index.json.jbuilder +1 -1
  18. data/app/views/educode_sales/assessments/new.html.erb +148 -111
  19. data/app/views/educode_sales/assessments/progress.json.jbuilder +2 -198
  20. data/app/views/educode_sales/businesses/following_businesses.jbuilder +44 -0
  21. data/app/views/educode_sales/businesses/index.html.erb +175 -27
  22. data/app/views/educode_sales/businesses/index.json.jbuilder +1 -0
  23. data/app/views/educode_sales/businesses/new_follow_record.html.erb +1 -1
  24. data/app/views/educode_sales/plans/edit_month.html.erb +1 -1
  25. data/app/views/layouts/educode_sales/application.html.erb +2 -2
  26. data/config/routes.rb +4 -0
  27. data/db/migrate/20220419103842_add_column_timestamps_to_assessments_settings.rb +9 -0
  28. data/db/migrate/20220420071909_create_educode_sales_business_relation_ships.rb +10 -0
  29. data/db/migrate/20220507020149_create_filter.rb +10 -0
  30. data/db/migrate/20220507091959_change_educode_sales_filter_column_length.rb +5 -0
  31. data/lib/educode_sales/version.rb +1 -1
  32. 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
@@ -18,14 +19,18 @@ module EducodeSales
18
19
  gon.business_type = Common.where(clazz: 'business_type').map do |d|
19
20
  {value: d.id, name: d.name}
20
21
  end
22
+
21
23
  gon.type = params[:clazz_id].present? ? [{ value: params[:clazz_id], name: Common.find(params[:clazz_id]).name }] : []
22
- 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|
23
25
  {value: d.id, name: d.name}
24
26
  end
27
+
25
28
  if can?(:create, EducodeSales::SalePlan)
26
29
  gon.menus << { title: '添加周计划', event: 'week' }
27
30
  gon.menus << { title: '添加月计划', event: 'month' }
28
31
  end
32
+
33
+ gon.menus << { title: '关注', event: 'following' }
29
34
  gon.menus << { title: '跟进时间线', event: 'time_line' }
30
35
  if can?(:show_file, EducodeSales::Business)
31
36
  gon.menus << { title: '附件管理', event: 'file' }
@@ -41,6 +46,13 @@ module EducodeSales
41
46
  gon.export_menus << { title: '导出到Excel文件', event: 'export_excel' }
42
47
  end
43
48
  gon.export_menus << { title: '导出记录', event: 'export_records' }
49
+
50
+ filter_businesses_list = Filter.find_or_create_by(staff_id: @current_admin.id, filter_type: "businesses_list")
51
+ gon.business_filter = {}
52
+ filter_businesses_list.filter_data&.split(",")&.each do |d|
53
+ m = d[0..-2]
54
+ gon.business_filter["#{m}"] = d[-1].to_i
55
+ end
44
56
  end
45
57
  format.json do
46
58
  if @current_admin.is_admin?
@@ -221,11 +233,13 @@ module EducodeSales
221
233
  last_follow.created_at as latest_time,
222
234
  last_follow.actual_amount,
223
235
  (last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
224
- last_follow.total_amount").joins("
236
+ last_follow.total_amount
237
+ ").joins("
225
238
  LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
226
239
  ").page(params[:page]).per(params[:limit])
227
240
 
228
241
  end
242
+
229
243
  end
230
244
  end
231
245
 
@@ -580,6 +594,54 @@ module EducodeSales
580
594
  end
581
595
  end
582
596
  end
597
+ #关注接口
598
+ def following
599
+ if brs=follow_business(@current_admin.user_id,params[:business_id])
600
+ if brs.delete
601
+ render json: {code:200,msg:"已取消关注"}
602
+ else
603
+ render json: {code:300,msg:"操作失败"}
604
+ end
605
+ else
606
+ brs=BusinessRelationShip.new(user_id:@current_admin.user_id, business_id:params[:business_id])
607
+ if brs.save
608
+ render json: {code:200,msg:"关注成功"}
609
+ else
610
+ render json: {code:300,msg:"操作失败"}
611
+ end
612
+ end
613
+ end
614
+
615
+ #我已关注的商机
616
+ def following_businesses
617
+ p=[]
618
+ BusinessRelationShip.select(:business_id).where(user_id:@current_admin.user_id).to_a.each { |d| p << d.business_id}
619
+ @businesses=Business.where(id:p)
620
+ @businesses=@businesses.select("
621
+ educode_sales_businesses.*,
622
+ last_follow.invitation_at,
623
+ last_follow.reception_at,
624
+ last_follow.service_time_long,
625
+ last_follow.service_end_time,
626
+ last_follow.service_start_time,
627
+ last_follow.bidded_date,
628
+ last_follow.signed_date,
629
+ last_follow.created_at as latest_time,
630
+ last_follow.actual_amount,
631
+ (last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
632
+ last_follow.total_amount").joins("
633
+ LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
634
+ ").page(params[:page]).per(params[:limit])
635
+ end
636
+
637
+ def followed
638
+ if brs=follow_business(@current_admin.user_id,params[:business_id])
639
+ render json: {msg:'确定取消关注?'}
640
+ else
641
+ render json: {msg:'确定关注?'}
642
+ end
643
+ end
644
+
583
645
 
584
646
  private
585
647
 
@@ -594,5 +656,9 @@ module EducodeSales
594
656
  def edu_setting name
595
657
  EduSetting.get(name)
596
658
  end
659
+
660
+ def follow_business(user_id,business_id)
661
+ BusinessRelationShip.where(user_id:user_id,business_id:business_id).first
662
+ end
597
663
  end
598
664
  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
@@ -55,7 +55,7 @@ module EducodeSales
55
55
 
56
56
  # 完成率completion_rate
57
57
  def completion_rate(setting,progress)
58
- if setting.to_i == 0
58
+ if setting.to_i == 0 || progress.to_i >= setting.to_i
59
59
  '100%'
60
60
  else
61
61
  (progress.to_f/setting.to_f*100).round(2).to_s + "%"
@@ -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,18 @@
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 :filter_data, Json
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+ end
17
+ end
18
+
@@ -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',
@@ -81,6 +81,7 @@
81
81
  ,url: '/missions/assessments/progress'
82
82
  ,toolbar: '#progress_Toolbar'
83
83
  ,totalRow:true
84
+ ,title: "绩效考核指标完成情况" // 目前发现的作用(导出文件的文件名)
84
85
  ,defaultToolbar: ['filter']
85
86
  // ,limit: 10
86
87
  ,limits: [10,15,20,30,40,50,60,70,80,90]
@@ -89,7 +90,7 @@
89
90
  ,cols:[
90
91
  [ //标题栏
91
92
  { title: '序号', width: 80, rowspan: 2,type:'numbers',fixed:'left',sort: true,} //rowspan即纵向跨越的单元格数
92
- ,{field: 'name', title: '考核人员', width: 80, rowspan: 2,fixed:'left'}
93
+ ,{field: 'name', title: '考核人员', width: 120, rowspan: 2,fixed:'left'}
93
94
  ,{align: 'center', title: '全年', colspan: 5} //colspan即横跨的单元格数,这种情况下不用设置field和width
94
95
  ,{align: 'center', title: '第1季度', colspan: 5} //colspan即横跨的单元格数,这种情况下不用设置field和width
95
96
  ,{align: 'center', title: '1月', colspan: 5} //colspan即横跨的单元格数,这种情况下不用设置field和width
@@ -252,6 +253,8 @@
252
253
  // select: data.select, //有点东西
253
254
  }, function (res) {
254
255
  data = res.data
256
+ // table.exportFile(['标题','案件类型','立案日期'], data , "xls");
257
+ // 表格中每行的title , 数据 ,格式
255
258
  table.exportFile(progress_table.config.id,data, 'csv');
256
259
  layer.closeAll('loading');
257
260
  })
@@ -259,12 +262,12 @@
259
262
  }
260
263
  function export_excel() {
261
264
  var data = form.val("assessment_progress_form");
262
- request.authPost("/missions/businesses/get_export_data", {
265
+ request.authPost("/missions/assessments/get_export_data", {
263
266
  assessment_year: data.assessment_year,
264
267
  assessment_id: data.assessment_id,
265
268
  staff_id: data.staff_id,
266
269
  }, function (res) {
267
- data = res.data
270
+ data = res.data;
268
271
  table.exportFile(progress_table.config.id,data, 'xls');
269
272
  layer.closeAll('loading');
270
273
  })
@@ -310,7 +313,7 @@
310
313
  form.val('assessment_progress_form', {
311
314
  staff_id: '',
312
315
  assessment_year: '2022',
313
- assessment_id: '签单金额',
316
+ assessment_id: '1', // 重置后显示value=1的name
314
317
  })
315
318
  return false;
316
319
  });
@@ -2,7 +2,7 @@
2
2
  <div class="layui-btn-container">
3
3
  <span class="table-label">指标完成情况</span>
4
4
  <% if can?(:create, EducodeSales::AssessmentsSetting) %>
5
- <button class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add">添加人员任务指标</button>
5
+ <button class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add" >添加人员任务指标</button>
6
6
  <% end %>
7
7
  </div>
8
8
  </script>
@@ -61,9 +61,6 @@
61
61
  <% end %>
62
62
  </script>
63
63
 
64
- <!--<script type="text/html" id="showchance">-->
65
- <!-- <a href="/missions/businesses" class="layui-table-link">{{ d.chance }}asd</a>-->
66
- <!--</script>-->
67
64
 
68
65
  <script>
69
66
  layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'laypage'], function () {
@@ -96,96 +93,115 @@
96
93
  title: '序号',
97
94
  width: 100,
98
95
  sort: true,
99
- fixed: 'left'
96
+ fixed: 'left',
97
+ // filter: false
100
98
  },
101
99
  {
102
100
  field: 'username',
103
101
  title: '考核人员',
104
102
  width: 100,
105
- fixed: 'left'
103
+ fixed: 'left',
104
+ hide: gon.filter["username"]
106
105
  },
107
106
  {
108
107
  field: 'annual',
109
108
  title: '全年',
110
109
  width: 100,
110
+ hide: gon.filter["annual"],
111
111
  },
112
112
  {
113
113
  field: 'first_quarter',
114
114
  title: '第1季度',
115
115
  width: 100,
116
+ hide: gon.filter["first_quarter"],
116
117
  },
117
118
  {
118
119
  field: 'january',
119
120
  title: '1月',
121
+ hide: gon.filter.january,
120
122
  },
121
123
  {
122
124
  field: 'february',
123
125
  title: '2月',
124
126
  width: 70,
127
+ hide: gon.filter.february,
125
128
  },
126
129
  {
127
130
  field: 'march',
128
131
  title: '3月',
129
132
  width: 70,
133
+ hide: gon.filter.march,
130
134
  },
131
135
  {
132
136
  field: 'second_quarter',
133
137
  title: '第2季度',
134
138
  width: 100,
139
+ hide: gon.filter.second_quarter,
135
140
  },
136
141
  {
137
142
  field: 'april',
138
143
  title: '4月',
144
+ hide: gon.filter.april,
139
145
  },
140
146
  {
141
147
  field: 'may',
142
148
  title: '5月',
143
149
  width: 70,
150
+ hide: gon.filter.may,
144
151
  },
145
152
  {
146
153
  field: 'june',
147
154
  title: '6月',
148
155
  width: 70,
156
+ hide: gon.filter.june,
149
157
  },
150
158
  {
151
159
  field: 'third_quarter',
152
160
  title: '第3季度',
153
161
  width: 100,
162
+ hide: gon.filter.third_quarter,
154
163
  },
155
164
  {
156
165
  field: 'july',
157
166
  title: '7月',
158
167
  width: 70,
168
+ hide: gon.filter.july,
159
169
  },
160
170
  {
161
171
  field: 'august',
162
172
  title: '8月',
163
173
  width: 70,
174
+ hide: gon.filter.august,
164
175
  },
165
176
  {
166
177
  field: 'september',
167
178
  title: '9月',
168
179
  width: 70,
180
+ hide: gon.filter.september,
169
181
  },
170
182
  {
171
183
  field: 'fourth_quarter',
172
184
  title: '第4季度',
173
185
  width: 100,
186
+ hide: gon.filter.fourth_quarter,
174
187
  },
175
188
  {
176
189
  field: 'october',
177
190
  title: '10月',
178
191
  width: 70,
192
+ hide: gon.filter.october,
179
193
  },
180
194
  {
181
195
  field: 'november',
182
196
  title: '11月',
183
197
  width: 70,
198
+ hide: gon.filter.november,
184
199
  },
185
200
  {
186
201
  field: 'december',
187
202
  title: '12月',
188
203
  width: 70,
204
+ hide: gon.filter.december,
189
205
  },
190
206
  {
191
207
  field: 'option',
@@ -197,7 +213,11 @@
197
213
  },
198
214
  ]
199
215
  ],
200
- limit: 10,
216
+ done : function () {
217
+ $('.layui-table-fixed-r').removeClass('layui-hide'); // 与底部的css文件解决fixed第一次加载无法实现问题
218
+ },
219
+
220
+ limit: 10,
201
221
  limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
202
222
  page: true,
203
223
  parseData: function(res){ //将原始数据解析成 table 组件所规定的数据,res为从url中get到的数据
@@ -236,7 +256,22 @@
236
256
  })
237
257
 
238
258
 
259
+
239
260
  table.on('tool(assessments)', function (obj) {
261
+
262
+ switch (obj.event) {
263
+ case 'username' :
264
+ console.log(obj);
265
+ console.log(obj.data);
266
+ console.log("username")
267
+ console.log("=================")
268
+ break;
269
+ case 'annual' :
270
+ console.log("annual")
271
+ break;
272
+
273
+ }
274
+
240
275
  var data = obj.data;
241
276
  console.log(obj)
242
277
  console.log(data)
@@ -264,7 +299,7 @@
264
299
  });
265
300
  return false;
266
301
  } else if (obj.event === 'delete') {
267
- layer.confirm('确定删除' + "demo" + data.id, function (index) {
302
+ layer.confirm('确定删除该人员任务指标吗?', function (index) {
268
303
  request.delete('missions/assessments/' + data.id, {}, function (res) {
269
304
  layer.close(index);
270
305
  table.reload("assessments")
@@ -274,7 +309,31 @@
274
309
  });
275
310
 
276
311
  // * toolbar事件监听
277
- table.on('toolbar(assessments)', function (obj) {
312
+ table.on('toolbar(assessments)', function (obj) {
313
+ switch (obj.event) {
314
+ case 'LAYTABLE_COLS':
315
+ console.log("start")
316
+ var checkStatus = table.checkStatus(obj.config.id);
317
+ console.log(checkStatus)
318
+ layui.form.on('checkbox(LAY_TABLE_TOOL_COLS)', function(obj) {
319
+ console.log(obj); //当前行的一些常用操作集合
320
+ var value = obj.elem.checked
321
+ console.log(value); //当前是否选中状态
322
+ console.log('====checked'); //选中行的相关数据
323
+ var name = obj.elem.attributes[1].value
324
+ console.log(name);
325
+ console.log("request start")
326
+ request.get('missions/filter?type=assessments_setup&name='+name+'&hidden='+value, {}, function (res) {
327
+ console.log("end")
328
+ // layui.msg("重新加载生效")
329
+ // layer.close(index);
330
+ // table.reload("assessments")
331
+ })
332
+ });
333
+ break;
334
+
335
+ }
336
+
278
337
  if (obj.event === 'add') { // 监听添加操作
279
338
  var content = miniPage.getHrefContent('/missions/assessments/new');
280
339
  var openWH = miniPage.getOpenWidthHeight();
@@ -288,10 +347,24 @@
288
347
  offset: [openWH[2] + 'px', openWH[3] + 'px'],
289
348
  content: content,
290
349
  success: function (layero, index) {
291
- // 重新渲染弹层中的下拉选择框select
292
- form.render('select');
350
+ // 重新加载select下拉框(绩效考核标准)
351
+ form.render('select')
352
+ // clear上次弹层中的多选人员数据 // staffs不清楚为什么要写在单独的script下才有效
353
+ staffs.setValue([ ])
354
+
293
355
  }
294
356
  });
357
+ // 这样写无法实现 要写在success中记住(open弹出层) 294
358
+ // document.getElementById('clear_staffs').onclick = function() {
359
+ // console.log("delete")
360
+ // staffs.setValue([ {name:'', value:''} ])
361
+ // // console.log(staffs)
362
+ // // alert(staffs.setValue([ {name:'', value:''} ]))
363
+ // // staffs.setValue([ ])
364
+ // // alert(staffs.setValue([ ]))
365
+ // clear(staffs)
366
+ // console.log("ok")
367
+ // };
295
368
  $(window).on("resize", function () {
296
369
  layer.full(index);
297
370
  });
@@ -321,11 +394,40 @@
321
394
  console.log("setup");
322
395
  form.val('search_assessments_form', {
323
396
  assessment_year: '2022',
324
- assessment_id: "签单金额",
397
+ assessment_id: 1, //重置后显示value=1的name
325
398
  staff_id: ''
326
399
  });
327
400
  return false;
328
401
  });
329
402
  });
330
403
 
331
- </script>
404
+ </script>
405
+ <style>
406
+ /*与table下的done解决fixed第一次加载无法实现问题*/
407
+ .layui-hide {
408
+ display: none!important;
409
+ }
410
+
411
+ .layui-table-fixed .layui-table-body {
412
+ height: auto!important;
413
+ }
414
+ .layui-table-fixed.layui-hide {
415
+ display: block!important;
416
+ }
417
+
418
+
419
+ </style>
420
+
421
+ <!--table下的tootbar布局-->
422
+ <style>
423
+ .layui-table-tool-temp{
424
+ padding-right: 30px; !important;
425
+ }
426
+ .layui-table-fixed .layui-table-body {
427
+ height: auto!important;
428
+ }
429
+ .layui-table-fixed.layui-hide {
430
+ display: block!important;
431
+ }
432
+
433
+ </style>