educode_sales 1.0.8 → 1.10.0

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: ef71df95ea9c88505726ebebc6ac92e8c6b801a561119b609858b9ab75be5294
4
- data.tar.gz: 36fc9cc01c16282483406e3756aebfcc6b6284d30777e75bbfcb9d9b8ea9a707
3
+ metadata.gz: 00f95a116861234dd0fca5a1714c085e1bec0bddc43a23eb887d52486ac72d16
4
+ data.tar.gz: 771c88244cbf37b3521d6ca60d9571d10bc22d90ae698ebf885608aeb4560a59
5
5
  SHA512:
6
- metadata.gz: e1fa0c0044b71f1b3c0405236489df57d2c26e3a7d8e27f90f65e8617a604c1bb4a95180ef4926c35c930021f02724b94b348ec5e8e2222411e136a9409c81ae
7
- data.tar.gz: a94080334e4e9e20a0a17db31f13fb41df5423e43ea3864953bc1b08b4b1e38e9497fd38a01542263e769886d6f6eb9c355614d4182940d3e360281d5b0066c2
6
+ metadata.gz: 9a81d2f314ed6071cf408581e4725e337fdfcca85873d90945b6fd2b26016437b497c91e34ddfc41deb0602898d150572b7f4a5cf13e4189fb50d9b7414863aa
7
+ data.tar.gz: 5dfc28b6e674a4241e2c2e717d84fc2b6cf3d3825794d96be7edbb771718cab0841ee055a87b6df43a40b6c97ba1b4d61b280d9184c1e8b4cee44d64c19dfb63
@@ -70,6 +70,8 @@ module EducodeSales
70
70
  gon.menus << { title: '添加年计划', event: 'year' }
71
71
  end
72
72
 
73
+ gon.menus << { title: '添加回款计划', event: 'money_plan' }
74
+
73
75
  gon.menus << { title: '关注', event: 'following' }
74
76
  gon.menus << { title: '跟进时间线', event: 'time_line' }
75
77
  if can?(:show_file, EducodeSales::Business)
@@ -348,9 +348,9 @@ module EducodeSales
348
348
  end
349
349
 
350
350
  end
351
- data.each do |d|
352
- d.select! { |d| d.delete_if{|f| f == ''}.present? }
353
- end
351
+ # data.each do |d|
352
+ # d.select! { |d| d.delete_if{|f| f == ''}.present? }
353
+ # end
354
354
 
355
355
  follow_up = last_follow_up.dup
356
356
 
@@ -80,7 +80,7 @@ module EducodeSales
80
80
  def search_contracts
81
81
  @data = Business
82
82
  if params[:q].present?
83
- @data = @data.where("name like :q ", q: "%#{params[:q]}%").limit(20)
83
+ @data = @data.joins(:school).where("educode_sales_businesses.name like :q OR educode_sales_businesses.number like :q OR schools.name like :q ", q: "%#{params[:q]}%").limit(20)
84
84
  end
85
85
  end
86
86
 
@@ -108,6 +108,11 @@ module EducodeSales
108
108
  claim.amount = params["amount[#{i}]"]
109
109
  claim.staff = @current_admin
110
110
  claim.save
111
+ business = claim.money_plan.business
112
+ if business
113
+ money_plan_record.update(business_id: business.id)
114
+ business.update(return_money: claim.money_plan.money_plan_claims.sum(:amount))
115
+ end
111
116
  end
112
117
 
113
118
  render_success
@@ -42,7 +42,7 @@ module EducodeSales
42
42
  end
43
43
 
44
44
  def list
45
- follow_up_ids = Business.pluck(:last_follow_up_id)
45
+ # follow_up_ids = Business.pluck(:last_follow_up_id)
46
46
  authorize! :read, MoneyPlan
47
47
  respond_to do |format|
48
48
  format.html do
@@ -54,9 +54,31 @@ module EducodeSales
54
54
  end
55
55
 
56
56
  def add
57
+ if params[:business_id].present?
58
+ @business = Business.find(params[:business_id])
59
+ gon.business_id_source = @business.id
60
+ else
61
+ gon.business_id_source = ""
62
+ end
63
+ render layout: false
64
+ end
65
+
66
+ def edit
67
+ @money_plan = MoneyPlan.find(params[:id])
68
+ gon.business_id = @money_plan.business_id
69
+ gon.business = [{value: @money_plan.business_id.to_s, name: @money_plan.business&.name}]
57
70
  render layout: false
58
71
  end
59
72
 
73
+ def update
74
+ @money_plan = MoneyPlan.find(params[:id])
75
+ if @money_plan.update(money_plan_params)
76
+ render_success
77
+ else
78
+ render_failure @money_plan
79
+ end
80
+ end
81
+
60
82
  def create
