educode_sales 0.4.7 → 0.5.1
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/assets/images/educode_sales//345/233/236/346/224/266/347/253/231.png +0 -0
- data/app/controllers/educode_sales/businesses_controller.rb +81 -5
- data/app/controllers/educode_sales/follow_ups_controller.rb +2 -2
- data/app/controllers/educode_sales/home_controller.rb +1 -1
- data/app/controllers/educode_sales/operation_plans_controller.rb +12 -4
- data/app/controllers/educode_sales/operations_controller.rb +1 -1
- data/app/controllers/educode_sales/plans_controller.rb +26 -18
- data/app/controllers/educode_sales/recycles_controller.rb +95 -0
- data/app/controllers/educode_sales/sale_reports_controller.rb +1 -1
- data/app/controllers/educode_sales/sale_trends_controller.rb +6 -6
- data/app/controllers/educode_sales/sales_controller.rb +2 -2
- data/app/controllers/educode_sales/staffs_controller.rb +4 -4
- data/app/controllers/educode_sales/upload_files_controller.rb +105 -0
- data/app/models/concerns/deletable.rb +8 -0
- data/app/models/educode_sales/application_record.rb +2 -0
- data/app/models/educode_sales/business.rb +15 -2
- data/app/models/educode_sales/common.rb +4 -0
- data/app/models/educode_sales/follow_up.rb +4 -2
- data/app/models/educode_sales/recycle.rb +5 -0
- data/app/models/educode_sales/sale_plan.rb +4 -0
- data/app/models/educode_sales/sale_report.rb +2 -0
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +15 -0
- data/app/views/educode_sales/businesses/edit_plan.html.erb +2 -2
- data/app/views/educode_sales/businesses/file.html.erb +154 -0
- data/app/views/educode_sales/businesses/index.html.erb +65 -3
- data/app/views/educode_sales/businesses/index.json.jbuilder +3 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +22 -1
- data/app/views/educode_sales/businesses/show_follow.html.erb +54 -12
- data/app/views/educode_sales/businesses/show_follow.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +80 -2
- data/app/views/educode_sales/businesses/time_line.html.erb +62 -0
- data/app/views/educode_sales/businesses/upload_file.html.erb +43 -0
- data/app/views/educode_sales/operation_plans/_monthly.html.erb +4 -4
- data/app/views/educode_sales/operation_plans/_weekly.html.erb +4 -4
- data/app/views/educode_sales/operation_plans/edit_month.html.erb +6 -6
- data/app/views/educode_sales/operation_plans/edit_week.html.erb +7 -7
- data/app/views/educode_sales/operation_plans/new_month.html.erb +17 -2
- data/app/views/educode_sales/operation_plans/new_week.html.erb +21 -6
- data/app/views/educode_sales/operation_reports/audit.html.erb +20 -14
- data/app/views/educode_sales/operation_reports/edit.html.erb +11 -11
- data/app/views/educode_sales/operation_reports/show.html.erb +20 -14
- data/app/views/educode_sales/plans/_monthly.html.erb +4 -4
- data/app/views/educode_sales/plans/_weekly.html.erb +4 -4
- data/app/views/educode_sales/plans/edit_month.html.erb +6 -6
- data/app/views/educode_sales/plans/edit_week.html.erb +7 -7
- data/app/views/educode_sales/plans/new_month.html.erb +1 -1
- data/app/views/educode_sales/plans/new_monthly.html.erb +6 -6
- data/app/views/educode_sales/plans/new_week.html.erb +2 -2
- data/app/views/educode_sales/plans/new_weekly.html.erb +7 -7
- data/app/views/educode_sales/recycles/_business.html.erb +122 -0
- data/app/views/educode_sales/recycles/_monthPlan.html.erb +123 -0
- data/app/views/educode_sales/recycles/_monthly.html.erb +121 -0
- data/app/views/educode_sales/recycles/_weekPlan.html.erb +128 -0
- data/app/views/educode_sales/recycles/_weekly.html.erb +122 -0
- data/app/views/educode_sales/recycles/business.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/index.html.erb +58 -0
- data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/monthly.json.jbuilder +15 -0
- data/app/views/educode_sales/recycles/weekPlan.json.jbuilder +16 -0
- data/app/views/educode_sales/recycles/weekly.json.jbuilder +15 -0
- data/app/views/educode_sales/sale_reports/audit.html.erb +21 -12
- data/app/views/educode_sales/sale_reports/edit.html.erb +9 -9
- data/app/views/educode_sales/sale_reports/show.html.erb +12 -6
- data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
- data/app/views/educode_sales/teachers/add_keys.html.erb +2 -2
- data/app/views/educode_sales/teachers/index.html.erb +1 -1
- data/app/views/educode_sales/teachers/show_follow.html.erb +9 -3
- data/app/views/educode_sales/upload_files/index.json.jbuilder +13 -0
- data/app/views/layouts/educode_sales/application.html.erb +3 -0
- data/config/routes.rb +27 -0
- data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +6 -0
- data/db/migrate/20211102085743_add_bidded_date_educode_sales_follow_ups.rb +6 -0
- data/db/migrate/20211109015617_create_educode_sales_recycles.rb +25 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +24 -2
@@ -1,10 +1,23 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
class Business < ApplicationRecord
|
3
|
+
|
3
4
|
belongs_to :staff
|
4
5
|
belongs_to :department
|
5
6
|
belongs_to :last_follow_up, class_name: 'FollowUp', optional: true
|
6
7
|
|
7
|
-
has_many :sale_plans
|
8
|
-
has_many :follow_ups
|
8
|
+
has_many :sale_plans
|
9
|
+
has_many :follow_ups
|
10
|
+
|
11
|
+
default_scope -> {where(deleted_at: nil)}
|
12
|
+
|
13
|
+
def soft_destroy(user_id)
|
14
|
+
self.update(deleted_at: Time.now)
|
15
|
+
self.sale_plans.each do |d|
|
16
|
+
d.soft_destroy(user_id)
|
17
|
+
end
|
18
|
+
self.follow_ups.update_all(deleted_at: Time.now)
|
19
|
+
EducodeSales::Recycle.create(source: self, deleter_id: user_id)
|
20
|
+
end
|
21
|
+
|
9
22
|
end
|
10
23
|
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
class FollowUp < ApplicationRecord
|
3
|
+
include ::Deletable
|
3
4
|
belongs_to :business, counter_cache: true
|
4
5
|
belongs_to :place, optional: true
|
5
|
-
has_many :money_plans
|
6
|
+
has_many :money_plans
|
6
7
|
has_many :key_person
|
7
8
|
has_many :teachers, through: :key_person
|
8
|
-
has_many :assign_follow_ups
|
9
|
+
has_many :assign_follow_ups
|
9
10
|
belongs_to :staff
|
10
11
|
belongs_to :stage, class_name: 'Common'
|
11
12
|
belongs_to :clazz, class_name: 'Common'
|
13
|
+
default_scope -> {where(deleted_at: nil)}
|
12
14
|
|
13
15
|
|
14
16
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
class SalePlan < ApplicationRecord
|
3
|
+
include ::Deletable
|
3
4
|
belongs_to :business
|
4
5
|
belongs_to :staff
|
6
|
+
validates :business_id, presence: true
|
5
7
|
|
6
8
|
validates :month, presence: true
|
9
|
+
|
10
|
+
default_scope -> {where(deleted_at: nil)}
|
7
11
|
end
|
8
12
|
end
|
@@ -41,6 +41,21 @@
|
|
41
41
|
id="invitation_at_edit" placeholder="请选择日期">
|
42
42
|
</div>
|
43
43
|
</div>
|
44
|
+
<div class="layui-inline">
|
45
|
+
<label class="layui-form-label">中标时间</label>
|
46
|
+
<div class="layui-input-inline">
|
47
|
+
<input type="text" class="layui-input" value="<%= @follow_up.bidded_date %>" name="bidded_date"
|
48
|
+
id="invitation_at_edit" placeholder="请选择日期">
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
<br>
|
52
|
+
<div class="layui-inline">
|
53
|
+
<label class="layui-form-label">签单时间</label>
|
54
|
+
<div class="layui-input-inline">
|
55
|
+
<input type="text" class="layui-input" value="<%= @follow_up.signed_date %>" name="signed_date"
|
56
|
+
id="invitation_at_edit" placeholder="请选择日期">
|
57
|
+
</div>
|
58
|
+
</div>
|
44
59
|
<div class="layui-inline">
|
45
60
|
<label class="layui-form-label">验收时间</label>
|
46
61
|
<div class="layui-input-inline">
|
@@ -56,13 +56,13 @@
|
|
56
56
|
</div>
|
57
57
|
</script>
|
58
58
|
<script type="text/html" id="return_money_tabar">
|
59
|
-
{{# if(parent.is_latest){ }}
|
59
|
+
{{# if(parent.is_latest && parent.flag){ }}
|
60
60
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">保存</a>
|
61
61
|
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
62
62
|
{{# } }}
|
63
63
|
</script>
|
64
64
|
<script>
|
65
|
-
if(!parent.is_latest){
|
65
|
+
if(!parent.is_latest || !parent.flag){
|
66
66
|
document.getElementById("show_plan_box").style.display="none";//隐藏
|
67
67
|
}
|
68
68
|
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate'], function () {
|
@@ -0,0 +1,154 @@
|
|
1
|
+
<script type="text/html" id="toolbarDemo">
|
2
|
+
<div class="layui-btn-container">
|
3
|
+
<span class="table-label">附件信息</span>
|
4
|
+
<%# if can? :create, EducodeSales::file %>
|
5
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
|
6
|
+
<%# end %>
|
7
|
+
</div>
|
8
|
+
</script>
|
9
|
+
|
10
|
+
<table class="layui-hide" id="file" lay-filter="file"></table>
|
11
|
+
|
12
|
+
<script type="text/html" id="currentTableBar_file">
|
13
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
|
14
|
+
<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>
|
15
|
+
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
16
|
+
</script>
|
17
|
+
|
18
|
+
<script type="text/html" id="showchance">
|
19
|
+
<a href="/missions/businesses" class="layui-table-link">{{ d.chance }}</a>
|
20
|
+
</script>
|
21
|
+
|
22
|
+
<script>
|
23
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
|
24
|
+
var $ = layui.jquery,
|
25
|
+
form = layui.form,
|
26
|
+
table = layui.table,
|
27
|
+
request = layui.request,
|
28
|
+
upload = layui.upload;
|
29
|
+
miniPage = layui.miniPage;
|
30
|
+
|
31
|
+
|
32
|
+
var business_id = parent.id
|
33
|
+
table.render({
|
34
|
+
elem: '#file',
|
35
|
+
url: '/missions/upload_files?business_id='+business_id,
|
36
|
+
toolbar: '#toolbarDemo',
|
37
|
+
defaultToolbar: [],
|
38
|
+
cols: [
|
39
|
+
[
|
40
|
+
{
|
41
|
+
field: 'id',
|
42
|
+
width: 80,
|
43
|
+
title:'序号',type: 'numbers',
|
44
|
+
},
|
45
|
+
{
|
46
|
+
field: 'name',
|
47
|
+
title: '文件名'
|
48
|
+
},
|
49
|
+
{
|
50
|
+
field: 'size',
|
51
|
+
width: 100,
|
52
|
+
title: '文件大小',
|
53
|
+
},
|
54
|
+
{
|
55
|
+
field: 'created_on',
|
56
|
+
width: 200,
|
57
|
+
title: '上传时间',
|
58
|
+
sort: true
|
59
|
+
},
|
60
|
+
{
|
61
|
+
field: 'upload_person',
|
62
|
+
width: 80,
|
63
|
+
totalRow:true,
|
64
|
+
title: '上传人',
|
65
|
+
},
|
66
|
+
{
|
67
|
+
title: '操作',
|
68
|
+
width: 200,
|
69
|
+
toolbar: '#currentTableBar_file',
|
70
|
+
align: "center"
|
71
|
+
}
|
72
|
+
]
|
73
|
+
],
|
74
|
+
limit: 20,
|
75
|
+
limits: [10,15,20,30,40,50,60,70,80,90],
|
76
|
+
page: true
|
77
|
+
});
|
78
|
+
|
79
|
+
|
80
|
+
var sort = {};
|
81
|
+
table.on('sort(file)', function (obj) {
|
82
|
+
sort.field = obj.field;
|
83
|
+
sort.order = obj.type;
|
84
|
+
table.reload('file', {
|
85
|
+
initSort: obj,
|
86
|
+
where: {
|
87
|
+
sort: sort
|
88
|
+
}
|
89
|
+
});
|
90
|
+
})
|
91
|
+
|
92
|
+
|
93
|
+
table.on('toolbar(file)', function (obj) {
|
94
|
+
if (obj.event === 'upload_file') { //
|
95
|
+
id =parent.id
|
96
|
+
var content = miniPage.getHrefContent('/missions/businesses/upload_file');
|
97
|
+
var openWH = miniPage.getOpenWidthHeight();
|
98
|
+
import_index = layer.open({
|
99
|
+
title: '上传文件',
|
100
|
+
type: 1,
|
101
|
+
shade: 0.2,
|
102
|
+
shadeClose: true,
|
103
|
+
area: ['200px', '100px'],
|
104
|
+
offset: 'auto',
|
105
|
+
closeBtn: 0,
|
106
|
+
content: content,
|
107
|
+
});
|
108
|
+
$(window).on("resize", function () {
|
109
|
+
layer.full(index);
|
110
|
+
});
|
111
|
+
}
|
112
|
+
});
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
table.on('tool(file)', function (obj) {
|
117
|
+
var data = obj.data;
|
118
|
+
var id = data.id
|
119
|
+
name = data.disk_filename
|
120
|
+
if (obj.event === 'preview') {
|
121
|
+
if (data.content_type.split("/")[0] === "image"){
|
122
|
+
// var img = "<img src='/images/" + name + "' />";
|
123
|
+
layer.photos({
|
124
|
+
photos: { "data": [{"src": '/images/'+name}] }
|
125
|
+
,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
|
126
|
+
});
|
127
|
+
}else if (data.content_type.split("/")[1] === "pdf"){
|
128
|
+
var pdf = '/images/' + name;
|
129
|
+
console.log(pdf);
|
130
|
+
var openWH = miniPage.getOpenWidthHeight();
|
131
|
+
layer.open({
|
132
|
+
title: data.name,
|
133
|
+
type: 2,
|
134
|
+
area: ['1000px', '750px'],
|
135
|
+
fixed: false, //不固定
|
136
|
+
maxmin: true,
|
137
|
+
content: pdf
|
138
|
+
});
|
139
|
+
}else{
|
140
|
+
layer.msg("附件不支持预览,请下载查看!")
|
141
|
+
}
|
142
|
+
return false;
|
143
|
+
}else if (obj.event === 'delete') {
|
144
|
+
layer.confirm('确定删除' + data.name, function (index) {
|
145
|
+
request.delete('missions/upload_files/' + data.id + '?disk_filename=' + data.disk_filename, {}, function (res) {
|
146
|
+
layer.close(index);
|
147
|
+
table.reload("file")
|
148
|
+
})
|
149
|
+
});
|
150
|
+
}
|
151
|
+
});
|
152
|
+
|
153
|
+
});
|
154
|
+
</script>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<div class="layui-inline">
|
6
6
|
<label class="layui-form-label">商机名称</label>
|
7
7
|
<div class="layui-input-inline">
|
8
|
-
<input type="text" name="name" autocomplete="off" class="layui-input">
|
8
|
+
<input type="text" name="name" autocomplete="off" class="layui-input" value="<%=params[:name] %>">
|
9
9
|
</div>
|
10
10
|
</div>
|
11
11
|
<div class="layui-inline">
|
@@ -53,7 +53,7 @@
|
|
53
53
|
<div class="layui-inline">
|
54
54
|
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
55
55
|
</button>
|
56
|
-
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">搜索
|
56
|
+
<button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">搜索
|
57
57
|
</button>
|
58
58
|
</div>
|
59
59
|
</div>
|
@@ -169,6 +169,18 @@
|
|
169
169
|
title: '招标时间',
|
170
170
|
sort: true
|
171
171
|
},
|
172
|
+
{
|
173
|
+
field: 'bidded_date',
|
174
|
+
width: 105,
|
175
|
+
title: '中标时间',
|
176
|
+
sort: true
|
177
|
+
},
|
178
|
+
{
|
179
|
+
field: 'signed_date',
|
180
|
+
width: 105,
|
181
|
+
title: '签单时间',
|
182
|
+
sort: true
|
183
|
+
},
|
172
184
|
{
|
173
185
|
field: 'reception_at',
|
174
186
|
width: 105,
|
@@ -248,6 +260,12 @@
|
|
248
260
|
case 'edit':
|
249
261
|
edit(id);
|
250
262
|
break;
|
263
|
+
case 'file':
|
264
|
+
file(id, elem.data('name'));
|
265
|
+
break;
|
266
|
+
case 'time_line':
|
267
|
+
time_line(id, elem.data('name'));
|
268
|
+
break;
|
251
269
|
case 'delete':
|
252
270
|
deleteBusiness(id, elem.data('name'));
|
253
271
|
break;
|
@@ -292,6 +310,41 @@
|
|
292
310
|
layer.full(sindex);
|
293
311
|
});
|
294
312
|
}
|
313
|
+
function time_line(id,name) {
|
314
|
+
var content = miniPage.getHrefContent('/missions/businesses/time_line?business_id=' + id);
|
315
|
+
var openWH = miniPage.getOpenWidthHeight();
|
316
|
+
sindex = layer.open({
|
317
|
+
title: '商机列表/'+name+'的跟进时间线',
|
318
|
+
type: 1,
|
319
|
+
shade: 0.2,
|
320
|
+
maxmin: true,
|
321
|
+
shadeClose: true,
|
322
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
323
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
324
|
+
content: content
|
325
|
+
});
|
326
|
+
$(window).on("resize", function () {
|
327
|
+
layer.full(sindex);
|
328
|
+
});
|
329
|
+
}
|
330
|
+
function file(id, name) {
|
331
|
+
id = id
|
332
|
+
var content = miniPage.getHrefContent('/missions/businesses/file?business_id=' + id);
|
333
|
+
var openWH = miniPage.getOpenWidthHeight();
|
334
|
+
sindex = layer.open({
|
335
|
+
title: '商机列表/'+name+'的附件信息',
|
336
|
+
type: 1,
|
337
|
+
shade: 0.2,
|
338
|
+
// maxmin: true,
|
339
|
+
shadeClose: true,
|
340
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
341
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
342
|
+
content: content
|
343
|
+
});
|
344
|
+
$(window).on("resize", function () {
|
345
|
+
// layer.full(sindex);
|
346
|
+
});
|
347
|
+
}
|
295
348
|
|
296
349
|
function month(id) {
|
297
350
|
var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + id);
|
@@ -320,6 +373,13 @@
|
|
320
373
|
});
|
321
374
|
}
|
322
375
|
|
376
|
+
function hn(){
|
377
|
+
$("#search_bt").trigger("click");
|
378
|
+
}
|
379
|
+
$(document).ready(function(){
|
380
|
+
window.onload=hn;
|
381
|
+
});
|
382
|
+
|
323
383
|
|
324
384
|
var sort = {}, search = {};
|
325
385
|
table.on('sort(businesses_table)', function (obj) {
|
@@ -337,7 +397,8 @@
|
|
337
397
|
// 监听搜索操作
|
338
398
|
form.on('submit(search_bussiness)', function (data) {
|
339
399
|
search = data.field
|
340
|
-
|
400
|
+
console.log(search);
|
401
|
+
table.reload('businesses_table', {
|
341
402
|
page: {
|
342
403
|
curr: 1
|
343
404
|
},
|
@@ -533,6 +594,7 @@
|
|
533
594
|
});
|
534
595
|
} else if (obj.event === 'show_follow') {
|
535
596
|
business_id = obj.data.id
|
597
|
+
business_name = data.name
|
536
598
|
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + id);
|
537
599
|
openWH = miniPage.getOpenWidthHeight();
|
538
600
|
index = layer.open({
|
@@ -14,6 +14,8 @@ json.data do
|
|
14
14
|
json.stage d.last_follow_up&.stage&.name
|
15
15
|
json.invitation_at d.last_follow_up&.invitation_at.to_s
|
16
16
|
json.reception_at d.last_follow_up&.reception_at.to_s
|
17
|
+
json.bidded_date d.last_follow_up&.bidded_date.to_s
|
18
|
+
json.signed_date d.last_follow_up&.signed_date.to_s
|
17
19
|
json.total_amount d.last_follow_up&.total_amount
|
18
20
|
json.return_money d.return_money
|
19
21
|
json.place d.last_follow_up&.place&.name
|
@@ -22,7 +24,7 @@ json.data do
|
|
22
24
|
json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
|
23
25
|
json.current_staff_id @current_admin.id
|
24
26
|
json.staff_id d.staff_id
|
25
|
-
json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s :
|
27
|
+
json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s : d.created_at.to_s
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -42,6 +42,23 @@
|
|
42
42
|
placeholder="请选择日期">
|
43
43
|
</div>
|
44
44
|
</div>
|
45
|
+
<div class="layui-inline">
|
46
|
+
<label class="layui-form-label">中标时间</label>
|
47
|
+
<div class="layui-input-inline">
|
48
|
+
<input type="text" class="layui-input" name="bidded_date" autocomplete="off" id="invitation_at_add"
|
49
|
+
value="<%= @last_follow_up&.bidded_date%>"
|
50
|
+
placeholder="请选择日期">
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
<br>
|
54
|
+
<div class="layui-inline">
|
55
|
+
<label class="layui-form-label">签单时间</label>
|
56
|
+
<div class="layui-input-inline">
|
57
|
+
<input type="text" class="layui-input" name="signed_date" autocomplete="off" id="invitation_at_add"
|
58
|
+
value="<%= @last_follow_up&.signed_date%>"
|
59
|
+
placeholder="请选择日期">
|
60
|
+
</div>
|
61
|
+
</div>
|
45
62
|
<div class="layui-inline">
|
46
63
|
<label class="layui-form-label">验收时间</label>
|
47
64
|
<div class="layui-input-inline">
|
@@ -80,9 +97,13 @@
|
|
80
97
|
</div>
|
81
98
|
<div class="layui-form-item">
|
82
99
|
<label class="layui-form-label">指定跟进人</label>
|
83
|
-
<div class="layui-input-inline">
|
100
|
+
<div class="layui-input-inline" style="z-index: 10000">
|
84
101
|
<div id="assign_follow" style="width: 512px;"></div>
|
85
102
|
</div>
|
103
|
+
<div class="layui-inline" style="padding: 9px 15px">
|
104
|
+
<label class="layui-form-label" style="padding-left: 220px"></label>
|
105
|
+
指定跟进人和商机创建者,同时拥有对该商机的管理权限
|
106
|
+
</div>
|
86
107
|
</div>
|
87
108
|
<div class="layui-form-item layui-form-text">
|
88
109
|
<label class="layui-form-label required">最新进展</label>
|
@@ -1,6 +1,7 @@
|
|
1
1
|
<script type="text/html" id="toolbarDemo_follow">
|
2
2
|
<div class="layui-btn-container">
|
3
3
|
<span class="table-label">跟进记录</span>
|
4
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="time_line"> 时间线视图>></button>
|
4
5
|
<% if can? :add_follow, EducodeSales::Business %>
|
5
6
|
<% if @current_admin.is_admin %>
|
6
7
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add"> 添加跟进记录</button>
|
@@ -8,17 +9,20 @@
|
|
8
9
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="add"> 添加跟进记录</button>
|
9
10
|
<% end %>
|
10
11
|
<% end %>
|
12
|
+
<span class="table-label pull-right" style="padding-right: 20px">温馨提示:仅可以在24小时之内,编辑/删除最新的跟进记录</span>
|
11
13
|
</div>
|
12
14
|
</script>
|
13
|
-
<div class="edit-table">
|
14
|
-
<
|
15
|
+
<div class="edit-table tool">
|
16
|
+
<div class="z-index">
|
17
|
+
<table class="layui-hide" id="sale_plan_follow_table" lay-filter="sale_plan_follow_table"></table>
|
18
|
+
</div>
|
15
19
|
<table class="layui-hide" id="unfinish_table" lay-filter="unfinish_table" style="min-height: 300px;"></table>
|
16
20
|
</div>
|
17
21
|
<script type="text/html" id="currentTableBar_follow">
|
18
22
|
<% if can? :follow, EducodeSales::Business %>
|
19
23
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="show">查看</a>
|
20
24
|
<% end %>
|
21
|
-
{{# if(d.is_latest){ }}
|
25
|
+
{{# if(d.is_latest && d.flag){ }}
|
22
26
|
<% if can? :update_follow, EducodeSales::Business %>
|
23
27
|
<% if @current_admin.is_admin %>
|
24
28
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
@@ -107,11 +111,27 @@
|
|
107
111
|
title: '关键人',
|
108
112
|
templet: '#add_keys'
|
109
113
|
},
|
114
|
+
{
|
115
|
+
field: 'money_plans_count',
|
116
|
+
width: 120,
|
117
|
+
title: '回款计划',
|
118
|
+
templet: '#edit_plan'
|
119
|
+
},
|
110
120
|
{
|
111
121
|
field: 'invitation_at',
|
112
122
|
width: 110,
|
113
123
|
title: '招标时间',
|
114
124
|
},
|
125
|
+
{
|
126
|
+
field: 'bidded_date',
|
127
|
+
width: 110,
|
128
|
+
title: '中标时间',
|
129
|
+
},
|
130
|
+
{
|
131
|
+
field: 'signed_date',
|
132
|
+
width: 110,
|
133
|
+
title: '签单时间',
|
134
|
+
},
|
115
135
|
{
|
116
136
|
field: 'reception_at',
|
117
137
|
width: 110,
|
@@ -137,12 +157,7 @@
|
|
137
157
|
width: 100,
|
138
158
|
title: '已回款',
|
139
159
|
},
|
140
|
-
|
141
|
-
field: 'money_plans_count',
|
142
|
-
width: 120,
|
143
|
-
title: '回款计划',
|
144
|
-
templet: '#edit_plan'
|
145
|
-
},
|
160
|
+
|
146
161
|
{
|
147
162
|
field: 'place',
|
148
163
|
width: 200,
|
@@ -201,6 +216,25 @@
|
|
201
216
|
$(window).on("resize", function () {
|
202
217
|
layer.full(index);
|
203
218
|
});
|
219
|
+
} else if (obj.event === 'time_line') { // 监听添加操作
|
220
|
+
layer.closeAll()
|
221
|
+
business_id = parent.business_id
|
222
|
+
business_name = parent.business_name
|
223
|
+
var content = miniPage.getHrefContent('/missions/businesses/time_line?business_id=' + id);
|
224
|
+
var openWH = miniPage.getOpenWidthHeight();
|
225
|
+
sindex = layer.open({
|
226
|
+
title: '商机列表/'+ parent.business_name +'的跟进时间线',
|
227
|
+
type: 1,
|
228
|
+
shade: 0.2,
|
229
|
+
maxmin: true,
|
230
|
+
shadeClose: true,
|
231
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
232
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
233
|
+
content: content
|
234
|
+
});
|
235
|
+
$(window).on("resize", function () {
|
236
|
+
layer.full(sindex);
|
237
|
+
});
|
204
238
|
}
|
205
239
|
});
|
206
240
|
|
@@ -219,7 +253,7 @@
|
|
219
253
|
} else if (obj.event === 'show') { // 监听添加操作
|
220
254
|
var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
|
221
255
|
var openWH = miniPage.getOpenWidthHeight();
|
222
|
-
|
256
|
+
show_index = layer.open({
|
223
257
|
title: '查看商机跟进记录',
|
224
258
|
type: 1,
|
225
259
|
shade: 0.2,
|
@@ -255,6 +289,7 @@
|
|
255
289
|
content = miniPage.getHrefContent('/missions/teachers/add_keys?follow_up_id=' + obj.data.id);
|
256
290
|
openWH = miniPage.getOpenWidthHeight();
|
257
291
|
is_latest = obj.data.is_latest
|
292
|
+
flag = obj.data.flag
|
258
293
|
keyindex = layer.open({
|
259
294
|
title: '关键人',
|
260
295
|
type: 1,
|
@@ -276,6 +311,7 @@
|
|
276
311
|
content = miniPage.getHrefContent('/missions/businesses/edit_plan');
|
277
312
|
openWH = miniPage.getOpenWidthHeight();
|
278
313
|
is_latest = obj.data.is_latest
|
314
|
+
flag = obj.data.flag
|
279
315
|
plan_index = layer.open({
|
280
316
|
title: '回款计划',
|
281
317
|
type: 1,
|
@@ -495,5 +531,11 @@
|
|
495
531
|
|
496
532
|
});
|
497
533
|
</script>
|
498
|
-
|
499
|
-
|
534
|
+
<style>
|
535
|
+
.z-index .layui-table-tool{
|
536
|
+
z-index: 10000; !important;
|
537
|
+
}
|
538
|
+
.tool .layui-table-tool-temp{
|
539
|
+
padding-right: 30px; !important;
|
540
|
+
}
|
541
|
+
</style>
|
@@ -7,6 +7,8 @@ json.data do
|
|
7
7
|
json.teachers_count d.key_people_count
|
8
8
|
json.invitation_at d.invitation_at&.to_s(:date)
|
9
9
|
json.reception_at d.reception_at&.to_s(:date)
|
10
|
+
json.bidded_date d.bidded_date&.to_s(:date)
|
11
|
+
json.signed_date d.signed_date&.to_s(:date)
|
10
12
|
json.total_amount d.total_amount
|
11
13
|
json.actual_amount d.actual_amount
|
12
14
|
json.divide_amount d.divide_amount ? d.divide_amount : ""
|
@@ -15,6 +17,7 @@ json.data do
|
|
15
17
|
json.money_plans_count d.money_plans_count
|
16
18
|
json.money d.money_plans.where(clazz: 1).sum(:amount).round(2)
|
17
19
|
json.is_latest d.id == @latest&.id
|
20
|
+
json.flag d.created_at.present? ? (Time.now - d.created_at).to_f/3600 < 24 : false
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|