haha
This commit is contained in:
@@ -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')
|
||||
|
||||
|
||||
201
财务部判断逻辑说明.md
Normal file
201
财务部判断逻辑说明.md
Normal 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="财务"` 的审批记录(因为部门包含"财务部")
|
||||
Reference in New Issue
Block a user