educode_sales 0.6.4 → 0.6.5

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: 8cd066340676e40c41aa18730eacf453f8bf228ceb4416179f0e916581525999
4
- data.tar.gz: a30becf3c8cc2c925c21b66948d429a241d3750289f5e921ab3c0cde5aeea3f4
3
+ metadata.gz: abfb5bbc3cbbe65b1c987c9e1b77bca81d06086e2db8b6c788163fdba557f2ef
4
+ data.tar.gz: 7e2a1aabfab1f07c614a76d65f33560f6da3e7d05200a819c4d7b905c5d976c3
5
5
  SHA512:
6
- metadata.gz: adabc609d925eb080964dc566815134c5384f258fde90b7008296ceacf178a1435be37c553f49291844ce7043f6dfc4745f7713da687f40da40871acc67a6f8e
7
- data.tar.gz: 042b06433756725fad2b2bd4bb612bca89616f3e18e6055e5c2df4a89d8ece4810f9fe80899047a52c86d60c6e263b14bdb92ee9107efe63bb662ee51dd73041
6
+ metadata.gz: 30bac077609756d5eb7ab205d40f2c3f2b7db4f88797c636038051316c1917af74a88f4cf390878c6b8adc83f4bf4e417d723ef349ecdbfc375a8176e5a3a6a8
7
+ data.tar.gz: 3b4b074197ba779c5b8f8134e97b1633f6173f8ba7a46232d761b132b123b1ffa1ac39fa1b47d484ce82197d060b02dbde8bf8d07fb9c1c5bff1e783d3b485e6
@@ -33,15 +33,25 @@ module EducodeSales
33
33
  format.html do
34
34
  common = Common.find_by(clazz: 'staff_type', name: '销售')
35
35
  @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
36
- @more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business)
36
+ # @more = can?(:create, EducodeSales::SalePlan) || can?(:update, EducodeSales::Business) || can?(:destroy, EducodeSales::Business) || can?(:show_file, EducodeSales::Business)
37
+ @more = true
37
38
  gon.menus = []
38
39
  gon.place = params[:place_id].present? ? [{ value: params[:place_id], name: EducodeSales::Place.find(params[:place_id]).name }] : []
40
+ gon.business_type = Common.where(clazz: 'business_type').map do |d|
41
+ {value: d.id, name: d.name}
42
+ end
43
+ gon.type = params[:clazz_id].present? ? [{ value: params[:clazz_id], name: Common.find(params[:clazz_id]).name }] : []
44
+ gon.business_step = Common.where(clazz: 'business_step').map do |d|
45
+ {value: d.id, name: d.name}
46
+ end
39
47
  if can?(:create, EducodeSales::SalePlan)
40
48
  gon.menus << { title: '添加周计划', event: 'week' }
41
49
  gon.menus << { title: '添加月计划', event: 'month' }
42
50
  end
43
51
  gon.menus << { title: '跟进时间线', event: 'time_line' }
44
- gon.menus << { title: '附件管理', event: 'file' }
52
+ if can?(:show_file, EducodeSales::Business)
53
+ gon.menus << { title: '附件管理', event: 'file' }
54
+ end
45
55
  if can?(:update, EducodeSales::Business)
46
56
  gon.menus << { title: '编辑', event: 'edit' }
47
57
  end
@@ -137,12 +147,12 @@ module EducodeSales
137
147
  if params[:q].present? && params[:q][:business_type].present?
