

package com.zcloud.modules.sys.entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.shiro.crypto.hash.SimpleHash;

import java.io.Serializable;
import java.time.LocalDate;
import java.time.Period;
import java.util.regex.Pattern;

/**
 * 系统用户
 *
 *
 */
@Data
@TableName("sys_user")
public class SysUserEntity implements Serializable {
	private static final long serialVersionUID = -69078984620623053L;
	//用户ID
	@ApiModelProperty(value = "用户ID")
	@TableId
	private String userId;
	@ApiModelProperty(value = "用户ID")
	@TableField(exist = false)
	private String selectUserId;
	//用户名
	@ApiModelProperty(value = "用户名")
	private String username;
	//密码
	@ApiModelProperty(value = "密码")
	private String password;
	//姓名
	@ApiModelProperty(value = "姓名")
	private String name;
	//角色ID
	@ApiModelProperty(value = "角色ID")
	private String roleId;
	@ApiModelProperty(value = "角色名称")
	@TableField(exist = false)
	private String rolesName;
	//最近登录时间
	@ApiModelProperty(value = "最近登录时间")
	private String lastLogin;
	//IP
	@ApiModelProperty(value = "IP")
	private String ip;
	//状态0.正常 99.锁定 2密码错误次数超过当天限制
	@ApiModelProperty(value = "状态0.正常 99.锁定 2密码错误次数超过当天限制")
	private Integer status;
	//备注
	@ApiModelProperty(value = "备注")
	private String bz;
	//皮肤
	@ApiModelProperty(value = "皮肤")
	private String skin;
	//邮箱
	@ApiModelProperty(value = "邮箱")
	private String email;
	//编码
	@ApiModelProperty(value = "编码")
	private String number;
	//电话
	@ApiModelProperty(value = "电话")
	private String phone;
	//副职角色ID组
	@ApiModelProperty(value = "副职角色ID组")
	private String roleIds;
	//部门ID
	@ApiModelProperty(value = "部门ID")
	private String departmentId;
	@TableField(exist = false)
	@ApiModelProperty(value = "部门名称")
	private String departmentName;
	@TableField(exist = false)
	@ApiModelProperty(value = "部门名称-全")
	private String departmentNameAll;

	//企业
	@ApiModelProperty(value = "企业")
	private String corpinfoId;
	//小程序菜单ID组
	@ApiModelProperty(value = "小程序菜单ID组")
	private String funIds;
	//微信码
	@ApiModelProperty(value = "微信码")
	private String appid;
	//岗位
	@ApiModelProperty(value = "岗位")
	private String postId;
	//岗位
	@ApiModelProperty(value = "岗位名称")
	@TableField(exist = false)
	private String postName;
	//是否主账号
	@ApiModelProperty(value = "是否主账号")
	private String ismain;
	//登录错误次数
	@ApiModelProperty(value = "登录错误次数")
	private Integer errorCount;
	//人员在部门中的排序
	@ApiModelProperty(value = "人员在部门中的排序")
	private Integer sort;
	//在线学习人员类别
	@ApiModelProperty(value = "在线学习人员类别")
	private String learnercategory;
	//人员头像数据前缀
	@ApiModelProperty(value = "人员头像数据前缀")
	private String useravatarprefix;
	//人员头像数据
	@ApiModelProperty(value = "人员头像数据")
	private String useravatarurl;
	//倒班类型-1级
	@ApiModelProperty(value = "倒班类型-1级")
	private String shiftdutyone;
	//倒班类型-2级
	@ApiModelProperty(value = "倒班类型-2级")
	private String shiftdutytwo;
	//工作状态持续时间（天）（上班或休班）
	@ApiModelProperty(value = "工作状态持续时间（天）（上班或休班）")
	private String duration;
	//工作状态 1-上班 2-休班
	@ApiModelProperty(value = "工作状态 1-上班 2-休班")
	private String workstatus;
	//当前工作周期数
	@ApiModelProperty(value = "当前工作周期数")
	private String workperiod;
	private String isRecorder;
	//人员类型
	@ApiModelProperty(value = "人员类型")
	private String personnelType;
	@ApiModelProperty(value = "人员类型名称")
	@TableField(exist = false)
	private String personnelTypeName;
	//是否为隐患确认人0否1是
	@ApiModelProperty(value = "是否为隐患确认人0否1是")
	private Integer isHazardconfirmer;
	//是否为临时访问审核人(0：否，1：是)
	@ApiModelProperty(value = "是否为临时访问审核人(0：否，1：是)")
	private String isAccessauditor;
	//是否在线学习人员
	@ApiModelProperty(value = "是否在线学习人员")
	private Integer isOnlinelearning;
	//人员类型
	@Deprecated
	@ApiModelProperty(value = "人员类型(废弃)")
	private String personType;
	//emis对接人员
	@ApiModelProperty(value = "emis对接人员")
	private String jcr;
	//推送id
	@ApiModelProperty(value = "推送id")
	private String pushCid;
	//工号（人员定位使用）
	@ApiModelProperty(value = "工号（人员定位使用）")
	private String empno;
	//曹妃甸数据人员状态 0企业端  1监管端   此字段用于港务局给曹妃甸发起安全环保检查选择人员 只选曹妃甸该字段值为1的人员
	@ApiModelProperty(value = "曹妃甸数据人员状态 0企业端  1监管端   此字段用于港务局给曹妃甸发起安全环保检查选择人员 只选曹妃甸该字段值为1的人员")
	private String cfdStatus;
	//卡号（人员定位使用）
	@ApiModelProperty(value = "卡号（人员定位使用）")
	private String cardno;
	//修改人
	@ApiModelProperty(value = "身份证号")
	private String userIdCard;
	//人员标识用作手机app登录（12.15新加如需删除请联系王轩）
	@ApiModelProperty(value = "人员标识用作手机app登录（12.15新加如需删除请联系王轩）")
	private String userIdentity;
	private String baseimgpath;
	private String backendaddr;
	//门口门禁人员编号(门口门禁使用)
	@ApiModelProperty(value = "门口门禁人员编号(门口门禁使用)")
	private String mkmjcard;
	//是否推送到中台
	@ApiModelProperty(value = "是否推送到中台")
	private String ispush;
	//1监管2企业3相关方
	@ApiModelProperty(value = "1监管2企业3相关方")
	private String userType;
	//是否在人资系统存在(0：未确认，1：通过姓名和手机号确认，2：用户已手动确认，3：人资修改人员)
	@ApiModelProperty(value = "是否在人资系统存在(0：未确认，1：通过姓名和手机号确认，2：用户已手动确认，3：人资修改人员)")
	private String inHrUser;
	//是否删除，0否1是
	@ApiModelProperty(value = "是否删除，0否1是")
	@TableLogic
	private Integer isDelete;
	//创建人
	@ApiModelProperty(value = "创建人")
	private String creator;
	//创建时间
	@ApiModelProperty(value = "创建时间")
	@TableField(fill = FieldFill.INSERT)
	private String createTime;
	//修改人
	@ApiModelProperty(value = "修改人")
	private String operat;
	//修改时间
	@ApiModelProperty(value = "修改时间")
	@TableField(fill = FieldFill.INSERT_UPDATE)
	private String operatTime;
	@TableField(exist=false)
	@ApiModelProperty(value = "用户ID列表")
	private String[] userIds;
	@TableField(exist=false)
	@ApiModelProperty(value = "部门排序")
	private Integer departSort;

