educode_sales 1.10.2 → 1.10.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8319a1ab978e05583c3bf97bba97c61d872dbb3165d8e7f62888dc43747732fa
4
- data.tar.gz: 12b16d2e7c5c4d8c0c0e6051625308c1dc50693d5dfc26452cf2336ca796736f
3
+ metadata.gz: 7d2e7e3e78774b085c64185fddc9b8ecddbcbb7bf87e030c8f449fb21285f8c9
4
+ data.tar.gz: c1ea147b8d76cc8ef23d6004834d4c79499b2c1d7f18c233e939f030b303488f
5
5
  SHA512:
6
- metadata.gz: 3a134e29aa9a9f3543be3edc4e63ee1e9d5f87f4879905a7b166a2cafb6e85ace9b14d2aa736a3e3e0d0797723da19050a590abd6fff4eec7cd56aa012dc983f
7
- data.tar.gz: baf71ec0ec85d306725c0c75f6445b89c7f8953dabc7914a569cecb963fd183d95eafe92540023739d82c07c32819406a40ff8265c602340ea5239d1587c8ccf
6
+ metadata.gz: 37e8d9e9ce8bbf78632588b9bff325548e3004dbb2a8daf7b3a64a29fd547556c41bc0ecfc3b244fb8725e2cd76cb3618cc08db4952a47189f8f0dfb1f19943e
7
+ data.tar.gz: a5661dcb147e98afe980d0c330c9d8fcb5f297335ec2f305e658b3f088be9c57919f7e534241d6d7b612dc903043190aa9b9132dd6a727122299e7dd847071c5
@@ -376,13 +376,114 @@ module EducodeSales
376
376
  end
377
377
 
378
378
 
379
+ #签到记录
380
+ def attendances
381
+ respond_to do |format|
382
+ format.html do
383
+ end
384
+ format.js do
385
+ end
386
+ format.json do
387
+ @attendances = EducodeSales::Attendance
388
+ if params[:q].present? && params[:q][:name].present?
389
+ @attendances = @attendances.where("name like ?", "%#{params[:q][:name].strip}%")
390
+ end
391
+ if params[:q].present? && params[:q][:attendance_date].present?
392
+ date = params[:q][:attendance_date].split(" - ")
393
+ @attendances = @attendances.where("attendance_date >= ? and attendance_date <= ?", date[0] + ' 00:00:00', date[1] + ' 23:59:59')
394
+ end
395
+ if params[:q].present? && params[:q][:customer].present?
396
+ @attendances = @attendances.where("customer like ?", "%#{params[:q][:customer]}%")
397
+ end
398
+ @attendances = @attendances.page(params[:page]).per(params[:limit])
399
+ end
400
+ end
401
+ end
379
402
 
403
+ #编辑签到记录界面
404
+ def edit_attendance
405
+ @attendance = EducodeSales::Attendance.find(params[:id])
406
+ render layout: false
407
+ end
380
408
 
409
+ #更新签到记录信息
410
+ def update_attendance
411
+ ActiveRecord::Base.transaction do
412
+ @attendance = EducodeSales::Attendance.find(params[:id])
413
+ @attendance.attendance_date = params[:attendance_datetime]
414
+ @attendance.update_attributes(attendance_update)
415
+ render_success
416
+ end
417
+ end
418
+
419
+ #删除签到记录
420
+ def delete_attendance
421
+ begin
422
+ ActiveRecord::Base.transaction do
423
+ attendance = EducodeSales::Attendance.find(params[:id])
424
+ attendance.destroy!
425
+ render_success
426
+ end
427
+ rescue Exception => e
428
+ render_failure(e.message)
429
+ end
430
+ end
431
+
432
+ #跳转导入界面
433
+ def import
434
+ render layout: false
435
+ end
436
+
437
+ #导入签到记录接口
438
+ def import_attendances
439
+ render_failure("文件不存在或格式错误") if params[:file].blank? || !params[:file].is_a?(ActionDispatch::Http::UploadedFile)
440
+ Rails.logger.info "导入签到数据"
441
+ begin
442
+ doc = SimpleXlsxReader.open(params[:file])
443
+ rescue
444
+ return render_error("文件不存在或格式错误")
445
+ end
446
+ size = doc.sheets.size
447
+ Rails.logger.info size
448
+ attendance_attrs = %i[name attendance_date longitude latitude location address mobile_id ip_address customer target created_at updated_at]
449
+ attendance_vales = []
450
+ (0..size - 1).each do |index|
451
+ doc.sheets[index].rows.each_with_index do |d, i|
452
+ next if i <= 2
453
+ name = d[0]
454
+ attendance_date_time = "#{d[1]} #{d[2]}"
455
+ attendance_date = attendance_date_time.strip
456
+ longitude = d[3]
457
+ latitude = d[4]
458
+ location = d[5]
459
+ address = d[6]
460
+ mobile_id = d[7]
461
+ ip_address = d[8]
462
+ customer = d[9]
463
+ target = d[10]
464
+ attendance_vales << {name: name, attendance_date: attendance_date, longitude: longitude, latitude: latitude, location: location,
465
+ address: address, mobile_id: mobile_id, ip_address: ip_address, customer: customer, target: target}
466
+
467
+ end
468
+ end
469
+ EducodeSales::Attendance.bulk_insert(*attendance_attrs) do |worker|
470
+ attendance_vales.each do |attendance|
471
+ worker.add(name: attendance[:name], attendance_date: attendance[:attendance_date].to_datetime, longitude: attendance[:longitude], latitude: attendance[:latitude],
472
+ location: attendance[:location], address: attendance[:address], mobile_id: attendance[:mobile_id], ip_address: attendance[:ip_address], customer: attendance[:customer], target: attendance[:target])
473
+ end
474
+ end
475
+ render_success
476
+ end
381
477
 
