educode_sales 1.10.20 → 1.10.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/educode_sales/assessments_controller.rb +6 -0
- data/app/controllers/educode_sales/ideas_controller.rb +2 -2
- data/app/controllers/educode_sales/money_plans_controller.rb +11 -0
- data/app/models/educode_sales/assessments_setting.rb +75 -0
- data/app/views/educode_sales/assessments/_finished.html.erb +12 -6
- data/app/views/educode_sales/assessments/finished.json.jbuilder +0 -1
- data/app/views/educode_sales/assessments/index.html.erb +1 -0
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +2 -2
- data/app/views/educode_sales/money_plan_records/_index.html.erb +4 -1
- data/lib/educode_sales/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d2ef3de0cf042aac3ccbab794698672f1023a85ca02955c411b4edf4f9a20c9
|
4
|
+
data.tar.gz: 3c5c9fcb1bbeb580f6869ef75016007de086c3d4a684cfe6cf8982c842e026bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10cd26f67854df2f38eba390682d6372101a9796a9854c11db94f1c639e2173efd704c0204fca396bb72d2f1a056a7970f53d67bba2873f19025c88f0d673d7d
|
7
|
+
data.tar.gz: 4213ae7c4af6f959a5baf3fd30f12c622707b58480fe7eb2894e3d31220a4a433a046a989ff19ceff78ae6f5e0323f53e4954af1c2d209b1703233e196662338
|
@@ -8,6 +8,7 @@ module EducodeSales
|
|
8
8
|
def index
|
9
9
|
respond_to do |format|
|
10
10
|
format.html do
|
11
|
+
gon.assement_list = EducodeSales::AssessmentsSetting::CLAZZ.map { |d, i| {value: d, name: i } }
|
11
12
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
12
13
|
@staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]} # [[], [], ............]
|
13
14
|
# 导出
|
@@ -53,6 +54,10 @@ module EducodeSales
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def finished
|
57
|
+
@year = params[:q].present? && params[:q][:assessment_year].present? ? params[:q][:assessment_year] : Time.now.year
|
58
|
+
EducodeSales::AssessmentsSetting.update_stats(@year, params[:assessment_id])
|
59
|
+
|
60
|
+
|
56
61
|
if @current_admin.is_admin?
|
57
62
|
@assessments = AssessmentsSetting.all
|
58
63
|
else
|
@@ -67,6 +72,7 @@ module EducodeSales
|
|
67
72
|
@assessments = AssessmentsSetting.all
|
68
73
|
end
|
69
74
|
end
|
75
|
+
|
70
76
|
|
71
77
|
if params[:assessment_year].present?
|
72
78
|
@assessments = @assessments.where(assessment_year: Time.new(params[:assessment_year])..Time.new(params[:assessment_year]).end_of_year)
|
@@ -26,14 +26,14 @@ module EducodeSales
|
|
26
26
|
when '自己'
|
27
27
|
# business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
28
28
|
# @businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
|
29
|
-
idea_ids = Idea.all.
|
29
|
+
idea_ids = Idea.all.select { |d| Array(d.other_staff_ids).include?(@current_admin.id) }.map { |d| d.id }
|
30
30
|
@ideas = Idea.where("educode_sales_ideas.creator_id = ? OR educode_sales_ideas.id in (?)", @current_admin.id, idea_ids)
|
31
31
|
when '区域'
|
32
32
|
# 查看区域商机,需要排除掉其它人员手上的监管学校
|
33
33
|
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
|
34
34
|
|
35
35
|
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
|
36
|
-
idea_ids = Idea.all.
|
36
|
+
idea_ids = Idea.all.select { |d| Array(d.other_staff_ids).include?(@current_admin.id) }.map { |d| d.id }
|
37
37
|
@ideas = @ideas.joins(department: :school).where("schools.id in (?) OR educode_sales_ideas.creator_id = ? OR educode_sales_ideas.id in (?)", school_ids, @current_admin.id, idea_ids)
|
38
38
|
else
|
39
39
|
@ideas = @ideas
|
@@ -90,9 +90,20 @@ module EducodeSales
|
|
90
90
|
def create
|
91
91
|
business = Business.find(params[:business_id])
|
92
92
|
data = []
|
93
|
+
week = Time.now.strftime('%W').to_i
|
94
|
+
current_week = ""
|
95
|
+
staff_manage_ids = business&.last_follow_up&.assign_follow_ups.present? ? business.last_follow_up.assign_follow_ups.pluck(:staff_id) : [business.staff_id]
|
93
96
|
(params[:num].to_i+1).times do |i|
|
97
|
+
_week = params["date_at[#{i}]"].to_date.strftime('%W').to_i
|
98
|
+
current_week = _week if _week == week
|
94
99
|
business.money_plans.create(category: params["category[#{i}]"], amount: params["amount[#{i}]"], payment_clause: params["payment_clause[#{i}]"], date_at: params["date_at[#{i}]"], follow_up_id: business.last_follow_up_id, staff_id: @current_admin.id )
|
95
100
|
end
|
101
|
+
if current_week.present?
|
102
|
+
staff_manage_ids.each do |staff_id|
|
103
|
+
EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, weekly: week, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0' )
|
104
|
+
EducodeSales::SalePlan.create(month: Time.now.beginning_of_month, content: "提醒:请补充回款计划内容!", business: business, staff_id: staff_id, finish_rate: '0' )
|
105
|
+
end
|
106
|
+
end
|
96
107
|
render_success
|
97
108
|
end
|
98
109
|
|
@@ -41,7 +41,82 @@ module EducodeSales
|
|
41
41
|
|
42
42
|
|
43
43
|
|
44
|
+
def self.update_assessment_value(assessment_id, year, data)
|
45
|
+
assessments = EducodeSales::AssessmentsSetting.where(assessment: assessment_id).where("assessment_year >= ? and assessment_year <= ?", "#{year}-01-01 00:00:00".to_date, "#{year}-12-31 23:59:00".to_date)
|
46
|
+
assessments.each do |ass|
|
47
|
+
if data[ass.staff_id].present?
|
48
|
+
data_count = []
|
49
|
+
data[ass.staff_id].each do |d|
|
50
|
+
data_count[d['month']-1] = d['value']
|
51
|
+
end
|
52
|
+
|
53
|
+
data_count[12] = data_count[0].to_f + data_count[1].to_f + data_count[2].to_f
|
54
|
+
data_count[13] = data_count[3].to_f + data_count[4].to_f + data_count[5].to_f
|
55
|
+
data_count[14] = data_count[6].to_f + data_count[7].to_f + data_count[8].to_f
|
56
|
+
data_count[15] = data_count[9].to_f + data_count[10].to_f + data_count[11].to_f
|
57
|
+
data_count[16] = data_count[12].to_f + data_count[13].to_f + data_count[14].to_f + data_count[15].to_f
|
58
|
+
ass.update(annual_progress: data_count[16],
|
59
|
+
first_quarter_progress: data_count[12],
|
60
|
+
second_quarter_progress: data_count[13],
|
61
|
+
third_quarter_progress: data_count[14],
|
62
|
+
fourth_quarter_progress: data_count[15],
|
63
|
+
january_progress: data_count[0],
|
64
|
+
february_progress: data_count[1],
|
65
|
+
march_progress: data_count[2],
|
66
|
+
april_progress: data_count[3],
|
67
|
+
may_progress: data_count[4],
|
68
|
+
june_progress: data_count[5],
|
69
|
+
july_progress: data_count[6],
|
70
|
+
august_progress: data_count[7],
|
71
|
+
september_progress: data_count[8],
|
72
|
+
october_progress: data_count[9],
|
73
|
+
november_progress: data_count[10],
|
74
|
+
december_progress: data_count[11])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.update_stats(year, assessment_id)
|
80
|
+
Rails.cache.fetch("stats_by_assessment_#{year}", :expires_in => 1.days) do
|
81
|
+
self.stats_by_return_money(year)
|
82
|
+
self.stats_by_business(year)
|
83
|
+
self.stats_by_contracts(year)
|
84
|
+
true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.stats_by_business(year)
|
89
|
+
# 商机目标完成情况
|
90
|
+
ids = EducodeSales::Common.where(extras: %w[a_class b_class c_class d_class e_class]).pluck(:id)
|
91
|
+
data = EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id in (?) ",ids)
|
92
|
+
.where("educode_sales_follow_ups.created_at >= ? and educode_sales_follow_ups.created_at <= ?", "#{year}-01-01 00:00:00".to_date, "#{year}-12-31 23:59:59".to_date)
|
93
|
+
.group("educode_sales_follow_ups.staff_id, MONTH(educode_sales_follow_ups.created_at)").select("SUM(budget_amount) AS value, educode_sales_follow_ups.staff_id, MONTH(educode_sales_follow_ups.created_at) AS month")
|
94
|
+
.group_by{|d| d.staff_id }
|
95
|
+
self.update_assessment_value(7, year, data)
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def self.stats_by_contracts(year)
|
100
|
+
# 中标目标
|
101
|
+
contract_ids = EducodeSales::Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
|
102
|
+
data = EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.stage_id in (?) ", contract_ids)
|
103
|
+
.where("educode_sales_follow_ups.created_at >= ? and educode_sales_follow_ups.created_at <= ?", "#{year}-01-01 00:00:00".to_date, "#{year}-12-31 23:59:59".to_date)
|
104
|
+
.group("educode_sales_follow_ups.staff_id, MONTH(educode_sales_follow_ups.created_at)").select("SUM(actual_amount) AS value, educode_sales_follow_ups.staff_id, MONTH(educode_sales_follow_ups.created_at) AS month")
|
105
|
+
.group_by{|d| d.staff_id }
|
106
|
+
self.update_assessment_value(18, year, data)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.stats_by_return_money(year)
|
110
|
+
# 回款目标完成
|
111
|
+
data = EducodeSales::MoneyPlanClaim.joins(:money_plan)
|
112
|
+
.where("educode_sales_money_plans.created_at >= ? and educode_sales_money_plans.created_at <= ?", "#{year}-01-01 00:00:00".to_date, "#{year}-12-31 23:59:59".to_date)
|
113
|
+
.group("educode_sales_money_plans.staff_id, MONTH(educode_sales_money_plans.created_at)").select("SUM(educode_sales_money_plan_claims.amount) AS value, educode_sales_money_plans.staff_id, MONTH(educode_sales_money_plans.created_at) AS month")
|
114
|
+
.group_by{|d| d.staff_id }
|
115
|
+
self.update_assessment_value(2, year, data)
|
116
|
+
end
|
44
117
|
|
45
118
|
end
|
119
|
+
|
120
|
+
|
46
121
|
end
|
47
122
|
|
@@ -10,9 +10,7 @@
|
|
10
10
|
<div class="layui-inline">
|
11
11
|
<label class="layui-form-label">考核指标</label>
|
12
12
|
<div class="layui-input-inline">
|
13
|
-
<
|
14
|
-
<%= options_for_select EducodeSales::AssessmentsSetting::CLAZZ.invert.to_a, 7 %>
|
15
|
-
</select>
|
13
|
+
<div id="assement_id"></div>
|
16
14
|
</div>
|
17
15
|
</div>
|
18
16
|
<div class="layui-inline">
|
@@ -44,7 +42,7 @@
|
|
44
42
|
</script>
|
45
43
|
|
46
44
|
<script>
|
47
|
-
layui.use(['form', 'table', 'miniPage', 'element', 'rate', 'laydate', 'request'], function () {
|
45
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'rate', 'laydate', 'request', 'xmSelect'], function () {
|
48
46
|
|
49
47
|
var $ = layui.jquery,
|
50
48
|
form = layui.form,
|
@@ -52,7 +50,8 @@
|
|
52
50
|
request = layui.request,
|
53
51
|
table = layui.table,
|
54
52
|
rate = layui.rate,
|
55
|
-
|
53
|
+
xmSelect = layui.xmSelect,
|
54
|
+
miniPage = layui.miniPage,
|
56
55
|
dropdown = layui.dropdown;
|
57
56
|
|
58
57
|
|
@@ -62,6 +61,11 @@
|
|
62
61
|
});
|
63
62
|
|
64
63
|
|
64
|
+
var assement_list = xmSelect.render({
|
65
|
+
el: '#assement_id',
|
66
|
+
data: gon.assement_list
|
67
|
+
})
|
68
|
+
|
65
69
|
|
66
70
|
var progress_table = table.render({
|
67
71
|
elem: '#finished_table'
|
@@ -119,7 +123,9 @@
|
|
119
123
|
loadFinishTable(form.val('assessment_progress_form'))
|
120
124
|
|
121
125
|
form.on('submit(progress_search_btn)', function (data) {
|
122
|
-
|
126
|
+
var search = data.field;
|
127
|
+
search.assessment_id = assement_list.getValue('valueStr').split(",");
|
128
|
+
loadFinishTable(search);
|
123
129
|
return false;
|
124
130
|
})
|
125
131
|
|
@@ -32,7 +32,6 @@ json.data do
|
|
32
32
|
json.rate_2 completion_rate(assessment.second_quarter, assessment.second_quarter_progress)
|
33
33
|
json.rate_3 completion_rate(assessment.third_quarter, assessment.third_quarter_progress)
|
34
34
|
json.rate_4 completion_rate(assessment.fourth_quarter,assessment.fourth_quarter_progress)
|
35
|
-
|
36
35
|
# 得分_score
|
37
36
|
if assessment.assessment == 1
|
38
37
|
# json.assessment '签单金额'
|
@@ -5,13 +5,13 @@
|
|
5
5
|
<div class="layui-inline">
|
6
6
|
<label class="layui-form-label">单位</label>
|
7
7
|
<div class="layui-input-inline" style="line-height: 38px;">
|
8
|
-
<%= @business.department
|
8
|
+
<%= @business.department&.school&.name %>
|
9
9
|
</div>
|
10
10
|
</div>
|
11
11
|
<div class="layui-inline">
|
12
12
|
<label class="layui-form-label">部门</label>
|
13
13
|
<div class="layui-input-inline" style="line-height: 38px;">
|
14
|
-
<%= @business.department
|
14
|
+
<%= @business.department&.name %>
|
15
15
|
</div>
|
16
16
|
</div>
|
17
17
|
<br>
|
@@ -94,12 +94,14 @@
|
|
94
94
|
url: '/missions/money_plan_records',
|
95
95
|
toolbar: '#toolbar_money_plan_record',
|
96
96
|
defaultToolbar: ['filter'],
|
97
|
+
totalRow:true,
|
97
98
|
cols: [
|
98
99
|
[{
|
99
100
|
field: 'id',
|
100
101
|
width: 80,
|
101
102
|
title: '序号',
|
102
103
|
type: 'numbers',
|
104
|
+
totalRowText:'合计'
|
103
105
|
},
|
104
106
|
{
|
105
107
|
field: 'payer_name',
|
@@ -109,7 +111,8 @@
|
|
109
111
|
{
|
110
112
|
field: 'amount',
|
111
113
|
width: 150,
|
112
|
-
title: '回款金额'
|
114
|
+
title: '回款金额',
|
115
|
+
totalRow:true
|
113
116
|
},
|
114
117
|
{
|
115
118
|
field: 'date_at',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: educode_sales
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06-
|
11
|
+
date: 2023-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|