educode_sales 0.9.76 → 0.9.77
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/contracts_controller.rb +58 -5
- data/app/models/educode_sales/product_catalog.rb +7 -0
- data/app/views/educode_sales/contracts/_follows.html.erb +4 -31
- data/app/views/educode_sales/contracts/edit_product.html.erb +85 -0
- data/app/views/educode_sales/contracts/follow_ups.json.jbuilder +1 -0
- data/app/views/educode_sales/contracts/index.html.erb +0 -6
- data/app/views/educode_sales/contracts/new_product.html.erb +85 -0
- data/app/views/educode_sales/contracts/product_list.html.erb +232 -0
- data/app/views/educode_sales/contracts/product_list.json.jbuilder +16 -0
- data/app/views/educode_sales/contracts/show_follow_record.html.erb +169 -0
- data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
- data/app/views/layouts/educode_sales/application.html.erb +4 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20230502142912_create_educode_sales_product_catalogs.rb +20 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +9 -4
- data/app/views/educode_sales/contracts/_product_list.html.erb +0 -358
- data/app/views/educode_sales/contracts/product_list.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: b3c38e0feb88d220e6ec75559d93b49c38d308dd939efbb54f37b1afb106a28f
|
4
|
+
data.tar.gz: d9daee968f4335493daf6ffd1efaab8769cbb0d71c2d2869f84f1d074aea7a3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a092214b3fe5caa3b0767a87a9eb936911d98d57b489a4e6da26c0c0b2e3c848bfdce972648fc4cda518fd42d7a1a688fb97eb1cac07c5cab9885fbda3548d87
|
7
|
+
data.tar.gz: 2ef105b4bf305ef64d4c310522bcb451cfa08c3c034eda3db3552c4473d268967994d58979b1359cf2b614b41d95cedac6466d1b7f5419d32132b06ea2d994a2
|
@@ -9,7 +9,6 @@ module EducodeSales
|
|
9
9
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
10
10
|
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
11
11
|
@staffs = staffs.map { |d| [d.user.real_name, d.id]}
|
12
|
-
gon.staffs = staffs.map { |d| {name: d.user.real_name, value: d.id } }
|
13
12
|
gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
|
14
13
|
gon.staffs = staffs.map { |d| {name: d.user.real_name, value: d.id } }
|
15
14
|
|
@@ -241,7 +240,7 @@ module EducodeSales
|
|
241
240
|
contract_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
|
242
241
|
@follow_ups = FollowUp.joins("
|
243
242
|
JOIN educode_sales_businesses ON educode_sales_follow_ups.business_id = educode_sales_businesses.id
|
244
|
-
").joins(:follow_up_trends).where("educode_sales_follow_ups.stage_id in (?)", contract_ids).select("educode_sales_follow_ups.*, educode_sales_follow_up_trends.clazz, educode_sales_follow_up_trends.content")
|
243
|
+
").joins(:follow_up_trends).where("educode_sales_follow_ups.stage_id in (?)", contract_ids).select("educode_sales_follow_ups.*, educode_sales_follow_up_trends.clazz, educode_sales_follow_up_trends.content, educode_sales_follow_up_trends.id AS trend_id")
|
245
244
|
|
246
245
|
if @current_admin.is_admin?
|
247
246
|
@follow_ups = @follow_ups
|
@@ -367,14 +366,19 @@ module EducodeSales
|
|
367
366
|
def product_list
|
368
367
|
respond_to do |format|
|
369
368
|
format.html do
|
370
|
-
|
371
|
-
end
|
372
|
-
format.js do
|
373
369
|
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
374
370
|
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
375
371
|
@staffs = staffs.map { |d| [d.user.real_name, d.id]}
|
372
|
+
gon.staffs = staffs.map { |d| {name: d.user.real_name, value: d.id } }
|
373
|
+
gon.business_step = Common.where(clazz: 'business_step', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).order("position").map do |d|
|
374
|
+
{value: d.id, name: d.name, selected: false}
|
375
|
+
end
|
376
376
|
end
|
377
377
|
format.json do
|
378
|
+
@product_catalogs = ProductCatalog
|
379
|
+
@product_catalogs = @product_catalogs.where("name like ?", "%#{params[:q][:name]}%") if params[:q] && params[:q][:name].present?
|
380
|
+
@product_catalogs = @product_catalogs.where(item_clazz: params[:q][:item_clazz]) if params[:q] && params[:q][:item_clazz].present?
|
381
|
+
@product_catalogs = @product_catalogs.page(params[:page]).per(params[:limit])
|
378
382
|
end
|
379
383
|
end
|
380
384
|
end
|
@@ -387,9 +391,58 @@ module EducodeSales
|
|
387
391
|
render_success
|
388
392
|
end
|
389
393
|
|
394
|
+
def new_product
|
395
|
+
render layout: false
|
396
|
+
end
|
397
|
+
|
398
|
+
def product_catalog
|
399
|
+
product_catalog = ProductCatalog.new(product_up_params)
|
400
|
+
if product_catalog.save
|
401
|
+
render_success
|
402
|
+
else
|
403
|
+
render_failure product_catalog
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
def update_product_catalog
|
408
|
+
product_catalog = ProductCatalog.find(params[:id])
|
409
|
+
if product_catalog.update(product_up_params)
|
410
|
+
render_success
|
411
|
+
else
|
412
|
+
render_failure product_catalog
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
def edit_product
|
417
|
+
@product_catalog = ProductCatalog.find(params[:id])
|
418
|
+
render layout: false
|
419
|
+
end
|
420
|
+
|
421
|
+
def show_follow_record
|
422
|
+
@follow_up = FollowUp.find(params[:follow_up_id])
|
423
|
+
@business = Business.find(@follow_up.business_id)
|
424
|
+
@show_follow_recored_deployment = EducodeSales::FollowUp::BUSINESS_DEPLOYMENT.to_h.invert[@follow_up.o_business_deployment]
|
425
|
+
|
426
|
+
@trend = FollowUpTrend.find(params[:trend_id])
|
427
|
+
|
428
|
+
id = @follow_up.id
|
429
|
+
@follow_ups = @business.follow_ups
|
430
|
+
ids = @follow_ups.ids
|
431
|
+
size = ids.size
|
432
|
+
ids = ids.reverse
|
433
|
+
index = ids.index(id)
|
434
|
+
@next_id = (index != size - 1 && size > 1) ? ids[index + 1] : 0
|
435
|
+
@pre_id = (index != 0 && size > 1) ? ids[index - 1] : 0
|
436
|
+
render layout: false
|
437
|
+
end
|
438
|
+
|
390
439
|
private
|
391
440
|
def follow_up_params
|
392
441
|
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)
|
393
442
|
end
|
443
|
+
|
444
|
+
def product_up_params
|
445
|
+
params.permit(:name, :item_clazz, :brand, :specification, :unit, :param, :source_method, :supplier)
|
446
|
+
end
|
394
447
|
end
|
395
448
|
end
|
@@ -63,7 +63,7 @@
|
|
63
63
|
</div>
|
64
64
|
</script>
|
65
65
|
<script type="text/html" id="currentTableBar_follows">
|
66
|
-
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="
|
66
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="show_detail">详情</a>
|
67
67
|
<% if can?(:advise, EducodeSales::Business) %>
|
68
68
|
<a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="add_advise">团队建议</a>
|
69
69
|
<% end %>
|
@@ -201,15 +201,6 @@
|
|
201
201
|
},
|
202
202
|
where: {q: search, sort: sort}
|
203
203
|
}, 'data');
|
204
|
-
// table.reload('businesses_table', {
|
205
|
-
// page: {
|
206
|
-
// curr: 1
|
207
|
-
// },
|
208
|
-
// where: {q: search, sort: sort}
|
209
|
-
// }, 'data');
|
210
|
-
// form.val('search_form', {
|
211
|
-
// name: data.field.name, department: data.field.department, staff_id: data.field.staff_id, area: data.field.area , description: data.field.description
|
212
|
-
// })
|
213
204
|
return false;
|
214
205
|
});
|
215
206
|
|
@@ -246,29 +237,11 @@
|
|
246
237
|
table.on('tool(contract_follows_table)', function (obj) {
|
247
238
|
var data = obj.data;
|
248
239
|
id = data.id
|
249
|
-
if (obj.event === '
|
250
|
-
var content = miniPage.getHrefContent('/missions/
|
240
|
+
if (obj.event === 'show_detail') { // 监听添加操作
|
241
|
+
var content = miniPage.getHrefContent('/missions/contracts/show_follow_record?follow_up_id=' + data.id + "&trend_id=" + data.trend_id);
|
251
242
|
var openWH = miniPage.getOpenWidthHeight();
|
252
243
|
show_index = layer.open({
|
253
|
-
title: '
|
254
|
-
type: 1,
|
255
|
-
shade: 0.2,
|
256
|
-
maxmin: true,
|
257
|
-
shadeClose: true,
|
258
|
-
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
259
|
-
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
260
|
-
content: content
|
261
|
-
});
|
262
|
-
$(window).on("resize", function () {
|
263
|
-
layer.full(index);
|
264
|
-
});
|
265
|
-
} else if (obj.event === 'business') {
|
266
|
-
business_id = data.business_id
|
267
|
-
business_name = data.business
|
268
|
-
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + data.business_id);
|
269
|
-
openWH = miniPage.getOpenWidthHeight();
|
270
|
-
index = layer.open({
|
271
|
-
title: '商机列表/' + data.business + '的跟进记录',
|
244
|
+
title: '查看合同动态',
|
272
245
|
type: 1,
|
273
246
|
shade: 0.2,
|
274
247
|
maxmin: true,
|
@@ -0,0 +1,85 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-form layuimini-form" style="padding:30px">
|
3
|
+
<div class="layui-form-item">
|
4
|
+
<div class="layui-inline">
|
5
|
+
<label class="layui-form-label required">产品名称:</label>
|
6
|
+
<div class="layui-input-inline">
|
7
|
+
<input type="text" name="name" value="<%= @product_catalog.name %>" class="layui-input" lay-verify="required">
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="layui-inline">
|
11
|
+
<label class="layui-form-label required">销售品目:</label>
|
12
|
+
<div class="layui-input-inline">
|
13
|
+
<%= select_tag "item_clazz", options_for_select(EducodeSales::ProductCatalog.item_clazzs.keys, @product_catalog.item_clazz), { 'lay-filter': 'item_clazz', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="layui-form-item">
|
18
|
+
<div class="layui-inline">
|
19
|
+
<label class="layui-form-label required">品牌:</label>
|
20
|
+
<div class="layui-input-inline">
|
21
|
+
<input type="text" name="brand" value="<%= @product_catalog.brand %>" class="layui-input" lay-verify="required">
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<div class="layui-inline">
|
25
|
+
<label class="layui-form-label required">规格型号:</label>
|
26
|
+
<div class="layui-input-inline">
|
27
|
+
<input type="text" name="specification" value="<%= @product_catalog.specification %>" class="layui-input" lay-verify="required">
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
</div>
|
32
|
+
<div class="layui-form-item">
|
33
|
+
<div class="layui-inline">
|
34
|
+
<label class="layui-form-label required">单位:</label>
|
35
|
+
<div class="layui-input-inline">
|
36
|
+
<input type="text" name="unit" value="<%= @product_catalog.unit %>" class="layui-input" lay-verify="required">
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
<div class="layui-inline">
|
40
|
+
<label class="layui-form-label required">参数:</label>
|
41
|
+
<div class="layui-input-inline">
|
42
|
+
<input type="text" name="param" value="<%= @product_catalog.param %>" class="layui-input" lay-verify="required">
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
<div class="layui-form-item">
|
47
|
+
<div class="layui-inline">
|
48
|
+
<label class="layui-form-label required">来源方式:</label>
|
49
|
+
<div class="layui-input-inline">
|
50
|
+
<%= select_tag "source_method", options_for_select(EducodeSales::ProductCatalog.source_methods.keys, @product_catalog.source_method), { 'lay-filter': 'source_method', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
<div class="layui-inline">
|
54
|
+
<label class="layui-form-label required">供应商:</label>
|
55
|
+
<div class="layui-input-inline">
|
56
|
+
<input type="text" name="supplier" value="<%= @product_catalog.supplier %>" class="layui-input" lay-verify="required">
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
<div class="layui-form-item">
|
61
|
+
<div class="layui-input-block">
|
62
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
|
67
|
+
<script>
|
68
|
+
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'selectInput'], function() {
|
69
|
+
var form = layui.form,
|
70
|
+
layer = layui.layer,
|
71
|
+
table = layui.table,
|
72
|
+
laytpl = layui.laytpl,
|
73
|
+
request = layui.request,
|
74
|
+
$ = layui.$;
|
75
|
+
form.render();
|
76
|
+
|
77
|
+
form.on('submit(saveBtn)', function(data) {
|
78
|
+
request.put("missions/contracts/"+ parent.id + "/update_product_catalog", data.field, function(res) {
|
79
|
+
layer.close(parent.edit_production_index)
|
80
|
+
parent.table.reload('contact_product_table')
|
81
|
+
})
|
82
|
+
return false;
|
83
|
+
});
|
84
|
+
});
|
85
|
+
</script>
|
@@ -5,6 +5,7 @@ json.data do
|
|
5
5
|
json.stage d.stage.name
|
6
6
|
json.staff d.staff.user.real_name
|
7
7
|
json.clazz EducodeSales::FollowUpTrend.clazzs.invert[d['clazz']]
|
8
|
+
json.trend_id d['trend_id']
|
8
9
|
json.description d['content']
|
9
10
|
json.school d.business.department&.school&.name
|
10
11
|
json.school_id d.business.department&.school&.id
|
@@ -3,7 +3,6 @@
|
|
3
3
|
<ul class="layui-tab-title">
|
4
4
|
<li class="layui-this follows_li">跟进动态</li>
|
5
5
|
<li class="contracts_list_li">合同列表</li>
|
6
|
-
<li class="contracts_product_li">产品目录</li>
|
7
6
|
</ul>
|
8
7
|
<div class="layui-tab-content">
|
9
8
|
<div class="layui-tab-item follows_div layui-show">
|
@@ -12,9 +11,6 @@
|
|
12
11
|
<div class="layui-tab-item contracts_list_div">
|
13
12
|
<div id="contract_list_wraper"></div>
|
14
13
|
</div>
|
15
|
-
<div class="layui-tab-item contracts_product_div">
|
16
|
-
<div id="contract_product_wraper"></div>
|
17
|
-
</div>
|
18
14
|
</div>
|
19
15
|
</div>
|
20
16
|
|
@@ -35,8 +31,6 @@
|
|
35
31
|
element.on('tab(contract_tab)', function(data) {
|
36
32
|
if (data.index == 1 && $("#contract_list").length == 0) {
|
37
33
|
loadPage('/missions/contracts/list')
|
38
|
-
} else if (data.index == 2 && $("#product_list").length == 0) {
|
39
|
-
loadPage('/missions/contracts/product_list')
|
40
34
|
}
|
41
35
|
});
|
42
36
|
|
@@ -0,0 +1,85 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="layui-form layuimini-form" style="padding:30px">
|
3
|
+
<div class="layui-form-item">
|
4
|
+
<div class="layui-inline">
|
5
|
+
<label class="layui-form-label required">产品名称:</label>
|
6
|
+
<div class="layui-input-inline">
|
7
|
+
<input type="text" name="name" value="" class="layui-input" lay-verify="required">
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="layui-inline">
|
11
|
+
<label class="layui-form-label required">销售品目:</label>
|
12
|
+
<div class="layui-input-inline">
|
13
|
+
<%= select_tag "item_clazz", options_for_select(EducodeSales::ProductCatalog.item_clazzs.keys), { 'lay-filter': 'item_clazz', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="layui-form-item">
|
18
|
+
<div class="layui-inline">
|
19
|
+
<label class="layui-form-label required">品牌:</label>
|
20
|
+
<div class="layui-input-inline">
|
21
|
+
<input type="text" name="brand" value="" class="layui-input" lay-verify="required">
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<div class="layui-inline">
|
25
|
+
<label class="layui-form-label required">规格型号:</label>
|
26
|
+
<div class="layui-input-inline">
|
27
|
+
<input type="text" name="specification" value="" class="layui-input" lay-verify="required">
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
</div>
|
32
|
+
<div class="layui-form-item">
|
33
|
+
<div class="layui-inline">
|
34
|
+
<label class="layui-form-label required">单位:</label>
|
35
|
+
<div class="layui-input-inline">
|
36
|
+
<input type="text" name="unit" value="" class="layui-input" lay-verify="required">
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
<div class="layui-inline">
|
40
|
+
<label class="layui-form-label required">参数:</label>
|
41
|
+
<div class="layui-input-inline">
|
42
|
+
<input type="text" name="param" value="" class="layui-input" lay-verify="required">
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
<div class="layui-form-item">
|
47
|
+
<div class="layui-inline">
|
48
|
+
<label class="layui-form-label required">来源方式:</label>
|
49
|
+
<div class="layui-input-inline">
|
50
|
+
<%= select_tag "source_method", options_for_select(EducodeSales::ProductCatalog.source_methods.keys), { 'lay-filter': 'source_method', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
<div class="layui-inline">
|
54
|
+
<label class="layui-form-label required">供应商:</label>
|
55
|
+
<div class="layui-input-inline">
|
56
|
+
<input type="text" name="supplier" value="" class="layui-input" lay-verify="required">
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
<div class="layui-form-item">
|
61
|
+
<div class="layui-input-block">
|
62
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
</div>
|
66
|
+
|
67
|
+
<script>
|
68
|
+
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'selectInput'], function() {
|
69
|
+
var form = layui.form,
|
70
|
+
layer = layui.layer,
|
71
|
+
table = layui.table,
|
72
|
+
laytpl = layui.laytpl,
|
73
|
+
request = layui.request,
|
74
|
+
$ = layui.$;
|
75
|
+
form.render();
|
76
|
+
|
77
|
+
form.on('submit(saveBtn)', function(data) {
|
78
|
+
request.post("missions/contracts/product_catalog", data.field, function(res) {
|
79
|
+
layer.close(parent.add_product_index)
|
80
|
+
parent.table.reload('contact_product_table')
|
81
|
+
})
|
82
|
+
return false;
|
83
|
+
});
|
84
|
+
});
|
85
|
+
</script>
|
@@ -0,0 +1,232 @@
|
|
1
|
+
<%= Gon::Base.render_data %>
|
2
|
+
<div class="min-height-table" id="product_list">
|
3
|
+
<div style="margin: 10px 10px 10px 10px">
|
4
|
+
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
5
|
+
<div class="layui-form-item">
|
6
|
+
<div class="layui-inline">
|
7
|
+
<label class="layui-form-label">产品名称</label>
|
8
|
+
<div class="layui-input-inline">
|
9
|
+
<input type="text" name="name" class="layui-input" value="">
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<div class="layui-inline">
|
13
|
+
<label class="layui-form-label">销售品目</label>
|
14
|
+
<div class="layui-input-inline">
|
15
|
+
<%= select_tag "item_clazz", options_for_select(EducodeSales::ProductCatalog.item_clazzs.keys), { 'lay-filter': 'item_clazz', include_blank: true , "lay-search": "" } %>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
<div class="layui-inline">
|
19
|
+
<button type="reset" class="layui-btn layui-btn-primary" lay-submit
|
20
|
+
lay-filter="reset_prodct_form">重置
|
21
|
+
</button>
|
22
|
+
<button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit
|
23
|
+
lay-filter="search_product_form">搜索
|
24
|
+
</button>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</form>
|
28
|
+
</div>
|
29
|
+
<div id="contact_table_wraper">
|
30
|
+
<table class="layui-hide" id="contact_product_table" lay-filter="contact_product_table"></table>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<script type="text/html" id="currentTableBarProduct">
|
35
|
+
<% if can? :update_product_catalog, EducodeSales::Business %>
|
36
|
+
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit_product">编辑</a>
|
37
|
+
<% end %>
|
38
|
+
</script>
|
39
|
+
|
40
|
+
<script type="text/html" id="toolbar">
|
41
|
+
<% if can? :new_product_catalog, EducodeSales::Business %>
|
42
|
+
<a class="layui-btn layui-btn-primary layui-border-green layui-btn-sm pull-right" lay-event="add_product">添加产品目录</a>
|
43
|
+
<% end %>
|
44
|
+
</script>
|
45
|
+
|
46
|
+
<script>
|
47
|
+
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown', 'laytpl', 'xmSelect'],
|
48
|
+
function() {
|
49
|
+
var $ = layui.jquery,
|
50
|
+
form = layui.form,
|
51
|
+
request = layui.request,
|
52
|
+
miniPage = layui.miniPage,
|
53
|
+
dropdown = layui.dropdown,
|
54
|
+
xmSelect = layui.xmSelect,
|
55
|
+
laydate = layui.laydate;
|
56
|
+
var openWH = miniPage.getOpenWidthHeight();
|
57
|
+
var data = form.val("search_form");
|
58
|
+
table = layui.table;
|
59
|
+
var cols_table = [
|
60
|
+
[{
|
61
|
+
field: 'id',
|
62
|
+
width: 60,
|
63
|
+
title: '序号',
|
64
|
+
fixed: "left"
|
65
|
+
},
|
66
|
+
{
|
67
|
+
field: 'name',
|
68
|
+
width: 120,
|
69
|
+
title: '产品名称',
|
70
|
+
},
|
71
|
+
{
|
72
|
+
field: 'item_clazz',
|
73
|
+
width: 150,
|
74
|
+
title: '销售品目',
|
75
|
+
},
|
76
|
+
{
|
77
|
+
field: 'brand',
|
78
|
+
width: 150,
|
79
|
+
title: '品牌',
|
80
|
+
},
|
81
|
+
{
|
82
|
+
field: 'specification',
|
83
|
+
width: 150,
|
84
|
+
title: '规格型号',
|
85
|
+
},
|
86
|
+
{
|
87
|
+
field: 'unit',
|
88
|
+
width: 150,
|
89
|
+
title: '单位',
|
90
|
+
},
|
91
|
+
{
|
92
|
+
field: 'param',
|
93
|
+
width: 150,
|
94
|
+
title: '参数',
|
95
|
+
},
|
96
|
+
{
|
97
|
+
field: 'source_method',
|
98
|
+
width: 150,
|
99
|
+
title: '来源方式',
|
100
|
+
},
|
101
|
+
{
|
102
|
+
field: 'supplier',
|
103
|
+
width: 150,
|
104
|
+
title: '供货商',
|
105
|
+
},
|
106
|
+
{
|
107
|
+
title: '操作',
|
108
|
+
minWidth: 100,
|
109
|
+
toolbar: '#currentTableBarProduct',
|
110
|
+
align: "center",
|
111
|
+
fixed: 'right'
|
112
|
+
}
|
113
|
+
]
|
114
|
+
]
|
115
|
+
var business_table = table.render({
|
116
|
+
elem: '#contact_product_table',
|
117
|
+
url: '/missions/contracts/product_list',
|
118
|
+
autoSort: false,
|
119
|
+
toolbar: '#toolbar',
|
120
|
+
where: {
|
121
|
+
q: data
|
122
|
+
},
|
123
|
+
defaultToolbar: [],
|
124
|
+
title: '产品目录表',
|
125
|
+
cols: cols_table,
|
126
|
+
limit: 20,
|
127
|
+
limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
|
128
|
+
page: true,
|
129
|
+
skin: 'line',
|
130
|
+
});
|
131
|
+
var sort = {},
|
132
|
+
search = data;
|
133
|
+
table.on('sort(contact_product_table)', function(obj) {
|
134
|
+
var data = form.val("search_form");
|
135
|
+
sort.field = obj.field;
|
136
|
+
sort.order = obj.type;
|
137
|
+
table.reload('contact_product_table', {
|
138
|
+
url: '/missions/contracts/product_list',
|
139
|
+
initSort: obj,
|
140
|
+
where: {
|
141
|
+
sort: sort,
|
142
|
+
q: search
|
143
|
+
}
|
144
|
+
});
|
145
|
+
})
|
146
|
+
// 监听搜索操作
|
147
|
+
form.on('submit(search_product_form)', function(data) {
|
148
|
+
if (search['clazz']) {
|
149
|
+
data.field['clazz'] = search['clazz']
|
150
|
+
}
|
151
|
+
search = data.field
|
152
|
+
table.reload('contact_product_table', {
|
153
|
+
url: '/missions/contracts/product_list',
|
154
|
+
page: {
|
155
|
+
curr: 1
|
156
|
+
},
|
157
|
+
where: {
|
158
|
+
q: search,
|
159
|
+
sort: sort
|
160
|
+
}
|
161
|
+
}, 'data');
|
162
|
+
return false;
|
163
|
+
});
|
164
|
+
form.on('submit(reset_prodct_form)', function(data) {
|
165
|
+
var field = data.field;
|
166
|
+
form.val('search_form', {
|
167
|
+
name: '',
|
168
|
+
item_clazz: ''
|
169
|
+
})
|
170
|
+
return false;
|
171
|
+
});
|
172
|
+
table.on('toolbar(contact_product_table)', function(obj) {
|
173
|
+
var openWH = miniPage.getOpenWidthHeight();
|
174
|
+
var content = miniPage.getHrefContent('/missions/contracts/new_product');
|
175
|
+
if (obj.event == 'add_product') {
|
176
|
+
add_product_index = layer.open({
|
177
|
+
title: '添加产品目录',
|
178
|
+
type: 1,
|
179
|
+
shade: 0.2,
|
180
|
+
maxmin: true,
|
181
|
+
shadeClose: true,
|
182
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
183
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
184
|
+
content: content,
|
185
|
+
success: function(layero, index) {
|
186
|
+
form.render('select');
|
187
|
+
}
|
188
|
+
});
|
189
|
+
$(window).on("resize", function() {
|
190
|
+
layer.full(add_product_index);
|
191
|
+
});
|
192
|
+
}
|
193
|
+
})
|
194
|
+
table.on('tool(contact_product_table)', function(obj) {
|
195
|
+
id = obj.data.id;
|
196
|
+
if (obj.event === 'edit_product') { // 监听添加操作
|
197
|
+
var content = miniPage.getHrefContent('/missions/contracts/' + id +'/edit_product');
|
198
|
+
var openWH = miniPage.getOpenWidthHeight();
|
199
|
+
edit_production_index = layer.open({
|
200
|
+
title: '编辑产品目录',
|
201
|
+
type: 1,
|
202
|
+
shade: 0.2,
|
203
|
+
maxmin: true,
|
204
|
+
shadeClose: true,
|
205
|
+
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
206
|
+
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
207
|
+
content: content,
|
208
|
+
success: function(layero, index) {
|
209
|
+
form.render('select');
|
210
|
+
}
|
211
|
+
});
|
212
|
+
$(window).on("resize", function() {
|
213
|
+
layer.full(edit_production_index);
|
214
|
+
});
|
215
|
+
}
|
216
|
+
});
|
217
|
+
});
|
218
|
+
</script>
|
219
|
+
<style>
|
220
|
+
.layui-table-tool-temp {
|
221
|
+
padding-right: 30px;
|
222
|
+
!important;
|
223
|
+
}
|
224
|
+
|
225
|
+
.layui-table-fixed .layui-table-body {
|
226
|
+
height: auto !important;
|
227
|
+
}
|
228
|
+
|
229
|
+
.layui-table-fixed.layui-hide {
|
230
|
+
display: block !important;
|
231
|
+
}
|
232
|
+
</style>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
json.data do
|
2
|
+
json.array! @product_catalogs do |d|
|
3
|
+
json.id d.id
|
4
|
+
json.name d.name
|
5
|
+
json.item_clazz d.item_clazz
|
6
|
+
json.brand d.brand
|
7
|
+
json.specification d.specification
|
8
|
+
json.unit d.unit
|
9
|
+
json.param d.param
|
10
|
+
json.source_method d.source_method
|
11
|
+
json.supplier d.supplier
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
json.code 0
|
16
|
+
json.count @product_catalogs.total_count
|
@@ -0,0 +1,169 @@
|
|
1
|
+
<h1 class="text-center m-t-20"><%= @follow_up.business.name %></h1>
|
2
|
+
<form class="layui-form form-value">
|
3
|
+
<div class="layui-form-item" style="padding: 10px 25px 0;">
|
4
|
+
<div class="layui-inline">
|
5
|
+
<label class="layui-form-label">单位:</label>
|
6
|
+
<div class="layui-input-inline">
|
7
|
+
<%= @follow_up.business.department&.school&.name %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<%if @follow_up.business.number.present?%>
|
11
|
+
<div class="layui-inline">
|
12
|
+
<label class="layui-form-label">编号:</label>
|
13
|
+
<div class="layui-input-inline">
|
14
|
+
<%= @follow_up.business.number %>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<%end %>
|
18
|
+
<div class="layui-inline">
|
19
|
+
<label class="layui-form-label">部门:</label>
|
20
|
+
<div class="layui-input-inline">
|
21
|
+
<%= @follow_up.business.department&.name %>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<br>
|
25
|
+
<div class="layui-inline">
|
26
|
+
<label class="layui-form-label">项目类型:</label>
|
27
|
+
<div class="layui-input-inline">
|
28
|
+
<%= @follow_up.clazz.name %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="layui-inline">
|
32
|
+
<label class="layui-form-label">项目阶段:</label>
|
33
|
+
<div class="layui-input-inline">
|
34
|
+
<%= @follow_up.stage.name %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<br>
|
38
|
+
<div class="layui-inline">
|
39
|
+
<label class="layui-form-label">招标时间:</label>
|
40
|
+
<div class="layui-input-inline">
|
41
|
+
<%= @follow_up.invitation_at.to_s %>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
<div class="layui-inline">
|
45
|
+
<label class="layui-form-label">中标时间:</label>
|
46
|
+
<div class="layui-input-inline">
|
47
|
+
<%= @follow_up.bidded_date.to_s %>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
<br>
|
51
|
+
<div class="layui-inline">
|
52
|
+
<label class="layui-form-label">签单时间:</label>
|
53
|
+
<div class="layui-input-inline">
|
54
|
+
<%= @follow_up.signed_date.to_s %>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
<div class="layui-inline">
|
58
|
+
<label class="layui-form-label">验收时间:</label>
|
59
|
+
<div class="layui-input-inline">
|
60
|
+
<%= @follow_up.reception_at.to_s %>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<br>
|
65
|
+
<%if @follow_up.clazz_id == EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id %>
|
66
|
+
<div class="layui-inline">
|
67
|
+
<label class="layui-form-label">服务期:</label>
|
68
|
+
<div class="layui-input-inline">
|
69
|
+
<%= @follow_up.service_start_time.to_s + "-" + @follow_up.service_end_time.to_s %>
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
<%end %>
|
73
|
+
<%if @follow_up.clazz_id == EducodeSales::Common.find_by(extras: EducodeSales::Common::OTYPE)&.id %>
|
74
|
+
<div class="layui-inline">
|
75
|
+
<label class="layui-form-label">部署类型:</label>
|
76
|
+
<div class="layui-input-inline">
|
77
|
+
<%=@show_follow_recored_deployment%>
|
78
|
+
</div>
|
79
|
+
</div>
|
80
|
+
<% end %>
|
81
|
+
<br>
|
82
|
+
|
83
|
+
<div class="layui-inline">
|
84
|
+
<label class="layui-form-label">中标额:</label>
|
85
|
+
<div class="layui-input-inline">
|
86
|
+
<%= @follow_up.total_amount.to_f.round(6) %>万
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
<div class="layui-inline">
|
90
|
+
<label class="layui-form-label">合同额:</label>
|
91
|
+
<div class="layui-input-inline">
|
92
|
+
<%= @follow_up.actual_amount.to_f.round(6) %>万
|
93
|
+
</div>
|
94
|
+
</div>
|
95
|
+
<br>
|
96
|
+
<div class="layui-inline">
|
97
|
+
<label class="layui-form-label">渠道:</label>
|
98
|
+
<div class="layui-input-inline">
|
99
|
+
<%= @follow_up.place&.name %>
|
100
|
+
</div>
|
101
|
+
</div>
|
102
|
+
<div class="layui-inline">
|
103
|
+
<label class="layui-form-label">渠道分成:</label>
|
104
|
+
<div class="layui-input-inline">
|
105
|
+
<%= @follow_up.divide_amount.to_f.round(6) %>万
|
106
|
+
</div>
|
107
|
+
</div>
|
108
|
+
<br/>
|
109
|
+
<div class="layui-inline">
|
110
|
+
<label class="layui-form-label">预算金额:</label>
|
111
|
+
<div class="layui-input-inline">
|
112
|
+
<%= @follow_up.budget_amount.to_f.round(6) %>万
|
113
|
+
</div>
|
114
|
+
</div>
|
115
|
+
<div class="layui-inline">
|
116
|
+
<label class="layui-form-label">分成比例:</label>
|
117
|
+
<div class="layui-input-inline">
|
118
|
+
<%= @follow_up.divide_rate.to_f.round(2) %>%
|
119
|
+
</div>
|
120
|
+
</div>
|
121
|
+
<div class="layui-form-item">
|
122
|
+
<div class="layui-inline">
|
123
|
+
<label class="layui-form-label">所属年度:</label>
|
124
|
+
<div class="layui-input-inline">
|
125
|
+
<%= @follow_up&.year %>年
|
126
|
+
</div>
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
<div class="layui-form-item">
|
130
|
+
<div class="layui-inline">
|
131
|
+
<label class="layui-form-label">项目资金来源:</label>
|
132
|
+
<div class="layui-input-inline">
|
133
|
+
<%= @follow_up&.funding_source %>
|
134
|
+
</div>
|
135
|
+
</div>
|
136
|
+
<div class="layui-inline">
|
137
|
+
<label class="layui-form-label">签约单位:</label>
|
138
|
+
<div class="layui-input-inline" style="width: 300px">
|
139
|
+
<%= @follow_up.signed_department&.school&.name || '' %>
|
140
|
+
</div>
|
141
|
+
</div>
|
142
|
+
</div>
|
143
|
+
<div class="layui-form-item">
|
144
|
+
<label class="layui-form-label" style="width: 150px;">售后工程师:</label>
|
145
|
+
<div class="layui-input-inline">
|
146
|
+
<%= @business.assign_staffs.map{|d| d.staff.user.full_name}.join("、") %>
|
147
|
+
</div>
|
148
|
+
</div>
|
149
|
+
<div class="layui-form-item layui-form-text">
|
150
|
+
<label class="layui-form-label"><%= @trend.clazz %>:</label>
|
151
|
+
<div class="layui-input-block" style="padding-right: 20px;">
|
152
|
+
<pre><%= @trend.content %></pre>
|
153
|
+
</div>
|
154
|
+
</div>
|
155
|
+
<div class="layui-form-item layui-form-text">
|
156
|
+
<label class="layui-form-label">时间:</label>
|
157
|
+
<div class="layui-input-block" style="padding-right: 20px;">
|
158
|
+
<pre><%= @follow_up.created_at.to_s %></pre>
|
159
|
+
</div>
|
160
|
+
</div>
|
161
|
+
<div class="layui-form-item layui-form-text">
|
162
|
+
<label class="layui-form-label">跟进人:</label>
|
163
|
+
<div class="layui-input-block" style="padding-right: 20px;">
|
164
|
+
<pre><%= @follow_up.staff.user.real_name %></pre>
|
165
|
+
</div>
|
166
|
+
</div>
|
167
|
+
</div>
|
168
|
+
</form>
|
169
|
+
|
@@ -5,7 +5,7 @@ json.data do
|
|
5
5
|
json.stage d.stage.name
|
6
6
|
json.staff d.staff.user.real_name
|
7
7
|
json.description d.description
|
8
|
-
json.advise d.advise
|
8
|
+
json.advise d.advise || ''
|
9
9
|
json.school d.business.department&.school&.name
|
10
10
|
json.school_id d.business.department&.school&.id
|
11
11
|
json.created_at d.created_at.to_s
|
@@ -67,6 +67,10 @@
|
|
67
67
|
<dd><a href="/missions/contracts" class="<%= current?('layui-this', contracts_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/4.商机管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>合同管理</a>
|
68
68
|
</dd>
|
69
69
|
<% end %>
|
70
|
+
<% if can? :read_product_catalog, EducodeSales::Business %>
|
71
|
+
<dd><a href="/missions/contracts/product_list" class="<%= current?('layui-this', product_list_contracts_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/4.商机管理.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>产品目录</a>
|
72
|
+
</dd>
|
73
|
+
<% end %>
|
70
74
|
<% if can? :read, EducodeSales::MoneyPlan %>
|
71
75
|
<dd><a href="/missions/money_plans" class="<%= current?('layui-this', money_plans_path) %>"><i style="padding-right: 35px"></i><%= image_tag "educode_sales/money_plans.png",size:"15"%><i style="font-size: 25px; padding-right: 15px"></i>回款计划</a>
|
72
76
|
</dd>
|
data/config/routes.rb
CHANGED
@@ -29,11 +29,16 @@ EducodeSales::Engine.routes.draw do
|
|
29
29
|
get :new_follow_up
|
30
30
|
post :add_follow_ups
|
31
31
|
get :product_list
|
32
|
+
get :new_product
|
33
|
+
post :product_catalog
|
34
|
+
get :show_follow_record
|
32
35
|
end
|
33
36
|
member do
|
34
37
|
post :advise
|
35
38
|
get :assign
|
36
39
|
post :assign_staff
|
40
|
+
get :edit_product
|
41
|
+
put :update_product_catalog
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateEducodeSalesProductCatalogs < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :educode_sales_product_catalogs do |t|
|
4
|
+
t.string :name
|
5
|
+
t.integer :item_clazz
|
6
|
+
t.string :brand
|
7
|
+
t.string :specification
|
8
|
+
t.string :unit
|
9
|
+
t.text :param
|
10
|
+
t.integer :source_method
|
11
|
+
t.string :supplier
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
|
16
|
+
EducodeSales::Permission.find_or_create_by(name: '查看产品目录', subject: 'Business', action: 'read_product_catalog', clazz: 'contract')
|
17
|
+
EducodeSales::Permission.find_or_create_by(name: '添加产品目录', subject: 'Business', action: 'new_product_catalog', clazz: 'contract')
|
18
|
+
EducodeSales::Permission.find_or_create_by(name: '编辑产品目录', subject: 'Business', action: 'update_product_catalog', clazz: 'contract')
|
19
|
+
end
|
20
|
+
end
|
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.77
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- anke1460
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- app/models/educode_sales/permission.rb
|
232
232
|
- app/models/educode_sales/place.rb
|
233
233
|
- app/models/educode_sales/place_area.rb
|
234
|
+
- app/models/educode_sales/product_catalog.rb
|
234
235
|
- app/models/educode_sales/project.rb
|
235
236
|
- app/models/educode_sales/recycle.rb
|
236
237
|
- app/models/educode_sales/result.rb
|
@@ -307,14 +308,17 @@ files:
|
|
307
308
|
- app/views/educode_sales/commons/show.json.jbuilder
|
308
309
|
- app/views/educode_sales/contracts/_follows.html.erb
|
309
310
|
- app/views/educode_sales/contracts/_list.html.erb
|
310
|
-
- app/views/educode_sales/contracts/_product_list.html.erb
|
311
311
|
- app/views/educode_sales/contracts/assign.html.erb
|
312
|
+
- app/views/educode_sales/contracts/edit_product.html.erb
|
312
313
|
- app/views/educode_sales/contracts/follow_ups.json.jbuilder
|
313
314
|
- app/views/educode_sales/contracts/index.html.erb
|
314
315
|
- app/views/educode_sales/contracts/index.json.jbuilder
|
315
316
|
- app/views/educode_sales/contracts/list.js.erb
|
316
317
|
- app/views/educode_sales/contracts/new_follow_up.html.erb
|
317
|
-
- app/views/educode_sales/contracts/
|
318
|
+
- app/views/educode_sales/contracts/new_product.html.erb
|
319
|
+
- app/views/educode_sales/contracts/product_list.html.erb
|
320
|
+
- app/views/educode_sales/contracts/product_list.json.jbuilder
|
321
|
+
- app/views/educode_sales/contracts/show_follow_record.html.erb
|
318
322
|
- app/views/educode_sales/customers/edit.html.erb
|
319
323
|
- app/views/educode_sales/customers/edit_department.html.erb
|
320
324
|
- app/views/educode_sales/customers/edit_follow_record.html.erb
|
@@ -657,6 +661,7 @@ files:
|
|
657
661
|
- db/migrate/20230430121335_add_permissions_for_ideas.rb
|
658
662
|
- db/migrate/20230430134710_create_educode_sales_assign_staffs.rb
|
659
663
|
- db/migrate/20230501034307_create_educode_sales_follow_up_trends.rb
|
664
|
+
- db/migrate/20230502142912_create_educode_sales_product_catalogs.rb
|
660
665
|
- lib/educode_sales.rb
|
661
666
|
- lib/educode_sales/engine.rb
|
662
667
|
- lib/educode_sales/version.rb
|
@@ -1,358 +0,0 @@
|
|
1
|
-
<div class="min-height-table" id="product_list">
|
2
|
-
<div style="margin: 10px 10px 10px 10px">
|
3
|
-
<form class="layui-form layui-form-pane" lay-filter="search_form">
|
4
|
-
<div class="layui-form-item">
|
5
|
-
<div class="layui-inline">
|
6
|
-
<label class="layui-form-label">合同名称</label>
|
7
|
-
<div class="layui-input-inline">
|
8
|
-
<input type="text" name="name" class="layui-input" value="">
|
9
|
-
</div>
|
10
|
-
</div>
|
11
|
-
<div class="layui-inline">
|
12
|
-
<label class="layui-form-label">用户单位</label>
|
13
|
-
<div class="layui-input-inline">
|
14
|
-
<input type="text" name="department" value="" class="layui-input">
|
15
|
-
</div>
|
16
|
-
</div>
|
17
|
-
<div class="layui-inline">
|
18
|
-
<label class="layui-form-label">签约单位</label>
|
19
|
-
<div class="layui-input-inline">
|
20
|
-
<input type="text" name="assign_department" value="" class="layui-input">
|
21
|
-
</div>
|
22
|
-
</div>
|
23
|
-
<div class="layui-inline">
|
24
|
-
<label class="layui-form-label">销售经理</label>
|
25
|
-
<div class="layui-input-inline">
|
26
|
-
<%= select_tag "sales_staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true , "lay-search": "" } %>
|
27
|
-
</div>
|
28
|
-
</div>
|
29
|
-
<div class="layui-inline show_item_contract">
|
30
|
-
<label class="layui-form-label">区域</label>
|
31
|
-
<div class="layui-input-inline">
|
32
|
-
<%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
|
33
|
-
</div>
|
34
|
-
</div>
|
35
|
-
<div class="layui-inline show_item_contract">
|
36
|
-
<label class="layui-form-label">项目阶段</label>
|
37
|
-
<div class="layui-input-inline">
|
38
|
-
<div id="contract_business_step" style="width: 190px;"></div>
|
39
|
-
</div>
|
40
|
-
</div>
|
41
|
-
<div class="layui-inline show_item_contract">
|
42
|
-
<label class="layui-form-label">渠道名称</label>
|
43
|
-
<div class="layui-input-inline">
|
44
|
-
<div id="contract_index_place" style="width: 190px;"></div>
|
45
|
-
</div>
|
46
|
-
</div>
|
47
|
-
<div class="layui-inline show_item_contract">
|
48
|
-
<label class="layui-form-label">中标时间</label>
|
49
|
-
<div class="layui-input-inline">
|
50
|
-
<input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
|
51
|
-
</div>
|
52
|
-
</div>
|
53
|
-
<div class="layui-inline show_item_contract">
|
54
|
-
<label class="layui-form-label">签单时间</label>
|
55
|
-
<div class="layui-input-inline">
|
56
|
-
<input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
|
57
|
-
</div>
|
58
|
-
</div>
|
59
|
-
<div class="layui-inline">
|
60
|
-
<button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
|
61
|
-
</button>
|
62
|
-
<button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness_contract">搜索
|
63
|
-
</button>
|
64
|
-
</div>
|
65
|
-
</div>
|
66
|
-
</form>
|
67
|
-
</div>
|
68
|
-
<div id="contact_table_wraper">
|
69
|
-
<table class="layui-hide" id="contact_product_table" lay-filter="contact_product_table"></table>
|
70
|
-
</div>
|
71
|
-
</div>
|
72
|
-
|
73
|
-
<script type="text/html" id="currentTableBarProduct">
|
74
|
-
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_product">添加销售目录</a>
|
75
|
-
</script>
|
76
|
-
|
77
|
-
|
78
|
-
<script>
|
79
|
-
layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate', 'dropdown','laytpl', 'xmSelect'], function () {
|
80
|
-
var $ = layui.jquery,
|
81
|
-
form = layui.form,
|
82
|
-
request = layui.request,
|
83
|
-
miniPage = layui.miniPage,
|
84
|
-
dropdown = layui.dropdown,
|
85
|
-
xmSelect = layui.xmSelect,
|
86
|
-
laydate = layui.laydate;
|
87
|
-
var openWH = miniPage.getOpenWidthHeight();
|
88
|
-
laydate.render({
|
89
|
-
elem: '#date',
|
90
|
-
range: true
|
91
|
-
});
|
92
|
-
|
93
|
-
laydate.render({
|
94
|
-
elem: '#invitation_at',
|
95
|
-
range: true
|
96
|
-
});
|
97
|
-
|
98
|
-
laydate.render({
|
99
|
-
elem: '#bidded_date',
|
100
|
-
range: true,
|
101
|
-
value: gon.bidded_date
|
102
|
-
});
|
103
|
-
laydate.render({
|
104
|
-
elem: '#signed_date',
|
105
|
-
range: true,
|
106
|
-
value: gon.signed_date
|
107
|
-
});
|
108
|
-
|
109
|
-
laydate.render({
|
110
|
-
elem: '#date_at',
|
111
|
-
range: true,
|
112
|
-
value: gon.date_at
|
113
|
-
});
|
114
|
-
|
115
|
-
|
116
|
-
var business_type_list = xmSelect.render({
|
117
|
-
el: '#contract_business_type',
|
118
|
-
data: gon.business_type
|
119
|
-
})
|
120
|
-
|
121
|
-
|
122
|
-
var business_step_list = xmSelect.render({
|
123
|
-
el: '#contract_business_step',
|
124
|
-
data: gon.business_step
|
125
|
-
})
|
126
|
-
|
127
|
-
var index_place_list = xmSelect.render({
|
128
|
-
el: '#contract_index_place',
|
129
|
-
model: {
|
130
|
-
icon: 'hidden',
|
131
|
-
label: {
|
132
|
-
type: 'text',
|
133
|
-
text: {
|
134
|
-
//左边拼接的字符
|
135
|
-
left: '',
|
136
|
-
//右边拼接的字符
|
137
|
-
right: '',
|
138
|
-
//中间的分隔符
|
139
|
-
separator: ', ',
|
140
|
-
},
|
141
|
-
}
|
142
|
-
},
|
143
|
-
remoteSearch: true,
|
144
|
-
clickClose: true,
|
145
|
-
delay: 1000,
|
146
|
-
paging: true,
|
147
|
-
radio: true,
|
148
|
-
pageRemote: true,
|
149
|
-
filterable: true,
|
150
|
-
remoteMethod: function (val, cb, show, pageIndex) {
|
151
|
-
$.ajax( '/missions/sales_place', {
|
152
|
-
method: 'get',
|
153
|
-
data: {
|
154
|
-
q: val,
|
155
|
-
page: pageIndex
|
156
|
-
},
|
157
|
-
dataType: 'json',
|
158
|
-
success: function (res) {
|
159
|
-
var data = res.data;
|
160
|
-
if (res.code == 0) {
|
161
|
-
cb(res.data, res.count);
|
162
|
-
} else {
|
163
|
-
layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
|
164
|
-
}
|
165
|
-
}
|
166
|
-
})
|
167
|
-
}
|
168
|
-
})
|
169
|
-
index_place_list.setValue(gon.place)
|
170
|
-
|
171
|
-
|
172
|
-
var data = form.val("search_form");
|
173
|
-
table = layui.table;
|
174
|
-
var cols_table = [
|
175
|
-
[
|
176
|
-
{
|
177
|
-
field: 'id',
|
178
|
-
width: 60,
|
179
|
-
title: '序号', type: 'numbers',
|
180
|
-
totalRowText: '合计',
|
181
|
-
fixed: "left"
|
182
|
-
},
|
183
|
-
{
|
184
|
-
field: 'number',
|
185
|
-
width: 120,
|
186
|
-
title: '编号',
|
187
|
-
fixed: 'left',
|
188
|
-
},
|
189
|
-
{
|
190
|
-
field: 'name',
|
191
|
-
width: 120,
|
192
|
-
title: '合同名称',
|
193
|
-
},
|
194
|
-
{
|
195
|
-
field: 'area',
|
196
|
-
width: 100,
|
197
|
-
title: '地域',
|
198
|
-
},
|
199
|
-
{
|
200
|
-
field: 'school',
|
201
|
-
width: 150,
|
202
|
-
title: '用户单位',
|
203
|
-
templet: '#school_name',
|
204
|
-
},
|
205
|
-
{
|
206
|
-
field: 'property',
|
207
|
-
width: 150,
|
208
|
-
title: '客户类型',
|
209
|
-
},
|
210
|
-
{
|
211
|
-
field: 'department',
|
212
|
-
width: 150,
|
213
|
-
title: '部门',
|
214
|
-
templet: '<div><span title="{{d.department}}">{{d.department}}</span></div>',
|
215
|
-
},
|
216
|
-
{
|
217
|
-
field: 'item_clazz',
|
218
|
-
width: 150,
|
219
|
-
title: '销售品目',
|
220
|
-
},
|
221
|
-
{
|
222
|
-
field: 'brand',
|
223
|
-
width: 150,
|
224
|
-
title: '品牌',
|
225
|
-
},
|
226
|
-
{
|
227
|
-
field: 'specification',
|
228
|
-
width: 150,
|
229
|
-
title: '规格',
|
230
|
-
},
|
231
|
-
{
|
232
|
-
field: 'supplier',
|
233
|
-
width: 150,
|
234
|
-
title: '供货商',
|
235
|
-
}
|
236
|
-
]
|
237
|
-
]
|
238
|
-
|
239
|
-
var business_table = table.render({
|
240
|
-
elem: '#contact_product_table',
|
241
|
-
url: '/missions/contracts',
|
242
|
-
autoSort: false,
|
243
|
-
where: {q: data},
|
244
|
-
defaultToolbar: ['filter'],
|
245
|
-
title: '合同数据表',
|
246
|
-
totalRow: true,//开启合并行
|
247
|
-
cols: cols_table,
|
248
|
-
|
249
|
-
limit: 20,
|
250
|
-
limits: [10,15,20,30,40,50,60,70,80,90],
|
251
|
-
page: true,
|
252
|
-
skin: 'line',
|
253
|
-
});
|
254
|
-
|
255
|
-
|
256
|
-
var sort = {}, search = data;
|
257
|
-
|
258
|
-
table.on('sort(contact_product_table)', function (obj) {
|
259
|
-
var data = form.val("search_form");
|
260
|
-
sort.field = obj.field;
|
261
|
-
sort.order = obj.type;
|
262
|
-
table.reload('contact_product_table', {
|
263
|
-
url: '/missions/businesses',
|
264
|
-
initSort: obj,
|
265
|
-
where: {
|
266
|
-
sort: sort,
|
267
|
-
q: search
|
268
|
-
}
|
269
|
-
});
|
270
|
-
})
|
271
|
-
|
272
|
-
// 监听搜索操作
|
273
|
-
form.on('submit(search_bussiness_contract)', function (data) {
|
274
|
-
if (search['clazz']) {
|
275
|
-
data.field['clazz'] = search['clazz']
|
276
|
-
}
|
277
|
-
search = data.field
|
278
|
-
table.reload('contact_product_table', {
|
279
|
-
url: '/missions/contracts',
|
280
|
-
page: {
|
281
|
-
curr: 1
|
282
|
-
},
|
283
|
-
where: {q: search, sort: sort}
|
284
|
-
}, 'data');
|
285
|
-
|
286
|
-
return false;
|
287
|
-
});
|
288
|
-
|
289
|
-
form.on('submit(reset_business_search)', function (data) {
|
290
|
-
var field = data.field;
|
291
|
-
form.val('search_form', {
|
292
|
-
name: '', department: '', staff_id: '', business_type: '', business_step: '',
|
293
|
-
place_id: '', date: '', area: '', invitation_at: '', business_year: '', number: ''
|
294
|
-
})
|
295
|
-
business_type_list.setValue([])
|
296
|
-
business_step_list.setValue([])
|
297
|
-
index_place_list.setValue([])
|
298
|
-
return false;
|
299
|
-
});
|
300
|
-
|
301
|
-
table.on('tool(contact_product_table)', function (obj) {
|
302
|
-
var data = obj.data;
|
303
|
-
id = data.id
|
304
|
-
if (obj.event === 'add_event') { // 监听添加操作
|
305
|
-
business_id = data.id
|
306
|
-
var content = miniPage.getHrefContent('/missions/contracts/new_follow_up?id=' + data.id);
|
307
|
-
var openWH = miniPage.getOpenWidthHeight();
|
308
|
-
new_follow_index = layer.open({
|
309
|
-
title: '添加合同跟进记录',
|
310
|
-
type: 1,
|
311
|
-
shade: 0.2,
|
312
|
-
maxmin: true,
|
313
|
-
shadeClose: true,
|
314
|
-
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
315
|
-
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
316
|
-
content: content,
|
317
|
-
success: function (layero, index) {
|
318
|
-
form.render('select');
|
319
|
-
}
|
320
|
-
});
|
321
|
-
$(window).on("resize", function () {
|
322
|
-
layer.full(new_follow_index);
|
323
|
-
});
|
324
|
-
} else if (obj.event === 'assign') {
|
325
|
-
var content = miniPage.getHrefContent('/missions/contracts/' + id + '/assign');
|
326
|
-
var openWH = miniPage.getOpenWidthHeight();
|
327
|
-
name = data.name;
|
328
|
-
sindex = layer.open({
|
329
|
-
title: '指派合同【' + name + "】售后工程师",
|
330
|
-
type: 1,
|
331
|
-
shade: 0.2,
|
332
|
-
maxmin: true,
|
333
|
-
shadeClose: true,
|
334
|
-
area: ['600px', '600px'],
|
335
|
-
content: content
|
336
|
-
});
|
337
|
-
$(window).on("resize", function () {
|
338
|
-
layer.full(sindex);
|
339
|
-
});
|
340
|
-
return false;
|
341
|
-
}
|
342
|
-
});
|
343
|
-
|
344
|
-
|
345
|
-
});
|
346
|
-
</script>
|
347
|
-
<style>
|
348
|
-
.layui-table-tool-temp{
|
349
|
-
padding-right: 30px; !important;
|
350
|
-
}
|
351
|
-
.layui-table-fixed .layui-table-body {
|
352
|
-
height: auto!important;
|
353
|
-
}
|
354
|
-
.layui-table-fixed.layui-hide {
|
355
|
-
display: block!important;
|
356
|
-
}
|
357
|
-
|
358
|
-
</style>
|
@@ -1 +0,0 @@
|
|
1
|
-
$("#contract_product_wraper").html("<%= j render 'product_list' %>");
|