class Weapps::AttendancesController < ApplicationController before_action :require_login before_action :find_course, only: [:create, :index, :student_attendances, :history_attendances] before_action :find_attendance, except: [:create, :index, :student_attendances, :history_attendances] before_action :user_course_identity before_action :teacher_allowed, only: [:create] before_action :edit_auth, only: [:update, :destroy, :end] def create ActiveRecord::Base.transaction do attendance = @course.course_attendances.create!(create_params.merge(user_id: current_user.id)) unless params[:group_ids].blank? || @course.course_groups.where(id: params[:group_ids]).count == @course.course_groups.count group_ids = @course.charge_group_ids(current_user) & params[:group_ids].map(&:to_i) group_ids.each do |group_id| @course.course_attendance_groups.create!(course_group_id: group_id, course_attendance: attendance) end CreateStudentAttendanceRecordJob.perform_now(attendance.id, group_ids) else @course.course_attendance_groups.create!(course_group_id: 0, course_attendance: attendance) CreateStudentAttendanceRecordJob.perform_now(attendance.id, [0]) end render_ok({attendance_id: attendance.id}) end end def index tip_exception(403) if @user_course_identity >= Course::STUDENT current_date = Date.current current_end_time = Time.current.strftime("%H:%M:%S") @current_attendance = @course.course_attendances.where("attendance_date > '#{current_date}' or (attendance_date = '#{current_date}' and end_time > '#{current_end_time}')") .order("attendance_date asc, start_time asc") all_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')") @all_member_attendances = CourseMemberAttendance.where(course_attendance_id: all_attendances) if params[:group_id].present? all_attendances = all_attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: [params[:group_id], 0]}) @all_member_attendances = @all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]}) end @history_attendances = all_attendances.order("id asc") @all_history_count = @history_attendances.size end def student_attendances # tip_exception("学生身份的签到列表") if @user_course_identity != Course::STUDENT member = @course.students.find_by(user_id: current_user.id) if member.present? current_date = Date.current current_end_time = Time.current.strftime("%H:%M:%S") # 先算出该学生所在分班的签到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_attendance_ids = member.course_member_attendances.where(course_id: @course.id).pluck(:course_attendance_id) @history_attendances = @course.course_attendances.where(id: history_attendance_ids.uniq). where("attendance_date < '#{current_date}' or (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')").order("id desc") @current_attendances = @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}'") @history_count = @history_attendances.size # 当前签到如果存在快捷签到,则直接签到 quick_attendances = @current_attendances.where(mode: "QUICK") if quick_attendances.present? student_direct_attendance quick_attendances, member end student_attendance_ids = @history_attendances.pluck(:id) student_attendance_ids += @current_attendances.present? ? @current_attendances.pluck(: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_member_id: member&.id, course_attendance_id: student_attendance_ids, attendance_status: "NORMAL").size @leave_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: student_attendance_ids, attendance_status: "LEAVE").size # 旷课只统计历史签到的 @absence_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: @history_attendances.pluck(:id), attendance_status: "ABSENCE").size end @all_history_count = @history_attendances.size @history_attendances = paginate @history_attendances.includes(:course_member_attendances) end end def show @normal_count = @attendance.normal_count @leave_count = @attendance.leave_count @absence_count = @attendance.absence_count @all_count = @attendance.course_member_attendances.size @_is_current_attendance = @attendance.current_attendance? if @attendance.course_attendance_groups.first&.course_group_id.to_i == 0 @group_ids = @course.course_groups.pluck(:id) + [0] else @group_ids = @attendance.course_attendance_groups.pluck(:course_group_id) end @groups = @course.course_groups.where(id: @group_ids) @course_members = @course.students if @_is_current_attendance @all_attendances = @attendance.course_member_attendances end def update @attendance.update!(name: params[:name]) render_ok end def destroy @attendance.destroy! render_ok end def history_attendances current_date = Date.current current_end_time = Time.current.strftime("%H:%M:%S") @history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')").order("id desc") @all_history_count = @history_attendances.size @history_attendances = paginate @history_attendances.includes(:course_member_attendances) end def end a_end_time = "#{@attendance.attendance_date} #{@attendance.end_time}".to_time tip_exception("该签到已截止") unless @attendance.current_attendance? @attendance.update!(end_time: Time.current) render_ok 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 def edit_auth tip_exception(403, "") unless @user_course_identity < Course::PROFESSOR || @attendance.user_id == current_user.id end def student_direct_attendance quick_attendances, member quick_attendances.each do |attendance| current_attendance = attendance.course_member_attendances.find_by(user_id: member.user_id) if current_attendance.present? current_attendance.update!(attendance_status: "NORMAL", attendance_mode: "QUICK") else attendance.course_member_attendances.create!(course_member_id: member.id, user_id: member.user_id, course_id: attendance.course_id, course_group_id: member.course_group_id, attendance_status: "NORMAL", attendance_mode: "QUICK") end end end end