diff --git a/User/views.py b/User/views.py index f432dd6..e20a5e9 100644 --- a/User/views.py +++ b/User/views.py @@ -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') diff --git a/财务部判断逻辑说明.md b/财务部判断逻辑说明.md new file mode 100644 index 0000000..9d5de4a --- /dev/null +++ b/财务部判断逻辑说明.md @@ -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="财务"` 的审批记录(因为部门包含"财务部")