138
148
  @businesses = @businesses.joins("
139
149
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
140
- ").where("educode_sales_follow_ups.clazz_id = ?", params[:q][:business_type])
150
+ ").where("educode_sales_follow_ups.clazz_id in (?)", params[:q][:business_type].split(",").map(&:to_i))
141
151
  end
142
152
  if params[:q].present? && params[:q][:business_step].present?
143
153
  @businesses = @businesses.joins("
144
154
  JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
145
- ").where("educode_sales_follow_ups.stage_id = ?", params[:q][:business_step])
155
+ ").where("educode_sales_follow_ups.stage_id in (?)", params[:q][:business_step].split(",").map(&:to_i))
146
156
  end
147
157
  if params[:q].present? && params[:q][:place_id].present?
148
158
  @businesses = @businesses.joins("
@@ -177,6 +187,13 @@ module EducodeSales
177
187
  @businesses = @businesses.where("educode_sales_businesses.created_at > ? AND educode_sales_businesses.created_at < ?", date[0], date[1] + '23:59:59')
178
188
  end
179
189
 
190
+ if params[:q].present? && params[:q][:invitation_at].present?
191
+ date = params[:q][:invitation_at].split(" - ")
192
+ @businesses = @businesses.joins("
193
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
194
+ ").where("educode_sales_follow_ups.invitation_at > ? AND educode_sales_follow_ups.invitation_at < ?", date[0] + '00:00:00', date[1] + '23:59:59')
195
+ end
196
+
180
197
  if params[:sort].present? && params[:sort][:field]
181
198
  @businesses = @businesses.order("#{params[:sort][:field]} #{params[:sort][:order]}")
182
199
  else
@@ -195,6 +212,7 @@ module EducodeSales
195
212
  last_follow.signed_date,
196
213
  last_follow.created_at as latest_time,
197
214
  last_follow.actual_amount,
215
+ (last_follow.actual_amount - educode_sales_businesses.return_money) as wait_return_money,
198
216
  last_follow.total_amount").joins("
199
217
  LEFT JOIN educode_sales_follow_ups AS last_follow ON educode_sales_businesses.last_follow_up_id = last_follow.id
200
218
  ").page(params[:page]).per(params[:limit])
@@ -12,21 +12,22 @@ module EducodeSales
12
12
  @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
13
13
  end
14
14
  format.json do
15
+ x_id = Common.find_by(extras: EducodeSales::Common::XTYPE)&.id
15
16
  if @current_admin.is_admin?
16
- @money_plans = MoneyPlan.where(follow_up_id: follow_up_ids)
17
+ @money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids)
17
18
  else
18
19
  level = @current_admin.role.role_areas.find_by(clazz: '回款管理').level
19
20
  case level
20
21
  when '自己'
21
- @money_plans = MoneyPlan.where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id)
22
+ @money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id)
22
23
  when '区域'
23
24
  a_ids = MoneyPlan.where(follow_up_id: follow_up_ids).where(staff_id: @current_admin.staff_id).ids
24
25
  school_ids = School.where(province: @current_admin.areas.pluck(:name)).pluck(:id)
25
26
  b_ids = Business.where(school_id: school_ids).pluck(:last_follow_up_id)
26
27
  ids = a_ids + b_ids
27
- @money_plans = MoneyPlan.where(id: ids)
28
+ @money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(id: ids)
28
29
  else
29
- @money_plans = MoneyPlan.where(follow_up_id: follow_up_ids)
30
+ @money_plans = MoneyPlan.joins(:follow_up).where("educode_sales_follow_ups.clazz_id != ?", x_id).where(follow_up_id: follow_up_ids)
30
31
  end
31
32
  end
32
33
 
@@ -47,13 +48,13 @@ module EducodeSales
47
48
  end
48
49
  if params[:q].present? && params[:q][:date].present?
49
50
  date = params[:q][:date].split(" - ")
50
- @money_plans = @money_plans.where("educode_sales_money_plans.created_at > ? AND educode_sales_money_plans.created_at < ?", date[0], date[1] + '23:59:59')
51
+ @money_plans = @money_plans.where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at < ?", date[0], date[1] + '23:59:59')
51
52
  end
52
53
 
53
54
  if params[:sort].present? && params[:sort][:field]
54
55
  @money_plans = @money_plans.order("#{params[:sort][:field]} #{params[:sort][:order]}")
55
56
  else
56
- @money_plans = @money_plans.order(created_at: :desc)
57
+ @money_plans = @money_plans.order(date_at: :desc)
57
58
  end
58
59
  @total_amount = @money_plans.sum(:amount)
59
60
  @money_plans = @money_plans.page(params[:page]).per(params[:limit])
@@ -69,12 +69,14 @@
69
69
  <div class="layui-input-inline">
70
70
  <input name="total_amount" type="number" class="layui-input" value="<%= @follow_up.total_amount %>">
71
71
  </div>
72
- </div>
72
+ 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
73
+ <br>
73
74
  <div class="layui-inline">
74
75
  <label class="layui-form-label">合同额(万)</label>
75
76
  <div class="layui-input-inline">
76
77
  <input name="actual_amount" type="number" class="layui-input" placeholder="本单位的签单金额" value="<%= @follow_up.actual_amount %>">
77
78
  </div>
79
+ 客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
78
80
  </div>
79
81
  <br>
80
82
  <div class="layui-inline place_select">
@@ -82,7 +84,9 @@
82
84
  <div class="layui-input-inline" style="z-index: 101">
83
85
  <div id="edit_place" style="width: 190px;"></div>
84
86
  </div>
87
+ 总额里,渠道拿到的部分。
85
88
  </div>
89
+ <br>
86
90
  <div class="layui-inline">
87
91
  <label class="layui-form-label">渠道分成(万)</label>
88
92
  <div class="layui-input-inline">
@@ -95,7 +99,8 @@
95
99
  <div class="layui-input-inline">
96
100
  <input type="text" class="layui-input" name="year" lay-verify="required" autocomplete="off" id="edit_year"
97
101
  value="<%= @follow_up&.year%>"
98
- placeholder="请选择年度"> </div>
102
+ placeholder="请选择年度">
103
+ </div>
99
104
  </div>
100
105
  </div>
101
106
  <div class="layui-form-item">
@@ -103,6 +108,10 @@
103
108
  <div class="layui-input-inline">
104
109
  <div id="edit_assign_follow" style="width: 512px;"></div>
105
110
  </div>
111
+ <div class="layui-inline" style="padding: 9px 15px">
112
+ <label class="layui-form-label" style="padding-left: 220px"></label>
113
+ 指定跟进人和商机创建者,同时拥有对该商机的管理权限
114
+ </div>
106
115
  </div>
107
116
  <div class="layui-form-item layui-form-text">
108
117
  <label class="layui-form-label required">最新进展</label>
@@ -2,9 +2,9 @@
2
2
  <script type="text/html" id="toolbarDemo">
3
3
  <div class="layui-btn-container">
4
4
  <span class="table-label">附件信息</span>
5
- <%# if can? :create, EducodeSales::file %>
5
+ <% if can? :upload_file, EducodeSales::Business %>
6
6
  <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
7
- <%# end %>
7
+ <% end %>
8
8
  </div>
9
9
  </script>
10
10
 
@@ -12,8 +12,12 @@
12
12
 
13
13
  <script type="text/html" id="currentTableBar_file">
14
14
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
15
- <a href="/missions/upload_files/download?id={{d.id}}" class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="download">下载</a>
16
- <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
15
+ <% if can? :download_file, EducodeSales::Business %>
16
+ <a href="/missions/upload_files/download?id={{d.id}}" class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="download">下载</a>
17
+ <% end %>
18
+ <% if can? :delete_file, EducodeSales::Business %>
19
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
20
+ <% end %>
17
21
  </script>
18
22
 
19
23
  <script type="text/html" id="showchance">
@@ -33,41 +33,49 @@
33
33
  <%= select_tag "staff_id", options_for_select(@staffs, params[:staff_id]), { 'lay-filter': 'staff_id', include_blank: true } %>
34
34
  </div>
35
35
  </div>
36
- <div class="layui-inline">
36
+ <div class="layui-inline show_item" style="display:none;">
37
37
  <label class="layui-form-label">项目类型</label>
38
38
  <div class="layui-input-inline">
39
- <%= select_tag "business_type", options_for_select(EducodeSales::Common.where(clazz: 'business_type').pluck(:name, :id), params[:clazz_id]), { 'lay-filter': 'clazz_id', include_blank: true } %>
39
+ <div id="business_type" style="width: 190px;"></div>
40
40
  </div>
41
41
  </div>
42
- <div class="layui-inline">
42
+ <div class="layui-inline show_item" style="display:none;">
43
43
  <label class="layui-form-label">项目阶段</label>
44
44
  <div class="layui-input-inline">
45
- <%= select_tag "business_step", options_for_select(EducodeSales::Common.where(clazz: 'business_step').pluck(:name, :id)), { include_blank: true } %>
45
+ <div id="business_step" style="width: 190px;"></div>
46
46
  </div>
47
47
  </div>
48
- <div class="layui-inline">
48
+ <div class="layui-inline show_item" style="display:none;">
49
49
  <label class="layui-form-label">渠道名称</label>
50
50
  <div class="layui-input-inline">
51
51
  <div id="index_place" style="width: 190px;"></div>
52
52
  </div>
53
53
  </div>
54
- <div class="layui-inline">
54
+ <div class="layui-inline show_item" style="display:none;">
55
55
  <label class="layui-form-label">区域</label>
56
56
  <div class="layui-input-inline">
57
57
  <%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
58
58
  </div>
59
59
  </div>
60
- <div class="layui-inline">
60
+ <div class="layui-inline show_item" style="display:none;">
61
61
  <label class="layui-form-label">创建时间</label>
62
62
  <div class="layui-input-inline">
63
63
  <input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
64
64
  </div>
65
65
  </div>
66
+ <div class="layui-inline show_item" style="display:none;">
67
+ <label class="layui-form-label">招标时间</label>
68
+ <div class="layui-input-inline">
69
+ <input type="text" class="layui-input" id="invitation_at" name="invitation_at" placeholder=" - ">
70
+ </div>
71
+ </div>
66
72
  <div class="layui-inline">
67
73
  <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_business_search">重置
68
74
  </button>
69
75
  <button type="submit" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_bussiness">搜索
70
76
  </button>
77
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="show_hide">展开/收起
78
+ </button>
71
79
  </div>
72
80
  </div>
73
81
  </form>
@@ -126,6 +134,10 @@
126
134
  elem: '#date',
127
135
  range: true
128
136
  });
