educode_sales 0.9.67 → 0.9.69
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/assets/images/educode_sales/indexlogo.png +0 -0
- data/app/assets/javascripts/educode_sales/extent/treeTable.js +235 -0
- data/app/controllers/educode_sales/activities_controller.rb +52 -38
- data/app/controllers/educode_sales/businesses_controller.rb +1 -1
- data/app/controllers/educode_sales/customers_controller.rb +107 -0
- data/app/controllers/educode_sales/follow_ups_controller.rb +6 -0
- data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
- data/app/controllers/educode_sales/plans_controller.rb +173 -11
- data/app/controllers/educode_sales/projects_controller.rb +420 -0
- data/app/controllers/educode_sales/recycles_controller.rb +11 -1
- data/app/controllers/educode_sales/roles_controller.rb +4 -1
- data/app/controllers/educode_sales/teachers_controller.rb +42 -17
- data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
- data/app/helpers/educode_sales/application_helper.rb +1 -0
- data/app/models/educode_sales/activity.rb +4 -0
- data/app/models/educode_sales/assessments_setting.rb +2 -2
- data/app/models/educode_sales/business.rb +21 -5
- data/app/models/educode_sales/business_history.rb +8 -0
- data/app/models/educode_sales/business_info.rb +9 -0
- data/app/models/educode_sales/permission.rb +2 -1
- data/app/models/educode_sales/project.rb +53 -0
- data/app/models/educode_sales/role_area.rb +2 -1
- data/app/models/educode_sales/sale_plan.rb +3 -1
- data/app/models/educode_sales/staff.rb +2 -0
- data/app/views/educode_sales/activities/_follows.html.erb +50 -36
- data/app/views/educode_sales/activities/_index.html.erb +82 -9
- data/app/views/educode_sales/activities/edit.html.erb +25 -68
- data/app/views/educode_sales/activities/files.html.erb +157 -0
- data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
- data/app/views/educode_sales/activities/follow_ups.json.jbuilder +1 -1
- data/app/views/educode_sales/activities/index.json.jbuilder +2 -2
- data/app/views/educode_sales/activities/new.html.erb +21 -60
- data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
- data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
- data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/index.html.erb +5 -0
- data/app/views/educode_sales/businesses/index.json.jbuilder +3 -0
- data/app/views/educode_sales/businesses/new.html.erb +1 -1
- data/app/views/educode_sales/businesses/time_line.html.erb +9 -5
- data/app/views/educode_sales/customers/edit_major.html.erb +872 -0
- data/app/views/educode_sales/customers/list.html.erb +602 -0
- data/app/views/educode_sales/customers/list.json.jbuilder +33 -0
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +2 -2
- data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
- data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
- data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
- data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
- data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
- data/app/views/educode_sales/plans/index.html.erb +8 -0
- data/app/views/educode_sales/plans/new_year.html.erb +204 -0
- data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
- data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
- data/app/views/educode_sales/projects/detail.html.erb +269 -0
- data/app/views/educode_sales/projects/edit.html.erb +246 -0
- data/app/views/educode_sales/projects/history.html.erb +41 -0
- data/app/views/educode_sales/projects/index.html.erb +688 -0
- data/app/views/educode_sales/projects/index.json.jbuilder +69 -0
- data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
- data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
- data/app/views/educode_sales/recycles/index.html.erb +26 -22
- data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
- data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
- data/app/views/educode_sales/teachers/_index.html.erb +17 -1
- data/app/views/educode_sales/teachers/index.json.jbuilder +2 -0
- data/app/views/layouts/educode_sales/application.html.erb +25 -0
- data/config/routes.rb +31 -0
- data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +6 -0
- data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
- data/db/migrate/20230411134203_add_realname_to_teacher.rb +5 -0
- data/db/migrate/20230412083510_add_p_staff_id_to_businesses.rb +20 -0
- data/db/migrate/20230412092000_create_business_histories.rb +10 -0
- data/db/migrate/20230413015619_add_permissions_to_projects.rb +11 -0
- data/db/migrate/20230413031029_add_pre_time_to_businesses.rb +5 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +38 -5
@@ -29,9 +29,9 @@ module EducodeSales
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
if params[:clazz] == 'week'
|
32
|
-
@sale_plans = @sale_plans.where.not(weekly: nil)
|
33
|
-
|
34
|
-
@sale_plans = @sale_plans.where(weekly: nil)
|
32
|
+
@sale_plans = @sale_plans.where.not(weekly: nil).where.not(month: nil)
|
33
|
+
elsif params[:clazz] == 'month'
|
34
|
+
@sale_plans = @sale_plans.where(weekly: nil).where.not(month: nil)
|
35
35
|
end
|
36
36
|
if params[:q].present? && params[:q][:staff_id].present?
|
37
37
|
@sale_plans = @sale_plans.where(staff_id: params[:q][:staff_id])
|
@@ -59,13 +59,34 @@ module EducodeSales
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def create
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
if params["year"].present?
|
63
|
+
business = Business.find_by(id: params[:business_id])
|
64
|
+
plan = @current_admin.sale_plans.build(year: params[:year], business_id: business.id, clazz: params[:clazz])
|
65
|
+
if plan.save
|
66
|
+
render_success
|
67
|
+
else
|
68
|
+
render_failure plan
|
69
|
+
end
|
70
|
+
else
|
71
|
+
plan = @current_admin.sale_plans.build(plan_params)
|
72
|
+
plan.month = params["month"] + "-1"
|
73
|
+
plan.business = Business.find_by(id: params[:business_id])
|
74
|
+
if plan.save
|
75
|
+
render_success
|
76
|
+
else
|
77
|
+
render_failure plan
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_business_info
|
84
|
+
business = Business.find_by(id: params[:business_id])
|
85
|
+
info = @current_admin.business_infos.build(year: params[:year], business_id: business.id, clazz: params[:clazz])
|
86
|
+
if info.save
|
66
87
|
render_success
|
67
88
|
else
|
68
|
-
render_failure
|
89
|
+
render_failure info
|
69
90
|
end
|
70
91
|
end
|
71
92
|
|
@@ -115,6 +136,14 @@ module EducodeSales
|
|
115
136
|
render layout: false
|
116
137
|
end
|
117
138
|
|
139
|
+
def new_year
|
140
|
+
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
141
|
+
@businesses =Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
|
142
|
+
@businesses = @businesses.map { |b| [b.name + "(" + b.department.school.name + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
|
143
|
+
@clazz = EducodeSales::SalePlan::CLAZZ_NAME
|
144
|
+
render layout: false
|
145
|
+
end
|
146
|
+
|
118
147
|
def new_monthly
|
119
148
|
d = @current_admin
|
120
149
|
area_ids = EducodeSales::Common.where(clazz: 'area').ids.sort.to_s
|
@@ -196,11 +225,21 @@ module EducodeSales
|
|
196
225
|
end
|
197
226
|
|
198
227
|
def destroy
|
199
|
-
|
200
|
-
|
228
|
+
if params[:year].present?
|
229
|
+
# 删除年度计划
|
230
|
+
sale_plans = SalePlan.where(year: params[:year], clazz: EducodeSales::SalePlan::CLAZZ_NAME[params[:clazz]])
|
231
|
+
sale_plans.each do |d|
|
232
|
+
EducodeSales::Recycle.create(source: d, deleter_id: @current_admin.id)
|
233
|
+
end
|
234
|
+
sale_plans.update_all(deleted_at: Time.now)
|
201
235
|
render_success
|
202
236
|
else
|
203
|
-
|
237
|
+
sale_plan = SalePlan.find(params[:id])
|
238
|
+
if sale_plan.soft_destroy(@current_admin.id)
|
239
|
+
render_success
|
240
|
+
else
|
241
|
+
render_failure sale_plan
|
242
|
+
end
|
204
243
|
end
|
205
244
|
end
|
206
245
|
|
@@ -242,11 +281,134 @@ module EducodeSales
|
|
242
281
|
@sale_plans = @sale_plans.page(params[:page]).per(params[:limit])
|
243
282
|
end
|
244
283
|
|
284
|
+
def years_plan
|
285
|
+
if @current_admin.is_admin?
|
286
|
+
@sale_plans = SalePlan
|
287
|
+
else
|
288
|
+
level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
|
289
|
+
case level
|
290
|
+
when '自己'
|
291
|
+
@sale_plans = SalePlan.where(staff_id: @current_admin.id)
|
292
|
+
when '区域'
|
293
|
+
staff_ids = Staff.joins(user: [user_extension: [department: :school]]).where("schools.province in (?)", @current_admin.areas.pluck(:name)).pluck(:id)
|
294
|
+
business_ids = Business.where(school_id: StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)).pluck(:id)
|
295
|
+
@sale_plans = SalePlan.where("educode_sales_sale_plans.staff_id in (?) OR educode_sales_sale_plans.staff_id = ? OR educode_sales_sale_plans.business_id in (?)", staff_ids, @current_admin.id,business_ids)
|
296
|
+
else
|
297
|
+
@sale_plans = SalePlan
|
298
|
+
end
|
299
|
+
end
|
300
|
+
@sale_plans = @sale_plans.where.not(year: nil)
|
301
|
+
@sale_plans = @sale_plans.select("SUM(last_follow.budget_amount) AS budget_amounts, educode_sales_sale_plans.*, ss.annual")
|
302
|
+
@sale_plans = @sale_plans.joins("
|
303
|
+
JOIN educode_sales_businesses ON educode_sales_businesses.id = educode_sales_sale_plans.business_id
|
304
|
+
LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id AND last_follow.deleted_at IS NULL
|
305
|
+
LEFT JOIN educode_sales_assessments_settings AS ss ON ss.staff_id = educode_sales_sale_plans.staff_id
|
306
|
+
AND YEAR(ss.assessment_year) = educode_sales_sale_plans.year AND ss.assessment = educode_sales_sale_plans.clazz")
|
307
|
+
|
308
|
+
@sale_plans = @sale_plans.group("educode_sales_sale_plans.staff_id, clazz, year")
|
309
|
+
|
310
|
+
@sale_plans = @sale_plans.where(deleted_at: nil)
|
311
|
+
|
312
|
+
if params[:q].present? && params[:q][:year].present?
|
313
|
+
@sale_plans = @sale_plans.where(year: params[:q][:year])
|
314
|
+
end
|
315
|
+
if params[:q].present? && params[:q][:staff_id].present?
|
316
|
+
@sale_plans = @sale_plans.where(staff_id: params[:q][:staff_id])
|
317
|
+
end
|
318
|
+
if params[:sort].present? && params[:sort][:field]
|
319
|
+
@sale_plans = @sale_plans.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
320
|
+
else
|
321
|
+
@sale_plans = @sale_plans.order("created_at desc")
|
322
|
+
end
|
323
|
+
|
324
|
+
@sale_plans = @sale_plans.page(params[:page]).per(params[:limit])
|
325
|
+
end
|
326
|
+
|
327
|
+
def my_years_plan
|
328
|
+
@sale_plans = SalePlan.where(staff_id: @current_admin.id)
|
329
|
+
end
|
330
|
+
|
331
|
+
def business_infos
|
332
|
+
@data = @current_admin.business_infos.where(sale_plan_id: nil, year: params[:year])
|
333
|
+
|
334
|
+
if params[:sort].present? && params[:sort][:field]
|
335
|
+
@data = @data.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
336
|
+
else
|
337
|
+
@data = @data.order("created_at desc")
|
338
|
+
end
|
339
|
+
@data = @data.page(params[:page]).per(params[:limit])
|
340
|
+
end
|
341
|
+
|
342
|
+
def edit_bussiness_info
|
343
|
+
@business_info = @current_admin.business_infos.find(params[:id])
|
344
|
+
render layout: false
|
345
|
+
end
|
346
|
+
|
347
|
+
def edit_bussiness_info_extra
|
348
|
+
@business_info = @current_admin.business_infos.find(params[:id])
|
349
|
+
render layout: false
|
350
|
+
end
|
351
|
+
|
352
|
+
def plan_business_infos
|
353
|
+
@data = @current_admin.business_infos.where(year: params[:year])
|
354
|
+
|
355
|
+
if params[:sort].present? && params[:sort][:field]
|
356
|
+
@data = @data.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
357
|
+
else
|
358
|
+
@data = @data.order("created_at desc")
|
359
|
+
end
|
360
|
+
@data = @data.page(params[:page]).per(params[:limit])
|
361
|
+
end
|
362
|
+
|
363
|
+
def update_business_info
|
364
|
+
business_info = @current_admin.business_infos.find(params[:id])
|
365
|
+
if business_info.update(business_info_params)
|
366
|
+
render_success
|
367
|
+
else
|
368
|
+
render_failure business_info
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
def update_business_info_extra
|
373
|
+
business_info = @current_admin.business_infos.find(params[:id])
|
374
|
+
if business_info.update(update_business_info_extra_params)
|
375
|
+
render_success
|
376
|
+
else
|
377
|
+
render_failure business_info
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def create_sales_plan
|
382
|
+
@current_admin.business_infos.where(sale_plan_id: nil).each do |d|
|
383
|
+
plan = @current_admin.sale_plans.create(year: d.year, business_id: d.business_id, clazz: d.clazz)
|
384
|
+
d.update(sale_plan_id: plan.id)
|
385
|
+
end
|
386
|
+
render_success
|
387
|
+
end
|
388
|
+
|
389
|
+
def delete_business_info
|
390
|
+
@current_admin.business_infos.where(id: params[:id]).destroy_all
|
391
|
+
render_success
|
392
|
+
end
|
393
|
+
|
394
|
+
def edit_year_plan
|
395
|
+
render layout: false
|
396
|
+
end
|
397
|
+
|
245
398
|
private
|
246
399
|
|
247
400
|
def plan_params
|
248
401
|
params.permit(:month, :weekly, :content, :finish_rate, :business_id)
|
249
402
|
end
|
250
403
|
|
404
|
+
def business_info_params
|
405
|
+
params.permit(:plan_bid_on, :plan_sign_on, :prepayment_plan_on, :prepayment_amount)
|
406
|
+
end
|
407
|
+
|
408
|
+
def update_business_info_extra_params
|
409
|
+
params.permit(:plan_bid_on, :actual_bidded_on, :bidded_amount, :plan_sign_on, :actual_sign_on, :sign_amount, :plan_deploy_on, :actual_deploy_on, :plan_check_on,
|
410
|
+
:actual_check_on, :prepayment_plan_on, :prepayment_actual_on, :prepayment_amount, :check_fee_plan_on, :check_fee_actual_on, :check_fee, :qa_plan_on, :qa_actual_on, :qa_amount, :account_receivable)
|
411
|
+
end
|
412
|
+
|
251
413
|
end
|
252
414
|
end
|
@@ -0,0 +1,420 @@
|
|
1
|
+
require_dependency "educode_sales/application_controller"
|
2
|
+
|
3
|
+
module EducodeSales
|
4
|
+
class ProjectsController < ApplicationController
|
5
|
+
|
6
|
+
before_action :find_project, only: [:edit, :destroy, :detail, :history, :update, :recycle]
|
7
|
+
|
8
|
+
def index
|
9
|
+
authorize! :contract_business, Business
|
10
|
+
respond_to do |format|
|
11
|
+
format.html do
|
12
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
13
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11).map { |d| [d.user.real_name, d.id] }
|
14
|
+
gon.staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11).map { |d| { name: d.user.real_name, value: d.id } }
|
15
|
+
@more = true
|
16
|
+
gon.menus = []
|
17
|
+
gon.export_menus = []
|
18
|
+
gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
|
19
|
+
|
20
|
+
bussiness_type = []
|
21
|
+
if params[:type]
|
22
|
+
# 项目类型
|
23
|
+
bussiness_type = EducodeSales::Business.include_types(params[:type]) || []
|
24
|
+
end
|
25
|
+
|
26
|
+
business_step = []
|
27
|
+
if params[:step]
|
28
|
+
# 项目阶段
|
29
|
+
business_step = EducodeSales::Business.include_steps(params[:step]) || []
|
30
|
+
end
|
31
|
+
|
32
|
+
if params[:business_year].present? && params[:business_year] != '全部'
|
33
|
+
gon.business_year = params[:business_year]
|
34
|
+
end
|
35
|
+
|
36
|
+
if params[:bidded_date_year].present? && params[:bidded_date_year] != '全部'
|
37
|
+
if params[:step] == '应收款'
|
38
|
+
gon.bidded_date = "2015-01-01" + " - " + Time.new(params[:bidded_date_year]).end_of_year.strftime("%Y-%m-%d")
|
39
|
+
else
|
40
|
+
gon.bidded_date = Time.new(params[:bidded_date_year]).strftime("%Y-%m-%d") + " - " + Time.new(params[:bidded_date_year]).end_of_year.strftime("%Y-%m-%d")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if params[:signed_date_year].present? && params[:signed_date_year] != '全部'
|
45
|
+
gon.signed_date = Time.new(params[:signed_date_year]).strftime("%Y-%m-%d") + " - " + Time.new(params[:signed_date_year]).end_of_year.strftime("%Y-%m-%d")
|
46
|
+
end
|
47
|
+
|
48
|
+
if params[:date_at].present? && params[:date_at] != '全部'
|
49
|
+
# 回款时间
|
50
|
+
gon.date_at = Time.new(params[:date_at]).strftime("%Y-%m-%d") + " - " + Time.new(params[:date_at]).end_of_year.strftime("%Y-%m-%d")
|
51
|
+
end
|
52
|
+
|
53
|
+
gon.business_type = Common.where(clazz: 'business_type').map do |d|
|
54
|
+
{ value: d.id, name: d.name, selected: bussiness_type.include?(d.extras) }
|
55
|
+
end
|
56
|
+
|
57
|
+
gon.business_step = Common.where(clazz: 'business_step', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).order("position").map do |d|
|
58
|
+
{ value: d.id, name: d.name, selected: business_step.include?(d.name) }
|
59
|
+
end
|
60
|
+
|
61
|
+
filter = Filter.find_or_create_by(staff_id: @current_admin.id, clazz: "businesses_list")
|
62
|
+
if filter.extras.present?
|
63
|
+
if filter.extras['area'].nil?
|
64
|
+
filter.extras['area'] = 1
|
65
|
+
filter.extras['property'] = 1
|
66
|
+
filter.extras['sale_way'] = 1
|
67
|
+
end
|
68
|
+
filter.save
|
69
|
+
gon.filter = filter.extras
|
70
|
+
else
|
71
|
+
gon.filter = { 'area': 1, 'property': 1, 'sale_way': 1 }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
format.json do
|
75
|
+
if @current_admin.is_admin?
|
76
|
+
@businesses = Business
|
77
|
+
else
|
78
|
+
level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
|
79
|
+
case level
|
80
|
+
when '自己'
|
81
|
+
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
82
|
+
@businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
|
83
|
+
when '区域'
|
84
|
+
# 查看区域商机,需要排除掉其它人员手上的监管学校
|
85
|
+
other_staff_school_id = EducodeSales::StaffSchool.where.not(staff_id: @current_admin.id).where("school_id IN (SELECT school_id FROM educode_sales_staff_schools WHERE staff_id = #{@current_admin.id}) IS NOT TRUE").distinct.pluck :school_id
|
86
|
+
|
87
|
+
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id) - other_staff_school_id
|
88
|
+
if can?(:special, EducodeSales::Business)
|
89
|
+
# 专项商机
|
90
|
+
school_tag_ids = @current_admin.staff_school_tags.pluck(:school_tag_id)
|
91
|
+
tag_school_ids = SchoolTagMiddle.where(school_tag_id: school_tag_ids).pluck(:school_id)
|
92
|
+
school_ids += tag_school_ids
|
93
|
+
end
|
94
|
+
business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
95
|
+
@businesses = Business.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_businesses.staff_id = #{@current_admin.id} OR educode_sales_businesses.id in (?)", school_ids, business_ids)
|
96
|
+
else
|
97
|
+
@businesses = Business
|
98
|
+
end
|
99
|
+
end
|
100
|
+
@businesses =
|
101
|
+
if params[:is_deleted].to_s.present?
|
102
|
+
@businesses.where.not(p_deleted_at: nil)
|
103
|
+
else
|
104
|
+
@businesses.where(p_deleted_at: nil)
|
105
|
+
end
|
106
|
+
|
107
|
+
@is_deleted = params[:is_deleted].to_s.present?
|
108
|
+
gon.is_deleted = @is_deleted ? 1 : 0
|
109
|
+
if params[:q].present? && params[:q][:name].present?
|
110
|
+
@year = params[:q][:name].split("-")[1].present? ? params[:q][:name].split("-")[1] : ''
|
111
|
+
end
|
112
|
+
# @budget_stage_ids = Common.where(clazz: '商机阶段', name: ['初步接洽', '准备方案','已交方案', '已立项']).pluck(:id)
|
113
|
+
if params[:q] && params[:q][:signed_date].present?
|
114
|
+
date = params[:q][:signed_date].split(" - ")
|
115
|
+
@businesses = @businesses.joins("
|
116
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
117
|
+
").where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ?", date[0], date[1])
|
118
|
+
end
|
119
|
+
|
120
|
+
if params[:q] && params[:q][:date_at].present?
|
121
|
+
date = params[:q][:date_at].split(" - ")
|
122
|
+
x_id = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
123
|
+
@businesses = @businesses.joins(follow_ups: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", x_id).where.not("educode_sales_money_plans.clazz!= 1").where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", date[0] + " 00:00:00", date[1] + " 23:59:59").distinct
|
124
|
+
end
|
125
|
+
|
126
|
+
if params[:q] && params[:q][:bidded_date].present?
|
127
|
+
date = params[:q][:bidded_date].split(" - ")
|
128
|
+
@businesses = @businesses.joins("
|
129
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
130
|
+
").where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", date[0], date[1])
|
131
|
+
end
|
132
|
+
|
133
|
+
if params[:q].present? && params[:q][:all].present?
|
134
|
+
@businesses = @businesses
|
135
|
+
end
|
136
|
+
|
137
|
+
if params[:q].present? && params[:q][:name].present?
|
138
|
+
@businesses = @businesses.where("educode_sales_businesses.name like ?", "%#{params[:q][:name]}%")
|
139
|
+
end
|
140
|
+
if params[:q].present? && params[:q][:p_stage].present?
|
141
|
+
@businesses = @businesses.where(p_stage: "#{params[:q][:p_stage].to_s.strip}")
|
142
|
+
end
|
143
|
+
if params[:q].present? && params[:q][:p_staff_id].present?
|
144
|
+
@businesses = @businesses.where(p_staff_id: params[:q][:p_staff_id])
|
145
|
+
end
|
146
|
+
if params[:q].present? && params[:q][:p_special].present?
|
147
|
+
@businesses = @businesses.where(p_special: "#{params[:q][:p_special]}")
|
148
|
+
end
|
149
|
+
if params[:q].present? && params[:q][:p_difficulty].present?
|
150
|
+
@businesses = @businesses.where(p_difficulty: "#{params[:q][:p_difficulty]}")
|
151
|
+
end
|
152
|
+
|
153
|
+
# bidded_date = d.last_follow_up&.bidded_date
|
154
|
+
# stage = d.last_follow_up&.stage&.name
|
155
|
+
# (d.p_pre_money_time.present? && Time.now > d.p_pre_money_time && d.p_actual_money_time.blank?) ||
|
156
|
+
# (d.p_pre_accept_time.present? && Time.now > d.p_pre_accept_time && d.p_accept_time.blank?) ? "逾期" : "正常"
|
157
|
+
# SELECT * FROM users WHERE NOW() > DATE_ADD(bidded_date, INTERVAL 1 MONTH)
|
158
|
+
|
159
|
+
if params[:q].present? && params[:q][:p_state].present?
|
160
|
+
p_state = params[:q][:p_state].to_i
|
161
|
+
# 逾期id
|
162
|
+
late_ids = Business.joins("JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id JOIN educode_sales_commons on educode_sales_commons.id = educode_sales_follow_ups.stage_id")
|
163
|
+
.where("educode_sales_follow_ups.bidded_date is not null")
|
164
|
+
.where("NOW() > DATE_ADD(educode_sales_follow_ups.bidded_date, INTERVAL 1 MONTH)")
|
165
|
+
.where("educode_sales_businesses.p_stage is null")
|
166
|
+
.where("educode_sales_commons.name = '已中标'")
|
167
|
+
.or(Business.joins("JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id JOIN educode_sales_commons on educode_sales_commons.id = educode_sales_follow_ups.stage_id")
|
168
|
+
.where("NOW() > educode_sales_businesses.p_pre_money_time")
|
169
|
+
.where("educode_sales_businesses.p_pre_money_time is not null")
|
170
|
+
.where("educode_sales_businesses.p_actual_money_time is null")
|
171
|
+
).or(Business.joins("JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id JOIN educode_sales_commons on educode_sales_commons.id = educode_sales_follow_ups.stage_id")
|
172
|
+
.where("NOW() > educode_sales_businesses.p_pre_accept_time")
|
173
|
+
.where("educode_sales_businesses.p_pre_accept_time is not null")
|
174
|
+
.where("educode_sales_businesses.p_accept_time is null")).ids
|
175
|
+
if p_state == 0 # 正常
|
176
|
+
@businesses = @businesses.where.not(id: late_ids)
|
177
|
+
else
|
178
|
+
# 逾期
|
179
|
+
@businesses = @businesses.where(id: late_ids)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
if params[:q].present? && params[:q][:department].present?
|
183
|
+
departments_ids = Department.joins(:school).where("schools.name like ?", "%#{params[:q][:department]}%").pluck(:id)
|
184
|
+
@businesses = @businesses.joins(:department).where("departments.id in (?)", departments_ids)
|
185
|
+
end
|
186
|
+
if params[:q].present? && params[:q][:staff_id].present?
|
187
|
+
part_a_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is null AND educode_sales_businesses.staff_id = ?", params[:q][:staff_id]).ids
|
188
|
+
part_b_ids = @businesses.where("educode_sales_businesses.last_follow_up_id is not null").joins("
|
189
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
190
|
+
").where("educode_sales_follow_ups.staff_id = ?", params[:q][:staff_id]).ids
|
191
|
+
business_ids = part_a_ids + part_b_ids
|
192
|
+
if params[:q][:clazz] == 'delete_list'
|
193
|
+
@businesses = EducodeSales::Business.unscoped.where(id: business_ids)
|
194
|
+
else
|
195
|
+
@businesses = EducodeSales::Business.where(id: business_ids)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
if params[:q].present? && params[:q][:business_type].present?
|
199
|
+
@businesses = @businesses.where("educode_sales_businesses.clazz_id in (?)", params[:q][:business_type].split(",").map(&:to_i))
|
200
|
+
end
|
201
|
+
contract_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
|
202
|
+
@businesses = @businesses.joins("
|
203
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
204
|
+
").where("educode_sales_follow_ups.stage_id in (?)", contract_ids)
|
205
|
+
if params[:q].present? && params[:q][:business_step].present?
|
206
|
+
@businesses = @businesses.joins("
|
207
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
208
|
+
").where("educode_sales_follow_ups.stage_id in (?)", params[:q][:business_step].split(",").map(&:to_i))
|
209
|
+
end
|
210
|
+
if params[:q].present? && params[:q][:place_id].present?
|
211
|
+
@businesses = @businesses.joins("
|
212
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
213
|
+
").where("educode_sales_follow_ups.place_id = ?", params[:q][:place_id])
|
214
|
+
end
|
215
|
+
if params[:q].present? && params[:q][:business_year].present?
|
216
|
+
@businesses = @businesses.joins("
|
217
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
218
|
+
").where("educode_sales_follow_ups.year = ?", params[:q][:business_year])
|
219
|
+
end
|
220
|
+
|
221
|
+
if params[:q].present? && params[:q][:year].present?
|
222
|
+
@businesses = @businesses.joins("
|
223
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
224
|
+
").where("educode_sales_follow_ups.year <= ?", params[:q][:year])
|
225
|
+
end
|
226
|
+
|
227
|
+
if params[:q].present? && params[:q][:o_business_deployment].present?
|
228
|
+
@businesses = @businesses.joins("
|
229
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
230
|
+
").where("educode_sales_follow_ups.o_business_deployment = ?", params[:q][:o_business_deployment])
|
231
|
+
end
|
232
|
+
|
233
|
+
if params[:q].present? && params[:q][:area].present?
|
234
|
+
p = EducodeSales::Common.find(params[:q][:area]).name
|
235
|
+
if @current_admin.is_admin?
|
236
|
+
@businesses = @businesses.joins("
|
237
|
+
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
238
|
+
JOIN schools ON departments.school_id = schools.id
|
239
|
+
").where("province = ?", p)
|
240
|
+
else
|
241
|
+
level = @current_admin.role.role_areas.find_by(clazz: '商机管理').level
|
242
|
+
if level == "区域"
|
243
|
+
@businesses = @businesses.joins("
|
244
|
+
JOIN schools ON departments.school_id = schools.id
|
245
|
+
").where("province = ?", p)
|
246
|
+
else
|
247
|
+
@businesses = @businesses.joins("
|
248
|
+
JOIN departments ON educode_sales_businesses.department_id = departments.id
|
249
|
+
JOIN schools ON departments.school_id = schools.id
|
250
|
+
").where("province = ?", p)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
if params[:q].present? && params[:q][:date].present?
|
256
|
+
date = params[:q][:date].split(" - ")
|
257
|
+
@businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ?", date[0], date[1] + '23:59:59')
|
258
|
+
end
|
259
|
+
if params[:q].present? && params[:q][:search_p_actual_money_time].present?
|
260
|
+
date = params[:q][:search_p_actual_money_time].split(" - ")
|
261
|
+
@businesses = @businesses.where("educode_sales_businesses.p_actual_money_time > ? AND educode_sales_businesses.p_actual_money_time < ?", date[0], date[1] + '23:59:59')
|
262
|
+
end
|
263
|
+
|
264
|
+
if params[:q].present? && params[:q][:invitation_at].present?
|
265
|
+
date = params[:q][:invitation_at].split(" - ")
|
266
|
+
@businesses = @businesses.joins("
|
267
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
268
|
+
").where("educode_sales_follow_ups.invitation_at > ? AND educode_sales_follow_ups.invitation_at < ?", date[0] + '00:00:00', date[1] + '23:59:59')
|
269
|
+
end
|
270
|
+
|
271
|
+
# 根据编号获取商机
|
272
|
+
if params[:q].present? && params[:q][:number].present?
|
273
|
+
@businesses = @businesses.where("number like :data", data: "%#{params[:q][:number].strip}%")
|
274
|
+
end
|
275
|
+
|
276
|
+
if params[:q].present? && params[:q][:clazz].present?
|
277
|
+
# 我的关注
|
278
|
+
if params[:q][:clazz] == 'followes'
|
279
|
+
my_ids = BusinessRelationShip.where(user_id: @current_admin.user_id).pluck(:business_id)
|
280
|
+
@businesses = @businesses.where(id: my_ids)
|
281
|
+
elsif params[:q][:clazz] == 'me'
|
282
|
+
ids = AssignFollowUp.joins("JOIN educode_sales_follow_ups ON educode_sales_follow_ups.id = educode_sales_assign_follow_ups.follow_up_id").where(staff_id: @current_admin.id).pluck(:business_id)
|
283
|
+
@businesses = @businesses.where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", ids, @current_admin.id)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
# 商机变化
|
288
|
+
if params[:q][:clazz_changes].present?
|
289
|
+
clazz_changes = EducodeSales::BusinessClazzChange.clazz_changes_value[params[:q][:clazz_changes].to_s]
|
290
|
+
@businesses = @businesses.joins("JOIN educode_sales_business_clazz_changes ON educode_sales_business_clazz_changes.business_id = educode_sales_businesses.id").where("educode_sales_business_clazz_changes.clazz_changed in (?)", clazz_changes)
|
291
|
+
end
|
292
|
+
|
293
|
+
if params[:sort].present? && params[:sort][:field]
|
294
|
+
if params[:sort][:field] == "service_end_time"
|
295
|
+
@businesses = @businesses.order("service_time_long #{params[:sort][:order]}")
|
296
|
+
else
|
297
|
+
@businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
|
298
|
+
end
|
299
|
+
else
|
300
|
+
@businesses = @businesses.order("educode_sales_businesses.created_at desc")
|
301
|
+
end
|
302
|
+
|
303
|
+
@business_count = @businesses.distinct.count
|
304
|
+
# mysql -select
|
305
|
+
@businesses = @businesses.select("
|
306
|
+
distinct
|
307
|
+
educode_sales_businesses.*,
|
308
|
+
last_follow.invitation_at,
|
309
|
+
last_follow.budget_amount,
|
310
|
+
last_follow.o_business_deployment,
|
311
|
+
last_follow.service_time_long,
|
312
|
+
last_follow.service_end_time,
|
313
|
+
last_follow.service_start_time,
|
314
|
+
last_follow.reception_at,
|
315
|
+
last_follow.bidded_date,
|
316
|
+
last_follow.signed_date,
|
317
|
+
last_follow.year,
|
318
|
+
last_follow.created_at as latest_time,
|
319
|
+
last_follow.actual_amount,
|
320
|
+
last_follow.divide_rate,
|
321
|
+
last_follow.divide_amount,
|
322
|
+
(last_follow.total_amount - last_follow.actual_amount) as divide_money,
|
323
|
+
(last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
|
324
|
+
last_follow.total_amount,
|
325
|
+
total_follow_ups.follow_ups_counts
|
326
|
+
").joins("
|
327
|
+
LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id AND last_follow.deleted_at IS NULL
|
328
|
+
LEFT JOIN (
|
329
|
+
SELECT COUNT(*) AS follow_ups_counts, educode_sales_follow_ups.business_id
|
330
|
+
FROM educode_sales_follow_ups
|
331
|
+
WHERE educode_sales_follow_ups.deleted_at IS NULL
|
332
|
+
GROUP BY educode_sales_follow_ups.business_id
|
333
|
+
) AS total_follow_ups ON educode_sales_businesses.id = total_follow_ups.business_id
|
334
|
+
").includes(:users, last_follow_up: [:clazz, :assign_follow_ups]).page(params[:page]).per(params[:limit])
|
335
|
+
|
336
|
+
end
|
337
|
+
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def detail
|
342
|
+
staffs = Staff.where.not(role_id: 11).includes(:user)
|
343
|
+
gon.staffs = staffs.map { |d| { name: d.user.real_name, value: d.id } }
|
344
|
+
gon.staff_value = @project.p_staff_id ? [{ name: @project.p_staff&.user&.real_name, value: @project.p_staff_id }] : []
|
345
|
+
gon.sale_staff_value = @project.p_sale_staff_id ? [{ name: @project.p_sale_staff&.user&.real_name, value: @project.p_sale_staff_id }] : []
|
346
|
+
render layout: false
|
347
|
+
end
|
348
|
+
|
349
|
+
def history
|
350
|
+
render layout: false
|
351
|
+
end
|
352
|
+
|
353
|
+
def update
|
354
|
+
@project.assign_attributes(project_params)
|
355
|
+
check_changes
|
356
|
+
@project.save
|
357
|
+
render_success
|
358
|
+
end
|
359
|
+
|
360
|
+
def destroy
|
361
|
+
@project.p_soft_destroy(current_user.id)
|
362
|
+
render_success
|
363
|
+
end
|
364
|
+
|
365
|
+
def edit
|
366
|
+
staffs = Staff.where.not(role_id: 11).includes(:user)
|
367
|
+
gon.staffs = staffs.map { |d| { name: d.user.real_name, value: d.id } }
|
368
|
+
gon.staff_value = @project.p_staff_id ? [{ name: @project.p_staff&.user&.real_name, value: @project.p_staff_id }] : []
|
369
|
+
gon.sale_staff_value = @project.p_sale_staff_id ? [{ name: @project.p_sale_staff&.user&.real_name, value: @project.p_sale_staff_id }] : []
|
370
|
+
render layout: false
|
371
|
+
end
|
372
|
+
|
373
|
+
def recycle
|
374
|
+
@project.p_recycle
|
375
|
+
render_success
|
376
|
+
end
|
377
|
+
|
378
|
+
private
|
379
|
+
|
380
|
+
def project_params
|
381
|
+
permit =
|
382
|
+
%i[p_stage p_difficulty p_special
|
383
|
+
p_status p_staff_id p_sale_staff_id
|
384
|
+
p_course_time p_platform_time p_deploy_time
|
385
|
+
p_accept_time p_pre_money_time p_actual_money_time
|
386
|
+
p_money p_content p_pre_accept_time]
|
387
|
+
|
388
|
+
params.permit(permit)
|
389
|
+
|
390
|
+
end
|
391
|
+
|
392
|
+
def find_project
|
393
|
+
@project = Business.find(params[:id])
|
394
|
+
end
|
395
|
+
|
396
|
+
def check_changes
|
397
|
+
unless @project.new_record?
|
398
|
+
history = []
|
399
|
+
except_attr = %i[id staff_id department_id name created_at updated_at follow_ups_count last_follow_up_id return_money source deleted_at school_id number clazz_id delete_reason auth_desc state_id p_deleted_at p_deleter_id]
|
400
|
+
arr = @project.attributes.except(except_attr).keys
|
401
|
+
arr.each do |attr|
|
402
|
+
if @project.send("#{attr}_changed?")
|
403
|
+
old_value, new_value = @project.send("#{attr}_was"), @project.send(attr)
|
404
|
+
res = Project.save_history(attr, old_value, new_value)
|
405
|
+
history << res if res
|
406
|
+
end
|
407
|
+
end
|
408
|
+
@project.business_histories.create(content: history, staff: current_user) if history.present?
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
def edu_setting name
|
413
|
+
EduSetting.get(name)
|
414
|
+
end
|
415
|
+
|
416
|
+
def follow_business(user_id, business_id)
|
417
|
+
BusinessRelationShip.where(user_id: user_id, business_id: business_id).first
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|
@@ -83,7 +83,7 @@ module EducodeSales
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def monthPlan
|
86
|
-
@monthPlans = Recycle.where(source_type:"EducodeSales::SalePlan")
|
86
|
+
@monthPlans = Recycle.joins("JOIN educode_sales_sale_plans ON educode_sales_sale_plans.id = educode_sales_recycles.source_id AND educode_sales_sale_plans.month IS NOT NULL AND educode_sales_sale_plans.weekly IS NULL").where(source_type:"EducodeSales::SalePlan")
|
87
87
|
if params[:sort].present? && params[:sort][:field]
|
88
88
|
@monthPlans = @monthPlans.order("created_at #{params[:sort][:order]}")
|
89
89
|
else
|
@@ -91,5 +91,15 @@ module EducodeSales
|
|
91
91
|
end
|
92
92
|
@monthPlans = @monthPlans.page(params[:page]).per(params[:limit])
|
93
93
|
end
|
94
|
+
|
95
|
+
def yearPlan
|
96
|
+
@plans = Recycle.joins("JOIN educode_sales_sale_plans ON educode_sales_sale_plans.id = educode_sales_recycles.source_id AND educode_sales_sale_plans.year IS NOT NULL").where(source_type:"EducodeSales::SalePlan")
|
97
|
+
if params[:sort].present? && params[:sort][:field]
|
98
|
+
@plans = @plans.order("created_at #{params[:sort][:order]}")
|
99
|
+
else
|
100
|
+
@plans = @plans.order("educode_sales_recycles.created_at desc")
|
101
|
+
end
|
102
|
+
@plans = @plans.page(params[:page]).per(params[:limit])
|
103
|
+
end
|
94
104
|
end
|
95
105
|
end
|