Files
fonrey/apps/org/models/org_unit.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

134 lines
3.7 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 OrgUnitAttribute, OrgUnitType
from core.models.base import SoftDeleteModel
class OrgUnit(SoftDeleteModel):
name = models.CharField(
max_length=100,
verbose_name="部门名称",
help_text="部门/组织名称",
)
type = models.CharField(
max_length=20,
choices=OrgUnitType.choices,
verbose_name="组织类型",
help_text="company=公司 / division=事业部 / region=大区 / area=区域 / district=片区 / store=门店 / group=店组 / functional=职能",
)
parent = models.ForeignKey(
"self",
null=True,
blank=True,
on_delete=models.RESTRICT,
related_name="children",
db_index=True,
verbose_name="父节点",
help_text="父节点,根节点为 NULL",
)
path = models.TextField(
verbose_name="物化路径",
help_text='/root_id/.../self_id/,用于子树查询',
)
depth = models.SmallIntegerField(
default=0,
verbose_name="节点深度",
help_text="根=0最大支持 8 层",
)
sort_order = models.IntegerField(
default=0,
verbose_name="排序顺序",
help_text="同级排序",
)
attribute = models.CharField(
max_length=10,
choices=OrgUnitAttribute.choices,
null=True,
blank=True,
verbose_name="经营属性",
help_text="direct=直营 / franchise=加盟",
)
address_city = models.CharField(
max_length=50,
blank=True,
default="",
verbose_name="所在城市",
)
address_district = models.CharField(
max_length=50,
blank=True,
default="",
verbose_name="所在县区",
)
address_detail = models.CharField(
max_length=200,
blank=True,
default="",
verbose_name="详细地址",
)
latitude = models.DecimalField(
max_digits=10,
decimal_places=7,
null=True,
blank=True,
verbose_name="纬度",
help_text="部门定位针 WGS84",
)
longitude = models.DecimalField(
max_digits=10,
decimal_places=7,
null=True,
blank=True,
verbose_name="经度",
help_text="部门定位针 WGS84",
)
manager = models.ForeignKey(
"org.Staff",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="managed_org_units",
verbose_name="部门负责人",
help_text="循环依赖Application 层维护",
)
established_at = models.DateField(
null=True,
blank=True,
verbose_name="成立时间",
)
phone = models.CharField(
max_length=30,
blank=True,
default="",
verbose_name="部门联系电话",
)
ext_start = models.IntegerField(
null=True,
blank=True,
verbose_name="分机号起始",
)
ext_end = models.IntegerField(
null=True,
blank=True,
verbose_name="分机号结束",
)
is_active = models.BooleanField(
default=True,
verbose_name="是否启用",
help_text="FALSE=已关闭部门,仍可在筛选中显示",
)
class Meta:
db_table = "org_units"
verbose_name = "组织节点"
verbose_name_plural = "组织节点"
indexes = [
models.Index(fields=["parent"], name="idx_org_units_parent"),
models.Index(fields=["type"], name="idx_org_units_type"),
models.Index(fields=["path"], name="idx_org_units_path"),
]
ordering = ["sort_order", "name"]
def __str__(self) -> str:
return f"{self.name} ({self.type})"