package com.railway.common.core.domain.entity;

import com.railway.common.annotation.Excel;
import com.railway.common.annotation.Excel.ColumnType;
import com.railway.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 角色表 sys_role
 *
 * @author railway
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("系统管理 - 角色(职务)")
public class SysRole extends BaseEntity {

  private static final long serialVersionUID = 1L;

  /**
   * 角色ID
   */
  @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
  private Long roleId;

  /**
   * 角色名称
   */
  @NotBlank(message = "角色名称不能为空")
  @Size(max = 30, message = "角色名称长度不能超过30个字符")
  @Excel(name = "角色名称")
  private String roleName;

  /**
   * 角色权限
   * @NotBlank(message = "权限字符不能为空")
   */
  @Size(max = 100, message = "权限字符长度不能超过100个字符")
  @Excel(name = "角色权限")
  private String roleKey;

  /**
   * 角色排序
   */
  @Excel(name = "角色排序", cellType = ColumnType.NUMERIC)
  private String roleSort;

  /**
   * 数据范围（1：所有数据权限；2：自定义数据权限；3：本部门数据权限；4：本部门及以下数据权限；5：仅本人数据权限）
   */
  @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
  private String dataScope;

  /**
   * 菜单树选择项是否关联显示（ 0：父子不互相关联显示 1：父子互相关联显示）
   */
  private boolean menuCheckStrictly;

  /**
   * 部门树选择项是否关联显示（0：父子不互相关联显示 1：父子互相关联显示 ）
   */
  private boolean deptCheckStrictly;

  /**
   * 角色状态（0正常 1停用）
   */
  @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
  private String status;

  /**
   * 成员数量
   */
  @ApiModelProperty(value = "成员数量")
  private Integer userCount;

  /**
   * 删除标志（0代表存在 1代表删除）
   */
  private String delFlag;

  /**
   * 用户是否存在此角色标识 默认不存在
   */
  private boolean flag = false;

  /**
   * 菜单组
   */
  private Long[] menuIds;

  /**
   * 部门组（数据权限）
   */
  private Long[] deptIds;

  public SysRole() {

  }

  public SysRole(Long roleId) {
    this.roleId = roleId;
  }

  public boolean isAdmin() {
    return isAdmin(this.roleId);
  }

  public static boolean isAdmin(Long roleId) {
    return roleId != null && 1L == roleId;
  }

}
