educode_sales 0.9.66 → 0.9.68

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/activities_controller.rb +122 -40
  3. data/app/controllers/educode_sales/businesses_controller.rb +83 -2
  4. data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
  5. data/app/controllers/educode_sales/plans_controller.rb +173 -11
  6. data/app/controllers/educode_sales/recycles_controller.rb +11 -1
  7. data/app/controllers/educode_sales/teachers_controller.rb +4 -4
  8. data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
  9. data/app/models/educode_sales/activity.rb +21 -4
  10. data/app/models/educode_sales/activity_follow_up.rb +13 -0
  11. data/app/models/educode_sales/activity_staff.rb +1 -1
  12. data/app/models/educode_sales/assessments_setting.rb +2 -2
  13. data/app/models/educode_sales/business.rb +3 -0
  14. data/app/models/educode_sales/business_info.rb +9 -0
  15. data/app/models/educode_sales/business_level.rb +11 -0
  16. data/app/models/educode_sales/business_watch.rb +6 -0
  17. data/app/models/educode_sales/sale_plan.rb +3 -1
  18. data/app/models/educode_sales/staff.rb +2 -0
  19. data/app/views/educode_sales/activities/_follows.html.erb +222 -0
  20. data/app/views/educode_sales/activities/_index.html.erb +491 -0
  21. data/app/views/educode_sales/activities/edit.html.erb +109 -53
  22. data/app/views/educode_sales/activities/files.html.erb +157 -0
  23. data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
  24. data/app/views/educode_sales/activities/follow_ups.json.jbuilder +19 -0
  25. data/app/views/educode_sales/activities/index.html.erb +13 -349
  26. data/app/views/educode_sales/activities/index.json.jbuilder +11 -3
  27. data/app/views/educode_sales/activities/new.html.erb +87 -46
  28. data/app/views/educode_sales/activities/new_follow_up.html.erb +56 -0
  29. data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
  30. data/app/views/educode_sales/businesses/edit.html.erb +48 -6
  31. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
  32. data/app/views/educode_sales/businesses/index.html.erb +10 -0
  33. data/app/views/educode_sales/businesses/new.html.erb +1 -1
  34. data/app/views/educode_sales/businesses/no_permission.html.erb +2 -0
  35. data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
  36. data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
  37. data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
  38. data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
  39. data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
  40. data/app/views/educode_sales/plans/index.html.erb +8 -0
  41. data/app/views/educode_sales/plans/new_year.html.erb +204 -0
  42. data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
  43. data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
  44. data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
  45. data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
  46. data/app/views/educode_sales/recycles/index.html.erb +26 -22
  47. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
  48. data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
  49. data/config/routes.rb +22 -0
  50. data/db/migrate/20230329135141_create_educode_sales_business_watches.rb +17 -0
  51. data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +31 -0
  52. data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
  53. data/lib/educode_sales/version.rb +1 -1
  54. metadata +31 -7
  55. data/app/assets/images/educode_sales/indexlogo.png +0 -0
