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.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/contracts_controller.rb +309 -0
- data/app/controllers/educode_sales/follow_ups_controller.rb +1 -1
- data/app/controllers/educode_sales/home_controller.rb +7 -0
- data/app/controllers/educode_sales/ideas_controller.rb +146 -76
- data/app/controllers/educode_sales/roles_controller.rb +2 -1
- data/app/controllers/educode_sales/upload_files_controller.rb +3 -0
- data/app/models/educode_sales/assign_staff.rb +6 -0
- data/app/models/educode_sales/contract_date_list.rb +6 -0
- data/app/models/educode_sales/follow_up.rb +6 -0
- data/app/models/educode_sales/idea.rb +16 -5
- data/app/models/educode_sales/idea_follow.rb +11 -0
- data/app/models/educode_sales/permission.rb +2 -1
- data/app/models/educode_sales/role_area.rb +2 -1
- data/app/views/educode_sales/businesses/_contract_list.html.erb +160 -0
- data/app/views/educode_sales/contracts/_follows.html.erb +323 -0
- data/app/views/educode_sales/contracts/_list.html.erb +596 -0
- data/app/views/educode_sales/contracts/follow_ups.json.jbuilder +23 -0
- data/app/views/educode_sales/contracts/index.html.erb +50 -0
- data/app/views/educode_sales/contracts/index.json.jbuilder +74 -0
- data/app/views/educode_sales/contracts/list.js.erb +1 -0
- data/app/views/educode_sales/contracts/new_follow_up.html.erb +671 -0
- data/app/views/educode_sales/home/staff_business.json.jbuilder +9 -0
- data/app/views/educode_sales/idea_recycles/detail.html.erb +4 -4
- data/app/views/educode_sales/idea_recycles/index.html.erb +5 -5
- data/app/views/educode_sales/ideas/_follows.html.erb +258 -0
- data/app/views/educode_sales/ideas/_index.html.erb +544 -0
- data/app/views/educode_sales/ideas/detail.html.erb +7 -7
- data/app/views/educode_sales/ideas/edit.html.erb +77 -15
- data/app/views/educode_sales/ideas/files.html.erb +157 -0
- data/app/views/educode_sales/ideas/files.json.jbuilder +13 -0
- data/app/views/educode_sales/ideas/follow_ups.json.jbuilder +14 -0
- data/app/views/educode_sales/ideas/index.html.erb +12 -353
- data/app/views/educode_sales/ideas/index.json.jbuilder +7 -1
- data/app/views/educode_sales/ideas/new.html.erb +81 -25
- data/app/views/educode_sales/ideas/new_follow_up.html.erb +105 -0
- data/app/views/educode_sales/ideas/search_new.html.erb +1 -1
- data/app/views/educode_sales/ideas/show_schools.html.erb +84 -0
- data/app/views/educode_sales/ideas/show_schools.json.jbuilder +12 -0
- data/app/views/educode_sales/ideas/show_teachers.html.erb +372 -0
- data/app/views/educode_sales/ideas/upload_file.html.erb +43 -0
- data/app/views/educode_sales/projects/detail.html.erb +1 -1
- data/app/views/educode_sales/projects/edit.html.erb +1 -1
- data/app/views/educode_sales/roles/edit.html.erb +16 -0
- data/app/views/layouts/educode_sales/application.html.erb +5 -5
- data/config/routes.rb +19 -0
- data/db/migrate/20230227061043_create_educode_sales_ideas.rb +2 -2
- data/db/migrate/20230430023424_add_plan_signed_date_to_follow_ups.rb +21 -0
- data/db/migrate/20230430040332_create_educode_sales_contract_date_lists.rb +15 -0
- data/db/migrate/20230430104708_create_idea_follows.rb +25 -0
- data/db/migrate/20230430121335_add_permissions_for_ideas.rb +16 -0
- data/db/migrate/20230430134710_create_educode_sales_assign_staffs.rb +11 -0
- data/lib/educode_sales/version.rb +1 -1
- 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"
|
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"
|
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"
|
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"
|
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
|
-
<
|
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"
|
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"
|
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"
|
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"
|
143
|
+
<labeL class="layui-form-label">需求说明:</labeL>
|
130
144
|
<div class="layui-input-block">
|
131
|
-
<textarea name="content" placeholder="
|
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
|