137
+ laydate.render({
138
+ elem: '#invitation_at',
139
+ range: true
140
+ });
129
141
 
130
142
  var is_show = <%=params[:name].present? || params[:clazz_id].present? || params[:place_id].present? || params[:school].present? %>
131
143
  if(is_show){
@@ -135,6 +147,15 @@
135
147
  $('.businesses_list_div').addClass('layui-show');
136
148
  }
137
149
 
150
+ var business_type_list = xmSelect.render({
151
+ el: '#business_type',
152
+ data: gon.business_type
153
+ })
154
+ business_type_list.setValue(gon.type)
155
+ var business_step_list = xmSelect.render({
156
+ el: '#business_step',
157
+ data: gon.business_step
158
+ })
138
159
  var index_place_list = xmSelect.render({
139
160
  el: '#index_place',
140
161
  model: {
@@ -189,10 +210,6 @@
189
210
  defaultToolbar: ['filter'],
190
211
  toolbar: '#bussinessBar',
191
212
  totalRow: true,//开启合并行
192
- initSort: {
193
- field: 'latest_time' //排序字段,对应 cols 设定的各字段名
194
- ,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
195
- },
196
213
  cols: [
197
214
  [
198
215
  {
@@ -304,6 +321,13 @@
304
321
  sort: true,
305
322
  totalRow: true
306
323
  },
324
+ {
325
+ field: 'wait_return_money',
326
+ width: 100,
327
+ title: '待回款',
328
+ sort: true,
329
+ totalRow: true
330
+ },
307
331
  {
308
332
  field: 'place',
309
333
  width: 160,
@@ -485,7 +509,17 @@
485
509
 
486
510
  // 监听搜索操作
487
511
  form.on('submit(search_bussiness)', function (data) {
512
+ var business_type = [];
513
+ business_type_list.getValue().forEach(function(d) {
514
+ business_type.push(d.value);
515
+ })
516
+ var business_step = [];
517
+ business_step_list.getValue().forEach(function(d) {
518
+ business_step.push(d.value);
519
+ })
488
520
  data.field.place_id = index_place_list.getValue('valueStr');
521
+ data.field.business_type = business_type.toString();
522
+ data.field.business_step = business_step.toString();
489
523
  search = data.field
490
524
  console.log(search);
491
525
  table.reload('businesses_table', {
@@ -507,12 +541,59 @@
507
541
  return false;
508
542
  });
509
543
 
544
+ form.on('submit(show_hide)', function (data) {
545
+ $(".show_item").toggle()
546
+ return false;
547
+ });
510
548
  form.on('submit(reset_business_search)', function (data) {
511
549
  var field = data.field;
512
550
  form.val('search_form', {
513
551
  name: '', department: '', staff_id: '', business_type: '', business_step: '',
514
- place_id: '', date: '', area: ''
552
+ place_id: '', date: '', area: '', invitation_at: ''
515
553
  })
554
+ var index_place_list = xmSelect.render({
555
+ el: '#index_place',
556
+ model: {
557
+ icon: 'hidden',
558
+ label: {
559
+ type: 'text',
560
+ text: {
561
+ //左边拼接的字符
562
+ left: '',
563
+ //右边拼接的字符
564
+ right: '',
565
+ //中间的分隔符
566
+ separator: ', ',
567
+ },
568
+ }
569
+ },
570
+ remoteSearch: true,
571
+ clickClose: true,
572
+ delay: 1000,
573
+ paging: true,
574
+ radio: true,
575
+ pageRemote: true,
576
+ filterable: true,
577
+ remoteMethod: function (val, cb, show, pageIndex) {
578
+ $.ajax( '/missions/sales_place', {
579
+ method: 'get',
580
+ data: {
581
+ q: val,
582
+ page: pageIndex
583
+ },
584
+ dataType: 'json',
585
+ success: function (res) {
586
+ var data = res.data;
587
+ if (res.code == 0) {
588
+ cb(res.data, res.count);
589
+ } else {
590
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
591
+ }
592
+
593
+ }
594
+ })
595
+ }
596
+ })
516
597
  return false;
517
598
  });
518
599
 
@@ -6,7 +6,7 @@ json.data do
6
6
  json.department d.department.name
7
7
  json.school d.department.school.name
8
8
  json.school_id d.department.school.id
9
- json.follow_ups_count d.follow_ups_count
9
+ json.follow_ups_count d.follow_ups.where(deleted_at: nil).size
10
10
  follow_ups_count += d.follow_ups_count
11
11
  json.follow_up_id d.last_follow_up_id
12
12
  # json.teachers_count d.follow_ups.sum(:key_people_count)
@@ -20,13 +20,14 @@ json.data do
20
20
  json.total_amount d.last_follow_up&.total_amount
21
21
  json.actual_amount d.last_follow_up&.actual_amount
22
22
  json.return_money d.return_money
23
+ json.wait_return_money d.wait_return_money
23
24
  json.place d.last_follow_up&.place&.name
24
25
  json.last_follow_person d.last_follow_up.present? ? d.last_follow_up.staff.user.real_name : EducodeSales::Staff.find(d.staff_id).user.real_name
25
26
  json.source d.source
26
27
  json.assign_follow_ups d.last_follow_up.present? ? d.last_follow_up.assign_follow_ups.pluck(:staff_id) : []
27
28
  json.current_staff_id @current_admin.id
28
29
  json.staff_id d.staff_id
29
- json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s : d.created_at.to_s
30
+ json.latest_time d.last_follow_up.present? ? d.last_follow_up.created_at.to_s : ''
30
31
  end
31
32
  end
32
33
 
@@ -74,13 +74,15 @@
74
74
  <input name="total_amount" type="number" class="layui-input" autocomplete="off"
75
75
  value="<%= @last_follow_up&.total_amount%>">
76
76
  </div>
77
- </div>
77
+ 客户采购支出的费用。总额的生命历程:1.在最初阶段,是商机的预算总额;2.在挂网阶段,是项目的挂网预算总额;3.在中标阶段,是项目的中标总额。 </div>
78
+ <br>
78
79
  <div class="layui-inline">
79
80
  <label class="layui-form-label">合同额(万)</label>
80
81
  <div class="layui-input-inline">
81
82
  <input name="actual_amount" type="number" class="layui-input" autocomplete="off" placeholder="本单位的签单金额"
82
83
  value="<%= @last_follow_up&.actual_amount%>">
83
84
  </div>
85
+ 客户签给头歌的费用。合同额的生命历程:1.在中标之前,合同额都是0;2.在中标之后,实际与头歌签合同的金额。
84
86
  </div>
85
87
  <br>
86
88
  <div class="layui-inline new_place_select">
@@ -88,7 +90,9 @@
88
90
  <div class="layui-input-inline" style="z-index: 101">
89
91
  <div id="place" style="width: 190px;"></div>
90
92
  </div>
93
+ 总额里,渠道拿到的部分。
91
94
  </div>
95
+ <br>
92
96
  <div class="layui-inline">
93
97
  <label class="layui-form-label">渠道分成(万)</label>
94
98
  <div class="layui-input-inline">
@@ -106,7 +110,7 @@
106
110
  </div>
107
111
  <div class="layui-form-item">
108
112
  <label class="layui-form-label">指定跟进人</label>
109
- <div class="layui-input-inline" style="z-index: 100">
113
+ <div class="layui-input-inline" >
110
114
  <div id="assign_follow" style="width: 512px;"></div>
111
115
  </div>
112
116
  <div class="layui-inline" style="padding: 9px 15px">
@@ -144,6 +148,7 @@
144
148
  </div>
145
149
  </div>
146
150
  </div>
151
+ </div>
147
152
 
148
153
  <script>
149
154
  layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'laydate', 'xmSelect'], function () {
@@ -767,4 +767,7 @@
767
767
  .layui-form .city_input .city {
768
768
  display: block;
769
769
  }
770
+ .layui-edge{
771
+ display: none;!important;
772
+ }
770
773
  </style>
@@ -12,7 +12,7 @@
12
12
  <%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id),@follow_up.department_id)%>
13
13
  </div>
14
14
  </div>
15
- <div class="layui-form-item " style="padding-left: 110px">
15
+ <div class="layui-form-item " style="padding-left: 150px">
16
16
  <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit_follow_up">提交
17
17
  </button>
18
18
  </div>
@@ -769,4 +769,7 @@
769
769
  .layui-form .city_input .city {
770
770
  display: block;
771
771
  }
772
+ .layui-edge{
773
+ display: none;!important;
774
+ }
772
775
  </style>
@@ -12,7 +12,7 @@
12
12
  <%= select_tag "department_id",options_for_select(@school.departments.pluck(:name, :id)), { include_blank: true}%>
13
13
  </div>
14
14
  </div>
15
- <div class="layui-form-item " style="padding-left: 110px">
15
+ <div class="layui-form-item " style="padding-left: 150px">
16
16
  <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="add_follow_up">提交
17
17
  </button>
18
18
  </div>
@@ -393,7 +393,7 @@
393
393
  content = miniPage.getHrefContent('/missions/customers/edit_follow_record?id=' + data.id);
394
394
  openWH = miniPage.getOpenWidthHeight();
395
395
  editFollowIndex = layer.open({
396
- title: '编辑',
396
+ title: '编辑跟进记录',
397
397
  type: 1,
398
398
  shade: 0.2,
399
399
  maxmin: true,
@@ -26,7 +26,7 @@
26
26
  </div>
27
27
  </div>
28
28
  <div class="layui-inline">
29
- <label class="layui-form-label">创建时间</label>
29
+ <label class="layui-form-label">回款时间</label>
30
30
  <div class="layui-input-inline">
31
31
  <input type="text" class="layui-input" id="date" name="date" placeholder=" - ">
32
32
  </div>
@@ -52,9 +52,7 @@
52
52
  <script type="text/html" id="currentTableBar">
53
53
  </script>
54
54
  <script type="text/html" id="business">
55
- <div class="layui-text">
56
- <a href="/missions/businesses?name={{d.business}}&school={{d.school}}">{{d.business}}</a>
57
- </div>
55
+ <a href="javascript:void(0);" lay-event="business" class="layui-table-link">{{ d.business }}</a>
58
56
  </script>
59
57
 
60
58
  <script type="text/html" id="school">
@@ -83,7 +81,7 @@
83
81
  totalRow: true,
84
82
  defaultToolbar: ['filter'],
85
83
  initSort: {
86
- field: 'created_at' //排序字段,对应 cols 设定的各字段名
84
+ field: 'date_at' //排序字段,对应 cols 设定的各字段名
87
85
  ,type: 'desc' //排序方式 asc: 升序、desc: 降序、null: 默认排序
88
86
  },
89
87
  cols: [
@@ -95,7 +93,7 @@
95
93
  totalRowText:'本页/总计'
96
94
  },
97
95
  {
98
- field: 'created_at',
96
+ field: 'date_at',
99
97
  width: 120,
100
98
  sort: true,
101
99
  title: '回款时间'
@@ -174,6 +172,47 @@
174
172
  return false;
175
173
  });
176
174
 
175
+ table.on('tool(place)', function (obj) {
176
+ var data = obj.data;
177
+ id = data.id
178
+ if (obj.event === 'add_event') { // 监听添加操作
179
+ var content = miniPage.getHrefContent('/missions/businesses/show_follow_record?follow_up_id=' + data.id);
180
+ var openWH = miniPage.getOpenWidthHeight();
181
+ show_index = layer.open({
182
+ title: '查看商机跟进记录',
183
+ type: 1,
184
+ shade: 0.2,
185
+ maxmin: true,
186
+ shadeClose: true,
187
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
188
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
189
+ content: content
190
+ });
191
+ $(window).on("resize", function () {
192
+ layer.full(index);
193
+ });
194
+ } else if (obj.event === 'business') {
195
+ console.log(data);
196
+ business_id = data.business_id
197
+ business_name = data.business
198
+ content = miniPage.getHrefContent('/missions/businesses/show_follow?id=' + data.business_id);
199
+ openWH = miniPage.getOpenWidthHeight();
200
+ index = layer.open({
201
+ title: '商机列表/' + data.business + '的跟进记录',
202
+ type: 1,
203
+ shade: 0.2,
204
+ maxmin: true,
205
+ shadeClose: true,
206
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
207
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
208
+ content: content
209
+ });
210
+ $(window).on("resize", function () {
211
+ layer.full(index);
212
+ });
213
+ }
214
+ });
215
+
177
216
  });
178
217
  </script>
179
218
  <style>
@@ -2,11 +2,12 @@ total_amount = 0
2
2
  json.data do
3
3
  json.array! @money_plans do |d|
4
4
  json.id d.id
5
- json.created_at d.created_at.to_s(:date)
5
+ json.date_at d.date_at.to_s(:date)
6
6
  json.amount d.amount
7
7
  total_amount += d.amount
8
8
  json.clazz d.clazz
9
9
  json.business d.follow_up.business.name
10
+ json.business_id d.follow_up.business.id
10
11
  json.school School.find(d.follow_up.business.school_id).name
11
12
  json.school_id School.find(d.follow_up.business.school_id).id
12
13
  json.staff d.staff.user.real_name
@@ -131,12 +131,26 @@
131
131
  templet: "#business_a",
132
132
 
133
133
  },
134
+ // {
135
+ // field: 'amount',
136
+ // width: 120,
137
+ // totalRow:true,
138
+ // sort: true,
139
+ // title: '中标金额'
140
+ // },
134
141
  {
135
- field: 'amount',
142
+ field: 'total_amount',
136
143
  width: 120,
137
144
  totalRow:true,
138
145
  sort: true,
139
- title: '中标金额'
146
+ title: '项目总额'
147
+ },
148
+ {
149
+ field: 'divide_amount',
150
+ width: 120,
151
+ totalRow:true,
152
+ sort: true,
153
+ title: '渠道分成'
140
154
  },
141
155
  {
142
156
  field: 'return_mount',
@@ -17,7 +17,9 @@ json.data do
17
17
  business_count = EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id}").count
18
18
  json.businesses_count business_count
19
19
  all_businesses_count += business_count
20
- json.amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount - divide_amount").round(2)
20
+ # json.amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount - divide_amount").round(2)
21
+ json.total_amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("actual_amount").round(2)
22
+ json.divide_amount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id} AND educode_sales_follow_ups.stage_id IN (?)", @stage_ids).sum("divide_amount").round(2)
21
23
  json.return_mount EducodeSales::Business.joins(:last_follow_up).where("educode_sales_follow_ups.clazz_id != ?", @x).where("educode_sales_follow_ups.place_id = #{d.id}").sum(:return_money).round(2)
22
24
  end
23
25
  end
@@ -5,8 +5,8 @@ json.data do
5
5
  json.name business.name
6
6
  json.school business.department.school.name
7
7
  json.department business.department.name
8
- json.last_follow_person business.last_follow_up.present? ? business.last_follow_up.staff.user.real_name : EducodeSales::Staff.find(business.staff_id).user.real_name
9
- json.latest_time business.last_follow_up.present? ? business.last_follow_up.created_at.to_s : business.created_at.to_s
8
+ json.last_follow_person business.last_follow_up_id.present? ? EducodeSales::FollowUp.unscoped.find(business.last_follow_up_id).staff.user.real_name : EducodeSales::Staff.find(business.staff_id).user.real_name
9
+ json.latest_time business.last_follow_up_id.present? ? EducodeSales::FollowUp.unscoped.find(business.last_follow_up_id).created_at.to_s : business.created_at.to_s
10
10
  json.deleter EducodeSales::Staff.find(d.deleter_id).user.real_name
11
11
  json.delete_time d.created_at.to_s
12
12
  end
@@ -36,7 +36,7 @@ json.data do
36
36
  business_d = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @d_clazz&.id).count
37
37
  business_e = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @e_clazz&.id).count
38
38
  business_o = @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id = ?", @o_clazz&.id).count
39
- school_count = EducodeSales::CustomerExtension.where(customer_staff_id: d.id).size
39
+ school_count = EducodeSales::CustomerExtension.joins(:school).where(customer_staff_id: d.id).size
40
40
  json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).sum(:total_amount).round(2)
