educode_sales 1.10.8 → 1.10.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93a3c4bdda6df52bc58177a34c5a39c7330d04d9cbaf4a5d4f4bbe3691d72759
4
- data.tar.gz: dd64cb53bd80774ab02cdbd72a94b5684a827c47bd1d5aa51698b1183dbb758e
3
+ metadata.gz: 73d98a4d83213078f656abfeb070db43d2a6a594e8a273a8ace4bad8165dc541
4
+ data.tar.gz: 52b10fb147e17a25bd4f3d5b155676cbbb76d61cf6f799b2249edc6428b1ca1e
5
5
  SHA512:
6
- metadata.gz: 19f7047b112cad5d0f53580aed23fe2fb65955d7418dd28169d7da3c6a5b96c0a30f14485a5b644961deb734b9fb0c59b968c38a5af6920409cdd2143e0de2d7
7
- data.tar.gz: 4e3e0da1a8d21ed9d8cdb8cf8a3970dfa5ce554f8f87ad8b8dc30bc19248b63d555bc7ac0b52de91740753ac3ffa93c8b01b6ab9c1b8c415afaa584ca807d20f
6
+ metadata.gz: 9808f3c65fd410beaf59ef94d4be34b7ba5f25c6377975eead142d6943f5c20007c70b6cd297150473c3e569a29142e17edf89671788e77173389711b2124684
7
+ data.tar.gz: 5b2c468c9b57723d26804fd589637a5f4f877da54be8a88d180b5aec8adca7b69d08bbd28a901b9c6c0cde03e78755e3cc4750a4c700f62f9c02041456d58b73
@@ -295,6 +295,32 @@ module EducodeSales
295
295
  end
296
296
  end
297
297
 
298
+ #商机来源
299
+ if params[:q].present? && params[:q][:source_way].present?
300
+ if params[:q].present? && params[:q][:source_name].present?
301
+ if ["会议活动", "渠道代理", "客户"].include?(params[:q][:source_way])
302
+ if params[:q][:source_way] == '会议活动'
303
+ sourcable_id = EducodeSales::Activity.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
304
+ elsif params[:q][:source_way] == '渠道代理'
305
+ sourcable_id = EducodeSales::Place.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
306
+ elsif params[:q][:source_way] == '客户'
307
+ sourcable_id = EducodeSales::Department.where("name like ?", "%#{params[:q][:source_name]}%").limit(20).pluck(:id)
308
+ end
309
+
310
+ if sourcable_id.present?
311
+ @businesses = @businesses.where(source_way: params[:q][:source_way], sourcable_id: sourcable_id)
312
+ else
313
+ @businesses = @businesses.none
314
+ end
315
+ else
316
+ @businesses = @businesses.where(source_way: params[:q][:source_way]).where("sourcable_type like ?", "%#{params[:q][:source_name]}%")
317
+ end
318
+ else
319
+ @businesses = @businesses.where(source_way: params[:q][:source_way])
320
+ end
321
+ end
322
+
323
+
298
324
  # 商机变化
299
325
  if params[:q][:clazz_changes].present?
300
326
  clazz_changes = EducodeSales::BusinessClazzChange.clazz_changes_value[params[:q][:clazz_changes].to_s]
@@ -406,7 +432,26 @@ module EducodeSales
406
432
 
407
433
  def create
408
434
  department = Department.find(params[:department_id])
409
- business = @current_admin.businesses.build(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id, clazz_id: params[:clazz_id])
435
+ if params[:sourcable_type].present?
436
+ if params[:source_way] == '会议活动'
437
+ params[:sourcable_type] = 'EducodeSales::Activity'
438
+ elsif params[:source_way] == '渠道代理'
439
+ params[:sourcable_type] = 'EducodeSales::Place'
440
+ elsif params[:source_way] == '客户'
441
+ params[:sourcable_type] = 'EducodeSales::Department'
442
+ else
443
+ params[:sourcable_id] = ""
444
+ end
445
+ end
446
+ if ['会议活动', '渠道代理', '客户'].include?(params[:source_way] ) && params[:sourcable_id].blank?
447
+ params[:sourcable_type] = ""
448
+ end
449
+ if params[:sourcable_type].blank?
450
+ params[:sourcable_id] = ""
451
+ end
452
+ business = @current_admin.businesses.build(name: params[:name], department_id: department.id, source: params[:source], school_id: department.school_id, clazz_id: params[:clazz_id],
453
+ sourcable_type: params[:sourcable_type], sourcable_id: params[:sourcable_id], source_way: params[:source_way])
454
+
410
455
  if business.save
