educode_sales 0.9.66 → 0.9.68

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/educode_sales/activities_controller.rb +122 -40
  3. data/app/controllers/educode_sales/businesses_controller.rb +83 -2
  4. data/app/controllers/educode_sales/operation_plans_controller.rb +8 -4
  5. data/app/controllers/educode_sales/plans_controller.rb +173 -11
  6. data/app/controllers/educode_sales/recycles_controller.rb +11 -1
  7. data/app/controllers/educode_sales/teachers_controller.rb +4 -4
  8. data/app/controllers/educode_sales/upload_files_controller.rb +9 -2
  9. data/app/models/educode_sales/activity.rb +21 -4
  10. data/app/models/educode_sales/activity_follow_up.rb +13 -0
  11. data/app/models/educode_sales/activity_staff.rb +1 -1
  12. data/app/models/educode_sales/assessments_setting.rb +2 -2
  13. data/app/models/educode_sales/business.rb +3 -0
  14. data/app/models/educode_sales/business_info.rb +9 -0
  15. data/app/models/educode_sales/business_level.rb +11 -0
  16. data/app/models/educode_sales/business_watch.rb +6 -0
  17. data/app/models/educode_sales/sale_plan.rb +3 -1
  18. data/app/models/educode_sales/staff.rb +2 -0
  19. data/app/views/educode_sales/activities/_follows.html.erb +222 -0
  20. data/app/views/educode_sales/activities/_index.html.erb +491 -0
  21. data/app/views/educode_sales/activities/edit.html.erb +109 -53
  22. data/app/views/educode_sales/activities/files.html.erb +157 -0
  23. data/app/views/educode_sales/activities/files.json.jbuilder +13 -0
  24. data/app/views/educode_sales/activities/follow_ups.json.jbuilder +19 -0
  25. data/app/views/educode_sales/activities/index.html.erb +13 -349
  26. data/app/views/educode_sales/activities/index.json.jbuilder +11 -3
  27. data/app/views/educode_sales/activities/new.html.erb +87 -46
  28. data/app/views/educode_sales/activities/new_follow_up.html.erb +56 -0
  29. data/app/views/educode_sales/activities/upload_file.html.erb +43 -0
  30. data/app/views/educode_sales/businesses/edit.html.erb +48 -6
  31. data/app/views/educode_sales/businesses/get_export_data.json.jbuilder +3 -0
  32. data/app/views/educode_sales/businesses/index.html.erb +10 -0
  33. data/app/views/educode_sales/businesses/new.html.erb +1 -1
  34. data/app/views/educode_sales/businesses/no_permission.html.erb +2 -0
  35. data/app/views/educode_sales/plans/_yearPlan.html.erb +234 -0
  36. data/app/views/educode_sales/plans/business_infos.json.jbuilder +23 -0
  37. data/app/views/educode_sales/plans/edit_bussiness_info.html.erb +79 -0
  38. data/app/views/educode_sales/plans/edit_bussiness_info_extra.html.erb +260 -0
  39. data/app/views/educode_sales/plans/edit_year_plan.html.erb +237 -0
  40. data/app/views/educode_sales/plans/index.html.erb +8 -0
  41. data/app/views/educode_sales/plans/new_year.html.erb +204 -0
  42. data/app/views/educode_sales/plans/plan_business_infos.json.jbuilder +42 -0
  43. data/app/views/educode_sales/plans/years_plan.json.jbuilder +17 -0
  44. data/app/views/educode_sales/recycles/_monthly.html.erb +1 -1
  45. data/app/views/educode_sales/recycles/_yearPlan.html.erb +118 -0
  46. data/app/views/educode_sales/recycles/index.html.erb +26 -22
  47. data/app/views/educode_sales/recycles/monthPlan.json.jbuilder +0 -1
  48. data/app/views/educode_sales/recycles/yearPlan.json.jbuilder +14 -0
  49. data/config/routes.rb +22 -0
  50. data/db/migrate/20230329135141_create_educode_sales_business_watches.rb +17 -0
  51. data/db/migrate/20230330141213_create_educode_sales_activity_follow_ups.rb +31 -0
  52. data/db/migrate/20230405074036_add_year_to_sale_plans.rb +38 -0
  53. data/lib/educode_sales/version.rb +1 -1
  54. metadata +31 -7
  55. data/app/assets/images/educode_sales/indexlogo.png +0 -0
