educode_sales 0.9.73 → 0.9.74

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/contracts_controller.rb +309 -0
  3. data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
  4. data/app/controllers/educode_sales/home_controller.rb +7 -0
  5. data/app/controllers/educode_sales/ideas_controller.rb +146 -76
  6. data/app/controllers/educode_sales/roles_controller.rb +2 -1
  7. data/app/controllers/educode_sales/upload_files_controller.rb +3 -0
  8. data/app/models/educode_sales/assign_staff.rb +6 -0
  9. data/app/models/educode_sales/contract_date_list.rb +6 -0
  10. data/app/models/educode_sales/follow_up.rb +6 -0
  11. data/app/models/educode_sales/idea.rb +16 -5
  12. data/app/models/educode_sales/idea_follow.rb +11 -0
  13. data/app/models/educode_sales/permission.rb +2 -1
  14. data/app/models/educode_sales/role_area.rb +2 -1
  15. data/app/views/educode_sales/businesses/_contract_list.html.erb +160 -0
  16. data/app/views/educode_sales/contracts/_follows.html.erb +323 -0
  17. data/app/views/educode_sales/contracts/_list.html.erb +596 -0
  18. data/app/views/educode_sales/contracts/follow_ups.json.jbuilder +23 -0
  19. data/app/views/educode_sales/contracts/index.html.erb +50 -0
  20. data/app/views/educode_sales/contracts/index.json.jbuilder +74 -0
  21. data/app/views/educode_sales/contracts/list.js.erb +1 -0
  22. data/app/views/educode_sales/contracts/new_follow_up.html.erb +671 -0
  23. data/app/views/educode_sales/home/staff_business.json.jbuilder +9 -0
  24. data/app/views/educode_sales/idea_recycles/detail.html.erb +4 -4
  25. data/app/views/educode_sales/idea_recycles/index.html.erb +5 -5
  26. data/app/views/educode_sales/ideas/_follows.html.erb +258 -0
  27. data/app/views/educode_sales/ideas/_index.html.erb +544 -0
  28. data/app/views/educode_sales/ideas/detail.html.erb +7 -7
  29. data/app/views/educode_sales/ideas/edit.html.erb +77 -15
  30. data/app/views/educode_sales/ideas/files.html.erb +157 -0
  31. data/app/views/educode_sales/ideas/files.json.jbuilder +13 -0
  32. data/app/views/educode_sales/ideas/follow_ups.json.jbuilder +14 -0
  33. data/app/views/educode_sales/ideas/index.html.erb +12 -353
  34. data/app/views/educode_sales/ideas/index.json.jbuilder +7 -1
  35. data/app/views/educode_sales/ideas/new.html.erb +81 -25
  36. data/app/views/educode_sales/ideas/new_follow_up.html.erb +105 -0
  37. data/app/views/educode_sales/ideas/search_new.html.erb +1 -1
  38. data/app/views/educode_sales/ideas/show_schools.html.erb +84 -0
  39. data/app/views/educode_sales/ideas/show_schools.json.jbuilder +12 -0
  40. data/app/views/educode_sales/ideas/show_teachers.html.erb +372 -0
  41. data/app/views/educode_sales/ideas/upload_file.html.erb +43 -0
  42. data/app/views/educode_sales/projects/detail.html.erb +1 -1
  43. data/app/views/educode_sales/projects/edit.html.erb +1 -1
  44. data/app/views/educode_sales/roles/edit.html.erb +16 -0
  45. data/app/views/layouts/educode_sales/application.html.erb +5 -5
  46. data/config/routes.rb +19 -0
  47. data/db/migrate/20230227061043_create_educode_sales_ideas.rb +2 -2
  48. data/db/migrate/20230430023424_add_plan_signed_date_to_follow_ups.rb +21 -0
  49. data/db/migrate/20230430040332_create_educode_sales_contract_date_lists.rb +15 -0
  50. data/db/migrate/20230430104708_create_idea_follows.rb +25 -0
  51. data/db/migrate/20230430121335_add_permissions_for_ideas.rb +16 -0
  52. data/db/migrate/20230430134710_create_educode_sales_assign_staffs.rb +11 -0
  53. data/lib/educode_sales/version.rb +1 -1
  54. metadata +30 -2