@@ -0,0 +1,491 @@
1
+ <script type="text/html" id="activity_toolbar">
2
+ <div class="layui-btn-container">
3
+ <span class="table-label">活动列表</span>
4
+ <% if can? :create, EducodeSales::Activity %>
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>
7
+ <% end %>
8
+ </div>
9
+ </script>
10
+ <div style="margin: 10px 10px 10px 10px">
11
+ <form class="layui-form layui-form-pane">
12
+ <div class="layui-form-item">
13
+ <div class="layui-inline ">
14
+ <label class="layui-form-label">活动名称</label>
15
+ <div class="layui-input-inline">
16
+ <input type="text" class="layui-input" name="name" autocomplete="off">
17
+ </div>
18
+ </div>
19
+ <div class="layui-inline">
20
+ <label class="layui-form-label">会议类型</label>
21
+ <div class="layui-input-inline">
22
+ <%= select_tag "clazz_id", options_for_select(['全国会议', '区域会议', '单校会议', '国赛', '省赛', '夏令营'], ""), { include_blank: true } %>
23
+ </div>
24
+ </div>
25
+ <div class="layui-inline">
26
+ <label class="layui-form-label">活动类型</label>
27
+ <div class="layui-input-inline">
28
+ <%= select_tag "state_id", options_for_select(EducodeSales::Activity.state_ids.keys, ""), { include_blank: true } %>
29
+ </div>
30
+ </div>
31
+ <div class="layui-inline">
32
+ <label class="layui-form-label">销售经理</label>
33
+ <div class="layui-input-inline">
34
+ <%= select_tag "staff_id", options_for_select(@staffs, ""), { include_blank: true } %>
35
+ </div>
36
+ </div>
37
+ <div class="layui-inline">
38
+ <label class="layui-form-label">生态经理</label>
39
+ <div class="layui-input-inline">
40
+ <%= select_tag "manage", options_for_select(@staff_manage, ""), { include_blank: true } %>
41
+ </div>
42
+ </div>
43
+ <div class="layui-inline">
44
+ <label class="layui-form-label">协助人员</label>
45
+ <div class="layui-input-inline">
46
+ <%= select_tag "assists", options_for_select(@staffs, ""), { include_blank: true } %>
47
+ </div>
48
+ </div>
49
+ <div class="layui-inline">
50
+ <label class="layui-form-label">报告专家</label>
51
+ <div class="layui-input-inline">
52
+ <input type="text" class="layui-input" name="expert" autocomplete="off">
53
+ </div>
54
+ </div>
55
+ <div class="layui-inline">
56
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_activity_search">重置
57
+ </button>
58
+ <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_activity">搜 索
59
+ </button>
60
+ </div>
61
+ </div>
62
+ </form>
63
+ </div>
64
+ <div class="min-height-table">
65
+ <table class="layui-hide" id="activities_table" lay-filter="activities_table"></table>
66
+ </div>
67
+
68
+ <script type="text/html" id="currentTableBar">
69
+ <% if can? :create, EducodeSales::ActivityFollowUp %>
70
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进</a>
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
+
77
+ <% if can? :update, EducodeSales::Activity %>
78
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
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 %>
83
+ <% if can? :destroy, EducodeSales::Activity %>
84
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
85
+ <% end %>
86
+ </script>
87
+
88
+ <script type="text/html" id="teachers">
89
+ <a href="javascript:void(0);" lay-event="teachers" class="layui-table-link">{{ d.name}}</a>
90
+ </script>
91
+ <script type="text/html" id="teachers_count">
92
+ <a href="javascript:void(0);" lay-event="teachers_count" class="layui-table-link">{{ d.teachers_count}}</a>
93
+ </script>
94
+ <script type="text/html" id="schools_count">
95
+ <a href="javascript:void(0);" lay-event="schools_count" class="layui-table-link">{{ d.schools_count}}</a>
96
+ </script>
97
+ <script>
98
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
99
+ var $ = layui.jquery,
100
+ form = layui.form,
101
+ table = layui.table,
102
+ request = layui.request,
103
+ miniPage = layui.miniPage;
104
+
105
+ table.render({
106
+ elem: '#activities_table',
107
+ url: '/missions/activities',
108
+ toolbar: '#activity_toolbar',
109
+ totalRow:true,
110
+ defaultToolbar: [],
111
+ cols: [
112
+ [
113
+ {
114
+ field: 'id',
115
+ title:'序号',type: 'numbers',
116
+ totalRowText:'合计',
117
+ width: 60
118
+ },
119
+ {
120
+ field: 'name',
121
+ title: '活动名称',
122
+ width: 180,
123
+ templet: '#teachers'
124
+ },
125
+ {
126
+ field: 'state_id',
127
+ width: 120,
128
+ title: '活动状态'
129
+ },
130
+ {
131
+ field: 'clazz_id',
132
+ width: 120,
133
+ title: '活动类型'
134
+ },
135
+ {
136
+ field: 'staff',
137
+ width: 120,
138
+ title: '销售经理'
139
+ },
140
+ {
141
+ field: 'staff_manage',
142
+ width: 180,
143
+ title: '生态经理'
144
+ },
145
+ {
146
+ field: 'sponsor',
147
+ width: 120,
148
+ title: '主办方'
149
+ },
150
+ {
151
+ field: 'linkman',
152
+ width: 120,
153
+ title: '联系人'
154
+ },
155
+ {
156
+ field: 'phone',
157
+ width: 120,
158
+ title: '联系电话'
159
+ },
160
+ {
161
+ field: 'scale',
162
+ width: 120,
163
+ title: '规模'
164
+ },
165
+ {
166
+ field: 'address',
167
+ width: 120,
168
+ title: '会议地点'
169
+ },
170
+ {
171
+ field: 'meeting_form',
172
+ width: 120,
173
+ title: '会议形式'
174
+ },
175
+ {
176
+ field: 'staff_assist',
177
+ width: 180,
178
+ title: '协助人员'
179
+ },
180
+ {
181
+ field: 'invitations',
182
+ width: 180,
183
+ title: '邀请专家'
184
+ },
185
+ {
186
+ field: 'start_at',
187
+ width: 200,
188
+ title: '时间',
189
+ sort: true,
190
+ },
191
+ {
192
+ field: 'days',
193
+ title: '天数',
194
+ width: 200
195
+ },
196
+ {
197
+ field: 'schools_count',
198
+ title: '学校数',
199
+ width: 200,
200
+ totalRow: true,
201
+ templet: '#schools_count'
202
+ },
203
+ {
204
+ field: 'teachers_count',
205
+ title: '教师数',
206
+ width: 200,
207
+ totalRow:true,
208
+ templet: '#teachers_count'
209
+ },
210
+ {
211
+ field: 'students_count',
212
+ title: '学生数',
213
+ totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
214
+ width: 200
215
+ },
216
+ {
217
+ title: '操作',
218
+ width: 380,
219
+ toolbar: '#currentTableBar',
220
+ align: "center",
221
+ fixed: 'right'
222
+ }
223
+ ]
224
+ ],
225
+ limit: 20,
226
+ limits: [10,15,20,30,40,50,60,70,80,90],
227
+ page: true
228
+ });
229
+
230
+ var sort = {};
231
+ table.on('sort(activities_table)', function (obj) {
232
+ sort.field = obj.field;
233
+ sort.order = obj.type;
234
+ table.reload('activities_table', {
235
+ initSort: obj,
236
+ where: {
237
+ sort: sort
238
+ }
239
+ });
240
+ })
241
+ // 监听搜索操作
242
+ form.on('submit(search_activity)', function (data) {
243
+ search = data.field
244
+ table.reload('activities_table', {
245
+ page: {
246
+ curr: 1
247
+ },
248
+ where: {q: search, sort: sort}
249
+ }, 'data');
250
+ return false;
251
+ });
252
+ table.on('toolbar(activities_table)', function (obj) {
253
+ if (obj.event === 'add') { // 监听添加操作
254
+ var content = miniPage.getHrefContent('/missions/activities/new');
255
+ var openWH = miniPage.getOpenWidthHeight();
256
+ index = layer.open({
257
+ title: '添加活动',
258
+ type: 1,
259
+ shade: 0.2,
260
+ maxmin: true,
261
+ shadeClose: true,
262
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
263
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
264
+ content: content,
265
+ success: function (layero, index) {
266
+ form.render('select');
267
+ }
268
+ });
269
+ $(window).on("resize", function () {
270
+ layer.full(index);
271
+ });
272
+ }
273
+ else if (obj.event === 'import') { //
274
+ var content = miniPage.getHrefContent('/missions/teachers/import');
275
+ var openWH = miniPage.getOpenWidthHeight();
276
+ import_index = layer.open({
277
+ title: '导入数据',
278
+ type: 1,
279
+ shade: 0.2,
280
+ shadeClose: true,
281
+ area: ['200px', '100px'],
282
+ offset: 'auto',
283
+ closeBtn: 0,
284
+ content: content,
285
+ });
286
+ $(window).on("resize", function () {
287
+ layer.full(index);
288
+ });
289
+ }
290
+ });
291
+
292
+ table.on('tool(activities_table)', function (obj) {
293
+ var data = obj.data;
294
+ var id = data.id
295
+ if (obj.event === 'edit') {
296
+ var content = miniPage.getHrefContent('/missions/activities/' + id + '/edit');
297
+ var openWH = miniPage.getOpenWidthHeight();
298
+ var index = layer.open({
299
+ title: '编辑',
300
+ type: 1,
301
+ shade: 0.2,
302
+ maxmin: true,
303
+ shadeClose: true,
304
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
305
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
306
+ content: content,
307
+ success: function (layero, index) {
308
+ // $("#name").val(data.name);
309
+ // 重新渲染弹层中的下拉选择框select
310
+ form.render('select');
311
+ },
312
+ });
313
+ $(window).on("resize", function () {
314
+ layer.full(index);
315
+ });
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
+ });
337
+ } else if (obj.event === 'delete') {
338
+ layer.confirm('确定删除' + data.name, function (index) {
339
+ request.delete('missions/activities/' + data.id, {}, function (res) {
340
+ layer.close(index);
341
+ table.reload("activities_table")
342
+ })
343
+ });
344
+ } else if (obj.event === 'teachers') {
345
+ activity_id = obj.data.id
346
+ var content = miniPage.getHrefContent('/missions/activities/show_teachers');
347
+ openWH = miniPage.getOpenWidthHeight();
348
+ index = layer.open({
349
+ title: '活动列表/' + data.name,
350
+ type: 1,
351
+ shade: 0.2,
352
+ maxmin: true,
353
+ shadeClose: true,
354
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
355
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
356
+ content: content,
357
+ success: function (layero, index) {
358
+ form.render('select');
359
+ },
360
+ });
361
+ $(window).on("resize", function () {
362
+ layer.full(index);
363
+ });
364
+ return false;
365
+ }
366
+ else if (obj.event === 'teachers_count') {
367
+ activity_id = obj.data.id;
368
+ school_id = '';
369
+ content = miniPage.getHrefContent('/missions/activities/show_teachers');
370
+ openWH = miniPage.getOpenWidthHeight();
371
+ index2 = layer.open({
372
+ title: '活动列表/' + data.name,
373
+ type: 1,
374
+ shade: 0.2,
375
+ maxmin: true,
376
+ shadeClose: true,
377
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
378
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
379
+ content: content,
380
+ success: function (layero, index) {
381
+ form.render('select');
382
+ },
383
+ });
384
+ $(window).on("resize", function () {
385
+ layer.full(index);
386
+ });
387
+ return false;
388
+ } else if (obj.event == 'schools_count') {
389
+ activity_id = obj.data.id;
390
+ activity_name = data.name;
391
+ school_id = '';
392
+ content = miniPage.getHrefContent('/missions/activities/' + obj.data.id +'/show_schools');
393
+ openWH = miniPage.getOpenWidthHeight();
394
+ index2 = layer.open({
395
+ title: '活动列表/' + data.name,
396
+ type: 1,
397
+ shade: 0.2,
398
+ maxmin: true,
399
+ shadeClose: true,
400
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
401
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
402
+ content: content,
403
+ success: function (layero, index) {
404
+ form.render('select');
405
+ },
406
+ });
407
+ $(window).on("resize", function () {
408
+ layer.full(index);
409
+ });
410
+ return false;
411
+ } else if (obj.event === 'add_event') { // 监听添加操作
412
+ activity_id = data.id
413
+ var content = miniPage.getHrefContent('/missions/activities/new_follow_up?id=' + data.id);
414
+ var openWH = miniPage.getOpenWidthHeight();
415
+ followup_index = layer.open({
416
+ title: '添加跟进记录',
417
+ type: 1,
418
+ shade: 0.2,
419
+ maxmin: true,
420
+ shadeClose: true,
421
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
422
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
423
+ content: content,
424
+ success: function (layero, index) {
425
+ form.render('select');
426
+ }
427
+ });
428
+ $(window).on("resize", function () {
429
+ layer.full(followup_index);
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
+ });
481
+ }
482
+ });
483
+
484
+ });
485
+ </script>
486
+ <style>
487
+ .layui-table-tool-temp{
488
+ padding-right: 30px; !important;
489
+ }
490
+
491
+ </style>