411
456
  render_success
412
457
  else
@@ -33,13 +33,17 @@ module EducodeSales
33
33
  business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
34
34
  @businesses = Business.where("educode_sales_businesses.staff_id = ? OR educode_sales_businesses.id in (?)", @current_admin.id, business_ids)
35
35
  business_ids = @businesses.pluck(:id)
36
- @follow_ups = FollowUp.where(business_id: business_ids + area_business_ids)
36
+
37
+ # 指定查看人
38
+ follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
39
+ @follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
37
40
  when '区域'
38
41
  school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id) + StaffSchool.where(staff_id: @current_admin.id).pluck(:school_id)
39
42
  business_ids = Business.joins(last_follow_up: :assign_follow_ups).where("educode_sales_assign_follow_ups.staff_id = ?", @current_admin.id).pluck(:id)
40
43
  @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)
41
44
  business_ids = @businesses.pluck(:id)
42
- @follow_ups = FollowUp.where(business_id: business_ids + area_business_ids)
45
+ follow_up_ids = EducodeSales::WatchFollowUp.where(staff_id: @current_admin.id).pluck(:follow_up_id)
46
+ @follow_ups = FollowUp.where(business_id: business_ids + area_business_ids).or(FollowUp.where(id: follow_up_ids))
43
47
  else
44
48
  @follow_ups = FollowUp.all
45
49
  end
@@ -308,7 +312,7 @@ module EducodeSales
308
312
  end
309
313
 
310
314
  def update_tags
311
- followup = FollowUp.find(params[:id])
315
+ follow_up = FollowUp.find(params[:id])
312
316
  tags = []
313
317
  tags_name = []
314
318
  params[:tags].split(",").uniq.each do |d|
@@ -317,15 +321,34 @@ module EducodeSales
317
321
  end
318
322
  tags_name << tag.name
319
323
  tag.save unless tag.persisted?
320
- t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id: followup.id)
324
+ t = FollowUpTag.find_or_initialize_by(tag_id: tag.id, follow_up_id: follow_up.id)
321
325
  t.staff = @current_admin
322
326
  tags << t
323
327
  end
324
- followup.follow_up_tags = tags
325
- followup.save
328
+ follow_up.follow_up_tags = tags
329
+ follow_up.save
326
330
  render json: {success: true, tags: tags_name}
327
331
  end
328
332
 
333
+ def add_assign
334
+ follow_up = FollowUp.find(params[:id])
335
+ staff_ids = follow_up.watch_follow_ups.pluck(:staff_id)
336
+
337
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
338
+ gon.assign_watch= Staff.joins(:user).where.not(job_type: common.id).where.not(role_id: 11).map { |d| {name: d.user.real_name, value: d.id, selected: staff_ids.include?(d.id)} }
339
+ render layout: false
340
+ end
341
+
342
+ def update_assign
343
+ follow_up = FollowUp.find(params[:id])
344
+ staffs = []
345
+ params[:staff_ids].split(",").each do |staff_id|
346
+ staffs << WatchFollowUp.find_or_initialize_by(staff_id: staff_id, follow_up_id: follow_up.id)
347
+ end
348
+ follow_up.watch_follow_ups = staffs
349
+ follow_up.save
350
+ render json: {success: true, tags: staffs.map { |d| d.staff.user.real_name }}
351
+ end
329
352
 
330
353
  private
331
354
 
@@ -6,8 +6,12 @@ module EducodeSales
6
6
  def index
7
7
  respond_to do |format|
8
8
  format.html do
9
+
9
10
  end
10
11
  format.js do
12
+ gon.edit_record = can?(:update_record, EducodeSales::MoneyPlan)
13
+ gon.edit_record_self = can?(:update_record_self, EducodeSales::MoneyPlan)
14
+ gon.staff_id = @current_admin.id
11
15
  end
12
16
  format.json do
13
17
  @money_plan_records = MoneyPlanRecord.left_joins(:money_plan_claims).group("educode_sales_money_plan_records.id").select("educode_sales_money_plan_records.*, COUNT(educode_sales_money_plan_claims.id) AS claim_num")