@@ -4,58 +4,98 @@
4
4
  <div class="layui-form-item">
5
5
  <div class="layui-inline">
6
6
  <label class="layui-form-label required">活动名称</label>
7
- <div class="layui-input-block">
8
- <input type="text" name="name" required lay-verify="required"
9
- class="layui-input" value="<%= @activity.name %>">
7
+ <div class="layui-input-block" style="width: 200px;">
8
+ <input type="text" name="name" required lay-verify="required" class="layui-input" value="<%= @activity.name %>">
10
9
  </div>
11
10
  </div>
11
+ <div class="layui-inline">
12
+ <label class="layui-form-label required">活动类型</label>
13
+ <div class="layui-input-block" style="width: 200px;">
14
+ <%= select_tag "clazz_id", options_for_select(@clazz, @activity.clazz_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
15
+ </div>
16
+ </div>
17
+ <div class="layui-inline">
18
+ <label class="layui-form-label required">活动状态</label>
19
+ <div class="layui-input-block" style="width: 200px;">
20
+ <%= select_tag "state_id", options_for_select(EducodeSales::Activity.state_ids.keys, @activity.state_id), { 'lay-filter': 'clazz_id', class: 'required' } %>
21
+ </div>
22
+ </div>
12
23
  <div class="layui-inline">
13
24
  <label class="layui-form-label required">活动时间</label>
14
- <div class="layui-input-block">
25
+ <div class="layui-input-block" style="width: 200px;">
15
26
  <input type="text" name="start_at" required lay-verify="required" class="layui-input" id="time" placeholder="请选择时间"
16
27
  value="<%= @activity.start_at&.to_s(:date) %>">
17
28
  </div>
18
29
  </div>
19
30
  <div class="layui-inline">
20
31
  <label class="layui-form-label required">活动天数</label>
21
- <div class="layui-input-block">
32
+ <div class="layui-input-block" style="width: 200px;">
22
33
  <input type="text" name="days" required lay-verify="required"
23
34
  class="layui-input" value="<%= @activity.days %>">
24
35
  </div>
25
36
  </div>
37
+ <div class="layui-inline">
38
+ <label class="layui-form-label">销售经理</label>
39
+ <div class="layui-input-block" style="width: 200px;">
40
+ <div id="sales_list" style="width: 163px;"></div>
41
+ </div>
42
+ </div>
26
43
  <div class="layui-inline">
27
44
  <label class="layui-form-label">生态经理</label>
28
- <div class="layui-input-block">
45
+ <div class="layui-input-block" style="width: 200px;">
29
46
  <div id="staff_manage_list" style="width: 163px;"></div>
30
47
  </div>
31
48
  </div>
32
49
  <div class="layui-inline">
33
- <label class="layui-form-label">协助人员</label>
34
- <div class="layui-input-block">
35
- <div id="staff_assist_list" style="width: 193px;"></div>
36
- </div>
50
+ <label class="layui-form-label">主办方</label>
51
+ <div class="layui-input-block" style="width: 200px;">
52
+ <input type="text" name="sponsor" class="layui-input" value="<%= @activity.sponsor %>">
37
53
  </div>
38
- <div class="layui-inline">
39
- <label class="layui-form-label">报告专家</label>
40
- <div class="layui-input-block">
41
- <div id="expert_list" style="width: 600px;"></div>
42
- </div>
54
+ </div>
55
+ <div class="layui-inline">
56
+ <label class="layui-form-label">联系人</label>
57
+ <div class="layui-input-block" style="width: 200px;">
58
+ <input type="text" name="linkman" class="layui-input" value="<%= @activity.linkman %>">
59
+ </div>
60
+ </div>
61
+ <div class="layui-inline">
62
+ <label class="layui-form-label">联系电话</label>
63
+ <div class="layui-input-block" style="width: 200px;">
64
+ <input type="text" name="phone" class="layui-input" value="<%= @activity.phone %>">
65
+ </div>
66
+ </div>
67
+ <div class="layui-inline">
68
+ <label class="layui-form-label">规模</label>
69
+ <div class="layui-input-block" style="width: 200px;">
70
+ <input type="text" name="scale" class="layui-input" value="<%= @activity.scale %>">
71
+ </div>
72
+ </div>
73
+ <div class="layui-inline">
74
+ <label class="layui-form-label">会议地点</label>
75
+ <div class="layui-input-block" style="width: 200px;">
76
+ <input type="text" name="address" class="layui-input" value="<%= @activity.address %>">
77
+ </div>
78
+ </div>
79
+ <div class="layui-inline">
80
+ <label class="layui-form-label">会议形式</label>
81
+ <div class="layui-input-block" style="width: 200px;">
82
+ <input type="text" name="meeting_form" class="layui-input" value="<%= @activity.meeting_form %>">
83
+ </div>
84
+ </div>
85
+ <div class="layui-inline">
86
+ <label class="layui-form-label">邀请专家</label>
87
+ <div class="layui-input-block">
88
+ <div id="invitation_list" style="width: 600px;"></div>
43
89
  </div>
44
90
  </div>
45
- <div class="layui-form-item">
46
91
  <div class="layui-inline">
47
- <label class="layui-form-label">上传附件</label>
92
+ <label class="layui-form-label">协助人员</label>
48
93
  <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>
56
- <button type="button" class="layui-btn" id="upload_file">上传文件</button>
94
+ <div id="staff_assist_list" style="width: 600px;"></div>
57
95
  </div>
58
96
  </div>
97
+ </div>
98
+ <div class="layui-form-item">
59
99
  <div class="layui-inline" style="padding-left: 30px">
60
100
  <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="data-reset-btn">提交
61
101
  </button>
@@ -99,33 +139,25 @@
99
139
  }
