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
@@ -5,15 +5,15 @@
5
5
  <div class="layui-row">
6
6
  <h2 style="padding-left: 25px">方案信息</h2>
7
7
  </div>
8
- <div class="layui-row" style="padding-top: 15px">
8
+ <div class="layui-row" style="padding-top: 15px;display: none">
9
9
  <div class="layui-col-md6">
10
- <labeL class="layui-form-label required">学校/单位:</labeL>
10
+ <labeL class="layui-form-label required">单位:</labeL>
11
11
  <div class="layui-input-block">
12
12
  <div id="school_id" style="width: 600px;"></div>
13
13
  </div>
14
14
  </div>
15
15
  <div class="layui-col-md6">
16
- <labeL class="layui-form-label">院系/部门:</labeL>
16
+ <labeL class="layui-form-label">部门:</labeL>
17
17
  <div class="layui-input-block">
18
18
  <div id="department_id" style="width: 600px;"></div>
19
19
  </div>
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
  <div class="layui-row" style="padding-top: 15px">
23
23
  <div class="layui-col-md6">
24
- <labeL class="layui-form-label">学校负责人:</labeL>
24
+ <labeL class="layui-form-label">单位联系人:</labeL>
25
25
  <div class="layui-input-block">
26
26
  <input type="text" name="manager_name" autocomplete="off" placeholder="请输入姓名" value="<%= @idea&.manager_name %>" class="layui-input">
27
27
  </div>
@@ -35,7 +35,7 @@
35
35
  </div>
36
36
  <div class="layui-row" style="padding-top: 15px">
37
37
  <div class="layui-col-md6">
38
- <labeL class="layui-form-label required">销售负责人:</labeL>
38
+ <labeL class="layui-form-label required">销售经理:</labeL>
39
39
  <div class="layui-input-block">
40
40
  <div id="sale_staff_id"></div>
41
41
  </div>
@@ -51,11 +51,11 @@
51
51
  <div class="layui-col-md6">
52
52
  <labeL class="layui-form-label required">项目名称:</labeL>
53
53
  <div class="layui-input-block">
54
- <input type="text" name="name" autocomplete="off" lay-verify="required" lay-reqtext="项目名称不能为空" placeholder="请输入项目名称" value="<%= @idea&.name %>" class="layui-input">
54
+ <div id="business_id" style="width: 600px;"></div>
55
55
  </div>
56
56
  </div>
57
57
  <div class="layui-col-md6">
58
- <labeL class="layui-form-label">方案指派人:</labeL>
58
+ <labeL class="layui-form-label">方案经理:</labeL>
59
59
  <div class="layui-input-block">
60
60
  <div id="new_staff_id"></div>
61
61
  </div>
@@ -77,7 +77,7 @@
77
77
  </div>
78
78
  <div class="layui-row" style="padding-top: 15px">
79
79
  <div class="layui-col-md6">
80
- <labeL class="layui-form-label">类型:</labeL>
80
+ <labeL class="layui-form-label">定制类型:</labeL>
81
81
  <div class="layui-input-block">
82
82
  <%= select_tag "types", options_for_select(EducodeSales::Idea.types.keys, @idea&.types), { 'lay-filter': 'types', include_blank: false } %>
83
83
  </div>
@@ -89,11 +89,25 @@
89
89
  </div>
90
90
  </div>
91
91
  </div>
92
+ <div class="layui-row" style="padding-top: 15px">
93
+ <div class="layui-col-md6">
94
+ <labeL class="layui-form-label">方案类型:</labeL>
95
+ <div class="layui-input-block">
96
+ <%= select_tag "idea_type", options_for_select(EducodeSales::Idea.idea_types.keys, @idea&.idea_type), { 'lay-filter': 'idea_type', include_blank: false } %>
97
+ </div>
98
+ </div>
99
+ <div class="layui-col-md6">
100
+ <labeL class="layui-form-label">指派人:</labeL>
101
+ <div class="layui-input-block">
102
+ <div id="other_staff_ids"></div>
103
+ </div>
104
+ </div>
105
+ </div>
92
106
  <div class="layui-row" style="padding-top: 15px">
93
107
  <div class="layui-col-md6">
94
108
  <labeL class="layui-form-label">硬件规模(万):</labeL>
95
109
  <div class="layui-input-block">
96
- <input type="number" name="hardware" autocomplete="off" placeholder="请输入硬件规模" value="<%= @idea&.hardware %>" class="layui-input">
110
+ <input type="number" name="hardware" autocomplete="off" placeholder="请输入硬件规模" value="<%= @idea&.hardware %>" class="layui-input">
97
111
  </div>
98
112
  </div>
99
113
  <div class="layui-col-md6">
@@ -126,9 +140,9 @@
126
140
  </div>
127
141
  </div>
128
142
  <div class="layui-row" style="padding-top: 15px">
129
- <labeL class="layui-form-label">反馈情况:</labeL>
143
+ <labeL class="layui-form-label">需求说明:</labeL>
130
144
  <div class="layui-input-block">
