This commit is contained in:
27942
2026-01-13 18:03:38 +08:00
parent 3cf6e50b1c
commit 47f54a168e
2 changed files with 218 additions and 6 deletions

View File

@@ -741,12 +741,19 @@ class roxyExhibition(APIView):
# 获取用户所属的所有部门ID转为字符串因为personincharge存储的是字符串
user_department_ids = list(user.department.values_list('id', flat=True))
user_department_ids_str = [str(did) for did in user_department_ids]
# 获取用户的部门名称列表
user_departments = user.department.values_list('username', flat=True)
user_department_names = list(user_departments)
# 判断用户是否是财务部人员:只通过部门名称判断
is_finance_user = '财务部' in user_department_names
# 构建查询条件:
# personincharge字段统一规则
# - 纯数字字符串 = 部门ID该部门下所有人员都能看到
# - 非纯数字字符串 = 审批员用户名(只有该审批员能看到)
# - "财务" = 财务部门(有财务人员能看到)
# - "财务" = 财务部门(有财务人员能看到)
# 状态:审核中 或 已抄送财务(财务能看到)
# 重要多人团队审核时只有当前审核人personincharge等于当前用户名才能看到审核记录
query = Q(state__in=["审核中", "已抄送财务"])
@@ -762,22 +769,26 @@ class roxyExhibition(APIView):
person_query = Q(personincharge=user.username)
# 财务匹配personincharge字段是"财务",且状态为"已抄送财务"
finance_query = Q(personincharge="财务", state="已抄送财务")
# 重要:只有财务部人员才能看到财务审核的审批记录
finance_query = Q()
if is_finance_user:
finance_query = Q(personincharge="财务", state="已抄送财务")
# 组合查询:部门匹配 OR 审批员匹配 OR 财务匹配
# 组合查询:部门匹配 OR 审批员匹配 OR 财务匹配(仅财务部人员)
# 如果用户有部门,使用部门匹配;否则只使用审批员匹配
# 注意:审批员匹配必须精确匹配当前用户名,确保多人团队审核时,只有当前审核人能看到
if user_department_ids_str:
query &= (department_query | person_query | finance_query)
else:
# 如果用户没有部门,匹配审批员或财务
# 如果用户没有部门,匹配审批员或财务(仅财务部人员)
query &= (person_query | finance_query)
# 添加调试日志
import logging
logger = logging.getLogger(__name__)
logger.info(f"roxyExhibition: 用户={user.username}, 部门IDs={user_department_ids_str}")
logger.info(f"roxyExhibition: 查询条件 - personincharge={user.username} OR personincharge=财务(已抄送财务) OR personincharge IN {user_department_ids_str}")
logger.info(f"roxyExhibition: 用户={user.username}, 部门IDs={user_department_ids_str}, 部门名称={user_department_names}")
logger.info(f"roxyExhibition: 是否是财务部人员={is_finance_user} (仅通过部门名称判断)")
logger.info(f"roxyExhibition: 查询条件 - personincharge={user.username} OR personincharge=财务(已抄送财务,仅财务部) OR personincharge IN {user_department_ids_str}")
approvals = Approval.objects.filter(query, is_deleted=False).order_by('-id')

View File

