educode_sales 1.10.2 → 1.10.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: 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