382
478
 
383
479
 
384
480
 
385
481
  private
482
+
483
+ def attendance_update
484
+ params.permit(:name, :mobile_id, :ip_address, :customer, :target)
485
+ end
486
+
386
487
  def params_create
387
488
  params.permit( :annual, :assessment,:assessment_year, :first_quarter, :second_quarter, :third_quarter, :fourth_quarter,
388
489
  :january, :february, :march, :april, :may, :june, :july, :august, :september, :october, :november, :december,
@@ -287,8 +287,21 @@ module EducodeSales
287
287
  render_success
288
288
  end
289
289
 
290
+ def file
291
+ gon.folder = edu_setting('attachment_folder') + '/'
292
+ render layout: false
293
+ end
294
+
295
+ def upload_file
296
+ render layout: false
297
+ end
298
+
290
299
  private
291
300
 
301
+ def edu_setting name
302
+ EduSetting.get(name)
303
+ end
304
+
292
305
  def load_business
293
306
  @business = Business.find(params[:business_id])
294
307
  end
@@ -325,18 +325,23 @@ module EducodeSales
325
325
 
326
326
  def add_courses
327
327
  load_teacher
328
+ subject_names = %w[程序设计语言 计算机基础 算法设计 计算机系统能力 大数据 人工智能 数据库 电子信息 Web技术 软件工程 网络与安全 区块链 数学与统计 物联网 云计算 虚拟仿真].map{|d| {value: d, name: d}}
329
+ gon.subject_names = subject_names
328
330
  render layout: false
329
331
  end
330
332
 
331
333
 
332
334
  def create_course
333
335
  load_teacher
334
- course_subject = @teacher.course_subjects.build(name: params[:name], role_name: params[:role_name],)
335
- # course_subject = CourseSubject.new(teacher_id: params[:teacher_id], name: params[:name], role_name: params[:role_name],)
336
- if course_subject.save
336
+ names = params[:select_subject_names].split(",")
337
+ begin
338
+ names.each do |name|
339
+ course_subject = @teacher.course_subjects.build(name: name, role_name: params[:role_name])
340
+ course_subject.save!
341
+ end
337
342
  render_success
338
- else
339
- render_failure course_subject
343
+ rescue Exception => ex
344
+ render_failure(ex.message)
340
345
  end
341
346
  end
342
347
 
@@ -8,7 +8,12 @@ module EducodeSales
8
8
  format.html do
9
9
  end
10
10
  format.json do
11
- @files = Attachment.where(description: "business", container_id:params[:business_id])
11
+ if params[:follow_up_id].present?
12
+ @files = Attachment.where(container_type: "EducodeSales::FollowUp", container_id: params[:follow_up_id])
13
+ else
14
+ @files = Attachment.where(description: "business", container_id:params[:business_id])
15
+ end
16
+
12
17
  if params[:sort].present? && params[:sort][:field]
13
18
  @files = @files.order("#{params[:sort][:field]} #{params[:sort][:order]}")
14
19
  else
@@ -39,6 +44,9 @@ module EducodeSales
39
44
  elsif params[:idea_id].present?
40
45
  @attachment.container_id = params[:idea_id]
41
46
  @attachment.container_type = 'EducodeSales::Idea'
47
+ elsif params[:follow_up_id].present?
48
+ @attachment.container_id = params[:follow_up_id]
49
+ @attachment.container_type = 'EducodeSales::FollowUp'
42
50
  else
43
51
  @attachment.description = "business"
44
52
  @attachment.container_id = params[:business_id]
@@ -0,0 +1,4 @@
1
+ module EducodeSales
2
+ class Attendance < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,238 @@
1
+ <div style="padding-right: 50px" id="tab_2">
2
+ <div class=" layui-show" style="padding-left: 0">
3
+ <div style="margin: 10px 10px 10px 10px">
4
+ <form class="layui-form layui-form-pane" lay-filter="search_form">
5
+ <div class="layui-form-item">
6
+ <div class="layui-inline">
7
+ <label class="layui-form-label">姓名</label>
8
+ <div class="layui-input-inline">
9
+ <input type="text" class="layui-input" id="name" name="name">
10
+ </div>
11
+ </div>
12
+ <div class="layui-inline">
13
+ <label class="layui-form-label">签到时间</label>
14
+ <div class="layui-input-inline">
15
+ <input type="text" class="layui-input" id="attendance_date" name="attendance_date" autocomplete="off" placeholder=" - ">
16
+ </div>
17
+ </div>
18
+ <div class="layui-inline">
19
+ <label class="layui-form-label">拜访客户</label>
20
+ <div class="layui-input-inline">
21
+ <input type="text" class="layui-input" id="customer" name="customer">
22
+ </div>
23
+ </div>
24
+ <div class="layui-inline">
25
+ <button type="reset" class="layui-btn layui-btn-primary" lay-submit lay-filter="reset_search">重置</button>
26
+ <button type="button" id="search_bt" class="layui-btn layui-btn-primary" lay-submit lay-filter="search_attendance">确定</button>
27
+ </div>
28
+ </div>
29
+ </form>
30
+ </div>
31
+ </div>
32
+ </div>
33
+
34
+ <script type="text/html" id="toolbarDemo">
35
+ <div class="layui-btn-container">
36
+ <span class="table-label">签到列表</span>
37
+ <button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn pull-right" lay-event="import_attendances">批量导入签到数据</button>
38
+ </div>
39
+ </script>
40
+
41
+ <div class="">
42
+ <table class="layui-hide" id="attendance_table" style="min-height: 300px;" lay-filter="attendance_table"></table>
43
+ </div>
44
+
45
+ <script type="text/html" id="currentTableBar">
46
+ <a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="edit">编辑</a>
47
+ <a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
48
+ </script>
49
+
50
+ <script>
51
+ layui.use(['form', 'table', 'miniPage', 'element', 'request', 'laydate'], function () {
52
+ var $ = layui.jquery,
53
+ form = layui.form,
54
+ request = layui.request,
55
+ miniPage = layui.miniPage,
56
+ laydate = layui.laydate;
57
+
58
+ form.render();
59
+
60
+ laydate.render({
61
+ elem: '#attendance_date',
62
+ range: true
63
+ });
64
+
65
+ table = layui.table;
66
+ table.render({
67
+ elem: '#attendance_table',
68
+ url: '/missions/assessments/attendances',
69
+ where: {q: form.val('search_form')},
70
+ toolbar: '#toolbarDemo',
71
+ defaultToolbar: ['filter'],
72
+ cols: [
73
+ [
74
+ {
75
+ field: 'id',
76
+ width: 100,
77
+ title:'序号',
78
+ type: 'numbers',
79
+ fixed: 'left'
80
+ },
81
+ {
82
+ field: 'name',
83
+ width: 120,
84
+ title: '姓名',
85
+ fixed: 'left',
86
+ templet: "#name"
87
+ },
88
+ {
89
+ field: 'attendance_date',
90
+ width: 120,
91
+ title: '日期',
92
+ },
93
+ {
94
+ field: 'attendance_time',
95
+ width: 150,
96
+ title: '时间',
97
+ },
98
+ {
99
+ field: 'longitude',
100
+ width: 150,
101
+ title: '经度',
102
+ },
103
+ {
104
+ field: 'latitude',
105
+ width: 120,
106
+ title: '纬度',
107
+ },
108
+ {
109
+ field: 'location',
110
+ width: 120,
111
+ title: '地点',
112
+ },
113
+ {
114
+ field: 'address',
115
+ width: 150,
116
+ title: '详细地址',
117
+ },
118
+ {
119
+ field: 'mobile_id',
120
+ width: 150,
121
+ title: '手机标识',
122
+ },
123
+ {
124
+ field: 'ip_address',
125
+ width: 150,
126
+ title: 'ip地址',
127
+ },
128
+ {
129
+ field: 'customer',
130
+ width: 120,
131
+ title: '拜访客户',
132
+ },
133
+ {
134
+ field: 'target',
135
+ width: 120,
136
+ title: '拜访对象',
137
+ },
138
+ {
139
+ title: '操作',
140
+ minWidth: 150,
141
+ toolbar: '#currentTableBar',
142
+ align: "center",
143
+ fixed: 'right'
144
+ }
145
+ ]
146
+ ],
147
+ limit: 20,
148
+ limits: [10, 20, 30, 40, 50, 60, 70, 80, 90],
149
+ page: true
150
+ });
151
+
152
+ //重置
153
+ form.on('submit(reset_search)', function () {
154
+ form.val('search_form', {
155
+ name: "",
156
+ attendance_date: "",
157
+ customer: ""
158
+ });
159
+ return false;
160
+ });
161
+
162
+ var sort = {}, search = {};
163
+ table.on('sort(attendance_table)', function (obj) {
164
+ sort.field = obj.field;
165
+ sort.order = obj.type;
166
+ table.reload('attendance_table', {
167
+ initSort: obj,
168
+ where: {
169
+ sort: sort,
170
+ q: search
171
+ }
172
+ });
173
+ });
174
+
175
+ // 监听搜索操作
176
+ form.on('submit(search_attendance)', function (data) {
177
+ search = data.field;
178
+ table.reload('attendance_table', {
179
+ page: {
180
+ curr: 1
181
+ },
182
+ where: {q: search, sort: sort}
183
+ }, 'data');
184
+ return false;
185
+ });
186
+
187
+ //toorbar事件监听
188
+ table.on('toolbar(attendance_table)', function (obj) {
189
+ if (obj.event === 'import_attendances') { //批量导入签到记录
190
+ var content = miniPage.getHrefContent('/missions/assessments/import');
191
+ var openWH = miniPage.getOpenWidthHeight();
192
+ import_index = layer.open({
193
+ title: '导入签到记录数据',
194
+ type: 1,
195
+ shade: 0.2,
196
+ shadeClose: true,
197
+ area: ['400px', '200px'],
198
+ offset: 'auto',
199
+ closeBtn: 0,
200
+ content: content,
201
+ });
202
+ $(window).on("resize", function () {
203
+ layer.full(index);
204
+ });
205
+ }
206
+ });
207
+
208
+ //tool事件监听
209
+ table.on('tool(attendance_table)', function (obj) {
210
+ var data = obj.data;
211
+ var id = data.id;
212
+ if (obj.event === 'edit'){ //编辑签到记录
213
+ var content = miniPage.getHrefContent('/missions/assessments/' + id + '/edit_attendance');
214
+ var openWH = miniPage.getOpenWidthHeight();
215
+ var index = layer.open({
216
+ title: '编辑签到记录',
217
+ type: 1,
218
+ shade: 0.2,
219
+ maxmin: true,
220
+ shadeClose: true,
221
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
222
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
223
+ content: content
224
+ });
225
+ $(window).on("resize", function () {
226
+ layer.full(index);
227
+ });
228
+ }else if (obj.event === 'delete'){
229
+ layer.confirm('确定删除该签到记录吗?', function (index) {
230
+ request.delete('missions/assessments/' + id + "/delete_attendance", {}, function (res) {
231
+ layer.close(index);
232
+ table.reload("attendance_table")
233
+ })
234
+ });
235
+ }
236
+ });
237
+ })
238
+ </script>
@@ -0,0 +1 @@
1
+ $("#page_1").html("<%= j render 'attendances' %>");
@@ -0,0 +1,21 @@
1
+ json.data do
2
+ json.array! @attendances do |d|
3
+ json.id d.id
4
+ json.name d.name
5
+ date = d.attendance_date.to_s.strip
6
+ attendance_date = date&.split(" ")[0]
7
+ attendance_time = date&.split(" ")[1]
8
+ json.attendance_date attendance_date #签到日期
9
+ json.attendance_time attendance_time #签到时间
10
+ json.longitude d.longitude #经度
11
+ json.latitude d.latitude #纬度
12
+ json.location d.location #签到地点
13
+ json.address d.address #详细地址
14
+ json.mobile_id d.mobile_id #手机标识
15
+ json.ip_address d.ip_address #ip地址
16
+ json.customer d.customer #拜访客户
17
+ json.target d.target #拜访对象
18
+ end
19
+ end
20
+ json.code 0
21
+ json.count @attendances&.total_count
@@ -0,0 +1,77 @@
1
+ <form class="layui-form layuimini-form" lay-filter="attendance_form">
2
+ <div class="layui-form-item" style="padding: 25px">
3
+ <div class="layui-inline">
4
+ <label class="layui-form-label">姓名:</label>
5
+ <div class="layui-input-block" style="width: 400px;">
6
+ <input type="text" name="name" value="<%= @attendance&.name %>" placeholder="请输入姓名" autocomplete="off" class="layui-input">
7
+ </div>
8
+ </div>
9
+ <div class="layui-inline">
10
+ <label class="layui-form-label">签到时间:</label>
11
+ <div class="layui-input-inline" style="width: 400px;">
12
+ <input type="text" class="layui-input" id="attendance_datetime" name="attendance_datetime" value="<%= @attendance&.attendance_date %>" autocomplete="off">
13
+ </div>
14
+ </div>
15
+ <br/>
16
+ <div class="layui-inline">
17
+ <label class="layui-form-label">手机标识:</label>
18
+ <div class="layui-input-block" style="width: 400px;">
19
+ <input type="text" name="mobile_id" value="<%= @attendance&.mobile_id %>" placeholder="请输入手机标识" autocomplete="off" class="layui-input">
20
+ </div>
21
+ </div>
22
+ <div class="layui-inline">
23
+ <label class="layui-form-label">ip地址:</label>
24
+ <div class="layui-input-block" style="width: 400px;">
25
+ <input type="text" name="ip_address" value="<%= @attendance&.ip_address %>" placeholder="请输入ip地址" autocomplete="off" class="layui-input">
26
+ </div>
27
+ </div>
28
+ <br/>
29
+ <div class="layui-inline">
30
+ <label class="layui-form-label">拜访客户:</label>
31
+ <div class="layui-input-block" style="width: 400px;">
32
+ <input type="text" name="customer" value="<%= @attendance&.customer %>" placeholder="请输入拜访客户" autocomplete="off" class="layui-input">
33
+ </div>
34
+ </div>
35
+ <div class="layui-inline">
36
+ <label class="layui-form-label">拜访对象:</label>
37
+ <div class="layui-input-block" style="width: 400px;">
38
+ <input type="text" name="target" value="<%= @attendance&.target %>" placeholder="请输入拜访对象" autocomplete="off" class="layui-input">
39
+ </div>
40
+ </div>
41
+ <br/>
42
+ <div class="layui-inline" style="padding-left: 110px">
43
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="attendance_reset">提交</button>
44
+ </div>
45
+ </div>
46
+ </form>
47
+
48
+ <script>
49
+ layui.use(['form', 'element', 'laydate', 'request'], function () {
50
+ var $ = layui.jquery,
51
+ form = layui.form,
52
+ request = layui.request,
53
+ laydate = layui.laydate;
54
+
55
+ form.render();
56
+
57
+ laydate.render({
58
+ elem: '#attendance_datetime',
59
+ type: 'datetime',
60
+ fullPanel: true
61
+ });
62
+
63
+ //监听提交
64
+ form.on('submit(attendance_reset)', function (data) {
65
+ request.authPut("missions/assessments/"+ <%= @attendance.id %> + "/update_attendance", data.field, function (res) {
66
+ if (res.success === false) {
67
+ layer.alert(res.msg)
68
+ } else {
69
+ layer.closeAll(); //关闭所有层
70
+ table.reload('attendance_table')
71
+ }
72
+ });
73
+ return false;
74
+ });
75
+ });
76
+ </script>
77
+
@@ -0,0 +1,38 @@
1
+ <div style="padding-left: 135px; padding-top: 50px">
2
+ <button type="button" class="layui-btn layui-btn-lg layui-btn-radius layui-btn-normal" id="import_attendance"><i class="layui-icon"></i>选择文件</button>
3
+ </div>
4
+ <script>
5
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'selectInput'], function () {
6
+ var form = layui.form,
7
+ layer = layui.layer,
8
+ table = layui.table,
9
+ upload = layui.upload,
10
+ $ = layui.$;
11
+ selectInput = layui.selectInput;
12
+
13
+ form.render();
14
+
15
+ //指定允许上传的文件类型
16
+ upload.render({
17
+ elem: '#import_attendance',
18
+ url: '/missions/assessments/import_attendances', //此处配置你自己的上传接口即可
19
+ accept: 'file', //普通文件
20
+ headers: {
21
+ 'X-CSRF-Token': $('meta[name=csrf-token]').attr('content')
22
+ },
23
+ before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
24
+ layer.load(); //上传loading
25
+ },
26
+ done: function(res){
27
+ layer.msg('导入成功');
28
+ table.reload('attendance_table');
29
+ layer.close(parent.import_index);
30
+ layer.closeAll('loading'); //关闭loading
31
+ },
32
+ error: function(res){
33
+ layer.closeAll('loading'); //关闭loading
34
+ layer.msg(res.responseJSON.msg);
35
+ }
36
+ });
37
+ });
38
+ </script>
@@ -6,6 +6,7 @@
6
6
  <% if can?(:show, EducodeSales::AssessmentsSetting) %>
