educode_sales 0.9.60 → 0.9.62

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: 38a087d439337d97172f9dedbd4c7bc35c85d88d96379f0361bff0da95658d4b
4
- data.tar.gz: fd6bc9fd073b19ad2e1be53e2d905fbd0001f759c563cabedf26c27e14f108bc
3
+ metadata.gz: 15485a9308608796320e988b7095196d7747dffb82c6ac7478e146ca9a3034c4
4
+ data.tar.gz: b436c683fd104c2a599979a505e3507e6f117e98f7e525b51b1f3b1977aedb94
5
5
  SHA512:
6
- metadata.gz: 4eec669e7e2fcf022da895cb512c8f59041ea02fdeab2b792a3f393d4dc24b753e6b142e9c818ee6c73b127057ab40dd609a785c1179cb1b4862da42a17c6cec
7
- data.tar.gz: 8759062ab1edd1b677746bd518e1d71919782b1dd1684c9b9580156f457847bad22cdd1c87eb5bfdc7ac166992ce8c0a48d169b5ac4b70c4a03beadc51934bff
6
+ metadata.gz: 04b502321a7d5fd2136d97577802d45d502645651d26b59b0b2d7474c06e1e959a489d9c5930ff1e45b24b80d676f4b804570d7b58af7edd09d031e036b95ec2
7
+ data.tar.gz: 2daf5753d3ed08580c758f097751ae59a352159b2542c8b31fcafc30c6866becc7b56563a76a4de493efb1f1c4a0804e2b09618210a66c009184b7f86555f8f5
@@ -5,15 +5,37 @@ module EducodeSales
5
5
  def index
6
6
  respond_to do |format|
7
7
  format.html do
8
+ @staffs = Staff.all.map { |d| [ d.user&.real_name, d.id ]}
8
9
  end
9
10
  format.json do
10
11
  @activities = Activity
12
+ if params[:q].present?
13
+ if params[:q][:staff_id].present?
14
+ @activities = @activities.where(staff_id: params[:q][:staff_id])
15
+ end
16
+ if params[:q][:clazz_id].present?
17
+ @activities = @activities.where(clazz_id: params[:q][:clazz_id])
18
+ end
19
+
20
+ if params[:q][:name].present?
21
+ @activities = @activities.where("educode_sales_activities.name like ?", "%#{params[:q][:name]}%")
22
+ end
23
+ if params[:q][:manage].present?
24
+ @activities = @activities.joins("JOIN educode_sales_activity_staffs AS m ON m.activity_id = educode_sales_activities.id AND m.clazz_id = 0").where("m.staff_id = ?", params[:q][:manage].to_i)
25
+ end
26
+ if params[:q][:assists].present?
27
+ @activities = @activities.joins("JOIN educode_sales_activity_staffs AS a ON a.activity_id = educode_sales_activities.id AND a.clazz_id = 1").where("a.staff_id = ?", params[:q][:assists].to_i)
28
+ end
29
+ if params[:q][:expert].present?
30
+ @activities = @activities.joins("JOIN educode_sales_activity_staffs AS e ON e.activity_id = educode_sales_activities.id AND e.clazz_id = 2").where("e.name like ?", "%#{params[:q][:expert]}%")
31
+ end
32
+ end
11
33
  if params[:sort].present? && params[:sort][:field]
12
34
  @activities = @activities.order("#{params[:sort][:field]} #{params[:sort][:order]}")
13
35
  else
14
36
  @activities = @activities.order("created_at desc")
15
37
  end
16
- @activities = @activities.page(params[:page]).per(params[:limit])
38
+ @activities = @activities.distinct.page(params[:page]).per(params[:limit])
17
39
  end
18
40
  end
19
41
  end
@@ -53,9 +75,11 @@ module EducodeSales
53
75
  EducodeSales::ActivityStaff.create(name: d[1], clazz_id: 'expert', activity_id: activity.id)
54
76
  end
55
77
  end
56
- # file_path = Util::FileManage.disk_filename('educode_sales_activtiy', activity.id)
57
- # Util.write_file(params[:file], file_path)
58
- # activity.update(filename: file_path)
78
+ if params[:attachment_id].present?
79
+ attachment = @current_admin.user.attachments.find(params[:attachment_id])
80
+ attachment.container = activity
81
+ attachment.save
82
+ end
59
83
  render_success
60
84
  else
61
85
  render_failure activity
@@ -86,6 +110,23 @@ module EducodeSales
86
110
  activity.manages = manages
87
111
  activity.assists = assists
88
112
  activity.experts = experts
113
+
114
+ if params[:attachment_id].present?
115
+ if activity.attachment&.id && activity.attachment&.id != params[:attachment_id].to_i
116
+ file_path = File.join(Rails.root, "public", "files", 'educode_sales', activity.attachment.disk_filename)
117
+ File.delete(file_path) if File.exist?(file_path)
118
+ activity.attachment.destroy
119
+ end
120
+ attachment = @current_admin.user.attachments.find(params[:attachment_id])
121
+ attachment.container = activity
122
+ attachment.save
123
+ else
124
+ if activity.attachment
125
+ file_path = File.join(Rails.root, "public", "files", 'educode_sales', activity.attachment.disk_filename)
126
+ File.delete(file_path) if File.exist?(file_path)
127
+ activity.attachment.destroy
128
+ end
129
+ end
89
130
  if activity.save
90
131
  render_success
91
132
  else
@@ -95,6 +136,11 @@ module EducodeSales
95
136
 
96
137
  def destroy
97
138
  activity = Activity.find(params[:id])
