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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +19 -3
  3. data/app/controllers/educode_sales/follow_ups_controller.rb +9 -9
  4. data/app/controllers/educode_sales/home_controller.rb +9 -4
  5. data/app/controllers/educode_sales/sale_trends_controller.rb +18 -7
  6. data/app/controllers/educode_sales/sales_controller.rb +3 -0
  7. data/app/controllers/educode_sales/teachers_controller.rb +5 -0
  8. data/app/views/educode_sales/businesses/_follows.html.erb +38 -16
  9. data/app/views/educode_sales/businesses/edit_follow_record.html.erb +13 -0
  10. data/app/views/educode_sales/businesses/index.html.erb +24 -4
  11. data/app/views/educode_sales/businesses/index.json.jbuilder +1 -1
  12. data/app/views/educode_sales/businesses/new_follow_record.html.erb +13 -0
  13. data/app/views/educode_sales/businesses/show_follow_record.html.erb +8 -0
  14. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -0
  15. data/app/views/educode_sales/operation_plans/_monthPlan.html.erb +6 -0
  16. data/app/views/educode_sales/operation_plans/_monthly.html.erb +2 -0
  17. data/app/views/educode_sales/operation_plans/_weekPlan.html.erb +6 -0
  18. data/app/views/educode_sales/operation_plans/_weekly.html.erb +2 -0
  19. data/app/views/educode_sales/plans/_monthPlan.html.erb +5 -0
  20. data/app/views/educode_sales/plans/_monthly.html.erb +1 -0
  21. data/app/views/educode_sales/plans/_weekPlan.html.erb +5 -0
  22. data/app/views/educode_sales/plans/_weekly.html.erb +1 -0
  23. data/app/views/educode_sales/sales/index.html.erb +18 -3
  24. data/app/views/educode_sales/sales/index.json.jbuilder +27 -14
  25. data/app/views/educode_sales/sales/operations.html.erb +1 -0
  26. data/app/views/educode_sales/teachers/index.html.erb +6 -1
  27. data/db/migrate/20211206054756_add_year_to_follow_ups.rb +5 -0
  28. data/lib/educode_sales/version.rb +1 -1
  29. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef5373cd46335d53f4f5062b2ac750c01fa8797ddf1626c4373c6997e5e1fa9f
4
- data.tar.gz: f27164e66b64b22b5b0c889ffb3c5c2c6567559f490a00e4af8a32f4298841dd
3
+ metadata.gz: cb7ba8647915177726d6f9f525ea700b0e7ca469bf8ff7460d27a8d3e5204c28
4
+ data.tar.gz: d56bb7b39f7f44dc59b2d733ae60af4d3aee9135f8ee60e0721a5723bf20fc7a
5
5
  SHA512:
6
- metadata.gz: a9d42047fdaeba4c49096c40dd92b9d33ed77f84ef7a65410f34bab1a0408be55c7db38caa5e30aab0456d1b93af4db2a0c79c953dfdfd9f39579f26e5a1cef2
7
- data.tar.gz: 2850fa03b263d9a06f0d2af5c9649b9ccd30719a58e5a0f0dac41bb2b495c2745e2ed1b8711ecabdac249166c75dadec3d26b7219800398ee7ff219c6fa167c7
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
- @businesses = @businesses.joins("
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][:follows_business].present?
33
- @follow_ups = @follow_ups.joins(:business).where("educode_sales_businesses.name LIKE ?", "%#{params[:q][:follows_business]}%")
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][:follows_staff_id].present?
40
- @follow_ups = @follow_ups.where(staff_id: params[:q][:follows_staff_id])
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][:follows_department].present?
43
- departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:follows_department]}%").pluck(:id)
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][:follows_area].present?
47
- p = EducodeSales::Common.find(params[:q][:follows_area]).name
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
- common = Common.find_by(clazz: 'staff_type', name: '销售')
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
- @staffs = @staffs.where(is_admin: false).where.not(id: @current_admin.id).where(job_type: common.id).page(params[:page]).per(10)
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 = 0
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="follows_business" autocomplete="off" class="layui-input">
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="follows_department" autocomplete="off" class="layui-input">
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 "follows_staff_id", options_for_select(@staffs, params[:follows_staff_id]), { 'lay-filter': 'follows_staff_id', include_blank: true } %>
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 "follows_area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
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
- follows_area: "",
200
+ area: "",
179
201
  follows_date: "",
180
- follows_business: "",
181
- follows_department: "",
182
- follows_staff_id: ""
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
- title: '名称'
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">
@@ -6,6 +6,7 @@ json.data do
6
6
  json.staff d.staff.user.real_name
7
7
  json.description d.description
8
8
  json.advise d.advise
9
+ json.school d.business.department.school.name
9
10
  json.created_at d.created_at.to_s
10
11
  json.business d.business.name
11
12
  json.business_id d.business.id
@@ -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',
@@ -114,6 +114,8 @@
114
114
  field: 'content',
115
115
  width: 300,
116
116
  title: '个人总结',
117
+ templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
118
+
117
119
  },
118
120
  {
119
121
  field: 'level1_score',
@@ -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',
@@ -115,6 +115,8 @@
115
115
  field: 'content',
116
116
  width: 300,
117
117
  title: '个人总结',
118
+ templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
119
+
118
120
  },
119
121
  {
120
122
  field: 'level1_score',
@@ -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',
@@ -119,6 +119,7 @@
119
119
  field: 'content',
120
120
  width: 300,
121
121
  title: '个人总结',
122
+ templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
122
123
  },
123
124
  {
124
125
  field: 'level1_score',
@@ -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',
@@ -121,6 +121,7 @@
121
121
  field: 'content',
122
122
  width: 300,
123
123
  title: '个人总结',
124
+ templet:'<div><span title="{{d.content}}">{{d.content}}</span></div>'
124
125
  },
125
126
  {
126
127
  field: 'level1_score',
@@ -1,5 +1,12 @@
1
1
  <div class="section">
2
- <h4><span>销售人员列表</span></h4>
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
- var table = layui.table;
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
- 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
30
- businesses_a_count += business_a
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
- 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)
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
 
@@ -46,6 +46,7 @@
46
46
  }, {
47
47
  field: 'area',
48
48
  title: '负责区域',
49
+ templet:'<div><span title="{{d.area}}">{{d.area}}</span></div>'
49
50
  }, {
50
51
  field: 'schools',
51
52
  title: '跟进学校',
@@ -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',
@@ -0,0 +1,5 @@
1
+ class AddYearToFollowUps < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :educode_sales_follow_ups, :year, :integer
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.5.7'
2
+ VERSION = '0.5.8'
3
3
  end
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.7
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-03 00:00:00.000000000 Z
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