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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/assets/javascripts/educode_sales/extent/treeTable.js +235 -0
  4. data/app/controllers/educode_sales/activities_controller.rb +52 -38
  5. data/app/controllers/educode_sales/businesses_controller.rb +1 -1
  6. data/app/controllers/educode_sales/customers_controller.rb +107 -0
  7. data/app/controllers/educode_sales/follow_ups_controller.rb +6 -0
  8. data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
  9. data/app/controllers/educode_sales/plans_controller.rb +173 -11
  10. data/app/controllers/educode_sales/projects_controller.rb +420 -0
  11. data/app/controllers/educode_sales/recycles_controller.rb +11 -1
  12. data/app/controllers/educode_sales/roles_controller.rb +4 -1
  13. data/app/controllers/educode_sales/teachers_controller.rb +42 -17
  14. data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
  15. data/app/helpers/educode_sales/application_helper.rb +1 -0
  16. data/app/models/educode_sales/activity.rb +4 -0
  17. data/app/models/educode_sales/assessments_setting.rb +2 -2
  18. data/app/models/educode_sales/business.rb +21 -5
  19. data/app/models/educode_sales/business_history.rb +8 -0
  20. data/app/models/educode_sales/business_info.rb +9 -0
  21. data/app/models/educode_sales/permission.rb +2 -1
  22. data/app/models/educode_sales/project.rb +53 -0
  23. data/app/models/educode_sales/role_area.rb +2 -1
  24. data/app/models/educode_sales/sale_plan.rb +3 -1
  25. data/app/models/educode_sales/staff.rb +2 -0
  26. data/app/views/educode_sales/activities/_follows.html.erb +50 -36
  27. data/app/views/educode_sales/activities/_index.html.erb +82 -9
  28. data/app/views/educode_sales/activities/edit.html.erb +25 -68
  29. data/app/views/educode_sales/activities/files.html.erb +157 -0
  30. data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
  31. data/app/views/educode_sales/activities/follow_ups.json.jbuilder +1 -1
  32. data/app/views/educode_sales/activities/index.json.jbuilder +2 -2
  33. data/app/views/educode_sales/activities/new.html.erb +21 -60
  34. data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
  35. data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
  36. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
  37. data/app/views/educode_sales/businesses/index.html.erb +5 -0
  38. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -0
  39. data/app/views/educode_sales/businesses/new.html.erb +1 -1
  40. data/app/views/educode_sales/businesses/time_line.html.erb +9 -5
  41. data/app/views/educode_sales/customers/edit_major.html.erb +872 -0
  42. data/app/views/educode_sales/customers/list.html.erb +602 -0
  43. data/app/views/educode_sales/customers/list.json.jbuilder +33 -0
  44. data/app/views/educode_sales/follow_ups/index.json.jbuilder +2 -2
  45. data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
  46. data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
  47. data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
  48. data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
  49. data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
  50. data/app/views/educode_sales/plans/index.html.erb +8 -0
  51. data/app/views/educode_sales/plans/new_year.html.erb +204 -0
  52. data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
  53. data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
  54. data/app/views/educode_sales/projects/detail.html.erb +269 -0
  55. data/app/views/educode_sales/projects/edit.html.erb +246 -0
  56. data/app/views/educode_sales/projects/history.html.erb +41 -0
  57. data/app/views/educode_sales/projects/index.html.erb +688 -0
  58. data/app/views/educode_sales/projects/index.json.jbuilder +69 -0
  59. data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
  60. data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
  61. data/app/views/educode_sales/recycles/index.html.erb +26 -22
  62. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
  63. data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
  64. data/app/views/educode_sales/teachers/_index.html.erb +17 -1
  65. data/app/views/educode_sales/teachers/index.json.jbuilder +2 -0
  66. data/app/views/layouts/educode_sales/application.html.erb +25 -0
  67. data/config/routes.rb +31 -0
  68. data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +6 -0
  69. data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
  70. data/db/migrate/20230411134203_add_realname_to_teacher.rb +5 -0
  71. data/db/migrate/20230412083510_add_p_staff_id_to_businesses.rb +20 -0
  72. data/db/migrate/20230412092000_create_business_histories.rb +10 -0
  73. data/db/migrate/20230413015619_add_permissions_to_projects.rb +11 -0
  74. data/db/migrate/20230413031029_add_pre_time_to_businesses.rb +5 -0
  75. data/lib/educode_sales/version.rb +1 -1
  76. 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
- else
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
- plan = @current_admin.sale_plans.build(plan_params)
63
- plan.month = params["month"] + "-1"
64
- plan.business = Business.find_by(id: params[:business_id])
65
- if plan.save
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 plan
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
- sale_plan = SalePlan.find(params[:id])
200
- if sale_plan.soft_destroy(@current_admin.id)
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
- render_failure sale_plan
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