video_log
cxt 5 years ago
parent 81380ea879
commit c3d98855cb

@ -1,38 +0,0 @@
class AttendancesController < ApplicationController
before_action :require_login
before_action :find_course, only: [:create, :index]
def create
ActiveRecord::Base.transaction do
attendance = @course.course_attendances.create!(create_params)
unless params[:group_ids].blank?
params[:group_ids].each do |group_id|
@course.course_attendance_groups.create!(course_group_id: group_id, course_attendance: attendance)
end
else
end
end
end
def index
end
def show
end
def update
end
def destroy
end
private
def create_params
params.permit(:name, :mode, :attendance_date, :start_time, :end_time)
end
end

@ -0,0 +1,85 @@
class Weapps::AttendancesController < ApplicationController
before_action :require_login
before_action :find_course, only: [:create, :index]
before_action :find_attendance, except: [:create, :index]
before_action :user_course_identity
before_action :teacher_allowed, only: [:create]
def create
ActiveRecord::Base.transaction do
attendance = @course.course_attendances.create!(create_params.merge(user_id: current_user.id))
unless params[:group_ids].blank?
group_ids = @course.charge_group_ids(current_user) & params[:group_ids]
group_ids.each do |group_id|
@course.course_attendance_groups.create!(course_group_id: group_id, course_attendance: attendance)
end
else
@course.course_attendance_groups.create!(course_group_id: 0, course_attendance: attendance)
end
render_ok({attendance_id: attendance.id})
end
end
def index
end
def student_attendances
if @user_course_identity == Course::STUDENT
current_date = Date.current
current_end_time = Time.current.strftime("%H:%M:%S")
member = @course.students.find_by(user_id: current_user.id)
# 先算出该学生所在分班的签到id
# 分班id为0 表示签到不限制分班
group_ids = [member&.course_group_id.to_i, 0]
all_attendance_ids = @course.course_attendance_groups.where(course_group_id: group_ids).pluck(:course_attendance_id)
@history_attendances = @course.course_attendances.where(id: all_attendance_ids.uniq).
where("attendance_date < '#{current_date}' or (attendance_date = '#{current_date}' and end_time < #{current_end_time})").order("id desc")
@current_attendance = @course.course_attendances.where(id: all_attendance_ids.uniq).
where("attendance_date = '#{current_date}' and start_time <= #{current_end_time} and end_time > #{current_end_time}").take
@history_count = @history_attendances.size
student_attendance_ids = @history_attendances.pluck(:id)
student_attendance_ids += @current_attendance.present? ? [@current_attendance.id] : []
if student_attendance_ids.uniq.blank?
@normal_count = 0
@leave_count = 0
@absence_count = 0
else
@normal_count = @course.course_member_attendances.where(course_attendance_id: student_attendance_ids, attendance_status: 1).size
@leave_count = @course.course_member_attendances.where(course_attendance_id: student_attendance_ids, attendance_status: 2).size
@absence_count = student_attendance_ids.uniq.size - @normal_count - @leave_count
end
@all_history_count = @history_attendances.size
@history_attendances = paginate @history_attendances.includes(:course_member_attendances)
end
end
def show
end
def update
tip_exception(403, "") unless @user_course_identity < Course::PROFESSOR || @attendance.user_id == current_user.id
@attendance.update!(name: params[:name])
render_ok
end
def destroy
end
private
def create_params
params.permit(:name, :mode, :attendance_date, :start_time, :end_time)
end
def find_attendance
@attendance = CourseAttendance.find params[:id]
@course = @attendance.course
end
end

@ -92,7 +92,8 @@ class Course < ApplicationRecord
# 签到
has_many :course_attendances, dependent: :destroy
has_many :course_attendance_groups, dependent: :destroy
has_many :course_attendance_groups
has_many :course_member_attendances
validate :validate_sensitive_string

@ -1,8 +1,10 @@
class CourseAttendance < ApplicationRecord
# mode: 0 两种签到1 二维码签到2 数字签到
belongs_to :course
belongs_to :user
has_many :course_attendance_groups, dependent: :destroy
has_many :course_member_attendances, dependent: :destroy
validates :name, presence: true
validates :mode, presence: true
@ -10,4 +12,22 @@ class CourseAttendance < ApplicationRecord
validates :start_time, presence: true
validates :end_time, presence: true
after_create :generate_attendance_code
# 延迟生成邀请码
def attendance_code
return generate_attendance_code
end
# 生成邀请码
CODES = %W(2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z)
def generate_attendance_code
code = read_attribute(:attendance_code)
if !code || code.size < 4
code = CODES.sample(4).join
return generate_attendance_code if CourseAttendance.where(attendance_code: code).present?
update_attribute(:attendance_code, code)
end
code
end
end

@ -0,0 +1,9 @@
class CourseMemberAttendance < ApplicationRecord
# attendance_mode 1 二维码签到2 数字签到3 老师签到
# attendance_status 1 正常签到2 请假
belongs_to :course_member
belongs_to :user
belongs_to :course
belongs_to :course_attendance
belongs_to :course_group
end

@ -0,0 +1,12 @@
json.current_attendance do
json.partial! 'student_attendance', locals: {attendance: @current_attendance}
end
json.history_attendances @history_attendances do |attendance|
json.partial! 'student_attendance', locals: {attendance: attendance}
end
json.all_history_count @all_history_count
json.normal_count @normal_count
json.leave_count @leave_count
json.absence_count @absence_count

@ -177,6 +177,12 @@ zh-CN:
platform: '直播平台'
live_time: '开播时间'
duration: '直播时长'
course_attendance:
name: '签到名称'
mode: '签到方式'
attendance_date: '签到日期'
start_time: '开始时间'
end_time: '结束时间'

@ -554,8 +554,6 @@ Rails.application.routes.draw do
end
end
resources :attendances, only: [:index, :update, :create, :show, :destroy], shallow: true
resources :live_links, only: [:index, :update, :create, :edit, :destroy], shallow: true
resources :homework_commons, shallow: true do
@ -1054,6 +1052,12 @@ Rails.application.routes.draw do
collection do
get :check_invite_code
end
resources :attendances, only: [:index, :update, :create, :show, :destroy], shallow: true do
member do
get :student_attendances
end
end
end
resources :homework_commons do

@ -8,6 +8,7 @@ class CreateCourseAttendances < ActiveRecord::Migration[5.2]
t.date :attendance_date
t.time :start_time
t.time :end_time
t.string :attendance_code
t.timestamps
end

@ -7,7 +7,8 @@ class CreateCourseAttendanceGroups < ActiveRecord::Migration[5.2]
t.timestamps
add_index :course_attendances, [:course_attendance_id, :course_group_id, :course_id], name: "course_group_attendance", unique: true
end
add_index :course_attendance_groups, [:course_attendance_id, :course_group_id, :course_id], name: "course_group_attendance", unique: true
end
end

@ -0,0 +1,17 @@
class CreateCourseMemberAttendances < ActiveRecord::Migration[5.2]
def change
create_table :course_member_attendances do |t|
t.references :course_member, index: true
t.references :user
t.references :course, index: true
t.references :course_attendance
t.references :course_group, index: true
t.integer :attendance_mode, default: 0
t.integer :attendance_status, default: 0
t.timestamps
end
add_index :course_member_attendances, [:course_attendance_id, :user_id], unique: true, name: "index_on_user_attendance"
end
end

@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe CourseMemberAttendance, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
Loading…
Cancel
Save