7
7
  <li data="assessments" > 考核指标设置</li>
8
8
  <%end %>
9
+ <li class="">签到记录</li>
9
10
  </ul>
10
11
  <!--<div class="layuimini-main min-height-table"></div>-->
11
12
  <div class="layui-tab-content">
@@ -31,17 +32,26 @@
31
32
  </div>
32
33
  <%end %>
33
34
  <%end %>
35
+
36
+ <div class="layui-tab-item">
37
+ <div id="page_1"></div>
34
38
  </div>
39
+
35
40
  </div>
41
+ </div>
36
42
 
37
43
  <script>
38
44
  layui.use(['element', 'table', 'jquery','laydate'], function () {
39
45
  var $ = layui.jquery,
40
46
  table = layui.table,
41
- laydate = layui.laydate
47
+ laydate = layui.laydate,
42
48
  element = layui.element;
43
49
 
44
- element.on('tab(sale_tab)', function (data) {
50
+ element.render();
51
+ element.on('tab(sale_tab)', function (data) {
52
+ if (data.index === 2 && $("#tab_2").length === 0) {
53
+ loadPage('/missions/assessments/attendances')
54
+ }
45
55
  // var status = $(this).attr('data')
46
56
  // switch (status) {
47
57
  // case 'progress':
@@ -67,6 +77,18 @@
67
77
  // });
68
78
  // return false;
69
79
  // });
80
+
81
+ function loadPage(url) {
82
+ var layer_index = layer.load(0, {shade: [0.1, '#fff']});
83
+ Rails.ajax({
84
+ url: url,
85
+ type: 'GET',
86
+ dataType: "script",
87
+ success: function () {
88
+ layer.close(layer_index);
89
+ }
90
+ });
91
+ }
70
92
  })
71
93
  </script>
72
94
 
@@ -24,7 +24,10 @@
24
24
  <a href="javascript:;" class="add_key" data-is_latest="<%= f.id == @latest&.id %>" data-id=<%= f.id %> data-flag="<%= f.created_at.present? ? (Time.now - f.created_at).to_f/3600 < 24 : false %>">添加关键人</a>
25
25
  <% end %>
26
26
  <br/>
27
- 评论: <span><%= f.comment %></span> <a href="javascript:;" class="add_comment" data-id=<%= f.id %>>评论</a>
27
+ 评论: <span><%= f.comment %></span> <a href="javascript:;" class="add_comment" data-id=<%= f.id %>>评论</a> <a href="javascript:;" class="uploadFile" data-id=<%= f.id %>>附件上传</a>
28
+ <br/>
29
+ <!-- <span class="layui-badge layui-bg-green"></span> -->
30
+ <button type="button" class="layui-btn layui-btn-xs layui-btn-primary add-tag"><i class="layui-icon layui-icon-addition"></i>标签设置</button>
28
31
  </p>
29
32
  </div>
30
33
  </li>
@@ -99,8 +102,28 @@
99
102
  layer.close(index)
100
103
  },
101
104
  });
102
-
103
105
  })
