educode_sales 1.0.8 → 1.10.0
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 +2 -0
- data/app/controllers/educode_sales/contracts_controller.rb +3 -3
- data/app/controllers/educode_sales/home_controller.rb +1 -1
- data/app/controllers/educode_sales/money_plan_records_controller.rb +5 -0
- data/app/controllers/educode_sales/money_plans_controller.rb +34 -1
- data/app/controllers/educode_sales/teachers_controller.rb +24 -1
- data/app/models/educode_sales/money_plan.rb +1 -1
- data/app/models/educode_sales/staff.rb +1 -0
- data/app/models/educode_sales/teacher.rb +1 -0
- data/app/views/educode_sales/businesses/index.html.erb +39 -91
- data/app/views/educode_sales/businesses/show_follow.json.jbuilder +1 -1
- data/app/views/educode_sales/home/search_money_plans.json.jbuilder +1 -1
- data/app/views/educode_sales/money_plans/_index.html.erb +30 -9
- data/app/views/educode_sales/money_plans/add.html.erb +25 -9
- data/app/views/educode_sales/money_plans/edit.html.erb +80 -0
- data/app/views/educode_sales/teachers/_index.html.erb +217 -4
- data/app/views/educode_sales/teachers/assign.html.erb +43 -0
- data/app/views/educode_sales/teachers/index.json.jbuilder +5 -1
- data/app/views/layouts/educode_sales/application.html.erb +3 -0
- data/config/routes.rb +2 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00f95a116861234dd0fca5a1714c085e1bec0bddc43a23eb887d52486ac72d16
|
4
|
+
data.tar.gz: 771c88244cbf37b3521d6ca60d9571d10bc22d90ae698ebf885608aeb4560a59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a81d2f314ed6071cf408581e4725e337fdfcca85873d90945b6fd2b26016437b497c91e34ddfc41deb0602898d150572b7f4a5cf13e4189fb50d9b7414863aa
|
7
|
+
data.tar.gz: 5dfc28b6e674a4241e2c2e717d84fc2b6cf3d3825794d96be7edbb771718cab0841ee055a87b6df43a40b6c97ba1b4d61b280d9184c1e8b4cee44d64c19dfb63
|
@@ -70,6 +70,8 @@ module EducodeSales
|
|
70
70
|
gon.menus << { title: '添加年计划', event: 'year' }
|
71
71
|
end
|
72
72
|
|
73
|
+
gon.menus << { title: '添加回款计划', event: 'money_plan' }
|
74
|
+
|
73
75
|
gon.menus << { title: '关注', event: 'following' }
|
74
76
|
gon.menus << { title: '跟进时间线', event: 'time_line' }
|
75
77
|
if can?(:show_file, EducodeSales::Business)
|
@@ -348,9 +348,9 @@ module EducodeSales
|
|
348
348
|
end
|
349
349
|
|
350
350
|
end
|
351
|
-
data.each do |d|
|
352
|
-
|
353
|
-
end
|
351
|
+
# data.each do |d|
|
352
|
+
# d.select! { |d| d.delete_if{|f| f == ''}.present? }
|
353
|
+
# end
|
354
354
|
|
355
355
|
follow_up = last_follow_up.dup
|
356
356
|
|
@@ -80,7 +80,7 @@ module EducodeSales
|
|
80
80
|
def search_contracts
|
81
81
|
@data = Business
|
82
82
|
if params[:q].present?
|
83
|
-
@data = @data.where("name like :q ", q: "%#{params[:q]}%").limit(20)
|
83
|
+
@data = @data.joins(:school).where("educode_sales_businesses.name like :q OR educode_sales_businesses.number like :q OR schools.name like :q ", q: "%#{params[:q]}%").limit(20)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -108,6 +108,11 @@ module EducodeSales
|
|
108
108
|
claim.amount = params["amount[#{i}]"]
|
109
109
|
claim.staff = @current_admin
|
110
110
|
claim.save
|
111
|
+
business = claim.money_plan.business
|
112
|
+
if business
|
113
|
+
money_plan_record.update(business_id: business.id)
|
114
|
+
business.update(return_money: claim.money_plan.money_plan_claims.sum(:amount))
|
115
|
+
end
|
111
116
|
end
|
112
117
|
|
113
118
|
render_success
|
@@ -42,7 +42,7 @@ module EducodeSales
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def list
|
45
|
-
follow_up_ids = Business.pluck(:last_follow_up_id)
|
45
|
+
# follow_up_ids = Business.pluck(:last_follow_up_id)
|
46
46
|
authorize! :read, MoneyPlan
|
47
47
|
respond_to do |format|
|
48
48
|
format.html do
|
@@ -54,9 +54,31 @@ module EducodeSales
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def add
|
57
|
+
if params[:business_id].present?
|
58
|
+
@business = Business.find(params[:business_id])
|
59
|
+
gon.business_id_source = @business.id
|
60
|
+
else
|
61
|
+
gon.business_id_source = ""
|
62
|
+
end
|
63
|
+
render layout: false
|
64
|
+
end
|
65
|
+
|
66
|
+
def edit
|
67
|
+
@money_plan = MoneyPlan.find(params[:id])
|
68
|
+
gon.business_id = @money_plan.business_id
|
69
|
+
gon.business = [{value: @money_plan.business_id.to_s, name: @money_plan.business&.name}]
|
57
70
|
render layout: false
|
58
71
|
end
|
59
72
|
|
73
|
+
def update
|
74
|
+
@money_plan = MoneyPlan.find(params[:id])
|
75
|
+
if @money_plan.update(money_plan_params)
|
76
|
+
render_success
|
77
|
+
else
|
78
|
+
render_failure @money_plan
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
60
82
|
def create
|
61
83
|
business = Business.find(params[:business_id])
|
62
84
|
data = []
|
@@ -66,5 +88,16 @@ module EducodeSales
|
|
66
88
|
render_success
|
67
89
|
end
|
68
90
|
|
91
|
+
def destroy
|
92
|
+
money_plan = MoneyPlan.find(params[:id])
|
93
|
+
money_plan.destroy
|
94
|
+
render_success
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def money_plan_params
|
99
|
+
params.permit(:category, :amount, :payment_clause, :date_at)
|
100
|
+
end
|
101
|
+
|
69
102
|
end
|
70
103
|
end
|
@@ -166,7 +166,8 @@ module EducodeSales
|
|
166
166
|
if params[:q].present? && params[:q][:staff_manage].present?
|
167
167
|
staff = Staff.find(params[:q][:staff_manage])
|
168
168
|
school_ids = School.where(province: staff.areas.pluck(:name)).pluck(:id)
|
169
|
-
|
169
|
+
assign_teacher_ids = EducodeSales::AssignStaff.where("educode_sales_assign_staffs.sourcable_type = 'EducodeSales::Teacher' and educode_sales_assign_staffs.staff_id = ?", params[:q][:staff_manage]).pluck(:sourcable_id)
|
170
|
+
teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?)", school_ids).pluck(:id) + assign_teacher_ids
|
170
171
|
@teachers = @teachers.where(id: teacher_ids)
|
171
172
|
end
|
172
173
|
|
@@ -426,6 +427,28 @@ module EducodeSales
|
|
426
427
|
render layout: false
|
427
428
|
end
|
428
429
|
|
430
|
+
#获取该教师所指派生态经理
|
431
|
+
def assign
|
432
|
+
role = Role.find_by( name: '生态经理')
|
433
|
+
staffs = Staff.joins(:user).where(role_id: role.id)
|
434
|
+
teacher = Teacher.find(params[:id])
|
435
|
+
selected_staff_ids = teacher.assign_staffs.pluck(:staff_id)
|
436
|
+
gon.staff_manages = staffs.map { |d| {name: d.user.real_name, value: d.id, selected: selected_staff_ids.include?(d.id)} }
|
437
|
+
render layout: false
|
438
|
+
end
|
439
|
+
|
440
|
+
#指派生态经理
|
441
|
+
def assign_staff
|
442
|
+
@teacher = EducodeSales::Teacher.find(params[:id])
|
443
|
+
assign_staffs = []
|
444
|
+
params[:to_id].split(",").each do |i|
|
445
|
+
assign_staffs << AssignStaff.find_or_initialize_by(sourcable_id: @teacher.id, staff_id: i, sourcable_type: "EducodeSales::Teacher")
|
446
|
+
end
|
447
|
+
@teacher.assign_staffs = assign_staffs
|
448
|
+
@teacher.save
|
449
|
+
render_success
|
450
|
+
end
|
451
|
+
|
429
452
|
private
|
430
453
|
def teacher_params
|
431
454
|
params.permit(:name, :professional_title, :job, :source_id, :wechat, :mobile, :realname)
|
@@ -31,6 +31,7 @@ module EducodeSales
|
|
31
31
|
|
32
32
|
has_many :market_areas, dependent: :destroy
|
33
33
|
has_many :areas, through: :market_areas
|
34
|
+
has_many :assign_staffs, :class_name => 'EducodeSales::AssignStaff', dependent: :destroy
|
34
35
|
validates :user_id, uniqueness: { message: '已存在' }
|
35
36
|
|
36
37
|
# attr_writer :month
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
class Teacher < ApplicationRecord
|
3
|
+
has_many :assign_staffs, as: :sourcable, dependent: :destroy #生态经理
|
3
4
|
has_many :activity_teachers, dependent: :destroy
|
4
5
|
has_many :activities, through: :activity_teachers
|
5
6
|
has_many :teacher_follows, dependent: :destroy
|
@@ -397,13 +397,7 @@
|
|
397
397
|
totalRowText: '合计',
|
398
398
|
fixed: "left"
|
399
399
|
},
|
400
|
-
|
401
|
-
field: 'number',
|
402
|
-
width: 120,
|
403
|
-
title: '编号',
|
404
|
-
fixed: 'left',
|
405
|
-
hide: gon.filter.number
|
406
|
-
},
|
400
|
+
|
407
401
|
{
|
408
402
|
field: 'name',
|
409
403
|
width: 170,
|
@@ -522,48 +516,12 @@
|
|
522
516
|
hide: gon.filter.invitation_at
|
523
517
|
},
|
524
518
|
{
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
},
|
531
|
-
{
|
532
|
-
field: 'signed_date',
|
533
|
-
width: 105,
|
534
|
-
title: '签单时间',
|
535
|
-
sort: true,
|
536
|
-
hide: gon.filter.signed_date
|
537
|
-
},
|
538
|
-
{
|
539
|
-
field: 'reception_at',
|
540
|
-
width: 105,
|
541
|
-
title: '验收时间',
|
542
|
-
sort: true,
|
543
|
-
hide: gon.filter.reception_at
|
544
|
-
},
|
545
|
-
{
|
546
|
-
field: 'service_end_time',
|
547
|
-
width: 200,
|
548
|
-
title: '服务期',
|
549
|
-
sort: true,
|
550
|
-
hide: gon.filter.service_end_time
|
551
|
-
},
|
552
|
-
{
|
553
|
-
field: 'o_business_deployment',
|
554
|
-
width: 150,
|
555
|
-
title: '部署类型',
|
556
|
-
sort: true,
|
557
|
-
hide: gon.filter.o_business_deployment
|
558
|
-
},
|
559
|
-
{
|
560
|
-
field: 'p_deploy_time',
|
561
|
-
width: 150,
|
562
|
-
title: '部署时间',
|
563
|
-
sort: true,
|
564
|
-
hide: gon.filter.p_deploy_time
|
519
|
+
field: 'bidded_date',
|
520
|
+
width: 105,
|
521
|
+
title: '中标时间',
|
522
|
+
sort: true,
|
523
|
+
hide: gon.filter.bidded_date
|
565
524
|
},
|
566
|
-
|
567
525
|
{
|
568
526
|
field: 'budget_amount',
|
569
527
|
width: 105,
|
@@ -573,42 +531,12 @@
|
|
573
531
|
hide: gon.filter.budget_amount
|
574
532
|
},
|
575
533
|
{
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
},
|
583
|
-
{
|
584
|
-
field: 'actual_amount',
|
585
|
-
width: 100,
|
586
|
-
title: '合同额',
|
587
|
-
totalRow: true,
|
588
|
-
sort: true,
|
589
|
-
hide: gon.filter.actual_amount
|
590
|
-
},
|
591
|
-
{
|
592
|
-
field: 'return_money',
|
593
|
-
width: 100,
|
594
|
-
title: '回款',
|
595
|
-
sort: true,
|
596
|
-
totalRow: true,
|
597
|
-
hide: gon.filter.return_money
|
598
|
-
},
|
599
|
-
{
|
600
|
-
field: 'wait_return_money',
|
601
|
-
width: 100,
|
602
|
-
title: '待回款',
|
603
|
-
sort: true,
|
604
|
-
totalRow: true,
|
605
|
-
hide: gon.filter.wait_return_money
|
606
|
-
},
|
607
|
-
{
|
608
|
-
field: 'return_money_days',
|
609
|
-
width: 150,
|
610
|
-
title: '首次回款周期(天)',
|
611
|
-
hide: gon.filter.return_money_days
|
534
|
+
field: 'total_amount',
|
535
|
+
width: 100,
|
536
|
+
title: '中标额',
|
537
|
+
totalRow: true,
|
538
|
+
sort: true,
|
539
|
+
hide: gon.filter.total_amount
|
612
540
|
},
|
613
541
|
{
|
614
542
|
field: 'divide_rate',
|
@@ -617,13 +545,7 @@
|
|
617
545
|
sort: true,
|
618
546
|
hide: gon.filter.divide_rate
|
619
547
|
},
|
620
|
-
|
621
|
-
field: 'divide_money',
|
622
|
-
width: 160,
|
623
|
-
title: '渠道分成金额',
|
624
|
-
sort: true,
|
625
|
-
hide: gon.filter.divide_money
|
626
|
-
},
|
548
|
+
|
627
549
|
{
|
628
550
|
field: 'place',
|
629
551
|
width: 160,
|
@@ -751,6 +673,9 @@
|
|
751
673
|
case 'following':
|
752
674
|
following(id);
|
753
675
|
break;
|
676
|
+
case 'money_plan':
|
677
|
+
money_plan(id);
|
678
|
+
break;
|
754
679
|
}
|
755
680
|
}
|
756
681
|
});
|
@@ -786,6 +711,9 @@
|
|
786
711
|
case 'following':
|
787
712
|
following(id);
|
788
713
|
break;
|
714
|
+
case 'money_plan':
|
715
|
+
money_plan(id);
|
716
|
+
break;
|
789
717
|
}
|
790
718
|
}
|
791
719
|
});
|
@@ -808,7 +736,9 @@
|
|
808
736
|
case 'export_records':
|
809
737
|
export_records();
|
810
738
|
break;
|
739
|
+
|
811
740
|
}
|
741
|
+
|
812
742
|
}
|
813
743
|
});
|
814
744
|
}
|
@@ -1005,6 +935,24 @@
|
|
1005
935
|
});
|
1006
936
|
}
|
1007
937
|
|
938
|
+
function money_plan(business_id) {
|
939
|
+
var content = miniPage.getHrefContent('/missions/money_plans/add?business_id=' + business_id);
|
940
|
+
var openWH = miniPage.getOpenWidthHeight();
|
941
|
+
sindex = layer.open({
|
942
|
+
title: '添加回款计划',
|
943
|
+
type: 1,
|
944
|
+
shade: 0.2,
|
945
|
+
maxmin: true,
|
946
|
+
shadeClose: true,
|
947
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
948
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
949
|
+
content: content,
|
950
|
+
});
|
951
|
+
$(window).on("resize", function () {
|
952
|
+
layer.full(sindex);
|
953
|
+
});
|
954
|
+
}
|
955
|
+
|
1008
956
|
function month(id) {
|
1009
957
|
var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + id);
|
1010
958
|
var openWH = miniPage.getOpenWidthHeight();
|
@@ -23,7 +23,7 @@ json.data do
|
|
23
23
|
json.staff d.staff.user.real_name
|
24
24
|
json.place d.place&.name
|
25
25
|
json.money_plans_count d.money_plans_count
|
26
|
-
json.money d.money_plans.
|
26
|
+
json.money d.money_plans.sum(:amount).round(2)
|
27
27
|
json.is_latest d.id == @latest&.id
|
28
28
|
json.flag d.created_at.present? ? (Time.now - d.created_at).to_f/3600 < 24 : false
|
29
29
|
json.description d.description
|
@@ -1,7 +1,7 @@
|
|
1
1
|
json.data do
|
2
2
|
json.array! @data do |d|
|
3
3
|
json.value d.id
|
4
|
-
json.name "#{d.business.number} / #{d.business.department&.school&.name.to_s}#{d.business.department&.name.to_s} / #{d.business.name} / #{d.business.last_follow_up&.actual_amount}万 /
|
4
|
+
json.name "#{d.business.number} / #{d.business.department&.school&.name.to_s}#{d.business.department&.name.to_s} / #{d.business.name} / #{d.business.last_follow_up&.actual_amount}万 / #{d.business.last_follow_up&.return_money}万 /#{d.date_at.to_s(:date)}"
|
5
5
|
end
|
6
6
|
end
|
7
7
|
json.count @data.size
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<form class="layui-form layui-form-pane" lay-filter="search_plans">
|
3
3
|
<div class="layui-form-item">
|
4
4
|
<div class="layui-inline">
|
5
|
-
<label class="layui-form-label"
|
5
|
+
<label class="layui-form-label">商机名称</label>
|
6
6
|
<div class="layui-input-inline">
|
7
7
|
<input type="text" name="business" class="layui-input">
|
8
8
|
</div>
|
@@ -32,6 +32,8 @@
|
|
32
32
|
<a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
|
33
33
|
</script>
|
34
34
|
<script type="text/html" id="currentTableBarmoney_plan">
|
35
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
|
36
|
+
<a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
|
35
37
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
|
36
38
|
<!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a> -->
|
37
39
|
|
@@ -75,7 +77,7 @@
|
|
75
77
|
}, {
|
76
78
|
field: 'business_name',
|
77
79
|
width: 150,
|
78
|
-
title: '
|
80
|
+
title: '商机名称'
|
79
81
|
}, {
|
80
82
|
field: 'school',
|
81
83
|
width: 180,
|
@@ -125,10 +127,11 @@
|
|
125
127
|
field: 'busireceipt_state',
|
126
128
|
width: 120,
|
127
129
|
title: '开票状态',
|
128
|
-
},
|
130
|
+
}, {
|
129
131
|
field: 'created_at',
|
130
132
|
width: 170,
|
131
133
|
title: '添加计划时间',
|
134
|
+
sort: true,
|
132
135
|
}, {
|
133
136
|
title: '操作',
|
134
137
|
minWidth: 200,
|
@@ -173,12 +176,7 @@
|
|
173
176
|
|
174
177
|
form.on('submit(reset_business_search)', function(data) {
|
175
178
|
var field = data.field;
|
176
|
-
form.val('
|
177
|
-
area: "",
|
178
|
-
date: "",
|
179
|
-
staff_id: "",
|
180
|
-
clazz: "",
|
181
|
-
professional_title: "",
|
179
|
+
form.val('search_plans', {
|
182
180
|
school: "",
|
183
181
|
business: ""
|
184
182
|
});
|
@@ -228,6 +226,29 @@
|
|
228
226
|
$(window).on("resize", function() {
|
229
227
|
layer.full(sindex);
|
230
228
|
});
|
229
|
+
} else if (obj.event === 'edit') {
|
230
|
+
var content = miniPage.getHrefContent('/missions/money_plans/' + data.id + '/edit')
|
231
|
+
var openWH = miniPage.getOpenWidthHeight();
|
232
|
+
sindex = layer.open({
|
233
|
+
title: '编辑回款计划',
|
234
|
+
type: 1,
|
235
|
+
shade: 0.2,
|
236
|
+
maxmin: true,
|
237
|
+
shadeClose: true,
|
238
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
239
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
240
|
+
content: content
|
241
|
+
});
|
242
|
+
$(window).on("resize", function() {
|
243
|
+
layer.full(sindex);
|
244
|
+
});
|
245
|
+
} else if (obj.event == 'delete') {
|
246
|
+
layer.confirm('确定删除商机' + data.business_name + "的回款计划", function (index) {
|
247
|
+
request.delete('missions/money_plans/' + data.id, {}, function (res) {
|
248
|
+
layer.close(index);
|
249
|
+
table.reload("money_plan_table");
|
250
|
+
})
|
251
|
+
});
|
231
252
|
}
|
232
253
|
});
|
233
254
|
|
@@ -1,10 +1,18 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
1
2
|
<div style="padding:10px">
|
2
3
|
<div class="layui-form layuimini-form" lay-filter="searchform">
|
3
4
|
<div class="layui-form-item">
|
4
|
-
<label class="layui-form-label required" style="width: 80px !important;"
|
5
|
+
<label class="layui-form-label required" style="width: 80px !important;">商机名称:</label>
|
6
|
+
<% if @business.present? %>
|
7
|
+
<div class="layui-input-inline" style="line-height: 38px;">
|
8
|
+
<%= @business.name %>
|
9
|
+
</div>
|
10
|
+
<% else %>
|
5
11
|
<div class="layui-input-inline">
|
6
12
|
<div id="business" style="width:600px;"></div>
|
7
13
|
</div>
|
14
|
+
<% end %>
|
15
|
+
|
8
16
|
</div>
|
9
17
|
<div class="layui-form-item">
|
10
18
|
<div class="layui-inline">
|
@@ -22,7 +30,7 @@
|
|
22
30
|
<div class="layui-inline">
|
23
31
|
<label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
|
24
32
|
<div class="layui-input-inline">
|
25
|
-
<input type="text" name="date_at[0]" value="" class="layui-input" lay-verify="required" id="
|
33
|
+
<input type="text" name="date_at[0]" value="" class="layui-input" lay-verify="required" id="money_plan_date_at">
|
26
34
|
</div>
|
27
35
|
</div>
|
28
36
|
<div class="layui-inline">
|
@@ -86,19 +94,22 @@
|
|
86
94
|
form.render();
|
87
95
|
|
88
96
|
laydate.render({
|
89
|
-
elem: '#
|
97
|
+
elem: '#money_plan_date_at',
|
90
98
|
});
|
91
99
|
|
92
|
-
|
93
|
-
|
94
|
-
|
100
|
+
|
101
|
+
if (gon.business_id_source) {
|
102
|
+
var business_id = gon.business_id_source;
|
103
|
+
} else {
|
104
|
+
var business_id = "";
|
105
|
+
var business_select = selectInput.render({
|
95
106
|
elem: '#business',
|
96
107
|
name: 'bussiness_name', // 渲染的input的name值
|
97
108
|
layFilter: 'test', //同layui form参数lay-filter
|
98
109
|
layVerType: 'tips', // 同layui form参数lay-verType
|
99
110
|
layReqText: '请填写文本', //同layui form参数lay-ReqText
|
100
111
|
hasSelectIcon: false,
|
101
|
-
placeholder: '
|
112
|
+
placeholder: '请输入商机名称、客户名称或合同编号', // 渲染的inputplaceholder值
|
102
113
|
remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
|
103
114
|
remoteMethod: function (value, cb) { // 远程搜索的回调函数
|
104
115
|
if (!value) {
|
@@ -114,7 +125,7 @@
|
|
114
125
|
})
|
115
126
|
}
|
116
127
|
});
|
117
|
-
|
128
|
+
}
|
118
129
|
|
119
130
|
var num = 0;
|
120
131
|
$("#addInput").on("click", function() {
|
@@ -132,7 +143,12 @@
|
|
132
143
|
|
133
144
|
form.on('submit(saveBtn)', function(data) {
|
134
145
|
data.field.num = num;
|
135
|
-
|
146
|
+
if (gon.business_id_source == "") {
|
147
|
+
data.field.business_id = business_select.getValue() || business_id;
|
148
|
+
} else {
|
149
|
+
data.field.business_id = business_id;
|
150
|
+
}
|
151
|
+
|
136
152
|
if (data.field.business_id == '') {
|
137
153
|
layer.msg('请选择合同')
|
138
154
|
return false;
|
@@ -0,0 +1,80 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div style="padding:10px">
|
3
|
+
<div class="layui-form layuimini-form" lay-filter="searchform">
|
4
|
+
<div class="layui-form-item">
|
5
|
+
<label class="layui-form-label required" style="width: 80px !important;">商机名称:</label>
|
6
|
+
<div class="layui-input-inline">
|
7
|
+
<%= hidden_field_tag :id, @money_plan.id %>
|
8
|
+
<div id="business" style="line-height:38px;">
|
9
|
+
<%= @money_plan.business.name %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<div class="layui-form-item">
|
14
|
+
<div class="layui-inline">
|
15
|
+
<label class="layui-form-label required">回款类别:</label>
|
16
|
+
<div class="layui-input-inline">
|
17
|
+
<%= select_tag "category", options_for_select(EducodeSales::MoneyPlan.categories.keys, @money_plan.category), { 'lay-filter': 'category', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<div class="layui-inline">
|
21
|
+
<label class="layui-form-label required" style="width:50px;">金额:</label>
|
22
|
+
<div class="layui-input-inline">
|
23
|
+
<input type="text" name="amount" value="<%= @money_plan.amount %>" class="layui-input" lay-verify="required">
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div class="layui-inline">
|
27
|
+
<label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
|
28
|
+
<div class="layui-input-inline">
|
29
|
+
<input type="text" name="date_at" value="<%= @money_plan.date_at.to_s(:date) %>" class="layui-input" lay-verify="required" id="date_at">
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
<div class="layui-inline">
|
33
|
+
<label class="layui-form-label">付款条件:</label>
|
34
|
+
<div class="layui-input-inline">
|
35
|
+
<input type="text" name="payment_clause" value="<%= @money_plan.payment_clause %>" class="layui-input">
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
<div class="layui-form-item">
|
40
|
+
<div class="layui-input-block">
|
41
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<script>
|
48
|
+
|
49
|
+
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate', 'selectInput'], function() {
|
50
|
+
var form = layui.form,
|
51
|
+
layer = layui.layer,
|
52
|
+
table = layui.table,
|
53
|
+
laydate = layui.laydate,
|
54
|
+
laytpl = layui.laytpl,
|
55
|
+
request = layui.request,
|
56
|
+
selectInput = layui.selectInput,
|
57
|
+
$ = layui.$;
|
58
|
+
form.render();
|
59
|
+
|
60
|
+
laydate.render({
|
61
|
+
elem: '#date_at',
|
62
|
+
});
|
63
|
+
|
64
|
+
|
65
|
+
var business_id = gon.business_id;
|
66
|
+
|
67
|
+
form.on('submit(saveBtn)', function(data) {
|
68
|
+
data.field.business_id = business_id;
|
69
|
+
if (data.field.business_id == '') {
|
70
|
+
layer.msg('请选择合同')
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
request.put("missions/money_plans/" + data.field.id, data.field, function(res) {
|
74
|
+
layer.close(parent.sindex)
|
75
|
+
parent.table.reload('money_plan_table')
|
76
|
+
})
|
77
|
+
return false;
|
78
|
+
});
|
79
|
+
});
|
80
|
+
</script>
|
@@ -122,6 +122,7 @@
|
|
122
122
|
<% if can? :create, EducodeSales::TeacherFollow %>
|
123
123
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
|
124
124
|
<% end %>
|
125
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="assign">指派生态经理</a>
|
125
126
|
<% if @more %>
|
126
127
|
<a class="layui-btn-xs data-count-edit more-btn" data-name={{d.name}} data-id={{d.id}}>更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
|
127
128
|
<% end %>
|
@@ -396,11 +397,206 @@
|
|
396
397
|
url: '/missions/teachers',
|
397
398
|
where: {q: form.val('search_form')},
|
398
399
|
toolbar: '#toolbarDemo',
|
399
|
-
totalRow:
|
400
|
+
totalRow:true,
|
400
401
|
defaultToolbar: ['filter'],
|
401
|
-
cols:
|
402
|
+
cols: [
|
403
|
+
[
|
404
|
+
{
|
405
|
+
field: 'id',
|
406
|
+
width: 60,
|
407
|
+
title:'序号',type: 'numbers',
|
408
|
+
totalRowText:'合计',
|
409
|
+
fixed: 'left'
|
410
|
+
|
411
|
+
},
|
412
|
+
{
|
413
|
+
field: 'name',
|
414
|
+
width: 100,
|
415
|
+
title: '姓名',
|
416
|
+
fixed: 'left',
|
417
|
+
templet: "#name"
|
418
|
+
},
|
419
|
+
{
|
420
|
+
field: 'realname',
|
421
|
+
width: 100,
|
422
|
+
title: '真实姓名',
|
423
|
+
},
|
424
|
+
{
|
425
|
+
field: 'school',
|
426
|
+
width: 160,
|
427
|
+
title: '单位',
|
428
|
+
templet:'<div><span title="{{d.school}}">{{d.school}}</span></div>'
|
429
|
+
|
430
|
+
},
|
431
|
+
{
|
432
|
+
field: 'department',
|
433
|
+
width: 130,
|
434
|
+
title: '部门',
|
435
|
+
templet:'<div><span title="{{d.department}}">{{d.department}}</span></div>'
|
436
|
+
},
|
437
|
+
{
|
438
|
+
field: 'majors',
|
439
|
+
width: 160,
|
440
|
+
title: '专业',
|
441
|
+
},
|
442
|
+
{
|
443
|
+
field: 'area',
|
444
|
+
width: 80,
|
445
|
+
title: '区域',
|
446
|
+
},
|
447
|
+
{
|
448
|
+
field: 'business_count',
|
449
|
+
width: 120,
|
450
|
+
title: '单位商机数',
|
451
|
+
},
|
452
|
+
{
|
453
|
+
field: 'professional_title',
|
454
|
+
title: '职称',
|
455
|
+
width: 80,
|
456
|
+
templet: '#show_follow'
|
457
|
+
},
|
458
|
+
{
|
459
|
+
field: 'job',
|
460
|
+
width: 80,
|
461
|
+
title: '职务',
|
462
|
+
templet: '#show_keys'
|
463
|
+
|
464
|
+
},
|
465
|
+
{
|
466
|
+
field: 'source',
|
467
|
+
width: 90,
|
468
|
+
title: '来源',
|
469
|
+
},
|
470
|
+
{
|
471
|
+
field: 'attitude',
|
472
|
+
width: 60,
|
473
|
+
title: '态度',
|
474
|
+
},
|
475
|
+
{
|
476
|
+
field: 'course_subjects_count',
|
477
|
+
width: 90,
|
478
|
+
title: '课程方向',
|
479
|
+
templet: "#courses"
|
480
|
+
},
|
481
|
+
{
|
482
|
+
field: 'teacher_follows_count',
|
483
|
+
width: 90,
|
484
|
+
title: '跟进情况',
|
485
|
+
totalRow:true,
|
486
|
+
templet: "#follow"
|
487
|
+
},
|
488
|
+
{
|
489
|
+
field: 'sales_manage',
|
490
|
+
width: 160,
|
491
|
+
title: '销售经理',
|
492
|
+
},
|
493
|
+
{
|
494
|
+
field: 'staff_manage',
|
495
|
+
width: 160,
|
496
|
+
title: '生态经理',
|
497
|
+
},
|
498
|
+
{
|
499
|
+
field: 'follow_person',
|
500
|
+
width: 120,
|
501
|
+
title: '最新跟进人',
|
502
|
+
},
|
503
|
+
{
|
504
|
+
field: 'followup_at',
|
505
|
+
width: 180,
|
506
|
+
title: '最新跟进时间',
|
507
|
+
},
|
508
|
+
{
|
509
|
+
field: 'latest_time',
|
510
|
+
width: 120,
|
511
|
+
title: '无跟进天数',
|
512
|
+
sort: true,
|
513
|
+
},
|
514
|
+
{
|
515
|
+
field: 'teacher_used',
|
516
|
+
width: 120,
|
517
|
+
title: '学院渗透率',
|
518
|
+
},
|
519
|
+
{
|
520
|
+
field: 'students',
|
521
|
+
width: 60,
|
522
|
+
totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
|
523
|
+
title: '学生',
|
524
|
+
},
|
525
|
+
{
|
526
|
+
field: 'courses_count',
|
527
|
+
width: 60,
|
528
|
+
title: '课堂',
|
529
|
+
totalRow:true,
|
530
|
+
templet: "#class"
|
531
|
+
},
|
532
|
+
{
|
533
|
+
field: 'activities_count',
|
534
|
+
width: 100,
|
535
|
+
title: '参与活动',
|
536
|
+
templet: "#event"
|
537
|
+
},
|
538
|
+
{
|
539
|
+
field: 'created_on',
|
540
|
+
width: 120,
|
541
|
+
title: '注册时间',
|
542
|
+
sort: true,
|
543
|
+
},
|
544
|
+
{
|
545
|
+
field: 'last_login_on',
|
546
|
+
width: 120,
|
547
|
+
title: '最近登录',
|
548
|
+
sort: true,
|
549
|
+
},
|
550
|
+
{
|
551
|
+
field: 'created_at',
|
552
|
+
width: 120,
|
553
|
+
title: '添加时间',
|
554
|
+
sort: true,
|
555
|
+
},
|
556
|
+
{
|
557
|
+
field: 'experience',
|
558
|
+
width: 120,
|
559
|
+
title: '经验值',
|
560
|
+
sort: true,
|
561
|
+
},
|
562
|
+
{
|
563
|
+
field: 'grade',
|
564
|
+
width: 120,
|
565
|
+
title: '金币',
|
566
|
+
sort: true,
|
567
|
+
},
|
568
|
+
{
|
569
|
+
field: 'mobile',
|
570
|
+
width: 120,
|
571
|
+
title: '联系电话',
|
572
|
+
},
|
573
|
+
{
|
574
|
+
field: 'wechat',
|
575
|
+
width: 120,
|
576
|
+
title: '微信号',
|
577
|
+
},
|
578
|
+
{
|
579
|
+
field: 'teacher_assist',
|
580
|
+
width: 120,
|
581
|
+
title: '教研助理',
|
582
|
+
},
|
583
|
+
{
|
584
|
+
field: 'is_contact',
|
585
|
+
width: 120,
|
586
|
+
title: '是否联系上'
|
587
|
+
},
|
588
|
+
{
|
589
|
+
title: '操作',
|
590
|
+
minWidth: 270,
|
591
|
+
toolbar: '#currentTableBar',
|
592
|
+
align: "center",
|
593
|
+
fixed: 'right'
|
594
|
+
}
|
595
|
+
]
|
596
|
+
],
|
597
|
+
|
402
598
|
limit: 20,
|
403
|
-
|
599
|
+
limits: [10,15,20,30,40,50,60,70,80,90],
|
404
600
|
page: true,
|
405
601
|
done: function (res) {
|
406
602
|
drowpdwonRender()
|
@@ -408,7 +604,7 @@
|
|
408
604
|
});
|
409
605
|
var dropmenu = gon.menus;
|
410
606
|
|
411
|
-
drowpdwonRender = function
|
607
|
+
drowpdwonRender = function() {
|
412
608
|
dropdown.render({
|
413
609
|
elem: '.more-btn',
|
414
610
|
data: dropmenu,
|
@@ -780,6 +976,23 @@
|
|
780
976
|
$(window).on("resize", function () {
|
781
977
|
layer.full(index);
|
782
978
|
});
|
979
|
+
}else if(obj.event === 'assign'){ //指派生态经理
|
980
|
+
var content = miniPage.getHrefContent('/missions/teachers/' + id + '/assign');
|
981
|
+
var openWH = miniPage.getOpenWidthHeight();
|
982
|
+
var name = data.name;
|
983
|
+
sindex = layer.open({
|
984
|
+
title: '指派教师【' + name + "】生态经理",
|
985
|
+
type: 1,
|
986
|
+
shade: 0.2,
|
987
|
+
maxmin: true,
|
988
|
+
shadeClose: true,
|
989
|
+
area: ['600px', '300px'],
|
990
|
+
content: content
|
991
|
+
});
|
992
|
+
$(window).on("resize", function () {
|
993
|
+
layer.full(sindex);
|
994
|
+
});
|
995
|
+
return false;
|
783
996
|
}
|
784
997
|
});
|
785
998
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-form layuimini-form" style="padding:30px">
|
3
|
+
<div class="layui-form-item">
|
4
|
+
<label class="layui-form-label required">选择生态经理:</label>
|
5
|
+
<div class="layui-input-block" style="width: 300px">
|
6
|
+
<div id="staff_manage_id"></div>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
<hr>
|
10
|
+
<div class="layui-form-item">
|
11
|
+
<div class="layui-input-block">
|
12
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<script>
|
18
|
+
layui.use(['form', 'table', 'upload', 'request', 'selectInput'], function () {
|
19
|
+
var form = layui.form,
|
20
|
+
layer = layui.layer,
|
21
|
+
request = layui.request,
|
22
|
+
$ = layui.$;
|
23
|
+
|
24
|
+
form.render();
|
25
|
+
staff_list_select = xmSelect.render({
|
26
|
+
el: '#staff_manage_id',
|
27
|
+
data: gon.staff_manages,
|
28
|
+
filterable: true,
|
29
|
+
radio: false,
|
30
|
+
});
|
31
|
+
var parentIndex = layer.index;
|
32
|
+
form.on('submit(saveBtn)', function () {
|
33
|
+
layer.confirm('确定指派生态经理?', function (index) {
|
34
|
+
request.post('missions/teachers/' + parent.id +"/assign_staff", {to_id: staff_list_select.getValue('valueStr')}, function () {
|
35
|
+
layer.close(index);
|
36
|
+
layer.close(parentIndex);
|
37
|
+
parent.table.reload('teachers_table')
|
38
|
+
})
|
39
|
+
});
|
40
|
+
return false;
|
41
|
+
});
|
42
|
+
});
|
43
|
+
</script>
|
@@ -25,7 +25,11 @@ json.data do
|
|
25
25
|
json.followup_at d.follow_up&.created_at&.to_s
|
26
26
|
json.latest_time (d['latest_time'] ? DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d['latest_time'].strftime("%Y-%m-%d")) : DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d.created_at.strftime("%Y-%m-%d"))).to_i
|
27
27
|
|
28
|
-
|
28
|
+
assign_staff_manages = []
|
29
|
+
d.assign_staffs.each do |assign|
|
30
|
+
assign_staff_manages << assign.staff&.user&.real_name
|
31
|
+
end
|
32
|
+
json.staff_manage @staff_manages[d.department&.school&.province].present? ? (@staff_manages[d.department&.school&.province] + assign_staff_manages).uniq.join(",") : assign_staff_manages
|
29
33
|
json.sales_manage @sales_manages[d.department&.school&.province]&.join(",")
|
30
34
|
|
31
35
|
if d.department_id
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html>
|
3
3
|
|
4
4
|
<head>
|
5
|
+
<title>头歌营销系统</title>
|
5
6
|
<%= csrf_meta_tags %>
|
6
7
|
<%= csp_meta_tag %>
|
7
8
|
<%= Gon::Base.render_data %>
|
@@ -16,6 +17,8 @@
|
|
16
17
|
<div class="layui-header">
|
17
18
|
<a href="/missions">
|
18
19
|
<div class="layui-bg-black layuimini-logo layui-logo" id="head_a">
|
20
|
+
<%= image_tag "educode_sales/logo.png", class: 'header-logo' %>
|
21
|
+
<span class="app-title">营销系统</span>
|
19
22
|
</div>
|
20
23
|
</a>
|
21
24
|
|
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.0
|
4
|
+
version: 1.10.0
|
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-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -448,6 +448,7 @@ files:
|
|
448
448
|
- app/views/educode_sales/money_plan_records/index.json.jbuilder
|
449
449
|
- app/views/educode_sales/money_plans/_index.html.erb
|
450
450
|
- app/views/educode_sales/money_plans/add.html.erb
|
451
|
+
- app/views/educode_sales/money_plans/edit.html.erb
|
451
452
|
- app/views/educode_sales/money_plans/index.json.jbuilder
|
452
453
|
- app/views/educode_sales/money_plans/list.html.erb
|
453
454
|
- app/views/educode_sales/operation_plans/_monthPlan.html.erb
|
@@ -592,6 +593,7 @@ files:
|
|
592
593
|
- app/views/educode_sales/teachers/add_courses.html.erb
|
593
594
|
- app/views/educode_sales/teachers/add_event.html.erb
|
594
595
|
- app/views/educode_sales/teachers/add_keys.html.erb
|
596
|
+
- app/views/educode_sales/teachers/assign.html.erb
|
595
597
|
- app/views/educode_sales/teachers/course_list.json.jbuilder
|
596
598
|
- app/views/educode_sales/teachers/course_subject.json.jbuilder
|
597
599
|
- app/views/educode_sales/teachers/daily_paper.html.erb
|