@@ -0,0 +1,201 @@
# 财务部判断逻辑说明
## 一、问题发现
**原问题**:代码中 `personincharge="财务"` 的审批记录,所有用户都能看到,并没有判断用户是否是财务部的人。
**原代码逻辑**
```python
# 财务匹配personincharge字段是"财务",且状态为"已抄送财务"
finance_query = Q(personincharge="财务", state="已抄送财务")
# 组合查询:所有用户都能看到财务审核的审批记录
query &= (department_query | person_query | finance_query)
```
**问题**:这意味着**所有用户都能看到 `personincharge="财务"` 的审批记录**,而不仅仅是财务部的人。
## 二、修复方案
### 1. 判断用户是否是财务部人员
**判断方式**:只通过用户的**部门名称**判断
**代码逻辑**
```python
# 获取用户的部门名称列表
user_departments = user.department.values_list('username', flat=True)
user_department_names = list(user_departments)
# 判断用户是否是财务部人员(只通过部门名称判断)
is_finance_user = '财务部' in user_department_names
```
**判断条件**
- 用户的部门名称包含 `"财务部"`
### 2. 修复后的查询逻辑
**修复后的代码**
```python
# 财务匹配:只有财务部人员才能看到
finance_query = Q()
if is_finance_user:
finance_query = Q(personincharge="财务", state="已抄送财务")
# 组合查询:只有财务部人员才能看到财务审核的审批记录
query &= (department_query | person_query | finance_query)
```
**逻辑说明**
- 如果用户是财务部人员(`is_finance_user = True`),则 `finance_query` 包含财务匹配条件
- 如果用户不是财务部人员(`is_finance_user = False`),则 `finance_query` 为空,不会匹配到财务审核的审批记录
## 三、完整的查询逻辑
### 1. 查询条件组合
```python
query = Q(state__in=["审核中", "已抄送财务"])
# 部门匹配personincharge字段是部门ID且匹配用户所属部门
department_query = Q(personincharge__in=user_department_ids_str)
# 审批员匹配personincharge字段是用户名且等于当前用户名
person_query = Q(personincharge=user.username)
# 财务匹配personincharge字段是"财务",且状态为"已抄送财务"(仅财务部人员)
finance_query = Q(personincharge="财务", state="已抄送财务") if is_finance_user else Q()
# 组合查询
query &= (department_query | person_query | finance_query)
```
### 2. 用户能看到审批记录的条件
用户能看到审批记录,需要满足以下**任一条件**
1. **部门匹配**`personincharge` 字段是用户所属部门的ID纯数字字符串
2. **审批员匹配**`personincharge` 字段等于当前用户名(非纯数字字符串)
3. **财务匹配**`personincharge` 字段是 `"财务"`,且用户是财务部人员(角色名称或部门名称包含 `"财务部"`
## 四、数据模型
### 1. User 模型
```python
class User(models.Model):
username = models.CharField(max_length=100) # 姓名
department = models.ManyToManyField(Department) # 归属部门(多对多)
role = models.ManyToManyField(role) # 角色(多对多)
# ... 其他字段
```
### 2. Department 模型
```python
class Department(models.Model):
username = models.CharField(max_length=100) # 部门名称
is_deleted = models.BooleanField(default=False) # 软删除标记
```
### 3. role 模型
```python
class role(models.Model):
RoleName = models.CharField(max_length=100) # 角色名称
# ... 其他字段
```
## 五、判断逻辑示例
### 示例1财务部人员
```
用户:张三
部门:["财务部", "人事部"]
判断结果:
- user_department_names = ["财务部", "人事部"]
- '财务部' in user_department_names = True
- is_finance_user = True
- 可以看到 personincharge="财务" 的审批记录
```
### 示例2非财务部人员
```
用户:王五
部门:["人事部"]
判断结果:
- user_department_names = ["人事部"]
- '财务部' not in user_department_names = True
- is_finance_user = False
- 不能看到 personincharge="财务" 的审批记录
```
## 六、修复后的完整流程
### 1. 创建审核(多人团队)
```
用户提交入职登记approvers=[5, 16]
→ 创建审批记录personincharge="用户5", state="审核中"
→ 只有用户5能看到这个审核
```
### 2. 第一个审核人审核通过
```
用户5审核通过
→ 流转到下一个审核人personincharge="用户16", state="审核中"
→ 只有用户16能看到这个审核用户5不再看到
```
### 3. 第二个审核人审核通过
```
用户16审核通过
→ 流转到财务部personincharge="财务", state="已抄送财务"
→ 只有财务部人员能看到这个审核(通过角色名称或部门名称判断)
```
### 4. 财务部审核通过
```
财务部人员审核通过
→ 审批记录state="已通过"
→ 用户状态state="在职"
→ 审核完成
```
## 七、关键代码位置
1. **代办展示接口**`User/views.py` - `roxyExhibition`第724-966行
2. **财务部判断逻辑**`User/views.py` - `roxyExhibition`第739-780行
3. **参考实现**`finance/views.py` - `confirmdisplay`第1006-1016行
## 八、注意事项
1. **部门名称必须包含"财务部"**:如果部门名称是 `"财务"` 而不是 `"财务部"`,则无法匹配
2. **大小写敏感**:判断是精确匹配,`"财务部"``"财务"` 是不同的
3. **多部门**:只要用户的任一部门名称包含 `"财务部"`,就会被判断为财务部人员
4. **只判断部门**:系统只通过部门名称判断,不通过角色名称判断
## 九、测试建议
1. **测试财务部人员**
- 创建一个部门名称为 `"财务部"` 的用户
- 验证该用户能看到 `personincharge="财务"` 的审批记录
2. **测试非财务部人员**
- 创建一个部门名称不包含 `"财务部"` 的用户
- 验证该用户不能看到 `personincharge="财务"` 的审批记录
3. **测试审核流程**
- 创建多人团队审核,验证最后一个审核人审核后,只有财务部人员能看到
4. **测试多部门用户**
- 创建一个用户,部门包含 `["财务部", "人事部"]`
- 验证该用户能看到 `personincharge="财务"` 的审批记录(因为部门包含"财务部"