106
+
107
+ $(".uploadFile").on("click", function(e) {
108
+ var data = e.currentTarget.dataset;
109
+ follow_up_id = parent.id
110
+ var content = miniPage.getHrefContent('/missions/follow_ups/' + follow_up_id + '/file');
111
+ var openWH = miniPage.getOpenWidthHeight();
112
+ lsindex = layer.open({
113
+ title: '附件上传',
114
+ type: 1,
115
+ shade: 0.2,
116
+ maxmin: true,
117
+ shadeClose: true,
118
+ area: [openWH[0] + 'px', openWH[1] + 'px'],
119
+ offset: [openWH[2] + 'px', openWH[3] + 'px'],
120
+ content: content
121
+ });
122
+ $(window).on("resize", function () {
123
+ layer.full(sindex);
124
+ });
125
+ })
126
+
104
127
  });
105
128
  function demo(){
106
129
  layer.closeAll()
@@ -0,0 +1,154 @@
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::Business %>
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::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 %>
21
+ </script>
22
+
23
+
24
+ <script>
25
+ layui.use(['form', 'table', 'miniPage', 'element', 'request'], function () {
26
+ var $ = layui.jquery,
27
+ form = layui.form,
28
+ table = layui.table,
29
+ request = layui.request,
30
+ upload = layui.upload;
31
+ miniPage = layui.miniPage;
32
+
33
+
34
+ var follow_up_id = parent.follow_up_id
35
+ table.render({
36
+ elem: '#file',
37
+ url: '/missions/upload_files?follow_up_id='+follow_up_id,
38
+ toolbar: '#toolbarDemo',
39
+ defaultToolbar: [],
40
+ cols: [
41
+ [
42
+ {
43
+ field: 'id',
44
+ width: 80,
45
+ title:'序号',type: 'numbers',
46
+ },
47
+ {
48
+ field: 'name',
49
+ title: '文件名'
50
+ },
51
+ {
52
+ field: 'size',
53
+ width: 100,
54
+ title: '文件大小',
55
+ },
56
+ {
57
+ field: 'created_on',
58
+ width: 200,
59
+ title: '上传时间',
60
+ sort: true
61
+ },
62
+ {
63
+ field: 'upload_person',
64
+ width: 80,
65
+ totalRow:true,
66
+ title: '上传人',
67
+ },
68
+ {
69
+ title: '操作',
70
+ width: 200,
71
+ toolbar: '#currentTableBar_file',
72
+ align: "center"
73
+ }
74
+ ]
75
+ ],
76
+ limit: 20,
77
+ limits: [10,15,20,30,40,50,60,70,80,90],
78
+ page: true
79
+ });
80
+
81
+
82
+ var sort = {};
83
+ table.on('sort(file)', function (obj) {
84
+ sort.field = obj.field;
85
+ sort.order = obj.type;
86
+ table.reload('file', {
87
+ initSort: obj,
88
+ where: {
89
+ sort: sort
90
+ }
91
+ });
92
+ })
93
+
94
+
95
+ table.on('toolbar(file)', function (obj) {
96
+ if (obj.event === 'upload_file') { //
97
+ follow_up_id = parent.follow_up_id
98
+ var content = miniPage.getHrefContent('/missions/follow_ups/' + parent.follow_up_id +'/upload_file');
99
+ var openWH = miniPage.getOpenWidthHeight();
100
+ import_index = layer.open({
101
+ title: '上传文件',
102
+ type: 1,
103
+ shade: 0.2,
104
+ shadeClose: true,
105
+ area: ['200px', '100px'],
106
+ offset: 'auto',
107
+ closeBtn: 0,
108
+ content: content,
109
+ });
110
+ $(window).on("resize", function () {
111
+ layer.full(index);
112
+ });
113
+ }
114
+ });
115
+
116
+
117
+ table.on('tool(file)', function (obj) {
118
+ var data = obj.data;
119
+ var id = data.id
120
+ name = data.disk_filename
121
+ folder = gon.folder
122
+ if (obj.event === 'preview') {
123
+ if (data.content_type.split("/")[0] === "image"){
124
+ layer.photos({
125
+ photos: { "data": [{"src": '/files/educode_sales/' + name}] }
126
+ ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
127
+ });
128
+ }else if (data.content_type.split("/")[1] === "pdf"){
129
+ var pdf = '/files/educode_sales/' + name;
130
+ var openWH = miniPage.getOpenWidthHeight();
131
+ layer.open({
132
+ title: data.name,
133
+ type: 2,
134
+ area: ['1000px', '750px'],
135
+ fixed: false, //不固定
136
+ maxmin: true,
137
+ content: pdf
138
+ });
139
+ }else{
140
+ layer.msg("附件不支持预览,请下载查看!")
141
+ }
142
+ return false;
143
+ }else if (obj.event === 'delete') {
144
+ layer.confirm('确定删除' + data.name, function (index) {
145
+ request.delete('missions/upload_files/' + data.id + '?disk_filename=' + data.disk_filename, {}, function (res) {
146
+ layer.close(index);
147
+ table.reload("file")
148
+ })
149
+ });
150
+ }
151
+ });
152
+
153
+ });
154
+ </script>
@@ -0,0 +1,43 @@
1
+ <div style="padding-left: 50px">
2
+ <button type="button" class="layui-btn" id="get_file"><i class="layui-icon"></i>选择文件</button>
3
+ </div>
4
+ <script>
5
+ layui.use(['form', 'table', 'upload', 'layer', 'laytpl', 'request', 'selectInput'], function () {
6
+ var form = layui.form,
7
+ layer = layui.layer,
8
+ table = layui.table,
9
+ laytpl = layui.laytpl,
10
+ upload = layui.upload,
11
+ request = layui.request,
12
+ $ = layui.$;
13
+ selectInput = layui.selectInput;
14
+
15
+ form.render();
16
+
17
+ //指定允许上传的文件类型
18
+ var follow_up_id = parent.follow_up_id;
19
+ var renderObj = upload.render({
20
+ elem: '#get_file'
21
+ ,url: '/missions/upload_files?follow_up_id='+follow_up_id //此处配置你自己的上传接口即可
22
+ ,accept: 'file' //普通文件
23
+ ,headers: {
24
+ 'X-CSRF-Token': $('meta[name=csrf-token]').attr('content')
25
+ }
26
+ ,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
27
+ layer.load(); //上传loading
28
+ }
29
+ ,done: function(res){
30
+ layer.msg('导入成功');
31
+ table.reload('file');
32
+ layer.closeAll('loading'); //关闭loading
33
+ layer.close(parent.import_index)
34
+ }
35
+ ,error: function(index, upload){
36
+ table.reload('file');
37
+ layer.closeAll('loading'); //关闭loading
38
+ layer.alert('导入失败,请检查文件格式')
39
+ layer.close(parent.import_index)
40
+ }
41
+ });
42
+ });
43
+ </script>
@@ -1,16 +1,17 @@
1
+ <%= Gon::Base.render_data %>
1
2
  <div class="layuimini-main" style="height: 100%;">
