package jnpf.entity.attendance;

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 考勤本记录表（轻量级手动标记）
 * 
 * 设计原则：
 * 1. 考勤本信息通过F_BookId关联，去除删除标记（逻辑删除由业务控制）
 * 2. 一天两条记录（上班卡、下班卡），独立标记状态
 * 3. 纯状态标记，不记录具体打卡时间
 * 4. 无审批关联，无未标记状态
 * 5. 新增F_Month月份字段，便于按月查询和统计
 * 6. 新增F_LeaveType请假类型字段，记录请假具体类型
 * 7. 新增F_Remark备注字段，记录额外说明信息
 * 
 * @author Generated
 * @create 2026-04-15
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("ftb_attendance_book_record")
public class AttendanceBookRecordEntity implements Serializable {
    
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId("F_Id")
    private String id;

    /**
     * 考勤本ID
     */
    @TableField("F_BookId")
    private String bookId;

    /**
     * 考勤月份（格式：yyyy-MM）
     */
    @TableField("F_Month")
    private String month;

    /**
     * 员工ID
     */
    @TableField("F_UserId")
    private String userId;

    /**
     * 考勤日期
     */
    @TableField("F_Day")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date day;

    /**
     * 时段类型（1:上班卡 2:下班卡）
     */
    @TableField("F_PeriodType")
    private Integer periodType;

    /**
     * 考勤状态（1:正常 2:迟到 3:早退 4:缺卡 5:请假 6:出差 7:外出 8:加班）
     * <p>insert/update 均使用 {@link FieldStrategy#IGNORED}：允许显式写入 NULL（清空状态），
     * 避免被全局默认的 NOT_NULL 策略过滤掉。</p>
     */
    @TableField(value = "F_AttendanceStatus",  updateStrategy = FieldStrategy.IGNORED)
    private Integer attendanceStatus;

    /**
     * 请假类型（如：事假、病假、年假、婚假、产假等）
     * <p>insert/update 均使用 {@link FieldStrategy#IGNORED}：允许显式写入 NULL（清空请假类型），
     * 避免被全局默认的 NOT_NULL 策略过滤掉。</p>
     */
    @TableField(value = "F_LeaveType", updateStrategy = FieldStrategy.IGNORED)
    private String leaveType;

    /**
     * 备注
     */
    @TableField("F_Remark")
    private String remark;

    /**
     * 创建用户
     */
    @TableField("F_CreatorUserId")
    private String creatorUserId;

    /**
     * 创建时间
     */
    @TableField("F_CreatorTime")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date creatorTime;

    /**
     * 修改用户
     */
    @TableField("F_LastModifyUserId")
    private String lastModifyUserId;

    /**
     * 修改时间
     */
    @TableField("F_LastModifyTime")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date lastModifyTime;

    /**
     * 租户ID
     */
    @TableField("F_TenantId")
    private String tenantId;
}