100
140
  })
101
141
 
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
142
 
114
143
  var staff_manage = xmSelect.render({
115
144
  el: '#staff_manage_list',
116
145
  data: gon.staff_manage,
117
146
  filterable: true,
118
147
  })
119
-
120
- var staff_assist = xmSelect.render({
121
- el: '#staff_assist_list',
122
- data: gon.assists,
148
+ var sales_manage = xmSelect.render({
149
+ el: '#sales_list',
150
+ name: 'sales_id',
151
+ radio: true,
152
+ data: gon.sales_manage,
123
153
  filterable: true,
124
154
  })
125
- var expert = xmSelect.render({
126
- el: '#expert_list',
155
+
156
+
157
+ var staff_assist = xmSelect.render({
158
+ el: '#staff_assist_list',
127
159
  filterable: true,
128
- name: 'expert_ids',
160
+ name: 'staff_assist_id',
129
161
  remoteSearch: true,
130
162
  remoteMethod: function(val, cb, show){
131
163
  if(!val){
@@ -139,27 +171,51 @@
139
171
  }
140
172
  })
141
173
  },
142
- data: gon.experts
174
+ data: gon.assistss
143
175
  })
144
176
 
145
- $(body).on("click", "#delete", function() {
146
- document.getElementById("attachment").innerHTML = "";
147
- $("#attachment_id").val('');
177
+ var invitation_select = xmSelect.render({
178
+ el: '#invitation_list',
179
+ filterable: true,
180
+ name: 'invitation_ids',
181
+ remoteSearch: true,
182
+ remoteMethod: function(val, cb, show){
183
+ if(!val){
184
+ return cb([]);
185
+ }
186
+ request.get('missions/search_edu_user?q=' + val, {}, function (res) {
187
+ if (res.data.length == 0) {
188
+ cb([{value: val, name: val}])
189
+ } else {
190
+ cb(res.data);
191
+ }
192
+ })
193
+ },
194
+ data: gon.invitation_list
148
195
  })
149
196
 
150
197
  //监听提交
151
198
  form.on('submit(data-reset-btn)', function (data) {
152
199
  data.field.staff_manage_id = staff_manage.getValue('value');
153
- data.field.staff_assist_id = staff_assist.getValue('value');
154
- var expertids = [];
155
- expert.getValue().forEach(function(d) {
200
+ var staff_assist_id = [];
201
+ staff_assist.getValue().forEach(function(d) {
202
+ if (typeof(d.value) == 'number') {
203
+ staff_assist_id.push([d.value, d.name]);
204
+ } else {
205
+ staff_assist_id.push(['', d.name]);
206
+ }
207
+ })
208
+ var invitation_ids = [];
209
+ invitation_select.getValue().forEach(function(d) {
156
210
  if (typeof(d.value) == 'number') {
157
- expertids.push([d.value, d.name]);
211
+ invitation_ids.push([d.value, d.name]);
158
212
  } else {
159
- expertids.push(['', d.name]);
213
+ invitation_ids.push(['', d.name]);
214
+
160
215
  }
161
216
  })
162
- data.field.expert_ids = expertids;
217
+ data.field.invitation_ids = invitation_ids;
218
+ data.field.staff_assist_id = staff_assist_id;
163
219
  request.authPut("missions/activities/" + <%= @activity.id %>, data.field, function (res) {
164
220
  if (res.success === false) {
165
221
  layer.alert(res.msg)
@@ -0,0 +1,157 @@
1
+ <%= Gon::Base.render_data %>
2
+ <script type="text/html" id="toolbarDemo">
3
+ <div class="layui-btn-container">
4
+ <span class="table-label">附件信息</span>
5
+ <% if can? :upload_file, EducodeSales::Activity %>
6
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="upload_file">上传文件</button>
7
+ <% end %>
8
+ </div>
9
+ </script>
10
+
11
+ <table class="layui-hide" id="file" lay-filter="file"></table>
12
+
13
+ <script type="text/html" id="currentTableBar_file">
14
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="preview">预览</a>
15
+ <% if can? :download_file, EducodeSales::Activity %>
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::Activity %>
19
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
20
+ <% end %>
21
+ </script>
22
+
23
+ <script type="text/html" id="showchance">
24
+ <a href="/missions/businesses" class="layui-table-link">{{ d.chance }}</a>
25
+ </script>
26
+
27
+ <script>
28
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
29
+ var $ = layui.jquery,
30
+ form = layui.form,
31
+ table = layui.table,
32
+ request = layui.request,
33
+ upload = layui.upload;
34
+ miniPage = layui.miniPage;
35
+
36
+
37
+ var activity_id = parent.activity_id;
38
+ table.render({
39
+ elem: '#file',
40
+ url: '/missions/activities/' + activity_id +'/files',
41
+ toolbar: '#toolbarDemo',
42
+ defaultToolbar: [],
43
+ cols: [
44
+ [
45
+ {
46
+ field: 'id',
47
+ width: 80,
48
+ title:'序号',type: 'numbers',
49
+ },
50
+ {
51
+ field: 'name',
52
+ title: '文件名'
53
+ },
54
+ {
55
+ field: 'size',
56
+ width: 100,
57
+ title: '文件大小',
58
+ },
59
+ {
60
+ field: 'created_on',
61
+ width: 200,
62
+ title: '上传时间',
63
+ sort: true
64
+ },
65
+ {
66
+ field: 'upload_person',
67
+ width: 80,
68
+ totalRow:true,
69
+ title: '上传人',
70
+ },
71
+ {
72
+ title: '操作',
73
+ width: 200,
74
+ toolbar: '#currentTableBar_file',
75
+ align: "center"
76
+ }
77
+ ]
78
+ ],
79
+ limit: 20,
80
+ limits: [10,15,20,30,40,50,60,70,80,90],
81
+ page: true
82
+ });
83
+
84
+
85
+ var sort = {};
86
+ table.on('sort(file)', function (obj) {
87
+ sort.field = obj.field;
88
+ sort.order = obj.type;
89
+ table.reload('file', {
90
+ initSort: obj,
91
+ where: {
92
+ sort: sort
93
+ }
94
+ });
95
+ })
96
+
97
+
98
+ table.on('toolbar(file)', function (obj) {
99
+ if (obj.event === 'upload_file') { //
100
+ activity_id = parent.activity_id;
101
+ var content = miniPage.getHrefContent('/missions/activities/upload_file');
102
+ var openWH = miniPage.getOpenWidthHeight();
103
+ import_index = layer.open({
104
+ title: '上传文件',
105
+ type: 1,
106
+ shade: 0.2,
107
+ shadeClose: true,
108
+ area: ['200px', '100px'],
109
+ offset: 'auto',
110
+ closeBtn: 0,
111
+ content: content,
112
+ });
113
+ $(window).on("resize", function () {
114
+ layer.full(index);
115
+ });
116
+ }
117
+ });
118
+
119
+
120
+ table.on('tool(file)', function (obj) {
121
+ var data = obj.data;
122
+ var id = data.id
123
+ name = data.disk_filename
124
+ folder = gon.folder
125
+ if (obj.event === 'preview') {
126
+ if (data.content_type.split("/")[0] === "image"){
127
+ layer.photos({
128
+ photos: { "data": [{"src": '/files/educode_sales/' + name}] }
129
+ ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
130
+ });
131
+ }else if (data.content_type.split("/")[1] === "pdf"){
132
+ var pdf = '/files/educode_sales/' + name;
133
+ var openWH = miniPage.getOpenWidthHeight();
134
+ layer.open({
135
+ title: data.name,
136
+ type: 2,
137
+ area: ['1000px', '750px'],
138
+ fixed: false, //不固定
139
+ maxmin: true,
140
+ content: pdf
141
+ });
142
+ }else{
143
+ layer.msg("附件不支持预览,请下载查看!")
144
+ }
145
+ return false;
146
+ }else if (obj.event === 'delete') {
147
+ layer.confirm('确定删除' + data.name, function (index) {
148
+ request.delete('missions/upload_files/' + data.id + '?disk_filename=' + data.disk_filename, {}, function (res) {
149
+ layer.close(index);
150
+ table.reload("file")
151
+ })
152
+ });
153
+ }
154
+ });
155
+
156
+ });
157
+ </script>
@@ -0,0 +1,13 @@
1
+ json.data do
2
+ json.array! @files do |d|
3
+ json.id d.id
4
+ json.name d.filename
5
+ json.size d.filesize < 1000000 ? (d.filesize.to_f / 1000).round(2).to_s + 'KB' : (d.filesize.to_f / 1000000).round(2).to_s + 'MB'
6
+ json.created_on d.created_on.to_s
7
+ json.upload_person d.author.real_name
8
+ json.disk_filename d.disk_filename
9
+ json.content_type d.content_type
10
+ end
11
+ end
12
+ json.code 0
13
+ json.count @files.total_count
@@ -0,0 +1,19 @@
1
+ json.data do
2
+ json.array! @data do |d|
3
+ json.id d.id
4
+ json.description d.description
5
+ json.name d.activity.name
6
+ json.info_id d.info_id
7
+ json.clazz_id d.activity.clazz_id
8
+ json.staff d.activity.sales&.user&.real_name || d.activity.staff&.user&.real_name
9
+ json.staff_manage d.activity.manages.map { |d| d.staff.user.real_name}.uniq.join("、")
10
+ json.follow_up d.staff.user.real_name
11
+ json.created_at d.created_at.to_s
12
+ json.state_id d.activity.state_id
13
+ json.advise d.advise || ''
14
+
15
+ end
16
+ end
17
+
18
+ json.code 0
19
+ json.count @data.total_count