using FreeSql.DataAnnotations;
using F9WebAiTest.Domain.Enums.SYS.Employees;
using F9WebAiTest.Domain.Events.SYS.Employees;
namespace F9WebAiTest.Domain.Entities.SYS.Employees;
///
/// 职工档案:部门/工种/岗位 + 基本信息 + 合同社保 + 教育经历 + 生产信息(班次/工作组/顺序号)。
/// 转正、离职、调岗、重新入职等通过行为方法变更,并单独记录变更/调岗历史。
///
[Table(Name = "sys_employee")]
public class Employee : AggregateRoot
{
/// 所属部门 Id
[Column(Name = "dep_id")] public long DepId { get; private set; }
/// 工种 Id
[Column(Name = "worktype_id")] public long WorktypeId { get; private set; }
/// 在职状态
[Column(Name = "work_status")] public Employee_WorkStatus_Enum WorkStatus { get; private set; }
/// 工号
[Column(Name = "code")] public string Code { get; private set; }
/// 姓名
[Column(Name = "name")] public string Name { get; private set; }
/// 岗位
[Column(Name = "gangwei")] public string Gangwei { get; private set; }
/// 电话
[Column(Name = "phone")] public string Phone { get; private set; }
/// 身份证号
[Column(Name = "idcard")] public string IdCard { get; private set; }
/// 出生日期
[Column(Name = "birth_date")] public DateTime? BirthDate { get; private set; }
/// 住址
[Column(Name = "address")] public string Address { get; private set; }
/// 性别
[Column(Name = "gender")] public string Gender { get; private set; }
/// 民族
[Column(Name = "minzu")] public string Minzu { get; private set; }
/// 婚姻状态
[Column(Name = "hunyin_status")] public string HunyinStatus { get; private set; }
/// 户籍
[Column(Name = "huji")] public string Huji { get; private set; }
/// 入职日期
[Column(Name = "ruzhi_date")] public DateTime? RuzhiDate { get; private set; }
/// 离职日期
[Column(Name = "lizhi_date")] public DateTime? LizhiDate { get; private set; }
/// 转正日期
[Column(Name = "zhuanzheng_date")] public DateTime? ZhuanzhengDate { get; private set; }
/// 是否已转正
[Column(Name = "is_zhuanzheng")] public bool IsZhuanzheng { get; private set; }
/// 紧急联系人
[Column(Name = "jinji_lianxiren")] public string JinjiLianxiren { get; private set; }
/// 紧急联系人电话
[Column(Name = "jinji_lianxiren_phone")] public string JinjiLianxirenPhone { get; private set; }
/// 合同类型
[Column(Name = "hetong_type")] public string HetongType { get; private set; }
/// 劳动合同开始日期
[Column(Name = "hetong_start_date")] public DateTime? HetongStartDate { get; private set; }
/// 劳动合同结束日期
[Column(Name = "hetong_end_date")] public DateTime? HetongEndDate { get; private set; }
/// 退休日期
[Column(Name = "tuixiu_date")] public DateTime? TuixiuDate { get; private set; }
/// 社保参保日期
[Column(Name = "shebao_date")] public DateTime? ShebaoDate { get; private set; }
/// 社保参保情况说明
[Column(Name = "shebao_desc")] public string ShebaoDesc { get; private set; }
/// 银行卡号
[Column(Name = "bankcard_code")] public string BankcardCode { get; private set; }
/// 毕业院校
[Column(Name = "biye_yuanxiao")] public string BiyeYuanxiao { get; private set; }
/// 专业
[Column(Name = "zhuanye")] public string Zhuanye { get; private set; }
/// 学历
[Column(Name = "xueli")] public string Xueli { get; private set; }
/// 班次(甲/乙)
[Column(Name = "banci")] public Prod_Banci_Enum? Banci { get; private set; }
/// 工作组
[Column(Name = "work_group")] public string WorkGroup { get; private set; }
/// 顺序号
[Column(Name = "sort")] public int Sort { get; private set; }
/// 姓名拼音(简拼)
[Column(Name = "name_pinyin")] public string NamePinyin { get; private set; }
/// 备注
[Column(Name = "memo")] public string Memo { get; private set; }
/// 离职原因
[Column(Name = "lizhi_yuanyin")] public string LizhiYuanyin { get; private set; }
public Employee() { }
public Employee(long id, long depId, long worktypeId, Employee_WorkStatus_Enum workStatus, string code, string name,
string gangwei, string phone, string idCard, DateTime? birthDate, string address, string gender, string minzu,
string hunyinStatus, string huji, DateTime? ruzhiDate, DateTime? lizhiDate, DateTime? zhuanzhengDate,
bool isZhuanzheng, string jinjiLianxiren, string jinjiLianxirenPhone, string hetongType,
DateTime? hetongStartDate, DateTime? hetongEndDate, DateTime? tuixiuDate, DateTime? shebaoDate, string shebaoDesc,
string bankcardCode, string biyeYuanxiao, string zhuanye, string xueli, Prod_Banci_Enum? banci, string workGroup,
int sort, string namePinyin, string memo, string lizhiYuanyin)
{
Id = id;
DepId = depId;
WorktypeId = worktypeId;
WorkStatus = workStatus;
Code = code;
Name = name;
Gangwei = gangwei;
Phone = phone;
IdCard = idCard;
BirthDate = birthDate;
Address = address;
Gender = gender;
Minzu = minzu;
HunyinStatus = hunyinStatus;
Huji = huji;
RuzhiDate = ruzhiDate;
LizhiDate = lizhiDate;
ZhuanzhengDate = zhuanzhengDate;
IsZhuanzheng = isZhuanzheng;
JinjiLianxiren = jinjiLianxiren;
JinjiLianxirenPhone = jinjiLianxirenPhone;
HetongType = hetongType;
HetongStartDate = hetongStartDate;
HetongEndDate = hetongEndDate;
TuixiuDate = tuixiuDate;
ShebaoDate = shebaoDate;
ShebaoDesc = shebaoDesc;
BankcardCode = bankcardCode;
BiyeYuanxiao = biyeYuanxiao;
Zhuanye = zhuanye;
Xueli = xueli;
Banci = banci;
WorkGroup = workGroup;
Sort = sort;
NamePinyin = namePinyin;
Memo = memo;
LizhiYuanyin = lizhiYuanyin;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 修改基本信息(部门/工种/班次通过调岗变更)
public void Update(string code, string name, string gangwei, string phone, string idCard, DateTime? birthDate,
string address, string gender, string minzu, string hunyinStatus, string huji, DateTime? ruzhiDate,
string jinjiLianxiren, string jinjiLianxirenPhone, string hetongType, DateTime? hetongStartDate,
DateTime? hetongEndDate, DateTime? tuixiuDate, DateTime? shebaoDate, string shebaoDesc, string bankcardCode,
string biyeYuanxiao, string zhuanye, string xueli, string namePinyin, string memo)
{
Code = code;
Name = name;
Gangwei = gangwei;
Phone = phone;
IdCard = idCard;
BirthDate = birthDate;
Address = address;
Gender = gender;
Minzu = minzu;
HunyinStatus = hunyinStatus;
Huji = huji;
RuzhiDate = ruzhiDate;
JinjiLianxiren = jinjiLianxiren;
JinjiLianxirenPhone = jinjiLianxirenPhone;
HetongType = hetongType;
HetongStartDate = hetongStartDate;
HetongEndDate = hetongEndDate;
TuixiuDate = tuixiuDate;
ShebaoDate = shebaoDate;
ShebaoDesc = shebaoDesc;
BankcardCode = bankcardCode;
BiyeYuanxiao = biyeYuanxiao;
Zhuanye = zhuanye;
Xueli = xueli;
NamePinyin = namePinyin;
Memo = memo;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 转正
public void Zhuanzheng(DateTime date)
{
IsZhuanzheng = true;
ZhuanzhengDate = date.Date;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 取消转正
public void ZhuanzhengCancel()
{
IsZhuanzheng = false;
ZhuanzhengDate = null;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 离职
public void Lizhi(DateTime date, string yuanyin)
{
WorkStatus = Employee_WorkStatus_Enum.离职;
LizhiDate = date.Date;
LizhiYuanyin = yuanyin ?? string.Empty;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 取消离职
public void LizhiCancel()
{
WorkStatus = Employee_WorkStatus_Enum.在职;
LizhiDate = null;
LizhiYuanyin = string.Empty;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 调岗
public void Tiaogang(long depId, long worktypeId, string gangwei, Prod_Banci_Enum? banci)
{
DepId = depId;
WorktypeId = worktypeId;
if (!string.IsNullOrWhiteSpace(gangwei)) Gangwei = gangwei;
if (banci.HasValue) Banci = banci;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 重新入职(离职人员按新部门/工种入职)
public void RenewRuzhi(DateTime date, long depId, long worktypeId, string gangwei, Prod_Banci_Enum? banci)
{
WorkStatus = Employee_WorkStatus_Enum.在职;
DepId = depId;
WorktypeId = worktypeId;
RuzhiDate = date.Date;
LizhiDate = null;
LizhiYuanyin = string.Empty;
if (!string.IsNullOrWhiteSpace(gangwei)) Gangwei = gangwei;
if (banci.HasValue) Banci = banci;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
/// 修改生产信息(工作组 / 顺序号)
public void UpdateSc(string workGroup, int sort)
{
WorkGroup = workGroup ?? string.Empty;
Sort = sort;
AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}
public void Deleted() => AddDomainEvent(new Employee_ChangedDomainEvent(Id));
}