|
|
@@ -16,8 +16,9 @@ async def _sync_employee_quota(
|
|
|
) -> None:
|
|
|
"""根据员工所属部门,同步本地额度记录
|
|
|
|
|
|
- 扫描所有按部门模式的制度,如果该制度引用了员工所属部门,
|
|
|
- 则为员工创建(或删除)本地 pay_expense_quota 记录。
|
|
|
+ 扫描所有按部门模式的制度:
|
|
|
+ - 匹配的部门 → 确保员工有额度记录(创建缺失的)
|
|
|
+ - 不匹配的部门 → 删除该员工的额度记录(处理离部门场景)
|
|
|
"""
|
|
|
if not employee_id:
|
|
|
return
|
|
|
@@ -39,69 +40,56 @@ async def _sync_employee_quota(
|
|
|
if not institutions:
|
|
|
return
|
|
|
|
|
|
+ tenant_id = auth.user.tenant_id if auth.user else 1
|
|
|
+ dept_id_set = set(department_ids)
|
|
|
+
|
|
|
for inst in institutions:
|
|
|
inst_id = inst.institution_id
|
|
|
scope_owner_ids_str = getattr(inst, "scope_owner_id_list", None) or getattr(inst, "department_id", None)
|
|
|
- if not inst_id:
|
|
|
- continue
|
|
|
-
|
|
|
- # 判断该制度的部门是否匹配员工部门
|
|
|
- matched = False
|
|
|
- if scope_owner_ids_str:
|
|
|
- import json
|
|
|
- try:
|
|
|
- scope_ids = json.loads(scope_owner_ids_str) if isinstance(scope_owner_ids_str, str) else scope_owner_ids_str
|
|
|
- except (json.JSONDecodeError, TypeError):
|
|
|
- scope_ids = [str(scope_owner_ids_str)] if scope_owner_ids_str else []
|
|
|
-
|
|
|
- for dept_id in department_ids:
|
|
|
- if dept_id in scope_ids:
|
|
|
- matched = True
|
|
|
- break
|
|
|
- else:
|
|
|
+ if not inst_id or not scope_owner_ids_str:
|
|
|
continue
|
|
|
|
|
|
- if not matched:
|
|
|
- continue
|
|
|
+ # 解析制度的部门ID列表
|
|
|
+ import json
|
|
|
+ try:
|
|
|
+ scope_ids = json.loads(scope_owner_ids_str) if isinstance(scope_owner_ids_str, str) else scope_owner_ids_str
|
|
|
+ except (json.JSONDecodeError, TypeError):
|
|
|
+ scope_ids = [str(scope_owner_ids_str)] if scope_owner_ids_str else []
|
|
|
+ scope_ids = [str(s) for s in scope_ids]
|
|
|
|
|
|
- tenant_id = auth.user.tenant_id if auth.user else 1
|
|
|
+ # 判断是否匹配
|
|
|
+ matched = bool(scope_ids and dept_id_set.intersection(scope_ids))
|
|
|
|
|
|
- if is_add:
|
|
|
- # 员工加入部门 → 创建额度记录
|
|
|
+ if matched:
|
|
|
+ # 匹配 → 确保有额度记录
|
|
|
check = select(QuotaModel).where(
|
|
|
QuotaModel.employee_id == employee_id,
|
|
|
QuotaModel.institution_id == inst_id,
|
|
|
)
|
|
|
existing = await auth.db.execute(check)
|
|
|
- if existing.scalar_one_or_none():
|
|
|
- continue
|
|
|
-
|
|
|
- stmt = insert(QuotaModel).values(
|
|
|
- employee_id=employee_id,
|
|
|
- institution_id=inst_id,
|
|
|
- out_biz_no=f"scope_{inst_id}_{employee_id}",
|
|
|
- total_amount=0,
|
|
|
- available_amount=0,
|
|
|
- status=QuotaStatusEnum.QUOTA_PENDING.value,
|
|
|
- enterprise_id=enterprise_id,
|
|
|
- tenant_id=tenant_id,
|
|
|
- )
|
|
|
- await auth.db.execute(stmt)
|
|
|
- log.info(
|
|
|
- f"部门联动 - 新增员工额度: employee_id={employee_id}, "
|
|
|
- f"institution_id={inst_id}"
|
|
|
- )
|
|
|
+ if not existing.scalar_one_or_none():
|
|
|
+ stmt = insert(QuotaModel).values(
|
|
|
+ employee_id=employee_id,
|
|
|
+ institution_id=inst_id,
|
|
|
+ out_biz_no=f"scope_{inst_id}_{employee_id}",
|
|
|
+ total_amount=0,
|
|
|
+ available_amount=0,
|
|
|
+ status=QuotaStatusEnum.QUOTA_PENDING.value,
|
|
|
+ enterprise_id=enterprise_id,
|
|
|
+ tenant_id=tenant_id,
|
|
|
+ )
|
|
|
+ await auth.db.execute(stmt)
|
|
|
+ log.info(f"部门联动 - 新增员工额度: employee_id={employee_id}, institution_id={inst_id}")
|
|
|
else:
|
|
|
- # 员工离开部门 → 删除额度记录
|
|
|
+ # 不匹配 → 删除该员工的额度记录
|
|
|
+ if not is_add:
|
|
|
+ continue
|
|
|
del_stmt = sa_delete(QuotaModel).where(
|
|
|
QuotaModel.employee_id == employee_id,
|
|
|
QuotaModel.institution_id == inst_id,
|
|
|
)
|
|
|
await auth.db.execute(del_stmt)
|
|
|
- log.info(
|
|
|
- f"部门联动 - 删除员工额度: employee_id={employee_id}, "
|
|
|
- f"institution_id={inst_id}"
|
|
|
- )
|
|
|
+ log.info(f"部门联动 - 删除员工额度: employee_id={employee_id}, institution_id={inst_id}")
|
|
|
|
|
|
await auth.db.flush()
|
|
|
except Exception as e:
|