131
- <textarea name="content" placeholder="反馈情况" class="layui-textarea"><%= @idea&.content.to_s %></textarea>
145
+ <textarea name="content" placeholder="需求说明" class="layui-textarea"><%= @idea&.content.to_s %></textarea>
132
146
  </div>
133
147
  </div>
134
148
  <div class="layui-row" style="padding-top: 15px">
@@ -228,6 +242,40 @@
228
242
  }
229
243
  })
230
244
 
245
+ var business_list = xmSelect.render({
246
+ el: '#business_id',
247
+ remoteSearch: true,
248
+ autoRow: true,
249
+ radio: true,
250
+ delay: 1000,
251
+ tips: '支持名称搜索,请至少输入一个字符',
252
+ searchTips: '支持名称搜索,请至少输入一个字符',
253
+ paging: true,
254
+ pageRemote: true,
255
+ filterable: true,
256
+ remoteMethod: function (val, cb, show, pageIndex) {
257
+ if (!val) {
258
+ return cb([]);
259
+ }
260
+ $.ajax('/missions/staff_business', {
261
+ method: 'get',
262
+ data: {
263
+ q: val,
264
+ page: pageIndex
265
+ },
266
+ dataType: 'json',
267
+ success: function (res) {
268
+ var data = res.data;
269
+ if (res.code == 0) {
270
+ cb(res.data, res.count);
271
+ } else {
272
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
273
+ }
274
+ }
275
+ })
276
+ }
277
+ })
278
+
231
279
  var department_list = xmSelect.render({
232
280
  el: '#department_id',
233
281
  remoteSearch: true,
@@ -281,6 +329,9 @@
281
329
  school_list.setValue(
282
330
  gon.school_list
283
331
  )
332
+ business_list.setValue(
333
+ gon.business_list
334
+ )
284
335
 
285
336
 
286
337
  form.render();
@@ -324,6 +375,13 @@
324
375
  multiple: true
325
376
  })
326
377
 
378
+ var other_staff_list = xmSelect.render({
379
+ el: '#other_staff_ids',
380
+ data: gon.staffs,
381
+ filterable: true,
382
+ multiple: true
383
+ })
384
+
327
385
 