139
+ if activity.attachment
140
+ file_path = File.join(Rails.root, "public", "files", 'educode_sales', activity.attachment.disk_filename)
141
+ File.delete(file_path) if File.exist?(file_path)
142
+ activity.attachment.destroy
143
+ end
98
144
  activity.destroy
99
145
  render_success
100
146
  rescue ActiveRecord::DeleteRestrictionError => e
@@ -1080,6 +1080,16 @@ module EducodeSales
1080
1080
  end
1081
1081
  end
1082
1082
 
1083
+ def update_advise
1084
+ business = Business.find(params[:id])
1085
+ if business.last_follow_up.present?
1086
+ business.last_follow_up.update(advise: params[:content])
1087
+ render_success
1088
+ else
1089
+ render_failure '无跟进动态,暂不能添加建议'
1090
+ end
1091
+ end
1092
+
1083
1093
  private
1084
1094
 
1085
1095
  def load_business
@@ -251,6 +251,12 @@ module EducodeSales
251
251
  end
252
252
  end
253
253
 
254
+ def update_advise
255
+ followup = FollowUp.find(params[:id])
256
+ followup.update(advise: params[:content])
257
+ render_success
258
+ end
259
+
254
260
  private
255
261
 
256
262
  def load_business
@@ -62,10 +62,18 @@ module EducodeSales
62
62
  @staffs = @staffs.where(is_admin: false).where.not(id: @current_admin.id).where(job_type: common.id).page(params[:page]).per(10)
63
63
  end
64
64
  end
65
+
65
66
  def staff_schools
66
67
  @schools = School.all
67
68
  if params[:q].present?
68
- @schools = @schools.where("name like :q OR province like :q",q: "%#{params[:q]}%").page(params[:page]).per(10)
69
+ @schools = @schools.where("name like :q OR province like :q", q: "%#{params[:q]}%").page(params[:page]).per(10)
70
+ end
71
+ end
72
+
73
+ def staff_departments
74
+ @departments = Department.where(school_id: params[:school_id])
75
+ if params[:q].present?
76
+ @departments = @departments.where("name like :q", q: "%#{params[:q]}%").page(params[:page]).per(10)
69
77
  end
70
78
  end
71
79
 
@@ -103,9 +103,11 @@ module EducodeSales
103
103
  gon.staffs = staffs.map { |d| { name: d.user.real_name, value: d.id } }
104
104
  gon.staff_value = [{ name: @idea.staff&.user&.real_name, value: @idea.staff_id }]
105
105
  gon.sale_staff_value = [{ name: @idea.sale_staff&.user&.real_name, value: @idea.sale_staff_id }]
106
- gon.assist_staff_value = @idea.assist_staffs.map {|d|{ name: d&.user&.real_name, value: d.id }}
106
+ gon.assist_staff_value = @idea.assist_staffs.map { |d| { name: d&.user&.real_name, value: d.id } }
107
107
  gon.department = { value: @idea&.department_id, name: "#{@idea&.department&.school&.name}-#{@idea&.department&.name}" }
108
108
  gon.value = @idea.department_id
109
+ gon.department_list = @idea.department.present? ? [{ name: @idea.department.name, value: @idea.department_id }] : []
110
+ gon.school_list = @idea.school.present? ? [{ name: @idea.school.name, value: @idea.school_id }] : []
109
111
  render layout: false
110
112
  end
111
113
 
@@ -44,7 +44,7 @@ module EducodeSales
44
44
  else
45
45
  logger.info "文件已存在,id = #{@attachment.id}, filename = #{@attachment.filename}"
46
46
  end
47
- render json: { success: true, attachment_id: @attachment.id ,filename: @attachment.filename}
47
+ render json: { success: true, attachment_id: @attachment.id ,filename: @attachment.filename, url: folder + "/" + @attachment.disk_filename}
48
48
  end
49
49
 
50
50
  def destroy
@@ -8,6 +8,8 @@ module EducodeSales
8
8
  has_many :experts , -> {where("educode_sales_activity_staffs.clazz_id = 2")}, dependent: :destroy, class_name: 'ActivityStaff'
9
9
  has_many :activity_staffs
10
10
 
11
+ has_one :attachment, as: :container, dependent: :destroy
12
+
11
13
  enum clazz_id: ['全国会议', '区域会议', '单校会议', '国赛', '省赛', '夏令营']
12
14
  end
13
15
  end
@@ -52,14 +52,10 @@ module EducodeSales
52
52
 
53
53
  def save_history(attr, old_value, new_value)
54
54
  case attr
55
- when "school_name"
55
+ when "school_id"
56
+ old_value = School.find_by(id: old_value)&.name
57
+ new_value = School.find_by(id: new_value)&.name
56
58
  "学校/单位由“#{old_value}”变更为“#{new_value}”"
57
- when "department_name"
58
- "院系/部门由“#{old_value}”变更为“#{new_value}”"
59
- # when "school_id"
60
- # old_value = School.find_by(id: old_value)&.name
61
- # new_value = School.find_by(id: new_value)&.name
62
- # "学校/单位由“#{old_value}”变更为“#{new_value}”"
63
59
  when "name"
64
60
  "项目名称由“#{old_value}”变更为“#{new_value}”"
65
61
  when "level"
@@ -84,10 +80,10 @@ module EducodeSales
84
80
  "截止时间由“#{old_value}”变更为“#{new_value}”"
85
81
  when "content"
86
82
  "反馈情况由“#{old_value}”变更为“#{new_value}”"