2
3
  <div class="layui-form layuimini-form" lay-filter="common_edit">
3
4
  <fieldset class="table-search-fieldset">
4
5
  <legend>添加课程方向</legend>
5
6
  <div class="layui-form-item">
6
7
  <label class="layui-form-label required" >课程名称</label>
7
- <div class="layui-input-block">
8
- <input type="text" name="name" autocomplete="off" class="layui-input" placeholder="请输入" required lay-verify="required">
8
+ <div class="layui-input-inline">
9
+ <div id="subject_name" style="width: 1000px"></div>
9
10
  </div>
10
11
  </div>
11
12
  <div class="layui-form-item">
12
13
  <label class="layui-form-label required" >教学角色</label>
13
- <div class="layui-input-block">
14
+ <div class="layui-input-block" style="width: 1000px">
14
15
  <input type="text" name="role_name" autocomplete="off" class="layui-input" placeholder="请输入" required lay-verify="required">
15
16
  </div>
16
17
  </div>
@@ -42,12 +43,28 @@
42
43
 
43
44
  form.render();
44
45
 
46
+ //课程名称复选框
47
+ if (document.getElementById("subject_name")) {
48
+ var subject_list = xmSelect.render({
49
+ el: '#subject_name',
50
+ data: gon.subject_names,
51
+ filterable: true
52
+ })
53
+ }
54
+
45
55
  // 当前弹出层,防止ID被覆盖
