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.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/contracts_controller.rb +153 -14
  3. data/app/models/educode_sales/business.rb +2 -0
  4. data/app/models/educode_sales/contract_date_list.rb +2 -0
  5. data/app/models/educode_sales/follow_up.rb +3 -1
  6. data/app/models/educode_sales/follow_up_trend.rb +8 -0
  7. data/app/models/educode_sales/product_catalog.rb +7 -0
  8. data/app/views/educode_sales/contracts/_follows.html.erb +11 -39
  9. data/app/views/educode_sales/contracts/_list.html.erb +11 -6
  10. data/app/views/educode_sales/contracts/assign.html.erb +46 -0
  11. data/app/views/educode_sales/contracts/edit_product.html.erb +85 -0
  12. data/app/views/educode_sales/contracts/follow_ups.json.jbuilder +4 -5
  13. data/app/views/educode_sales/contracts/index.json.jbuilder +1 -1
  14. data/app/views/educode_sales/contracts/new_follow_up.html.erb +8 -18
  15. data/app/views/educode_sales/contracts/new_product.html.erb +85 -0
  16. data/app/views/educode_sales/contracts/product_list.html.erb +232 -0
  17. data/app/views/educode_sales/contracts/product_list.json.jbuilder +16 -0
  18. data/app/views/educode_sales/contracts/show_follow_record.html.erb +169 -0
  19. data/app/views/educode_sales/follow_ups/index.json.jbuilder +1 -1
  20. data/app/views/layouts/educode_sales/application.html.erb +4 -0
  21. data/config/routes.rb +11 -0
  22. data/db/migrate/20230501034307_create_educode_sales_follow_up_trends.rb +12 -0
  23. data/db/migrate/20230502142912_create_educode_sales_product_catalogs.rb +20 -0
  24. data/lib/educode_sales/version.rb +1 -1
  25. metadata +15 -6
  26. 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: 3360ea7a50189fd2b8954d7111e05c3e2592d403072661f4eca95a7f1a0ef3e1
4
- data.tar.gz: af8e512e5f7e91c7eb8a211406817f19701311b205ed191982abae08cfc536dd
3
+ metadata.gz: b3c38e0feb88d220e6ec75559d93b49c38d308dd939efbb54f37b1afb106a28f
4
+ data.tar.gz: d9daee968f4335493daf6ffd1efaab8769cbb0d71c2d2869f84f1d074aea7a3f
5
5
  SHA512:
6
- metadata.gz: df64d18c074d376248f60469c2b0dcac72eafeff9b145420bfc8aa3f9b88e610471e686263a1b26cee7d2096a4094cf533c2af3a0182134c39157aeacb57a60a
7
- data.tar.gz: c3dac636495d444ac104ff6b4fdd7f65844645120127e0b1b2ccd4fe1a7a70e287dddb4e8238ef1f7b9a4c080b4aef83d8ff620d292e0c62085d793d619ad23f
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
- @businesses = @businesses.where("educode_sales_businesses.staff_id = ?", @current_admin.id)
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 = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
54
- @businesses = Business.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)
55
- business_ids = @businesses.pluck(:id)
56
- @businesses = @businesses.where(business_id: business_ids)
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::FollowUp' AND educode_sales_assign_staffs.sourcable_id = educode_sales_businesses.last_follow_up_id").
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
- p params["1_promise_date"]
298
- p params["1_promise_date"].keys
299
- params["1_promise_date"].each do |d, v|
300
- p '-----22-'
301
- p d
302
- p v
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
 
@@ -2,5 +2,7 @@ module EducodeSales
2
2
  class ContractDateList < ApplicationRecord
3
3
  belongs_to :follow_up
4
4
  belongs_to :staff
5
+
6
+ enum clazz: ['交货', '验收', '预收款', '交付款', '验收款', '质保金']
5
7
  end
6
8
  end
@@ -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 :assign_staffs, as: :sourcable # 售后人员
27
+ has_many :follow_up_trends
28
+ has_many :contract_date_lists
27
29
 
28
30
 
29
31
  default_scope -> {where(deleted_at: nil)}
@@ -0,0 +1,8 @@
1
+ module EducodeSales
2
+ class FollowUpTrend < ApplicationRecord
3
+ belongs_to :follow_up
4
+ belongs_to :staff
5
+
6
+ enum clazz: ['跟进信息', '建议信息', '评论信息', '审核信息']
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module EducodeSales
2
+ class ProductCatalog < ApplicationRecord
3
+
4
+ enum item_clazz: %w(平台 课程 硬件 技术服务 培训服务 咨询服务 云服务 装修服务 其他)
5
+ enum source_method: %w(自研 在研 待研 外购)
6
+ end
7
+ end
@@ -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="add_event">详情</a>
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: 120,
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: 'infoclazz',
149
- width: 80,
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 === 'add_event') { // 监听添加操作
251
- var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
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">' + data.advise + '</textarea></div>' ,
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.authPut("/missions/follow_ups/" + data.id + "/update_advise", {content: l.find("textarea").val().trim()}, function(res) {
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
- sale_plan_index = layer.open({
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(sale_plan_index);
565
+ layer.full(new_follow_index);
561
566
  });
562
567
  } else if (obj.event === 'assign') {
563
- var content = miniPage.getHrefContent('/missions/businesses/' + id + '/edit');
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: [openWH[0] + 'px', openWH[1] + 'px'],
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.description d.description
8
- json.advise d.advise
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.last_follow_up&.assign_staffs.present? ? (d.last_follow_up.assign_staffs.map{ |d| d.staff.user.real_name}.join("、")) : ''
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 : ''