87
- # when "department_id"
88
- # old_value = Department.find_by(id: old_value)&.name
89
- # new_value = Department.find_by(id: new_value)&.name
90
- # "院系/部门由“#{old_value}”变更为“#{new_value}”"
83
+ when "department_id"
84
+ old_value = Department.find_by(id: old_value)&.name
85
+ new_value = Department.find_by(id: new_value)&.name
86
+ "院系/部门由“#{old_value}”变更为“#{new_value}”"
91
87
  when "manager_name"
92
88
  "学校负责人由“#{old_value}”变更为“#{new_value}”"
93
89
  when "manager_phone"
@@ -1,7 +1,7 @@
1
1
  <%= Gon::Base.render_data %>
2
2
  <div class="layuimini-main">
3
3
  <form class="layui-form layuimini-form" action="">
4
- <div class="layui-form-item" style="padding: 25px">
4
+ <div class="layui-form-item">
5
5
  <div class="layui-inline">
6
6
  <label class="layui-form-label required">活动名称</label>
7
7
  <div class="layui-input-block">
@@ -41,9 +41,18 @@
41
41
  <div id="expert_list" style="width: 600px;"></div>
42
42
  </div>
43
43
  </div>
44
+ </div>
45
+ <div class="layui-form-item">
44
46
  <div class="layui-inline">
45
47
  <label class="layui-form-label">上传附件</label>
46
48
  <div class="layui-input-block">
49
+ <%= hidden_field_tag 'attachment_id', @activity.attachment&.id %>
50
+ <span id="attachment">
51
+ <% if @activity.attachment %>
52
+ <%= link_to @activity.attachment&.filename.to_s, "/missions/upload_files/download?id=#{@activity.attachment&.id}", target: '_blank' %>
53
+ <a href="javascript:;" style="color:red;" id="delete">删除</a>
54
+ <% end %>
55
+ </span>
47
56
  <button type="button" class="layui-btn" id="upload_file">上传文件</button>
48
57
  </div>
49
58
  </div>
@@ -65,6 +74,7 @@
65
74
  request = layui.request,
66
75
  $ = layui.$,
67
76
  xmSelect = layui.xmSelect,
77
+ upload = layui.upload,
68
78
  laydate = layui.laydate;
69
79
 
70
80
  //常规用法
@@ -89,6 +99,18 @@
89
99
  }
90
100
  })
91
101
 
102
+ upload.render({
103
+ elem: '#upload_file',
104
+ url: '/missions/upload_files',
105
+ auto: true,
106
+ accept: 'file',
107
+ done: function (res) {
108
+ layer.msg('上传成功');
109
+ $("#attachment_id").val(res.attachment_id);
110
+ document.getElementById("attachment").innerHTML = '<a target="_blank" href="' + res.url+ '">' + res.filename + '</a><a href="javascript:;" style="color:red;" id="delete">删除</a>';
111
+ }
112
+ });
113
+
92
114
  var staff_manage = xmSelect.render({
93
115
  el: '#staff_manage_list',
94
116
  data: gon.staff_manage,
@@ -115,12 +137,16 @@
115
137
  } else {
116
138
  cb(res.data);
117
139
  }
118
-
119
140
  })
120
141
  },
121
142
  data: gon.experts
122
143
  })
123
144
 
145
+ $(body).on("click", "#delete", function() {
146
+ document.getElementById("attachment").innerHTML = "";
147
+ $("#attachment_id").val('');
148
+ })
149
+
124
150
  //监听提交
125
151
  form.on('submit(data-reset-btn)', function (data) {
126
152
  data.field.staff_manage_id = staff_manage.getValue('value');
@@ -7,6 +7,54 @@
7
7
  <% end %>
8
8
  </div>
9
9
  </script>
10
+ <div style="margin: 10px 10px 10px 10px">
11
+ <form class="layui-form layui-form-pane" lay-filter="search_ideas">
12
+ <div class="layui-form-item">
13
+ <div class="layui-inline ">
14
+ <label class="layui-form-label">活动名称</label>
15
+ <div class="layui-input-inline">
16
+ <input type="text" class="layui-input" name="name" autocomplete="off">
17
+ </div>
18
+ </div>
19
+ <div class="layui-inline">
20
+ <label class="layui-form-label">会议类型</label>
21
+ <div class="layui-input-inline">
22
+ <%= select_tag "clazz_id", options_for_select(['全国会议', '区域会议', '单校会议', '国赛', '省赛', '夏令营'], ""), { include_blank: true } %>
23
+ </div>
24
+ </div>
25
+ <div class="layui-inline">
26
+ <label class="layui-form-label">销售经理</label>
27
+ <div class="layui-input-inline">
28
+ <%= select_tag "staff_id", options_for_select(@staffs, ""), { include_blank: true } %>
29
+ </div>
30
+ </div>
31
+ <div class="layui-inline">
32
+ <label class="layui-form-label">生态经理</label>
33
+ <div class="layui-input-inline">
34
+ <%= select_tag "manage", options_for_select(@staffs, ""), { include_blank: true } %>
35
+ </div>
36
+ </div>
37
+ <div class="layui-inline">
38
+ <label class="layui-form-label">协助人员</label>
39
+ <div class="layui-input-inline">
40
+ <%= select_tag "assists", options_for_select(@staffs, ""), { include_blank: true } %>
41
+ </div>
42
+ </div>
43
+ <div class="layui-inline">
44
+ <label class="layui-form-label">报告专家</label>
45
+ <div class="layui-input-inline">
46
+ <input type="text" class="layui-input" name="expert" autocomplete="off">
47
+ </div>
48
+ </div>
49
+ <div class="layui-inline">
50
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_activity_search">重置
51
+ </button>
52
+ <button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_activity">搜 索
53
+ </button>
54
+ </div>
55
+ </div>
56
+ </form>
57
+ </div>
10
58
  <div class="min-height-table">
11
59
  <table class="layui-hide" id="activities_table" lay-filter="activities_table"></table>
12
60
  </div>
@@ -129,6 +177,17 @@
129
177
  }
130
178
  });