61
83
  business = Business.find(params[:business_id])
62
84
  data = []
@@ -66,5 +88,16 @@ module EducodeSales
66
88
  render_success
67
89
  end
68
90
 
91
+ def destroy
92
+ money_plan = MoneyPlan.find(params[:id])
93
+ money_plan.destroy
94
+ render_success
95
+ end
96
+
97
+ private
98
+ def money_plan_params
99
+ params.permit(:category, :amount, :payment_clause, :date_at)
100
+ end
101
+
69
102
  end
70
103
  end
@@ -166,7 +166,8 @@ module EducodeSales
166
166
  if params[:q].present? && params[:q][:staff_manage].present?
167
167
  staff = Staff.find(params[:q][:staff_manage])
168
168
  school_ids = School.where(province: staff.areas.pluck(:name)).pluck(:id)
169
- teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?)", school_ids).pluck(:id)
169
+ assign_teacher_ids = EducodeSales::AssignStaff.where("educode_sales_assign_staffs.sourcable_type = 'EducodeSales::Teacher' and educode_sales_assign_staffs.staff_id = ?", params[:q][:staff_manage]).pluck(:sourcable_id)
170
+ teacher_ids = EducodeSales::Teacher.joins("JOIN departments ON educode_sales_teachers.department_id = departments.id").where("departments.school_id in (?)", school_ids).pluck(:id) + assign_teacher_ids
170
171
  @teachers = @teachers.where(id: teacher_ids)
171
172
  end
172
173
 
@@ -426,6 +427,28 @@ module EducodeSales
426
427
  render layout: false
427
428
  end
428
429
 
430
+ #获取该教师所指派生态经理
431
+ def assign
432
+ role = Role.find_by( name: '生态经理')
433
+ staffs = Staff.joins(:user).where(role_id: role.id)
434
+ teacher = Teacher.find(params[:id])
435
+ selected_staff_ids = teacher.assign_staffs.pluck(:staff_id)
436
+ gon.staff_manages = staffs.map { |d| {name: d.user.real_name, value: d.id, selected: selected_staff_ids.include?(d.id)} }
437
+ render layout: false
438
+ end
439
+
440
+ #指派生态经理
441
+ def assign_staff
442
+ @teacher = EducodeSales::Teacher.find(params[:id])
443
+ assign_staffs = []
444
+ params[:to_id].split(",").each do |i|
445
+ assign_staffs << AssignStaff.find_or_initialize_by(sourcable_id: @teacher.id, staff_id: i, sourcable_type: "EducodeSales::Teacher")
446
+ end
447
+ @teacher.assign_staffs = assign_staffs
448
+ @teacher.save
449
+ render_success
450
+ end
451
+
429
452
  private
430
453
  def teacher_params
431
454
  params.permit(:name, :professional_title, :job, :source_id, :wechat, :mobile, :realname)
@@ -4,7 +4,7 @@ module EducodeSales
4
4
  belongs_to :business
5
5
  belongs_to :follow_up, counter_cache: true
6
6
 
7
- has_many :money_plan_claims
7
+ has_many :money_plan_claims, dependent: :destroy
8
8
 
9
9
  # todo 1 :实际回款 0:计划回款
10
10
  enum clazz: ['计划回款', '实际回款']
@@ -31,6 +31,7 @@ module EducodeSales
31
31
 
32
32
  has_many :market_areas, dependent: :destroy
33
33
  has_many :areas, through: :market_areas
34
+ has_many :assign_staffs, :class_name => 'EducodeSales::AssignStaff', dependent: :destroy
34
35
  validates :user_id, uniqueness: { message: '已存在' }
35
36
 
36
37
  # attr_writer :month
@@ -1,5 +1,6 @@
1
1
  module EducodeSales
2
2
  class Teacher < ApplicationRecord
3
+ has_many :assign_staffs, as: :sourcable, dependent: :destroy #生态经理
3
4
  has_many :activity_teachers, dependent: :destroy
4
5
  has_many :activities, through: :activity_teachers
5
6
  has_many :teacher_follows, dependent: :destroy
@@ -397,13 +397,7 @@
397
397
  totalRowText: '合计',
398
398
  fixed: "left"
399
399
  },
400
- {
401
- field: 'number',
402
- width: 120,
403
- title: '编号',
404
- fixed: 'left',
405
- hide: gon.filter.number
406
- },
400
+
407
401
  {
408
402
  field: 'name',
409
403
  width: 170,
@@ -522,48 +516,12 @@
522
516
  hide: gon.filter.invitation_at
523
517
  },
