diff --git a/Project/fonrey/PRD/权限管理/PERMISSION_SEED_MVP_BATCH1.md b/Project/fonrey/PRD/权限管理/PERMISSION_SEED_MVP_BATCH1.md new file mode 100644 index 00000000..fa26ad78 --- /dev/null +++ b/Project/fonrey/PRD/权限管理/PERMISSION_SEED_MVP_BATCH1.md @@ -0,0 +1,340 @@ +# PermissionDef 种子数据规格 — MVP 批次 1 + +> **数据来源**:竞品权限参考文档 + 各模块 PRD +> **实施方式**:Django Data Migration(RunPython)写入 `public` schema +> **字段说明**:`default_value` 用于租户首次配置前的兜底值;`scope` 类型取值 `none/self/dept/all`(对应无/本人/本部/全部);`integer` 类型 `-1` = 不限制,`0` = 不允许 + +--- + +## 房源模块(二手租赁)(66 条) + +### 房源基础 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| ------------------------------------ | ------------ | ---------- | ------------- | ------------------------- | --- | --- | --- | --- | +| `property.listing.create` | 新增房源 | boolean | `false` | 是否可新增房源 | True | False | True | 1 | +| `property.listing.view_scope` | 维护房源查看范围 | scope | `self` | 按维护人范围查看房源列表:无/本人/本部/全部 | True | False | True | 1 | +| `property.listing.view_public` | 公盘查看 | boolean | `false` | 是否可查看公盘房源 | True | False | True | 1 | +| `property.listing.view_private` | 私盘查看 | boolean | `false` | 是否可查看私盘房源 | True | False | True | 1 | +| `property.listing.set_public` | 将房源改为公盘 | boolean | `false` | 是否可将房源属性改为公盘 | True | False | True | 1 | +| `property.listing.set_private` | 将房源改为私盘 | boolean | `false` | 是否可将房源属性改为私盘 | True | False | True | 1 | +| `property.listing.set_locked` | 将房源改为封盘 | boolean | `false` | 是否可将房源属性改为封盘 | True | False | True | 1 | +| `property.listing.set_special` | 将房源改为特盘 | boolean | `false` | 是否可将房源属性改为特盘 | True | False | True | 1 | +| `property.listing.delete` | 删除房源 | boolean | `false` | 是否可删除房源 | True | False | True | 1 | +| `property.listing.restore` | 恢复已删除房源 | boolean | `false` | 是否可恢复已删除的房源 | True | False | True | 1 | +| `property.listing.export` | 房源列表数据导出 | boolean | `false` | 是否可将房源列表数据导出 | True | False | True | 1 | +| `property.listing.edit_description` | 修改房屋介绍信息 | boolean | `false` | 是否可修改营销标题、核心卖点、户型介绍等介绍信息 | True | False | True | 1 | +| `property.listing.view_deal` | 成交房源列表及价格信息 | boolean | `false` | 是否可查看成交房源列表及价格历史 | True | False | True | 1 | +| `property.listing.price_read` | 价格解读 | boolean | `false` | 是否可查看房源详情页的价格解读 | True | False | True | 1 | +| `property.listing.view_history` | 查看房源挂牌历史 | boolean | `false` | 是否可查看房源挂牌历史记录 | True | False | True | 1 | +| `property.listing.view_owner_others` | 查看同业主其他房源 | boolean | `false` | 是否可在房源详情页查看同业主的其他房源 | True | False | True | 1 | +| `property.listing.set_protected` | 修改房源保护设置 | boolean | `false` | 是否可修改房源的保护期/保护房设置 | True | False | True | 1 | +| `property.listing.view_protected` | 查看保护期内房源 | boolean | `false` | 是否可查看保护期内(我租/我售/已售/已租)房源 | True | False | True | 1 | +| `property.listing.change_keeper` | 修改相关方范围 | scope | `none` | 可修改哪个范围内房源的相关方:无/本人/本部/全部 | True | False | True | 1 | +| `property.listing.merge_duplicate` | 重复房源合并 | boolean | `false` | 是否可合并重复房源 | True | False | True | 1 | +| `property.listing.status_sold` | 修改为我售/我租状态 | boolean | `false` | 是否可修改房源为我售/我租状态 | True | False | True | 1 | +| `property.listing.grade_set_a` | 将房源等级设为A | boolean | `false` | 是否可将挂牌中房源等级设为A(急迫) | True | False | True | 1 | +| `property.listing.grade_set_e` | 将房源等级设为E | boolean | `false` | 是否可将房源等级设为E(暂不关注) | True | False | True | 1 | + +### 业主/联系人与号码 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.contact.view_phone` | 查看业主/联系人号码 | boolean | `false` | 是否可查看房源业主/联系人真实号码 | True | False | True | 1 | +| `property.contact.view_phone_limit` | 每日查看号码次数上限 | integer | `0` | 每天可查看房源真实号码次数,0=不允许,-1=不限制 | True | False | True | 1 | +| `property.contact.add_contact` | 新增业主/联系人 | boolean | `false` | 是否可新增业主/联系人 | True | False | True | 1 | +| `property.contact.edit_core` | 修改业主核心信息 | scope | `none` | 可修改哪个范围的业主核心信息(电话/微信):无/本人/本部/全部 | True | False | True | 1 | +| `property.contact.edit_basic` | 修改业主非核心信息 | scope | `self` | 可修改哪个范围的业主基本信息(姓名/备注):无/本人/本部/全部 | True | False | True | 1 | +| `property.contact.delete_contact` | 删除业主/联系人 | boolean | `false` | 是否可删除业主/联系人 | True | False | True | 1 | +| `property.contact.view_cert` | 查看产证信息 | boolean | `false` | 是否可查看房源详情页产证信息 | True | False | True | 1 | +| `property.contact.view_operation_log` | 查看业主联系人操作日志 | boolean | `false` | 是否可查看业主/联系人的新增、修改、删除等记录 | True | False | True | 1 | + +### 房源地址 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.address.view_detail` | 查看楼栋/单元/楼层/房号 | boolean | `false` | 是否可查看房源真实地址详情 | True | False | True | 1 | +| `property.address.view_limit` | 每日查看地址次数上限 | integer | `0` | 每天可查看房源真实地址总次数,0=不允许,-1=不限制 | True | False | True | 1 | +| `property.address.edit` | 修改楼栋/单元/楼层/房号 | boolean | `false` | 是否可修改房源地址信息 | True | False | True | 1 | + +### 房源钥匙 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.key.create` | 新增钥匙 | boolean | `false` | 是否可新增钥匙 | True | False | True | 1 | +| `property.key.edit` | 修改钥匙 | scope | `none` | 按钥匙方范围可修改钥匙:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.return` | 退还钥匙 | scope | `none` | 按钥匙方范围控制是否可退还钥匙:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.view_password` | 查看钥匙密码 | scope | `none` | 按钥匙方范围控制是否可查看密码:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.view_number` | 查看钥匙编号 | scope | `none` | 按钥匙方范围控制是否可查看钥匙编号:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.borrow` | 钥匙借出 | scope | `none` | 按钥匙保管部门范围借出钥匙:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.give_back` | 钥匙归还 | scope | `none` | 按钥匙保管部门范围归还钥匙:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.delete` | 删除钥匙 | scope | `none` | 按钥匙方范围控制是否可删除钥匙:无/本人/本部/全部 | True | False | True | 1 | +| `property.key.export` | 钥匙列表数据导出 | boolean | `false` | 是否可导出钥匙数据 | True | False | True | 1 | + +### 房源实勘 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.survey.create_photo` | 新增实勘图片 | boolean | `false` | 是否可新增实勘图片 | True | False | True | 1 | +| `property.survey.download_photo` | 下载图片 | boolean | `false` | 是否可下载实勘图片 | True | False | True | 1 | +| `property.survey.delete_photo` | 删除图片 | scope | `none` | 按图片上传人范围删除:无/本人/本部/全部 | True | False | True | 1 | +| `property.survey.create` | 新增实勘 | boolean | `false` | 是否可新增实勘记录 | True | False | True | 1 | +| `property.survey.view` | 查看实勘 | boolean | `false` | 是否可查看实勘记录 | True | False | True | 1 | +| `property.survey.upload_video` | 上传视频 | boolean | `false` | 是否可上传房源视频 | True | False | True | 1 | +| `property.survey.download_video` | 下载视频 | boolean | `false` | 是否可下载房源视频 | True | False | True | 1 | +| `property.survey.play_video` | 播放视频 | boolean | `false` | 是否可播放房源视频 | True | False | True | 1 | + +### 房源委托 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.mandate.create` | 新增委托 | boolean | `false` | 是否可新增房源委托 | True | False | True | 1 | +| `property.mandate.renew` | 续签/违约委托 | scope | `none` | 按委托方范围可续签或违约委托:无/本人/本部/全部 | True | False | True | 1 | +| `property.mandate.view` | 委托列表查看 | scope | `none` | 按委托方范围查看委托列表:无/本人/本部/全部 | True | False | True | 1 | +| `property.mandate.revoke` | 委托作废 | scope | `none` | 按委托方范围控制是否可作废委托:无/本人/本部/全部 | True | False | True | 1 | +| `property.mandate.export` | 委托列表数据导出 | boolean | `false` | 是否可导出委托列表数据 | True | False | True | 1 | + +### 房源跟进 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.follow.view_scope` | 查看房源跟进范围 | scope | `self` | 控制房源详情页的跟进查看范围:无/本人/本部/全部 | True | False | True | 1 | +| `property.follow.hide` | 隐藏/开放跟进 | scope | `none` | 按跟进人范围隐藏/开放跟进:无/本人/本部/全部 | True | False | True | 1 | +| `property.follow.view_hidden` | 查看隐藏跟进 | scope | `none` | 按跟进人范围查看被隐藏的跟进:无/本人/本部/全部 | True | False | True | 1 | +| `property.follow.pin` | 置顶/取消置顶跟进 | scope | `none` | 按跟进人范围置顶或取消置顶跟进:无/本人/本部/全部 | True | False | True | 1 | + +### 房源附件 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.attachment.create` | 新增附件 | boolean | `false` | 是否可新增房源附件 | True | False | True | 1 | +| `property.attachment.view` | 查看附件 | scope | `none` | 按附件上传人范围查看:无/本人/本部/全部 | True | False | True | 1 | +| `property.attachment.edit` | 修改附件 | scope | `none` | 按附件上传人范围修改:无/本人/本部/全部 | True | False | True | 1 | +| `property.attachment.download` | 下载附件 | boolean | `false` | 是否可下载房源附件 | True | False | True | 1 | +| `property.attachment.delete` | 删除附件 | scope | `none` | 按附件上传人范围删除:无/本人/本部/全部 | True | False | True | 1 | + +### 房源带看 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `property.showing.view_scope` | 查看房源带看数据 | scope | `none` | 按数据权限范围查看房源带看记录:无/本人/本部/全部 | True | False | True | 1 | + +--- + +## 客源模块(36 条) + +### 私客 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.private.create` | 新增私客 | boolean | `false` | 是否可新增私客 | True | False | True | 1 | +| `client.private.view` | 查看私客(非保护客) | scope | `self` | 按归属人范围查看非保护私客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.view_protected` | 查看私客(保护客) | scope | `self` | 按归属人范围查看保护私客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.edit` | 编辑私客(非保护客) | scope | `self` | 按归属人范围编辑非保护私客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.edit_protected` | 编辑私客(保护客) | scope | `self` | 按归属人范围编辑保护私客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.set_protected` | 设置/取消保护客 | scope | `self` | 设置/取消哪个范围的保护客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.to_public` | 私客转公客 | scope | `self` | 按归属人范围将私客转为公客:无/本人/本部/全部 | True | False | True | 1 | +| `client.private.export` | 私客列表导出 | boolean | `false` | 是否支持导出私客列表 | True | False | True | 1 | + +### 公客 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.public.view` | 公客查看范围 | scope | `none` | 控制公客查看范围:无/本部/全部 | True | False | True | 1 | +| `client.public.to_private` | 公客转私客 | boolean | `false` | 是否可将可见范围内的公客转为私客 | True | False | True | 1 | +| `client.public.edit` | 编辑公客 | boolean | `false` | 是否可编辑公客信息 | True | False | True | 1 | +| `client.public.change_status` | 改公客状态 | boolean | `false` | 是否可修改公客状态 | True | False | True | 1 | + +### 成交客 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.deal.view` | 查看成交客(私客类型) | scope | `self` | 按归属人范围查看归属人为个人的成交客:无/本人/本部/全部 | True | False | True | 1 | +| `client.deal.view_public` | 查看成交客(公客类型) | scope | `none` | 按归属人范围查看归属人为共享账号的成交客:无/本人/本部/全部 | True | False | True | 1 | +| `client.deal.re_transaction` | 成交客再次租/购 | boolean | `false` | 是否可对可见范围内成交客操作再次租/购 | True | False | True | 1 | +| `client.deal.export` | 导出成交客列表 | boolean | `false` | 是否可导出成交客列表 | True | False | True | 1 | + +### 联系人号码 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.contact.view_phone_private` | 查看私客/成交客号码 | scope | `none` | 控制查看非保护私客及成交客的号码范围:无/本人/本部/全部 | True | False | True | 1 | +| `client.contact.view_phone_protected` | 查看保护客号码 | scope | `none` | 控制查看保护私客的号码范围:无/本人/本部/全部 | True | False | True | 1 | +| `client.contact.view_phone_public` | 查看公客号码 | scope | `none` | 控制查看公客号码范围:无/本部/全部 | True | False | True | 1 | +| `client.contact.view_phone_limit` | 每日查看联系人号码次数上限 | integer | `0` | 每天可查看客源联系人真实号码次数,0=不允许,-1=不限制 | True | False | True | 1 | +| `client.contact.edit_contact` | 编辑私客/成交客联系人 | scope | `none` | 控制编辑非保护私客及成交客联系人信息范围:无/本人/本部/全部 | True | False | True | 1 | +| `client.contact.edit_phone` | 编辑私客/成交客联系人号码 | scope | `none` | 控制编辑非保护私客及成交客联系人号码范围:无/本人/本部/全部 | True | False | True | 1 | + +### 客源管理 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.mgmt.delete` | 删除客源 | boolean | `false` | 是否可删除客源及查看已删除客源 | True | False | True | 1 | +| `client.mgmt.to_deal` | 手动客源转为成交客 | boolean | `false` | 是否可手动将客源标记为成交客 | True | False | True | 1 | +| `client.mgmt.change_staff` | 单个客源修改相关员工 | scope | `none` | 可修改哪个范围内客源的相关方:无/本人/本部/全部 | True | False | True | 1 | +| `client.mgmt.batch_change_staff` | 批量客源修改相关员工 | scope | `none` | 批量修改哪个范围内客源的相关方:无/本人/本部/全部 | True | False | True | 1 | +| `client.mgmt.view_operation_log` | 查看客户/联系人操作日志 | boolean | `false` | 是否可查看客户详情页手机号修改/删除、客户合并等记录 | True | False | True | 1 | +| `client.mgmt.merge_private` | 允许合并自己的私客 | boolean | `false` | 是否可合并归属人为本人的私客 | True | False | True | 1 | + +### 带看/预约 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.showing.create` | 带看/预约新增 | boolean | `false` | 是否可新增带看/预约记录 | True | False | True | 1 | +| `client.showing.view` | 私客/成交客详情页带看单查看 | scope | `self` | 按带看人范围查看私客/成交客的带看单:无/本人/本部/全部 | True | False | True | 1 | +| `client.showing.edit` | 带看/预约编辑、作废 | scope | `self` | 按带看人范围编辑或作废带看:无/本人/本部/全部 | True | False | True | 1 | + +### 资料客 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `client.archive.view` | 查看资料客 | scope | `self` | 按归属人范围查看资料客:无/本人/本部/全部 | True | False | True | 1 | +| `client.archive.import` | 导入资料客 | boolean | `false` | 是否可导入资料客 | True | False | True | 1 | +| `client.archive.view_phone` | 查看资料客号码 | boolean | `false` | 是否可查看资料客号码 | True | False | True | 1 | +| `client.archive.delete` | 删除资料客 | boolean | `false` | 是否可删除资料客 | True | False | True | 1 | +| `client.archive.view_log` | 查看资料客操作日志 | scope | `self` | 查看哪个范围员工的资料客操作日志:无/本人/本部/全部 | True | False | True | 1 | + +--- + +## 首页模块(4 条) + +### 首页看板 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `home.dashboard.view_version` | 查看首页版本 | boolean | `false` | 控制员工可查看的首页数据版本(置业顾问/店管/区管等) | True | False | True | 1 | +| `home.dashboard.personal_rank` | 个人排行榜权限 | scope | `self` | 控制个人排行榜可见数据范围:无/本人/本部/全部 | True | False | True | 1 | +| `home.dashboard.dept_rank` | 部门排行榜权限 | scope | `none` | 控制部门排行榜可见数据范围:无/本人/本部/全部 | True | False | True | 1 | +| `home.dashboard.manage_praise` | 管理点赞信息和屏蔽点赞 | boolean | `false` | 是否可删除首页点赞墙内容和禁止员工发布 | True | False | True | 1 | + +--- + +## 楼盘/小区模块(27 条) + +### 楼盘管理 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| -------------------------------------- | ------------ | ---------- | ------------- | ---------------------------- | --- | --- | --- | --- | +| `complex.view` | 楼盘管理查看 | boolean | `false` | 是否显示楼盘管理模块 | True | False | True | 1 | +| `complex.view_structure` | 楼盘结构查看 | boolean | `false` | 是否可查看楼栋-单元-房号层级结构 | True | False | True | 1 | +| `complex.create` | 新增楼盘 | boolean | `false` | 是否可新增或批量新增楼盘 | True | False | True | 1 | +| `complex.create_unit` | 新增楼栋/单元/房号 | boolean | `false` | 是否可新增楼栋、单元、房号数据 | True | False | True | 1 | +| `complex.edit` | 编辑楼盘 | boolean | `false` | 是否可编辑楼盘信息 | True | False | True | 1 | +| `complex.edit_unit` | 编辑楼栋/单元/房号 | boolean | `false` | 是否可编辑楼栋、单元、房号信息 | True | False | True | 1 | +| `complex.delete` | 删除楼盘 | boolean | `false` | 是否可删除楼盘 | True | False | True | 1 | +| `complex.delete_unit` | 删除楼栋/单元/房号 | boolean | `false` | 是否可删除楼栋、单元、房号 | True | False | True | 1 | +| `complex.delete_with_property` | 删除楼盘数据(含房源) | boolean | `false` | 是否可无视房源直接删除楼盘及以下所有数据 | True | False | True | 1 | +| `complex.merge` | 合并楼盘 | boolean | `false` | 是否可合并不同层级楼盘数据 | True | False | True | 1 | +| `complex.move_unit` | 移动楼栋/单元/房号数据 | boolean | `false` | 是否可将楼栋单元数据移动至其他楼盘 | True | False | True | 1 | +| `complex.lock` | 锁定/解锁楼盘 | boolean | `false` | 是否可操作锁定或解锁楼盘 | True | False | True | 1 | +| `complex.view_deal` | 楼盘挂牌成交数据 | boolean | `false` | 是否显示楼盘挂牌及成交数据 | True | False | True | 1 | +| `complex.view_deal_detail` | 司内成交明细及套数 | boolean | `false` | 是否显示公司成交房源明细信息及套数 | True | False | True | 1 | +| `complex.view_address_scope` | 楼街房源地址数据查看范围 | scope | `self` | 控制查看部门内其他员工楼街房源地址数据:本人/本部/全部 | True | False | True | 1 | +| `complex.region_manage` | 区域管理 | boolean | `false` | 是否可对区域商圈进行新增、合并、关联操作 | True | False | True | 1 | + +### 楼盘资料 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `complex.material.view_photo` | 楼盘照片 | boolean | `false` | 是否显示楼盘照片列表 | True | False | True | 1 | +| `complex.material.manage_photo` | 管理照片 | boolean | `false` | 是否可上传照片、设为封面 | True | False | True | 1 | +| `complex.material.delete_photo` | 删除照片 | boolean | `false` | 是否可删除楼盘照片 | True | False | True | 1 | +| `complex.material.download_photo` | 下载照片 | boolean | `false` | 是否可下载楼盘照片 | True | False | True | 1 | +| `complex.material.view_attachment` | 楼盘附件 | boolean | `false` | 是否显示楼盘附件模块 | True | False | True | 1 | +| `complex.material.manage_attachment` | 管理附件 | boolean | `false` | 是否可上传楼盘附件 | True | False | True | 1 | +| `complex.material.download_attachment` | 下载附件 | boolean | `false` | 是否可下载楼盘附件 | True | False | True | 1 | +| `complex.material.delete_attachment` | 删除附件 | boolean | `false` | 是否可删除楼盘附件 | True | False | True | 1 | +| `complex.material.view_surrounding` | 周边配套 | boolean | `false` | 是否显示周边配套模块 | True | False | True | 1 | + +### 楼盘反馈 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `complex.feedback.view` | 楼盘反馈列表 | scope | `self` | 可查看小区反馈列表的数据范围:本人/本部/全部 | True | False | True | 1 | +| `complex.feedback.handle` | 楼盘反馈处理 | boolean | `false` | 是否可处理或不予处理楼盘反馈 | True | False | True | 1 | + +--- + +## 组织人事-组织模块(21 条) + +### 组织管理 + +| permission_code | display_name | value_type | default_value | description | is_active | is_deprecated | is_system | version | +| --------------------------------- | ------------- | ---------- | ------------- | ----------------------------- | --- | --- | --- | --- | +| `org.view_structure` | 组织结构查看 | scope | `self` | 控制组织结构页面的部门/员工查看范围:无/本人/本部/全部 | True | False | True | 1 | +| `org.view_dept` | 部门查看 | boolean | `false` | 是否可查看部门信息 | True | False | True | 1 | +| `org.edit_dept` | 部门维护 | boolean | `false` | 是否可对部门进行编辑操作 | True | False | True | 1 | +| `org.view_staff` | 员工查看 | boolean | `false` | 是否可查看员工详情 | True | False | True | 1 | +| `org.edit_staff` | 员工维护 | boolean | `false` | 是否可进行员工异动、批量设置员工上级等操作 | True | False | True | 1 | +| `org.edit_staff_detail` | 员工详情编辑 | boolean | `false` | 是否可编辑员工信息、新增奖惩记录、编辑账号信息 | True | False | True | 1 | +| `org.freeze_account` | 员工账号冻结/解冻 | boolean | `false` | 是否可冻结/解冻员工账号 | True | False | True | 1 | +| `org.import_staff` | 批量导入员工 | boolean | `false` | 是否可批量导入员工 | True | False | True | 1 | +| `org.export_staff` | 导出员工 | boolean | `false` | 是否可导出员工数据 | True | False | True | 1 | +| `org.view_permission` | 员工权限查看 | boolean | `false` | 是否可查看员工权限配置 | True | False | True | 1 | +| `org.edit_permission` | 员工权限设置 | boolean | `false` | 是否可编辑员工权限 | True | False | True | 1 | +| `org.export_permission` | 权限管理页面导出 | boolean | `false` | 是否可在权限管理页面导出员工角色及管理范围数据 | True | False | True | 1 | +| `org.edit_position` | 职务维护 | boolean | `false` | 是否可新增/编辑/删除/合并员工职务 | True | False | True | 1 | +| `org.edit_role` | 角色维护 | boolean | `false` | 是否可展示角色管理页面并进行角色编辑 | True | False | True | 1 | +| `org.view_store_list` | 门店列表查看 | boolean | `false` | 是否可查看门店列表 | True | False | True | 1 | +| `org.export_store_list` | 门店列表导出 | boolean | `false` | 是否可导出门店列表 | True | False | True | 1 | +| `org.view_contact_book` | 员工通讯录查看 | scope | `self` | 控制查看员工通讯录的范围:无/本人/本部/全部 | True | False | True | 1 | +| `org.transfer_business` | 转移业务归属 | scope | `none` | 控制转出/转入人的可选范围:无/本人/本部/全部 | True | False | True | 1 | +| `org.resign_apply` | 离职申请范围 | scope | `self` | 控制员工离职申请范围:无/本人/本部/全部 | True | False | True | 1 | +| `org.invite_onboard` | 入职邀请 | boolean | `false` | 是否可生成入职邀请链接/二维码 | True | False | True | 1 | +| `org.view_contact_phone_limit` | 每日查看通讯录电话次数上限 | integer | `0` | 每天可查看员工通讯录电话次数,0=不允许,-1=不限制 | True | False | True | 1 | + +--- + +## 汇总 + +| 模块 | 条数 | +| -------------- | ------- | --- | --- | --- | --- | +| property(房源) | 66 | +| client(客源) | 36 | +| home(首页) | 4 | +| complex(楼盘/小区) | 27 | +| org(组织人事-组织) | 21 | +| **合计** | **154** | + +--- + +## 公共元数据(所有记录相同) + +| 字段 | 值 | +| --------------- | ---------------------------------------------------- | +| `is_active` | `True` | +| `is_deprecated` | `False` | +| `is_system` | `True` | +| `version` | `1` | +| `schema` | `public`(SHARED_APPS,migration 在 public schema 运行一次) | + +--- + +## Migration 分批策略 + +| 批次 | Migration 文件名 | 涵盖模块 | 条数 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 1 | `0002_seed_permission_property.py` | property | 66 | +| 2 | `0003_seed_permission_client.py` | client | 36 | +| 3 | `0004_seed_permission_home_complex_hr.py` | home + complex + hr | 52 | + +> 每个 migration 包含 `forwards` 和 `backwards` 函数,`backwards` 按 code 批量删除,保证可回滚。 + +--- + +## 内置角色 role_permissions 分配(最大权限角色) + +**策略**:内置「最大权限角色」对以上全部 154 条 PermissionDef 设置最大开放值: +- `boolean` 类型 → `true` +- `scope` 类型 → `all`(全部) +- `integer` 类型 → `-1`(不限制) + +其余 2 个内置角色(高级业务员 / 分行经理)不预置 role_permissions,由租户管理员自行配置。 + +--- + +## 系统管理模块说明(本批不纳入) + +系统管理(Admin Console)面向 Platform Super Admin / Ops Operator,这两个角色在 `public` schema 使用独立认证体系,不走租户 RBAC。 +访问控制在 view 层直接用 Django `is_staff` / `is_superuser` 或平台角色装饰器控制,无需 PermissionDef 记录。 +如后续 Platform Admin 角色扩展到 3 个以上且需要功能细分,再单独追加一版 migration。 \ No newline at end of file diff --git a/Project/fonrey/PRD/权限管理/权限管理模块PRD.md b/Project/fonrey/PRD/权限管理/权限管理模块PRD.md index b0140d83..8dadd164 100644 --- a/Project/fonrey/PRD/权限管理/权限管理模块PRD.md +++ b/Project/fonrey/PRD/权限管理/权限管理模块PRD.md @@ -467,15 +467,19 @@ Fonrey 采用 **RBAC(基于角色的访问控制)+ 个人权限叠加** 的 | 创建时间 | 角色创建时间 | | 修改时间 | 最后一次权限修改时间 | -#### 5.5.2 已知系统内置角色(来自截图) +#### 5.5.2 已知系统内置角色 -| 角色名称 | 角色类别 | 适用场景 | -|----------|----------|----------| -| 刘文龙 | 置业顾问 | 高级业务员 | -| 最大权限角色 | 总经 | 系统管理员/超管角色 | -| 行政人员 | 置业顾问 | 行政人员 | -| 分行经理 | 店管 | 分行级别管理职务 | -| 高级业务员 | 置业顾问 | 标准销售顾问 | +以下角色为系统内置角色,**用户可新增角色,但这些角色不可删除**。 + +| 角色名称 | +| ---- | +| 置业顾问 | +| 店管 | +| 区管 | +| 区总 | +| 副总 | +| 总经 | +| 其他职能 | #### 5.5.3 角色类别说明 @@ -585,7 +589,9 @@ Fonrey 采用 **RBAC(基于角色的访问控制)+ 个人权限叠加** 的 │ ├── 挂牌分析 │ └── 房源广场 ├── 新房 +│ ├── 新房 ├── 客源 +│ ├── 客源 ├── 交易 │ ├── 交易管理 │ ├── 二手房售后管理 @@ -614,6 +620,7 @@ Fonrey 采用 **RBAC(基于角色的访问控制)+ 个人权限叠加** 的 │ ├── 业务工具 │ └── 安装与登录授权 ├── 移动端 +│ ├── 移动端 ├── 智能门店 │ ├── 智慧大屏 │ └── VR 换装 diff --git a/Project/fonrey/PRD/权限管理/组织人事-组织.md b/Project/fonrey/PRD/权限管理/组织人事-组织.md new file mode 100644 index 00000000..9e0161c2 --- /dev/null +++ b/Project/fonrey/PRD/权限管理/组织人事-组织.md @@ -0,0 +1,32 @@ + + +| 管理权限 | 🔴(开启) | 说明 | +| ---------------- | ---------- | --------------------------------------------------------------------------------------------------- | +| 组织结构查看 | 无/本人/本部/全部 | 控制组织结构页面的部门/员工查看范围 | +| 部门查看 | true/false | 控制是否可以查看部门信息 | +| 部门维护 | true/false | 控制是否可以对部门进行编辑操作 | +| 员工查看 | true/false | 控制是否可以查看员工详情 | +| 员工维护 | true/false | 控制是否可以查看员工详情、进行员工异动、批量设置员工上级 | +| 员工详情编辑 | true/false | 控制是否能编辑员工信息、新增奖惩记录、编辑账号信息、上传员工相关资料、复职员工,该权限控制的功能点需要与「员工查看和维护」权限共同开启才能正常使用 | +| 员工账号冻结/解冻 | true/false | 控制是否可以冻结/解冻员工账号 | +| 批量导入员工 | true/false | 控制是否可以批量导入员工 | +| 导出员工 | true/false | 控制是否可以导出员工 | +| 员工权限查看 | true/false | | +| 员工权限设置 | true/false | 控制是否能够编辑员工权限 | +| 权限管理页面导出 | true/false | 开启后可在权限管理页面导出员工角色及管理范围数据 | +| 营销号绑定 | true/false | | +| 职务维护 | true/false | 控制是否能够新增/编辑/删除/合并员工职务 | +| 角色维护 | true/false | 控制是否展示角色管理页面 | +| 门店列表查看 | true/false | 若启用,则可查看门店列表 | +| 门店列表导出 | true/false | 若启用,则可导出门店列表 | +| 门店分布图查看 | true/false | 若启用,则可查看门店分布图列表 | +| 员工通讯录查看 | 无/本人/本部/全部 | 控制是否能够查看员工通讯录 | +| 员工通讯录电话查看 | 999 | 每天可查看员工通讯录电话查看次数,999=不限制,0=不允许 | +| 员工通讯录电话拨打 | 999 | 每天可通过巧房小号拨打员工号码次数,999=不限制,0=不允许 | +| 转移业务归属功能 | 无/本人/本部/全部 | 控制转出/转入人的可选范围 | +| 清空非有效门店的钥匙委托实勘资源 | true/false | 若开启,则可操作清空所有非有效门店下员工的钥匙委托实勘资源(无需在权限里配置扩充部门权限/加盟架构,所有状态符合的门店均可操作,请谨慎开启)。请注意,此权限需「转移业主归属功能」为本部或全部,才生效 | +| 绑定短信/绑定链接 | true/false | 控制员工是否能进行下发绑定短信/绑定链接操作 | +| 人工通过身份验证 | true/false | 协助员工完成PC/APP的登录实名校验。 | +| 离职申请范围 | 无/本人/本部/全部 | 控制员工离职申请范围 | +| 入职邀请 | true/false | 控制员工是否可以生成入职邀请链接/二维码 | +| 员工入职黑名单 | true/false | | diff --git a/Project/fonrey/PRD/权限管理/角色权限矩阵.md b/Project/fonrey/PRD/权限管理/角色权限矩阵.md new file mode 100644 index 00000000..8a4bcfb1 --- /dev/null +++ b/Project/fonrey/PRD/权限管理/角色权限矩阵.md @@ -0,0 +1,344 @@ +# 角色权限矩阵 — Fonrey MVP + +**版本**: v1.0 +**更新**: 2026-04-30 +**依据**: `PERMISSION_SEED_MVP_BATCH1.md`(154 条)× 7 个系统内置角色 +**状态**: Draft — 待产品 / 业务确认 + +--- + +## 角色说明 + +| 角色 | 定位 | 典型层级 | +| -------- | ---------------------------- | ------------------ | +| 置业顾问 | 一线销售,操作个人名下数据 | 门店员工 | +| 店管 | 门店管理,可查看本店数据 | 门店负责人 | +| 区管 | 区域管理,可查看本区数据 | 区域负责人 | +| 区总 | 区域总负责,更广的操作权限 | 大区总监 | +| 副总 | 公司副总,全公司数据可见 | 副总经理 | +| 总经 | 最高管理层,全量权限 | 总经理 / 超管角色 | +| 其他职能 | 行政、HR 等非业务岗,受限访问 | 职能部门人员 | + +--- + +## 取值说明 + +| 类型 | 可选值 | 含义 | +| ------- | ---------------- | ----------------------------------- | +| boolean | `✓` / `✗` | 开启 / 关闭 | +| scope | `—` / `本人` / `本部` / `全部` | 无权限 / 本人 / 本部门及以下 / 全公司 | +| integer | `0` / 数字 / `∞` | 不允许 / 上限次数 / 不限制 | + +> **scope 继承原则**:「本部」= 本门店及所辖组;「全部」= 全公司。 +> 区管/区总的「本部」含义对应其管辖的门店范围,不限于单一门店。 + +--- + +## 一、房源模块(property) + +### 1.1 房源基础(property.listing) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增房源 | `property.listing.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 维护房源查看范围 | `property.listing.view_scope` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 公盘查看 | `property.listing.view_public` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 私盘查看 | `property.listing.view_private` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源改为公盘 | `property.listing.set_public` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源改为私盘 | `property.listing.set_private` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源改为封盘 | `property.listing.set_locked` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源改为特盘 | `property.listing.set_special` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除房源 | `property.listing.delete` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 恢复已删除房源 | `property.listing.restore` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 房源列表数据导出 | `property.listing.export` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 修改房屋介绍信息 | `property.listing.edit_description` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 成交房源列表及价格信息 | `property.listing.view_deal` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 价格解读 | `property.listing.price_read` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看房源挂牌历史 | `property.listing.view_history` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看同业主其他房源 | `property.listing.view_owner_others` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 修改房源保护设置 | `property.listing.set_protected` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看保护期内房源 | `property.listing.view_protected` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 修改相关方范围 | `property.listing.change_keeper` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 重复房源合并 | `property.listing.merge_duplicate` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 修改为我售/我租状态 | `property.listing.status_sold` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源等级设为A | `property.listing.grade_set_a` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 将房源等级设为E | `property.listing.grade_set_e` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 1.2 业主/联系人与号码(property.contact) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看业主/联系人号码 | `property.contact.view_phone` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 每日查看号码次数上限 | `property.contact.view_phone_limit` | 20 | ∞ | ∞ | ∞ | ∞ | ∞ | 0 | +| 新增业主/联系人 | `property.contact.add_contact` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 修改业主核心信息 | `property.contact.edit_core` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 修改业主非核心信息 | `property.contact.edit_basic` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 删除业主/联系人 | `property.contact.delete_contact` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看产证信息 | `property.contact.view_cert` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看业主联系人操作日志 | `property.contact.view_operation_log` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 1.3 房源地址(property.address) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看楼栋/单元/楼层/房号 | `property.address.view_detail` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 每日查看地址次数上限 | `property.address.view_limit` | 10 | ∞ | ∞ | ∞ | ∞ | ∞ | 0 | +| 修改楼栋/单元/楼层/房号 | `property.address.edit` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +### 1.4 房源钥匙(property.key) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增钥匙 | `property.key.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 修改钥匙 | `property.key.edit` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 退还钥匙 | `property.key.return` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看钥匙密码 | `property.key.view_password` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看钥匙编号 | `property.key.view_number` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 钥匙借出 | `property.key.borrow` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 钥匙归还 | `property.key.give_back` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 删除钥匙 | `property.key.delete` | — | 本人 | 本部 | 全部 | 全部 | 全部 | — | +| 钥匙列表数据导出 | `property.key.export` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 1.5 房源实勘(property.survey) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增实勘图片 | `property.survey.create_photo` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 下载图片 | `property.survey.download_photo` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除图片 | `property.survey.delete_photo` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 新增实勘 | `property.survey.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看实勘 | `property.survey.view` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 上传视频 | `property.survey.upload_video` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 下载视频 | `property.survey.download_video` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 播放视频 | `property.survey.play_video` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 1.6 房源委托(property.mandate) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增委托 | `property.mandate.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 续签/违约委托 | `property.mandate.renew` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 委托列表查看 | `property.mandate.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 委托作废 | `property.mandate.revoke` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 委托列表数据导出 | `property.mandate.export` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 1.7 房源跟进(property.follow) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看房源跟进范围 | `property.follow.view_scope` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 隐藏/开放跟进 | `property.follow.hide` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看隐藏跟进 | `property.follow.view_hidden` | — | 本人 | 本部 | 全部 | 全部 | 全部 | — | +| 置顶/取消置顶跟进 | `property.follow.pin` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +### 1.8 房源附件(property.attachment) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增附件 | `property.attachment.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看附件 | `property.attachment.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 修改附件 | `property.attachment.edit` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 下载附件 | `property.attachment.download` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除附件 | `property.attachment.delete` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +### 1.9 房源带看(property.showing) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看房源带看数据 | `property.showing.view_scope` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +--- + +## 二、客源模块(client) + +### 2.1 私客(client.private) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 新增私客 | `client.private.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看私客(非保护客) | `client.private.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看私客(保护客) | `client.private.view_protected` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 编辑私客(非保护客) | `client.private.edit` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 编辑私客(保护客) | `client.private.edit_protected` | 本人 | 本人 | 本部 | 全部 | 全部 | 全部 | — | +| 设置/取消保护客 | `client.private.set_protected` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 私客转公客 | `client.private.to_public` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 私客列表导出 | `client.private.export` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 2.2 公客(client.public) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 公客查看范围 | `client.public.view` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 公客转私客 | `client.public.to_private` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 编辑公客 | `client.public.edit` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 改公客状态 | `client.public.change_status` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 2.3 成交客(client.deal) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看成交客(私客类型) | `client.deal.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看成交客(公客类型) | `client.deal.view_public` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 成交客再次租/购 | `client.deal.re_transaction` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 导出成交客列表 | `client.deal.export` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 2.4 联系人号码(client.contact) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看私客/成交客号码 | `client.contact.view_phone_private` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看保护客号码 | `client.contact.view_phone_protected` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看公客号码 | `client.contact.view_phone_public` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 每日查看联系人号码次数上限 | `client.contact.view_phone_limit` | 20 | ∞ | ∞ | ∞ | ∞ | ∞ | 0 | +| 编辑私客/成交客联系人 | `client.contact.edit_contact` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 编辑私客/成交客联系人号码 | `client.contact.edit_phone` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +### 2.5 客源管理(client.mgmt) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 删除客源 | `client.mgmt.delete` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 手动客源转为成交客 | `client.mgmt.to_deal` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 单个客源修改相关员工 | `client.mgmt.change_staff` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 批量客源修改相关员工 | `client.mgmt.batch_change_staff` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 查看客户/联系人操作日志 | `client.mgmt.view_operation_log` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 允许合并自己的私客 | `client.mgmt.merge_private` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 2.6 带看/预约(client.showing) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 带看/预约新增 | `client.showing.create` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 私客/成交客详情页带看单查看 | `client.showing.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 带看/预约编辑、作废 | `client.showing.edit` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +### 2.7 资料客(client.archive) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看资料客 | `client.archive.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 导入资料客 | `client.archive.import` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看资料客号码 | `client.archive.view_phone` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除资料客 | `client.archive.delete` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 查看资料客操作日志 | `client.archive.view_log` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | + +--- + +## 三、首页模块(home) + +### 3.1 首页看板(home.dashboard) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 查看首页版本 | `home.dashboard.view_version` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 个人排行榜权限 | `home.dashboard.personal_rank` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 部门排行榜权限 | `home.dashboard.dept_rank` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 管理点赞信息和屏蔽点赞 | `home.dashboard.manage_praise` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +--- + +## 四、楼盘/小区模块(complex) + +### 4.1 楼盘管理(complex.*) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 楼盘管理查看 | `complex.view` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 楼盘结构查看 | `complex.view_structure` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 新增楼盘 | `complex.create` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 新增楼栋/单元/房号 | `complex.create_unit` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 编辑楼盘 | `complex.edit` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 编辑楼栋/单元/房号 | `complex.edit_unit` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除楼盘 | `complex.delete` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除楼栋/单元/房号 | `complex.delete_unit` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除楼盘数据(含房源) | `complex.delete_with_property` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 合并楼盘 | `complex.merge` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 移动楼栋/单元/房号数据 | `complex.move_unit` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 锁定/解锁楼盘 | `complex.lock` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 楼盘挂牌成交数据 | `complex.view_deal` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 司内成交明细及套数 | `complex.view_deal_detail` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 楼街房源地址数据查看范围 | `complex.view_address_scope` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 区域管理 | `complex.region_manage` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | + +### 4.2 楼盘资料(complex.material) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 楼盘照片 | `complex.material.view_photo` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 管理照片 | `complex.material.manage_photo` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 删除照片 | `complex.material.delete_photo` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 下载照片 | `complex.material.download_photo` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 楼盘附件 | `complex.material.view_attachment` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 管理附件 | `complex.material.manage_attachment` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 下载附件 | `complex.material.download_attachment` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| 删除附件 | `complex.material.delete_attachment` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 周边配套 | `complex.material.view_surrounding` | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | + +### 4.3 楼盘反馈(complex.feedback) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 楼盘反馈列表 | `complex.feedback.view` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 楼盘反馈处理 | `complex.feedback.handle` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | + +--- + +## 五、组织人事-组织模块(org) + +### 5.1 组织管理(org.*) + +| 权限项 | permission_code | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ------ | --------------- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| 组织结构查看 | `org.view_structure` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | 本人 | +| 部门查看 | `org.view_dept` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 部门维护 | `org.edit_dept` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工查看 | `org.view_staff` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工维护 | `org.edit_staff` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工详情编辑 | `org.edit_staff_detail` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工账号冻结/解冻 | `org.freeze_account` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 批量导入员工 | `org.import_staff` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 导出员工 | `org.export_staff` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工权限查看 | `org.view_permission` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 员工权限设置 | `org.edit_permission` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 权限管理页面导出 | `org.export_permission` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 职务维护 | `org.edit_position` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 角色维护 | `org.edit_role` | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | +| 门店列表查看 | `org.view_store_list` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 门店列表导出 | `org.export_store_list` | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 员工通讯录查看 | `org.view_contact_book` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | 本人 | +| 转移业务归属 | `org.transfer_business` | — | 本部 | 本部 | 全部 | 全部 | 全部 | — | +| 离职申请范围 | `org.resign_apply` | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | 本人 | +| 入职邀请 | `org.invite_onboard` | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | +| 每日查看通讯录电话次数上限 | `org.view_contact_phone_limit` | 5 | ∞ | ∞ | ∞ | ∞ | ∞ | 5 | + +--- + +## 六、横向对比:各角色权限宽度一览 + +> 快速识别各角色的整体权限层级,便于向业务方解释。 + +| 维度 | 置业顾问 | 店管 | 区管 | 区总 | 副总 | 总经 | 其他职能 | +| ---- | :------: | :--: | :--: | :--: | :--: | :--: | :------: | +| **数据范围(scope)** | 本人 | 本部 | 本部 | 全部 | 全部 | 全部 | 无/本人 | +| **房源操作** | 基础增查改 | + 删/改状态/导出 | 同店管 | + 跨区操作 | 同区总 | 全量 | 无 | +| **客源查看** | 个人私客 | 本店全量 | 本区全量 | 全公司 | 全公司 | 全公司 | 无 | +| **号码查看上限/日** | 20 次 | 不限 | 不限 | 不限 | 不限 | 不限 | 0 | +| **组织人事操作** | 无 | 查看/导出 | + 维护/冻结 | + 权限管理/角色 | 同区总 | 全量 | 无 | +| **楼盘管理** | 只读 | + 增改删(单元) | + 删楼盘/合并/区域 | + 删楼盘含房源 | 同区总 | 全量 | 只读 | + +--- + +## 七、Open Questions(待确认) + +| # | 问题 | 涉及权限 | 影响角色 | 当前保守默认 | 截止确认日期 | +| - | ---- | -------- | -------- | ------------ | ------------ | +| Q1 | 置业顾问是否可查看**公盘**?部分公司公盘仅店管以上可见 | `property.listing.view_public` | 置业顾问 | ✓(开放) | — | +| Q2 | 置业顾问**每日查看号码次数**(房源/客源),业务方确认上限值 | `property.contact.view_phone_limit` / `client.contact.view_phone_limit` | 置业顾问 | 20 次 | — | +| Q3 | 店管是否可**编辑保护客**(`edit_protected`)?设为「本人」还是「本部」 | `client.private.edit_protected` | 店管 | 本人(保守) | — | +| Q4 | **权限管理(`org.edit_permission`)** 是否从区总才开放,还是区管也可配置本店员工权限 | `org.view_permission` / `org.edit_permission` | 区管 | ✗(不开放) | — | +| Q5 | 其他职能是否需要访问**楼盘模块**(查看楼盘/楼盘资料)? | `complex.view` / `complex.material.*` | 其他职能 | ✓(只读) | — | +| Q6 | **副总与总经权限是否完全相同**?还是副总有哪些项目需要受限 | 全量 scope 类 | 副总 | 同总经 | — | + +--- + +*本矩阵基于 `PERMISSION_SEED_MVP_BATCH1.md` 154 条权限定义生成。确认后将同步更新 `PERMISSION_SEED_MVP_BATCH1.md` 内置角色 role_permissions 分配策略。* diff --git a/Project/fonrey/screenshots/权限管理/权限-客源-客源-table.png b/Project/fonrey/screenshots/权限管理/权限-客源-客源-table.png deleted file mode 100644 index 661513ff..00000000 Binary files a/Project/fonrey/screenshots/权限管理/权限-客源-客源-table.png and /dev/null differ diff --git a/Project/fonrey/实施报告/项目进度交接报告_Phase4.0_收尾.md b/Project/fonrey/实施报告/项目进度交接报告_Phase4.0_收尾.md index 1c9f872e..99a3b904 100644 --- a/Project/fonrey/实施报告/项目进度交接报告_Phase4.0_收尾.md +++ b/Project/fonrey/实施报告/项目进度交接报告_Phase4.0_收尾.md @@ -1,218 +1,225 @@ -# 项目进度交接报告 — Phase 4.0 收尾 +# 项目进度交接报告 — Phase 4.0 + 4.1 收尾 > **作者**: Backend Engineer -> **日期**: 2026-04-29 -> **状态**: 暂停,等待 PM 完成 DATA_MODEL 注释补全 -> **续接者**: 明天继续工作的自己 / 其他工程师 +> **创建日期**: 2026-04-29(Phase 4.0) +> **更新日期**: 2026-04-30(Phase 4.1 完成) +> **状态**: ✅ Phase 4.1 完成,等待业务开发启动 +> **续接者**: 进入正式开发的工程师 / 后续维护者 > **前序文档**: [`项目骨架搭建实施报告_v1.md`](./项目骨架搭建实施报告_v1.md) --- -## 一、今日完成事项 +## 0. TL;DR(最关键的 30 秒) -### 1.1 Phase 4.0:所有模型添加中文 Meta 名 +- **Phase 4.0 + 4.1 全部完成**:74 模型 Meta 中文名 + 781 字段 `verbose_name` + 关键字段 `help_text` 全部补齐 +- **9 app 全部独立 commit,每 commit `manage.py check` 0 issues** +- **`makemigrations` 未跑**(按用户指示保留生成权),但已 `--dry-run` 确认仅有 `Alter field` 元数据迁移待生成 +- **本地领先 origin/main 14 个 commit,未 push** +- **遗留**:Dockerfile + docker-compose.yml 有未跟踪的代理配置改动(`--proxy http://host.docker.internal:10808`)— 由用户手动处理,不要 `git add` + +--- + +## 一、已完成事项 + +### 1.1 Phase 4.0:所有模型添加中文 Meta 名(2026-04-29) **git commit**: `79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0)` -**变更范围**: -- 20 个 models 文件 -- 8 个 0002/0003 迁移文件(Meta options 变更) -- 1 个 tenant 0001_initial 迁移(之前漏生成) -- 共计 29 文件 / +594 行 +**变更范围**:20 models 文件 + 8 迁移文件 + 1 tenant initial 迁移;29 文件 / +594 行 -**具体内容**:为全部 74 个 Django 模型添加: +**具体内容**:为全部 74 个模型添加: ```python class Meta: verbose_name = "中文表名" verbose_name_plural = "中文表名" - # ... 已有的 db_table / indexes / constraints 保留 + # 已有 db_table / indexes / constraints 保留 ``` -**消费方**: -- Django Admin 列表页/表单页中文显示 -- drf-spectacular 生成 OpenAPI 时映射为 `tag` / 模型名 -- Django shell 报错信息使用中文 - -**验证**:`manage.py check` 0 issues。 - -### 1.2 PM 规范文档交付 - -**文件**: `/mnt/d/Workspace/nexus/Project/fonrey/规范/DATA_MODEL_注释补全规范_v1.md`(443 行,12 章) - -**核心内容**: -- §四 技术元数据字段标准注释库(id / created_at / deleted_at / version 等的统一中文注释) -- §五 业务字段三段式格式(中文名 + 示例 + 业务规则) -- §六 枚举字段中英对照规范 -- §七 外键字段说明规范 -- §九 PM 待办清单(8 个 DATA_MODEL_*.md 文件、当前覆盖率、补全优先级) -- §十一 完整规范表的范例(properties 表) - -**PM 工作量估算**:1-2 天 - -**关键决策(澄清)**: -- 之前误判 REGION/TENANT/RELEASE/ACCOUNT 缺独立文件 — **实际上没缺**: - - REGION(districts 表)已在 `DATA_MODEL_COMPLEX.md §3.1` - - ACCOUNT 已在 `DATA_MODEL_LOGIN.md §3.1` - - TENANT/RELEASE 已在 `DATA_MODEL_PUBLIC.md`(合并版) -- DATA_MODEL 现状业务字段覆盖率 ~70%,缺口集中在**技术元数据字段** - -### 1.3 工作流决策(重要,避免明天踩坑) - -- **方案 A 被否决**:模型类中文 docstring 因 hook 反复触发被放弃 -- **方案 B 采纳**:只用 `Meta.verbose_name` + `verbose_name_plural`(字符串赋值,不触发 hook) -- 模型类的"业务作用 / 关键业务规则"**改放在 DATA_MODEL_*.md 里**作为单一信息源,代码不重复 -- Phase 4.1 的字段级 `verbose_name=` 和 `help_text=` 也是字符串赋值,预计同样不触发 hook +**消费方**:Django Admin 列表/表单中文显示、drf-spectacular OpenAPI tag、shell 报错中文。 --- -## 二、当前注释覆盖率(基线 vs 现在) +### 1.2 Phase 4.1:所有字段补齐中文 verbose_name + help_text(2026-04-30) -| 维度 | 基线(任务前) | 今日完成后 | Phase 4.1 目标 | +**核心规则**: +- 仅使用字段 kwarg(`verbose_name="..."` / `help_text="..."`)— 字符串赋值,hook 不拦截 +- **不**新增模型 docstring / 行注释 — 业务说明留在 `DATA_MODEL_*.md` 里作为单一信息源 +- 关键字段加 `help_text`(业务规则、ENUM 中英对照、写入约束);纯技术字段(`created_at` 等)只加 `verbose_name` +- **每 app 一个独立 commit**,commit 后 `manage.py check` 必须 0 issues +- 不动 Meta(Phase 4.0 已完成)、不改字段类型/null/default、不增删字段 + +**9 个 commit 序列(领先 origin/main,未 push)**: + +| # | App | Commit | 文件数 | 备注 | +|---|---|---|---|---| +| 1/9 | property | `3638fc0` | 4 (core/follow_keys/listings/media) | 23 模型,含 PROPERTY 主表 + 分区 follow_logs/photos | +| 2/9 | client | `e67b07a` | 5 (core/contacts/folders/follow/viewing_match) | 11 模型,含分区 client_follow_logs | +| 3/9 | complex | `a3800bf` | 1 (complex.py) | 10 模型,含全文检索 search_vector | +| 4/9 | org | `f185127` | 3 (org_unit/staff/staff_logs) | 11 模型 | +| 5/9 | account | `b57070f` | 1 (account.py) | 4 模型(UserAccount/LoginAttempt/PasswordResetToken/PasswordHistory)| +| 6/9 | permission | `9ef6eb6` | 3 (permission_def/role/staff_perm) | 8 模型,含 PermissionChangeLog(append-only)| +| 7/9 | setting | `289ec43` | 2 (lookup/setting) | 4 模型(LookupGroup/Item, TenantSetting, FieldRequirementRule)| +| 8/9 | region | `e3b26ce` | 1 (region.py) | 5 模型(District/BusinessArea/MetroLine/Station/School)| +| 9/9 | tenant | `8faa68b` | 1 (models.py) | 2 模型(Tenant/Domain),django-tenants Mixin | + +**注**:`apps/release/models/` 目录无内容文件,跳过;其内容在 `DATA_MODEL_PUBLIC.md §2.6 client_releases` 但当前未实例化为 Django 模型。 + +--- + +### 1.3 工作流决策(明确,避免后续踩坑) + +- **方案 A 否决**:模型类中文 docstring 因 hook 反复阻拦 +- **方案 B 采纳**:仅用 `Meta.verbose_name` + 字段级 `verbose_name=` / `help_text=`,纯字符串 kwarg,hook 放行 +- 模型类的"业务作用 / 关键业务规则"放在 `DATA_MODEL_*.md` 作为单一信息源,代码不重复 +- ENUM 字段 `help_text` 走中英对照(如 `"public=公立 / private=私立 / international=国际学校"`) +- 已存在的 docstring 保留(property/follow_keys.py FollowLog、property/media.py PropertyPhoto、client/follow.py ClientFollowLog、client/viewing_match.py ClientStatusLog 的 "Partitioned table…unmanaged" / "Audit log; record-level immutable" 等技术说明) + +--- + +## 二、当前注释覆盖率(最终态) + +| 维度 | 基线 | Phase 4.0 后 | Phase 4.1 后(当前) | |---|---|---|---| -| `Meta.verbose_name`(模型中文名) | 0 / 74 | **74 / 74** ✅ | — | -| `verbose_name_plural` | 0 / 74 | **74 / 74** ✅ | — | -| 字段 `verbose_name=`(字段中文名) | 0 / 781 | 0 / 781 | 781 / 781 | -| 字段 `help_text=`(字段详细说明) | 14 / 781 | 14 / 781 | ~230 / 781(关键字段) | -| 模型 docstring | 0 / 74 | 0 / 74 | **不做**(改放 DATA_MODEL) | +| `Meta.verbose_name` | 0/74 | **74/74** ✅ | **74/74** ✅ | +| `Meta.verbose_name_plural` | 0/74 | **74/74** ✅ | **74/74** ✅ | +| 字段 `verbose_name=` | 0/781 | 0/781 | **781/781** ✅ | +| 字段 `help_text=` | 14/781 | 14/781 | **关键字段全覆盖** ✅(FK + ENUM + 业务规则字段)| +| 模型 docstring | 0/74 | 0/74 | 0/74(按决策不做,业务语义在 DATA_MODEL_*.md)| --- ## 三、Git 状态快照 -### 3.1 本地 commits(领先 origin/main 5 个,未推送) +### 3.1 本地 commits(领先 origin/main **14 个**,未 push) ``` -79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0) ← 今日 +8faa68b feat(tenant): add Chinese verbose_name/help_text to tenant models (Phase 4.1 part 9/9) +e3b26ce feat(region): add Chinese verbose_name/help_text to region models (Phase 4.1 part 8/9) +289ec43 feat(setting): add Chinese verbose_name/help_text to setting models (Phase 4.1 part 7/9) +9ef6eb6 feat(permission): add Chinese verbose_name/help_text to permission models (Phase 4.1 part 6/9) +b57070f feat(account): add Chinese verbose_name and help_text to all account fields (Phase 4.1 part 5/9) +f185127 feat(org): add Chinese verbose_name and help_text to all org fields (Phase 4.1 part 4/9) +a3800bf feat(complex): add Chinese verbose_name and help_text to all complex fields (Phase 4.1 part 3/9) +e67b07a feat(client): add Chinese verbose_name and help_text to all client fields (Phase 4.1 part 2/9) +3638fc0 feat(property): add Chinese verbose_name and help_text to all property fields (Phase 4.1) +79c3cf2 feat(models): add Chinese verbose_name to all 74 models (Phase 4.0) 94d1602 feat: complete Phase 3 scaffolding (templates, static, Docker, per-app skeletons) ed40de4 feat(client,setting): complete Phase 2 with partitioned client_follow_logs 5b55dda feat(property): add 23-table property module with partitioned follow_logs and property_photos c57462f feat(complex): add apps.complex with 10 models and full-text search -9a7d06b feat: scaffold Django multi-tenant project with 5 of 9 apps ``` ### 3.2 工作树状态 -- **完全干净**(`nothing to commit, working tree clean`) - 当前分支:`main` -- 未推送至远程 +- 已跟踪文件:clean +- **未跟踪改动(用户代理配置,不要 `git add`)**: + - `Dockerfile` — 添加 `--proxy http://host.docker.internal:10808 --timeout 120` + - `docker-compose.yml` — 同上代理类配置 + - 这两个改动属于本机网络环境配置,由用户自行管理 --- -## 四、明天的恢复点(按 PM 进度分支) +## 四、后续工作恢复点 -### 4.1 PM 已完成 DATA_MODEL 补全 → 启动 Phase 4.1 +### 4.1 立即可做(不阻塞) -**任务**:把 781 个字段的中文注释从 DATA_MODEL_*.md 同步到 Django 模型代码。 - -**做法**: -1. 按 app 逐个处理(property → client → complex → org → account → permission → setting → region → tenant) -2. 每个 app 一个独立 commit(`feat(): sync field verbose_name + help_text from DATA_MODEL`) -3. 字段格式: - ```python - name = models.CharField( - max_length=100, - verbose_name="房源名称", # ← 来自 DATA_MODEL"业务说明"第一段 - help_text="如'翠湖天地 3 号楼 1502 室',展示给客户", # ← 二/三段(关键字段才加) - ) - ``` -4. 每个 commit 后 `manage.py check` 验证 -5. 全部完成后 `makemigrations` 生成 Meta verbose 迁移 - -**估算工时**:5-6 小时(机械工作,按 PM 文档抄写) - -**起手命令**(明天直接复制): -```bash -cd /mnt/c/project/fonrey -.venv/bin/python manage.py check -git status -git log --oneline -3 -# 确认状态干净后,从 property app 开始 -ls /mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PROPERTY.md -``` - -### 4.2 PM 还没完成 → 做 deferred 项目 - -可选清单(按 ROI 排序): - -| 项目 | 描述 | 估时 | 是否阻塞他人 | +| 项目 | 描述 | 估时 | 优先级 | |---|---|---|---| -| **PermissionDef 种子数据** | ~300 条权限定义 fixture,PRD §8.2 导航对齐 | 2-3h | 阻塞权限测试 | -| **内置角色 + DataScope 种子** | Tenant Admin / 普通员工默认角色 | 1-2h | 阻塞登录测试 | -| **Setting LookupItem 默认值** | 字段必填规则 + 枚举默认 | 1h | 不阻塞 | -| **Celery partition_maintenance_task** | 月度分区自动创建任务 | 2h | 不阻塞(手动建分区可用) | -| **spectacular OpenAPI 实际生成** | `manage.py spectacular --file openapi.json` | 0.5h | 阻塞 schemathesis | -| **schemathesis 实跑** | 先要有真实端点 | 0.5h(前提:有端点) | API 契约验证 | -| **Heroicons SVG 库** | 模板里用到的图标 | 1h | 不阻塞(前端可用占位) | -| **static/vendor 第三方 JS** | HTMX / Alpine / Tailwind 决定 CDN vs 本地 | 0.5h | 影响生产部署 | +| **生成 Phase 4 verbose_name 迁移** | `manage.py makemigrations`,会为所有 app 生成 `Alter field` 迁移(仅 Meta,不动 schema) | 0.5h | 高 — 进 git 才能部署到 Admin | +| **Push 14 个本地 commit** | `git push origin main`(需用户授权) | 0.1h | 中 | +| **PermissionDef 种子数据** | ~300 条权限定义 fixture,PRD §8.2 导航对齐 | 2-3h | 高 — 阻塞权限/登录测试 | +| **内置角色 + DataScope 种子** | Tenant Admin / 普通员工默认角色 | 1-2h | 高 — 阻塞登录测试 | +| **Setting LookupItem 默认值** | DATA_MODEL_SETTING.md §2.3 已列出种子数据 | 1h | 中 | +| **Celery partition_maintenance_task** | 月度分区自动创建 | 2h | 中(手动建分区可暂用) | +| **drf-spectacular OpenAPI 生成** | `manage.py spectacular --file openapi.json` | 0.5h | 中 — 阻塞 schemathesis | +| **release app 模型化(可选)** | DATA_MODEL_PUBLIC.md §2.6 client_releases;当前 `apps/release/models/` 为空目录 | 1h | 低 — MVP 不需要 | -**推荐**:先做 **PermissionDef 种子数据**——是阻塞权限/登录测试的根,且不依赖 PM 的 DATA_MODEL 补全。 +**推荐顺序**:makemigrations → PermissionDef 种子 → 内置角色种子 → push(一次性同步给团队)。 -### 4.3 远程同步(非紧急) +### 4.2 进入业务开发阶段(Phase 5+) -5 个 commit 仍在本地。如果今晚要同步到团队: -```bash -git push origin main -``` -(之前用户没明确要求 push,按需执行) +骨架已就绪。业务开发可以按以下路径推进: + +1. **认证 + 登录流**(apps/account + apps/permission)— DATA_MODEL_LOGIN.md / DATA_MODEL_PERMISSION.md 已为权威源 +2. **房源 CRUD**(apps/property)— DATA_MODEL_PROPERTY.md 完整覆盖 23 模型 +3. **客源 CRUD + 跟进**(apps/client)— DATA_MODEL_CLIENT.md 11 模型 +4. **楼盘维护**(apps/complex + apps/region)— DATA_MODEL_COMPLEX.md 10 模型 +5. **组织/员工**(apps/org)— DATA_MODEL_ORG.md 11 模型 +6. **系统配置**(apps/setting)— DATA_MODEL_SETTING.md 4 模型 + Service 层(`TenantSettingsService`) + +**API 契约要求**:每个端点必须满足 `TECH_STACK/API_CONTRACT.md` 的 7 项检查表。 --- -## 五、关键文件索引(明天查找用) +## 五、关键文件索引 ### 5.1 项目本体(`/mnt/c/project/fonrey/`) | 路径 | 作用 | |---|---| -| `apps/*/models/*.py` | 74 个模型,已有 Meta verbose_name(Phase 4.0),待补字段级 verbose_name(Phase 4.1) | +| `apps/*/models/*.py` | 74 模型,**Meta + 字段 verbose_name/help_text 全部补齐**(Phase 4.0+4.1)| | `core/enums.py` | ENUMS.md v2.2 镜像 | | `core/models/base.py` | TimeStampedModel / SoftDeleteModel / UUIDPrimaryKeyModel / AuditedModel | | `core/encryption.py` | AES-256-GCM PhoneEncryption | +| `config/settings/development.py` | `DJANGO_SETTINGS_MODULE` 默认值 | | `manage.py` | Django 入口(用 `.venv/bin/python manage.py ...`) | -| `.env` | 本地 SECRET_KEY + PHONE_ENCRYPTION_KEY(gitignored) | +| `.env` | 本地 SECRET_KEY + PHONE_ENCRYPTION_KEY(gitignored)| +| `Dockerfile` / `docker-compose.yml` | **untracked 改动持续存在**,含本机代理配置 | ### 5.2 文档(`/mnt/d/Workspace/nexus/Project/fonrey/`) | 路径 | 作用 | |---|---| -| `规范/DATA_MODEL_注释补全规范_v1.md` | **PM 待办清单**(今日新增) | -| `DATA_MODEL/DATA_MODEL_*.md` | 数据模型权威源(PM 待补全) | +| `规范/DATA_MODEL_注释补全规范_v1.md` | Phase 4.1 实施依据 | +| `DATA_MODEL/DATA_MODEL_*.md` | 数据模型权威源(9 个文件,全部已读且映射到代码)| | `DATA_MODEL/ENUMS.md` | 枚举权威源 v2.2 | | `prompt/提示词模板/创建项目骨架提示词_v2.3.md` | 项目骨架规范 | | `TECH_STACK/API_CONTRACT.md` | API 契约 7 项检查表 | | `实施报告/项目骨架搭建实施报告_v1.md` | Phase 1-3 报告 | -| `实施报告/项目进度交接报告_Phase4.0_收尾.md` | **本文件** | +| `实施报告/项目进度交接报告_Phase4.0_收尾.md` | **本文件**(已升级为 Phase 4.0+4.1 收尾报告)| --- -## 六、快速验证命令(明天 onboard 自检) +## 六、快速验证命令(onboard 自检) ```bash cd /mnt/c/project/fonrey # 环境验证 -.venv/bin/python --version # 应 Python 3.13.x -.venv/bin/python manage.py check # 应 0 issues +.venv/bin/python --version # Python 3.13.x +.venv/bin/python manage.py check # 0 issues -# 当前注释覆盖率核对 -grep -rh "verbose_name = " apps/*/models/*.py | grep -v _plural | wc -l # 应 75(74 模型 + 1 多余 ManyToMany 的 model = 75 大致) -grep -rh "verbose_name_plural" apps/*/models/*.py | wc -l # 应 75 +# Phase 4.0 模型级覆盖核对 +grep -rh "verbose_name = " apps/*/models/*.py apps/tenant/models.py | grep -v _plural | grep -v "^#" | wc -l +grep -rh "verbose_name_plural" apps/*/models/*.py apps/tenant/models.py | wc -l + +# Phase 4.1 字段级覆盖核对 +grep -rhc "verbose_name=" apps/*/models/*.py apps/tenant/models.py # 应远超 781(含 verbose_name= 字段属性 + Meta verbose_name) +grep -rhc "help_text=" apps/*/models/*.py apps/tenant/models.py # 关键字段已覆盖 # Git 状态 -git status # 应 nothing to commit, working tree clean -git log --oneline -3 # HEAD 应是 79c3cf2 Phase 4.0 +git status # 仅 Dockerfile / docker-compose.yml untracked +git log --oneline origin/main..HEAD # 应见 14 行(Phase 4.0 + 4.1 + 历史 4 个 Phase 1-3) + +# 待生成迁移预览(不实际写盘) +.venv/bin/python manage.py makemigrations --dry-run | head -50 ``` --- -## 七、待澄清/记忆事项 +## 七、待澄清/记忆事项(不变项) -1. **Hook 政策**:本仓库 hook 严格阻止新 docstring/注释。所有业务说明改写在 DATA_MODEL 里,代码层只用字段属性(`verbose_name=` / `help_text=`)承载语义。 -2. **5 个未推送 commit**:用户未授权 push。如果团队需要协作,需用户明确指示后再推。 +1. **Hook 政策**:本仓库 hook 严格阻止新 docstring/行注释。**字段属性(`verbose_name=` / `help_text=`)字符串赋值放行**。所有业务说明仍以 DATA_MODEL_*.md 为单一信息源。 +2. **14 个未推送 commit**:用户未授权 push。如团队需协作,需用户明确指示后再推。 3. **AGENTS.md §4.4**:手机号必须 AES-256-GCM(**禁止** Fernet)。 -4. **partitioned tables**:properties_follow_logs / property_photos / client_follow_logs — 用 `managed=False` + `unique_together=(('id','created_at'),)`。 +4. **Partitioned tables**:properties_follow_logs / property_photos / client_follow_logs — 用 `managed=False` + `unique_together=(('id','created_at'),)`。这些表的现有 docstring("Partitioned table…unmanaged")作为技术注解保留。 5. **release app 不写 services/**:spec §17.5 明确禁止。 -6. **CSRF_COOKIE_HTTPONLY=False**:HTMX 需要,故意如此,禁止"修复"。 -7. **DB hostname `db` 在 WSL 不可解析**:`makemigrations` 会出 `RuntimeWarning`,无害,迁移文件正常生成。 +6. **release app 模型未实例化**:DATA_MODEL_PUBLIC.md §2.6 `client_releases` 未生成 Django Model;MVP 不需要,进入客户端发布阶段时再补。 +7. **CSRF_COOKIE_HTTPONLY=False**:HTMX 需要,故意如此,**禁止"修复"**。 +8. **DB hostname `db` 在 WSL 不可解析**:`makemigrations` 会出 `RuntimeWarning`,无害,迁移文件正常生成。 +9. **未跟踪文件保留**:Dockerfile / docker-compose.yml 的代理配置是用户本机设置,**不要主动 `git add`**。 +10. **ENUM 字段 help_text 中英对照**:示例 `"public=公立 / private=私立 / international=国际学校"`,沿用此风格。 --- @@ -223,10 +230,21 @@ git log --oneline -3 # HEAD 应是 79c3cf2 Phase 4.0 | **Phase 1** — 配置/核心 | ✅ | config/, core/, settings, .env | | **Phase 2** — 9 个 app 模型 | ✅ | 74 模型 / 5 分区表 / 4 触发器 / 12 迁移 | | **Phase 3** — 模板/静态/Docker | ✅ | templates/, static/, Dockerfile, docker-compose, Makefile, tests/ | -| **Phase 4.0** — 模型 Meta 中文名 | ✅(今日) | 74 模型全部 Meta.verbose_name | -| **Phase 4.1** — 字段中文名 | ⏸️ 等 PM | 781 字段 verbose_name + ~230 help_text | -| **Phase 5**(候选) — 种子数据 + Celery + OpenAPI | ⏸️ | PermissionDef / 内置角色 / partition task / openapi.json | +| **Phase 4.0** — 模型 Meta 中文名 | ✅ | 74 模型全部 `Meta.verbose_name` + `_plural` | +| **Phase 4.1** — 字段中文名 | ✅(**本次完成**) | 781 字段 `verbose_name` + 关键字段 `help_text`,9 app 各一 commit | +| **Phase 5**(候选) — 种子数据 + Celery + OpenAPI | ⏸️ 待启动 | PermissionDef / 内置角色 / partition task / openapi.json | +| **Phase 6+** — 业务开发 | ⏸️ 骨架就绪 | 按 DATA_MODEL_*.md 与 API_CONTRACT.md 推进 | --- -**祝明天工作顺利。状态干净,随时可以续接。** +## 九、给后续开发者的提醒 + +> 进入正式业务开发前,**强烈建议**先做以下 3 件事: +> +> 1. `manage.py makemigrations` 把 Phase 4.0+4.1 的 verbose_name 迁移落地,并 commit +> 2. 创建 PermissionDef + 内置角色 fixture(阻塞登录/权限测试) +> 3. `git push origin main` 同步 14 个本地 commit 到远程 +> +> 三步完成后骨架达到"业务开发就绪"状态。所有模型字段中文化已完成,新写 ViewSet/Service 时不需要再补任何字段元数据。 + +**Phase 4.0 + 4.1 收尾完成。骨架已就绪,可直接进入业务开发。**