131
179
  })
180
+ // 监听搜索操作
181
+ form.on('submit(search_activity)', function (data) {
182
+ search = data.field
183
+ table.reload('activities_table', {
184
+ page: {
185
+ curr: 1
186
+ },
187
+ where: {q: search, sort: sort}
188
+ }, 'data');
189
+ return false;
190
+ });
132
191
  table.on('toolbar(activities_table)', function (obj) {
133
192
  if (obj.event === 'add') { // 监听添加操作
134
193
  var content = miniPage.getHrefContent('/missions/activities/new');
@@ -1,7 +1,7 @@
1
1
  <%= Gon::Base.render_data %>
2
2
  <div class="layuimini-main">
3
3
  <div class="layui-form layuimini-form">
4
- <div class="layui-form-item" style="padding: 25px">
4
+ <div class="layui-form-item">
5
5
  <div class="layui-inline">
6
6
  <label class="layui-form-label required">活动名称</label>
7
7
  <div class="layui-input-block">
@@ -44,9 +44,14 @@
44
44
  <div id="expert_list" style="width: 600px;"></div>
45
45
  </div>
46
46
  </div>
47
+ </div>
48
+ <div class="layui-form-item">
47
49
  <div class="layui-inline">
48
50
  <label class="layui-form-label">上传附件</label>
49
51
  <div class="layui-input-block">
52
+ <%= hidden_field_tag 'attachment_id' %>
53
+ <span id="attachment">
54
+ </span>
50
55
  <button type="button" class="layui-btn" id="upload_file">上传文件</button>
51
56
  </div>
52
57
  </div>
@@ -111,17 +116,22 @@
111
116
  })
112
117
 
113
118
 
114
-
115
119
  upload.render({
116
- elem: '#upload_file'
117
- ,url: '' //此处配置你自己的上传接口即可
118
- ,accept: 'file' //普通文件
119
- ,auto: false
120
- ,done: function(res){
120
+ elem: '#upload_file',
121
+ url: '/missions/upload_files',
122
+ auto: true,
123
+ accept: 'file',
124
+ done: function (res) {
121
125
  layer.msg('上传成功');
126
+ $("#attachment_id").val(res.attachment_id);
127
+ document.getElementById("attachment").innerHTML = '<a target="_blank" href="' + res.url+ '">' + res.filename + '</a><a href="javascript:;" style="color:red;" id="delete">删除</a>';
122
128
  }
123
- });
124
-
129
+ });
130
+
131
+ $(body).on("click", "#delete", function() {
132
+ document.getElementById("attachment").innerHTML = "";
133
+ $("#attachment_id").val('');
134
+ })
125
135
  form.render();
126
136
 
127
137
  // 当前弹出层,防止ID被覆盖
@@ -58,6 +58,9 @@
58
58
  </script>
59
59
  <script type="text/html" id="currentTableBar_follows">
60
60
  <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">详情</a>
61
+ <% if can?(:advise, EducodeSales::Business) %>
62
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="add_advise">团队建议</a>
63
+ <% end %>
61
64
  </script>
62
65
  <script type="text/html" id="business">
63
66
  <a href="javascript:void(0);" lay-event="business" class="layui-table-link">{{ d.business }}</a>
@@ -163,7 +166,7 @@
163
166
  },
164
167
  {
165
168
  title: '操作',
166
- width: 80,
169
+ width: 160,
167
170
  toolbar: '#currentTableBar_follows',
168
171
  align: "center",
169
172
  fixed: 'right'
@@ -280,6 +283,36 @@
280
283
  $(window).on("resize", function () {
281
284
  layer.full(index);
282
285
  });
286
+ } else if (obj.event == 'add_advise') {
287
+ layer.open({
288
+ title: '添加团队建议',
289
+ closeBtn: 0,
290
+ type: 1,
291
+ area: '400px;',
292
+ id: 'LAY_layuipro',
293
+ content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea">' + data.advise + '</textarea></div>' ,
294
+ btn: ['保存', '取消'],
295
+ btn1: function(index, l) {
296
+ if (l.find("textarea").val().trim() == '') {
297
+ layer.msg('内容不能为空')
298
+ return false;
299
+ } else {
300
+ request.authPut("/missions/follow_ups/" + data.id + "/update_advise", {content: l.find("textarea").val().trim()}, function(res) {
301
+ if (res.success == false) {
302
+ layer.alert(res.msg);
303
+ } else {
304
+ layer.close(index);
305
+ table.reload('teachers_table');
306
+ }
307
+ })
308
+ }
309
+
310
+ return false
311
+ },
312
+ btn2: function(index, l) {
313
+ layer.close(index)
314
+ }
315
+ });
283
316
  }
284
317
  });
285
318
 
@@ -172,31 +172,35 @@
172
172
  </script>
173
173
  <script type="text/html" id="currentTableBar">
174
174
  <%unless !can?(:add_follow, EducodeSales::Business) && can?(:self_add_follow, EducodeSales::Business) %>