524
518
  {
525
- field: 'bidded_date',
526
- width: 105,
527
- title: '中标时间',
528
- sort: true,
529
- hide: gon.filter.bidded_date
530
- },
531
- {
532
- field: 'signed_date',
533
- width: 105,
534
- title: '签单时间',
535
- sort: true,
536
- hide: gon.filter.signed_date
537
- },
538
- {
539
- field: 'reception_at',
540
- width: 105,
541
- title: '验收时间',
542
- sort: true,
543
- hide: gon.filter.reception_at
544
- },
545
- {
546
- field: 'service_end_time',
547
- width: 200,
548
- title: '服务期',
549
- sort: true,
550
- hide: gon.filter.service_end_time
551
- },
552
- {
553
- field: 'o_business_deployment',
554
- width: 150,
555
- title: '部署类型',
556
- sort: true,
557
- hide: gon.filter.o_business_deployment
558
- },
559
- {
560
- field: 'p_deploy_time',
561
- width: 150,
562
- title: '部署时间',
563
- sort: true,
564
- hide: gon.filter.p_deploy_time
519
+ field: 'bidded_date',
520
+ width: 105,
521
+ title: '中标时间',
522
+ sort: true,
523
+ hide: gon.filter.bidded_date
565
524
  },
566
-
567
525
  {
568
526
  field: 'budget_amount',
569
527
  width: 105,
@@ -573,42 +531,12 @@
573
531
  hide: gon.filter.budget_amount
574
532
  },
575
533
  {
576
- field: 'total_amount',
577
- width: 100,
578
- title: '中标额',
579
- totalRow: true,
580
- sort: true,
581
- hide: gon.filter.total_amount
582
- },
583
- {
584
- field: 'actual_amount',
585
- width: 100,
586
- title: '合同额',
587
- totalRow: true,
588
- sort: true,
589
- hide: gon.filter.actual_amount
590
- },
591
- {
592
- field: 'return_money',
593
- width: 100,
594
- title: '回款',
595
- sort: true,
596
- totalRow: true,
597
- hide: gon.filter.return_money
598
- },
599
- {
600
- field: 'wait_return_money',
601
- width: 100,
602
- title: '待回款',
603
- sort: true,
604
- totalRow: true,
605
- hide: gon.filter.wait_return_money
606
- },
607
- {
608
- field: 'return_money_days',
609
- width: 150,
610
- title: '首次回款周期(天)',
611
- hide: gon.filter.return_money_days
534
+ field: 'total_amount',
535
+ width: 100,
536
+ title: '中标额',
537
+ totalRow: true,
538
+ sort: true,
539
+ hide: gon.filter.total_amount
612
540
  },
613
541
  {
614
542
  field: 'divide_rate',
@@ -617,13 +545,7 @@
617
545
  sort: true,
618
546
  hide: gon.filter.divide_rate
619
547
  },
620
- {
621
- field: 'divide_money',
622
- width: 160,
623
- title: '渠道分成金额',
624
- sort: true,
625
- hide: gon.filter.divide_money
626
- },
548
+
627
549
  {
628
550
  field: 'place',
629
551
  width: 160,
@@ -751,6 +673,9 @@
751
673
  case 'following':
752
674
  following(id);
753
675
  break;
676
+ case 'money_plan':
677
+ money_plan(id);
678
+ break;
754
679
  }
755
680
  }
756
681
  });
@@ -786,6 +711,9 @@
786
711
  case 'following':
787
712
  following(id);
788
713
  break;
714
+ case 'money_plan':
715
+ money_plan(id);
716
+ break;
789
717
  }
790
718
  }
791
719
  });
@@ -808,7 +736,9 @@
808
736
  case 'export_records':
809
737
  export_records();
810
738
  break;
739
+
811
740
  }
741
+
812
742
  }
813
743
  });
814
744
  }
@@ -1005,6 +935,24 @@
1005
935
  });
1006
936
  }
1007
937
 