@@ -7,6 +7,7 @@ module EducodeSales
7
7
  authorize! :read, MoneyPlan
8
8
  respond_to do |format|
9
9
  format.html do
10
+
10
11
  end
11
12
  format.json do
12
13
  last_follow_up_ids = Business.all.pluck(:last_follow_up_id)
@@ -48,6 +49,9 @@ module EducodeSales
48
49
  format.html do
49
50
  common = Common.find_by(clazz: 'staff_type', name: '销售')
50
51
  @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
52
+ gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
53
+ gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
54
+ gon.staff_id = @current_admin.id
51
55
  end
52
56
 
53
57
  end
@@ -67,6 +71,10 @@ module EducodeSales
67
71
  @money_plan = MoneyPlan.find(params[:id])
68
72
  gon.business_id = @money_plan.business_id
69
73
  gon.business = [{value: @money_plan.business_id.to_s, name: @money_plan.business&.name}]
74
+
75
+ gon.edit_money_plan = can?(:update, EducodeSales::MoneyPlan)
76
+ gon.edit_money_plan_self = can?(:update_self, EducodeSales::MoneyPlan)
77
+ gon.staff_id = @current_admin.id
70
78
  render layout: false
71
79
  end
72
80
 
@@ -23,6 +23,8 @@ module EducodeSales
23
23
  has_many :teachers, through: :key_person
24
24
  has_many :assign_follow_ups
25
25
  has_many :follow_up_tags, dependent: :destroy
26
+
27
+ has_many :watch_follow_ups, dependent: :destroy
26
28
  belongs_to :staff
27
29
  belongs_to :stage, class_name: 'Common'
28
30
  belongs_to :clazz, class_name: 'Common'
@@ -34,8 +34,12 @@
34
34
  <script type="text/html" id="toolbarDemo">
35
35
  <div class="layui-btn-container">
36
36
  <span class="table-label">签到列表</span>
37
- <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import_attendances"><i class="layui-icon layui-icon-add-circle-fine"></i> 批量导入签到数据</button>
38
- <button class="layui-btn layui-btn-normal layui-btn-sm layui-btn-danger data-delete-btn pull-right" lay-event="batch_delete"><i class="layui-icon layui-icon-delete"></i> 批量删除签到数据</button>
37
+ <% if can?(:import_attendances, EducodeSales::AssessmentsSetting) %>
38
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import_attendances"><i class="layui-icon layui-icon-add-circle-fine"></i> 批量导入签到数据</button>
39
+ <% end %>
40
+ <% if can?(:batch_delete, EducodeSales::AssessmentsSetting) %>
41
+ <button class="layui-btn layui-btn-normal layui-btn-sm layui-btn-danger data-delete-btn pull-right" lay-event="batch_delete"><i class="layui-icon layui-icon-delete"></i> 批量删除签到数据</button>
42
+ <% end %>
39
43
  </div>
40
44
  </script>
41
45
 
@@ -44,8 +48,12 @@
44
48
  </div>
45
49
 
46
50
  <script type="text/html" id="currentTableBar">
47
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
48
- <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
51
+ <% if can?(:edit_attendance, EducodeSales::AssessmentsSetting) %>
52
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
53
+ <% end %>
54
+ <% if can?(:delete_attendance, EducodeSales::AssessmentsSetting) %>
55
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
56
+ <% end %>
49
57
  </script>
50
58
 
51
59
  <script>
@@ -6,7 +6,9 @@
6
6
  <% if can?(:show, EducodeSales::AssessmentsSetting) %>
7
7
  <li data="assessments" > 考核指标设置</li>
8
8
  <%end %>
9
- <li class="">签到记录</li>
9
+ <% if can?(:show_attendances, EducodeSales::AssessmentsSetting) %>
10
+ <li class="">签到记录</li>
11
+ <% end %>
10
12
  </ul>
11
13
  <!--<div class="layuimini-main min-height-table"></div>-->
12
14
  <div class="layui-tab-content">
@@ -68,34 +68,38 @@
68
68
  $ = layui.$;
69
69
  selectInput = layui.selectInput;
70
70
 