175
- <% if can? :add_follow, EducodeSales::Business %>
176
- <% if @current_admin.is_admin %>
177
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
178
- <% else %>
179
- {{# if ( d.assign_follow_ups.length > 0 && d.assign_follow_ups.indexOf(d.current_staff_id) >=0 || (d.assign_follow_ups.length == 0) || (d.current_staff_id == d.staff_id) ) {}}
180
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
181
- {{# }}}
182
- <% end %>
183
- <% end %>
175
+ <% if can? :add_follow, EducodeSales::Business %>
176
+ <% if @current_admin.is_admin %>
177
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
178
+ <% else %>
179
+ {{# if ( d.assign_follow_ups.length > 0 && d.assign_follow_ups.indexOf(d.current_staff_id) >=0 || (d.assign_follow_ups.length == 0) || (d.current_staff_id == d.staff_id) ) {}}
180
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
181
+ {{# }}}
182
+ <% end %>
183
+ <% end %>
184
184
  <% end %>
185
185
  <%if !can?(:add_follow, EducodeSales::Business) && can?(:self_add_follow, EducodeSales::Business)%>
186
186
  {{# if (d.self_flag) {}}
187
- <% if @current_admin.is_admin %>
188
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
189
- <% else %>
190
- {{# if ( d.assign_follow_ups.length > 0 && d.assign_follow_ups.indexOf(d.current_staff_id) >=0 || (d.assign_follow_ups.length == 0) || (d.current_staff_id == d.staff_id) ) {}}
191
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
192
- {{# }}}
193
- <% end %>
187
+ <% if @current_admin.is_admin %>
188
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
189
+ <% else %>
190
+ {{# if ( d.assign_follow_ups.length > 0 && d.assign_follow_ups.indexOf(d.current_staff_id) >=0 || (d.assign_follow_ups.length == 0) || (d.current_staff_id == d.staff_id) ) {}}
191
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="add_event">添加跟进记录</a>
192
+ {{# }}}
193
+ <% end %>
194
194
  {{# }}}
195
195
  <% end %>
196
- <%if can?(:update, EducodeSales::Business)%>
197
- <%unless !can?(:update, EducodeSales::Business) && can?(:self_edit_business, EducodeSales::Business)%>
198
- <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
196
+ <% if can?(:advise, EducodeSales::Business) %>
197
+ <a class="layui-btn layui-btn-default layui-btn-xs data-count-edit" lay-event="add_advise">建议</a>
199
198
  <% end %>
199
+
200
+ <%if can?(:update, EducodeSales::Business)%>
201
+ <%unless !can?(:update, EducodeSales::Business) && can?(:self_edit_business, EducodeSales::Business)%>
202
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
203
+ <% end %>
200
204
  <% end %>
201
205
  <%if !can?(:update, EducodeSales::Business) && can?(:self_edit_business, EducodeSales::Business)%>
202
206
  {{# if (d.self_flag) {}}
@@ -210,6 +214,7 @@
210
214
  <a class="layui-btn-xs data-count-edit more-btn more-btn2" data-name={{d.name}} data-id={{d.id}} data-clazz="{{d.extras_clazz}}">更多<i class="layui-icon layui-icon-down layui-nav-more"></i></a>
211
215
  {{# }}}
212
216
  <% end %>
217
+
213
218
  </script>
214
219
 
215
220
  <script type="text/html" id="show_keys">
@@ -603,7 +608,7 @@
603
608
  },
604
609
  {
605
610
  title: '操作',
606
- minWidth: 220,
611
+ minWidth: 270,
607
612
  toolbar: '#currentTableBar',
608
613
  align: "center",
609
614
  fixed: 'right'
@@ -1379,6 +1384,36 @@
1379
1384
  ,cancel: function(){
1380
1385
  }
1381
1386
  });
1387
+ } else if (obj.event == 'add_advise') {
1388
+ layer.open({
1389
+ title: '添加团队建议',
1390
+ closeBtn: 0,
1391
+ type: 1,
1392
+ area: '400px;',
1393
+ id: 'LAY_layuipro',
1394
+ content: '<div class="layui-form" lay-filter="edit_project" style="padding: 20px;"><textarea autocomplete="off" type="text" name="name" lay-verify="required" class="layui-textarea">' + data.advise + '</textarea></div>' ,
1395
+ btn: ['保存', '取消'],
1396
+ btn1: function(index, l) {
1397
+ if (l.find("textarea").val().trim() == '') {
1398
+ layer.msg('内容不能为空')
1399
+ return false;
1400
+ } else {
1401
+ request.authPut("/missions/businesses/" + data.id + "/update_advise", {content: l.find("textarea").val().trim()}, function(res) {
1402
+ if (res.success == false) {
1403
+ layer.alert(res.msg);
1404
+ } else {
1405
+ layer.close(index);
1406
+ table.reload("businesses_table",{url: '/missions/businesses', cols: cols_table})
1407
+ }
1408
+ })
1409
+ }
1410
+
1411
+ return false
1412
+ },
1413
+ btn2: function(index, l) {
1414
+ layer.close(index)
1415
+ }
1416
+ });
1382
1417
  }
1383
1418
  drowpdwonRender()
1384
1419
  });
@@ -20,6 +20,7 @@ json.data do
20
20
  json.reception_at d.last_follow_up&.reception_at.to_s
21
21
  json.bidded_date d.last_follow_up&.bidded_date.to_s
22
22
  json.signed_date d.last_follow_up&.signed_date.to_s
23
+ json.advise d.last_follow_up&.advise.to_s
23
24
  json.o_business_deployment EducodeSales::FollowUp::BUSINESS_DEPLOYMENT[1..-1].to_h.invert[d.last_follow_up&.o_business_deployment]
24
25
  json.service_end_time d.last_follow_up&.service_start_time.to_s + "-" + d.last_follow_up&.service_end_time.to_s
25
26
  json.created_at d.created_at.to_s
@@ -0,0 +1,9 @@
1
+ json.data do
2
+ json.array! @departments do |d|
3
+ json.value d.id
4
+ json.name "#{d.name}"
5
+ end
6
+ end
7
+ json.count @departments.size
8
+ json.code 0
9
+ json.msg "success"
@@ -18,13 +18,13 @@
18
18
  <div class="layui-inline">
19
19
  <label class="layui-form-label" style="width: 100px">学校/单位:</label>
20
20
  <div class="layui-input-inline">
21
- <%= idea.school_name %>
21
+ <%= idea.school&.name %>
22
22
  </div>
23
23
  </div>
24
24
  <div class="layui-inline">
25
25
  <label class="layui-form-label" style="width: 100px">院系/部门:</label>
26
26
  <div class="layui-input-inline">
27
- <%= idea.department_name %>
27
+ <%= idea.department&.name %>
28
28
  </div>
29
29
  </div>
30
30
  <div class="layui-inline">
@@ -1,7 +1,7 @@
1
1
  json.data do
2
2
  json.array! @ideas do |d|
3
3
  json.(d, :id, :name, :level, :status, :types, :model, :content)
4
- json.school d.school_name
4
+ json.school d.school&.name
5
5
  json.staff d.staff&.user&.real_name
6
6
  json.hardware d.hardware.to_f.round(2)
7
7
  json.project d.project.to_i
@@ -18,13 +18,13 @@
18
18
  <div class="layui-inline">
19
19
  <label class="layui-form-label" style="width: 100px">学校/单位:</label>
20
20
  <div class="layui-input-inline">
21
- <%= idea.school_name %>
21
+ <%= idea.school&.name %>
22
22
  </div>
23
23
  </div>
24
24
  <div class="layui-inline">
25
25
  <label class="layui-form-label" style="width: 100px">院系/部门:</label>
26
26
  <div class="layui-input-inline">
27
- <%= idea.department_name %>
27
+ <%= idea.department&.name %>
28
28
  </div>
29
29
  </div>
30
30
  <div class="layui-inline">
@@ -9,13 +9,13 @@
9
9
  <div class="layui-col-md6">
10
10
  <labeL class="layui-form-label required">学校/单位:</labeL>
11
11
  <div class="layui-input-block">
12
- <input type="text" name="school_name" autocomplete="off" lay-verify="required" lay-reqtext="学校不能为空" placeholder="请输入学校/单位名称" value="<%= @idea&.school_name %>" class="layui-input">
12
+ <div id="school_id" style="width: 600px;"></div>
13
13
  </div>
14
14
  </div>
15
15
  <div class="layui-col-md6">
16
16
  <labeL class="layui-form-label">院系/部门:</labeL>
17
17
  <div class="layui-input-block">
18
- <input type="text" name="department_name" autocomplete="off" placeholder="请输入院系/部门名称" value="<%= @idea&. department_name %>" class="layui-input">
18
+ <div id="department_id" style="width: 600px;"></div>
19
19
  </div>
20
20
  </div>
21
21
  </div>
@@ -176,17 +176,107 @@
176
176
 
177
177
  layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'selectInput', 'xmSelect', 'upload'], function () {
178
178
  var form = layui.form,
179
- layer = layui.layer,
180
- request = layui.request,
181
- laydate = layui.laydate,
182
- table = layui.table,
183
- laytpl = layui.laytpl,
184
- request = layui.request,
185
- xmSelect = layui.xmSelect,
186
- upload = layui.upload,
187
- $ = layui.$;
179
+ layer = layui.layer,
180
+ request = layui.request,
181
+ laydate = layui.laydate,
182
+ table = layui.table,
183
+ laytpl = layui.laytpl,
184
+ request = layui.request,
185
+ xmSelect = layui.xmSelect,
186
+ upload = layui.upload,
187
+ $ = layui.$;
188
188
  selectInput = layui.selectInput;
189
189
 
190
+
191
+ var school_list = xmSelect.render({
192
+ el: '#school_id',
193
+ remoteSearch: true,
194
+ autoRow: true,
195
+ radio: true,
196
+ delay: 1000,
197
+ tips: '支持学校名称搜索,请至少输入一个字符',
198
+ searchTips: '支持名称/省份搜索,请至少输入一个字符',
199
+ paging: true,
200
+ pageRemote: true,
201
+ filterable: true,
202
+ remoteMethod: function (val, cb, show, pageIndex) {
203
+ if (!val) {
204
+ return cb([]);
205
+ }
206
+ $.ajax('/missions/staff_schools', {
207
+ method: 'get',
208
+ data: {
209
+ q: val,
210
+ page: pageIndex
211
+ },
212
+ dataType: 'json',
213
+ success: function (res) {
214
+ var data = res.data;
215
+ if (res.code == 0) {
216
+ cb(res.data, res.count);
217
+ } else {
218
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
219
+ }
220
+ }
221
+ })
222
+ }
223
+ })
224
+
225
+ var department_list = xmSelect.render({
226
+ el: '#department_id',
227
+ remoteSearch: true,
228
+ autoRow: true,
229
+ radio: true,
230
+ delay: 1000,
231
+ tips: '支持学校名称搜索,请至少输入一个字符',
232
+ searchTips: '支持名称/省份搜索,请至少输入一个字符',
233
+ paging: true,
234
+ pageRemote: true,
235
+ filterable: true,
236
+ remoteMethod: function (val, cb, show, pageIndex) {
237
+
238
+ var schools = [];
239
+ school_list.getValue().forEach(function (d) {
240
+ schools.push(d.value);
241
+ })
242
+ // if (schools.length == 0) {
243
+ // layer.alert("请选择学校");
244
+ // return false;
245
+ // }
246
+ school_id = schools[0];
247
+
248
+
249
+ if (!val) {
250
+ return cb([]);
251
+ }
252
+ $.ajax('/missions/staff_departments?school_id=' + school_id, {
253
+ method: 'get',
254
+ data: {
255
+ q: val,
256
+ page: pageIndex
257
+ },
258
+ dataType: 'json',
259
+ success: function (res) {
260
+ var data = res.data;
261
+ if (res.code == 0) {
262
+ cb(res.data, res.count);
263
+ } else {
264
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
265
+ }
266
+ }
267
+ })
268
+ }
269
+ })
270
+
271
+
272
+ department_list.setValue(
273
+ gon.department_list
274
+ )
275
+ school_list.setValue(
276
+ gon.school_list
277
+ )
278
+
279
+
190
280
  form.render();
191
281
  //时间常规用法
192
282
  laydate.render({
@@ -261,26 +351,36 @@
261
351
 
262
352
  //监听提交
263
353
  form.on('submit(saveBtn)', function (data) {
264
- // if (department.getValue() == "" && department_id == "") {
265
- // layer.alert("请选择单位部门")
266
- // return false;
267
- // } else {
268
- data.field.department_id = department.getValue() || department_id;
269
- data.field.staff_id = staff_list.getValue('valueStr');
354
+ data.field.staff_id = staff_list.getValue('valueStr');
270
355
  data.field.sale_staff_id = sale_staff_list.getValue('valueStr');
271
356
  data.field.assist_staff_ids = assist_staff_list.getValue('valueStr');
272
- request.authPut("missions/ideas/" + parent.id, data.field, function (res) {
273
- if (res.success == false) {
274
- layer.alert(res.msg)
275
- } else {
276
- layer.close(parent.edit_index);
277
- parent.layer.close(parent.layer.getFrameIndex(window.name))
278
- parent.table.reload('ideas_table', {
279
- done: function () {
280
- }
281
- });
282
- }
283
- })
357
+ var schools = [];
358
+ school_list.getValue().forEach(function (d) {
359
+ schools.push(d.value);
360
+ })
361
+ if (schools.length == 0) {
362
+ layer.alert("请选择学校");
363
+ return false;
364
+ }
365
+ data.field.school_id = schools[0];
366
+
367
+ var departments = [];
368
+ department_list.getValue().forEach(function (d) {
369
+ departments.push(d.value);
370
+ })
371
+ data.field.department_id = departments[0];
372
+ request.authPut("missions/ideas/" + parent.id, data.field, function (res) {
373
+ if (res.success == false) {
374
+ layer.alert(res.msg)
375
+ } else {
376
+ layer.close(parent.edit_index);
377
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
378
+ parent.table.reload('ideas_table', {
379
+ done: function () {
380
+ }
381
+ });
382
+ }
383
+ })
284
384
  // }
285
385
  return false;
286
386
  });
@@ -1,7 +1,7 @@
1
1
  json.data do
2
2
  json.array! @ideas do |d|
3
3
  json.(d, :id, :name, :level, :status, :types, :model, :content)
4
- json.school d.school_name
4
+ json.school d.school&.name
5
5
  json.staff d.staff&.user&.real_name
6
6
  json.hardware d.hardware
7
7
  json.project d.project
@@ -9,13 +9,13 @@
9
9
  <div class="layui-col-md6">
10
10
  <labeL class="layui-form-label required">学校/单位:</labeL>
11
11
  <div class="layui-input-block">
12
- <input type="text" name="school_name" autocomplete="off" lay-verify="required" lay-reqtext="学校不能为空" placeholder="请输入学校/单位名称" value="<%= @idea&.school_name %>" class="layui-input">
12
+ <div id="school_id" style="width: 600px;"></div>
13
13
  </div>
14
14
  </div>
15
15
  <div class="layui-col-md6">
16
16
  <labeL class="layui-form-label">院系/部门:</labeL>
17
17
  <div class="layui-input-block">
18
- <input type="text" name="department_name" autocomplete="off" placeholder="请输入院系/部门名称" value="<%= @idea&.department_name %>" class="layui-input">
18
+ <div id="department_id" style="width: 600px;"></div>
19
19
  </div>
20
20
  </div>
21
21
  </div>
@@ -194,6 +194,87 @@
194
194
  });
195
195
  form.render();
196
196
 
197
+ var school_list = xmSelect.render({
198
+ el: '#school_id',
199
+ remoteSearch: true,
200
+ autoRow: true,
201
+ radio: true,
202
+ delay: 1000,
203
+ tips: '支持学校名称搜索,请至少输入一个字符',
204
+ searchTips: '支持名称/省份搜索,请至少输入一个字符',
205
+ paging: true,
206
+ pageRemote: true,
207
+ filterable: true,
208
+ remoteMethod: function (val, cb, show, pageIndex) {
209
+ if (!val) {
210
+ return cb([]);
211
+ }
212
+ $.ajax('/missions/staff_schools', {
213
+ method: 'get',
214
+ data: {
215
+ q: val,
216
+ page: pageIndex
217
+ },
218
+ dataType: 'json',
219
+ success: function (res) {
220
+ var data = res.data;
221
+ if (res.code == 0) {
222
+ cb(res.data, res.count);
223
+ } else {
224
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
225
+ }
226
+ }
227
+ })
228
+ }
229
+ })
230
+
231
+ var department_list = xmSelect.render({
232
+ el: '#department_id',
233
+ remoteSearch: true,
234
+ autoRow: true,
235
+ radio: true,
236
+ delay: 1000,
237
+ tips: '支持学校名称搜索,请至少输入一个字符',
238
+ searchTips: '支持名称/省份搜索,请至少输入一个字符',
239
+ paging: true,
240
+ pageRemote: true,
241
+ filterable: true,
242
+ remoteMethod: function (val, cb, show, pageIndex) {
243
+
244
+ var schools = [];
245
+ school_list.getValue().forEach(function (d) {
246
+ schools.push(d.value);
247
+ })
248
+ // if (schools.length == 0) {
249
+ // layer.alert("请选择学校");
250
+ // return false;
251
+ // }
252
+ school_id = schools[0];
253
+
254
+
255
+ if (!val) {
256
+ return cb([]);
257
+ }
258
+ $.ajax('/missions/staff_departments?school_id=' + school_id, {
259
+ method: 'get',
260
+ data: {
261
+ q: val,
262
+ page: pageIndex
263
+ },
264
+ dataType: 'json',
265
+ success: function (res) {
266
+ var data = res.data;
267
+ if (res.code == 0) {
268
+ cb(res.data, res.count);
269
+ } else {
270
+ layer.msg(res.msg, {time: 2000, icon: 2, shade: 0.01});
271
+ }
272
+ }
273
+ })
274
+ }
275
+ })
276
+
277
+
197
278
  upload.render({
198
279
  elem: '#test8'
199
280
  , url: '/missions/upload_files' //此处配置你自己的上传接口即可
@@ -252,7 +333,7 @@
252
333
  el: '#assist_staff_ids',
253
334
  data: gon.staffs,
254
335
  filterable: true,
255
- multiple:true
336
+ multiple: true
256
337
  })
257
338
 
258
339
  //监听提交
@@ -261,17 +342,32 @@
261
342
  // layer.alert("请选择单位部门")
262
343
  // return false;
263
344
  // } else {
264
- data.field.department_id = department.getValue() || department_id;
265
- data.field.staff_id = staff_list.getValue('valueStr');
266
- data.field.sale_staff_id = sale_staff_list.getValue('valueStr');
267
- data.field.assist_staff_ids = assist_staff_list.getValue('valueStr');
268
- request.authPost("missions/ideas/", data.field, function (res) {
269
- if (res.success == false) {
270
- layer.alert(res.msg)
271
- } else {
272
- layer.close(parent.add_idea_index);
273
- parent.layer.close(parent.layer.getFrameIndex(window.name))
274
- parent.table.reload('ideas_table', {
345
+
346
+ var schools = [];
347
+ school_list.getValue().forEach(function (d) {
348
+ schools.push(d.value);
349
+ })
350
+ if (schools.length == 0) {
351
+ layer.alert("请选择学校");
352
+ return false;
353
+ }
354
+ data.field.school_id = schools[0];
355
+
356
+ var departments = [];
357
+ department_list.getValue().forEach(function (d) {
358
+ departments.push(d.value);
359
+ })
360
+ data.field.department_id = departments[0];
361
+ data.field.staff_id = staff_list.getValue('valueStr');
362
+ data.field.sale_staff_id = sale_staff_list.getValue('valueStr');
363
+ data.field.assist_staff_ids = assist_staff_list.getValue('valueStr');
364
+ request.authPost("missions/ideas/", data.field, function (res) {
365
+ if (res.success == false) {
366
+ layer.alert(res.msg)
367
+ } else {
368
+ layer.close(parent.add_idea_index);
369
+ parent.layer.close(parent.layer.getFrameIndex(window.name))
370
+ parent.table.reload('ideas_table', {
275
371
  done: function () {
276
372
  }
277
373
  });
data/config/routes.rb CHANGED
@@ -14,6 +14,7 @@ EducodeSales::Engine.routes.draw do
14
14
  get :sales_staff, to: "home#sales_staff"
15
15
  get :sales_place, to: "home#sales_place"
16
16
  get :staff_schools, to: "home#staff_schools"
17
+ get :staff_departments, to: "home#staff_departments"
17
18
  get :filter, to: "application#filter"
18
19
 
19
20
 
@@ -82,6 +83,7 @@ EducodeSales::Engine.routes.draw do
82
83
  get :money_plans
83
84
  put :update_money
84
85
  delete :delete_money
86
+ put :update_advise
85
87
  end
86
88
  end
87
89
 
@@ -118,6 +120,7 @@ EducodeSales::Engine.routes.draw do
118
120
  get :daily_paper
119
121
  get :search
120
122
  get :contract
123
+ get :advise
121
124
  end
122
125
 
123
126
  member do
@@ -126,6 +129,7 @@ EducodeSales::Engine.routes.draw do
126
129
  get :unfinish_plans
127
130
  put :update_follow_up
128
131
  put :audit
132
+ put :update_advise
129
133
  end
130
134
  end
131
135
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '0.9.60'
2
+ VERSION = '0.9.62'
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.9.60
4
+ version: 0.9.62
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-23 00:00:00.000000000 Z
11
+ date: 2023-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -306,6 +306,7 @@ files:
306
306
  - app/views/educode_sales/home/search_operation_teacher.json.jbuilder
307
307
  - app/views/educode_sales/home/search_teacher.json.jbuilder
308
308
  - app/views/educode_sales/home/search_users.json.jbuilder
309
+ - app/views/educode_sales/home/staff_departments.json.jbuilder
309
310
  - app/views/educode_sales/home/staff_schools.json.jbuilder
310
311
  - app/views/educode_sales/home/statistics.html.erb
311
312
  - app/views/educode_sales/idea_recycles/activities.json.jbuilder