328
386
  var attachment_list = xmSelect.render({
329
387
  el: '#attachment_ids',
@@ -354,6 +412,7 @@
354
412
  sale_staff_list.setValue(gon.sale_staff_value)
355
413
  assist_staff_list.setValue(gon.assist_staff_value)
356
414
  attachment_list.setValue(gon.attachment_list)
415
+ other_staff_list.setValue(gon.other_staff_value)
357
416
 
358
417
  var department_id = gon.value;
359
418
  var department = selectInput.render({
@@ -387,15 +446,12 @@
387
446
  data.field.staff_id = staff_list.getValue('valueStr');
388
447
  data.field.sale_staff_id = sale_staff_list.getValue('valueStr');
389
448
  data.field.assist_staff_ids = assist_staff_list.getValue('valueStr');
449
+ data.field.other_staff_ids = other_staff_list.getValue('valueStr');
390
450
  data.field.attachment_ids = attachment_list.getValue('valueStr');
391
451
  var schools = [];
392
452
  school_list.getValue().forEach(function (d) {
393
453
  schools.push(d.value);
394
454
  })
395
- if (schools.length == 0) {
396
- layer.alert("请选择学校");
397
- return false;
398
- }
399
455
  data.field.school_id = schools[0];
400
456
 
401
457
  var departments = [];
@@ -403,6 +459,12 @@
403
459
  departments.push(d.value);
404
460
  })
405
461
  data.field.department_id = departments[0];
462
+
463
+ var business = [];
464
+ business_list.getValue().forEach(function (d) {
465
+ business.push(d.value);
466
+ })
467
+ data.field.business_id = business[0];
406
468
  request.authPut("missions/ideas/" + parent.id, data.field, function (res) {
407
469
  if (res.success == false) {
408
470
  layer.alert(res.msg)
@@ -0,0 +1,157 @@
1
+ <%= Gon::Base.render_data %>
2
+ <script type="text/html" id="toolbarDemo_f">
3
+ <div class="layui-btn-container">
4
+ <span class="table-label">附件信息</span>
5
+ <% if can? :upload_file, EducodeSales::Idea %>
6
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
7
+ <% end %>
8
+ </div>
9
+ </script>
10
+
11
+ <table class="layui-hide" id="file" lay-filter="file"></table>
12
+
13
+ <script type="text/html" id="currentTableBar_file">
14
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
15
+ <% if can? :download_file, EducodeSales::Idea %>
16
+ <a href="/missions/upload_files/download?id={{d.id}}" class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="download">下载</a>
17
+ <% end %>
18
+ <% if can? :delete_file, EducodeSales::Idea %>
19
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
20
+ <% end %>
21
+ </script>
22
+
23
+ <!--<script type="text/html" id="showchance">-->
24
+ <!-- <a href="/missions/businesses" class="layui-table-link">{{ d.chance }}</a>-->
25
+ <!--</script>-->
26
+
27
+ <script>
28
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
29
+ var $ = layui.jquery,
30
+ form = layui.form,
31
+ table = layui.table,
32
+ request = layui.request,
33
+ upload = layui.upload;
34
+ miniPage = layui.miniPage;
35
+
36
+
37
+ var idea_id = parent.idea_id;
38
+ table.render({
39
+ elem: '#file',
40
+ url: '/missions/ideas/' + idea_id + '/files',
41
+ toolbar: '#toolbarDemo_f',
42
+ defaultToolbar: [],
43
+ cols: [
44
+ [
45
+ {
46
+ field: 'id',
47
+ width: 80,
48
+ title: '序号', type: 'numbers',
49
+ },
50
+ {
51
+ field: 'name',
52
+ title: '文件名'
53
+ },
54
+ {
55
+ field: 'size',
56
+ width: 100,
57
+ title: '文件大小',
58
+ },
59
+ {
60
+ field: 'created_on',
61
+ width: 200,
62
+ title: '上传时间',
63
+ sort: true
64
+ },
65
+ {
66
+ field: 'upload_person',
67
+ width: 80,
68
+ totalRow:true,
69
+ title: '上传人',
70
+ },
71
+ {
72
+ title: '操作',
73
+ width: 200,
74
+ toolbar: '#currentTableBar_file',
75
+ align: "center"
76
+ }
77
+ ]
78
+ ],
79
+ limit: 20,
80
+ limits: [10,15,20,30,40,50,60,70,80,90],
81
+ page: true
82
+ });
83
+
84
+
85
+ var sort = {};
86
+ table.on('sort(file)', function (obj) {
87
+ sort.field = obj.field;
88
+ sort.order = obj.type;
89
+ table.reload('file', {
90
+ initSort: obj,
91
+ where: {
92
+ sort: sort
93
+ }
94
+ });
95
+ })
96
+
97
+
98
+ table.on('toolbar(file)', function (obj) {
99
+ if (obj.event === 'upload_file') { //
100
+ idea_id = parent.idea_id;
101
+ var content = miniPage.getHrefContent('/missions/ideas/upload_file');
102
+ var openWH = miniPage.getOpenWidthHeight();
103
+ import_index = layer.open({
104
+ title: '上传文件',
105
+ type: 1,
106
+ shade: 0.2,
107
+ shadeClose: true,
108
+ area: ['200px', '100px'],
109
+ offset: 'auto',
110
+ closeBtn: 0,
111
+ content: content,
112
+ });
113
+ $(window).on("resize", function () {
114
+ layer.full(index);
115
+ });
116
+ }
117
+ });
118
+
119
+
120
+ table.on('tool(file)', function (obj) {
121
+ var data = obj.data;
122
+ var id = data.id
123
+ name = data.disk_filename
124
+ folder = gon.folder
125
+ if (obj.event === 'preview') {
126
+ if (data.content_type.split("/")[0] === "image"){
127
+ layer.photos({
128
+ photos: { "data": [{"src": '/files/educode_sales/' + name}] }
129
+ ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
130
+ });
131
+ }else if (data.content_type.split("/")[1] === "pdf"){
132
+ var pdf = '/files/educode_sales/' + name;
133
+ var openWH = miniPage.getOpenWidthHeight();
134
+ layer.open({
135
+ title: data.name,
136
+ type: 2,
137
+ area: ['1000px', '750px'],
138
+ fixed: false, //不固定
139
+ maxmin: true,
140
+ content: pdf
141
+ });
142
+ }else{
143
+ layer.msg("附件不支持预览,请下载查看!")
144
+ }
145
+ return false;
146
+ }else if (obj.event === 'delete') {
147
+ layer.confirm('确定删除' + data.name, function (index) {
148
+ request.delete('missions/upload_files/' + data.id + '?disk_filename=' + data.disk_filename, {}, function (res) {
149
+ layer.close(index);
150
+ table.reload("file")
151
+ })
152
+ });
153
+ }
154
+ });
155
+
156
+ });
157
+ </script>
@@ -0,0 +1,13 @@
1
+ json.data do
2
+ json.array! @files do |d|
3
+ json.id d.id
4
+ json.name d.filename
5
+ json.size d.filesize < 1000000 ? (d.filesize.to_f / 1000).round(2).to_s + 'KB' : (d.filesize.to_f / 1000000).round(2).to_s + 'MB'
6
+ json.created_on d.created_on.to_s
7
+ json.upload_person d.author.real_name
8
+ json.disk_filename d.disk_filename
9
+ json.content_type d.content_type
10
+ end
11
+ end
12
+ json.code 0
13
+ json.count @files.total_count
@@ -0,0 +1,14 @@
1
+ json.data do
2
+ json.array! @data do |d|
3
+ json.(d, *d.attributes.keys)
4
+ json.name d.idea&.business&.name || d.idea&.name
5
+ json.school_name d.idea&.business&.department&.school&.name
6
+ json.created_at d.created_at.strftime("%Y-%m-%d %H:%M:%S")
7
+ json.staff d.staff&.user&.real_name
8
+ json.sale_staff d.sale_staff&.user&.real_name
9
+ json.idea_staff d.idea_staff&.user&.real_name
10
+ end
11
+ end
12
+
13
+ json.code 0
14
+ json.count @data.total_count