71
- var levels_select = xmSelect.render({
72
- el: '#levels',
73
- name: 'level_ids',
74
- data: gon.levels,
75
- on: function(data) {
76
- var is_secret = false;
77
- data.arr.forEach(function(i) {
78
- if (i.name == '战略型' || i.name == '保密型') {
79
- is_secret = true;
71
+ if ($("#levels").length > 0) {
72
+ var levels_select = xmSelect.render({
73
+ el: '#levels',
74
+ name: 'level_ids',
75
+ data: gon.levels,
76
+ on: function(data) {
77
+ var is_secret = false;
78
+ data.arr.forEach(function(i) {
79
+ if (i.name == '战略型' || i.name == '保密型') {
80
+ is_secret = true;
81
+ }
82
+ })
83
+ if (is_secret) {
84
+ $("#watch_ids_wraper").removeClass('layui-hide')
85
+ } else {
86
+ $("#watch_ids_wraper").addClass('layui-hide')
80
87
  }
81
- })
82
- if (is_secret) {
83
- $("#watch_ids_wraper").removeClass('layui-hide')
84
- } else {
85
- $("#watch_ids_wraper").addClass('layui-hide')
86
88
  }
89
+ })
90
+ }
91
+ if ($("#watch_ids").length > 0) {
92
+ var watch_id_select = xmSelect.render({
93
+ el: '#watch_ids',
94
+ name: 'watch_ids',
95
+ data: gon.watche_ids,
96
+ filterable: true,
97
+ })
98
+ if (gon.is_secret) {
99
+ $("#watch_ids_wraper").removeClass("layui-hide")
87
100
  }
88
- })
89
-
90
- var watch_id_select = xmSelect.render({
91
- el: '#watch_ids',
92
- name: 'watch_ids',
93
- data: gon.watche_ids,
94
- filterable: true,
95
- })
96
- if (gon.is_secret) {
97
- $("#watch_ids_wraper").removeClass("layui-hide")
98
101
  }
102
+
99
103
  var source_way = gon.source_way;
100
104
  form.on('select(source_id)', function(data){
101
105
  source_way = data.value;
@@ -162,20 +166,22 @@
162
166
 
163
167
  }
164
168
  });
165
-
166
- var merge_business_select = xmSelect.render({
167
- el: '#merge_business',
168
- filterable: true,
169
- name: 'merge_business_ids',
170
- remoteSearch: true,
171
- remoteMethod: function(val, cb, show){
172
- request.get('missions/businesses/search?id=' + parent.id + "&q=" + val, {},
173
- function(res) {
174
- cb(res.data)
175
- })
176
- },
177
- data: []
178
- })
169
+ if ($("#merge_business").length > 0) {
170
+ var merge_business_select = xmSelect.render({
171
+ el: '#merge_business',
172
+ filterable: true,
173
+ name: 'merge_business_ids',
174
+ remoteSearch: true,
175
+ remoteMethod: function(val, cb, show){
176
+ request.get('missions/businesses/search?id=' + parent.id + "&q=" + val, {},
177
+ function(res) {
178
+ cb(res.data)
179
+ })
180
+ },
181
+ data: []
182
+ })
183
+ }
184
+
179
185
 
180
186
 
181
187
  var sourcable_id = gon.sourcable_id;
@@ -32,6 +32,15 @@ json.data do
32
32
  json.divide_money d.divide_amount
33
33
  json.budget_amount d.budget_amount
34
34
  json.area d.department&.school&.province
35
+
36
+ json.keys_person_count d.last_follow_up.present? ? EducodeSales::KeyPerson.where("follow_up_id = #{d.last_follow_up.id}").count : 0
37
+ json.rival d.last_follow_up&.rival || ''
38
+
39
+ if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
40
+ json.source "#{d.source_way} #{d.sourcable&.name}"
41
+ else
42
+ json.source "#{d.source_way} #{d.sourcable_type}"
43
+ end
35
44
  # school_property = d.department&.school&.school_property
36
45
  # property = []
37
46
 
@@ -91,35 +91,13 @@
91
91
  <input type="text" class="layui-input" id="bidded_date" name="bidded_date" placeholder=" - " autocomplete="off">
92
92
  </div>
93
93
  </div>
94
- <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
95
- <label class="layui-form-label">签单时间</label>
96
- <div class="layui-input-inline">
97
- <input type="text" class="layui-input" id="signed_date" name="signed_date" placeholder=" - " autocomplete="off">
98
- </div>
99
- </div>
100
- <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
101
- <label class="layui-form-label">回款时间</label>
102
- <div class="layui-input-inline">
103
- <input type="text" class="layui-input" id="date_at" name="date_at" placeholder=" - " autocomplete="off">
104
- </div>
105
- </div>
106
94
  <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
107
95
  <label class="layui-form-label">创建时间</label>
108
96
  <div class="layui-input-inline">
109
97
  <input type="text" class="layui-input" id="date" name="date" placeholder=" - " autocomplete="off">
110
98
  </div>
111
99
  </div>
112
- <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
113
- <label class="layui-form-label">部署类型</label>
114
- <div class="layui-input-inline">
115
- <select name="o_business_deployment">
116
- <option value=""></option>
117
- <option value="1">公有云</option>
118
- <option value="2">私有云</option>
119
- <option value="3">混合云</option>
120
- </select>
121
- </div>
122
- </div>
100
+
123
101
  <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
124
102
  <label class="layui-form-label">商机等级</label>
125
103
  <div class="layui-input-inline">
@@ -130,6 +108,15 @@
130
108
  </select>
131
109
  </div>
132
110
  </div>
111
+ <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
112
+ <label class="layui-form-label">商机来源</label>
113
+ <div class="layui-inline">
114
+ <%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id_select' } %>
115
+ </div>
116
+ <div class="layui-inline" style="line-height: 38px;display:none;" id="source_input_wraper">
117
+ <input type="text" class="layui-input" name="source_name" placeholder="" autocomplete="off" id="source_name_input">
118
+ </div>
119
+ </div>
133
120
  <div class="layui-inline show_item" style="<%= params[:name] || params[:type] ? '' : 'display:none;' %>">
134
121
  <label class="layui-form-label">销售经理</label>
135
122
  <div class="layui-input-inline">
@@ -277,19 +264,46 @@
277
264
  range: true,
278
265
  value: gon.bidded_date
279
266
  });
280
- laydate.render({
281
- elem: '#signed_date',
282
- range: true,
283
- value: gon.signed_date
284
- });
267
+
285
268
 
286
- laydate.render({
287
- elem: '#date_at',
288
- range: true,
289
- value: gon.date_at
269
+ form.on('select(source_id_select)', function(data){
270
+ setSourceWay(data.value);
271
+ $("#source_name_input")[0].value = "";
290
272
  });
291
273
 
292
-
274
+
275
+ function setSourceWay(value) {
276
+ if (value == '400电话' || value == '商务邮箱') {
277
+ $("#source_input_wraper").hide()
278
+ } else {
279
+ $("#source_input_wraper").show()
280
+ var text = "";
281
+ switch (value) {
282
+ case '会议活动':
283
+ text = "请选择活动运营";
284
+ break;
285
+ case '公司资源':
286
+ text = "请填写公司领导、部门其他同事姓名";
287
+ break;
288
+ case '渠道代理':
289
+ text = "请选择渠道";
290
+ break;
291
+ case '合作伙伴':
292
+ text = "请填写合作伙伴公司名称";
293
+ break;
294
+ case '招标信息':
295
+ text = "请填写招标信息";
296
+ break;
297
+ case '客户':
298
+ text = "请选择客户";
299
+ break;
300
+ case '朋友':
301
+ text = "请填写姓名";
302
+ break;
303
+ }
304
+ $("#source_name_input")[0].placeholder = text;
305
+ }
306
+ }
293
307
 
294
308
  // $('#businesses_table_wraper .layui-table-body').on('scroll', function(e) {
295
309
  // var leftPx = $(e.target).scrollLeft(); //获取表格body,滚动条距离左边的长度
@@ -478,7 +492,7 @@
478
492
  },
479
493
  {
480
494
  field: 'source',
481
- width: 90,
495
+ width: 150,
482
496
  title: '商机来源',
483
497
  hide: gon.filter.source
484
498
  },
@@ -773,8 +787,6 @@
773
787
  select: data.select,
774
788
  staff_id: data.staff_id,
775
789
  staff_manages: data.staff_manages,
776
- signed_date: data.signed_date,
777
- date_at: data.date_at,
778
790
  bidded_date: data.bidded_date,
779
791
  business_year: data.business_year,
780
792
  year: data.year,
@@ -63,7 +63,12 @@ json.data do
63
63
  json.return_money_days d.last_follow_up&.reception_at.present? && d.last_follow_up.money_plans.where(clazz: '实际回款').present? ? (d.last_follow_up.money_plans.where(clazz: '实际回款').order(created_at: :asc).first.date_at.to_s(:date).to_date - d.last_follow_up&.reception_at).to_i : ''
64
64
  json.place d.last_follow_up&.place&.name
65
65
  json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff&.user&.real_name : d.staff&.user&.real_name
66
- json.source d.source
66
+ if ["会议活动", "渠道代理", "客户"].include?(d.source_way)
67
+ json.source "#{d.source_way} #{d.sourcable&.name}"
68
+ else
69
+ json.source "#{d.source_way} #{d.sourcable_type}"
70
+ end
71
+
67
72
  json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
68
73
  json.current_staff_id @current_admin.id
69
74
  json.staff_id d.staff_id
@@ -14,13 +14,20 @@
14
14
  <a href="/missions/customers" style=" color: #0000FF">添加单位/部门</a>
15
15
  </div>
16
16
  <br>
17
- <div class="layui-inline" style="padding-top: 20px">
17
+ <!-- <div class="layui-inline" style="padding-top: 20px">
18
18
  <label class="layui-form-label ">商机来源</label>
19
19
  <input type="text" name="source" autocomplete="off" class="layui-input" style="width: 300px;" placeholder="请输入商机来源">
20
- </div>
20
+ </div> -->
21
21
  <div class="layui-inline" style="padding-top: 20px">
22
- <p style="padding-left: 40px">请填写提供本商机的人名(如‘张明’);如果为非头歌用户,请增加单位信息(如‘张明,华为公司’)</p>
22
+ <label class="layui-form-label required">商机来源</label>
23
+ <div class="layui-inline">
24
+ <%= select_tag "source_way", options_for_select(EducodeSales::Business.source_ways.keys), { include_blank: true, "lay-filter": 'source_id', "lay-verify": "required" } %>
25
+ </div>
26
+ <div class="layui-inline" style="line-height: 38px;" id="source_wraper">
27
+ <div id="customer_id" style="width: 360px"></div>
28
+ </div>
23
29
  </div>
30
+
24
31
  <br>
25
32
  <div class="layui-inline" style="padding-top: 20px">
26
33
  <label class="layui-form-label required">项目类型</label>
@@ -70,6 +77,85 @@
70
77
  }
71
78
  });
72
79
 
80
+ var source_way = "";
81
+ form.on('select(source_id)', function(data){
82
+ source_way = data.value;
83
+ setSourceWay(data.value);
84
+ $("#" + customer_select._input)[0].value = "";
85
+ });
86
+
87
+
88
+ function setSourceWay(value) {
89
+ if (value == '400电话' || value == '商务邮箱') {
90
+ $("#source_wraper").hide()
91
+ } else {
92
+ $("#source_wraper").show()
93
+ var text = "";
94
+ switch (value) {
95
+ case '会议活动':
96
+ text = "请选择活动运营";
97
+ break;
98
+ case '公司资源':
99
+ text = "请填写公司领导、部门其他同事姓名";
100
+ break;
101
+ case '渠道代理':
102
+ text = "请选择渠道";
103
+ break;
104
+ case '合作伙伴':
105
+ text = "请填写合作伙伴公司名称";
106
+ break;
107
+ case '招标信息':
108
+ text = "请填写招标信息";
109
+ break;
110
+ case '客户':
111
+ text = "请选择客户";
112
+ break;
113
+ case '朋友':
114
+ text = "请填写姓名";
115
+ break;
116
+ }
117
+ $("#" + customer_select._input)[0].placeholder = text;
118
+ }
119
+ }
120
+
121
+ var sourcable_id = "";
122
+ var customer_select = selectInput.render({
123
+ elem: '#customer_id',
124
+ name: 'sourcable_type', // 渲染的input的name值
125
+ layFilter: 'test', //同layui form参数lay-filter
126
+ // layVerify: 'required', //同layui form参数lay-verify
127
+ layVerType: 'tips', // 同layui form参数lay-verType
128
+ layReqText: '请填写文本', //同layui form参数lay-ReqText
129
+ hasSelectIcon: false,
130
+ placeholder: '请输入商机来源', // 渲染的inputplaceholder值
131
+ remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
132
+ remoteMethod: function (value, cb) { // 远程搜索的回调函数
133
+ if (!value) {
134
+ sourcable_id = "";
135
+ return cb([]);
136
+ }
137
+ if (['会议活动', '渠道代理', '客户'].includes(source_way)) {
138
+ var type = "";
139
+ if (source_way == '客户') {
140
+ type = 'customer';
141
+ } else if (source_way == '渠道代理') {
142
+ type = 'place';
143
+ } else if (source_way == '会议活动') {
144
+ type = 'active';
145
+ }
146
+ request.get('missions/search_customer?q=' + value + "&type=" + type, {}, function (res) {
147
+ if (res.data.length == 0) {
148
+ customer_select.emptyValue();
149
+ return cb([])
150
+ }
151
+ return cb(res)
152
+ })
153
+ }
154
+ }
155
+ });
156
+
157
+
158
+
73
159
  // 当前弹出层,防止ID被覆盖
74
160
  var parentIndex = layer.index;
75
161
 
@@ -83,6 +169,9 @@
83
169
  name: data.field.name,
84
170
  source: data.field.source,
85
171
  clazz_id: data.field.clazz_id,
172
+ source_way: data.field.source_way,
173
+ sourcable_type: data.field.sourcable_type,
174
+ sourcable_id: customer_select.getValue() || sourcable_id,
86
175
 
87
176
  }, function (res) {
88
177
  if (res.success == false) {
@@ -34,6 +34,16 @@
34
34
  </span>
35
35
  <!-- <span class="layui-badge layui-bg-green"></span> -->
36
36
  <button type="button" class="layui-btn layui-btn-xs layui-btn-primary add-tag" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>标签设置</button>
37
+
38
+ <br/>
39
+ <br/>
40
+ <span id="assign_<%= f.id %>">
41
+ <% f.watch_follow_ups.each do |d| %>
42
+ <span class="layui-badge layui-bg-green"><%= d.staff&.name %></span>
43
+ <% end %>
44
+ </span>
45
+ <!-- <span class="layui-badge layui-bg-green"></span> -->
46
+ <button type="button" class="layui-btn layui-btn-xs layui-btn-primary assign-staff" data-id="<%= f.id %>"><i class="layui-icon layui-icon-addition"></i>指定人查看</button>
37
47
  </p>
38
48
  </div>
39
49
  </li>
@@ -150,6 +160,28 @@
150
160
  });
