educode_sales 1.10.58 → 1.10.59
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/educode_sales/indexlogo.png +0 -0
- data/app/controllers/educode_sales/plans_controller.rb +392 -9
- data/app/models/educode_sales/permission.rb +7 -0
- data/app/models/educode_sales/sales_target_history.rb +11 -0
- data/app/views/educode_sales/plans/_year_execute.html.erb +293 -0
- data/app/views/educode_sales/plans/_year_target.html.erb +677 -0
- data/app/views/educode_sales/plans/index.html.erb +104 -81
- data/app/views/educode_sales/plans/year_execute.js.erb +1 -0
- data/app/views/educode_sales/plans/year_target.js.erb +1 -0
- data/app/views/educode_sales/plans/year_target.json.jbuilder +48 -0
- data/app/views/educode_sales/plans/years_all_target.json.jbuilder +53 -0
- data/app/views/layouts/educode_sales/application.html.erb +1 -1
- data/config/routes.rb +7 -2
- data/db/migrate/20230729085359_create_educode_sales_sales_target_histories.rb +45 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +14 -7
- data/app/views/educode_sales/plans/_target_track.html.erb +0 -178
- data/app/views/educode_sales/plans/target_track.js.erb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e79e3bb70dfa210936c30a10cbf201a4fda9065f8d6243f5404cb18e39f4a6c
|
4
|
+
data.tar.gz: f57a3be46b0e597d85025e1bf97cfeb4851cc2a2f76fe6937692063cbb5a0fde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c166871e6c22988d3811c17cd50c6cbea1aee2c4b76ac1b0c908a8c8accabe29dabb75154415a17ee9342291a501e9479a4016611676bef70a8778cba2c8a2d3
|
7
|
+
data.tar.gz: a856cd0c13fae3647dc01acfb2ddcaf95e7c33a27f9075eaa951e723756491e7928b5c541a2988b683ffd7506a46708a81072bfd44204323cef0c6b1bb42a257
|
Binary file
|
@@ -2,7 +2,7 @@ require_dependency "educode_sales/application_controller"
|
|
2
2
|
|
3
3
|
module EducodeSales
|
4
4
|
class PlansController < ApplicationController
|
5
|
-
|
5
|
+
protect_from_forgery
|
6
6
|
def index
|
7
7
|
# authorize! :read, SalePlan
|
8
8
|
respond_to do |format|
|
@@ -93,7 +93,7 @@ module EducodeSales
|
|
93
93
|
render_failure plan
|
94
94
|
end
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
end
|
98
98
|
|
99
99
|
def create_business_info
|
@@ -112,7 +112,7 @@ module EducodeSales
|
|
112
112
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
113
113
|
@staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
|
114
114
|
|
115
|
-
|
115
|
+
|
116
116
|
@week = Time.now.strftime('%W').to_i
|
117
117
|
week = Time.now.strftime('%W').to_i
|
118
118
|
if week > 3
|
@@ -153,7 +153,7 @@ module EducodeSales
|
|
153
153
|
@commons = Common.where(clazz: '计划类型').pluck(:name, :id)
|
154
154
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
155
155
|
@staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
|
156
|
-
|
156
|
+
|
157
157
|
@business = Business.find_by(id: params[:business_id])
|
158
158
|
business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
|
159
159
|
@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)
|
@@ -181,7 +181,7 @@ module EducodeSales
|
|
181
181
|
@businesses = @businesses.limit(10)
|
182
182
|
end
|
183
183
|
@businesses = @businesses.order(created_at: :desc)
|
184
|
-
|
184
|
+
|
185
185
|
@businesses = @businesses.map { |b| {name: b.name + "(#{b.department&.school&.name} #{b.department&.name})" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), value: b.id} }
|
186
186
|
render json: { data: @businesses, code: 0, msg: "success" }
|
187
187
|
end
|
@@ -233,7 +233,7 @@ module EducodeSales
|
|
233
233
|
business_ids << @sale_plan.business_id
|
234
234
|
@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)
|
235
235
|
@businesses = @businesses.map { |b| [b.name + "(" + b.department&.school&.name.to_s + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
|
236
|
-
|
236
|
+
|
237
237
|
if @sale_plan.weekly.present?
|
238
238
|
week = Time.now.strftime('%W').to_i
|
239
239
|
if week > 3
|
@@ -389,6 +389,51 @@ module EducodeSales
|
|
389
389
|
@sale_plans = @sale_plans.page(params[:page]).per(params[:limit])
|
390
390
|
end
|
391
391
|
|
392
|
+
def years_all_target
|
393
|
+
#目标类别
|
394
|
+
target_clazz = params[:target_clazz]
|
395
|
+
#年份
|
396
|
+
year = params[:year].present? ? params[:year].to_i : Date.today.year.to_i
|
397
|
+
type = params[:type]
|
398
|
+
#员工id
|
399
|
+
staff_id = params[:staff_id]
|
400
|
+
#客户类型
|
401
|
+
school_tag_id = params[:school_tag_id]
|
402
|
+
|
403
|
+
if @current_admin.is_admin?
|
404
|
+
else
|
405
|
+
level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
|
406
|
+
case level
|
407
|
+
when '自己'
|
408
|
+
staff_id = @current_admin.id
|
409
|
+
when '区域'
|
410
|
+
staff_id = @current_admin.id
|
411
|
+
else
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
if type.present? && type == 'all'
|
416
|
+
@data = get_sales_all_plan(0, '', year, school_tag_id)
|
417
|
+
@total_count = 1
|
418
|
+
else
|
419
|
+
staffs =
|
420
|
+
if staff_id.present?
|
421
|
+
EducodeSales::Staff.where(id: staff_id)
|
422
|
+
else
|
423
|
+
EducodeSales::Staff.all
|
424
|
+
end
|
425
|
+
@total_count = staffs.count
|
426
|
+
staffs = staffs.page(params[:page]).per(params[:limit])
|
427
|
+
@data = []
|
428
|
+
staffs.each do |staff|
|
429
|
+
@data += get_sales_all_plan(staff.id, staff.name, year, school_tag_id)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
if target_clazz.present?
|
433
|
+
@data.delete_if { |item| !target_clazz.include?(item['target_clazz'])}
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
392
437
|
def my_years_plan
|
393
438
|
@sale_plans = SalePlan.where(staff_id: @current_admin.id)
|
394
439
|
end
|
@@ -511,19 +556,183 @@ module EducodeSales
|
|
511
556
|
end
|
512
557
|
|
513
558
|
|
514
|
-
def
|
559
|
+
def year_execute
|
560
|
+
respond_to do |format|
|
561
|
+
format.html do
|
562
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
563
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
564
|
+
gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
|
565
|
+
end
|
566
|
+
format.js do
|
567
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
568
|
+
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
569
|
+
gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
|
570
|
+
end
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
574
|
+
def year_target
|
515
575
|
respond_to do |format|
|
516
576
|
format.html do
|
517
|
-
|
518
577
|
end
|
519
578
|
format.js do
|
520
579
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
521
580
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
|
522
581
|
gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
|
582
|
+
gon.month = Time.now.month
|
583
|
+
end
|
584
|
+
format.json do
|
585
|
+
|
586
|
+
if @current_admin.is_admin?
|
587
|
+
@data = EducodeSales::SalesTargetHistory.all
|
588
|
+
else
|
589
|
+
level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
|
590
|
+
case level
|
591
|
+
when '自己'
|
592
|
+
@data = EducodeSales::SalesTargetHistory.where(staff_id: @current_admin.id)
|
593
|
+
when '区域'
|
594
|
+
@data = EducodeSales::SalesTargetHistory.all
|
595
|
+
staff_ids = Staff.joins(user: [user_extension: [department: :school]]).where("schools.province in (?)", @current_admin.areas.pluck(:name)).pluck(:id)
|
596
|
+
@data = @data.where(staff_id: staff_ids)
|
597
|
+
else
|
598
|
+
@data = EducodeSales::SalesTargetHistory.all
|
599
|
+
end
|
600
|
+
end
|
601
|
+
@data = @data.order("staff_id asc,num desc, is_use desc,field(state, 1,0,2), id desc")
|
602
|
+
if params[:year].present?
|
603
|
+
@data = @data.where(year: params[:year])
|
604
|
+
end
|
605
|
+
if params[:school_tag_id].present?
|
606
|
+
@data = @data.where(school_tag_id: params[:school_tag_id])
|
607
|
+
end
|
608
|
+
if params[:staff_id].present?
|
609
|
+
@data = @data.where(staff_id: params[:staff_id])
|
610
|
+
end
|
611
|
+
if params[:year_target].present?
|
612
|
+
@data = @data.where(year_target: params[:year_target])
|
613
|
+
end
|
614
|
+
if params[:target_clazz].present?
|
615
|
+
@data = @data.where(target_clazz: params[:target_clazz])
|
616
|
+
end
|
617
|
+
@data = @data.page(params[:page]).per(params[:limit])
|
523
618
|
end
|
524
619
|
end
|
525
620
|
end
|
526
621
|
|
622
|
+
def cal_finish_amount
|
623
|
+
start_at = params[:year] + "-01-01"
|
624
|
+
end_at = params[:year] + "-12-31"
|
625
|
+
amount = 0
|
626
|
+
case params[:target_clazz]
|
627
|
+
when "回款"
|
628
|
+
# 对应销售经理下回款时间的回款金额
|
629
|
+
amount = EducodeSales::MoneyPlanRecord.joins("
|
630
|
+
LEFT JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL
|
631
|
+
LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
|
632
|
+
joins(business: [department: [school: :school_tags]]).where("school_tags.id = ?", params[:school_tag_id]).
|
633
|
+
where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:staff_id], params[:staff_id]).
|
634
|
+
where("date_at >= ? AND date_at <= ?", start_at, end_at).sum("amount")
|
635
|
+
|
636
|
+
when '商机'
|
637
|
+
a_clazz = EducodeSales::Common.find_by(extras: 'a_class')
|
638
|
+
start_at = "#{params[:year]}-01-01 00:00:01"
|
639
|
+
end_at = "#{params[:year]}-12-31 23:59:59"
|
640
|
+
staff_id = params[:staff_id]
|
641
|
+
# 对应销售经理下A类商机预算金额
|
642
|
+
amount = EducodeSales::Business.from("(
|
643
|
+
SELECT distinct educode_sales_businesses.id, last_follow_up.budget_amount, educode_sales_businesses.deleted_at, educode_sales_businesses.department_id
|
644
|
+
FROM educode_sales_businesses
|
645
|
+
JOIN educode_sales_follow_ups ON educode_sales_follow_ups.business_id = educode_sales_businesses.id AND educode_sales_businesses.clazz_id = #{a_clazz.id}
|
646
|
+
AND educode_sales_follow_ups.created_at > '#{start_at}' AND educode_sales_follow_ups.created_at < '#{end_at}'
|
647
|
+
JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL AND last_follow_up.clazz_id = #{a_clazz.id}
|
648
|
+
LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id
|
649
|
+
WHERE (educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = '#{staff_id}') OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = '#{staff_id}')
|
650
|
+
) AS educode_sales_businesses
|
651
|
+
").joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:school_tag_id]).sum(:budget_amount)
|
652
|
+
when '中标'
|
653
|
+
# 对应销售经理下合同列表的中标时间下合同金额
|
654
|
+
contract_ids = EducodeSales::Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
|
655
|
+
businesses = EducodeSales::Business.joins("
|
656
|
+
JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
|
657
|
+
").joins("LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = educode_sales_businesses.last_follow_up_id").
|
658
|
+
joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:school_tag_id]).
|
659
|
+
where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:staff_id], params[:staff_id]).
|
660
|
+
where("educode_sales_follow_ups.stage_id in (?)", contract_ids).
|
661
|
+
where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", start_at, end_at).sum(:actual_amount)
|
662
|
+
end
|
663
|
+
render json: {amount: amount}
|
664
|
+
end
|
665
|
+
|
666
|
+
def add_year_target
|
667
|
+
history = EducodeSales::SalesTargetHistory.find_by(staff_id: params[:staff_id], year: params[:year], school_tag_id: params[:school_tag_id], target_clazz: params[:target_clazz])
|
668
|
+
# history.update_attributes(params.permit(:m_target_1, :m_target_2, :m_target_3, :m_target_4, :m_target_5, :m_target_6, :m_target_7, :m_target_8, :m_target_9, :m_target_10, :m_target_11, :m_target_12)) if history
|
669
|
+
# 不能重复添加
|
670
|
+
#if EducodeSales::SalesTargetHistory.exists?(staff_id: params[:staff_id], year: params[:year], school_tag_id: params[:school_tag_id], target_clazz: params[:target_clazz])
|
671
|
+
# return render_failure "不能重复添加"
|
672
|
+
#end
|
673
|
+
target = EducodeSales::SalesTargetHistory.new(year_target_param)
|
674
|
+
if history
|
675
|
+
use_old_attributes = %w[m_target_1 m_target_2 m_target_3 m_target_4 m_target_5 m_target_6 m_target_7 m_target_8 m_target_9 m_target_10 m_target_11 m_target_12] - params.keys
|
676
|
+
use_old_attributes.each do |attr|
|
677
|
+
target[attr] = history[attr]
|
678
|
+
end
|
679
|
+
end
|
680
|
+
if history
|
681
|
+
target.num = history.num
|
682
|
+
else
|
683
|
+
target.num = EducodeSales::SalesTargetHistory.maximum(:id).to_i + 1
|
684
|
+
end
|
685
|
+
|
686
|
+
target.creator_id = @current_admin.id
|
687
|
+
target.state = '待审核'
|
688
|
+
if target.save
|
689
|
+
render json: { id: target.id, state: target.state, updated_at: target.updated_at.to_s(:date) }
|
690
|
+
else
|
691
|
+
render_failure target
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
def update_year_target
|
696
|
+
target = EducodeSales::SalesTargetHistory.find(params[:id])
|
697
|
+
if target.state == '待审核'
|
698
|
+
if params[:state] == '已通过'
|
699
|
+
other_uses = EducodeSales::SalesTargetHistory.where(num: target.num, is_use: true).order(id: :desc)
|
700
|
+
if other_uses
|
701
|
+
other_uses.update(is_use: false)
|
702
|
+
last_use = other_uses.last
|
703
|
+
# 最近采用的月份目标复制过来
|
704
|
+
12.times do |i|
|
705
|
+
if last_use.send("target_#{i+1}").present?
|
706
|
+
target.send("target_#{i+1}=", last_use.send("target_#{i+1}") )
|
707
|
+
end
|
708
|
+
end
|
709
|
+
end
|
710
|
+
# 采用修改的月份目标
|
711
|
+
12.times do |i|
|
712
|
+
if target.send("m_target_#{i+1}").present?
|
713
|
+
target.send("target_#{i+1}=", target.send("m_target_#{i+1}") )
|
714
|
+
end
|
715
|
+
end
|
716
|
+
target.state = '已通过'
|
717
|
+
target.is_use = true
|
718
|
+
elsif params[:state] == '已驳回'
|
719
|
+
target.state = '已驳回'
|
720
|
+
end
|
721
|
+
|
722
|
+
target.comment = params[:comment]
|
723
|
+
target.reviewer_id = @current_admin.id
|
724
|
+
if target.save
|
725
|
+
render json: {state: target.state, updated_at: target.updated_at.to_s(:date)}
|
726
|
+
else
|
727
|
+
render_failure target
|
728
|
+
end
|
729
|
+
else
|
730
|
+
render json: {success: false, msg: '该状态不能编辑'}
|
731
|
+
end
|
732
|
+
|
733
|
+
end
|
734
|
+
|
735
|
+
|
527
736
|
private
|
528
737
|
|
529
738
|
def plan_params
|
@@ -536,7 +745,181 @@ module EducodeSales
|
|
536
745
|
|
537
746
|
def update_business_info_extra_params
|
538
747
|
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,
|
539
|
-
|
748
|
+
: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)
|
749
|
+
end
|
750
|
+
|
751
|
+
def year_target_param
|
752
|
+
params.permit(:staff_id, :year, :target_clazz, :school_tag_id, :year_finish, :year_target, :year_diff, :m_target_1, :m_target_2, :m_target_3, :m_target_4, :m_target_5, :m_target_6, :m_target_7, :m_target_8, :m_target_9, :m_target_10, :m_target_11, :m_target_12)
|
753
|
+
end
|
754
|
+
|
755
|
+
def make_target_data(sales_all_plan, data, column, type)
|
756
|
+
data.each do |item|
|
757
|
+
_column = "#{column}_#{item.m.gsub("0", '')}"
|
758
|
+
if sales_all_plan[type][item.school_tag_id].present?
|
759
|
+
if sales_all_plan[type][item.school_tag_id][_column].present?
|
760
|
+
sales_all_plan[type][item.school_tag_id][_column] += item.amount
|
761
|
+
else
|
762
|
+
sales_all_plan[type][item.school_tag_id][_column] = item.amount
|
763
|
+
end
|
764
|
+
else
|
765
|
+
sales_all_plan[type][item.school_tag_id] = {"school_tag_id" => item.school_tag_id, "school_tag_name" => item.school_tag_name}
|
766
|
+
sales_all_plan[type][item.school_tag_id][_column] = item.amount
|
767
|
+
end
|
768
|
+
sales_all_plan[type][item.school_tag_id]['type'] = type
|
769
|
+
end
|
770
|
+
sales_all_plan
|
771
|
+
end
|
772
|
+
|
773
|
+
def get_sales_all_plan(staff_id, staff_name, year, school_tag_id)
|
774
|
+
|
775
|
+
follow_up_ids = ''
|
776
|
+
if staff_id.present?
|
777
|
+
follow_up_ids = EducodeSales::AssignFollowUp.where(staff_id: staff_id).pluck(:follow_up_id).compact.join(',')
|
778
|
+
end
|
779
|
+
# 中标&商机&回款 - 目标按月
|
780
|
+
sales_target_histories = EducodeSales::SalesTargetHistory.from("
|
781
|
+
(SELECT H.id,clazz,school_tag_id,T.name as school_tag_name,sum(m_target_1) as target_1, sum(m_target_2) target_2, sum(m_target_3) target_3, sum(m_target_4) target_4, sum(m_target_5) target_5, sum(m_target_6) target_6, sum(m_target_7) target_7,sum(m_target_8) target_8,sum(m_target_9) target_9, sum(m_target_10) target_10, sum(m_target_11) target_11, sum(m_target_12) target_12
|
782
|
+
FROM educode_sales_sales_target_histories as H
|
783
|
+
LEFT JOIN school_tags AS T ON H.school_tag_id = T.id
|
784
|
+
WHERE is_use = 1 AND year = #{year} AND T.for_missions = 1
|
785
|
+
#{staff_id.present? ? " AND staff_id = #{staff_id}" : ""}
|
786
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
787
|
+
GROUP BY clazz,school_tag_id) as educode_sales_sales_target_histories
|
788
|
+
").order('clazz asc, school_tag_id asc,id desc')
|
789
|
+
|
790
|
+
start_at = Date.new(year, 1, 1)
|
791
|
+
end_at = Date.new((year + 1), 1, 1)
|
792
|
+
follow_up_ids_where =
|
793
|
+
if staff_id.present?
|
794
|
+
follow_up_ids_where = follow_up_ids.present? ? " AND B.last_follow_up_id in (#{follow_up_ids})" : " AND B.id in(0)"
|
795
|
+
end
|
796
|
+
|
797
|
+
# 中标 - 完成
|
798
|
+
bidder_finish = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
|
799
|
+
"(SELECT sum(F.actual_amount) as amount, date_format(F.bidded_date, '%m') as m,T.name as school_tag_name,
|
800
|
+
TM.school_tag_id as school_tag_id,F.deleted_at
|
801
|
+
FROM educode_sales_businesses AS B
|
802
|
+
LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
|
803
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
804
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id
|
805
|
+
WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND F.bidded_date BETWEEN '#{start_at}' AND '#{end_at}'
|
806
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
807
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
808
|
+
GROUP BY school_tag_id,m
|
809
|
+
) AS educode_sales_follow_ups"
|
810
|
+
).order('school_tag_id ASC, m asc')
|
811
|
+
|
812
|
+
# 中标 - 计划
|
813
|
+
bidder_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
|
814
|
+
"(SELECT sum(plan_return_money) as amount, date_format(plan_return_date, '%m') as m,T.name as school_tag_name,
|
815
|
+
TM.school_tag_id as school_tag_id,F.deleted_at
|
816
|
+
FROM educode_sales_businesses AS B
|
817
|
+
LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
|
818
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
819
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
|
820
|
+
WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND F.plan_return_date BETWEEN '#{start_at}' AND '#{end_at}'
|
821
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
822
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
823
|
+
GROUP BY school_tag_id,m
|
824
|
+
ORDER BY school_tag_id ASC
|
825
|
+
) AS educode_sales_follow_ups"
|
826
|
+
).order('school_tag_id ASC, m asc')
|
827
|
+
# 回款 - 完成
|
828
|
+
money_finish = EducodeSales::MoneyPlanRecord.select('amount,m,school_tag_id,school_tag_name').from(
|
829
|
+
"(SELECT sum(amount) as amount, date_format(R.date_at, '%m') as m,T.name as school_tag_name,
|
830
|
+
TM.school_tag_id as school_tag_id
|
831
|
+
FROM educode_sales_money_plan_records as R
|
832
|
+
LEFT JOIN educode_sales_businesses AS B ON R.business_id=B.id
|
833
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
834
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
|
835
|
+
WHERE T.for_missions = 1 AND R.date_at BETWEEN '#{start_at}' AND '#{end_at}'
|
836
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
837
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
838
|
+
GROUP BY school_tag_id,m
|
839
|
+
ORDER BY school_tag_id ASC
|
840
|
+
) AS educode_sales_money_plan_records"
|
841
|
+
).order('school_tag_id ASC, m asc')
|
842
|
+
# 回款 - 计划 .group_by { |d| d.m }
|
843
|
+
money_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
|
844
|
+
"(SELECT sum(plan_return_money) as amount, date_format(plan_return_date, '%m') as m,T.name as school_tag_name,
|
845
|
+
F.deleted_at,TM.school_tag_id as school_tag_id
|
846
|
+
FROM educode_sales_businesses AS B
|
847
|
+
LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
|
848
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
849
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
|
850
|
+
WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND plan_return_date BETWEEN '#{start_at}' AND '#{end_at}'
|
851
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
852
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
853
|
+
GROUP BY school_tag_id,m
|
854
|
+
ORDER BY school_tag_id ASC
|
855
|
+
) AS educode_sales_follow_ups"
|
856
|
+
).order('school_tag_id ASC, m asc')
|
857
|
+
# 商机-完成 .where(:bidded_date => start_datetime..end_datetime)
|
858
|
+
business_finish = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
|
859
|
+
"(SELECT sum(budget_amount) as amount, date_format(bidded_date, '%m') as m,T.name as school_tag_name,
|
860
|
+
F.deleted_at,TM.school_tag_id as school_tag_id
|
861
|
+
FROM educode_sales_businesses AS B
|
862
|
+
LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
|
863
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
864
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
|
865
|
+
WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND bidded_date BETWEEN '#{start_at}' AND '#{end_at}'
|
866
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
867
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
868
|
+
GROUP BY school_tag_id,m
|
869
|
+
) AS educode_sales_follow_ups
|
870
|
+
"
|
871
|
+
).order('school_tag_id ASC, m asc')
|
872
|
+
# 商机-计划
|
873
|
+
business_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
|
874
|
+
"(SELECT sum(plan_a_money) as amount, date_format(plan_a_date, '%m') as m,T.name as school_tag_name,
|
875
|
+
F.deleted_at,TM.school_tag_id as school_tag_id
|
876
|
+
FROM educode_sales_businesses AS B
|
877
|
+
LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
|
878
|
+
LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
|
879
|
+
LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
|
880
|
+
WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND plan_a_date BETWEEN '#{start_at}' AND '#{end_at}'
|
881
|
+
#{follow_up_ids_where.present? ? follow_up_ids_where : ''}
|
882
|
+
#{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
|
883
|
+
GROUP BY school_tag_id,m
|
884
|
+
ORDER BY school_tag_id ASC
|
885
|
+
) AS educode_sales_follow_ups"
|
886
|
+
).order('school_tag_id ASC, m asc')
|
887
|
+
|
888
|
+
sales_all_plan = {:bidder => {}, :business => {}, :money => {}}
|
889
|
+
sales_target_histories.each do |history|
|
890
|
+
case history.clazz
|
891
|
+
when '中标'
|
892
|
+
sales_all_plan[:bidder][history.school_tag_id] = history.attributes.except('id')
|
893
|
+
when '商机'
|
894
|
+
sales_all_plan[:business][history.school_tag_id] = history.attributes.except('id')
|
895
|
+
when '回款'
|
896
|
+
sales_all_plan[:money][history.school_tag_id] = history.attributes.except('id')
|
897
|
+
else
|
898
|
+
end
|
899
|
+
end
|
900
|
+
#中标完成
|
901
|
+
sales_all_plan = make_target_data(sales_all_plan, bidder_finish, 'finish', :bidder)
|
902
|
+
#中标计划
|
903
|
+
sales_all_plan = make_target_data(sales_all_plan, bidder_plan, 'plan', :bidder)
|
904
|
+
#回款完成
|
905
|
+
sales_all_plan = make_target_data(sales_all_plan, money_finish, 'finish', :money)
|
906
|
+
#回款计划
|
907
|
+
sales_all_plan = make_target_data(sales_all_plan, money_plan, 'plan', :money)
|
908
|
+
#商机完成
|
909
|
+
sales_all_plan = make_target_data(sales_all_plan, business_finish, 'finish', :business)
|
910
|
+
#商机计划
|
911
|
+
sales_all_plan = make_target_data(sales_all_plan, business_plan, 'plan', :business)
|
912
|
+
|
913
|
+
data = sales_all_plan[:bidder].values + sales_all_plan[:business].values + sales_all_plan[:money].values
|
914
|
+
|
915
|
+
if data.empty?
|
916
|
+
data = ['id' => staff_id, 'name' => staff_name, 'target_clazz' => '商机']
|
917
|
+
end
|
918
|
+
data.each do |item|
|
919
|
+
item['id'] = staff_id
|
920
|
+
item['name'] = staff_name
|
921
|
+
item['target_clazz'] = item['clazz'].present? ? item['clazz'] : SalesTargetHistory::TARGET_CLAZZ_NAME[item['type']]
|
922
|
+
end
|
540
923
|
end
|
541
924
|
|
542
925
|
end
|
@@ -1,5 +1,12 @@
|
|
1
1
|
module EducodeSales
|
2
2
|
class Permission < ApplicationRecord
|
3
|
+
# EducodeSales::Permission.create(name: '查看数据', subject: 'SalePlan', action: 'new_index', clazz: 'sale_plan')
|
4
|
+
# EducodeSales::Permission.create(name: '分类查看', subject: 'SalePlan', action: 'new_type_index', clazz: 'sale_plan')
|
5
|
+
# EducodeSales::Permission.create(name: '添加目标', subject: 'SalePlan', action: 'new_create', clazz: 'sale_plan')
|
6
|
+
# EducodeSales::Permission.create(name: '编辑目标', subject: 'SalePlan', action: 'new_update', clazz: 'sale_plan')
|
7
|
+
# EducodeSales::Permission.create(name: '审核目标', subject: 'SalePlan', action: 'new_audit', clazz: 'sale_plan')
|
8
|
+
# EducodeSales::Permission.create(name: '查看记录', subject: 'SalePlan', action: 'new_record_index', clazz: 'sale_plan')
|
9
|
+
default_scope { where(hidden: false) }
|
3
10
|
enum clazz: {
|
4
11
|
'销售态势': 'market',
|
5
12
|
'销售分工': 'sale_job',
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module EducodeSales
|
2
|
+
class SalesTargetHistory < ApplicationRecord
|
3
|
+
belongs_to :staff
|
4
|
+
belongs_to :reviewer, class_name: 'Staff', optional: true
|
5
|
+
belongs_to :school_tag
|
6
|
+
|
7
|
+
enum clazz: { '中标': 18, '回款': 2, '商机': 7 }
|
8
|
+
TARGET_CLAZZ_NAME = { 'bidder': '中标', 'money': '回款', 'business': '商机' }
|
9
|
+
enum state: %w[待审核 已通过 已驳回]
|
10
|
+
end
|
11
|
+
end
|