	@TableField(exist=false)
	@ApiModelProperty(value = "企业名称")
	private String corpinfoName;
	@TableField(exist=false)
	@ApiModelProperty(value = "班级数")
	private String classCount;
	@TableField(exist=false)
	@ApiModelProperty(value = "已完成班级数")
	private String completeCount;
	@TableField(exist=false)
	@ApiModelProperty(value = "学习状态")
	private String studystate;

	@TableField(exist=false)
	@ApiModelProperty(value = "企业状态")
	private Integer corpInfoStatus;

	/**
	 * 根据中国大陆18位身份证号计算年龄
	 *
	 * @param idCard 身份证号
	 * @return 当前年龄，若身份证号格式错误则返回null
	 */
	@JsonIgnore
	@JSONField(serialize = false)
	public static Integer calculateAgeByIdCard(String idCard) {
		if (idCard == null || idCard.length()!= 18) {
			return null;
		}
		// 校验身份证号合法性，简单校验，更严谨需引入身份证号校验库
		boolean isValid = Pattern.matches("^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])\\d{3}[0-9Xx]$", idCard);
		if (!isValid) {
			return null;
		}
		// 提取出生年月日
		String birthYear = idCard.substring(6, 10);
		String birthMonth = idCard.substring(10, 12);
		String birthDay = idCard.substring(12, 14);
		LocalDate birthday;
		try {
			birthday = LocalDate.of(Integer.parseInt(birthYear), Integer.parseInt(birthMonth), Integer.parseInt(birthDay));
		} catch (Exception e) {
			return null;
		}
		return calculateAge(birthday);
	}

	public Integer getAge() {
		return calculateAgeByIdCard(this.cardno);
	}

	@ApiModelProperty(value = "职务 监管字段")
	private String job;

	@ApiModelProperty(value = "职务级别 监管字段")
	private String jobLevel;

	@ApiModelProperty(value = "物业公司ID")
	private String basicinfoId;

	@ApiModelProperty(value = "管理区")
	private String precinctId;

	@TableField(exist=false)
	@ApiModelProperty(value = "角色名称")
	private String roleName;

	/**
	 * 根据生日计算当前年龄
	 *
	 * @param birthday 用户生日
	 * @return 当前年龄，若生日为空则返回null
	 */
	@JsonIgnore
	@JSONField(serialize = false)
	public static Integer calculateAge(LocalDate birthday) {
		if (birthday == null) {
			return null;
		}
		LocalDate currentDate = LocalDate.now();
		Period period = Period.between(birthday, currentDate);
		return period.getYears();
	}
	/**
	 * 获取默认登录密码
	 */
	@JsonIgnore
	@JSONField(serialize = false)
	public String getDefaultPassword() {
		return new SimpleHash("SHA-1", this.getUsername(), "Aa@123456789").toString();
	}

}
