package com.zd.laboratory.mapper;

import com.zd.laboratory.domain.LabSubjectAccessRecord;
import com.zd.laboratory.domain.vo.LabSubjectAccessRecordVo;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 实验室进出记录Mapper接口
 *
 * @author zd
 * @date 2021-08-30
 */
public interface LabSubjectAccessRecordMapper {
    /**
     * 查询实验室进出记录
     *
     * @param id 实验室进出记录主键
     * @return 实验室进出记录
     */
    public LabSubjectAccessRecord selectLabSubjectAccessRecordById(Long id);

    /**
     * 查询实验室进出记录列表
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 实验室进出记录集合
     */
    public List<LabSubjectAccessRecordVo> selectLabSubjectAccessRecordList(LabSubjectAccessRecordVo labSubjectAccessRecord);

    /**
     * 查询实验室进入数据，判断用于当前实验室不可以重复签到
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 实验室进出记录集合
     */
    public List<LabSubjectAccessRecordVo> selectLabSubjectAccessRecordSingleList(LabSubjectAccessRecordVo labSubjectAccessRecord);


    public int selectAccessRecordCountBySubId(Long subId);
    /**
     * 查询我的实验室进出记录列表
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 实验室进出记录集合
     */
    public List<LabSubjectAccessRecordVo> selectMyAccessRecordList(LabSubjectAccessRecordVo labSubjectAccessRecord);


    /**
     * 实验室进出记录前五条
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 实验室进出记录前五条
     */
    public List<LabSubjectAccessRecordVo> selectLabInoutFirstFiveList(LabSubjectAccessRecord labSubjectAccessRecord);

    /**
     * 新增实验室进出记录
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 结果
     */
    public long insertLabSubjectAccessRecord(LabSubjectAccessRecord labSubjectAccessRecord);

    /**
     * 修改实验室进出记录
     *
     * @param labSubjectAccessRecord 实验室进出记录
     * @return 结果
     */
    public int updateLabSubjectAccessRecord(LabSubjectAccessRecord labSubjectAccessRecord);

    /**
     * 检查项通过更新
     * @param id
     * @return
     */
    int updateCheck(Long id);
    /**
     * 离开打卡
     *
     * @param labSubjectAccessRecord
     * @return
     */
    public int updateOut(LabSubjectAccessRecord labSubjectAccessRecord);

    /**
     * 查询最近的一条记录-指定用户和实验室
     *
     * @param labSubjectAccessRecord
     * @return
     */
    public LabSubjectAccessRecord queryLastByUserId(LabSubjectAccessRecord labSubjectAccessRecord);

    /**
     * 删除实验室进出记录
     *
     * @param id 实验室进出记录主键
     * @return 结果
     */
    public int deleteLabSubjectAccessRecordById(Long id);

    /**
     * 批量删除实验室进出记录
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteLabSubjectAccessRecordByIds(Long[] ids);

    /**
     * 统计人员出入实验室次数(以日为单位)。
     *
     * @return 统计人员出入实验室次数
     */
    public List<LabSubjectAccessRecordVo> labInoutTime(LabSubjectAccessRecordVo labSubjectAccessRecordVo);


    /**
     * 查询实验室进出记录
     *
     * @param id 实验室进出记录主键
     * @return 实验室进出记录
     */
    public LabSubjectAccessRecordVo myAccessDetail(Long id);


    /**
     * 超时违规记录
     *
     * @return 结果
     */
    public int outTimeRecord();

    /**
     * 个人工作台 实验室进出统计
     */
    Map<String, Object> queryRecordStatistics(LabSubjectAccessRecordVo labSubjectAccessRecord);

    /**
     * 超时变更进出记录状态
     *
     * @return 结果
     */
    public int outTimeChangeStatus();

    /**
     * 查询用户当天的签到未离开的记录
     * @param userId
     * @param dateTime
     * @return
     */
    public int getRecordNoOut(@Param("userId") Long userId,@Param("dateTime") String dateTime);

    List<Map<String, Long>> selectJoinUsers(@Param("subs") List<Long> subs, @Param("date") Date date);

    List<LabSubjectAccessRecord> selectSubIdByUserId(Long userId);

    /**
     * 根据签到id修改签到id
     * @param accessRecord
     * @return
     */
    int updateLabSubjectAccessRecordById(LabSubjectAccessRecord accessRecord);
}