46
56
  var parentIndex = layer.index;
47
57
 
48
58
 
49
59
  //监听提交
50
60
  form.on('submit(add_course)', function (data) {
61
+ var subject_names = [];
62
+ if (document.getElementById("subject_name")) {
63
+ subject_list.getValue().forEach(function (d) {
64
+ subject_names.push(d.value);
65
+ })
66
+ }
67
+ data.field['select_subject_names'] = subject_names.join(",");
51
68
  request.authPost('missions/teachers/'+parent.teacher_id +'/create_course', data.field, function (res) {
52
69
  if (res.success == false) {
53
70
  layer.alert(res.msg)
@@ -55,11 +72,11 @@
55
72
  table.reload('teachers_table');
56
73
  table.reload('coursesTable');
57
74
  form.val('common_edit', {
58
- 'name': '',
75
+ 'subject_name': '',
59
76
  'role_name':''
60
77
  })
61
78
  }
62
- })
79
+ });
63
80
  return false;
64
81
  });
65
82
 
data/config/routes.rb CHANGED
@@ -153,6 +153,8 @@ EducodeSales::Engine.routes.draw do
153
153
  delete :delete_money
154
154
  put :update_advise
155
155
  put :comment
156
+ get :file
157
+ get :upload_file
156
158
  end