938
+ function money_plan(business_id) {
939
+ var content = miniPage.getHrefContent('/missions/money_plans/add?business_id=' + business_id);
940
+ var openWH = miniPage.getOpenWidthHeight();
941
+ sindex = layer.open({
942
+ title: '添加回款计划',
943
+ type: 1,
944
+ shade: 0.2,
945
+ maxmin: true,
946
+ shadeClose: true,
947
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
948
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
949
+ content: content,
950
+ });
951
+ $(window).on("resize", function () {
952
+ layer.full(sindex);
953
+ });
954
+ }
955
+
1008
956
  function month(id) {
1009
957
  var content = miniPage.getHrefContent('/missions/plans/new_month?business_id=' + id);
1010
958
  var openWH = miniPage.getOpenWidthHeight();
@@ -23,7 +23,7 @@ json.data do
23
23
  json.staff d.staff.user.real_name
24
24
  json.place d.place&.name
25
25
  json.money_plans_count d.money_plans_count
26
- json.money d.money_plans.where(clazz: 1).sum(:amount).round(2)
26
+ json.money d.money_plans.sum(:amount).round(2)
27
27
  json.is_latest d.id == @latest&.id
28
28
  json.flag d.created_at.present? ? (Time.now - d.created_at).to_f/3600 < 24 : false
29
29
  json.description d.description
@@ -1,7 +1,7 @@
1
1
  json.data do
2
2
  json.array! @data do |d|
3
3
  json.value d.id
4
- json.name "#{d.business.number} / #{d.business.department&.school&.name.to_s}#{d.business.department&.name.to_s} / #{d.business.name} / #{d.business.last_follow_up&.actual_amount}万 / #{d.date_at.to_s(:date)}"
4
+ json.name "#{d.business.number} / #{d.business.department&.school&.name.to_s}#{d.business.department&.name.to_s} / #{d.business.name} / #{d.business.last_follow_up&.actual_amount}万 / #{d.business.last_follow_up&.return_money}万 /#{d.date_at.to_s(:date)}"
5
5
  end
6
6
  end
7
7
  json.count @data.size
@@ -2,7 +2,7 @@
2
2
  <form class="layui-form layui-form-pane" lay-filter="search_plans">
3
3
  <div class="layui-form-item">
4
4
  <div class="layui-inline">
5
- <label class="layui-form-label">合同名称</label>
5
+ <label class="layui-form-label">商机名称</label>
6
6
  <div class="layui-input-inline">
7
7
  <input type="text" name="business" class="layui-input">
8
8
  </div>
@@ -32,6 +32,8 @@
32
32
  <a href="<%= base_url%>/colleges/{{d.school_id}}/statistics" class="layui-table-link" target="_blank">{{ d.school }}</a>
33
33
  </script>
34
34
  <script type="text/html" id="currentTableBarmoney_plan">
35
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
36
+ <a class="layui-btn layui-btn-danger layui-btn-xs data-count-edit" lay-event="delete">删除</a>
35
37
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="apply">开票申请</a>
36
38
  <!-- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">催款提醒</a> -->
37
39
 
@@ -75,7 +77,7 @@
75
77
  }, {
76
78
  field: 'business_name',
77
79
  width: 150,
78
- title: '合同名称'
80
+ title: '商机名称'
79
81
  }, {
80
82
  field: 'school',
81
83
  width: 180,
@@ -125,10 +127,11 @@
125
127
  field: 'busireceipt_state',
126
128
  width: 120,
127
129
  title: '开票状态',
128
- }, {
130
+ }, {
129
131
  field: 'created_at',
130
132
  width: 170,
131
133
  title: '添加计划时间',
134
+ sort: true,
132
135
  }, {
133
136
  title: '操作',
134
137
  minWidth: 200,
@@ -173,12 +176,7 @@
173
176
 
174
177
  form.on('submit(reset_business_search)', function(data) {
175
178
  var field = data.field;
176
- form.val('search_teachers', {
177
- area: "",
178
- date: "",
179
- staff_id: "",
180
- clazz: "",
181
- professional_title: "",
179
+ form.val('search_plans', {
182
180
  school: "",
183
181
  business: ""
184
182
  });
@@ -228,6 +226,29 @@
228
226
  $(window).on("resize", function() {
229
227
  layer.full(sindex);
230
228
  });
229
+ } else if (obj.event === 'edit') {
230
+ var content = miniPage.getHrefContent('/missions/money_plans/' + data.id + '/edit')
231
+ var openWH = miniPage.getOpenWidthHeight();
232
+ sindex = layer.open({
233
+ title: '编辑回款计划',
234
+ type: 1,
235
+ shade: 0.2,
236
+ maxmin: true,
237
+ shadeClose: true,
238
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
239
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
240
+ content: content
241
+ });
242
+ $(window).on("resize", function() {
243
+ layer.full(sindex);
244
+ });
245
+ } else if (obj.event == 'delete') {
246
+ layer.confirm('确定删除商机' + data.business_name + "的回款计划", function (index) {
247
+ request.delete('missions/money_plans/' + data.id, {}, function (res) {
248
+ layer.close(index);
249
+ table.reload("money_plan_table");
250
+ })
251
+ });
231
252
  }
232
253
  });
233
254
 
@@ -1,10 +1,18 @@
1
+ <%= Gon::Base.render_data %>
1
2
  <div style="padding:10px">
2
3
  <div class="layui-form layuimini-form" lay-filter="searchform">
3
4
  <div class="layui-form-item">
4
- <label class="layui-form-label required" style="width: 80px !important;">合同名称:</label>
5
+ <label class="layui-form-label required" style="width: 80px !important;">商机名称:</label>
6
+ <% if @business.present? %>
7
+ <div class="layui-input-inline" style="line-height: 38px;">
8
+ <%= @business.name %>
9
+ </div>
10
+ <% else %>
5
11
  <div class="layui-input-inline">
6
12
  <div id="business" style="width:600px;"></div>
7
13
  </div>
14
+ <% end %>
15
+
8
16
  </div>
9
17
  <div class="layui-form-item">
10
18
  <div class="layui-inline">
@@ -22,7 +30,7 @@
22
30
  <div class="layui-inline">
23
31
  <label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
24
32
  <div class="layui-input-inline">
25
- <input type="text" name="date_at[0]" value="" class="layui-input" lay-verify="required" id="date_at">
33
+ <input type="text" name="date_at[0]" value="" class="layui-input" lay-verify="required" id="money_plan_date_at">
26
34
  </div>
27
35
  </div>
28
36
  <div class="layui-inline">
@@ -86,19 +94,22 @@
86
94
  form.render();
87
95
 
88
96
  laydate.render({
89
- elem: '#date_at',
97
+ elem: '#money_plan_date_at',
90
98
  });
91
99
 
92
-
93
- var business_id = "";
94
- var business_select = selectInput.render({
100
+
101
+ if (gon.business_id_source) {
102
+ var business_id = gon.business_id_source;
103
+ } else {
104
+ var business_id = "";
105
+ var business_select = selectInput.render({
95
106
  elem: '#business',
96
107
  name: 'bussiness_name', // 渲染的input的name值
97
108
  layFilter: 'test', //同layui form参数lay-filter
98
109
  layVerType: 'tips', // 同layui form参数lay-verType
99
110
  layReqText: '请填写文本', //同layui form参数lay-ReqText
100
111
  hasSelectIcon: false,
101
- placeholder: '请输入合同名称', // 渲染的inputplaceholder值
112
+ placeholder: '请输入商机名称、客户名称或合同编号', // 渲染的inputplaceholder值
102
113
  remoteSearch: true, // 是否启用远程搜索 默认是false,和远程搜索回调保存同步
103
114
  remoteMethod: function (value, cb) { // 远程搜索的回调函数
104
115
  if (!value) {
@@ -114,7 +125,7 @@
114
125
  })
115
126
  }
116
127
  });
117
-
128
+ }
118
129
 
119
130
  var num = 0;
120
131
  $("#addInput").on("click", function() {
@@ -132,7 +143,12 @@
132
143
 
133
144
  form.on('submit(saveBtn)', function(data) {
134
145
  data.field.num = num;
135
- data.field.business_id = business_select.getValue() || business_id;
146
+ if (gon.business_id_source == "") {
147
+ data.field.business_id = business_select.getValue() || business_id;
148
+ } else {
149
+ data.field.business_id = business_id;
150
+ }
151
+
136
152
  if (data.field.business_id == '') {
137
153
  layer.msg('请选择合同')
138
154
  return false;
@@ -0,0 +1,80 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div style="padding:10px">
3
+ <div class="layui-form layuimini-form" lay-filter="searchform">
4
+ <div class="layui-form-item">
5
+ <label class="layui-form-label required" style="width: 80px !important;">商机名称:</label>
6
+ <div class="layui-input-inline">
7
+ <%= hidden_field_tag :id, @money_plan.id %>
8
+ <div id="business" style="line-height:38px;">
9
+ <%= @money_plan.business.name %>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ <div class="layui-form-item">
14
+ <div class="layui-inline">
15
+ <label class="layui-form-label required">回款类别:</label>
16
+ <div class="layui-input-inline">
17
+ <%= select_tag "category", options_for_select(EducodeSales::MoneyPlan.categories.keys, @money_plan.category), { 'lay-filter': 'category', 'lay-verify': "required", include_blank: true, "lay-search": "" } %>
18
+ </div>
19
+ </div>
20
+ <div class="layui-inline">
21
+ <label class="layui-form-label required" style="width:50px;">金额:</label>
22
+ <div class="layui-input-inline">
23
+ <input type="text" name="amount" value="<%= @money_plan.amount %>" class="layui-input" lay-verify="required">
24
+ </div>
25
+ </div>
26
+ <div class="layui-inline">
27
+ <label class="layui-form-label required" style="width: 110px;">计划回款时间:</label>
28
+ <div class="layui-input-inline">
29
+ <input type="text" name="date_at" value="<%= @money_plan.date_at.to_s(:date) %>" class="layui-input" lay-verify="required" id="date_at">
30
+ </div>
31
+ </div>
32
+ <div class="layui-inline">
33
+ <label class="layui-form-label">付款条件:</label>
34
+ <div class="layui-input-inline">
35
+ <input type="text" name="payment_clause" value="<%= @money_plan.payment_clause %>" class="layui-input">
36
+ </div>
37
+ </div>
38
+ </div>
39
+ <div class="layui-form-item">
40
+ <div class="layui-input-block">
41
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">保存</button>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <script>
48
+
49
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'laydate', 'selectInput'], function() {
50
+ var form = layui.form,
51
+ layer = layui.layer,
52
+ table = layui.table,
53
+ laydate = layui.laydate,
54
+ laytpl = layui.laytpl,
55
+ request = layui.request,
56
+ selectInput = layui.selectInput,
57
+ $ = layui.$;
58
+ form.render();
59
+
60
+ laydate.render({
61
+ elem: '#date_at',
62
+ });
63
+
64
+
65
+ var business_id = gon.business_id;
66
+
67
+ form.on('submit(saveBtn)', function(data) {
68
+ data.field.business_id = business_id;
69
+ if (data.field.business_id == '') {
70
+ layer.msg('请选择合同')
71
+ return false;
72
+ }
73
+ request.put("missions/money_plans/" + data.field.id, data.field, function(res) {
74
+ layer.close(parent.sindex)
75
+ parent.table.reload('money_plan_table')
76
+ })
77
+ return false;
78
+ });
79
+ });
80
+ </script>
@@ -122,6 +122,7 @@
122
122
  <% if can? :create, EducodeSales::TeacherFollow %>
123
123
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
124
124
  <% end %>
125
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="assign">指派生态经理</a>
125
126
  <% if @more %>
126
127
  <a class="layui-btn-xs data-count-edit more-btn" data-name={{d.name}} data-id={{d.id}}>更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
127
128
  <% end %>
@@ -396,11 +397,206 @@
396
397
  url: '/missions/teachers',
397
398
  where: {q: form.val('search_form')},
398
399
  toolbar: '#toolbarDemo',
399
- totalRow: true,
400
+ totalRow:true,
400
401
  defaultToolbar: ['filter'],
401
- cols: cols_table,
402
+ cols: [
403
+ [
404
+ {
405
+ field: 'id',
406
+ width: 60,
407
+ title:'序号',type: 'numbers',
408
+ totalRowText:'合计',
409
+ fixed: 'left'
410
+
411
+ },
412
+ {
413
+ field: 'name',
414
+ width: 100,
415
+ title: '姓名',
416
+ fixed: 'left',
417
+ templet: "#name"
418
+ },
419
+ {
420
+ field: 'realname',
421
+ width: 100,
422
+ title: '真实姓名',
423
+ },
424
+ {
425
+ field: 'school',
426
+ width: 160,
427
+ title: '单位',
428
+ templet:'<div><span title="{{d.school}}">{{d.school}}</span></div>'
429
+
430
+ },
431
+ {
432
+ field: 'department',
433
+ width: 130,
434
+ title: '部门',
435
+ templet:'<div><span title="{{d.department}}">{{d.department}}</span></div>'
436
+ },
437
+ {
438
+ field: 'majors',
439
+ width: 160,
440
+ title: '专业',
441
+ },
442
+ {
443
+ field: 'area',
444
+ width: 80,
445
+ title: '区域',
446
+ },
447
+ {
448
+ field: 'business_count',
449
+ width: 120,
450
+ title: '单位商机数',
451
+ },
452
+ {
453
+ field: 'professional_title',
454
+ title: '职称',
455
+ width: 80,
456
+ templet: '#show_follow'
457
+ },
458
+ {
459
+ field: 'job',
460
+ width: 80,
461
+ title: '职务',
462
+ templet: '#show_keys'
463
+
464
+ },
465
+ {
466
+ field: 'source',
467
+ width: 90,
468
+ title: '来源',
469
+ },
470
+ {
471
+ field: 'attitude',
472
+ width: 60,
473
+ title: '态度',
474
+ },
475
+ {
476
+ field: 'course_subjects_count',
477
+ width: 90,
478
+ title: '课程方向',
479
+ templet: "#courses"
480
+ },
481
+ {
482
+ field: 'teacher_follows_count',
483
+ width: 90,
484
+ title: '跟进情况',
485
+ totalRow:true,
486
+ templet: "#follow"
487
+ },
488
+ {
489
+ field: 'sales_manage',
490
+ width: 160,
491
+ title: '销售经理',
492
+ },
493
+ {
494
+ field: 'staff_manage',
495
+ width: 160,
496
+ title: '生态经理',
497
+ },
498
+ {
499
+ field: 'follow_person',
500
+ width: 120,
501
+ title: '最新跟进人',
502
+ },
503
+ {
504
+ field: 'followup_at',
505
+ width: 180,
506
+ title: '最新跟进时间',
507
+ },
508
+ {
509
+ field: 'latest_time',
510
+ width: 120,
511
+ title: '无跟进天数',
512
+ sort: true,
513
+ },
514
+ {
515
+ field: 'teacher_used',
516
+ width: 120,
517
+ title: '学院渗透率',
518
+ },
519
+ {
520
+ field: 'students',
521
+ width: 60,
522
+ totalRow:'{{ parseInt(d.TOTAL_NUMS) }}',
523
+ title: '学生',
524
+ },
525
+ {
526
+ field: 'courses_count',
527
+ width: 60,
528
+ title: '课堂',
529
+ totalRow:true,
530
+ templet: "#class"
531
+ },
532
+ {
533
+ field: 'activities_count',
534
+ width: 100,
535
+ title: '参与活动',
536
+ templet: "#event"
537
+ },
538
+ {
539
+ field: 'created_on',
540
+ width: 120,
541
+ title: '注册时间',
542
+ sort: true,
543
+ },
544
+ {
545
+ field: 'last_login_on',
546
+ width: 120,
547
+ title: '最近登录',
548
+ sort: true,
549
+ },
550
+ {
551
+ field: 'created_at',
552
+ width: 120,
553
+ title: '添加时间',
554
+ sort: true,
555
+ },
556
+ {
557
+ field: 'experience',
558
+ width: 120,
559
+ title: '经验值',
560
+ sort: true,
561
+ },
562
+ {
563
+ field: 'grade',
564
+ width: 120,
565
+ title: '金币',
566
+ sort: true,
567
+ },
568
+ {
569
+ field: 'mobile',
570
+ width: 120,
571
+ title: '联系电话',
572
+ },
573
+ {
574
+ field: 'wechat',
575
+ width: 120,
576
+ title: '微信号',
577
+ },
578
+ {
579
+ field: 'teacher_assist',
580
+ width: 120,
581
+ title: '教研助理',
582
+ },
583
+ {
584
+ field: 'is_contact',
585
+ width: 120,
586
+ title: '是否联系上'
587
+ },
588
+ {
589
+ title: '操作',
590
+ minWidth: 270,
591
+ toolbar: '#currentTableBar',
592
+ align: "center",
593
+ fixed: 'right'
594
+ }
595
+ ]
596
+ ],
597
+
402
598
  limit: 20,
403
- limits: [10, 15, 20, 30, 40, 50, 60, 70, 80, 90],
599
+ limits: [10,15,20,30,40,50,60,70,80,90],
404
600
  page: true,
405
601
  done: function (res) {
406
602
  drowpdwonRender()
@@ -408,7 +604,7 @@
408
604
  });
409
605
  var dropmenu = gon.menus;
410
606
 
411
- drowpdwonRender = function () {
607
+ drowpdwonRender = function() {
412
608
  dropdown.render({
413
609
  elem: '.more-btn',
414
610
  data: dropmenu,
@@ -780,6 +976,23 @@
780
976
  $(window).on("resize", function () {
781
977
  layer.full(index);
782
978
  });
979
+ }else if(obj.event === 'assign'){ //指派生态经理
980
+ var content = miniPage.getHrefContent('/missions/teachers/' + id + '/assign');
981
+ var openWH = miniPage.getOpenWidthHeight();
982
+ var name = data.name;
983
+ sindex = layer.open({
984
+ title: '指派教师【' + name + "】生态经理",
985
+ type: 1,
986
+ shade: 0.2,
987
+ maxmin: true,
988
+ shadeClose: true,
989
+ area: ['600px', '300px'],
990
+ content: content
991
+ });
992
+ $(window).on("resize", function () {
993
+ layer.full(sindex);
994
+ });
995
+ return false;
783
996
  }
784
997
  });
785
998
 
@@ -0,0 +1,43 @@
1
+ <%= Gon::Base.render_data %>
2
+ <div class="layui-form layuimini-form" style="padding:30px">
3
+ <div class="layui-form-item">
4
+ <label class="layui-form-label required">选择生态经理:</label>
5
+ <div class="layui-input-block" style="width: 300px">
6
+ <div id="staff_manage_id"></div>
7
+ </div>
8
+ </div>
9
+ <hr>
10
+ <div class="layui-form-item">
11
+ <div class="layui-input-block">
12
+ <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">确认保存</button>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <script>
18
+ layui.use(['form', 'table', 'upload', 'request', 'selectInput'], function () {
19
+ var form = layui.form,
20
+ layer = layui.layer,
21
+ request = layui.request,
22
+ $ = layui.$;
23
+
24
+ form.render();
25
+ staff_list_select = xmSelect.render({
26
+ el: '#staff_manage_id',
27
+ data: gon.staff_manages,
28
+ filterable: true,
29
+ radio: false,
30
+ });
31
+ var parentIndex = layer.index;
32
+ form.on('submit(saveBtn)', function () {
33
+ layer.confirm('确定指派生态经理?', function (index) {
34
+ request.post('missions/teachers/' + parent.id +"/assign_staff", {to_id: staff_list_select.getValue('valueStr')}, function () {
35
+ layer.close(index);
36
+ layer.close(parentIndex);
37
+ parent.table.reload('teachers_table')
38
+ })
39
+ });
40
+ return false;
41
+ });
42
+ });
43
+ </script>
@@ -25,7 +25,11 @@ json.data do
25
25
  json.followup_at d.follow_up&.created_at&.to_s
26
26
  json.latest_time (d['latest_time'] ? DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d['latest_time'].strftime("%Y-%m-%d")) : DateTime.parse(Time.now.strftime("%Y-%m-%d")) - DateTime.parse(d.created_at.strftime("%Y-%m-%d"))).to_i
27
27
 
28
- json.staff_manage @staff_manages[d.department&.school&.province]&.join(",")
28
+ assign_staff_manages = []
29
+ d.assign_staffs.each do |assign|
30
+ assign_staff_manages << assign.staff&.user&.real_name
31
+ end
32
+ json.staff_manage @staff_manages[d.department&.school&.province].present? ? (@staff_manages[d.department&.school&.province] + assign_staff_manages).uniq.join(",") : assign_staff_manages
29
33
  json.sales_manage @sales_manages[d.department&.school&.province]&.join(",")
30
34
 
31
35
  if d.department_id
@@ -2,6 +2,7 @@
2
2
  <html>
3
3
 
4
4
  <head>
5
+ <title>头歌营销系统</title>
5
6
  <%= csrf_meta_tags %>
6
7
  <%= csp_meta_tag %>
7
8
  <%= Gon::Base.render_data %>
@@ -16,6 +17,8 @@
16
17
  <div class="layui-header">
17
18
  <a href="/missions">
18
19
  <div class="layui-bg-black layuimini-logo layui-logo" id="head_a">
20
+ <%= image_tag "educode_sales/logo.png", class: 'header-logo' %>
21
+ <span class="app-title">营销系统</span>
19
22
  </div>
20
23
  </a>
21
24
 
data/config/routes.rb CHANGED
@@ -332,6 +332,8 @@ EducodeSales::Engine.routes.draw do
332
332
  get :unfinish_plans
333
333
  get :course_subject
334
334
  put :update_follow_up
335
+ get :assign
336
+ post :assign_staff
335
337
  end
336
338
  end
337
339
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '1.0.8'
2
+ VERSION = '1.10.0'
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.0.8
4
+ version: 1.10.0
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-07 00:00:00.000000000 Z
11
+ date: 2023-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -448,6 +448,7 @@ files:
448
448
  - app/views/educode_sales/money_plan_records/index.json.jbuilder
449
449
  - app/views/educode_sales/money_plans/_index.html.erb
450
450
  - app/views/educode_sales/money_plans/add.html.erb
451
+ - app/views/educode_sales/money_plans/edit.html.erb
451
452
  - app/views/educode_sales/money_plans/index.json.jbuilder
452
453
  - app/views/educode_sales/money_plans/list.html.erb
453
454
  - app/views/educode_sales/operation_plans/_monthPlan.html.erb
@@ -592,6 +593,7 @@ files:
592
593
  - app/views/educode_sales/teachers/add_courses.html.erb
593
594
  - app/views/educode_sales/teachers/add_event.html.erb
594
595
  - app/views/educode_sales/teachers/add_keys.html.erb
596
+ - app/views/educode_sales/teachers/assign.html.erb
595
597
  - app/views/educode_sales/teachers/course_list.json.jbuilder
596
598
  - app/views/educode_sales/teachers/course_subject.json.jbuilder
597
599
  - app/views/educode_sales/teachers/daily_paper.html.erb