package com.njcn.rdms.module.project.dal.dataobject.project.task;

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.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.njcn.rdms.framework.mybatis.core.dataobject.BaseDO;
import com.njcn.rdms.module.project.dal.dataobject.attachment.AttachmentItem;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 任务工时记录表。仅挂在叶子任务上；按段记录（start_date/end_date 必填，单天=二者相等）。
 * 同人同任务下日期范围禁止重叠。
 * 颗粒：duration_hours 必须 > 0 且为 0.5 的整数倍。
 */
@TableName(value = "rdms_task_worklog", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class TaskWorklogDO extends BaseDO {

    /**
     * 主键 ID
     */
    @TableId
    private Long id;
    /**
     * 任务编号（必须为叶子任务）
     */
    private Long taskId;
    /**
     * 填报人用户编号（owner 或在岗协办人）
     */
    private Long userId;
    /**
     * 段起始日期（含），单天 = 与 endDate 相等
     */
    private LocalDate startDate;
    /**
     * 段结束日期（含），单天 = 与 startDate 相等
     */
    private LocalDate endDate;
    /**
     * 本次填报小时数，必须 > 0 且为 0.5 的整数倍
     */
    private BigDecimal durationHours;
    /**
     * 本次填报进度（0~100，必填）。
     * <ul>
     *   <li>owner 填报：以 owner 本人最新一条工时（按 end_date desc, create_time desc, id desc）为准，
     *       同步写入 {@code rdms_task.progress_rate} 并触发父任务 AVG 重算。</li>
     *   <li>协作人填报：仅作为本人自评个人完成度，不影响任务/父任务进度。</li>
     * </ul>
     */
    private BigDecimal progressRate;
    /**
     * 完成难度字典 {@code rdms_worklog_difficulty}：
     * "1" 简单 / "2" 一般 / "3" 困难 / "4" 超难，数值大=越难。必填，DDL 默认 "2"。
     */
    private String difficulty;
    /**
     * 工作内容描述。允许在 update 时传 null 清空（updateStrategy=ALWAYS 跳过全局 NOT_NULL 策略，
     * 始终参与 SQL 拼接，包括 null）。调用方约定：update 必须全字段回传，不能用 null 表示"未改动"。
     */
    @TableField(updateStrategy = FieldStrategy.ALWAYS)
    private String workContent;
    /**
     * 附件列表（JSON）。元素 {@link AttachmentItem}：id / url / name / size / contentType。
     * 校验由 {@code AttachmentValidator} 在 Service 入口完成。
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<AttachmentItem> attachments;

}
