package com.xjrsoft.module.datalog.entity;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableField;
import com.pictc.common.mybatis.JsonTypeHandler;
import com.xjrsoft.module.datalog.entity.json.FieldChange;
import com.xjrsoft.module.datalog.vo.OperationType;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 数据变更日志实体类
 * 用于记录数据库字段修改和实体删除操作
 */
@ApiModel(value = "DataChangeLog对象", description = "数据变更日志")
@Data
@Accessors(chain = true)
public class DataChangeLog implements Serializable{
	
    /**
	 * @Fields {todo}(用一句话描述这个变量表示什么)
	 */
	private static final long serialVersionUID = 1L;

	/**
     * 	日志ID（主键）
     */
	@ApiModelProperty("主键")
    private String id;
	
	/**
	 * 	日志ID（主键）
	 */
	@ApiModelProperty("流水id")
	private String flowId;
	
    /**
     * 	父表ID,根节点#
     */
	@ApiModelProperty("父表ID")
    private String pid = "#";
    
    /**
     * 	实体类名称（全类名）
     */
	@ApiModelProperty("实体类名称（全类名）")
    private String entityClassName;
    
    /**
     * 	实体类简称（简单类名）
     */
	@ApiModelProperty("业务名称")
    private String busName;
    
    /**
     * 	操作的实体ID（主键值）
     */
	@ApiModelProperty("操作的实体ID（主键值）")
    private Long entityId;
    
    /**
     * 	字段变更详情
     * key: 字段名
     * value: 包含旧值和新值的Map
     */
    @TableField(typeHandler = JsonTypeHandler.class)
    @ApiModelProperty("属性值记录")
    private List<FieldChange> fieldChanges = new ArrayList<FieldChange>();
    
    /**
     * 	操作类型：INSERT-新增，UPDATE-修改，DELETE-删除
     */
	@ApiModelProperty("操作类型：INSERT-新增，UPDATE-修改，DELETE-删除")
    private OperationType operationType;
    
    /**
     * 	操作人ID
     */
    @ApiModelProperty("操作人ID")
    private Long operatorId;
    
    /**
     * 	操作人姓名
     */
    @ApiModelProperty("操作人姓名")
    private String operatorName;
    
    /**
     * 	操作时间
     */
    @ApiModelProperty("操作时间")
    private LocalDateTime operationTime;
    
    /**
     * 	操作IP地址
     */
    @ApiModelProperty("操作IP地址")
    private String operationIp;
    
    
    /**
     * 	判断是否有字段变更
     */
    public boolean hasFieldChanges() {
        return !this.fieldChanges.isEmpty();
    }


	public void addFiledChnage(FieldChange change) {
		fieldChanges.add(change);
	}
}

