Files
fonrey/apps/org/models/staff_logs.py
ishenwei f185127335 feat(org): add Chinese verbose_name and help_text to all org fields (Phase 4.1 part 4/9)
Sync DATA_MODEL_ORG.md field-level Chinese annotations to Django
models across 11 org tables (OrgUnit, Staff, StaffPersonalInfo,
StaffTransferLog, StaffRewardPunish, StaffAccount, StaffWorkExperience,
StaffEducation, StaffTraining, StaffFamilyMember, StaffRemark).
2026-04-30 09:25:17 +08:00

355 lines
9.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 = "员工备注"