educode_sales 0.6.4 → 0.6.5
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 +22 -4
- data/app/controllers/educode_sales/money_plans_controller.rb +7 -6
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +11 -2
- data/app/views/educode_sales/businesses/file.html.erb +8 -4
- data/app/views/educode_sales/businesses/index.html.erb +93 -12
- data/app/views/educode_sales/businesses/index.json.jbuilder +3 -2
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +7 -2
- data/app/views/educode_sales/customers/edit.html.erb +3 -0
- data/app/views/educode_sales/customers/edit_follow_record.html.erb +1 -1
- data/app/views/educode_sales/customers/new.html.erb +3 -0
- data/app/views/educode_sales/customers/new_follow_record.html.erb +1 -1
- data/app/views/educode_sales/customers/show_follow.html.erb +1 -1
- data/app/views/educode_sales/money_plans/index.html.erb +45 -6
- data/app/views/educode_sales/money_plans/index.json.jbuilder +2 -1
- data/app/views/educode_sales/places/index.html.erb +16 -2
- data/app/views/educode_sales/places/index.json.jbuilder +3 -1
- data/app/views/educode_sales/recycles/business.json.jbuilder +2 -2
- data/app/views/educode_sales/sales/index.json.jbuilder +2 -2
- data/app/views/educode_sales/teachers/index.html.erb +15 -7
- data/db/migrate/20210902064109_create_educode_sales_role_permissions.rb +5 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abfb5bbc3cbbe65b1c987c9e1b77bca81d06086e2db8b6c788163fdba557f2ef
|
4
|
+
data.tar.gz: 7e2a1aabfab1f07c614a76d65f33560f6da3e7d05200a819c4d7b905c5d976c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30bac077609756d5eb7ab205d40f2c3f2b7db4f88797c636038051316c1917af74a88f4cf390878c6b8adc83f4bf4e417d723ef349ecdbfc375a8176e5a3a6a8
|
7
|
+
data.tar.gz: 3b4b074197ba779c5b8f8134e97b1633f6173f8ba7a46232d761b132b123b1ffa1ac39fa1b47d484ce82197d060b02dbde8bf8d07fb9c1c5bff1e783d3b485e6
|
@@ -33,15 +33,25 @@ module EducodeSales
|
|
33
33
|
format.html do
|
34
34
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
35
35
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
36
|
-
@more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business)
|
36
|
+
# @more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business) || can?(:show_file, EducodeSales::Business)
|
37
|
+
@more = true
|
37
38
|
gon.menus = []
|
38
39
|
gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
|
40
|
+
gon.business_type = Common.where(clazz: 'business_type').map do |d|
|
41
|
+
{value: d.id, name: d.name}
|
42
|
+
end
|
43
|
+
gon.type = params[:clazz_id].present? ? [{ value: params[:clazz_id], name: Common.find(params[:clazz_id]).name }] : []
|
44
|
+
gon.business_step = Common.where(clazz: 'business_step').map do |d|
|
45
|
+
{value: d.id, name: d.name}
|
46
|
+
end
|
39
47
|
if can?(:create, EducodeSales::SalePlan)
|
40
48
|
gon.menus << { title: '添加周计划', event: 'week' }
|
41
49
|
gon.menus << { title: '添加月计划', event: 'month' }
|
42
50
|
end
|
43
51
|
gon.menus << { title: '跟进时间线', event: 'time_line' }
|
44
|
-
|
52
|
+
if can?(:show_file, EducodeSales::Business)
|
53
|
+
gon.menus << { title: '附件管理', event: 'file' }
|
54
|
+
end
|
45
55
|
if can?(:update, EducodeSales::Business)
|
46
56
|
gon.menus << { title: '编辑', event: 'edit' }
|
47
57
|
end
|
@@ -137,12 +147,12 @@ module EducodeSales
|
|
137
147
|
if params[:q].present? && params[:q][:business_type].present?
|
138
148
|
@businesses = @businesses.joins("
|
139
149
|
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
140
|
-
").where("educode_sales_follow_ups.clazz_id
|
150
|
+
").where("educode_sales_follow_ups.clazz_id in (?)", params[:q][:business_type].split(",").map(&:to_i))
|
141
151
|
end
|
142
152
|
if params[:q].present? && params[:q][:business_step].present?
|
143
153
|
@businesses = @businesses.joins("
|
144
154
|
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
145
|
-
").where("educode_sales_follow_ups.stage_id
|
155
|
+
").where("educode_sales_follow_ups.stage_id in (?)", params[:q][:business_step].split(",").map(&:to_i))
|
146
156
|
end
|
147
157
|
if params[:q].present? && params[:q][:place_id].present?
|
148
158
|
@businesses = @businesses.joins("
|
@@ -177,6 +187,13 @@ module EducodeSales
|
|
177
187
|
@businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ?", date[0], date[1] + '23:59:59')
|
178
188
|
end
|
179
189
|
|
190
|
+
if params[:q].present? && params[:q][:invitation_at].present?
|
191
|
+
date = params[:q][:invitation_at].split(" - ")
|
192
|
+
@businesses = @businesses.joins("
|
193
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
194
|
+
").where("educode_sales_follow_ups.invitation_at > ? AND educode_sales_follow_ups.invitation_at < ?", date[0] + '00:00:00', date[1] + '23:59:59')
|
195
|
+
end
|
196
|
+
|
180
197
|
if params[:sort].present? && params[:sort][:field]
|
181
198
|
@businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
182
199
|
else
|
@@ -195,6 +212,7 @@ module EducodeSales
|
|
195
212
|
last_follow.signed_date,
|
196
213
|
last_follow.created_at as latest_time,
|
197
214
|
last_follow.actual_amount,
|
215
|
+
(last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
|
198
216
|
last_follow.total_amount").joins("
|
199
217
|
LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
|
200
218
|
").page(params[:page]).per(params[:limit])
|
@@ -12,21 +12,22 @@ module EducodeSales
|
|
12
12
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
13
13
|
end
|
14
14
|
format.json do
|
15
|
+
x_id = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
15
16
|
if @current_admin.is_admin?
|
16
|
-
@money_plans = MoneyPlan.where(follow_up_id: follow_up_ids)
|
17
|
+
@money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids)
|
17
18
|
else
|
18
19
|
level = @current_admin.role.role_areas.find_by(clazz: '回款管理').level
|
19
20
|
case level
|
20
21
|
when '自己'
|
21
|
-
@money_plans = MoneyPlan.where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id)
|
22
|
+
@money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id)
|
22
23
|
when '区域'
|
23
24
|
a_ids = MoneyPlan.where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id).ids
|
24
25
|
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
|
25
26
|
b_ids = Business.where(school_id: school_ids).pluck(:last_follow_up_id)
|
26
27
|
ids = a_ids + b_ids
|
27
|
-
@money_plans = MoneyPlan.where(id: ids)
|
28
|
+
@money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(id: ids)
|
28
29
|
else
|
29
|
-
@money_plans = MoneyPlan.where(follow_up_id: follow_up_ids)
|
30
|
+
@money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids)
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -47,13 +48,13 @@ module EducodeSales
|
|
47
48
|
end
|
48
49
|
if params[:q].present? && params[:q][:date].present?
|
49
50
|
date = params[:q][:date].split(" - ")
|
50
|
-
@money_plans = @money_plans.where("educode_sales_money_plans.
|
51
|
+
@money_plans = @money_plans.where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at < ?", date[0], date[1] + '23:59:59')
|
51
52
|
end
|
52
53
|
|
53
54
|
if params[:sort].present? && params[:sort][:field]
|
54
55
|
@money_plans = @money_plans.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
55
56
|
else
|
56
|
-
@money_plans = @money_plans.order(
|
57
|
+
@money_plans = @money_plans.order(date_at: :desc)
|
57
58
|
end
|
58
59
|
@total_amount = @money_plans.sum(:amount)
|
59
60
|
@money_plans = @money_plans.page(params[:page]).per(params[:limit])
|
@@ -69,12 +69,14 @@
|
|
69
69
|
<div class="layui-input-inline">
|
70
70
|
<input name="total_amount" type="number" class="layui-input" value="<%= @follow_up.total_amount %>">
|
71
71
|
</div>
|
72
|
-
</div>
|
72
|
+
客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
|
73
|
+
<br>
|
73
74
|
<div class="layui-inline">
|
74
75
|
<label class="layui-form-label">合同额(万)</label>
|
75
76
|
<div class="layui-input-inline">
|
76
77
|
<input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
|
77
78
|
</div>
|
79
|
+
客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
|
78
80
|
</div>
|
79
81
|
<br>
|
80
82
|
<div class="layui-inline place_select">
|
@@ -82,7 +84,9 @@
|
|
82
84
|
<div class="layui-input-inline" style="z-index: 101">
|
83
85
|
<div id="edit_place" style="width: 190px;"></div>
|
84
86
|
</div>
|
87
|
+
总额里,渠道拿到的部分。
|
85
88
|
</div>
|
89
|
+
<br>
|
86
90
|
<div class="layui-inline">
|
87
91
|
<label class="layui-form-label">渠道分成(万)</label>
|
88
92
|
<div class="layui-input-inline">
|
@@ -95,7 +99,8 @@
|
|
95
99
|
<div class="layui-input-inline">
|
96
100
|
<input type="text" class="layui-input" name="year" lay-verify="required" autocomplete="off" id="edit_year"
|
97
101
|
value="<%= @follow_up&.year%>"
|
98
|
-
placeholder="请选择年度">
|
102
|
+
placeholder="请选择年度">
|
103
|
+
</div>
|
99
104
|
</div>
|
100
105
|
</div>
|
101
106
|
<div class="layui-form-item">
|
@@ -103,6 +108,10 @@
|
|
103
108
|
<div class="layui-input-inline">
|
104
109
|
<div id="edit_assign_follow" style="width: 512px;"></div>
|
105
110
|
</div>
|
111
|
+
<div class="layui-inline" style="padding: 9px 15px">
|
112
|
+
<label class="layui-form-label" style="padding-left: 220px"></label>
|
113
|
+
指定跟进人和商机创建者,同时拥有对该商机的管理权限
|
114
|
+
</div>
|
106
115
|
</div>
|
107
116
|
<div class="layui-form-item layui-form-text">
|
108
117
|
<label class="layui-form-label required">最新进展</label>
|
@@ -2,9 +2,9 @@
|
|
2
2
|
<script type="text/html" id="toolbarDemo">
|
3
3
|
<div class="layui-btn-container">
|
4
4
|
<span class="table-label">附件信息</span>
|
5
|
-
|
5
|
+
<% if can? :upload_file, EducodeSales::Business %>
|
6
6
|
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
|
7
|
-
|
7
|
+
<% end %>
|
8
8
|
</div>
|
9
9
|
</script>
|
10
10
|
|
@@ -12,8 +12,12 @@
|
|
12
12
|
|
13
13
|
<script type="text/html" id="currentTableBar_file">
|
14
14
|
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
|
15
|
-
|
16
|
-
|
15
|
+
<% if can? :download_file, EducodeSales::Business %>
|
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::Business %>
|
19
|
+
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
|
20
|
+
<% end %>
|
17
21
|
</script>
|
18
22
|
|
19
23
|
<script type="text/html" id="showchance">
|
@@ -33,41 +33,49 @@
|
|
33
33
|
<%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true } %>
|
34
34
|
</div>
|
35
35
|
</div>
|
36
|
-
<div class="layui-inline">
|
36
|
+
<div class="layui-inline show_item" style="display:none;">
|
37
37
|
<label class="layui-form-label">项目类型</label>
|
38
38
|
<div class="layui-input-inline">
|
39
|
-
|
39
|
+
<div id="business_type" style="width: 190px;"></div>
|
40
40
|
</div>
|
41
41
|
</div>
|
42
|
-
<div class="layui-inline">
|
42
|
+
<div class="layui-inline show_item" style="display:none;">
|
43
43
|
<label class="layui-form-label">项目阶段</label>
|
44
44
|
<div class="layui-input-inline">
|
45
|
-
|
45
|
+
<div id="business_step" style="width: 190px;"></div>
|
46
46
|
</div>
|
47
47
|
</div>
|
48
|
-
<div class="layui-inline">
|
48
|
+
<div class="layui-inline show_item" style="display:none;">
|
49
49
|
<label class="layui-form-label">渠道名称</label>
|
50
50
|
<div class="layui-input-inline">
|
51
51
|
<div id="index_place" style="width: 190px;"></div>
|
52
52
|
</div>
|
53
53
|
</div>
|
54
|
-
<div class="layui-inline">
|
54
|
+
<div class="layui-inline show_item" style="display:none;">
|
55
55
|
<label class="layui-form-label">区域</label>
|
56
56
|
<div class="layui-input-inline">
|
57
57
|
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
58
58
|
</div>
|
59
59
|
</div>
|
60
|
-
<div class="layui-inline">
|
60
|
+
<div class="layui-inline show_item" style="display:none;">
|
61
61
|
<label class="layui-form-label">创建时间</label>
|
62
62
|
<div class="layui-input-inline">
|
63
63
|
<input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
|
64
64
|
</div>
|
65
65
|
</div>
|
66
|
+
<div class="layui-inline show_item" style="display:none;">
|
67
|
+
<label class="layui-form-label">招标时间</label>
|
68
|
+
<div class="layui-input-inline">
|
69
|
+
<input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - ">
|
70
|
+
</div>
|
71
|
+
</div>
|
66
72
|
<div class="layui-inline">
|
67
73
|
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
68
74
|
</button>
|
69
75
|
<button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">搜索
|
70
76
|
</button>
|
77
|
+
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="show_hide">展开/收起
|
78
|
+
</button>
|
71
79
|
</div>
|
72
80
|
</div>
|
73
81
|
</form>
|
@@ -126,6 +134,10 @@
|
|
126
134
|
elem: '#date',
|
127
135
|
range: true
|
128
136
|
});
|
137
|
+
laydate.render({
|
138
|
+
elem: '#invitation_at',
|
139
|
+
range: true
|
140
|
+
});
|
129
141
|
|
130
142
|
var is_show = <%=params[:name].present? || params[:clazz_id].present? || params[:place_id].present? || params[:school].present? %>
|
131
143
|
if(is_show){
|
@@ -135,6 +147,15 @@
|
|
135
147
|
$('.businesses_list_div').addClass('layui-show');
|
136
148
|
}
|
137
149
|
|
150
|
+
var business_type_list = xmSelect.render({
|
151
|
+
el: '#business_type',
|
152
|
+
data: gon.business_type
|
153
|
+
})
|
154
|
+
business_type_list.setValue(gon.type)
|
155
|
+
var business_step_list = xmSelect.render({
|
156
|
+
el: '#business_step',
|
157
|
+
data: gon.business_step
|
158
|
+
})
|
138
159
|
var index_place_list = xmSelect.render({
|
139
160
|
el: '#index_place',
|
140
161
|
model: {
|
@@ -189,10 +210,6 @@
|
|
189
210
|
defaultToolbar: ['filter'],
|
190
211
|
toolbar: '#bussinessBar',
|
191
212
|
totalRow: true,//开启合并行
|
192
|
-
initSort: {
|
193
|
-
field: 'latest_time' //排序字段,对应 cols 设定的各字段名
|
194
|
-
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
195
|
-
},
|
196
213
|
cols: [
|
197
214
|
[
|
198
215
|
{
|
@@ -304,6 +321,13 @@
|
|
304
321
|
sort: true,
|
305
322
|
totalRow: true
|
306
323
|
},
|
324
|
+
{
|
325
|
+
field: 'wait_return_money',
|
326
|
+
width: 100,
|
327
|
+
title: '待回款',
|
328
|
+
sort: true,
|
329
|
+
totalRow: true
|
330
|
+
},
|
307
331
|
{
|
308
332
|
field: 'place',
|
309
333
|
width: 160,
|
@@ -485,7 +509,17 @@
|
|
485
509
|
|
486
510
|
// 监听搜索操作
|
487
511
|
form.on('submit(search_bussiness)', function (data) {
|
512
|
+
var business_type = [];
|
513
|
+
business_type_list.getValue().forEach(function(d) {
|
514
|
+
business_type.push(d.value);
|
515
|
+
})
|
516
|
+
var business_step = [];
|
517
|
+
business_step_list.getValue().forEach(function(d) {
|
518
|
+
business_step.push(d.value);
|
519
|
+
})
|
488
520
|
data.field.place_id = index_place_list.getValue('valueStr');
|
521
|
+
data.field.business_type = business_type.toString();
|
522
|
+
data.field.business_step = business_step.toString();
|
489
523
|
search = data.field
|
490
524
|
console.log(search);
|
491
525
|
table.reload('businesses_table', {
|
@@ -507,12 +541,59 @@
|
|
507
541
|
return false;
|
508
542
|
});
|
509
543
|
|
544
|
+
form.on('submit(show_hide)', function (data) {
|
545
|
+
$(".show_item").toggle()
|
546
|
+
return false;
|
547
|
+
});
|
510
548
|
form.on('submit(reset_business_search)', function (data) {
|
511
549
|
var field = data.field;
|
512
550
|
form.val('search_form', {
|
513
551
|
name: '', department: '', staff_id: '', business_type: '', business_step: '',
|
514
|
-
place_id: '', date: '', area: ''
|
552
|
+
place_id: '', date: '', area: '', invitation_at: ''
|
515
553
|
})
|
554
|
+
var index_place_list = xmSelect.render({
|
555
|
+
el: '#index_place',
|
556
|
+
model: {
|
557
|
+
icon: 'hidden',
|
558
|
+
label: {
|
559
|
+
type: 'text',
|
560
|
+
text: {
|
561
|
+
//左边拼接的字符
|
562
|
+
left: '',
|
563
|
+
//右边拼接的字符
|
564
|
+
right: '',
|
565
|
+
//中间的分隔符
|
566
|
+
separator: ', ',
|
567
|
+
},
|
568
|
+
}
|
569
|
+
},
|
570
|
+
remoteSearch: true,
|
571
|
+
clickClose: true,
|
572
|
+
delay: 1000,
|
573
|
+
paging: true,
|
574
|
+
radio: true,
|
575
|
+
pageRemote: true,
|
576
|
+
filterable: true,
|
577
|
+
remoteMethod: function (val, cb, show, pageIndex) {
|
578
|
+
$.ajax( '/missions/sales_place', {
|
579
|
+
method: 'get',
|
580
|
+
data: {
|
581
|
+
q: val,
|
582
|
+
page: pageIndex
|
583
|
+
},
|
584
|
+
dataType: 'json',
|
585
|
+
success: function (res) {
|
586
|
+
var data = res.data;
|
587
|
+
if (res.code == 0) {
|
588
|
+
cb(res.data, res.count);
|
589
|
+
} else {
|
590
|
+
layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
|
591
|
+
}
|
592
|
+
|
593
|
+
}
|
594
|
+
})
|
595
|
+
}
|
596
|
+
})
|
516
597
|
return false;
|
517
598
|
});
|
518
599
|
|
@@ -6,7 +6,7 @@ json.data do
|
|
6
6
|
json.department d.department.name
|
7
7
|
json.school d.department.school.name
|
8
8
|
json.school_id d.department.school.id
|
9
|
-
json.follow_ups_count d.
|
9
|
+
json.follow_ups_count d.follow_ups.where(deleted_at: nil).size
|
10
10
|
follow_ups_count += d.follow_ups_count
|
11
11
|
json.follow_up_id d.last_follow_up_id
|
12
12
|
# json.teachers_count d.follow_ups.sum(:key_people_count)
|
@@ -20,13 +20,14 @@ json.data do
|
|
20
20
|
json.total_amount d.last_follow_up&.total_amount
|
21
21
|
json.actual_amount d.last_follow_up&.actual_amount
|
22
22
|
json.return_money d.return_money
|
23
|
+
json.wait_return_money d.wait_return_money
|
23
24
|
json.place d.last_follow_up&.place&.name
|
24
25
|
json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff.user.real_name : EducodeSales::Staff.find(d.staff_id).user.real_name
|
25
26
|
json.source d.source
|
26
27
|
json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
|
27
28
|
json.current_staff_id @current_admin.id
|
28
29
|
json.staff_id d.staff_id
|
29
|
-
json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s :
|
30
|
+
json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s : ''
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -74,13 +74,15 @@
|
|
74
74
|
<input name="total_amount" type="number" class="layui-input" autocomplete="off"
|
75
75
|
value="<%= @last_follow_up&.total_amount%>">
|
76
76
|
</div>
|
77
|
-
</div>
|
77
|
+
客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
|
78
|
+
<br>
|
78
79
|
<div class="layui-inline">
|
79
80
|
<label class="layui-form-label">合同额(万)</label>
|
80
81
|
<div class="layui-input-inline">
|
81
82
|
<input name="actual_amount" type="number" class="layui-input" autocomplete="off" placeholder="本单位的签单金额"
|
82
83
|
value="<%= @last_follow_up&.actual_amount%>">
|
83
84
|
</div>
|
85
|
+
客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
|
84
86
|
</div>
|
85
87
|
<br>
|
86
88
|
<div class="layui-inline new_place_select">
|
@@ -88,7 +90,9 @@
|
|
88
90
|
<div class="layui-input-inline" style="z-index: 101">
|
89
91
|
<div id="place" style="width: 190px;"></div>
|
90
92
|
</div>
|
93
|
+
总额里,渠道拿到的部分。
|
91
94
|
</div>
|
95
|
+
<br>
|
92
96
|
<div class="layui-inline">
|
93
97
|
<label class="layui-form-label">渠道分成(万)</label>
|
94
98
|
<div class="layui-input-inline">
|
@@ -106,7 +110,7 @@
|
|
106
110
|
</div>
|
107
111
|
<div class="layui-form-item">
|
108
112
|
<label class="layui-form-label">指定跟进人</label>
|
109
|
-
<div class="layui-input-inline"
|
113
|
+
<div class="layui-input-inline" >
|
110
114
|
<div id="assign_follow" style="width: 512px;"></div>
|
111
115
|
</div>
|
112
116
|
<div class="layui-inline" style="padding: 9px 15px">
|
@@ -144,6 +148,7 @@
|
|
144
148
|
</div>
|
145
149
|
</div>
|
146
150
|
</div>
|
151
|
+
</div>
|
147
152
|
|
148
153
|
<script>
|
149
154
|
layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id),@follow_up.department_id)%>
|
13
13
|
</div>
|
14
14
|
</div>
|
15
|
-
<div class="layui-form-item " style="padding-left:
|
15
|
+
<div class="layui-form-item " style="padding-left: 150px">
|
16
16
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit_follow_up">提交
|
17
17
|
</button>
|
18
18
|
</div>
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id)), { include_blank: true}%>
|
13
13
|
</div>
|
14
14
|
</div>
|
15
|
-
<div class="layui-form-item " style="padding-left:
|
15
|
+
<div class="layui-form-item " style="padding-left: 150px">
|
16
16
|
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="add_follow_up">提交
|
17
17
|
</button>
|
18
18
|
</div>
|
@@ -393,7 +393,7 @@
|
|
393
393
|
content = miniPage.getHrefContent('/missions/customers/edit_follow_record?id=' + data.id);
|
394
394
|
openWH = miniPage.getOpenWidthHeight();
|
395
395
|
editFollowIndex = layer.open({
|
396
|
-
title: '
|
396
|
+
title: '编辑跟进记录',
|
397
397
|
type: 1,
|
398
398
|
shade: 0.2,
|
399
399
|
maxmin: true,
|
@@ -26,7 +26,7 @@
|
|
26
26
|
</div>
|
27
27
|
</div>
|
28
28
|
<div class="layui-inline">
|
29
|
-
<label class="layui-form-label"
|
29
|
+
<label class="layui-form-label">回款时间</label>
|
30
30
|
<div class="layui-input-inline">
|
31
31
|
<input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
|
32
32
|
</div>
|
@@ -52,9 +52,7 @@
|
|
52
52
|
<script type="text/html" id="currentTableBar">
|
53
53
|
</script>
|
54
54
|
<script type="text/html" id="business">
|
55
|
-
<
|
56
|
-
<a href="/missions/businesses?name={{d.business}}&school={{d.school}}">{{d.business}}</a>
|
57
|
-
</div>
|
55
|
+
<a href="javascript:void(0);" lay-event="business" class="layui-table-link">{{ d.business }}</a>
|
58
56
|
</script>
|
59
57
|
|
60
58
|
<script type="text/html" id="school">
|
@@ -83,7 +81,7 @@
|
|
83
81
|
totalRow: true,
|
84
82
|
defaultToolbar: ['filter'],
|
85
83
|
initSort: {
|
86
|
-
field: '
|
84
|
+
field: 'date_at' //排序字段,对应 cols 设定的各字段名
|
87
85
|
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
88
86
|
},
|
89
87
|
cols: [
|
@@ -95,7 +93,7 @@
|
|
95
93
|
totalRowText:'本页/总计'
|
96
94
|
},
|
97
95
|
{
|
98
|
-
field: '
|
96
|
+
field: 'date_at',
|
99
97
|
width: 120,
|
100
98
|
sort: true,
|
101
99
|
title: '回款时间'
|
@@ -174,6 +172,47 @@
|
|
174
172
|
return false;
|
175
173
|
});
|
176
174
|
|
175
|
+
table.on('tool(place)', function (obj) {
|
176
|
+
var data = obj.data;
|
177
|
+
id = data.id
|
178
|
+
if (obj.event === 'add_event') { // 监听添加操作
|
179
|
+
var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
|
180
|
+
var openWH = miniPage.getOpenWidthHeight();
|
181
|
+
show_index = layer.open({
|
182
|
+
title: '查看商机跟进记录',
|
183
|
+
type: 1,
|
184
|
+
shade: 0.2,
|
185
|
+
maxmin: true,
|
186
|
+
shadeClose: true,
|
187
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
188
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
189
|
+
content: content
|
190
|
+
});
|
191
|
+
$(window).on("resize", function () {
|
192
|
+
layer.full(index);
|
193
|
+
});
|
194
|
+
} else if (obj.event === 'business') {
|
195
|
+
console.log(data);
|
196
|
+
business_id = data.business_id
|
197
|
+
business_name = data.business
|
198
|
+
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + data.business_id);
|
199
|
+
openWH = miniPage.getOpenWidthHeight();
|
200
|
+
index = layer.open({
|
201
|
+
title: '商机列表/' + data.business + '的跟进记录',
|
202
|
+
type: 1,
|
203
|
+
shade: 0.2,
|
204
|
+
maxmin: true,
|
205
|
+
shadeClose: true,
|
206
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
207
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
208
|
+
content: content
|
209
|
+
});
|
210
|
+
$(window).on("resize", function () {
|
211
|
+
layer.full(index);
|
212
|
+
});
|
213
|
+
}
|
214
|
+
});
|
215
|
+
|
177
216
|
});
|
178
217
|
</script>
|
179
218
|
<style>
|
@@ -2,11 +2,12 @@ total_amount = 0
|
|
2
2
|
json.data do
|
3
3
|
json.array! @money_plans do |d|
|
4
4
|
json.id d.id
|
5
|
-
json.
|
5
|
+
json.date_at d.date_at.to_s(:date)
|
6
6
|
json.amount d.amount
|
7
7
|
total_amount += d.amount
|
8
8
|
json.clazz d.clazz
|
9
9
|
json.business d.follow_up.business.name
|
10
|
+
json.business_id d.follow_up.business.id
|
10
11
|
json.school School.find(d.follow_up.business.school_id).name
|
11
12
|
json.school_id School.find(d.follow_up.business.school_id).id
|
12
13
|
json.staff d.staff.user.real_name
|
@@ -131,12 +131,26 @@
|
|
131
131
|
templet: "#business_a",
|
132
132
|
|
133
133
|
},
|
134
|
+
// {
|
135
|
+
// field: 'amount',
|
136
|
+
// width: 120,
|
137
|
+
// totalRow:true,
|
138
|
+
// sort: true,
|
139
|
+
// title: '中标金额'
|
140
|
+
// },
|
134
141
|
{
|
135
|
-
field: '
|
142
|
+
field: 'total_amount',
|
136
143
|
width: 120,
|
137
144
|
totalRow:true,
|
138
145
|
sort: true,
|
139
|
-
title: '
|
146
|
+
title: '项目总额'
|
147
|
+
},
|
148
|
+
{
|
149
|
+
field: 'divide_amount',
|
150
|
+
width: 120,
|
151
|
+
totalRow:true,
|
152
|
+
sort: true,
|
153
|
+
title: '渠道分成'
|
140
154
|
},
|
141
155
|
{
|
142
156
|
field: 'return_mount',
|
@@ -17,7 +17,9 @@ json.data do
|
|
17
17
|
business_count = EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id}").count
|
18
18
|
json.businesses_count business_count
|
19
19
|
all_businesses_count += business_count
|
20
|
-
json.amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount - divide_amount").round(2)
|
20
|
+
# json.amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount - divide_amount").round(2)
|
21
|
+
json.total_amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount").round(2)
|
22
|
+
json.divide_amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("divide_amount").round(2)
|
21
23
|
json.return_mount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id}").sum(:return_money).round(2)
|
22
24
|
end
|
23
25
|
end
|
@@ -5,8 +5,8 @@ json.data do
|
|
5
5
|
json.name business.name
|
6
6
|
json.school business.department.school.name
|
7
7
|
json.department business.department.name
|
8
|
-
json.last_follow_person business.
|
9
|
-
json.latest_time business.
|
8
|
+
json.last_follow_person business.last_follow_up_id.present? ? EducodeSales::FollowUp.unscoped.find(business.last_follow_up_id).staff.user.real_name : EducodeSales::Staff.find(business.staff_id).user.real_name
|
9
|
+
json.latest_time business.last_follow_up_id.present? ? EducodeSales::FollowUp.unscoped.find(business.last_follow_up_id).created_at.to_s : business.created_at.to_s
|
10
10
|
json.deleter EducodeSales::Staff.find(d.deleter_id).user.real_name
|
11
11
|
json.delete_time d.created_at.to_s
|
12
12
|
end
|
@@ -36,7 +36,7 @@ json.data do
|
|
36
36
|
business_d = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @d_clazz&.id).count
|
37
37
|
business_e = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @e_clazz&.id).count
|
38
38
|
business_o = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @o_clazz&.id).count
|
39
|
-
school_count = EducodeSales::CustomerExtension.where(customer_staff_id: d.id).size
|
39
|
+
school_count = EducodeSales::CustomerExtension.joins(:school).where(customer_staff_id: d.id).size
|
40
40
|
json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).sum(:total_amount).round(2)
|
41
41
|
json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).sum(:amount).round(2)
|
42
42
|
json.school_count school_count
|
@@ -58,7 +58,7 @@ json.data do
|
|
58
58
|
json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", "#{@year}-01-01", "#{@year}-12-31").sum(:total_amount).round(2)
|
59
59
|
json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").sum(:amount).round(2)
|
60
60
|
json.school_count school_count
|
61
|
-
follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
|
61
|
+
follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
|
62
62
|
json.follow_school_count follow_school_count
|
63
63
|
json.follow_school_counts EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size + EducodeSales::FollowUp.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size
|
64
64
|
follow_school_rate = (follow_school_count!=0 ? school_count.to_f * 100 / follow_school_count : 0).round(2)
|
@@ -19,44 +19,44 @@
|
|
19
19
|
<%= select_tag "professional_title", options_for_select(['教授', '研究员', '副教授', '副研究员', '讲师', '助理研究员', '助理教授'], @person&.professional_title), { include_blank: true } %>
|
20
20
|
</div>
|
21
21
|
</div>
|
22
|
-
<div class="layui-inline">
|
22
|
+
<div class="layui-inline show_item" style="display:none;">
|
23
23
|
<label class="layui-form-label">导流来源</label>
|
24
24
|
<div class="layui-input-inline">
|
25
25
|
<%= select_tag "teacher_source", options_for_select(EducodeSales::Common.where(clazz: 'teacher_source').pluck(:name, :id)), { include_blank: true } %>
|
26
26
|
</div>
|
27
27
|
</div>
|
28
|
-
<div class="layui-inline">
|
28
|
+
<div class="layui-inline show_item" style="display:none;">
|
29
29
|
<label class="layui-form-label">态度</label>
|
30
30
|
<div class="layui-input-inline">
|
31
31
|
|
32
32
|
<%= select_tag "attitude", options_for_select(EducodeSales::Common.where(clazz: 'teacher_attitude').pluck(:name, :id)), { include_blank: true } %>
|
33
33
|
</div>
|
34
34
|
</div>
|
35
|
-
<div class="layui-inline">
|
35
|
+
<div class="layui-inline show_item" style="display:none;">
|
36
36
|
<label class="layui-form-label">注册时间</label>
|
37
37
|
<div class="layui-input-inline">
|
38
38
|
<input type="text" class="layui-input" id="time" placeholder="请选择时间" autocomplete="off" name="regist_at">
|
39
39
|
</div>
|
40
40
|
</div>
|
41
|
-
<div class="layui-inline">
|
41
|
+
<div class="layui-inline show_item" style="display:none;">
|
42
42
|
<label class="layui-form-label">注册状态</label>
|
43
43
|
<div class="layui-input-inline">
|
44
44
|
<%= select_tag "status", options_for_select([["已注册","1"],["未注册","0"]]), { include_blank: true } %>
|
45
45
|
</div>
|
46
46
|
</div>
|
47
|
-
<div class="layui-inline">
|
47
|
+
<div class="layui-inline show_item" style="display:none;">
|
48
48
|
<label class="layui-form-label">区域</label>
|
49
49
|
<div class="layui-input-inline">
|
50
50
|
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
51
51
|
</div>
|
52
52
|
</div>
|
53
|
-
<div class="layui-inline">
|
53
|
+
<div class="layui-inline show_item" style="display:none;">
|
54
54
|
<label class="layui-form-label">起止时间</label>
|
55
55
|
<div class="layui-input-inline">
|
56
56
|
<input type="text" class="layui-input" id="date" name="date" autocomplete="off" placeholder=" - ">
|
57
57
|
</div>
|
58
58
|
</div>
|
59
|
-
<div class="layui-inline">
|
59
|
+
<div class="layui-inline show_item" style="display:none;">
|
60
60
|
<label class="layui-form-label">教研助理</label>
|
61
61
|
<div class="layui-input-inline">
|
62
62
|
<%= select_tag "assist", options_for_select(@staffs, params[:assist]), { 'lay-filter': 'assist', include_blank: true } %>
|
@@ -68,6 +68,8 @@
|
|
68
68
|
</button>
|
69
69
|
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_teachers">搜 索
|
70
70
|
</button>
|
71
|
+
<button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="show_hide">展开/收起
|
72
|
+
</button>
|
71
73
|
</div>
|
72
74
|
</div>
|
73
75
|
</form>
|
@@ -150,12 +152,14 @@
|
|
150
152
|
width: 60,
|
151
153
|
title:'序号',type: 'numbers',
|
152
154
|
totalRowText:'合计',
|
155
|
+
fixed: 'left'
|
153
156
|
|
154
157
|
},
|
155
158
|
{
|
156
159
|
field: 'name',
|
157
160
|
width: 80,
|
158
161
|
title: '姓名',
|
162
|
+
fixed: 'left',
|
159
163
|
templet: "#name"
|
160
164
|
},
|
161
165
|
{
|
@@ -409,6 +413,10 @@
|
|
409
413
|
})
|
410
414
|
return false;
|
411
415
|
});
|
416
|
+
form.on('submit(show_hide)', function (data) {
|
417
|
+
$(".show_item").toggle()
|
418
|
+
return false;
|
419
|
+
});
|
412
420
|
/**
|
413
421
|
* toolbar事件监听
|
414
422
|
*/
|
@@ -8,6 +8,11 @@ class CreateEducodeSalesRolePermissions < ActiveRecord::Migration[5.2]
|
|
8
8
|
end
|
9
9
|
if EducodeSales::Permission.last.nil?
|
10
10
|
|
11
|
+
#附件管理权限
|
12
|
+
EducodeSales::Permission.create(name: '查看附件', subject: 'Business', action: 'show_file', clazz: 'business', position: '11')
|
13
|
+
EducodeSales::Permission.create(name: '上传附件', subject: 'Business', action: 'upload_file', clazz: 'business', position: '11')
|
14
|
+
EducodeSales::Permission.create(name: '下载附件', subject: 'Business', action: 'download_file', clazz: 'business', position: '11')
|
15
|
+
EducodeSales::Permission.create(name: '删除附件', subject: 'Business', action: 'delete_file', clazz: 'business', position: '11')
|
11
16
|
#回款管理权限
|
12
17
|
EducodeSales::Permission.create(name: '查看回款列表', subject: 'MoneyPlan', action: 'read', clazz: 'money_plan', position: '15')
|
13
18
|
|
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: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|