educode_sales 0.5.7 → 0.5.8
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 +19 -3
- data/app/controllers/educode_sales/follow_ups_controller.rb +9 -9
- data/app/controllers/educode_sales/home_controller.rb +9 -4
- data/app/controllers/educode_sales/sale_trends_controller.rb +18 -7
- data/app/controllers/educode_sales/sales_controller.rb +3 -0
- data/app/controllers/educode_sales/teachers_controller.rb +5 -0
- data/app/views/educode_sales/businesses/_follows.html.erb +38 -16
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +13 -0
- data/app/views/educode_sales/businesses/index.html.erb +24 -4
- data/app/views/educode_sales/businesses/index.json.jbuilder +1 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +13 -0
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -0
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -0
- data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_monthly.html.erb +2 -0
- data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +6 -0
- data/app/views/educode_sales/operation_plans/_weekly.html.erb +2 -0
- data/app/views/educode_sales/plans/_monthPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_monthly.html.erb +1 -0
- data/app/views/educode_sales/plans/_weekPlan.html.erb +5 -0
- data/app/views/educode_sales/plans/_weekly.html.erb +1 -0
- data/app/views/educode_sales/sales/index.html.erb +18 -3
- data/app/views/educode_sales/sales/index.json.jbuilder +27 -14
- data/app/views/educode_sales/sales/operations.html.erb +1 -0
- data/app/views/educode_sales/teachers/index.html.erb +6 -1
- data/db/migrate/20211206054756_add_year_to_follow_ups.rb +5 -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: cb7ba8647915177726d6f9f525ea700b0e7ca469bf8ff7460d27a8d3e5204c28
|
4
|
+
data.tar.gz: d56bb7b39f7f44dc59b2d733ae60af4d3aee9135f8ee60e0721a5723bf20fc7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b2d57743dbf47151f106931393b6e4e9671a8bba6b8393e3769954ddb8a82cb914c85ee926c16595ec546f2e7826a569590d6d9589d12d67d0858a77c2effc6
|
7
|
+
data.tar.gz: 96d8209f672ee5118f30da45bb672db2139f9890148c0bfff46873df59329d8aa5b1c9e1763e7c063048e994f03399706fd8e850a8502e8cd8d08bcae3e44dc0
|
@@ -149,10 +149,24 @@ module EducodeSales
|
|
149
149
|
|
150
150
|
if params[:q].present? && params[:q][:area].present?
|
151
151
|
p = EducodeSales::Common.find(params[:q][:area]).name
|
152
|
-
|
152
|
+
if @current_admin.is_admin?
|
153
|
+
@businesses = @businesses.joins("
|
154
|
+
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
155
|
+
JOIN schools ON departments.school_id = schools.id
|
156
|
+
").where("province = ?", p)
|
157
|
+
else
|
158
|
+
level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
|
159
|
+
if level == "区域"
|
160
|
+
@businesses = @businesses.joins("
|
161
|
+
JOIN schools ON departments.school_id = schools.id
|
162
|
+
").where("province = ?", p)
|
163
|
+
else
|
164
|
+
@businesses = @businesses.joins("
|
153
165
|
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
154
166
|
JOIN schools ON departments.school_id = schools.id
|
155
167
|
").where("province = ?", p)
|
168
|
+
end
|
169
|
+
end
|
156
170
|
end
|
157
171
|
|
158
172
|
if params[:q].present? && params[:q][:date].present?
|
@@ -261,6 +275,7 @@ module EducodeSales
|
|
261
275
|
|
262
276
|
def new_follow_record
|
263
277
|
load_business
|
278
|
+
@years = (2015..Time.now.year).to_a.reverse
|
264
279
|
@o_name = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.name
|
265
280
|
@clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
|
266
281
|
@stages = Common.where(clazz: 'business_step').order("position").pluck(:name, :id)
|
@@ -270,7 +285,7 @@ module EducodeSales
|
|
270
285
|
gon.sales = @last_follow_up.assign_follow_ups.map do |d|
|
271
286
|
{value: d.staff_id, name: d.staff.user.full_name}
|
272
287
|
end
|
273
|
-
gon.place = [{ value: @last_follow_up.place&.id, name: @last_follow_up.place&.name }]
|
288
|
+
gon.place = @last_follow_up.place.present? ? [{ value: @last_follow_up.place&.id, name: @last_follow_up.place&.name }] : []
|
274
289
|
end
|
275
290
|
render layout: false
|
276
291
|
end
|
@@ -296,6 +311,7 @@ module EducodeSales
|
|
296
311
|
end
|
297
312
|
|
298
313
|
def edit_follow_record
|
314
|
+
@years = (2015..Time.now.year).to_a.reverse
|
299
315
|
@o_name = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.name
|
300
316
|
@follow_up = FollowUp.find(params[:follow_up_id])
|
301
317
|
@clazz = Common.where(clazz: 'business_type').order("position").pluck(:name, :id)
|
@@ -304,7 +320,7 @@ module EducodeSales
|
|
304
320
|
gon.sales = @follow_up.assign_follow_ups.map do |d|
|
305
321
|
{value: d.staff_id, name: d.staff.user.full_name}
|
306
322
|
end
|
307
|
-
gon.place = [{ value: @follow_up.place&.id, name: @follow_up.place&.name }]
|
323
|
+
gon.place = @follow_up.place.present? ? [{ value: @follow_up.place&.id, name: @follow_up.place&.name }] : [value: '', name: '']
|
308
324
|
render layout: false
|
309
325
|
end
|
310
326
|
|
@@ -29,22 +29,22 @@ module EducodeSales
|
|
29
29
|
@follow_ups = FollowUp.all
|
30
30
|
end
|
31
31
|
end
|
32
|
-
if params[:q].present? && params[:q][:
|
33
|
-
@follow_ups = @follow_ups.joins(:business).where("educode_sales_businesses.name LIKE ?", "%#{params[:q][:
|
32
|
+
if params[:q].present? && params[:q][:name].present?
|
33
|
+
@follow_ups = @follow_ups.joins(:business).where("educode_sales_businesses.name LIKE ?", "%#{params[:q][:name]}%")
|
34
34
|
end
|
35
35
|
if params[:q].present? && params[:q][:follows_date].present?
|
36
36
|
date = params[:q][:follows_date].split(" - ")
|
37
37
|
@follow_ups = @follow_ups.where("educode_sales_follow_ups.created_at > ? AND educode_sales_follow_ups.created_at < ?", date[0], date[1])
|
38
38
|
end
|
39
|
-
if params[:q].present? && params[:q][:
|
40
|
-
@follow_ups = @follow_ups.where(staff_id: params[:q][:
|
39
|
+
if params[:q].present? && params[:q][:staff_id].present?
|
40
|
+
@follow_ups = @follow_ups.where(staff_id: params[:q][:staff_id])
|
41
41
|
end
|
42
|
-
if params[:q].present? && params[:q][:
|
43
|
-
departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:
|
42
|
+
if params[:q].present? && params[:q][:department].present?
|
43
|
+
departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:department]}%").pluck(:id)
|
44
44
|
@follow_ups = @follow_ups.joins(business: :department).where("departments.id in (?)", departments_ids)
|
45
45
|
end
|
46
|
-
if params[:q].present? && params[:q][:
|
47
|
-
p = EducodeSales::Common.find(params[:q][:
|
46
|
+
if params[:q].present? && params[:q][:area].present?
|
47
|
+
p = EducodeSales::Common.find(params[:q][:area]).name
|
48
48
|
@follow_ups = @follow_ups.joins(:business).joins("
|
49
49
|
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
50
50
|
JOIN schools ON departments.school_id = schools.id
|
@@ -214,7 +214,7 @@ module EducodeSales
|
|
214
214
|
end
|
215
215
|
|
216
216
|
def follow_up_params
|
217
|
-
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id, :bidded_date, :signed_date)
|
217
|
+
params.permit(:clazz_id, :stage_id, :invitation_at, :reception_at, :total_amount, :actual_amount, :divide_amount, :description, :advise, :place_id, :bidded_date, :signed_date, :year)
|
218
218
|
end
|
219
219
|
|
220
220
|
def teacher_params
|
@@ -42,21 +42,26 @@ module EducodeSales
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def sales_staff
|
45
|
-
|
45
|
+
@staffs = Staff
|
46
46
|
if params[:teacher_assist].present?
|
47
47
|
common = Common.find_by(clazz: 'staff_type', name: '运营')
|
48
|
+
else
|
49
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
48
50
|
end
|
49
|
-
@staffs = Staff
|
50
51
|
if params[:q].present?
|
51
52
|
@staffs = @staffs.joins(user: :user_extension).where("concat(lastname, firstname) like :q", q: "%#{params[:q]}%")
|
52
53
|
end
|
53
|
-
|
54
|
+
if params[:teacher_assist].present?
|
55
|
+
@staffs = @staffs.where(is_admin: false).where(job_type: common.id).page(params[:page]).per(10)
|
56
|
+
else
|
57
|
+
@staffs = @staffs.where(is_admin: false).where.not(id: @current_admin.id).where(job_type: common.id).page(params[:page]).per(10)
|
58
|
+
end
|
54
59
|
end
|
55
60
|
|
56
61
|
def sales_place
|
57
62
|
@places = EducodeSales::Place
|
58
63
|
if params[:q].present?
|
59
|
-
@places = @places.where("name like :q", q: "%#{params[:q]}%")
|
64
|
+
@places = @places.where("name like :q", q: "%#{params[:q].strip}%")
|
60
65
|
end
|
61
66
|
@places = @places.page(params[:page]).per(10)
|
62
67
|
end
|
@@ -120,7 +120,7 @@ module EducodeSales
|
|
120
120
|
labels: dates,
|
121
121
|
datasets:names.map.with_index do |name,i|
|
122
122
|
{
|
123
|
-
hidden: i < 3 ? false : true,
|
123
|
+
# hidden: i < 3 ? false : true,
|
124
124
|
label: name[0],
|
125
125
|
data: dates.map{ |d| @follow_up = FollowUp.where(staff_id: name[1], created_at: d.beginning_of_day..d.end_of_day).where.not(business: x_business_ids).count },
|
126
126
|
backgroundColor: "#fff",
|
@@ -134,21 +134,32 @@ module EducodeSales
|
|
134
134
|
end
|
135
135
|
def week_follow_count_chart(dates,names,x_business_ids,colors)
|
136
136
|
{
|
137
|
-
labels: dates
|
137
|
+
labels: dates.map{ |date|
|
138
|
+
d = date.split("-")
|
139
|
+
year = d[0].to_i
|
140
|
+
week = d[1].to_i
|
141
|
+
if week == 0
|
142
|
+
0
|
143
|
+
else
|
144
|
+
month = Date.commercial(year,week).strftime("%m月%d日")
|
145
|
+
day = Date.commercial(year,week,7).strftime("%m月%d日")
|
146
|
+
date.to_s + "(#{month}-#{day})"
|
147
|
+
end
|
148
|
+
} - [0],
|
138
149
|
datasets:names.map.with_index do |name,i|
|
139
150
|
{
|
140
|
-
hidden: i < 3 ? false : true,
|
151
|
+
# hidden: i < 3 ? false : true,
|
141
152
|
label: name[0],
|
142
153
|
data: dates.map{ |d|
|
143
154
|
d = d.split("-")
|
144
155
|
year = d[0].to_i
|
145
156
|
week = d[1].to_i
|
146
157
|
if week == 0
|
147
|
-
@follow_up =
|
158
|
+
@follow_up = 999999
|
148
159
|
else
|
149
160
|
@follow_up = FollowUp.where(staff_id: name[1]).where("created_at >= ? AND created_at <= ?", Date.commercial(year,week).strftime("%Y-%m-%d"), Date.commercial(year,week,7).strftime("%Y-%m-%d")).where.not(business: x_business_ids).count
|
150
161
|
end
|
151
|
-
},
|
162
|
+
} - [999999],
|
152
163
|
backgroundColor: "#fff",
|
153
164
|
pointBorderColor: colors[i%15+1],
|
154
165
|
borderColor: colors[i%15+1],
|
@@ -163,7 +174,7 @@ module EducodeSales
|
|
163
174
|
labels: dates,
|
164
175
|
datasets:names.map.with_index do |name,i|
|
165
176
|
{
|
166
|
-
hidden: i < 3 ? false : true,
|
177
|
+
# hidden: i < 3 ? false : true,
|
167
178
|
label: name[0],
|
168
179
|
data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01", "#{d}-31").where.not(business: x_business_ids).count },
|
169
180
|
backgroundColor: "#fff",
|
@@ -180,7 +191,7 @@ module EducodeSales
|
|
180
191
|
labels: dates,
|
181
192
|
datasets:names.map.with_index do |name,i|
|
182
193
|
{
|
183
|
-
hidden: i < 3 ? false : true,
|
194
|
+
# hidden: i < 3 ? false : true,
|
184
195
|
label: name[0],
|
185
196
|
data: dates.map { |d| @follow_up = FollowUp.where( staff_id: name[1]).where("created_at >= ? AND created_at <= ?", "#{d}-01-01", "#{d}-12-31").where.not(business: x_business_ids).count },
|
186
197
|
backgroundColor: "#fff",
|
@@ -9,8 +9,11 @@ module EducodeSales
|
|
9
9
|
authorize! :sales, Staff
|
10
10
|
respond_to do |format|
|
11
11
|
format.html do
|
12
|
+
@year = params[:year] ? params[:year] : "全部"
|
13
|
+
@years = ["全部"]+(2015..Time.now.year).to_a.reverse
|
12
14
|
end
|
13
15
|
format.json do
|
16
|
+
@year = params[:year] ? params[:year] : "全部"
|
14
17
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
15
18
|
@a_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::ATYPE)&.name)
|
16
19
|
@b_clazz = Common.find_by(clazz: 'business_type', name: Common.find_by(extras: EducodeSales::Common::BTYPE)&.name)
|
@@ -57,6 +57,11 @@ module EducodeSales
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
if @current_admin.job_type == Common.find_by(clazz: 'staff_type', name: '销售').id
|
61
|
+
public_teacher_ids = EducodeSales::Teacher.where(staff_id: 0).pluck(:id) - EducodeSales::TeacherAssignFollow.where(staff_id: @current_admin.id).pluck(:teacher_id)
|
62
|
+
@teachers = @teachers.where.not(id: public_teacher_ids)
|
63
|
+
end
|
64
|
+
|
60
65
|
|
61
66
|
|
62
67
|
if params[:q].present? && params[:q][:assist].present?
|
@@ -4,25 +4,25 @@
|
|
4
4
|
<div class="layui-inline">
|
5
5
|
<label class="layui-form-label">所属商机</label>
|
6
6
|
<div class="layui-input-inline">
|
7
|
-
<input type="text" name="
|
7
|
+
<input type="text" name="name" autocomplete="off" class="layui-input">
|
8
8
|
</div>
|
9
9
|
</div>
|
10
10
|
<div class="layui-inline">
|
11
11
|
<label class="layui-form-label">单位</label>
|
12
12
|
<div class="layui-input-inline">
|
13
|
-
<input type="text" name="
|
13
|
+
<input type="text" name="department" autocomplete="off" class="layui-input">
|
14
14
|
</div>
|
15
15
|
</div>
|
16
16
|
<div class="layui-inline">
|
17
17
|
<label class="layui-form-label">销售人员</label>
|
18
18
|
<div class="layui-input-inline">
|
19
|
-
<%= select_tag "
|
19
|
+
<%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true } %>
|
20
20
|
</div>
|
21
21
|
</div>
|
22
22
|
<div class="layui-inline">
|
23
23
|
<label class="layui-form-label">区域</label>
|
24
24
|
<div class="layui-input-inline">
|
25
|
-
<%= select_tag "
|
25
|
+
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
26
26
|
</div>
|
27
27
|
</div>
|
28
28
|
<div class="layui-inline">
|
@@ -80,6 +80,10 @@
|
|
80
80
|
// where: {q: form.val('search_form')},
|
81
81
|
toolbar: '#toolbarDemo_follows',
|
82
82
|
defaultToolbar: ['filter'],
|
83
|
+
initSort: {
|
84
|
+
field: 'created_at' //排序字段,对应 cols 设定的各字段名
|
85
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
86
|
+
},
|
83
87
|
cols: [
|
84
88
|
[
|
85
89
|
{
|
@@ -90,27 +94,42 @@
|
|
90
94
|
{
|
91
95
|
field: 'description',
|
92
96
|
title: '最新进展',
|
97
|
+
templet:'<div><span title="{{d.description}}">{{d.description}}</span></div>'
|
93
98
|
},
|
94
99
|
{
|
95
100
|
field: 'advise',
|
96
101
|
width: 170,
|
97
102
|
title: '团队建议',
|
103
|
+
templet:'<div><span title="{{d.advise}}">{{d.advise}}</span></div>'
|
98
104
|
},
|
99
105
|
{
|
100
106
|
field: 'clazz',
|
101
107
|
width: 80,
|
102
|
-
title: '类型'
|
108
|
+
title: '类型',
|
109
|
+
templet:'<div><span title="{{d.clazz}}">{{d.clazz}}</span></div>'
|
103
110
|
},
|
104
111
|
{
|
105
112
|
field: 'stage',
|
106
113
|
title: '阶段',
|
107
114
|
width: 90,
|
115
|
+
templet:'<div><span title="{{d.stage}}">{{d.stage}}</span></div>'
|
108
116
|
},
|
109
117
|
{
|
110
118
|
field: 'key_people',
|
111
119
|
width: 90,
|
112
120
|
title: '关键人',
|
113
|
-
|
121
|
+
templet:'<div><span title="{{d.key_people}}">{{d.key_people}}</span></div>'
|
122
|
+
},
|
123
|
+
{
|
124
|
+
field: 'business',
|
125
|
+
width: 150,
|
126
|
+
title: '所属商机',
|
127
|
+
templet:'#business'
|
128
|
+
},
|
129
|
+
{
|
130
|
+
field: 'school',
|
131
|
+
width: 150,
|
132
|
+
title: '单位',
|
114
133
|
},
|
115
134
|
{
|
116
135
|
field: 'staff',
|
@@ -123,12 +142,6 @@
|
|
123
142
|
title: '跟进时间',
|
124
143
|
sort: true,
|
125
144
|
},
|
126
|
-
{
|
127
|
-
field: 'business',
|
128
|
-
width: 150,
|
129
|
-
title: '所属商机',
|
130
|
-
templet:'#business'
|
131
|
-
},
|
132
145
|
{
|
133
146
|
title: '操作',
|
134
147
|
width: 80,
|
@@ -169,17 +182,26 @@
|
|
169
182
|
},
|
170
183
|
where: {q: search, sort: sort}
|
171
184
|
}, 'data');
|
185
|
+
table.reload('businesses_table', {
|
186
|
+
page: {
|
187
|
+
curr: 1
|
188
|
+
},
|
189
|
+
where: {q: search, sort: sort}
|
190
|
+
}, 'data');
|
191
|
+
form.val('search_form', {
|
192
|
+
name: data.field.name, department: data.field.department, staff_id: data.field.staff_id, area: data.field.area
|
193
|
+
})
|
172
194
|
return false;
|
173
195
|
});
|
174
196
|
|
175
197
|
form.on('submit(reset_follows_search)', function (data) {
|
176
198
|
var field = data.field;
|
177
199
|
form.val('search_follows', {
|
178
|
-
|
200
|
+
area: "",
|
179
201
|
follows_date: "",
|
180
|
-
|
181
|
-
|
182
|
-
|
202
|
+
name: "",
|
203
|
+
department: "",
|
204
|
+
staff_id: ""
|
183
205
|
})
|
184
206
|
return false;
|
185
207
|
});
|
@@ -89,6 +89,15 @@
|
|
89
89
|
<input name="divide_amount" class="layui-input" value="<%= @follow_up.divide_amount%>">
|
90
90
|
</div>
|
91
91
|
</div>
|
92
|
+
<div class="layui-form-item">
|
93
|
+
<div class="layui-inline">
|
94
|
+
<label class="layui-form-label">所属年度</label>
|
95
|
+
<div class="layui-input-inline">
|
96
|
+
<input type="text" class="layui-input" name="year" autocomplete="off" id="edit_year"
|
97
|
+
value="<%= @follow_up&.year%>"
|
98
|
+
placeholder="请选择年度"> </div>
|
99
|
+
</div>
|
100
|
+
</div>
|
92
101
|
<div class="layui-form-item">
|
93
102
|
<label class="layui-form-label">指定跟进人</label>
|
94
103
|
<div class="layui-input-inline">
|
@@ -141,6 +150,10 @@
|
|
141
150
|
laydate.render({
|
142
151
|
elem: '#invitation_at_edit'
|
143
152
|
})
|
153
|
+
laydate.render({
|
154
|
+
elem: '#edit_year',
|
155
|
+
type: 'year'
|
156
|
+
})
|
144
157
|
|
145
158
|
laydate.render({
|
146
159
|
elem: '#reception_at_edit'
|
@@ -195,17 +195,20 @@
|
|
195
195
|
{
|
196
196
|
field: 'name',
|
197
197
|
width: 170,
|
198
|
-
|
198
|
+
title: '名称',
|
199
|
+
templet:'<div><span title="{{d.name}}">{{d.name}}</span></div>'
|
199
200
|
},
|
200
201
|
{
|
201
202
|
field: 'school',
|
202
203
|
width: 150,
|
203
204
|
title: '单位',
|
205
|
+
templet:'<div><span title="{{d.school}}">{{d.school}}</span></div>'
|
204
206
|
},
|
205
207
|
{
|
206
208
|
field: 'department',
|
207
209
|
width: 150,
|
208
|
-
title: '部门'
|
210
|
+
title: '部门',
|
211
|
+
templet:'<div><span title="{{d.department}}">{{d.department}}</span></div>'
|
209
212
|
},
|
210
213
|
{
|
211
214
|
field: 'follow_ups_count',
|
@@ -223,7 +226,8 @@
|
|
223
226
|
{
|
224
227
|
field: 'clazz',
|
225
228
|
width: 80,
|
226
|
-
title: '类型'
|
229
|
+
title: '类型',
|
230
|
+
templet:'<div><span title="{{d.clazz}}">{{d.clazz}}</span></div>'
|
227
231
|
},
|
228
232
|
{
|
229
233
|
field: 'stage',
|
@@ -278,7 +282,7 @@
|
|
278
282
|
{
|
279
283
|
field: 'place',
|
280
284
|
width: 160,
|
281
|
-
title: '渠道'
|
285
|
+
title: '渠道',
|
282
286
|
},
|
283
287
|
{
|
284
288
|
field: 'source',
|
@@ -479,6 +483,15 @@
|
|
479
483
|
},
|
480
484
|
where: {q: search, sort: sort}
|
481
485
|
}, 'data');
|
486
|
+
table.reload('teachers_table', {
|
487
|
+
page: {
|
488
|
+
curr: 1
|
489
|
+
},
|
490
|
+
where: {q: search, sort: sort}
|
491
|
+
}, 'data');
|
492
|
+
form.val('search_follows', {
|
493
|
+
name: data.field.name, department: data.field.department, staff_id: data.field.staff_id, area: data.field.area
|
494
|
+
})
|
482
495
|
|
483
496
|
return false;
|
484
497
|
});
|
@@ -694,4 +707,11 @@
|
|
694
707
|
.layui-table-tool-temp{
|
695
708
|
padding-right: 30px; !important;
|
696
709
|
}
|
710
|
+
.layui-table-fixed .layui-table-body {
|
711
|
+
height: auto!important;
|
712
|
+
}
|
713
|
+
.layui-table-fixed.layui-hide {
|
714
|
+
display: block!important;
|
715
|
+
}
|
716
|
+
|
697
717
|
</style>
|
@@ -10,7 +10,7 @@ json.data do
|
|
10
10
|
json.follow_up_id d.last_follow_up_id
|
11
11
|
# json.teachers_count d.follow_ups.sum(:key_people_count)
|
12
12
|
# json.teachers_count EducodeSales::FollowUp.order(created_at: :desc).find_by(business_id: d.id).present? ? EducodeSales::FollowUp.order(created_at: :desc).find_by(business_id: d.id).key_people_count : 0
|
13
|
-
json.clazz d.last_follow_up&.clazz&.name
|
13
|
+
json.clazz d.last_follow_up&.clazz&.name || ""
|
14
14
|
json.stage d.last_follow_up&.stage&.name
|
15
15
|
json.invitation_at d.last_follow_up&.invitation_at.to_s
|
16
16
|
json.reception_at d.last_follow_up&.reception_at.to_s
|
@@ -94,6 +94,15 @@
|
|
94
94
|
<div class="layui-input-inline">
|
95
95
|
<input name="divide_amount" class="layui-input" value="<%= @last_follow_up&.divide_amount%>">
|
96
96
|
</div>
|
97
|
+
</div>
|
98
|
+
<div class="layui-form-item">
|
99
|
+
<div class="layui-inline">
|
100
|
+
<label class="layui-form-label">所属年度</label>
|
101
|
+
<div class="layui-input-inline">
|
102
|
+
<input type="text" class="layui-input" name="year" autocomplete="off" id="year"
|
103
|
+
value="<%= @last_follow_up&.year%>"
|
104
|
+
placeholder="请选择年度"> </div>
|
105
|
+
</div>
|
97
106
|
</div>
|
98
107
|
<div class="layui-form-item">
|
99
108
|
<label class="layui-form-label">指定跟进人</label>
|
@@ -147,6 +156,10 @@
|
|
147
156
|
xmSelect = layui.xmSelect,
|
148
157
|
$ = layui.$;
|
149
158
|
|
159
|
+
laydate.render({
|
160
|
+
elem: '#year',
|
161
|
+
type: 'year'
|
162
|
+
})
|
150
163
|
laydate.render({
|
151
164
|
elem: '#invitation_at_add'
|
152
165
|
})
|
@@ -78,6 +78,14 @@
|
|
78
78
|
<%= @follow_up.divide_amount %>万
|
79
79
|
</div>
|
80
80
|
</div>
|
81
|
+
<div class="layui-form-item">
|
82
|
+
<div class="layui-inline">
|
83
|
+
<label class="layui-form-label">所属年度</label>
|
84
|
+
<div class="layui-input-inline">
|
85
|
+
<%= @follow_up&.year %>年
|
86
|
+
</div>
|
87
|
+
</div>
|
88
|
+
</div>
|
81
89
|
<div class="ayui-form-item">
|
82
90
|
<label class="layui-form-label" style="width: 85px;">指定跟进人:</label>
|
83
91
|
<div class="layui-input-inline">
|
@@ -79,6 +79,10 @@
|
|
79
79
|
toolbar: '#monthPlanToolbar',
|
80
80
|
totalRow:true,
|
81
81
|
defaultToolbar: ['filter'],
|
82
|
+
initSort: {
|
83
|
+
field: 'updated_at' //排序字段,对应 cols 设定的各字段名
|
84
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
85
|
+
},
|
82
86
|
cols: [
|
83
87
|
[
|
84
88
|
{
|
@@ -111,6 +115,8 @@
|
|
111
115
|
field: 'content',
|
112
116
|
width: 400,
|
113
117
|
title: '计划内容',
|
118
|
+
templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
|
119
|
+
|
114
120
|
},
|
115
121
|
{
|
116
122
|
field: 'count',
|
@@ -80,6 +80,10 @@
|
|
80
80
|
toolbar: '#weekPlanToolbar',
|
81
81
|
totalRow:true,
|
82
82
|
defaultToolbar: ['filter'],
|
83
|
+
initSort: {
|
84
|
+
field: 'updated_at' //排序字段,对应 cols 设定的各字段名
|
85
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
86
|
+
},
|
83
87
|
cols: [
|
84
88
|
[
|
85
89
|
{
|
@@ -122,6 +126,8 @@
|
|
122
126
|
field: 'content',
|
123
127
|
width: 300,
|
124
128
|
title: '计划内容',
|
129
|
+
templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
|
130
|
+
|
125
131
|
},
|
126
132
|
{
|
127
133
|
field: 'count',
|
@@ -77,6 +77,10 @@
|
|
77
77
|
url: '/missions/plans?clazz=month',
|
78
78
|
toolbar: '#monthPlanToolbar',
|
79
79
|
defaultToolbar: ['filter'],
|
80
|
+
initSort: {
|
81
|
+
field: 'updated_at' //排序字段,对应 cols 设定的各字段名
|
82
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
83
|
+
},
|
80
84
|
totalRow:true,
|
81
85
|
cols: [
|
82
86
|
[
|
@@ -115,6 +119,7 @@
|
|
115
119
|
field: 'content',
|
116
120
|
width: 300,
|
117
121
|
title: '计划内容',
|
122
|
+
templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
|
118
123
|
},
|
119
124
|
{
|
120
125
|
field: 'follow_ups_count',
|
@@ -78,6 +78,10 @@
|
|
78
78
|
toolbar: '#weekPlanToolbar',
|
79
79
|
totalRow:true,
|
80
80
|
defaultToolbar: ['filter'],
|
81
|
+
initSort: {
|
82
|
+
field: 'updated_at' //排序字段,对应 cols 设定的各字段名
|
83
|
+
,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
|
84
|
+
},
|
81
85
|
cols: [
|
82
86
|
[
|
83
87
|
{
|
@@ -120,6 +124,7 @@
|
|
120
124
|
field: 'content',
|
121
125
|
width: 300,
|
122
126
|
title: '计划内容',
|
127
|
+
templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
|
123
128
|
},
|
124
129
|
{
|
125
130
|
field: 'follow_ups_count',
|
@@ -1,5 +1,12 @@
|
|
1
1
|
<div class="section">
|
2
|
-
<
|
2
|
+
<form class="layui-form" action="">
|
3
|
+
<span>销售人员列表</span>
|
4
|
+
<div style="float:right;">年度
|
5
|
+
<div class="layui-input-inline">
|
6
|
+
<%= select_tag "years", options_for_select(@years,@year), {'lay-filter': 'year' } %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
</form>
|
3
10
|
<hr>
|
4
11
|
<table class="layui-hide" id="table" lay-filter="table" ></table>
|
5
12
|
</div>
|
@@ -40,11 +47,18 @@
|
|
40
47
|
</script>
|
41
48
|
<script>
|
42
49
|
layui.use('table', function () {
|
43
|
-
|
50
|
+
var form = layui.form,
|
51
|
+
table = layui.table;
|
52
|
+
|
53
|
+
form.on('select(year)', function(data){
|
54
|
+
console.log(data, )
|
55
|
+
year = data.value
|
56
|
+
window.location.href = "/missions/sales?year=" + data.value
|
57
|
+
})
|
44
58
|
|
45
59
|
table.render({
|
46
60
|
elem: '#table',
|
47
|
-
url: '/missions/sales',
|
61
|
+
url: '/missions/sales?year=<%= @year %>',
|
48
62
|
cellMinWidth: 80,
|
49
63
|
totalRow:true,
|
50
64
|
cols: [
|
@@ -60,6 +74,7 @@
|
|
60
74
|
}, {
|
61
75
|
field: 'area',
|
62
76
|
title: '负责区域',
|
77
|
+
templet:'<div><span title="{{d.area}}">{{d.area}}</span></div>'
|
63
78
|
}, {
|
64
79
|
field: 'business_a',
|
65
80
|
title: 'A类商机',
|
@@ -26,32 +26,45 @@ json.data do
|
|
26
26
|
else
|
27
27
|
json.area ''
|
28
28
|
end
|
29
|
-
|
30
|
-
|
29
|
+
if @year == "全部"
|
30
|
+
business_a = @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 = ?", @a_clazz&.id).count
|
31
|
+
business_b = @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 = ?", @b_clazz&.id).count
|
32
|
+
business_c = @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 = ?", @c_clazz&.id).count
|
33
|
+
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
|
34
|
+
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
|
35
|
+
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
|
36
|
+
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)
|
37
|
+
json.return_money @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 != ?", @x).sum("educode_sales_businesses.return_money").round(2)
|
38
|
+
else
|
39
|
+
business_a = @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 = ?", @a_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
40
|
+
business_b = @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 = ?", @b_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
41
|
+
business_c = @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 = ?", @c_clazz&.id).where("educode_sales_follow_ups.year = ?", @year).count
|
42
|
+
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).where("educode_sales_follow_ups.year = ?", @year).count
|
43
|
+
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).where("educode_sales_follow_ups.year = ?", @year).count
|
44
|
+
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).where("educode_sales_follow_ups.year = ?", @year).count
|
45
|
+
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.year = ?", @year).sum(:total_amount).round(2)
|
46
|
+
json.return_money @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 != ?", @x).where("educode_sales_follow_ups.year = ?", @year).sum("educode_sales_businesses.return_money").round(2)
|
47
|
+
end
|
48
|
+
|
31
49
|
json.business_a business_a
|
32
|
-
business_b = @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 = ?", @b_clazz&.id).count
|
33
|
-
businesses_b_count += business_b
|
34
50
|
json.business_b business_b
|
35
|
-
business_c = @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 = ?", @c_clazz&.id).count
|
36
|
-
businesses_c_count += business_c
|
37
51
|
json.business_c business_c
|
38
|
-
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
|
39
|
-
businesses_d_count += business_d
|
40
52
|
json.business_d business_b
|
41
|
-
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
|
42
|
-
businesses_e_count += business_e
|
43
53
|
json.business_e business_b
|
44
|
-
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
|
45
|
-
businesses_o_count += business_o
|
46
54
|
json.business_o business_o
|
47
|
-
|
48
|
-
json.return_money @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 != ?", @x).sum("educode_sales_businesses.return_money").round(2)
|
55
|
+
|
49
56
|
json.a_clazz_id @a_clazz&.id
|
50
57
|
json.b_clazz_id @b_clazz&.id
|
51
58
|
json.c_clazz_id @c_clazz&.id
|
52
59
|
json.d_clazz_id @d_clazz&.id
|
53
60
|
json.e_clazz_id @e_clazz&.id
|
54
61
|
json.o_clazz_id @o_clazz&.id
|
62
|
+
businesses_a_count += business_a
|
63
|
+
businesses_b_count += business_b
|
64
|
+
businesses_c_count += business_c
|
65
|
+
businesses_d_count += business_d
|
66
|
+
businesses_e_count += business_e
|
67
|
+
businesses_o_count += business_o
|
55
68
|
end
|
56
69
|
end
|
57
70
|
|
@@ -160,6 +160,7 @@
|
|
160
160
|
width: 60,
|
161
161
|
title:'序号',type: 'numbers',
|
162
162
|
totalRowText:'合计',
|
163
|
+
|
163
164
|
},
|
164
165
|
{
|
165
166
|
field: 'name',
|
@@ -171,11 +172,15 @@
|
|
171
172
|
field: 'school',
|
172
173
|
width: 160,
|
173
174
|
title: '单位',
|
175
|
+
templet:'<div><span title="{{d.school}}">{{d.school}}</span></div>'
|
176
|
+
|
174
177
|
},
|
175
178
|
{
|
176
179
|
field: 'department',
|
177
180
|
width: 130,
|
178
|
-
title: '部门'
|
181
|
+
title: '部门',
|
182
|
+
templet:'<div><span title="{{d.department}}">{{d.department}}</span></div>'
|
183
|
+
|
179
184
|
},
|
180
185
|
{
|
181
186
|
field: 'professional_title',
|
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.5.
|
4
|
+
version: 0.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -382,6 +382,7 @@ files:
|
|
382
382
|
- db/migrate/20211102085743_add_bidded_date_educode_sales_follow_ups.rb
|
383
383
|
- db/migrate/20211109015617_create_educode_sales_recycles.rb
|
384
384
|
- db/migrate/20211201023750_create_educode_sales_teacher_assign_follows.rb
|
385
|
+
- db/migrate/20211206054756_add_year_to_follow_ups.rb
|
385
386
|
- lib/educode_sales.rb
|
386
387
|
- lib/educode_sales/engine.rb
|
387
388
|
- lib/educode_sales/version.rb
|