@@ -0,0 +1,596 @@
1
+ <div class="min-height-table" id="contract_list">
2
+ <div style="margin: 10px 10px 10px 10px">
3
+ <form class="layui-form layui-form-pane" lay-filter="search_form">
4
+ <div class="layui-form-item">
5
+ <div class="layui-inline">
6
+ <label class="layui-form-label">商机名称</label>
7
+ <div class="layui-input-inline">
8
+ <input type="text" name="name" class="layui-input" value="">
9
+ <input type="text" style="display: none" name="place_id" class="layui-input" value="<%=params[:place_id] %>">
10
+ </div>
11
+ </div>
12
+ <div class="layui-inline">
13
+ <label class="layui-form-label">用户单位</label>
14
+ <div class="layui-input-inline">
15
+ <input type="text" name="department" value="<%=params[:school] %>" class="layui-input">
16
+ </div>
17
+ </div>
18
+ <div class="layui-inline">
19
+ <label class="layui-form-label">最新跟进人</label>
20
+ <div class="layui-input-inline">
21
+ <%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true , "lay-search": "" } %>
22
+ </div>
23
+ </div>
24
+ <div class="layui-inline">
25
+ <label class="layui-form-label">商机变化</label>
26
+ <div class="layui-input-inline">
27
+ <select name="clazz_changes">
28
+ <option value=""></option>
29
+ <option value="1">商机降级</option>
30
+ <option value="2">商机晋级</option>
31
+ <option value="3">商机降级 A-X</option>
32
+ <option value="4">商机降级 AB-X</option>
33
+ <option value="5">商机降级 ABC-X</option>
34
+ <option value="6">商机晋级 B-A</option>
35
+ <option value="7">商机晋级 BC-A</option>
36
+ <option value="8">商机晋级 BCD-A</option>
37
+ </select>
38
+ </div>
39
+ </div>
40
+ <div class="layui-inline">
41
+ <label class="layui-form-label">销售经理</label>
42
+ <div class="layui-input-inline">
43
+ <%= select_tag "sales_staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true , "lay-search": "" } %>
44
+ </div>
45
+ </div>
46
+ <div class="layui-inline">
47
+ <label class="layui-form-label">售后工程师</label>
48
+ <div class="layui-input-inline">
49
+ <%= select_tag "after_sales_staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true , "lay-search": "" } %>
50
+ </div>
51
+ </div>
52
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
53
+ <label class="layui-form-label">项目类型</label>
54
+ <div class="layui-input-inline">
55
+ <div id="contract_business_type" style="width: 190px;"></div>
56
+ </div>
57
+ </div>
58
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
59
+ <label class="layui-form-label">项目阶段</label>
60
+ <div class="layui-input-inline">
61
+ <div id="contract_business_step" style="width: 190px;"></div>
62
+ </div>
63
+ </div>
64
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
65
+ <label class="layui-form-label">渠道名称</label>
66
+ <div class="layui-input-inline">
67
+ <div id="contract_index_place" style="width: 190px;"></div>
68
+ </div>
69
+ </div>
70
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
71
+ <label class="layui-form-label">区域</label>
72
+ <div class="layui-input-inline">
73
+ <%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
74
+ </div>
75
+ </div>
76
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
77
+ <label class="layui-form-label">所属年度</label>
78
+ <div class="layui-input-inline">
79
+ <%= select_tag "business_year", options_for_select((2015..Time.now.year).to_a.reverse, params[:business_year]), { include_blank: true } %>
80
+ </div>
81
+ </div>
82
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
83
+ <label class="layui-form-label">招标时间</label>
84
+ <div class="layui-input-inline">
85
+ <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
86
+ </div>
87
+ </div>
88
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
89
+ <label class="layui-form-label">中标时间</label>
90
+ <div class="layui-input-inline">
91
+ <input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
92
+ </div>
93
+ </div>
94
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
95
+ <label class="layui-form-label">签单时间</label>
96
+ <div class="layui-input-inline">
97
+ <input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
98
+ </div>
99
+ </div>
100
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
101
+ <label class="layui-form-label">回款时间</label>
102
+ <div class="layui-input-inline">
103
+ <input type="text" class="layui-input" id="date_at" name="date_at" placeholder=" - " autocomplete="off">
104
+ </div>
105
+ </div>
106
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
107
+ <label class="layui-form-label">创建时间</label>
108
+ <div class="layui-input-inline">
109
+ <input type="text" class="layui-input" id="date" name="date" placeholder=" - " autocomplete="off">
110
+ </div>
111
+ </div>
112
+ <div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
113
+ <label class="layui-form-label">部署类型</label>
114
+ <div class="layui-input-inline">
115
+ <select name="o_business_deployment">
116
+ <option value=""></option>
117
+ <option value="1">公有云</option>
118
+ <option value="2">私有云</option>
119
+ <option value="3">混合云</option>
120
+ </select>
121
+ </div>
122
+ </div>
123
+ <div class="layui-inline">
124
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
125
+ </button>
126
+ <button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness_contract">搜索
127
+ </button>
128
+ <a style="padding-left: 20px;color: #0000FF" href="javascript:;" type="submit" class="" lay-submit lay-filter="show_hide_contract">高级搜索
129
+ </a>
130
+ </div>
131
+ </div>
132
+ </form>
133
+ </div>
134
+ <div id="contact_table_wraper">
135
+ <table class="layui-hide" id="contact_table" lay-filter="contact_table"></table>
136
+ </div>
137
+ </div>
138
+
139
+ <script type="text/html" id="currentTableBar">
140
+ <% if can? :add_contract_follow, EducodeSales::Business %>
141
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进</a>
142
+ <% end %>
143
+ <% if can? :assign_contract, EducodeSales::Business %>
144
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="assign">指派售后</a>
145
+ <% end %>
146
+
147
+ </script>
148
+
149
+
150
+ <script>
151
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown','laytpl', 'xmSelect'], function () {
152
+ var $ = layui.jquery,
153
+ form = layui.form,
154
+ request = layui.request,
155
+ miniPage = layui.miniPage,
156
+ dropdown = layui.dropdown,
157
+ xmSelect = layui.xmSelect,
158
+ laydate = layui.laydate;
159
+ var openWH = miniPage.getOpenWidthHeight();
160
+ laydate.render({
161
+ elem: '#date',
162
+ range: true
163
+ });
164
+
165
+ laydate.render({
166
+ elem: '#invitation_at',
167
+ range: true
168
+ });
169
+
170
+ laydate.render({
171
+ elem: '#bidded_date',
172
+ range: true,
173
+ value: gon.bidded_date
174
+ });
175
+ laydate.render({
176
+ elem: '#signed_date',
177
+ range: true,
178
+ value: gon.signed_date
179
+ });
180
+
181
+ laydate.render({
182
+ elem: '#date_at',
183
+ range: true,
184
+ value: gon.date_at
185
+ });
186
+
187
+
188
+ var business_type_list = xmSelect.render({
189
+ el: '#contract_business_type',
190
+ data: gon.business_type
191
+ })
192
+
193
+
194
+ var business_step_list = xmSelect.render({
195
+ el: '#contract_business_step',
196
+ data: gon.business_step
197
+ })
198
+
199
+ var index_place_list = xmSelect.render({
200
+ el: '#contract_index_place',
201
+ model: {
202
+ icon: 'hidden',
203
+ label: {
204
+ type: 'text',
205
+ text: {
206
+ //左边拼接的字符
207
+ left: '',
208
+ //右边拼接的字符
209
+ right: '',
210
+ //中间的分隔符
211
+ separator: ', ',
212
+ },
213
+ }
214
+ },
215
+ remoteSearch: true,
216
+ clickClose: true,
217
+ delay: 1000,
218
+ paging: true,
219
+ radio: true,
220
+ pageRemote: true,
221
+ filterable: true,
222
+ remoteMethod: function (val, cb, show, pageIndex) {
223
+ $.ajax( '/missions/sales_place', {
224
+ method: 'get',
225
+ data: {
226
+ q: val,
227
+ page: pageIndex
228
+ },
229
+ dataType: 'json',
230
+ success: function (res) {
231
+ var data = res.data;
232
+ if (res.code == 0) {
233
+ cb(res.data, res.count);
234
+ } else {
235
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
236
+ }
237
+ }
238
+ })
239
+ }
240
+ })
241
+ index_place_list.setValue(gon.place)
242
+
243
+
244
+ var data = form.val("search_form");
245
+ table = layui.table;
246
+ var cols_table = [
247
+ [
248
+ {
249
+ field: 'id',
250
+ width: 60,
251
+ title: '序号', type: 'numbers',
252
+ totalRowText: '合计',
253
+ fixed: "left"
254
+ },
255
+ {
256
+ field: 'number',
257
+ width: 120,
258
+ title: '编号',
259
+ fixed: 'left',
260
+ },
261
+ {
262
+ field: 'name',
263
+ width: 170,
264
+ title: '商机名称',
265
+ templet: '<div><a href="javascript:void(0);" class="layui-table-link" lay-event="show_business"><span title="{{d.name}}">{{d.name}}</span></a></div>',
266
+ fixed: 'left',
267
+ },
268
+ {
269
+ field: 'area',
270
+ width: 100,
271
+ title: '地域',
272
+ },
273
+ {
274
+ field: 'school',
275
+ width: 150,
276
+ title: '用户单位',
277
+ templet: '#school_name',
278
+ },
279
+ {
280
+ field: 'property',
281
+ width: 150,
282
+ title: '客户类型',
283
+ },
284
+ {
285
+ field: 'department',
286
+ width: 150,
287
+ title: '部门',
288
+ templet: '<div><span title="{{d.department}}">{{d.department}}</span></div>',
289
+ },
290
+ {
291
+ field: 'follow_ups_count',
292
+ title: '跟进',
293
+ width: 60,
294
+ templet: '#show_follow',
295
+ totalRow: true,
296
+ },
297
+ {
298
+ field: 'clazz',
299
+ width: 80,
300
+ title: '类型',
301
+ templet: "<div><span title='{{d.clazz}}' class='changed-{{d.clazz_changed}}'>{{d.clazz}}</span></div>",
302
+ },
303
+ {
304
+ field: 'stage',
305
+ width: 90,
306
+ title: '阶段',
307
+ },
308
+ {
309
+ field: 'staff_manages',
310
+ width: 150,
311
+ title: '销售经理',
312
+ },
313
+ {
314
+ field: 'assign_staffs',
315
+ width: 150,
316
+ title: '售后工程师',
317
+ },
318
+ {
319
+ field: 'source',
320
+ width: 90,
321
+ title: '商机来源',
322
+ },
323
+ {
324
+ field: 'last_follow_person',
325
+ width: 100,
326
+ title: '最新跟进人',
327
+ },
328
+ {
329
+ field: 'no_followup_days',
330
+ width: 100,
331
+ title: '无跟进天数',
332
+ },
333
+ {
334
+ field: 'created_at',
335
+ width: 200,
336
+ title: '商机创建时间',
337
+ sort: true,
338
+ },
339
+ {
340
+ field: 'latest_time',
341
+ width: 200,
342
+ title: '最新跟进时间',
343
+ sort: true,
344
+ },
345
+ {
346
+ field: 'invitation_at',
347
+ width: 105,
348
+ title: '招标时间',
349
+ sort: true,
350
+ },
351
+ {
352
+ field: 'bidded_date',
353
+ width: 105,
354
+ title: '中标时间',
355
+ sort: true,
356
+ },
357
+ {
358
+ field: 'signed_date',
359
+ width: 105,
360
+ title: '签单时间',
361
+ sort: true,
362
+ },
363
+ {
364
+ field: 'reception_at',
365
+ width: 105,
366
+ title: '验收时间',
367
+ sort: true,
368
+ },
369
+ {
370
+ field: 'service_end_time',
371
+ width: 200,
372
+ title: '服务期',
373
+ sort: true,
374
+ },
375
+ {
376
+ field: 'o_business_deployment',
377
+ width: 150,
378
+ title: '部署类型',
379
+ sort: true,
380
+ },
381
+ {
382
+ field: 'budget_amount',
383
+ width: 105,
384
+ title: '预算金额',
385
+ totalRow: true,
386
+ sort: true,
387
+ },
388
+ {
389
+ field: 'total_amount',
390
+ width: 100,
391
+ title: '中标额',
392
+ totalRow: true,
393
+ sort: true,
394
+ },
395
+ {
396
+ field: 'actual_amount',
397
+ width: 100,
398
+ title: '合同额',
399
+ totalRow: true,
400
+ sort: true,
401
+ },
402
+ {
403
+ field: 'return_money',
404
+ width: 100,
405
+ title: '回款',
406
+ sort: true,
407
+ totalRow: true,
408
+ },
409
+ {
410
+ field: 'wait_return_money',
411
+ width: 100,
412
+ title: '待回款',
413
+ sort: true,
414
+ totalRow: true,
415
+ },
416
+ {
417
+ field: 'return_money_days',
418
+ width: 150,
419
+ title: '首次回款周期(天)',
420
+ },
421
+ {
422
+ field: 'divide_rate',
423
+ width: 160,
424
+ title: '渠道分成比例',
425
+ sort: true,
426
+ },
427
+ {
428
+ field: 'divide_money',
429
+ width: 160,
430
+ title: '渠道分成金额',
431
+ sort: true,
432
+ },
433
+ {
434
+ field: 'place',
435
+ width: 160,
436
+ title: '渠道',
437
+ },
438
+ {
439
+ field: 'sale_way',
440
+ width: 160,
441
+ title: '销售方式',
442
+ },
443
+ {
444
+ field: 'year',
445
+ width: 105,
446
+ title: '所属年度',
447
+ sort: true,
448
+ },
449
+ {
450
+ field: 'followed',
451
+ templet:function(d){
452
+ if (d.followed==1){
453
+ return '<i class="layui-icon" style="color: goldenrod">&#xe658;</i> '
454
+ }
455
+ else return ''
456
+ },
457
+ width: 105,
458
+ title: '关注',
459
+ align: "center",
460
+
461
+ },
462
+ {
463
+ title: '操作',
464
+ minWidth: 220,
465
+ toolbar: '#currentTableBar',
466
+ align: "center",
467
+ fixed: 'right'
468
+ }
469
+ ]
470
+ ]
471
+
472
+
473
+ form.on('submit(show_hide_contract)', function (data) {
474
+ $(".show_item_contract").toggle()
475
+ return false;
476
+ });
477
+ var business_table = table.render({
478
+ elem: '#contact_table',
479
+ url: '/missions/contracts',
480
+ autoSort: false,
481
+ where: {q: data},
482
+ defaultToolbar: ['filter'],
483
+ title: '合同数据表',
484
+ totalRow: true,//开启合并行
485
+ cols: cols_table,
486
+
487
+ limit: 20,
488
+ limits: [10,15,20,30,40,50,60,70,80,90],
489
+ page: true,
490
+ skin: 'line',
491
+ });
492
+
493
+
494
+ var sort = {}, search = data;
495
+
496
+ table.on('sort(contact_table)', function (obj) {
497
+ var data = form.val("search_form");
498
+ sort.field = obj.field;
499
+ sort.order = obj.type;
500
+ table.reload('contact_table', {
501
+ url: '/missions/businesses',
502
+ initSort: obj,
503
+ where: {
504
+ sort: sort,
505
+ q: search
506
+ }
507
+ });
508
+ })
509
+
510
+ // 监听搜索操作
511
+ form.on('submit(search_bussiness_contract)', function (data) {
512
+ if (search['clazz']) {
513
+ data.field['clazz'] = search['clazz']
514
+ }
515
+ search = data.field
516
+ table.reload('contact_table', {
517
+ url: '/missions/contracts',
518
+ page: {
519
+ curr: 1
520
+ },
521
+ where: {q: search, sort: sort}
522
+ }, 'data');
523
+
524
+ return false;
525
+ });
526
+
527
+ form.on('submit(reset_business_search)', function (data) {
528
+ var field = data.field;
529
+ form.val('search_form', {
530
+ name: '', department: '', staff_id: '', business_type: '', business_step: '',
531
+ place_id: '', date: '', area: '', invitation_at: '', business_year: '', number: ''
532
+ })
533
+ business_type_list.setValue([])
534
+ business_step_list.setValue([])
535
+ index_place_list.setValue([])
536
+ return false;
537
+ });
538
+
539
+ table.on('tool(contact_table)', function (obj) {
540
+ var data = obj.data;
541
+ id = data.id
542
+ if (obj.event === 'add_event') { // 监听添加操作
543
+ business_id = data.id
544
+ var content = miniPage.getHrefContent('/missions/contracts/new_follow_up?id=' + data.id);
545
+ var openWH = miniPage.getOpenWidthHeight();
546
+ sale_plan_index = layer.open({
547
+ title: '添加合同跟进记录',
548
+ type: 1,
549
+ shade: 0.2,
550
+ maxmin: true,
551
+ shadeClose: true,
552
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
553
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
554
+ content: content,
555
+ success: function (layero, index) {
556
+ form.render('select');
557
+ }
558
+ });
559
+ $(window).on("resize", function () {
560
+ layer.full(sale_plan_index);
561
+ });
562
+ } else if (obj.event === 'assign') {
563
+ var content = miniPage.getHrefContent('/missions/businesses/' + id + '/edit');
564
+ var openWH = miniPage.getOpenWidthHeight();
565
+ sindex = layer.open({
566
+ title: '编辑',
567
+ type: 1,
568
+ shade: 0.2,
569
+ maxmin: true,
570
+ shadeClose: true,
571
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
572
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
573
+ content: content
574
+ });
575
+ $(window).on("resize", function () {
576
+ layer.full(sindex);
577
+ });
578
+ return false;
579
+ }
580
+ });
581
+
582
+
583
+ });
584
+ </script>
585
+ <style>
586
+ .layui-table-tool-temp{
587
+ padding-right: 30px; !important;
588
+ }
589
+ .layui-table-fixed .layui-table-body {
590
+ height: auto!important;
591
+ }
592
+ .layui-table-fixed.layui-hide {
593
+ display: block!important;
594
+ }
595
+
596
+ </style>
@@ -0,0 +1,23 @@
1
+ json.data do
2
+ json.array! @follow_ups do |d|
3
+ json.id d.id
4
+ json.clazz d.clazz.name
5
+ json.stage d.stage.name
6
+ json.staff d.staff.user.real_name
7
+ json.description d.description
8
+ json.advise d.advise
9
+ json.school d.business.department&.school&.name
10
+ json.school_id d.business.department&.school&.id
11
+ json.created_at d.created_at.to_s
12
+ json.business d.business.name
13
+ json.business_id d.business.id
14
+ json.rival d.rival || ''
15
+ json.staff_manages d.business.last_follow_up&.assign_follow_ups.present? ? (d.business.last_follow_up.assign_follow_ups.map{ |d| d.staff.user.real_name}.join("、")) : d.business.staff&.user&.real_name
16
+ # teacher_ids = d.key_person.pluck(:teacher_id)
17
+ json.tel d.key_person.pluck(:tel).select { |d| d.present? }.join("、")
18
+
19
+ end
20
+ end
21
+
22
+ json.code 0
23
+ json.count @follow_ups.total_count
@@ -0,0 +1,50 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div class="layui-tab" lay-filter="contract_tab">
3
+ <ul class="layui-tab-title">
4
+ <li class="layui-this follows_li">跟进动态</li>
5
+ <li class="contracts_list_li">合同列表</li>
6
+ </ul>
7
+ <div class="layui-tab-content">
8
+ <div class="layui-tab-item follows_div layui-show">
9
+ <%=render 'follows' %>
10
+ </div>
11
+ <div class="layui-tab-item contracts_list_div">
12
+ <div id="contract_list_wraper"></div>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <script>
18
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'element'], function() {
19
+ var $ = layui.jquery,
20
+ form = layui.form,
21
+ request = layui.request,
22
+ dropdown = layui.dropdown,
23
+ miniPage = layui.miniPage,
24
+ element = layui.element,
25
+ laydate = layui.laydate;
26
+ var laydate = layui.laydate;
27
+
28
+
29
+
30
+ element.render();
31
+ element.on('tab(contract_tab)', function(data) {
32
+ if (data.index == 1 && $("#contract_list").length == 0) {
33
+ loadPage('/missions/contracts/list')
34
+ }
35
+ });
36
+
37
+
38
+ function loadPage(url) {
39
+ var layer_index = layer.load(0, {shade: [0.1, '#fff']});
40
+ Rails.ajax({
41
+ url: url,
42
+ type: 'GET',
43
+ dataType: "script",
44
+ success: function (res) {
45
+ layer.close(layer_index);
46
+ }
47
+ });
48
+ }
49
+ })
50
+ </script>