41
41
  json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).sum(:amount).round(2)
42
42
  json.school_count school_count
@@ -58,7 +58,7 @@ json.data do
58
58
  json.goal @businesses.joins("JOIN educode_sales_follow_ups on educode_sales_follow_ups.id = educode_sales_businesses.last_follow_up_id").where("educode_sales_follow_ups.clazz_id != ? AND educode_sales_follow_ups.stage_id in (?)", @x, @step_ids).where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", "#{@year}-01-01", "#{@year}-12-31").sum(:total_amount).round(2)
59
59
  json.return_money @businesses.joins(last_follow_up: :money_plans).where("educode_sales_follow_ups.clazz_id != ?", @x).where.not("educode_sales_money_plans.clazz!= ?", 1).where("educode_sales_money_plans.date_at >= ? AND educode_sales_money_plans.date_at <= ? ", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").sum(:amount).round(2)
60
60
  json.school_count school_count
61
- follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
61
+ follow_school_count = (EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").pluck(:school_id) + EducodeSales::Business.where(id: EducodeSales::FollowUp.where("created_at >= ? AND created_at <= ?", "#{@year}-01-01 00:00:00", "#{@year}-12-31 23:59:59").where(staff_id: d.id).pluck(:business_id).uniq).pluck(:school_id)).uniq.size
62
62
  json.follow_school_count follow_school_count
63
63
  json.follow_school_counts EducodeSales::CustomerFollow.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size + EducodeSales::FollowUp.where(staff_id: d.id).where("created_at >= ? AND created_at <= ?", "#{@year}-01-01", "#{@year}-12-31").size
64
64
  follow_school_rate = (follow_school_count!=0 ? school_count.to_f * 100 / follow_school_count : 0).round(2)
@@ -19,44 +19,44 @@
19
19
  <%= select_tag "professional_title", options_for_select(['教授', '研究员', '副教授', '副研究员', '讲师', '助理研究员', '助理教授'], @person&.professional_title), { include_blank: true } %>
20
20
  </div>
21
21
  </div>
22
- <div class="layui-inline">
22
+ <div class="layui-inline show_item" style="display:none;">
23
23
  <label class="layui-form-label">导流来源</label>
24
24
  <div class="layui-input-inline">
25
25
  <%= select_tag "teacher_source", options_for_select(EducodeSales::Common.where(clazz: 'teacher_source').pluck(:name, :id)), { include_blank: true } %>
26
26
  </div>
27
27
  </div>
28
- <div class="layui-inline">
28
+ <div class="layui-inline show_item" style="display:none;">
29
29
  <label class="layui-form-label">态度</label>
30
30
  <div class="layui-input-inline">
31
31
 
32
32
  <%= select_tag "attitude", options_for_select(EducodeSales::Common.where(clazz: 'teacher_attitude').pluck(:name, :id)), { include_blank: true } %>
33
33
  </div>
34
34
  </div>
35
- <div class="layui-inline">
35
+ <div class="layui-inline show_item" style="display:none;">
36
36
  <label class="layui-form-label">注册时间</label>
37
37
  <div class="layui-input-inline">
38
38
  <input type="text" class="layui-input" id="time" placeholder="请选择时间" autocomplete="off" name="regist_at">
39
39
  </div>
40
40
  </div>
41
- <div class="layui-inline">
41
+ <div class="layui-inline show_item" style="display:none;">
42
42
  <label class="layui-form-label">注册状态</label>
43
43
  <div class="layui-input-inline">
44
44
  <%= select_tag "status", options_for_select([["已注册","1"],["未注册","0"]]), { include_blank: true } %>
45
45
  </div>
46
46
  </div>
47
- <div class="layui-inline">
47
+ <div class="layui-inline show_item" style="display:none;">
48
48
  <label class="layui-form-label">区域</label>
49
49
  <div class="layui-input-inline">
50
50
  <%= select_tag "area", options_for_select(EducodeSales::Common.where(clazz: 'area').pluck(:name, :id)), { include_blank: true } %>
51
51
  </div>
52
52
  </div>
53
- <div class="layui-inline">
53
+ <div class="layui-inline show_item" style="display:none;">
54
54
  <label class="layui-form-label">起止时间</label>
55
55
  <div class="layui-input-inline">
56
56
  <input type="text" class="layui-input" id="date" name="date" autocomplete="off" placeholder=" - ">
57
57
  </div>
58
58
  </div>
59
- <div class="layui-inline">
59
+ <div class="layui-inline show_item" style="display:none;">
60
60
  <label class="layui-form-label">教研助理</label>
61
61
  <div class="layui-input-inline">
62
62
  <%= select_tag "assist", options_for_select(@staffs, params[:assist]), { 'lay-filter': 'assist', include_blank: true } %>
@@ -68,6 +68,8 @@
68
68
  </button>
69
69
  <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_teachers">搜 索
70
70
  </button>
71
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="show_hide">展开/收起
72
+ </button>
71
73
  </div>
72
74
  </div>
73
75
  </form>
@@ -150,12 +152,14 @@
150
152
  width: 60,
151
153
  title:'序号',type: 'numbers',
152
154
  totalRowText:'合计',
155
+ fixed: 'left'
153
156
 
154
157
  },
155
158
  {
156
159
  field: 'name',
157
160
  width: 80,
158
161
  title: '姓名',
162
+ fixed: 'left',
159
163
  templet: "#name"
160
164
  },
161
165
  {
@@ -409,6 +413,10 @@
409
413
  })
