educode_sales 0.9.75 → 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 +153 -14
- data/app/models/educode_sales/business.rb +2 -0
- data/app/models/educode_sales/contract_date_list.rb +2 -0
- data/app/models/educode_sales/follow_up.rb +3 -1
- data/app/models/educode_sales/follow_up_trend.rb +8 -0
- data/app/models/educode_sales/product_catalog.rb +7 -0
- data/app/views/educode_sales/contracts/_follows.html.erb +11 -39
- data/app/views/educode_sales/contracts/_list.html.erb +11 -6
- data/app/views/educode_sales/contracts/assign.html.erb +46 -0
- data/app/views/educode_sales/contracts/edit_product.html.erb +85 -0
- data/app/views/educode_sales/contracts/follow_ups.json.jbuilder +4 -5
- data/app/views/educode_sales/contracts/index.json.jbuilder +1 -1
- data/app/views/educode_sales/contracts/new_follow_up.html.erb +8 -18
- 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 +11 -0
- data/db/migrate/20230501034307_create_educode_sales_follow_up_trends.rb +12 -0
- data/db/migrate/20230502142912_create_educode_sales_product_catalogs.rb +20 -0
- data/lib/educode_sales/version.rb +1 -1
- metadata +15 -6
- data/app/assets/images/educode_sales/indexlogo.png +0 -0
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
|
|
@@ -47,13 +46,15 @@ module EducodeSales
|
|
47
46
|
level = @current_admin.role.role_areas.find_by(clazz: '合同管理').level
|
48
47
|
case level
|
49
48
|
when '自己'
|
50
|
-
|
49
|
+
assign_business_ids = EducodeSales::Business.joins(:assign_staffs).where("educode_sales_assign_staffs.staff_id = ?", @current_admin.id).pluck(:id)
|
50
|
+
|
51
|
+
@businesses = @businesses.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, assign_business_ids)
|
51
52
|
when '区域'
|
52
53
|
school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
|
53
|
-
business_ids =
|
54
|
-
|
55
|
-
|
56
|
-
@businesses = @businesses.where(
|
54
|
+
business_ids = @businesses.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
|
55
|
+
assign_business_ids = EducodeSales::Business.joins(:assign_staffs).where("educode_sales_assign_staffs.staff_id = ?", @current_admin.id).pluck(:id)
|
56
|
+
|
57
|
+
@businesses = @businesses.joins("JOIN departments ON educode_sales_businesses.department_id = departments.id").where("departments.school_id in (?) OR educode_sales_businesses.staff_id = #{@current_admin.id} OR educode_sales_businesses.id in (?)", school_ids, business_ids + assign_business_ids)
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
@@ -162,7 +163,7 @@ module EducodeSales
|
|
162
163
|
|
163
164
|
if params[:q].present? && params[:q][:after_sales_staff_id].present?
|
164
165
|
# 售后工程师
|
165
|
-
@businesses = @businesses.joins("LEFT JOIN educode_sales_assign_staffs ON educode_sales_assign_staffs.sourcable_type = 'EducodeSales::
|
166
|
+
@businesses = @businesses.joins("LEFT JOIN educode_sales_assign_staffs ON educode_sales_assign_staffs.sourcable_type = 'EducodeSales::Business' AND educode_sales_assign_staffs.sourcable_id = educode_sales_businesses.id").
|
166
167
|
where("educode_sales_assign_staffs.staff_id = ?", params[:q][:after_sales_staff_id])
|
167
168
|
|
168
169
|
end
|
@@ -239,7 +240,7 @@ module EducodeSales
|
|
239
240
|
contract_ids = Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
|
240
241
|
@follow_ups = FollowUp.joins("
|
241
242
|
JOIN educode_sales_businesses ON educode_sales_follow_ups.business_id = educode_sales_businesses.id
|
242
|
-
").where("educode_sales_follow_ups.stage_id in (?)", contract_ids)
|
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")
|
243
244
|
|
244
245
|
if @current_admin.is_admin?
|
245
246
|
@follow_ups = @follow_ups
|
@@ -283,6 +284,10 @@ module EducodeSales
|
|
283
284
|
|
284
285
|
end
|
285
286
|
|
287
|
+
if params[:q].present? && params[:q][:info_clazz].present?
|
288
|
+
@follow_ups = @follow_ups.where("educode_sales_follow_up_trends.clazz = ?", params[:q][:info_clazz])
|
289
|
+
end
|
290
|
+
|
286
291
|
@follow_ups = @follow_ups.includes(:staff, :clazz, :stage, key_person: :teacher, business: [department: :school])
|
287
292
|
|
288
293
|
if params[:sort].present? && params[:sort][:field]
|
@@ -294,16 +299,150 @@ module EducodeSales
|
|
294
299
|
end
|
295
300
|
|
296
301
|
def add_follow_ups
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
302
|
+
data = []
|
303
|
+
6.times do |i|
|
304
|
+
data[i] = []
|
305
|
+
params["#{i+1}_promise_date"].each do |d, v|
|
306
|
+
data[i] << [v]
|
307
|
+
end
|
308
|
+
params["#{i+1}_num"].each do |d, v|
|
309
|
+
data[i][d.to_i] << v
|
310
|
+
end
|
311
|
+
params["#{i+1}_plan_date"].each do |d, v|
|
312
|
+
data[i][d.to_i] << v
|
313
|
+
end
|
314
|
+
params["#{i+1}_actual_date"].each do |d, v|
|
315
|
+
data[i][d.to_i] << v
|
316
|
+
end
|
317
|
+
end
|
318
|
+
data.each do |d|
|
319
|
+
d.select! { |d| d.delete_if{|f| f == ''}.present? }
|
320
|
+
end
|
321
|
+
|
322
|
+
@business = Business.find(params[:business_id])
|
323
|
+
follow_up = @business.follow_ups.build(follow_up_params)
|
324
|
+
follow_up.stage = @business.last_follow_up.stage
|
325
|
+
follow_up.clazz = @business.last_follow_up.clazz
|
326
|
+
if params[:service_time].present?
|
327
|
+
date = params[:service_time].split(" - ")
|
328
|
+
follow_up.service_start_time = date[0]
|
329
|
+
follow_up.service_end_time = date[1]
|
330
|
+
follow_up.service_time_long = (date[1].to_date - date[0].to_date).to_i
|
331
|
+
end
|
332
|
+
follow_up.staff = @current_admin
|
333
|
+
|
334
|
+
last_follow_up = @business.last_follow_up
|
335
|
+
|
336
|
+
if follow_up.save!
|
337
|
+
contract_lists = EducodeSales::ContractDateList.clazzs.invert
|
338
|
+
data.each_with_index do |s, i|
|
339
|
+
if s.present?
|
340
|
+
s.each do |d|
|
341
|
+
follow_up.contract_date_lists.create!({promise_date: d[0], num: d[1], plan_date: d[2], actual_date: d[3], staff_id: @current_admin.id, clazz: contract_lists[i]})
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
follow_up.follow_up_trends.create(clazz: '跟进信息', content: params[:content], staff_id: @current_admin.id)
|
346
|
+
@business.update(last_follow_up_id: follow_up.id)
|
347
|
+
render_success
|
348
|
+
else
|
349
|
+
render_failure follow_up
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
def advise
|
354
|
+
followup = FollowUp.find(params[:id])
|
355
|
+
followup.follow_up_trends.create(clazz: '建议信息', content: params[:content], staff_id: @current_admin.id)
|
356
|
+
render_success
|
357
|
+
end
|
358
|
+
|
359
|
+
def assign
|
360
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
361
|
+
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
362
|
+
gon.sales_staffs = staffs.map { |d| {name: d.user.real_name, value: d.id } }
|
363
|
+
render layout: false
|
364
|
+
end
|
365
|
+
|
366
|
+
def product_list
|
367
|
+
respond_to do |format|
|
368
|
+
format.html do
|
369
|
+
common = Common.find_by(clazz: 'staff_type', name: '销售')
|
370
|
+
staffs = Staff.joins(:user).where(job_type: common.id).where.not(role_id: 11)
|
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
|
+
end
|
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])
|
382
|
+
end
|
303
383
|
end
|
384
|
+
end
|
304
385
|
|
386
|
+
def assign_staff
|
387
|
+
@business = Business.find(params[:id])
|
388
|
+
params[:to_id].split(",").each do |i|
|
389
|
+
@business.assign_staffs.create({staff_id: i})
|
390
|
+
end
|
305
391
|
render_success
|
306
392
|
end
|
307
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
|
+
|
439
|
+
private
|
440
|
+
def follow_up_params
|
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)
|
442
|
+
end
|
443
|
+
|
444
|
+
def product_up_params
|
445
|
+
params.permit(:name, :item_clazz, :brand, :specification, :unit, :param, :source_method, :supplier)
|
446
|
+
end
|
308
447
|
end
|
309
448
|
end
|
@@ -19,6 +19,8 @@ module EducodeSales
|
|
19
19
|
has_many :business_watches, dependent: :destroy
|
20
20
|
has_many :business_histories, dependent: :destroy
|
21
21
|
|
22
|
+
has_many :assign_staffs, as: :sourcable # 售后人员
|
23
|
+
|
22
24
|
# 关联关注
|
23
25
|
has_many :users, :class_name => 'EducodeSales::BusinessRelationShip', foreign_key: 'business_id', :dependent => :destroy
|
24
26
|
|
@@ -15,6 +15,7 @@ module EducodeSales
|
|
15
15
|
include ::Deletable
|
16
16
|
belongs_to :business, counter_cache: true # counter_cache(自动计算 business对应follow_up表中对应的个数)
|
17
17
|
belongs_to :place, optional: true
|
18
|
+
belongs_to :signed_department, class_name: 'Department', optional: true
|
18
19
|
has_many :money_plans
|
19
20
|
has_many :key_person
|
20
21
|
has_many :teachers, through: :key_person
|
@@ -23,7 +24,8 @@ module EducodeSales
|
|
23
24
|
belongs_to :stage, class_name: 'Common'
|
24
25
|
belongs_to :clazz, class_name: 'Common'
|
25
26
|
|
26
|
-
has_many :
|
27
|
+
has_many :follow_up_trends
|
28
|
+
has_many :contract_date_lists
|
27
29
|
|
28
30
|
|
29
31
|
default_scope -> {where(deleted_at: nil)}
|
@@ -28,7 +28,7 @@
|
|
28
28
|
<div class="layui-inline">
|
29
29
|
<label class="layui-form-label">信息类型</label>
|
30
30
|
<div class="layui-input-inline">
|
31
|
-
<%= select_tag "info_clazz", options_for_select(EducodeSales::FollowUp::InfoClazz), { include_blank: true } %>
|
31
|
+
<%= select_tag "info_clazz", options_for_select(EducodeSales::FollowUp::InfoClazz.each_with_index.map { |d, i| [d, i] }), { include_blank: true } %>
|
32
32
|
</div>
|
33
33
|
</div>
|
34
34
|
<div class="layui-inline">
|
@@ -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 %>
|
@@ -129,9 +129,8 @@
|
|
129
129
|
},
|
130
130
|
{
|
131
131
|
field: 'signed_department',
|
132
|
-
width:
|
133
|
-
title: '签约单位'
|
134
|
-
templet:'#signed_department'
|
132
|
+
width: 160,
|
133
|
+
title: '签约单位'
|
135
134
|
},
|
136
135
|
{
|
137
136
|
field: 'stage',
|
@@ -145,8 +144,8 @@
|
|
145
144
|
title: '销售经理',
|
146
145
|
},
|
147
146
|
{
|
148
|
-
field: '
|
149
|
-
width:
|
147
|
+
field: 'clazz',
|
148
|
+
width: 100,
|
150
149
|
title: '信息类型',
|
151
150
|
},
|
152
151
|
{
|
@@ -202,15 +201,6 @@
|
|
202
201
|
},
|
203
202
|
where: {q: search, sort: sort}
|
204
203
|
}, 'data');
|
205
|
-
// table.reload('businesses_table', {
|
206
|
-
// page: {
|
207
|
-
// curr: 1
|
208
|
-
// },
|
209
|
-
// where: {q: search, sort: sort}
|
210
|
-
// }, 'data');
|
211
|
-
// form.val('search_form', {
|
212
|
-
// name: data.field.name, department: data.field.department, staff_id: data.field.staff_id, area: data.field.area , description: data.field.description
|
213
|
-
// })
|
214
204
|
return false;
|
215
205
|
});
|
216
206
|
|
@@ -247,29 +237,11 @@
|
|
247
237
|
table.on('tool(contract_follows_table)', function (obj) {
|
248
238
|
var data = obj.data;
|
249
239
|
id = data.id
|
250
|
-
if (obj.event === '
|
251
|
-
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);
|
252
242
|
var openWH = miniPage.getOpenWidthHeight();
|
253
243
|
show_index = layer.open({
|
254
|
-
title: '
|
255
|
-
type: 1,
|
256
|
-
shade: 0.2,
|
257
|
-
maxmin: true,
|
258
|
-
shadeClose: true,
|
259
|
-
area: [openWH[0] + 'px', openWH[1] + 'px'],
|
260
|
-
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
261
|
-
content: content
|
262
|
-
});
|
263
|
-
$(window).on("resize", function () {
|
264
|
-
layer.full(index);
|
265
|
-
});
|
266
|
-
} else if (obj.event === 'business') {
|
267
|
-
business_id = data.business_id
|
268
|
-
business_name = data.business
|
269
|
-
content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + data.business_id);
|
270
|
-
openWH = miniPage.getOpenWidthHeight();
|
271
|
-
index = layer.open({
|
272
|
-
title: '商机列表/' + data.business + '的跟进记录',
|
244
|
+
title: '查看合同动态',
|
273
245
|
type: 1,
|
274
246
|
shade: 0.2,
|
275
247
|
maxmin: true,
|
@@ -288,14 +260,14 @@
|
|
288
260
|
type: 1,
|
289
261
|
area: '400px;',
|
290
262
|
id: 'LAY_layuipro',
|
291
|
-
content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea"
|
263
|
+
content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea"></textarea></div>' ,
|
292
264
|
btn: ['保存', '取消'],
|
293
265
|
btn1: function(index, l) {
|
294
266
|
if (l.find("textarea").val().trim() == '') {
|
295
267
|
layer.msg('内容不能为空')
|
296
268
|
return false;
|
297
269
|
} else {
|
298
|
-
request.
|
270
|
+
request.authPost("/missions/contracts/" + data.id + "/advise", {content: l.find("textarea").val().trim()}, function(res) {
|
299
271
|
if (res.success == false) {
|
300
272
|
layer.alert(res.msg);
|
301
273
|
} else {
|
@@ -265,6 +265,11 @@
|
|
265
265
|
templet: '<div><a href="javascript:void(0);" class="layui-table-link" lay-event="show_business"><span title="{{d.name}}">{{d.name}}</span></a></div>',
|
266
266
|
fixed: 'left',
|
267
267
|
},
|
268
|
+
{
|
269
|
+
field: 'name',
|
270
|
+
width: 120,
|
271
|
+
title: '合同名称',
|
272
|
+
},
|
268
273
|
{
|
269
274
|
field: 'area',
|
270
275
|
width: 100,
|
@@ -543,7 +548,7 @@
|
|
543
548
|
business_id = data.id
|
544
549
|
var content = miniPage.getHrefContent('/missions/contracts/new_follow_up?id=' + data.id);
|
545
550
|
var openWH = miniPage.getOpenWidthHeight();
|
546
|
-
|
551
|
+
new_follow_index = layer.open({
|
547
552
|
title: '添加合同跟进记录',
|
548
553
|
type: 1,
|
549
554
|
shade: 0.2,
|
@@ -557,19 +562,19 @@
|
|
557
562
|
}
|
558
563
|
});
|
559
564
|
$(window).on("resize", function () {
|
560
|
-
layer.full(
|
565
|
+
layer.full(new_follow_index);
|
561
566
|
});
|
562
567
|
} else if (obj.event === 'assign') {
|
563
|
-
var content = miniPage.getHrefContent('/missions/
|
568
|
+
var content = miniPage.getHrefContent('/missions/contracts/' + id + '/assign');
|
564
569
|
var openWH = miniPage.getOpenWidthHeight();
|
570
|
+
name = data.name;
|
565
571
|
sindex = layer.open({
|
566
|
-
title: '
|
572
|
+
title: '指派合同【' + name + "】售后工程师",
|
567
573
|
type: 1,
|
568
574
|
shade: 0.2,
|
569
575
|
maxmin: true,
|
570
576
|
shadeClose: true,
|
571
|
-
area: [
|
572
|
-
offset: [openWH[2] + 'px', openWH[3] + 'px'],
|
577
|
+
area: ['600px', '600px'],
|
573
578
|
content: content
|
574
579
|
});
|
575
580
|
$(window).on("resize", function () {
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
<%= Gon::Base.render_data %>
|
3
|
+
<div class="layui-form layuimini-form" style="padding:30px">
|
4
|
+
<div class="layui-form-item">
|
5
|
+
<label class="layui-form-label required">选择售后工程师:</label>
|
6
|
+
<div class="layui-input-block" style="width: 300px">
|
7
|
+
<div id="sales_id"></div>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<hr>
|
11
|
+
<div class="layui-form-item">
|
12
|
+
<div class="layui-input-block">
|
13
|
+
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<script>
|
19
|
+
layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'selectInput'], function () {
|
20
|
+
var form = layui.form,
|
21
|
+
layer = layui.layer,
|
22
|
+
table = layui.table,
|
23
|
+
laytpl = layui.laytpl,
|
24
|
+
request = layui.request,
|
25
|
+
$ = layui.$;
|
26
|
+
|
27
|
+
form.render();
|
28
|
+
staff_list_select = xmSelect.render({
|
29
|
+
el: '#sales_id',
|
30
|
+
data: gon.sales_staffs,
|
31
|
+
filterable: true,
|
32
|
+
radio: false,
|
33
|
+
})
|
34
|
+
var parentIndex = layer.index;
|
35
|
+
form.on('submit(saveBtn)', function (data) {
|
36
|
+
layer.confirm('确定指派合同【' + parent.name + "】售后工程师?", function (index) {
|
37
|
+
request.post('missions/contracts/' + parent.id +"/assign_staff", {to_id: staff_list_select.getValue('valueStr')}, function (res) {
|
38
|
+
layer.close(index);
|
39
|
+
layer.close(parentIndex)
|
40
|
+
// parent.table.reload('contact_table')
|
41
|
+
})
|
42
|
+
});
|
43
|
+
return false;
|
44
|
+
});
|
45
|
+
});
|
46
|
+
</script>
|
@@ -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>
|
@@ -4,17 +4,16 @@ json.data do
|
|
4
4
|
json.clazz d.clazz.name
|
5
5
|
json.stage d.stage.name
|
6
6
|
json.staff d.staff.user.real_name
|
7
|
-
json.
|
8
|
-
json.
|
7
|
+
json.clazz EducodeSales::FollowUpTrend.clazzs.invert[d['clazz']]
|
8
|
+
json.trend_id d['trend_id']
|
9
|
+
json.description d['content']
|
9
10
|
json.school d.business.department&.school&.name
|
10
11
|
json.school_id d.business.department&.school&.id
|
12
|
+
json.signed_department d.signed_department&.school&.name || ''
|
11
13
|
json.created_at d.created_at.to_s
|
12
14
|
json.business d.business.name
|
13
15
|
json.business_id d.business.id
|
14
|
-
json.rival d.rival || ''
|
15
16
|
json.staff_manages d.business.last_follow_up&.assign_follow_ups.present? ? (d.business.last_follow_up.assign_follow_ups.map{ |d| d.staff.user.real_name}.join("、")) : d.business.staff&.user&.real_name
|
16
|
-
# teacher_ids = d.key_person.pluck(:teacher_id)
|
17
|
-
json.tel d.key_person.pluck(:tel).select { |d| d.present? }.join("、")
|
18
17
|
|
19
18
|
end
|
20
19
|
end
|
@@ -56,7 +56,7 @@ json.data do
|
|
56
56
|
json.source d.source
|
57
57
|
json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
|
58
58
|
|
59
|
-
json.assign_staffs d.
|
59
|
+
json.assign_staffs d.assign_staffs.map{ |d| d.staff.user.real_name}.join("、")
|
60
60
|
json.current_staff_id @current_admin.id
|
61
61
|
json.staff_id d.staff_id
|
62
62
|
json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s : ''
|