157
159
  end
158
160
 
@@ -266,6 +268,14 @@ EducodeSales::Engine.routes.draw do
266
268
  get :progress # 考核完成情况
267
269
  post :get_export_data # 导出数据
268
270
  get :finished
271
+ get :attendances
272
+ get :import
273
+ post :import_attendances
274
+ end
275
+ member do
276
+ get :edit_attendance
277
+ put :update_attendance
278
+ delete :delete_attendance
269
279
  end
270
280
  end
271
281
 
@@ -1,3 +1,3 @@
1
1
  module EducodeSales
2
- VERSION = '1.10.2'
2
+ VERSION = '1.10.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: 1.10.2
4
+ version: 1.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - anke1460
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-13 00:00:00.000000000 Z
11
+ date: 2023-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -204,6 +204,7 @@ files:
204
204
  - app/models/educode_sales/assessments_setting.rb
205
205
  - app/models/educode_sales/assign_follow_up.rb
206
206
  - app/models/educode_sales/assign_staff.rb
207
+ - app/models/educode_sales/attendance.rb
207
208
  - app/models/educode_sales/business.rb
208
209
  - app/models/educode_sales/business_clazz_change.rb
209
210
  - app/models/educode_sales/business_export_record.rb
@@ -276,12 +277,17 @@ files:
276
277
  - app/views/educode_sales/activities/show_schools.json.jbuilder
277
278
  - app/views/educode_sales/activities/show_teachers.html.erb
278
279
  - app/views/educode_sales/activities/upload_file.html.erb
280
+ - app/views/educode_sales/assessments/_attendances.html.erb
279
281
  - app/views/educode_sales/assessments/_finished.html.erb
280
282
  - app/views/educode_sales/assessments/_progress.html.erb
281
283
  - app/views/educode_sales/assessments/_setup.html.erb
284
+ - app/views/educode_sales/assessments/attendances.js.erb
285
+ - app/views/educode_sales/assessments/attendances.json.jbuilder
282
286
  - app/views/educode_sales/assessments/edit.html.erb
287
+ - app/views/educode_sales/assessments/edit_attendance.html.erb
283
288
  - app/views/educode_sales/assessments/finished.json.jbuilder
284
289
  - app/views/educode_sales/assessments/get_export_data.json.jbuilder
290
+ - app/views/educode_sales/assessments/import.html.erb
285
291
  - app/views/educode_sales/assessments/index.html.erb
286
292
  - app/views/educode_sales/assessments/index.json.jbuilder
287
293
  - app/views/educode_sales/assessments/new.html.erb
@@ -356,9 +362,11 @@ files:
356
362
  - app/views/educode_sales/customers/show_follow.json.jbuilder
357
363
  - app/views/educode_sales/customers/show_follow_record.html.erb
358
364
  - app/views/educode_sales/customers/show_majors.html.erb
365
+ - app/views/educode_sales/follow_ups/file.html.erb
359
366
  - app/views/educode_sales/follow_ups/index.json.jbuilder
360
367
  - app/views/educode_sales/follow_ups/money_plans.json.jbuilder
361
368
  - app/views/educode_sales/follow_ups/teachers.json.jbuilder
369
+ - app/views/educode_sales/follow_ups/upload_file.html.erb
362
370
  - app/views/educode_sales/home/index.html.erb
363
371
  - app/views/educode_sales/home/no_permission.html.erb
364
372
  - app/views/educode_sales/home/sales_place.json.jbuilder