410
414
  return false;
411
415
  });
416
+ form.on('submit(show_hide)', function (data) {
417
+ $(".show_item").toggle()
418
+ return false;
419
+ });
412
420
  /**
413
421
  * toolbar事件监听
414
422
  */
@@ -8,6 +8,11 @@ class CreateEducodeSalesRolePermissions < ActiveRecord::Migration[5.2]
8
8
  end
9
9
  if EducodeSales::Permission.last.nil?
10
10
 
11
+ #附件管理权限
12
+ EducodeSales::Permission.create(name: '查看附件', subject: 'Business', action: 'show_file', clazz: 'business', position: '11')
13
+ EducodeSales::Permission.create(name: '上传附件', subject: 'Business', action: 'upload_file', clazz: 'business', position: '11')
14
+ EducodeSales::Permission.create(name: '下载附件', subject: 'Business', action: 'download_file', clazz: 'business', position: '11')
15
+ EducodeSales::Permission.create(name: '删除附件', subject: 'Business', action: 'delete_file', clazz: 'business', position: '11')
11
16
  #回款管理权限
12
17
  EducodeSales::Permission.create(name: '查看回款列表', subject: 'MoneyPlan', action: 'read', clazz: 'money_plan', position: '15')
13
18
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.6.4'
2
+ VERSION = '0.6.5'
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: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-07 00:00:00.000000000 Z
11
+ date: 2022-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails