educode_sales 1.10.8 → 1.10.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/businesses_controller.rb +46 -1
  3. data/app/controllers/educode_sales/contracts_controller.rb +5 -1
  4. data/app/controllers/educode_sales/customers_controller.rb +10 -2
  5. data/app/controllers/educode_sales/follow_ups_controller.rb +29 -6
  6. data/app/controllers/educode_sales/money_plan_records_controller.rb +34 -0
  7. data/app/controllers/educode_sales/money_plans_controller.rb +8 -0
  8. data/app/models/educode_sales/follow_up.rb +2 -0
  9. data/app/views/educode_sales/assessments/_attendances.html.erb +12 -4
  10. data/app/views/educode_sales/assessments/index.html.erb +3 -1
  11. data/app/views/educode_sales/businesses/edit.html.erb +44 -38
  12. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +9 -0
  13. data/app/views/educode_sales/businesses/index.html.erb +48 -36
  14. data/app/views/educode_sales/businesses/index.json.jbuilder +6 -1
  15. data/app/views/educode_sales/businesses/new.html.erb +92 -3
  16. data/app/views/educode_sales/businesses/time_line.html.erb +32 -0
  17. data/app/views/educode_sales/contracts/new_follow_up.html.erb +7 -0
  18. data/app/views/educode_sales/customers/list.json.jbuilder +3 -3
  19. data/app/views/educode_sales/follow_ups/add_assign.html.erb +42 -0
  20. data/app/views/educode_sales/money_plan_records/_index.html.erb +4 -3
  21. data/app/views/educode_sales/money_plan_records/index.json.jbuilder +1 -0
  22. data/app/views/educode_sales/money_plans/_index.html.erb +8 -1
  23. data/app/views/educode_sales/money_plans/index.json.jbuilder +1 -0
  24. data/config/routes.rb +2 -0
  25. data/lib/educode_sales/version.rb +1 -1
  26. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93a3c4bdda6df52bc58177a34c5a39c7330d04d9cbaf4a5d4f4bbe3691d72759
4
- data.tar.gz: dd64cb53bd80774ab02cdbd72a94b5684a827c47bd1d5aa51698b1183dbb758e
3
+ metadata.gz: 8b14ccbfcb9a5061855ca86be07cacb97c60b4775dcfa2a5df9e43ffdef76d7a
4
+ data.tar.gz: 586ddfdcefed79700eb15c20ccba6b73dbe6ecee3fd12f808d614d843959f536
5
5
  SHA512:
6
- metadata.gz: 19f7047b112cad5d0f53580aed23fe2fb65955d7418dd28169d7da3c6a5b96c0a30f14485a5b644961deb734b9fb0c59b968c38a5af6920409cdd2143e0de2d7
7
- data.tar.gz: 4e3e0da1a8d21ed9d8cdb8cf8a3970dfa5ce554f8f87ad8b8dc30bc19248b63d555bc7ac0b52de91740753ac3ffa93c8b01b6ab9c1b8c415afaa584ca807d20f
6
+ metadata.gz: fd7f2559d5a6ea7a69482dc0d4cae776e338bcaa99a30b0c303248d5f69abccfbeaf051dc3cbfcfa5b608cf718b7cef989b211f6eef52d4f3b98433b267112fb
7
+ data.tar.gz: 4c04378292d11f37b2e9c29061470fcec8920c4245bdf7b3c77839e309a20f22b7d6c4ae767a2cf4d4bc37b4d693379464edfbda526b562410a5befb3837a340
@@ -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
@@ -344,6 +344,10 @@ module EducodeSales
344
344
  if i == 1 && last_follow_up
345
345
  # 验收时间
346
346
  last_follow_up.reception_at = v
347
+ elsif i == 0 && last_follow_up
348
+ # 合同部署时间
349
+ last_follow_up.deploy_time = v
350
+ @business.p_deploy_time = v
347
351
  end
348
352
  end
349
353
 
@@ -523,7 +527,7 @@ module EducodeSales
523
527
 
524
528
  private
525
529
  def follow_up_params
526
- params.permit(:o_business_deployment, :plan_signed_date, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
530
+ params.permit(:o_business_deployment, :plan_signed_date, :actual_amount, :bidded_days, :signed_date, :signed_department_id, :service_years, :service_start_time, :service_end_time, :funding_source, :signed_clazz)
527
531
  end
528
532
 
529
533
  def product_up_params
@@ -221,11 +221,17 @@ module EducodeSales
221
221
  s.major_count,
222
222
  s.department_id,
223
223
  departments.name AS department_name,
224
- (SELECT COUNT(user_extensions.id) FROM user_extensions WHERE user_extensions.department_id = s.department_id AND user_extensions.identity = 0) AS teacher_count,
225
- (SELECT COUNT(user_extensions.id) FROM user_extensions WHERE user_extensions.department_id = s.department_id AND user_extensions.identity = 1) AS student_count
224
+ t.teacher_count,
225
+ t.student_count
226
226
  ").joins("
227
227
  JOIN schools ON s.id = schools.id
228
228
  LEFT JOIN departments ON s.department_id = departments.id
229
+ LEFT JOIN (
230
+ SELECT COUNT(IF(user_extensions.identity = 0, user_extensions.id, 0)) AS teacher_count,
231
+ COUNT(IF(user_extensions.identity = 1, user_extensions.id, 1)) AS student_count, user_extensions.department_id
232
+ FROM user_extensions
233
+ GROUP BY user_extensions.department_id
234
+ ) AS t ON t.department_id = s.department_id
229
235
  ")
230
236
 
231
237
  # part_a_ids = CustomerFollow.all.pluck(:school_id)
@@ -271,6 +277,8 @@ module EducodeSales
271
277
  @customers = @customers.where(id: school_ids)
272
278
  end
273
279
 
280
+ @count = School.joins("LEFT JOIN departments ON schools.id = departments.school_id").count
281
+
274
282
  if params[:page].present?
275
283
  @customers = @customers.order(id: :desc).page(params[:page]).per(params[:limit])
276
284
  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")
@@ -132,6 +136,36 @@ module EducodeSales
132
136
  if business
133
137
  money_plan_record.update(business_id: business.id)
134
138
  business.update(return_money: claim.money_plan.money_plan_claims.sum(:amount))
139
+
140
+
141
+ # # 生成跟进信息
142
+ # last_follow_up = business.last_follow_up
143
+ # if last_follow_up.present?
144
+ # follow_up = last_follow_up.dup
145
+
146
+ # follow_up.description = "认领了回款记录"
147
+
148
+ # follow_up.staff = @current_admin
149
+
150
+ # last_follow_up.assign_follow_ups.each do |d|
151
+ # follow_up.assign_follow_ups.build(staff_id: d.staff_id)
152
+ # end
153
+
154
+ # if follow_up.save!
155
+ # last_follow_up.key_person.each do |d|
156
+ # key_person = d.dup
157
+ # key_person.follow_up_id = follow_up.id
158
+ # key_person.save
159
+ # end
160
+ # last_follow_up.money_plans.each do |d|
161
+ # d.follow_up_id = follow_up.id
162
+ # d.save
163
+ # end
164
+ # business.update(last_follow_up_id: follow_up.id)
165
+ # end
166
+ # end
167
+
168
+
135
169
  end
136
170
  end
137
171
  render_success
@@ -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
  });
@@ -97,6 +97,13 @@
97
97
  <%= select_tag "funding_source", options_for_select([''] + EducodeSales::FollowUp::funding_sources.keys, @last_follow_up&.funding_source), class: 'required' %>
98
98
  </div>
99
99
  </div>
100
+ <div class="layui-inline">
101
+ <label class="layui-form-label">合同额(万)</label>
102
+ <div class="layui-input-inline">
103
+ <input name="actual_amount" type="number" class="layui-input" autocomplete="off" placeholder="本单位的签单金额"
104
+ value="<%= @last_follow_up&.actual_amount.to_f.round(6) %>">
105
+ </div>
106
+ </div>
100
107
  <br>
101
108
  <h2 style="padding-left:20px;margin-top: 25px;">签单</h2>
102
109
  <hr>
@@ -48,12 +48,12 @@ json.data do
48
48
  json.department d['department_name'] || ''
49
49
  json.major_count d['major_count']
50
50
  json.department_id d['department_id'] || ''
51
- json.teacher_counts d['teacher_count']
52
- json.student_counts d['student_count']
51
+ json.teacher_counts d['teacher_count'] || 0
52
+ json.student_counts d['student_count'] || 0
53
53
  end
54
54
  end
55
55
 
56
56
  json.code 0
57
57
  if params[:page].present?
58
- json.count @customers.total_count
58
+ json.count @count
59
59
  end
@@ -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.10'
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.10
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-17 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
@@ -758,7 +759,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
758
759
  - !ruby/object:Gem::Version
759
760
  version: '0'
760
761
  requirements: []
761
- rubygems_version: 3.0.0
762
+ rubygems_version: 3.0.9
762
763
  signing_key:
763
764
  specification_version: 4
764
765
  summary: Summary of EducodeSales.