educode_sales 1.10.8 → 1.10.9
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/businesses_controller.rb +46 -1
- data/app/controllers/educode_sales/follow_ups_controller.rb +29 -6
- data/app/controllers/educode_sales/money_plan_records_controller.rb +4 -0
- data/app/controllers/educode_sales/money_plans_controller.rb +8 -0
- data/app/models/educode_sales/follow_up.rb +2 -0
- data/app/views/educode_sales/assessments/_attendances.html.erb +12 -4
- data/app/views/educode_sales/assessments/index.html.erb +3 -1
- data/app/views/educode_sales/businesses/edit.html.erb +44 -38
- data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +9 -0
- data/app/views/educode_sales/businesses/index.html.erb +48 -36
- data/app/views/educode_sales/businesses/index.json.jbuilder +6 -1
- data/app/views/educode_sales/businesses/new.html.erb +92 -3
- data/app/views/educode_sales/businesses/time_line.html.erb +32 -0
- data/app/views/educode_sales/follow_ups/add_assign.html.erb +42 -0
- data/app/views/educode_sales/money_plan_records/_index.html.erb +4 -3
- data/app/views/educode_sales/money_plan_records/index.json.jbuilder +1 -0
- data/app/views/educode_sales/money_plans/_index.html.erb +8 -1
- data/app/views/educode_sales/money_plans/index.json.jbuilder +1 -0
- data/config/routes.rb +2 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73d98a4d83213078f656abfeb070db43d2a6a594e8a273a8ace4bad8165dc541
|
4
|
+
data.tar.gz: 52b10fb147e17a25bd4f3d5b155676cbbb76d61cf6f799b2249edc6428b1ca1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9808f3c65fd410beaf59ef94d4be34b7ba5f25c6377975eead142d6943f5c20007c70b6cd297150473c3e569a29142e17edf89671788e77173389711b2124684
|
7
|
+
data.tar.gz: 5b2c468c9b57723d26804fd589637a5f4f877da54be8a88d180b5aec8adca7b69d08bbd28a901b9c6c0cde03e78755e3cc4750a4c700f62f9c02041456d58b73
|
@@ -295,6 +295,32 @@ module EducodeSales
|
|
295
295
|
end
|
296
296
|
end
|
297
297
|
|
298
|
+
#商机来源
|
299
|
+
if params[:q].present? && params[:q][:source_way].present?
|
300
|
+
if params[:q].present? && params[:q][:source_name].present?
|
301
|
+
if ["会议活动", "渠道代理", "客户"].include?(params[:q][:source_way])
|
302
|
+
if params[:q][:source_way] == '会议活动'
|
303
|
+
sourcable_id = EducodeSales::Activity.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
304
|
+
elsif params[:q][:source_way] == '渠道代理'
|
305
|
+
sourcable_id = EducodeSales::Place.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
306
|
+
elsif params[:q][:source_way] == '客户'
|
307
|
+
sourcable_id = EducodeSales::Department.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
|
308
|
+
end
|
309
|
+
|
310
|
+
if sourcable_id.present?
|
311
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way], sourcable_id: sourcable_id)
|
312
|
+
else
|
313
|
+
@businesses = @businesses.none
|
314
|
+
end
|
315
|
+
else
|
316
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way]).where("sourcable_type like ?", "%#{params[:q][:source_name]}%")
|
317
|
+
end
|
318
|
+
else
|
319
|
+
@businesses = @businesses.where(source_way: params[:q][:source_way])
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
|
298
324
|
# 商机变化
|
299
325
|
if params[:q][:clazz_changes].present?
|
300
326
|
clazz_changes = EducodeSales::BusinessClazzChange.clazz_changes_value[params[:q][:clazz_changes].to_s]
|
@@ -406,7 +432,26 @@ module EducodeSales
|
|
406
432
|
|
407
433
|
def create
|
408
434
|
department = Department.find(params[:department_id])
|
409
|
-
|
435
|
+
if params[:sourcable_type].present?
|
436
|
+
if params[:source_way] == '会议活动'
|
437
|
+
params[:sourcable_type] = 'EducodeSales::Activity'
|
438
|
+
elsif params[:source_way] == '渠道代理'
|
439
|
+
params[:sourcable_type] = 'EducodeSales::Place'
|
440
|
+
elsif params[:source_way] == '客户'
|
441
|
+
params[:sourcable_type] = 'EducodeSales::Department'
|
442
|
+
else
|
443
|
+
params[:sourcable_id] = ""
|
444
|
+
end
|
445
|
+
end
|
446
|
+
if ['会议活动', '渠道代理', '客户'].include?(params[:source_way] ) && params[:sourcable_id].blank?
|
447
|
+
params[:sourcable_type] = ""
|
448
|
+
end
|
449
|
+
if params[:sourcable_type].blank?
|
450
|
+
params[:sourcable_id] = ""
|
451
|
+
end
|
452
|
+
business = @current_admin.businesses.build(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id, clazz_id: params[:clazz_id],
|
453
|
+
sourcable_type: params[:sourcable_type], sourcable_id: params[:sourcable_id], source_way: params[:source_way])
|
454
|
+
|
410
455
|
if business.save
|
411
456
|
render_success
|
412
457
|
else
|
@@ -33,13 +33,17 @@ module EducodeSales
|
|
33
33
|
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
34
34
|
@businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
|
35
35
|
business_ids = @businesses.pluck(:id)
|
36
|
-
|
36
|
+
|
37
|
+
# 指定查看人
|
38
|
+
follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
|
39
|
+
@follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
|
37
40
|
when '区域'
|
38
41
|
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
|
39
42
|
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
40
43
|
@businesses = Business.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_businesses.staff_id = #{@current_admin.id} OR educode_sales_businesses.id in (?)", school_ids, business_ids)
|
41
44
|
business_ids = @businesses.pluck(:id)
|
42
|
-
|
45
|
+
follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
|
46
|
+
@follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
|
43
47
|
else
|
44
48
|
@follow_ups = FollowUp.all
|
45
49
|
end
|
@@ -308,7 +312,7 @@ module EducodeSales
|
|
308
312
|
end
|
309
313
|
|
310
314
|
def update_tags
|
311
|
-
|
315
|
+
follow_up = FollowUp.find(params[:id])
|
312
316
|
tags = []
|
313
317
|
tags_name = []
|
314
318
|
params[:tags].split(",").uniq.each do |d|
|
@@ -317,15 +321,34 @@ module EducodeSales
|
|
317
321
|
end
|
318
322
|
tags_name << tag.name
|
319
323
|
tag.save unless tag.persisted?
|
320
|
-
t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id:
|
324
|
+
t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id: follow_up.id)
|
321
325
|
t.staff = @current_admin
|
322
326
|
tags << t
|
323
327
|
end
|
324
|
-
|
325
|
-
|
328
|
+
follow_up.follow_up_tags = tags
|
329
|
+
follow_up.save
|
326
330
|
render json: {success: true, tags: tags_name}
|
327
331
|
end
|
328
332
|
|
333
|
+
def add_assign
|
334
|
+
follow_up = FollowUp.find(params[:id])
|
335
|
+
staff_ids = follow_up.watch_follow_ups.pluck(:staff_id)
|
336
|
+
|
337
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
338
|
+
gon.assign_watch= Staff.joins(:user).where.not(job_type: common.id).where.not(role_id: 11).map { |d| {name: d.user.real_name, value: d.id, selected: staff_ids.include?(d.id)} }
|
339
|
+
render layout: false
|
340
|
+
end
|
341
|
+
|
342
|
+
def update_assign
|
343
|
+
follow_up = FollowUp.find(params[:id])
|
344
|
+
staffs = []
|
345
|
+
params[:staff_ids].split(",").each do |staff_id|
|
346
|
+
staffs << WatchFollowUp.find_or_initialize_by(staff_id: staff_id, follow_up_id: follow_up.id)
|
347
|
+
end
|
348
|
+
follow_up.watch_follow_ups = staffs
|
349
|
+
follow_up.save
|
350
|
+
render json: {success: true, tags: staffs.map { |d| d.staff.user.real_name }}
|
351
|
+
end
|
329
352
|
|
330
353
|
private
|
331
354
|
|
@@ -6,8 +6,12 @@ module EducodeSales
|
|
6
6
|
def index
|
7
7
|
respond_to do |format|
|
8
8
|
format.html do
|
9
|
+
|
9
10
|
end
|
10
11
|
format.js do
|
12
|
+
gon.edit_record = can?(:update_record, EducodeSales::MoneyPlan)
|
13
|
+
gon.edit_record_self = can?(:update_record_self, EducodeSales::MoneyPlan)
|
14
|
+
gon.staff_id = @current_admin.id
|
11
15
|
end
|
12
16
|
format.json do
|
13
17
|
@money_plan_records = MoneyPlanRecord.left_joins(:money_plan_claims).group("educode_sales_money_plan_records.id").select("educode_sales_money_plan_records.*, COUNT(educode_sales_money_plan_claims.id) AS claim_num")
|
@@ -7,6 +7,7 @@ module EducodeSales
|
|
7
7
|
authorize! :read, MoneyPlan
|
8
8
|
respond_to do |format|
|
9
9
|
format.html do
|
10
|
+
|
10
11
|
end
|
11
12
|
format.json do
|
12
13
|
last_follow_up_ids = Business.all.pluck(:last_follow_up_id)
|
@@ -48,6 +49,9 @@ module EducodeSales
|
|
48
49
|
format.html do
|
49
50
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
50
51
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
52
|
+
gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
|
53
|
+
gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
|
54
|
+
gon.staff_id = @current_admin.id
|
51
55
|
end
|
52
56
|
|
53
57
|
end
|
@@ -67,6 +71,10 @@ module EducodeSales
|
|
67
71
|
@money_plan = MoneyPlan.find(params[:id])
|
68
72
|
gon.business_id = @money_plan.business_id
|
69
73
|
gon.business = [{value: @money_plan.business_id.to_s, name: @money_plan.business&.name}]
|
74
|
+
|
75
|
+
gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
|
76
|
+
gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
|
77
|
+
gon.staff_id = @current_admin.id
|
70
78
|
render layout: false
|
71
79
|
end
|
72
80
|
|
@@ -23,6 +23,8 @@ module EducodeSales
|
|
23
23
|
has_many :teachers, through: :key_person
|
24
24
|
has_many :assign_follow_ups
|
25
25
|
has_many :follow_up_tags, dependent: :destroy
|
26
|
+
|
27
|
+
has_many :watch_follow_ups, dependent: :destroy
|
26
28
|
belongs_to :staff
|
27
29
|
belongs_to :stage, class_name: 'Common'
|
28
30
|
belongs_to :clazz, class_name: 'Common'
|
@@ -34,8 +34,12 @@
|
|
34
34
|
<script type="text/html" id="toolbarDemo">
|
35
35
|
<div class="layui-btn-container">
|
36
36
|
<span class="table-label">签到列表</span>
|
37
|
-
|
38
|
-
|
37
|
+
<% if can?(:import_attendances, EducodeSales::AssessmentsSetting) %>
|
38
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import_attendances"><i class="layui-icon layui-icon-add-circle-fine"></i> 批量导入签到数据</button>
|
39
|
+
<% end %>
|
40
|
+
<% if can?(:batch_delete, EducodeSales::AssessmentsSetting) %>
|
41
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm layui-btn-danger data-delete-btn pull-right" lay-event="batch_delete"><i class="layui-icon layui-icon-delete"></i> 批量删除签到数据</button>
|
42
|
+
<% end %>
|
39
43
|
</div>
|
40
44
|
</script>
|
41
45
|
|
@@ -44,8 +48,12 @@
|
|
44
48
|
</div>
|
45
49
|
|
46
50
|
<script type="text/html" id="currentTableBar">
|
47
|
-
|
48
|
-
|
51
|
+
<% if can?(:edit_attendance, EducodeSales::AssessmentsSetting) %>
|
52
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
53
|
+
<% end %>
|
54
|
+
<% if can?(:delete_attendance, EducodeSales::AssessmentsSetting) %>
|
55
|
+
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
56
|
+
<% end %>
|
49
57
|
</script>
|
50
58
|
|
51
59
|
<script>
|
@@ -6,7 +6,9 @@
|
|
6
6
|
<% if can?(:show, EducodeSales::AssessmentsSetting) %>
|
7
7
|
<li data="assessments" > 考核指标设置</li>
|
8
8
|
<%end %>
|
9
|
-
|
9
|
+
<% if can?(:show_attendances, EducodeSales::AssessmentsSetting) %>
|
10
|
+
<li class="">签到记录</li>
|
11
|
+
<% end %>
|
10
12
|
</ul>
|
11
13
|
<!--<div class="layuimini-main min-height-table"></div>-->
|
12
14
|
<div class="layui-tab-content">
|
@@ -68,34 +68,38 @@
|
|
68
68
|
$ = layui.$;
|
69
69
|
selectInput = layui.selectInput;
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
71
|
+
if ($("#levels").length > 0) {
|
72
|
+
var levels_select = xmSelect.render({
|
73
|
+
el: '#levels',
|
74
|
+
name: 'level_ids',
|
75
|
+
data: gon.levels,
|
76
|
+
on: function(data) {
|
77
|
+
var is_secret = false;
|
78
|
+
data.arr.forEach(function(i) {
|
79
|
+
if (i.name == '战略型' || i.name == '保密型') {
|
80
|
+
is_secret = true;
|
81
|
+
}
|
82
|
+
})
|
83
|
+
if (is_secret) {
|
84
|
+
$("#watch_ids_wraper").removeClass('layui-hide')
|
85
|
+
} else {
|
86
|
+
$("#watch_ids_wraper").addClass('layui-hide')
|
80
87
|
}
|
81
|
-
})
|
82
|
-
if (is_secret) {
|
83
|
-
$("#watch_ids_wraper").removeClass('layui-hide')
|
84
|
-
} else {
|
85
|
-
$("#watch_ids_wraper").addClass('layui-hide')
|
86
88
|
}
|
89
|
+
})
|
90
|
+
}
|
91
|
+
if ($("#watch_ids").length > 0) {
|
92
|
+
var watch_id_select = xmSelect.render({
|
93
|
+
el: '#watch_ids',
|
94
|
+
name: 'watch_ids',
|
95
|
+
data: gon.watche_ids,
|
96
|
+
filterable: true,
|
97
|
+
})
|
98
|
+
if (gon.is_secret) {
|
99
|
+
$("#watch_ids_wraper").removeClass("layui-hide")
|
87
100
|
}
|
88
|
-
})
|
89
|
-
|
90
|
-
var watch_id_select = xmSelect.render({
|
91
|
-
el: '#watch_ids',
|
92
|
-
name: 'watch_ids',
|
93
|
-
data: gon.watche_ids,
|
94
|
-
filterable: true,
|
95
|
-
})
|
96
|
-
if (gon.is_secret) {
|
97
|
-
$("#watch_ids_wraper").removeClass("layui-hide")
|
98
101
|
}
|
102
|
+
|
99
103
|
var source_way = gon.source_way;
|
100
104
|
form.on('select(source_id)', function(data){
|
101
105
|
source_way = data.value;
|
@@ -162,20 +166,22 @@
|
|
162
166
|
|
163
167
|
}
|
164
168
|
});
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
169
|
+
if ($("#merge_business").length > 0) {
|
170
|
+
var merge_business_select = xmSelect.render({
|
171
|
+
el: '#merge_business',
|
172
|
+
filterable: true,
|
173
|
+
name: 'merge_business_ids',
|
174
|
+
remoteSearch: true,
|
175
|
+
remoteMethod: function(val, cb, show){
|
176
|
+
request.get('missions/businesses/search?id=' + parent.id + "&q=" + val, {},
|
177
|
+
function(res) {
|
178
|
+
cb(res.data)
|
179
|
+
})
|
180
|
+
},
|
181
|
+
data: []
|
182
|
+
})
|
183
|
+
}
|
184
|
+
|
179
185
|
|
180
186
|
|
181
187
|
var sourcable_id = gon.sourcable_id;
|
@@ -32,6 +32,15 @@ json.data do
|
|
32
32
|
json.divide_money d.divide_amount
|
33
33
|
json.budget_amount d.budget_amount
|
34
34
|
json.area d.department&.school&.province
|
35
|
+
|
36
|
+
json.keys_person_count d.last_follow_up.present? ? EducodeSales::KeyPerson.where("follow_up_id = #{d.last_follow_up.id}").count : 0
|
37
|
+
json.rival d.last_follow_up&.rival || ''
|
38
|
+
|
39
|
+
if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
|
40
|
+
json.source "#{d.source_way} #{d.sourcable&.name}"
|
41
|
+
else
|
42
|
+
json.source "#{d.source_way} #{d.sourcable_type}"
|
43
|
+
end
|
35
44
|
# school_property = d.department&.school&.school_property
|
36
45
|
# property = []
|
37
46
|
|
@@ -91,35 +91,13 @@
|
|
91
91
|
<input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
|
92
92
|
</div>
|
93
93
|
</div>
|
94
|
-
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
95
|
-
<label class="layui-form-label">签单时间</label>
|
96
|
-
<div class="layui-input-inline">
|
97
|
-
<input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
|
98
|
-
</div>
|
99
|
-
</div>
|
100
|
-
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
101
|
-
<label class="layui-form-label">回款时间</label>
|
102
|
-
<div class="layui-input-inline">
|
103
|
-
<input type="text" class="layui-input" id="date_at" name="date_at" placeholder=" - " autocomplete="off">
|
104
|
-
</div>
|
105
|
-
</div>
|
106
94
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
107
95
|
<label class="layui-form-label">创建时间</label>
|
108
96
|
<div class="layui-input-inline">
|
109
97
|
<input type="text" class="layui-input" id="date" name="date" placeholder=" - " autocomplete="off">
|
110
98
|
</div>
|
111
99
|
</div>
|
112
|
-
|
113
|
-
<label class="layui-form-label">部署类型</label>
|
114
|
-
<div class="layui-input-inline">
|
115
|
-
<select name="o_business_deployment">
|
116
|
-
<option value=""></option>
|
117
|
-
<option value="1">公有云</option>
|
118
|
-
<option value="2">私有云</option>
|
119
|
-
<option value="3">混合云</option>
|
120
|
-
</select>
|
121
|
-
</div>
|
122
|
-
</div>
|
100
|
+
|
123
101
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
124
102
|
<label class="layui-form-label">商机等级</label>
|
125
103
|
<div class="layui-input-inline">
|
@@ -130,6 +108,15 @@
|
|
130
108
|
</select>
|
131
109
|
</div>
|
132
110
|
</div>
|
111
|
+
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
112
|
+
<label class="layui-form-label">商机来源</label>
|
113
|
+
<div class="layui-inline">
|
114
|
+
<%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id_select' } %>
|
115
|
+
</div>
|
116
|
+
<div class="layui-inline" style="line-height: 38px;display:none;" id="source_input_wraper">
|
117
|
+
<input type="text" class="layui-input" name="source_name" placeholder="" autocomplete="off" id="source_name_input">
|
118
|
+
</div>
|
119
|
+
</div>
|
133
120
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
134
121
|
<label class="layui-form-label">销售经理</label>
|
135
122
|
<div class="layui-input-inline">
|
@@ -277,19 +264,46 @@
|
|
277
264
|
range: true,
|
278
265
|
value: gon.bidded_date
|
279
266
|
});
|
280
|
-
|
281
|
-
elem: '#signed_date',
|
282
|
-
range: true,
|
283
|
-
value: gon.signed_date
|
284
|
-
});
|
267
|
+
|
285
268
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
value: gon.date_at
|
269
|
+
form.on('select(source_id_select)', function(data){
|
270
|
+
setSourceWay(data.value);
|
271
|
+
$("#source_name_input")[0].value = "";
|
290
272
|
});
|
291
273
|
|
292
|
-
|
274
|
+
|
275
|
+
function setSourceWay(value) {
|
276
|
+
if (value == '400电话' || value == '商务邮箱') {
|
277
|
+
$("#source_input_wraper").hide()
|
278
|
+
} else {
|
279
|
+
$("#source_input_wraper").show()
|
280
|
+
var text = "";
|
281
|
+
switch (value) {
|
282
|
+
case '会议活动':
|
283
|
+
text = "请选择活动运营";
|
284
|
+
break;
|
285
|
+
case '公司资源':
|
286
|
+
text = "请填写公司领导、部门其他同事姓名";
|
287
|
+
break;
|
288
|
+
case '渠道代理':
|
289
|
+
text = "请选择渠道";
|
290
|
+
break;
|
291
|
+
case '合作伙伴':
|
292
|
+
text = "请填写合作伙伴公司名称";
|
293
|
+
break;
|
294
|
+
case '招标信息':
|
295
|
+
text = "请填写招标信息";
|
296
|
+
break;
|
297
|
+
case '客户':
|
298
|
+
text = "请选择客户";
|
299
|
+
break;
|
300
|
+
case '朋友':
|
301
|
+
text = "请填写姓名";
|
302
|
+
break;
|
303
|
+
}
|
304
|
+
$("#source_name_input")[0].placeholder = text;
|
305
|
+
}
|
306
|
+
}
|
293
307
|
|
294
308
|
// $('#businesses_table_wraper .layui-table-body').on('scroll', function(e) {
|
295
309
|
// var leftPx = $(e.target).scrollLeft(); //获取表格body,滚动条距离左边的长度
|
@@ -478,7 +492,7 @@
|
|
478
492
|
},
|
479
493
|
{
|
480
494
|
field: 'source',
|
481
|
-
width:
|
495
|
+
width: 150,
|
482
496
|
title: '商机来源',
|
483
497
|
hide: gon.filter.source
|
484
498
|
},
|
@@ -773,8 +787,6 @@
|
|
773
787
|
select: data.select,
|
774
788
|
staff_id: data.staff_id,
|
775
789
|
staff_manages: data.staff_manages,
|
776
|
-
signed_date: data.signed_date,
|
777
|
-
date_at: data.date_at,
|
778
790
|
bidded_date: data.bidded_date,
|
779
791
|
business_year: data.business_year,
|
780
792
|
year: data.year,
|
@@ -63,7 +63,12 @@ json.data do
|
|
63
63
|
json.return_money_days d.last_follow_up&.reception_at.present? && d.last_follow_up.money_plans.where(clazz: '实际回款').present? ? (d.last_follow_up.money_plans.where(clazz: '实际回款').order(created_at: :asc).first.date_at.to_s(:date).to_date - d.last_follow_up&.reception_at).to_i : ''
|
64
64
|
json.place d.last_follow_up&.place&.name
|
65
65
|
json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff&.user&.real_name : d.staff&.user&.real_name
|
66
|
-
|
66
|
+
if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
|
67
|
+
json.source "#{d.source_way} #{d.sourcable&.name}"
|
68
|
+
else
|
69
|
+
json.source "#{d.source_way} #{d.sourcable_type}"
|
70
|
+
end
|
71
|
+
|
67
72
|
json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
|
68
73
|
json.current_staff_id @current_admin.id
|
69
74
|
json.staff_id d.staff_id
|
@@ -14,13 +14,20 @@
|
|
14
14
|
<a href="/missions/customers" style=" color: #0000FF">添加单位/部门</a>
|
15
15
|
</div>
|
16
16
|
<br>
|
17
|
-
<div class="layui-inline" style="padding-top: 20px">
|
17
|
+
<!-- <div class="layui-inline" style="padding-top: 20px">
|
18
18
|
<label class="layui-form-label ">商机来源</label>
|
19
19
|
<input type="text" name="source" autocomplete="off" class="layui-input" style="width: 300px;" placeholder="请输入商机来源">
|
20
|
-
</div>
|
20
|
+
</div> -->
|
21
21
|
<div class="layui-inline" style="padding-top: 20px">
|
22
|
-
<
|
22
|
+
<label class="layui-form-label required">商机来源</label>
|
23
|
+
<div class="layui-inline">
|
24
|
+
<%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id', "lay-verify": "required" } %>
|
25
|
+
</div>
|
26
|
+
<div class="layui-inline" style="line-height: 38px;" id="source_wraper">
|
27
|
+
<div id="customer_id" style="width: 360px"></div>
|
28
|
+
</div>
|
23
29
|
</div>
|
30
|
+
|
24
31
|
<br>
|
25
32
|
<div class="layui-inline" style="padding-top: 20px">
|
26
33
|
<label class="layui-form-label required">项目类型</label>
|
@@ -70,6 +77,85 @@
|
|
70
77
|
}
|
71
78
|
});
|
72
79
|
|
80
|
+
var source_way = "";
|
81
|
+
form.on('select(source_id)', function(data){
|
82
|
+
source_way = data.value;
|
83
|
+
setSourceWay(data.value);
|
84
|
+
$("#" + customer_select._input)[0].value = "";
|
85
|
+
});
|
86
|
+
|
87
|
+
|
88
|
+
function setSourceWay(value) {
|
89
|
+
if (value == '400电话' || value == '商务邮箱') {
|
90
|
+
$("#source_wraper").hide()
|
91
|
+
} else {
|
92
|
+
$("#source_wraper").show()
|
93
|
+
var text = "";
|
94
|
+
switch (value) {
|
95
|
+
case '会议活动':
|
96
|
+
text = "请选择活动运营";
|
97
|
+
break;
|
98
|
+
case '公司资源':
|
99
|
+
text = "请填写公司领导、部门其他同事姓名";
|
100
|
+
break;
|
101
|
+
case '渠道代理':
|
102
|
+
text = "请选择渠道";
|
103
|
+
break;
|
104
|
+
case '合作伙伴':
|
105
|
+
text = "请填写合作伙伴公司名称";
|
106
|
+
break;
|
107
|
+
case '招标信息':
|
108
|
+
text = "请填写招标信息";
|
109
|
+
break;
|
110
|
+
case '客户':
|
111
|
+
text = "请选择客户";
|
112
|
+
break;
|
113
|
+
case '朋友':
|
114
|
+
text = "请填写姓名";
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
$("#" + customer_select._input)[0].placeholder = text;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
var sourcable_id = "";
|
122
|
+
var customer_select = selectInput.render({
|
123
|
+
elem: '#customer_id',
|
124
|
+
name: 'sourcable_type', // 渲染的input的name值
|
125
|
+
layFilter: 'test', //同layui form参数lay-filter
|
126
|
+
// layVerify: 'required', //同layui form参数lay-verify
|
127
|
+
layVerType: 'tips', // 同layui form参数lay-verType
|
128
|
+
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
129
|
+
hasSelectIcon: false,
|
130
|
+
placeholder: '请输入商机来源', // 渲染的inputplaceholder值
|
131
|
+
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
132
|
+
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
133
|
+
if (!value) {
|
134
|
+
sourcable_id = "";
|
135
|
+
return cb([]);
|
136
|
+
}
|
137
|
+
if (['会议活动', '渠道代理', '客户'].includes(source_way)) {
|
138
|
+
var type = "";
|
139
|
+
if (source_way == '客户') {
|
140
|
+
type = 'customer';
|
141
|
+
} else if (source_way == '渠道代理') {
|
142
|
+
type = 'place';
|
143
|
+
} else if (source_way == '会议活动') {
|
144
|
+
type = 'active';
|
145
|
+
}
|
146
|
+
request.get('missions/search_customer?q=' + value + "&type=" + type, {}, function (res) {
|
147
|
+
if (res.data.length == 0) {
|
148
|
+
customer_select.emptyValue();
|
149
|
+
return cb([])
|
150
|
+
}
|
151
|
+
return cb(res)
|
152
|
+
})
|
153
|
+
}
|
154
|
+
}
|
155
|
+
});
|
156
|
+
|
157
|
+
|
158
|
+
|
73
159
|
// 当前弹出层,防止ID被覆盖
|
74
160
|
var parentIndex = layer.index;
|
75
161
|
|
@@ -83,6 +169,9 @@
|
|
83
169
|
name: data.field.name,
|
84
170
|
source: data.field.source,
|
85
171
|
clazz_id: data.field.clazz_id,
|
172
|
+
source_way: data.field.source_way,
|
173
|
+
sourcable_type: data.field.sourcable_type,
|
174
|
+
sourcable_id: customer_select.getValue() || sourcable_id,
|
86
175
|
|
87
176
|
}, function (res) {
|
88
177
|
if (res.success == false) {
|
@@ -34,6 +34,16 @@
|
|
34
34
|
</span>
|
35
35
|
<!-- <span class="layui-badge layui-bg-green"></span> -->
|
36
36
|
<button type="button" class="layui-btn layui-btn-xs layui-btn-primary add-tag" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>标签设置</button>
|
37
|
+
|
38
|
+
<br/>
|
39
|
+
<br/>
|
40
|
+
<span id="assign_<%= f.id %>">
|
41
|
+
<% f.watch_follow_ups.each do |d| %>
|
42
|
+
<span class="layui-badge layui-bg-green"><%= d.staff&.name %></span>
|
43
|
+
<% end %>
|
44
|
+
</span>
|
45
|
+
<!-- <span class="layui-badge layui-bg-green"></span> -->
|
46
|
+
<button type="button" class="layui-btn layui-btn-xs layui-btn-primary assign-staff" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>指定人查看</button>
|
37
47
|
</p>
|
38
48
|
</div>
|
39
49
|
</li>
|
@@ -150,6 +160,28 @@
|
|
150
160
|
});
|
151
161
|
})
|
152
162
|
|
163
|
+
$(".assign-staff").on("click", function(e) {
|
164
|
+
var data = e.currentTarget.dataset;
|
165
|
+
follow_up_id = data.id
|
166
|
+
var content = miniPage.getHrefContent('/missions/follow_ups/' + follow_up_id + '/add_assign');
|
167
|
+
var openWH = miniPage.getOpenWidthHeight();
|
168
|
+
tindex = layer.open({
|
169
|
+
title: '指定人查看',
|
170
|
+
type: 1,
|
171
|
+
shade: 0.2,
|
172
|
+
maxmin: true,
|
173
|
+
shadeClose: true,
|
174
|
+
area: ['700px','600px'],
|
175
|
+
// offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
176
|
+
content: content
|
177
|
+
});
|
178
|
+
$(window).on("resize", function () {
|
179
|
+
layer.full(sindex);
|
180
|
+
});
|
181
|
+
})
|
182
|
+
|
183
|
+
|
184
|
+
|
153
185
|
|
154
186
|
|
155
187
|
});
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-form layuimini-form">
|
3
|
+
<div class="layui-form-item" style="padding: 25px">
|
4
|
+
<div id="assign_staff"></div>
|
5
|
+
<div class="layui-form-item text-center" style="margin-top: 60px;">
|
6
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="btn">提交</button>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<script>
|
11
|
+
layui.use(['form', 'request', 'xmSelect'], function() {
|
12
|
+
var form = layui.form,
|
13
|
+
request = layui.request,
|
14
|
+
xmSelect = layui.xmSelect,
|
15
|
+
$ = layui.$;
|
16
|
+
|
17
|
+
var place_list = xmSelect.render({
|
18
|
+
el: '#assign_staff',
|
19
|
+
name: "staff_ids",
|
20
|
+
tips: '请选择人员',
|
21
|
+
clickClose: true,
|
22
|
+
paging: true,
|
23
|
+
filterable: true,
|
24
|
+
data: gon.assign_watch,
|
25
|
+
})
|
26
|
+
|
27
|
+
form.on("submit(btn)", function(form) {
|
28
|
+
request.post('missions/follow_ups/' + parent.follow_up_id + '/update_assign',
|
29
|
+
form.field,
|
30
|
+
function(res) {
|
31
|
+
if (res.success) {
|
32
|
+
$("#assign_" + parent.follow_up_id).html("");
|
33
|
+
res.tags.forEach(function(tag) {
|
34
|
+
$("#assign_" + parent.follow_up_id).append(' <span class="layui-badge layui-bg-green">' + tag + '</span')
|
35
|
+
})
|
36
|
+
}
|
37
|
+
layer.close(tindex);
|
38
|
+
})
|
39
|
+
})
|
40
|
+
|
41
|
+
})
|
42
|
+
</script>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
1
2
|
<div style="margin: 10px 10px 10px 10px" id="money_plan_record">
|
2
3
|
<form class="layui-form layui-form-pane" lay-filter="submit_form_record">
|
3
4
|
<div class="layui-form-item">
|
@@ -52,13 +53,13 @@
|
|
52
53
|
</script>
|
53
54
|
|
54
55
|
<script type="text/html" id="currentTableBarmoney_record">
|
55
|
-
|
56
|
+
{{# if (gon.edit_record || d.staff_id == gon.staff_id && gon.edit_record_self) {}}
|
56
57
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
57
|
-
|
58
|
+
{{# }}}
|
58
59
|
<% if can? :delete_update_record, EducodeSales::MoneyPlan %>
|
59
60
|
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
60
61
|
<% end %>
|
61
|
-
<a class="layui-btn layui-btn-
|
62
|
+
<a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="confirm">认领回款</a>
|
62
63
|
</script>
|
63
64
|
|
64
65
|
<script>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
1
2
|
<div style="margin: 10px 10px 10px 10px" id="money_plan_list">
|
2
3
|
<form class="layui-form layui-form-pane" lay-filter="search_plans">
|
3
4
|
<div class="layui-form-item">
|
@@ -23,7 +24,9 @@
|
|
23
24
|
</form>
|
24
25
|
</div>
|
25
26
|
<script type="text/html" id="toolbar_money_plan">
|
27
|
+
<% if can? :create, EducodeSales::MoneyPlan %>
|
26
28
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" style="margin-left: 20px;" lay-event="addMoney">添加回款计划</button>
|
29
|
+
<% end %>
|
27
30
|
</script>
|
28
31
|
|
29
32
|
<table class="layui-hide" id="money_plan_table" lay-filter="money_plan_table"></table>
|
@@ -32,9 +35,13 @@
|
|
32
35
|
<a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
|
33
36
|
</script>
|
34
37
|
<script type="text/html" id="currentTableBarmoney_plan">
|
38
|
+
{{# if (gon.edit_money_plan || d.staff_id == gon.staff_id && gon.edit_money_plan_self) {}}
|
35
39
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
40
|
+
{{# }}}
|
41
|
+
<% if can? :delete, EducodeSales::MoneyPlan %>
|
36
42
|
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
37
|
-
|
43
|
+
<% end %>
|
44
|
+
<a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
|
38
45
|
<!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a> -->
|
39
46
|
|
40
47
|
</script>
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: educode_sales
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -364,6 +364,7 @@ files:
|
|
364
364
|
- app/views/educode_sales/customers/show_follow.json.jbuilder
|
365
365
|
- app/views/educode_sales/customers/show_follow_record.html.erb
|
366
366
|
- app/views/educode_sales/customers/show_majors.html.erb
|
367
|
+
- app/views/educode_sales/follow_ups/add_assign.html.erb
|
367
368
|
- app/views/educode_sales/follow_ups/add_tag.html.erb
|
368
369
|
- app/views/educode_sales/follow_ups/file.html.erb
|
369
370
|
- app/views/educode_sales/follow_ups/index.json.jbuilder
|