educode_sales 0.9.91 → 0.9.92
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/controllers/educode_sales/contracts_controller.rb +15 -0
- data/app/controllers/educode_sales/sale_trends_controller.rb +21 -4
- data/app/helpers/educode_sales/sale_trends_helper.rb +16 -6
- data/app/views/educode_sales/businesses/_contract.html.erb +2 -2
- data/app/views/educode_sales/businesses/_contract_list.html.erb +1 -1
- data/app/views/educode_sales/businesses/contract.html.erb +2 -2
- data/app/views/educode_sales/businesses/edit_follow_record.html.erb +14 -14
- data/app/views/educode_sales/businesses/index.html.erb +1 -1
- data/app/views/educode_sales/businesses/new_follow_record.html.erb +15 -14
- data/app/views/educode_sales/businesses/show_follow.html.erb +1 -1
- data/app/views/educode_sales/businesses/show_follow_record.html.erb +1 -1
- data/app/views/educode_sales/contracts/_list.html.erb +1 -1
- data/app/views/educode_sales/contracts/product_list.html.erb +34 -1
- data/app/views/educode_sales/contracts/show_follow_record.html.erb +1 -1
- data/app/views/educode_sales/customers/index.json.jbuilder +2 -14
- data/app/views/educode_sales/customers/list.html.erb +6 -1
- data/app/views/educode_sales/customers/list.json.jbuilder +3 -0
- data/app/views/educode_sales/sale_trends/_goal_forecast.html.erb +2 -14
- data/app/views/educode_sales/sale_trends/_sales_analysis.html.erb +13 -1
- data/config/routes.rb +1 -0
- data/db/migrate/20210902080918_create_educode_sales_follow_ups.rb +1 -1
- data/lib/educode_sales/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1f92a8f48adc6b2fe56f49589a71871a393f2e069e6f604e26eb5724b9633dd
|
4
|
+
data.tar.gz: ab873e20d22410705bb24409c4992546383b23cebfc624c8f3af7d22305e65a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3b1a7efe2acfebe6d81ec7a43c37ee352fb7482e0e39eedea0712079a7b2cb5f5671760b3ed8aa467ac0cd267f2d1ae4089ce8eebd394b6fdf848619d3bdce1
|
7
|
+
data.tar.gz: 7179df8352ade2a5cfb693987063be2332a98fbe8aef723ea140bb3018d7fded90a07c791df0ef3e2e5d875209187f43abb0afbce060f5400b8430a4b58eccef
|
Binary file
|
@@ -491,6 +491,21 @@ module EducodeSales
|
|
491
491
|
end
|
492
492
|
end
|
493
493
|
|
494
|
+
|
495
|
+
def upload_products
|
496
|
+
xlsx = Roo::Spreadsheet.open(params[:file])
|
497
|
+
ods = xlsx.sheet(0)
|
498
|
+
rows = ods.last_row - 1
|
499
|
+
i = 0
|
500
|
+
rows.times do |r| #行数
|
501
|
+
i += 1
|
502
|
+
next unless ods.row(r+1)[0]
|
503
|
+
EducodeSales::ProductCatalog.create(name: ods.row(r+1)[0].to_s.strip, item_clazz: ods.row(r+1)[1].to_s.strip, brand: ods.row(r+1)[2].to_s.strip, specification: ods.row(r+1)[3].to_s.strip, unit: ods.row(r+1)[4].to_s.strip, param: ods.row(r+1)[5].to_s.strip, source_method: ods.row(r+1)[6].to_s.strip, supplier: ods.row(r+1)[7].to_s.strip)
|
504
|
+
end
|
505
|
+
|
506
|
+
render json: { succcess: true}
|
507
|
+
end
|
508
|
+
|
494
509
|
private
|
495
510
|
def follow_up_params
|
496
511
|
params.permit(:o_business_deployment, :plan_signed_date, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
|
@@ -173,7 +173,7 @@ module EducodeSales
|
|
173
173
|
def sales_analysis
|
174
174
|
respond_to do |format|
|
175
175
|
format.html do
|
176
|
-
|
176
|
+
|
177
177
|
end
|
178
178
|
format.js do
|
179
179
|
x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
@@ -185,6 +185,10 @@ module EducodeSales
|
|
185
185
|
goal_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%m") }.uniq
|
186
186
|
sale_names = ['已中标', '已签单', '已回款']
|
187
187
|
|
188
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
189
|
+
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
190
|
+
@staffs = staffs.map { |d| [d.user.real_name, d.id]}
|
191
|
+
|
188
192
|
if params[:goal_count_range].present?
|
189
193
|
case params[:goal_count_range]
|
190
194
|
when "week"
|
@@ -482,7 +486,20 @@ module EducodeSales
|
|
482
486
|
begin_at = range[0]
|
483
487
|
end_at = range[1]
|
484
488
|
|
485
|
-
|
489
|
+
business = EducodeSales::Business.joins(:last_follow_up)
|
490
|
+
if params[:sales_staff_id].present?
|
491
|
+
# 销售经理
|
492
|
+
business = business.joins("LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = educode_sales_businesses.last_follow_up_id").
|
493
|
+
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[:sales_staff_id], params[:sales_staff_id])
|
494
|
+
|
495
|
+
end
|
496
|
+
|
497
|
+
if params[:property].present?
|
498
|
+
# 客户类型
|
499
|
+
business = business.joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:property])
|
500
|
+
end
|
501
|
+
|
502
|
+
data_1 = business.
|
486
503
|
where("educode_sales_follow_ups.clazz_id != ?", x).
|
487
504
|
where("educode_sales_follow_ups.stage_id IN (?)", stage_ids).
|
488
505
|
where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", begin_at, end_at).
|
@@ -507,7 +524,7 @@ module EducodeSales
|
|
507
524
|
last_month = month.split("-")[0]
|
508
525
|
end
|
509
526
|
|
510
|
-
data_2 =
|
527
|
+
data_2 = business.
|
511
528
|
where("educode_sales_follow_ups.clazz_id != ?", x).
|
512
529
|
where("educode_sales_follow_ups.stage_id IN (?)", s_stage_ids).
|
513
530
|
where("educode_sales_follow_ups.signed_date >= ? AND educode_sales_follow_ups.signed_date <= ?", begin_at, end_at).
|
@@ -532,7 +549,7 @@ module EducodeSales
|
|
532
549
|
last_month = month.split("-")[0]
|
533
550
|
end
|
534
551
|
|
535
|
-
data_3 =
|
552
|
+
data_3 = business.joins(last_follow_up: :money_plans).
|
536
553
|
where("educode_sales_follow_ups.clazz_id != ?", x).
|
537
554
|
where.not("educode_sales_money_plans.clazz!= ?", 1).
|
538
555
|
where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ?", begin_at, end_at).
|
@@ -273,13 +273,18 @@ module EducodeSales
|
|
273
273
|
end
|
274
274
|
staff_id = staff_id.present? ? Array(staff_id) : nil
|
275
275
|
data = Business.joins(:last_follow_up)
|
276
|
-
.where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ?
|
276
|
+
.where("educode_sales_follow_ups.invitation_at >= ? and educode_sales_follow_ups.invitation_at <= ?", start_time, end_time)
|
277
|
+
if staff_id.present?
|
278
|
+
data = data.joins("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
|
279
|
+
LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
|
280
|
+
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 = ?)", staff_id, staff_id)
|
281
|
+
end
|
277
282
|
if property.present?
|
278
283
|
data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
|
279
284
|
end
|
280
285
|
case type
|
281
286
|
when "week"
|
282
|
-
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum(
|
287
|
+
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.invitation_at) as week").group("yearweek(educode_sales_follow_ups.invitation_at)").sum("educode_sales_follow_ups.budget_amount")
|
283
288
|
when "quarter"
|
284
289
|
data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.invitation_at) as quarter, year(educode_sales_follow_ups.invitation_at) as year")
|
285
290
|
data.group_by { |d| [d.year, d.quarter] }
|
@@ -287,7 +292,7 @@ module EducodeSales
|
|
287
292
|
data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year, month(educode_sales_follow_ups.invitation_at) as month")
|
288
293
|
data.group_by { |d| [d.year, d.month] }
|
289
294
|
when "year"
|
290
|
-
data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year").group("year(educode_sales_follow_ups.invitation_at)").sum(
|
295
|
+
data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.invitation_at) as year").group("year(educode_sales_follow_ups.invitation_at)").sum("educode_sales_follow_ups.budget_amount")
|
291
296
|
end
|
292
297
|
end
|
293
298
|
|
@@ -315,13 +320,18 @@ module EducodeSales
|
|
315
320
|
# actual_amount 合同额
|
316
321
|
staff_id = staff_id.present? ? Array(staff_id) : nil
|
317
322
|
data = Business.joins(:last_follow_up)
|
318
|
-
.where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ?
|
323
|
+
.where("educode_sales_follow_ups.bidded_date >= ? and educode_sales_follow_ups.bidded_date <= ? ", start_time, end_time)
|
324
|
+
if staff_id.present?
|
325
|
+
data = data.joins("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
|
326
|
+
LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
|
327
|
+
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 = ?)", staff_id, staff_id)
|
328
|
+
end
|
319
329
|
if property.present?
|
320
330
|
data = data.joins(department: [school: :school_tags]).where("school_tags.id = ?", property)
|
321
331
|
end
|
322
332
|
case type
|
323
333
|
when "week"
|
324
|
-
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum(
|
334
|
+
data.select("educode_sales_follow_ups.*, yearweek(educode_sales_follow_ups.bidded_date) as week").group("yearweek(educode_sales_follow_ups.bidded_date)").sum("educode_sales_follow_ups.actual_amount")
|
325
335
|
when "quarter"
|
326
336
|
data = data.select("educode_sales_follow_ups.*, quarter(educode_sales_follow_ups.bidded_date) as quarter, year(educode_sales_follow_ups.bidded_date) as year")
|
327
337
|
data.group_by { |d| [d.year, d.quarter] }
|
@@ -329,7 +339,7 @@ module EducodeSales
|
|
329
339
|
data = data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year, month(educode_sales_follow_ups.bidded_date) as month")
|
330
340
|
data.group_by { |d| [d.year, d.month] }
|
331
341
|
when "year"
|
332
|
-
data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year").group("year(educode_sales_follow_ups.bidded_date)").sum(
|
342
|
+
data.select("educode_sales_follow_ups.*, year(educode_sales_follow_ups.bidded_date) as year").group("year(educode_sales_follow_ups.bidded_date)").sum("educode_sales_follow_ups.actual_amount")
|
333
343
|
end
|
334
344
|
end
|
335
345
|
|
@@ -68,7 +68,7 @@
|
|
68
68
|
</div>
|
69
69
|
</div>
|
70
70
|
<div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
71
|
-
<label class="layui-form-label"
|
71
|
+
<label class="layui-form-label">计划投标时间</label>
|
72
72
|
<div class="layui-input-inline">
|
73
73
|
<input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
|
74
74
|
</div>
|
@@ -341,7 +341,7 @@
|
|
341
341
|
{
|
342
342
|
field: 'invitation_at',
|
343
343
|
width: 105,
|
344
|
-
title: '
|
344
|
+
title: '计划投标时间',
|
345
345
|
sort: true,
|
346
346
|
hide: gon.filter.invitation_at
|
347
347
|
},
|
@@ -78,7 +78,7 @@
|
|
78
78
|
</div>
|
79
79
|
</div>
|
80
80
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
81
|
-
<label class="layui-form-label"
|
81
|
+
<label class="layui-form-label">计划投标时间</label>
|
82
82
|
<div class="layui-input-inline">
|
83
83
|
<input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
|
84
84
|
</div>
|
@@ -68,7 +68,7 @@
|
|
68
68
|
</div>
|
69
69
|
</div>
|
70
70
|
<div class="layui-inline show_item_contract" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
71
|
-
<label class="layui-form-label"
|
71
|
+
<label class="layui-form-label">计划投标时间</label>
|
72
72
|
<div class="layui-input-inline">
|
73
73
|
<input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
|
74
74
|
</div>
|
@@ -341,7 +341,7 @@
|
|
341
341
|
{
|
342
342
|
field: 'invitation_at',
|
343
343
|
width: 105,
|
344
|
-
title: '
|
344
|
+
title: '计划投标时间',
|
345
345
|
sort: true,
|
346
346
|
hide: gon.filter.invitation_at
|
347
347
|
},
|
@@ -30,12 +30,12 @@
|
|
30
30
|
<div class="layui-inline">
|
31
31
|
<label class="layui-form-label required">项目阶段</label>
|
32
32
|
<div class="layui-input-inline">
|
33
|
-
<%= select_tag "stage_id", options_for_select(@stages, @follow_up.stage_id), class: 'required' %>
|
33
|
+
<%= select_tag "stage_id", options_for_select(@stages, @follow_up.stage_id), { 'lay-filter': 'stage_id', class: 'required' } %>
|
34
34
|
</div>
|
35
35
|
</div>
|
36
36
|
<br>
|
37
37
|
<div class="layui-inline">
|
38
|
-
<label class="layui-form-label"
|
38
|
+
<label class="layui-form-label">计划投标时间</label>
|
39
39
|
<div class="layui-input-inline">
|
40
40
|
<input type="text" class="layui-input" value="<%= @follow_up.invitation_at %>" name="invitation_at"
|
41
41
|
id="invitation_at_edit" placeholder="请选择日期">
|
@@ -194,25 +194,25 @@
|
|
194
194
|
<script>
|
195
195
|
layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
|
196
196
|
var form = layui.form,
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
197
|
+
layer = layui.layer,
|
198
|
+
table = layui.table,
|
199
|
+
xmSelect = layui.xmSelect,
|
200
|
+
laytpl = layui.laytpl,
|
201
|
+
request = layui.request,
|
202
|
+
laydate = layui.laydate,
|
203
|
+
$ = layui.$;
|
204
204
|
|
205
205
|
flag =
|
206
|
-
<%=@follow_up&.
|
206
|
+
<%=@follow_up&.stage_id == EducodeSales::Common.where(name:"已签单").first&.id %>
|
207
207
|
if (flag) {
|
208
208
|
$(".service_show").removeClass('layui-hide')
|
209
209
|
$(".deployment_type").removeClass('layui-hide')
|
210
210
|
}
|
211
211
|
|
212
|
-
form.on('select(
|
212
|
+
form.on('select(stage_id)', function (data) {
|
213
213
|
console.log(data.value)
|
214
214
|
const value = data.value;
|
215
|
-
if (value == <%= EducodeSales::Common.where(
|
215
|
+
if (value == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
|
216
216
|
$(".service_show").removeClass('layui-hide')
|
217
217
|
$(".deployment_type").removeClass('layui-hide')
|
218
218
|
} else {
|
@@ -315,12 +315,12 @@
|
|
315
315
|
|
316
316
|
form.render();
|
317
317
|
form.on('submit(update_follow_up)', function (data) {
|
318
|
-
if (data.field.
|
318
|
+
if (data.field.stage_id == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
|
319
319
|
if (data.field.service_time.length == 0) {
|
320
320
|
layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
|
321
321
|
return false;
|
322
322
|
}
|
323
|
-
if (data.field.o_business_deployment === ''){
|
323
|
+
if (data.field.o_business_deployment === '') {
|
324
324
|
layer.msg('请选择部署类型');
|
325
325
|
return false // 退出添加该条记录
|
326
326
|
}
|
@@ -80,7 +80,7 @@
|
|
80
80
|
</div>
|
81
81
|
</div>
|
82
82
|
<div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
|
83
|
-
<label class="layui-form-label"
|
83
|
+
<label class="layui-form-label">计划投标时间</label>
|
84
84
|
<div class="layui-input-inline">
|
85
85
|
<input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - " autocomplete="off">
|
86
86
|
</div>
|
@@ -34,12 +34,12 @@
|
|
34
34
|
<div class="layui-inline">
|
35
35
|
<label class="layui-form-label required">项目阶段</label>
|
36
36
|
<div class="layui-input-inline">
|
37
|
-
<%= select_tag "stage_id", options_for_select(@stages, @last_follow_up&.stage_id), class: 'required' %>
|
37
|
+
<%= select_tag "stage_id", options_for_select(@stages, @last_follow_up&.stage_id), { 'lay-filter': 'stage_id', class: 'required', } %>
|
38
38
|
</div>
|
39
39
|
</div>
|
40
40
|
<br>
|
41
41
|
<div class="layui-inline">
|
42
|
-
<label class="layui-form-label"
|
42
|
+
<label class="layui-form-label">计划投标时间</label>
|
43
43
|
<div class="layui-input-inline">
|
44
44
|
<input type="text" class="layui-input" name="invitation_at" autocomplete="off" id="invitation_at_add"
|
45
45
|
value="<%= @last_follow_up&.invitation_at %>"
|
@@ -195,25 +195,26 @@
|
|
195
195
|
<script>
|
196
196
|
layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
|
197
197
|
var form = layui.form,
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
198
|
+
layer = layui.layer,
|
199
|
+
table = layui.table,
|
200
|
+
laytpl = layui.laytpl,
|
201
|
+
request = layui.request,
|
202
|
+
laydate = layui.laydate,
|
203
|
+
xmSelect = layui.xmSelect,
|
204
|
+
$ = layui.$;
|
205
205
|
|
206
|
-
flag =
|
206
|
+
flag =
|
207
|
+
<%=@last_follow_up&.stage_id == EducodeSales::Common.where(name:"已签单").first&.id %>
|
207
208
|
if (flag) {
|
208
209
|
console.log(flag)
|
209
210
|
$(".service_show").removeClass('layui-hide')
|
210
211
|
$(".deployment_type").removeClass('layui-hide')
|
211
212
|
}
|
212
213
|
|
213
|
-
form.on('select(
|
214
|
+
form.on('select(stage_id)', function (data) {
|
214
215
|
console.log(data.value)
|
215
216
|
const value = data.value;
|
216
|
-
if (value == <%= EducodeSales::Common.where(
|
217
|
+
if (value == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
|
217
218
|
$(".service_show").removeClass('layui-hide')
|
218
219
|
$(".deployment_type").removeClass('layui-hide')
|
219
220
|
} else {
|
@@ -317,12 +318,12 @@
|
|
317
318
|
form.render();
|
318
319
|
|
319
320
|
form.on('submit(add_follow_up)', function (data) {
|
320
|
-
if (data.field.
|
321
|
+
if (data.field.stage_id == <%= EducodeSales::Common.where(name: "已签单").first&.id %>) {
|
321
322
|
if (data.field.service_time.length == 0) {
|
322
323
|
layer.msg('请选择服务期', {time: 2000, icon: 2, shade: 0.01});
|
323
324
|
return false;
|
324
325
|
}
|
325
|
-
if (data.field.o_business_deployment === ''){
|
326
|
+
if (data.field.o_business_deployment === '') {
|
326
327
|
layer.msg('请选择部署类型', {time: 2000, icon: 2, shade: 0.01});
|
327
328
|
return false // 退出添加该条记录
|
328
329
|
}
|
@@ -38,13 +38,15 @@
|
|
38
38
|
</script>
|
39
39
|
|
40
40
|
<script type="text/html" id="toolbar">
|
41
|
+
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" id="upload_product_btn" style="margin-left: 20px;">批量导入产品目录</button>
|
41
42
|
<% if can? :new_product_catalog, EducodeSales::Business %>
|
42
43
|
<a class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add_product">添加产品目录</a>
|
43
44
|
<% end %>
|
45
|
+
|
44
46
|
</script>
|
45
47
|
|
46
48
|
<script>
|
47
|
-
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect'],
|
49
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect', 'upload'],
|
48
50
|
function() {
|
49
51
|
var $ = layui.jquery,
|
50
52
|
form = layui.form,
|
@@ -52,6 +54,7 @@
|
|
52
54
|
miniPage = layui.miniPage,
|
53
55
|
dropdown = layui.dropdown,
|
54
56
|
xmSelect = layui.xmSelect,
|
57
|
+
upload = layui.upload,
|
55
58
|
laydate = layui.laydate;
|
56
59
|
var openWH = miniPage.getOpenWidthHeight();
|
57
60
|
var data = form.val("search_form");
|
@@ -127,7 +130,37 @@
|
|
127
130
|
limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
|
128
131
|
page: true,
|
129
132
|
skin: 'line',
|
133
|
+
done: function() {
|
134
|
+
if ($('#upload_product_btn').length > 0) {
|
135
|
+
uploadProduct();
|
136
|
+
}
|
137
|
+
}
|
130
138
|
});
|
139
|
+
|
140
|
+
function uploadProduct() {
|
141
|
+
upload.render({
|
142
|
+
elem: '#upload_product_btn'
|
143
|
+
,url: '/missions/contracts/upload_products'
|
144
|
+
,accept: 'file' //普通文件
|
145
|
+
,acceptMime: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/vnd.ms-excel'
|
146
|
+
,headers: {
|
147
|
+
'X-CSRF-Token': $('meta[name=csrf-token]').attr('content')
|
148
|
+
}
|
149
|
+
,before: function(obj){
|
150
|
+
layer.load();
|
151
|
+
}
|
152
|
+
,done: function(res){
|
153
|
+
layer.msg('导入成功');
|
154
|
+
table.reload('contact_product_table');
|
155
|
+
layer.closeAll('loading'); //关闭loading
|
156
|
+
}
|
157
|
+
,error: function(index, upload){
|
158
|
+
table.reload('file');
|
159
|
+
layer.closeAll('loading'); //关闭loading
|
160
|
+
layer.alert('导入失败,请检查文件格式')
|
161
|
+
}
|
162
|
+
});
|
163
|
+
}
|
131
164
|
var sort = {},
|
132
165
|
search = data;
|
133
166
|
table.on('sort(contact_product_table)', function(obj) {
|
@@ -36,7 +36,7 @@
|
|
36
36
|
</div>
|
37
37
|
<br>
|
38
38
|
<div class="layui-inline">
|
39
|
-
<label class="layui-form-label" style="width: 160px;"
|
39
|
+
<label class="layui-form-label" style="width: 160px;">计划投标时间:</label>
|
40
40
|
<div class="layui-input-inline">
|
41
41
|
<%= @follow_up.invitation_at.to_s %>
|
42
42
|
</div>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
2
|
+
o = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
|
2
3
|
json.data do
|
3
4
|
json.array! @customers do |d|
|
4
5
|
business_ids = EducodeSales::Business.where(school_id: d.id).ids
|
@@ -14,23 +15,10 @@ json.data do
|
|
14
15
|
json.id d.id
|
15
16
|
json.name d.name
|
16
17
|
json.area d.province
|
17
|
-
# school_property = d.school_property
|
18
|
-
# property = []
|
19
|
-
# if school_property.present?
|
20
|
-
# # property << '985工程' if school_property.project_985
|
21
|
-
# # property << '211工程' if school_property.project_211
|
22
|
-
# property << '本科院校' if school_property.regular_college
|
23
|
-
# property << '大专院校' if school_property.junior_college
|
24
|
-
# property << '中专学校' if school_property.secondary_school
|
25
|
-
# property << '军事院校' if school_property.military_school
|
26
|
-
# property << '企业' if school_property.enterprise
|
27
|
-
# property << '小学' if school_property.ele_school
|
28
|
-
# property << '中学' if school_property.mid_school
|
29
|
-
# property << '其他' if school_property.other
|
30
|
-
# end
|
31
18
|
json.property d.school_tags.where(for_missions: true).pluck(:name).join("、")
|
32
19
|
json.department d.departments.size
|
33
20
|
json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.school_id = ?", d.id).size
|
21
|
+
json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.school_id = ?", d.id).size
|
34
22
|
json.follow follow_ups.size + customer_follows.size
|
35
23
|
json.staff EducodeSales::CustomerExtension.find_by(school_id: d.id)&.customer_staff&.user&.real_name
|
36
24
|
end
|
@@ -181,13 +181,18 @@
|
|
181
181
|
width: 160,
|
182
182
|
title: '性质',
|
183
183
|
},
|
184
|
-
|
184
|
+
|
185
185
|
{
|
186
186
|
field: 'business',
|
187
187
|
width: 60,
|
188
188
|
title: '商机',
|
189
189
|
templet: "#business"
|
190
190
|
},
|
191
|
+
{
|
192
|
+
field: 'o_business',
|
193
|
+
width: 60,
|
194
|
+
title: '签单'
|
195
|
+
},
|
191
196
|
{
|
192
197
|
field: 'follow',
|
193
198
|
width: 100,
|
@@ -1,4 +1,5 @@
|
|
1
1
|
x = EducodeSales::Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
|
2
|
+
o = EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id
|
2
3
|
json.data do
|
3
4
|
json.array! @customers do |d|
|
4
5
|
if d['department_id']
|
@@ -23,8 +24,10 @@ json.data do
|
|
23
24
|
json.property d.school_tags.where(for_missions: true).pluck(:name).join("、")
|
24
25
|
if d['department_id']
|
25
26
|
json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.department_id = ?", d['department_id']).size
|
27
|
+
json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.department_id = ?", d['department_id']).size
|
26
28
|
else
|
27
29
|
json.business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", x).where("educode_sales_businesses.school_id = ?", d.id).size
|
30
|
+
json.o_business EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id = ?", o).where("educode_sales_businesses.school_id = ?", d.id).size
|
28
31
|
end
|
29
32
|
json.unit "#{d.name}---#{d['department_name']}"
|
30
33
|
|
@@ -135,25 +135,13 @@
|
|
135
135
|
var forecast_myChart2 = new Chart(ctx, {
|
136
136
|
type: 'bar',
|
137
137
|
data: <%=raw @forecast_count_data_0.to_json %>,
|
138
|
-
options:
|
139
|
-
elements: {
|
140
|
-
line: {
|
141
|
-
tension: 0
|
142
|
-
}
|
143
|
-
}
|
144
|
-
}
|
138
|
+
options: opt
|
145
139
|
});
|
146
140
|
var ctx = document.getElementById('forecast_myChart2_1');
|
147
141
|
var forecast_myChart2_1 = new Chart(ctx, {
|
148
142
|
type: 'bar',
|
149
143
|
data: <%=raw @forecast_count_data_1.to_json %>,
|
150
|
-
options:
|
151
|
-
elements: {
|
152
|
-
line: {
|
153
|
-
tension: 0
|
154
|
-
}
|
155
|
-
}
|
156
|
-
}
|
144
|
+
options: opt
|
157
145
|
});
|
158
146
|
form.render();
|
159
147
|
form.on("submit(search_sales)", function (data) {
|
@@ -15,13 +15,25 @@
|
|
15
15
|
<%= select_tag "goal_count_range", options_for_select([['按月','month'],['按年','year']],params[:goal_count_range]), {'lay-filter': 'goal_count'}%>
|
16
16
|
</div>
|
17
17
|
</div>
|
18
|
-
<div class="layui-inline">
|
18
|
+
<div class="layui-inline m-t-10">
|
19
19
|
<label class="layui-form-label">时间范围</label>
|
20
20
|
<div class="layui-input-inline">
|
21
21
|
<input type="text" class="layui-input goal_month " id="goal_date_month" name="goal_date_month" placeholder=" - " value="<%=params[:goal_date_month].present? ? params[:goal_date_month] : Time.now.year.to_s + "-01" + " - " + Time.now.strftime("%Y-%m") %>" autocomplete="off">
|
22
22
|
<input type="text" class="layui-input goal_year layui-hide" id="goal_date_year" name="goal_date_year" placeholder=" - " value="<%=params[:goal_date_year] %>" autocomplete="off">
|
23
23
|
</div>
|
24
24
|
</div>
|
25
|
+
<div class="layui-inline m-t-10">
|
26
|
+
<label class="layui-form-label">销售人员</label>
|
27
|
+
<div class="layui-input-inline">
|
28
|
+
<%= select_tag "sales_staff_id", options_for_select(@staffs, params[:sales_staff_id]), {include_blank: true}%>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="layui-inline m-t-10">
|
32
|
+
<label class="layui-form-label">客户类型</label>
|
33
|
+
<div class="layui-input-inline">
|
34
|
+
<%= select_tag "property", options_for_select(SchoolTag.where(for_missions: true).pluck(:name, :id), params[:property]), { include_blank: true } %>
|
35
|
+
</div>
|
36
|
+
</div>
|
25
37
|
<div class="layui-inline">
|
26
38
|
<button type="button" id="search_bt" class="goal_count_bt layui-btn layui-btn-primary" lay-submit lay-filter="search_sales">确定
|
27
39
|
</button>
|
data/config/routes.rb
CHANGED
@@ -5,7 +5,7 @@ class CreateEducodeSalesFollowUps < ActiveRecord::Migration[5.2]
|
|
5
5
|
t.references :staff
|
6
6
|
t.integer :clazz_id, comment: '项目类型'
|
7
7
|
t.integer :stage_id, comment: '项目阶段'
|
8
|
-
t.date :invitation_at, comment: '
|
8
|
+
t.date :invitation_at, comment: '计划投标时间'
|
9
9
|
t.date :reception_at, comment: '验收时间'
|
10
10
|
t.float :total_amount, comment: '总额'
|
11
11
|
t.float :actual_amount, comment: '实际金额'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: educode_sales
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.92
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- app/assets/images/educode_sales/icon-login.png
|
106
106
|
- app/assets/images/educode_sales/icon.png
|
107
107
|
- app/assets/images/educode_sales/indexLogo.png
|
108
|
+
- app/assets/images/educode_sales/indexlogo.png
|
108
109
|
- app/assets/images/educode_sales/loading-0.gif
|
109
110
|
- app/assets/images/educode_sales/loading-1.gif
|
110
111
|
- app/assets/images/educode_sales/loading-2.gif
|
@@ -684,7 +685,7 @@ homepage: https://www.educoder.net
|
|
684
685
|
licenses:
|
685
686
|
- MIT
|
686
687
|
metadata: {}
|
687
|
-
post_install_message:
|
688
|
+
post_install_message:
|
688
689
|
rdoc_options: []
|
689
690
|
require_paths:
|
690
691
|
- lib
|
@@ -699,8 +700,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
699
700
|
- !ruby/object:Gem::Version
|
700
701
|
version: '0'
|
701
702
|
requirements: []
|
702
|
-
rubygems_version: 3.0.
|
703
|
-
signing_key:
|
703
|
+
rubygems_version: 3.0.9
|
704
|
+
signing_key:
|
704
705
|
specification_version: 4
|
705
706
|
summary: Summary of EducodeSales.
|
706
707
|
test_files: []
|