from django.db import models from core.enums import StaffAccountPlatform, StaffTransferType from core.models.base import SoftDeleteModel, TimeStampedModel class StaffTransferLog(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.RESTRICT, related_name="transfer_logs", verbose_name="被操作员工", ) transfer_type = models.CharField( max_length=30, choices=StaffTransferType.choices, verbose_name="异动类型", help_text="onboard=入职 / transfer=调动 / resign=离职 / rejoin=复职 / supervisor_change=上级变动 / role_change=角色变更 / freeze=账号冻结 / unfreeze=账号恢复", ) old_value = models.JSONField( null=True, blank=True, verbose_name="变动前值", help_text='格式:{"field": "org_unit_id", "value": "...", "label": "门店A"}', ) new_value = models.JSONField( null=True, blank=True, verbose_name="变动后值", help_text="结构同 old_value", ) transfer_date = models.DateField( verbose_name="异动生效日期", help_text="可以是过去日期", ) remarks = models.CharField( max_length=50, blank=True, default="", verbose_name="备注", help_text="最多50字", ) operator = models.ForeignKey( "org.Staff", on_delete=models.RESTRICT, related_name="operated_transfers", verbose_name="操作人", help_text="必填,异动审计必须记录", ) operated_at = models.DateTimeField( auto_now_add=True, verbose_name="系统操作时间", ) class Meta: db_table = "staff_transfer_logs" verbose_name = "人事异动记录" verbose_name_plural = "人事异动记录" indexes = [ models.Index(fields=["staff", "-transfer_date"], name="idx_transfer_logs_staff"), models.Index(fields=["transfer_type", "-operated_at"], name="idx_transfer_logs_type"), models.Index(fields=["operator"], name="idx_transfer_logs_operator"), ] class StaffRewardPunish(SoftDeleteModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="reward_punish_records", verbose_name="被奖惩员工", ) rp_date = models.DateField( verbose_name="奖惩日期", ) category = models.CharField( max_length=50, verbose_name="奖惩类别", help_text="枚举由 lookup_items 维护:org.reward_punish_category", ) name = models.CharField( max_length=100, verbose_name="奖惩名称", help_text="与类别联动", ) remarks = models.TextField( blank=True, default="", verbose_name="备注", ) created_by = models.ForeignKey( "org.Staff", null=True, blank=True, on_delete=models.SET_NULL, related_name="created_reward_punish", verbose_name="录入人", ) class Meta: db_table = "staff_reward_punish" verbose_name = "奖惩记录" verbose_name_plural = "奖惩记录" class StaffAccount(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="external_accounts", verbose_name="所属员工", help_text="证件信息随员工关联", ) platform = models.CharField( max_length=30, choices=StaffAccountPlatform.choices, verbose_name="平台", help_text="fonrey=主账号 / 58anjuke=58安居客 / cnreic=中国网络经纪人 / wechat_mp=微信公众号", ) account_no = models.CharField( max_length=100, blank=True, default="", verbose_name="账号/手机号", ) is_real_name_match = models.BooleanField( null=True, blank=True, verbose_name="实名信息一致", help_text="中国网络经纪人专用", ) is_bound = models.BooleanField( default=False, verbose_name="是否已绑定", ) bound_at = models.DateTimeField( null=True, blank=True, verbose_name="绑定时间", ) class Meta: db_table = "staff_accounts" verbose_name = "员工第三方账号" verbose_name_plural = "员工第三方账号" constraints = [ models.UniqueConstraint( fields=["staff", "platform"], name="uq_staff_accounts_staff_platform", ), ] class StaffWorkExperience(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="work_experiences", verbose_name="所属员工", ) company = models.CharField( max_length=200, verbose_name="公司名称", ) job_title = models.CharField( max_length=100, blank=True, default="", verbose_name="职位", ) start_date = models.DateField( null=True, blank=True, verbose_name="开始日期", ) end_date = models.DateField( null=True, blank=True, verbose_name="结束日期", ) reason = models.CharField( max_length=200, blank=True, default="", verbose_name="离职原因", ) reference_name = models.CharField( max_length=50, blank=True, default="", verbose_name="证明人姓名", ) reference_phone = models.CharField( max_length=30, blank=True, default="", verbose_name="证明人电话", ) class Meta: db_table = "staff_work_experiences" verbose_name = "工作经历" verbose_name_plural = "工作经历" class StaffEducation(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="educations", verbose_name="所属员工", ) stage = models.CharField( max_length=30, blank=True, default="", verbose_name="教育阶段", ) school = models.CharField( max_length=200, verbose_name="学校", ) major = models.CharField( max_length=100, blank=True, default="", verbose_name="专业", ) start_date = models.DateField( null=True, blank=True, verbose_name="开始日期", ) end_date = models.DateField( null=True, blank=True, verbose_name="结束日期", ) enrollment_status = models.CharField( max_length=30, blank=True, default="", verbose_name="就读状态", ) degree = models.CharField( max_length=30, blank=True, default="", verbose_name="学位", ) class Meta: db_table = "staff_educations" verbose_name = "教育经历" verbose_name_plural = "教育经历" class StaffTraining(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="trainings", verbose_name="所属员工", ) training_name = models.CharField( max_length=200, verbose_name="培训名称", ) training_date = models.DateField( null=True, blank=True, verbose_name="培训日期", ) certificate = models.CharField( max_length=200, blank=True, default="", verbose_name="证书", ) class Meta: db_table = "staff_trainings" verbose_name = "培训记录" verbose_name_plural = "培训记录" class StaffFamilyMember(TimeStampedModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="family_members", verbose_name="所属员工", ) relation = models.CharField( max_length=30, verbose_name="称谓", ) name = models.CharField( max_length=50, verbose_name="姓名", ) birthdate = models.DateField( null=True, blank=True, verbose_name="出生日期", ) occupation = models.CharField( max_length=100, blank=True, default="", verbose_name="职业", ) work_unit = models.CharField( max_length=200, blank=True, default="", verbose_name="工作单位", ) phone_enc = models.BinaryField( null=True, blank=True, verbose_name="电话(加密)", help_text="AES-256-GCM 加密", ) class Meta: db_table = "staff_family_members" verbose_name = "家庭成员" verbose_name_plural = "家庭成员" class StaffRemark(SoftDeleteModel): staff = models.ForeignKey( "org.Staff", on_delete=models.CASCADE, related_name="remarks", verbose_name="所属员工", ) content = models.TextField( verbose_name="备注内容", ) created_by = models.ForeignKey( "org.Staff", null=True, blank=True, on_delete=models.SET_NULL, related_name="created_remarks", verbose_name="创建人", ) class Meta: db_table = "staff_remarks" verbose_name = "员工备注" verbose_name_plural = "员工备注"