151
161
  })
152
162
 
163
+ $(".assign-staff").on("click", function(e) {
164
+ var data = e.currentTarget.dataset;
165
+ follow_up_id = data.id
166
+ var content = miniPage.getHrefContent('/missions/follow_ups/' + follow_up_id + '/add_assign');
167
+ var openWH = miniPage.getOpenWidthHeight();
168
+ tindex = layer.open({
169
+ title: '指定人查看',
170
+ type: 1,
171
+ shade: 0.2,
172
+ maxmin: true,
173
+ shadeClose: true,
174
+ area: ['700px','600px'],
175
+ // offset: [openWH[2] + 'px', openWH[3] + 'px'],
176
+ content: content
177
+ });
178
+ $(window).on("resize", function () {
179
+ layer.full(sindex);
180
+ });
181
+ })
182
+
183
+
184
+
153
185
 
154
186
 
155
187
  });
@@ -0,0 +1,42 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div class="layui-form layuimini-form">
3
+ <div class="layui-form-item" style="padding: 25px">
4
+ <div id="assign_staff"></div>
5
+ <div class="layui-form-item text-center" style="margin-top: 60px;">
6
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="btn">提交</button>
7
+ </div>
8
+ </div>
9
+ </div>
10
+ <script>
11
+ layui.use(['form', 'request', 'xmSelect'], function() {
12
+ var form = layui.form,
13
+ request = layui.request,
14
+ xmSelect = layui.xmSelect,
15
+ $ = layui.$;
16
+
17
+ var place_list = xmSelect.render({
18
+ el: '#assign_staff',
19
+ name: "staff_ids",
20
+ tips: '请选择人员',
21
+ clickClose: true,
22
+ paging: true,
23
+ filterable: true,
24
+ data: gon.assign_watch,
25
+ })
26
+
27
+ form.on("submit(btn)", function(form) {
28
+ request.post('missions/follow_ups/' + parent.follow_up_id + '/update_assign',
29
+ form.field,
30
+ function(res) {
31
+ if (res.success) {
32
+ $("#assign_" + parent.follow_up_id).html("");
33
+ res.tags.forEach(function(tag) {
34
+ $("#assign_" + parent.follow_up_id).append(' <span class="layui-badge layui-bg-green">' + tag + '</span')
35
+ })
36
+ }
37
+ layer.close(tindex);
38
+ })
39
+ })
40
+
41
+ })
42
+ </script>
@@ -1,3 +1,4 @@
1
+ <%= Gon::Base.render_data %>
1
2
  <div style="margin: 10px 10px 10px 10px" id="money_plan_record">
