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.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/activities_controller.rb +122 -40
- data/app/controllers/educode_sales/businesses_controller.rb +83 -2
- data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
- data/app/controllers/educode_sales/plans_controller.rb +173 -11
- data/app/controllers/educode_sales/recycles_controller.rb +11 -1
- data/app/controllers/educode_sales/teachers_controller.rb +4 -4
- data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
- data/app/models/educode_sales/activity.rb +21 -4
- data/app/models/educode_sales/activity_follow_up.rb +13 -0
- data/app/models/educode_sales/activity_staff.rb +1 -1
- data/app/models/educode_sales/assessments_setting.rb +2 -2
- data/app/models/educode_sales/business.rb +3 -0
- data/app/models/educode_sales/business_info.rb +9 -0
- data/app/models/educode_sales/business_level.rb +11 -0
- data/app/models/educode_sales/business_watch.rb +6 -0
- data/app/models/educode_sales/sale_plan.rb +3 -1
- data/app/models/educode_sales/staff.rb +2 -0
- data/app/views/educode_sales/activities/_follows.html.erb +222 -0
- data/app/views/educode_sales/activities/_index.html.erb +491 -0
- data/app/views/educode_sales/activities/edit.html.erb +109 -53
- data/app/views/educode_sales/activities/files.html.erb +157 -0
- data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
- data/app/views/educode_sales/activities/follow_ups.json.jbuilder +19 -0
- data/app/views/educode_sales/activities/index.html.erb +13 -349
- data/app/views/educode_sales/activities/index.json.jbuilder +11 -3
- data/app/views/educode_sales/activities/new.html.erb +87 -46
- data/app/views/educode_sales/activities/new_follow_up.html.erb +56 -0
- data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
- data/app/views/educode_sales/businesses/edit.html.erb +48 -6
- data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/index.html.erb +10 -0
- data/app/views/educode_sales/businesses/new.html.erb +1 -1
- data/app/views/educode_sales/businesses/no_permission.html.erb +2 -0
- data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
- data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
- data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
- data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
- data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
- data/app/views/educode_sales/plans/index.html.erb +8 -0
- data/app/views/educode_sales/plans/new_year.html.erb +204 -0
- data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
- data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
- data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
- data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
- data/app/views/educode_sales/recycles/index.html.erb +26 -22
- data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
- data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
- data/config/routes.rb +22 -0
- data/db/migrate/20230329135141_create_educode_sales_business_watches.rb +17 -0
- data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +31 -0
- data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +31 -7
- data/app/assets/images/educode_sales/indexlogo.png +0 -0
@@ -4,58 +4,98 @@
|
|
4
4
|
<div class="layui-form-item">
|
5
5
|
<div class="layui-inline">
|
6
6
|
<label class="layui-form-label required">活动名称</label>
|
7
|
-
<div class="layui-input-block">
|
8
|
-
<input type="text" name="name" required lay-verify="required"
|
9
|
-
class="layui-input" value="<%= @activity.name %>">
|
7
|
+
<div class="layui-input-block" style="width: 200px;">
|
8
|
+
<input type="text" name="name" required lay-verify="required" class="layui-input" value="<%= @activity.name %>">
|
10
9
|
</div>
|
11
10
|
</div>
|
11
|
+
<div class="layui-inline">
|
12
|
+
<label class="layui-form-label required">活动类型</label>
|
13
|
+
<div class="layui-input-block" style="width: 200px;">
|
14
|
+
<%= select_tag "clazz_id", options_for_select(@clazz, @activity.clazz_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="layui-inline">
|
18
|
+
<label class="layui-form-label required">活动状态</label>
|
19
|
+
<div class="layui-input-block" style="width: 200px;">
|
20
|
+
<%= select_tag "state_id", options_for_select(EducodeSales::Activity.state_ids.keys, @activity.state_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
|
21
|
+
</div>
|
22
|
+
</div>
|
12
23
|
<div class="layui-inline">
|
13
24
|
<label class="layui-form-label required">活动时间</label>
|
14
|
-
<div class="layui-input-block">
|
25
|
+
<div class="layui-input-block" style="width: 200px;">
|
15
26
|
<input type="text" name="start_at" required lay-verify="required" class="layui-input" id="time" placeholder="请选择时间"
|
16
27
|
value="<%= @activity.start_at&.to_s(:date) %>">
|
17
28
|
</div>
|
18
29
|
</div>
|
19
30
|
<div class="layui-inline">
|
20
31
|
<label class="layui-form-label required">活动天数</label>
|
21
|
-
<div class="layui-input-block">
|
32
|
+
<div class="layui-input-block" style="width: 200px;">
|
22
33
|
<input type="text" name="days" required lay-verify="required"
|
23
34
|
class="layui-input" value="<%= @activity.days %>">
|
24
35
|
</div>
|
25
36
|
</div>
|
37
|
+
<div class="layui-inline">
|
38
|
+
<label class="layui-form-label">销售经理</label>
|
39
|
+
<div class="layui-input-block" style="width: 200px;">
|
40
|
+
<div id="sales_list" style="width: 163px;"></div>
|
41
|
+
</div>
|
42
|
+
</div>
|
26
43
|
<div class="layui-inline">
|
27
44
|
<label class="layui-form-label">生态经理</label>
|
28
|
-
<div class="layui-input-block">
|
45
|
+
<div class="layui-input-block" style="width: 200px;">
|
29
46
|
<div id="staff_manage_list" style="width: 163px;"></div>
|
30
47
|
</div>
|
31
48
|
</div>
|
32
49
|
<div class="layui-inline">
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
</div>
|
50
|
+
<label class="layui-form-label">主办方</label>
|
51
|
+
<div class="layui-input-block" style="width: 200px;">
|
52
|
+
<input type="text" name="sponsor" class="layui-input" value="<%= @activity.sponsor %>">
|
37
53
|
</div>
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
54
|
+
</div>
|
55
|
+
<div class="layui-inline">
|
56
|
+
<label class="layui-form-label">联系人</label>
|
57
|
+
<div class="layui-input-block" style="width: 200px;">
|
58
|
+
<input type="text" name="linkman" class="layui-input" value="<%= @activity.linkman %>">
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
<div class="layui-inline">
|
62
|
+
<label class="layui-form-label">联系电话</label>
|
63
|
+
<div class="layui-input-block" style="width: 200px;">
|
64
|
+
<input type="text" name="phone" class="layui-input" value="<%= @activity.phone %>">
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
<div class="layui-inline">
|
68
|
+
<label class="layui-form-label">规模</label>
|
69
|
+
<div class="layui-input-block" style="width: 200px;">
|
70
|
+
<input type="text" name="scale" class="layui-input" value="<%= @activity.scale %>">
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
<div class="layui-inline">
|
74
|
+
<label class="layui-form-label">会议地点</label>
|
75
|
+
<div class="layui-input-block" style="width: 200px;">
|
76
|
+
<input type="text" name="address" class="layui-input" value="<%= @activity.address %>">
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
<div class="layui-inline">
|
80
|
+
<label class="layui-form-label">会议形式</label>
|
81
|
+
<div class="layui-input-block" style="width: 200px;">
|
82
|
+
<input type="text" name="meeting_form" class="layui-input" value="<%= @activity.meeting_form %>">
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
<div class="layui-inline">
|
86
|
+
<label class="layui-form-label">邀请专家</label>
|
87
|
+
<div class="layui-input-block">
|
88
|
+
<div id="invitation_list" style="width: 600px;"></div>
|
43
89
|
</div>
|
44
90
|
</div>
|
45
|
-
<div class="layui-form-item">
|
46
91
|
<div class="layui-inline">
|
47
|
-
<label class="layui-form-label"
|
92
|
+
<label class="layui-form-label">协助人员</label>
|
48
93
|
<div class="layui-input-block">
|
49
|
-
|
50
|
-
<span id="attachment">
|
51
|
-
<% if @activity.attachment %>
|
52
|
-
<%= link_to @activity.attachment&.filename.to_s, "/missions/upload_files/download?id=#{@activity.attachment&.id}", target: '_blank' %>
|
53
|
-
<a href="javascript:;" style="color:red;" id="delete">删除</a>
|
54
|
-
<% end %>
|
55
|
-
</span>
|
56
|
-
<button type="button" class="layui-btn" id="upload_file">上传文件</button>
|
94
|
+
<div id="staff_assist_list" style="width: 600px;"></div>
|
57
95
|
</div>
|
58
96
|
</div>
|
97
|
+
</div>
|
98
|
+
<div class="layui-form-item">
|
59
99
|
<div class="layui-inline" style="padding-left: 30px">
|
60
100
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="data-reset-btn">提交
|
61
101
|
</button>
|
@@ -99,33 +139,25 @@
|
|
99
139
|
}
|
100
140
|
})
|
101
141
|
|
102
|
-
upload.render({
|
103
|
-
elem: '#upload_file',
|
104
|
-
url: '/missions/upload_files',
|
105
|
-
auto: true,
|
106
|
-
accept: 'file',
|
107
|
-
done: function (res) {
|
108
|
-
layer.msg('上传成功');
|
109
|
-
$("#attachment_id").val(res.attachment_id);
|
110
|
-
document.getElementById("attachment").innerHTML = '<a target="_blank" href="' + res.url+ '">' + res.filename + '</a><a href="javascript:;" style="color:red;" id="delete">删除</a>';
|
111
|
-
}
|
112
|
-
});
|
113
142
|
|
114
143
|
var staff_manage = xmSelect.render({
|
115
144
|
el: '#staff_manage_list',
|
116
145
|
data: gon.staff_manage,
|
117
146
|
filterable: true,
|
118
147
|
})
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
148
|
+
var sales_manage = xmSelect.render({
|
149
|
+
el: '#sales_list',
|
150
|
+
name: 'sales_id',
|
151
|
+
radio: true,
|
152
|
+
data: gon.sales_manage,
|
123
153
|
filterable: true,
|
124
154
|
})
|
125
|
-
|
126
|
-
|
155
|
+
|
156
|
+
|
157
|
+
var staff_assist = xmSelect.render({
|
158
|
+
el: '#staff_assist_list',
|
127
159
|
filterable: true,
|
128
|
-
name: '
|
160
|
+
name: 'staff_assist_id',
|
129
161
|
remoteSearch: true,
|
130
162
|
remoteMethod: function(val, cb, show){
|
131
163
|
if(!val){
|
@@ -139,27 +171,51 @@
|
|
139
171
|
}
|
140
172
|
})
|
141
173
|
},
|
142
|
-
data: gon.
|
174
|
+
data: gon.assistss
|
143
175
|
})
|
144
176
|
|
145
|
-
|
146
|
-
|
147
|
-
|
177
|
+
var invitation_select = xmSelect.render({
|
178
|
+
el: '#invitation_list',
|
179
|
+
filterable: true,
|
180
|
+
name: 'invitation_ids',
|
181
|
+
remoteSearch: true,
|
182
|
+
remoteMethod: function(val, cb, show){
|
183
|
+
if(!val){
|
184
|
+
return cb([]);
|
185
|
+
}
|
186
|
+
request.get('missions/search_edu_user?q=' + val, {}, function (res) {
|
187
|
+
if (res.data.length == 0) {
|
188
|
+
cb([{value: val, name: val}])
|
189
|
+
} else {
|
190
|
+
cb(res.data);
|
191
|
+
}
|
192
|
+
})
|
193
|
+
},
|
194
|
+
data: gon.invitation_list
|
148
195
|
})
|
149
196
|
|
150
197
|
//监听提交
|
151
198
|
form.on('submit(data-reset-btn)', function (data) {
|
152
199
|
data.field.staff_manage_id = staff_manage.getValue('value');
|
153
|
-
|
154
|
-
|
155
|
-
|
200
|
+
var staff_assist_id = [];
|
201
|
+
staff_assist.getValue().forEach(function(d) {
|
202
|
+
if (typeof(d.value) == 'number') {
|
203
|
+
staff_assist_id.push([d.value, d.name]);
|
204
|
+
} else {
|
205
|
+
staff_assist_id.push(['', d.name]);
|
206
|
+
}
|
207
|
+
})
|
208
|
+
var invitation_ids = [];
|
209
|
+
invitation_select.getValue().forEach(function(d) {
|
156
210
|
if (typeof(d.value) == 'number') {
|
157
|
-
|
211
|
+
invitation_ids.push([d.value, d.name]);
|
158
212
|
} else {
|
159
|
-
|
213
|
+
invitation_ids.push(['', d.name]);
|
214
|
+
|
160
215
|
}
|
161
216
|
})
|
162
|
-
data.field.
|
217
|
+
data.field.invitation_ids = invitation_ids;
|
218
|
+
data.field.staff_assist_id = staff_assist_id;
|
163
219
|
request.authPut("missions/activities/" + <%= @activity.id %>, data.field, function (res) {
|
164
220
|
if (res.success === false) {
|
165
221
|
layer.alert(res.msg)
|
@@ -0,0 +1,157 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<script type="text/html" id="toolbarDemo">
|
3
|
+
<div class="layui-btn-container">
|
4
|
+
<span class="table-label">附件信息</span>
|
5
|
+
<% if can? :upload_file, EducodeSales::Activity %>
|
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::Activity %>
|
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::Activity %>
|
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 activity_id = parent.activity_id;
|
38
|
+
table.render({
|
39
|
+
elem: '#file',
|
40
|
+
url: '/missions/activities/' + activity_id +'/files',
|
41
|
+
toolbar: '#toolbarDemo',
|
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
|
+
activity_id = parent.activity_id;
|
101
|
+
var content = miniPage.getHrefContent('/missions/activities/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,19 @@
|
|
1
|
+
json.data do
|
2
|
+
json.array! @data do |d|
|
3
|
+
json.id d.id
|
4
|
+
json.description d.description
|
5
|
+
json.name d.activity.name
|
6
|
+
json.info_id d.info_id
|
7
|
+
json.clazz_id d.activity.clazz_id
|
8
|
+
json.staff d.activity.sales&.user&.real_name || d.activity.staff&.user&.real_name
|
9
|
+
json.staff_manage d.activity.manages.map { |d| d.staff.user.real_name}.uniq.join("、")
|
10
|
+
json.follow_up d.staff.user.real_name
|
11
|
+
json.created_at d.created_at.to_s
|
12
|
+
json.state_id d.activity.state_id
|
13
|
+
json.advise d.advise || ''
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
json.code 0
|
19
|
+
json.count @data.total_count
|