2
3
  <form class="layui-form layui-form-pane" lay-filter="submit_form_record">
3
4
  <div class="layui-form-item">
@@ -52,13 +53,13 @@
52
53
  </script>
53
54
 
54
55
  <script type="text/html" id="currentTableBarmoney_record">
55
- <% if can? :update_record, EducodeSales::MoneyPlan %>
56
+ {{# if (gon.edit_record || d.staff_id == gon.staff_id && gon.edit_record_self) {}}
56
57
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
57
- <% end %>
58
+ {{# }}}
58
59
  <% if can? :delete_update_record, EducodeSales::MoneyPlan %>
59
60
  <a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
60
61
  <% end %>
61
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="confirm">认领回款</a>
62
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="confirm">认领回款</a>
62
63
  </script>
63
64
 
64
65
  <script>
@@ -10,6 +10,7 @@ json.data do
10
10
  json.school d.business&.school&.name
11
11
  json.school_id d.business&.school_id
12
12
  json.staff d.staff.user.real_name
13
+ json.staff_id d.staff_id
13
14
  json.number d.business&.number
14
15
  json.payer_name d.payer_name
15
16
  if d['claim_num'] > 0
@@ -1,3 +1,4 @@
1
+ <%= Gon::Base.render_data %>
1
2
  <div style="margin: 10px 10px 10px 10px" id="money_plan_list">
2
3
  <form class="layui-form layui-form-pane" lay-filter="search_plans">
3
4
  <div class="layui-form-item">
@@ -23,7 +24,9 @@
23
24
  </form>
24
25
  </div>
25
26
  <script type="text/html" id="toolbar_money_plan">
27
+ <% if can? :create, EducodeSales::MoneyPlan %>
26
28
  <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" style="margin-left: 20px;" lay-event="addMoney">添加回款计划</button>
29
+ <% end %>
27
30
  </script>
28
31
 
29
32
  <table class="layui-hide" id="money_plan_table" lay-filter="money_plan_table"></table>
@@ -32,9 +35,13 @@
32
35
  <a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
33
36
  </script>
34
37
  <script type="text/html" id="currentTableBarmoney_plan">
38
+ {{# if (gon.edit_money_plan || d.staff_id == gon.staff_id && gon.edit_money_plan_self) {}}
35
39
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
40
+ {{# }}}
41
+ <% if can? :delete, EducodeSales::MoneyPlan %>
36
42
  <a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
37
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
43
+ <% end %>
44
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
38
45
  <!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a> -->
39
46
 
40
47
  </script>
@@ -11,6 +11,7 @@ json.data do
11
11
  json.school d.business.school.name
12
12
  json.school_id d.business.school_id
13
13
  json.staff d.staff.user.real_name
14
+ json.staff_id d.staff_id
14
15
  json.number d.business.number
15
16
  json.category d.category || ''
16
17
  json.payment_clause d.payment_clause
data/config/routes.rb CHANGED
@@ -157,6 +157,8 @@ EducodeSales::Engine.routes.draw do
157
157
  get :upload_file
158
158
  get :add_tag
159
159
  post :update_tags
160
+ get :add_assign
161
+ post :update_assign
160
162
  end
161
163
  end
162
164
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '1.10.8'
2
+ VERSION = '1.10.9'
3
3
  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: 1.10.8
4
+ version: 1.10.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-15 00:00:00.000000000 Z
11
+ date: 2023-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -364,6 +364,7 @@ files:
364
364
  - app/views/educode_sales/customers/show_follow.json.jbuilder
365
365
  - app/views/educode_sales/customers/show_follow_record.html.erb
366
366
  - app/views/educode_sales/customers/show_majors.html.erb
367
+ - app/views/educode_sales/follow_ups/add_assign.html.erb
367
368
  - app/views/educode_sales/follow_ups/add_tag.html.erb
368
369
  - app/views/educode_sales/follow_ups/file.html.erb
369
370
  - app/views/educode_sales/follow_ups/index.json.jbuilder