This commit is contained in:
2026-07-06 17:25:24 +08:00
parent 4818bbc2e9
commit 420b9147fe
4 changed files with 538 additions and 4 deletions
@@ -12,6 +12,7 @@ from app.enums.user import UserType
from app.models.team import Team
from app.models.user import User
from app.services.credits import add_credits, deduct_credits
from app.services.credit_record_meta_service import CreditRecordMeta
from app.utils.id_gen import generate_id
@@ -172,9 +173,25 @@ async def transfer_credits_to_member(
if not team or team.manager_id != manager_id:
raise HTTPException(status_code=403, detail="只有团队管理人才能分配积分")
# 禁止管理人给自己转积分
if target_member_id == manager_id:
raise HTTPException(status_code=400, detail="不能给自己调整积分")
desc = description or ("团队积分发放" if direction == "increase" else "团队积分扣减")
xfer_id = generate_id()
# 构建团队内部转账的 meta,确保 team_id_snapshot 等字段被正确设置
def _build_team_transfer_meta(uid: str) -> CreditRecordMeta:
meta = CreditRecordMeta(
owner_type="team_internal_transfer",
owner_id=xfer_id,
charge_kind="team_internal",
credit_subject="team_internal",
source_module="team",
billing_scene="team_internal_transfer",
)
return meta
if direction == "increase":
# 管理人扣减
await deduct_credits(
@@ -184,6 +201,7 @@ async def transfer_credits_to_member(
f"分配给成员 {member.username}: {desc}",
record_type="team_internal",
biz_key=f"mgr_xfer_out:{manager_id}:{target_member_id}:{xfer_id}",
record_meta=_build_team_transfer_meta(manager_id),
)
# 成员增加
await add_credits(
@@ -193,6 +211,7 @@ async def transfer_credits_to_member(
f"来自团队管理人: {desc}",
record_type="team_internal",
biz_key=f"mgr_xfer_in:{manager_id}:{target_member_id}:{xfer_id}",
record_meta=_build_team_transfer_meta(target_member_id),
)
else:
# 成员扣减
@@ -203,6 +222,7 @@ async def transfer_credits_to_member(
f"扣减给团队管理人: {desc}",
record_type="team_internal",
biz_key=f"mgr_deduct_out:{manager_id}:{target_member_id}:{xfer_id}",
record_meta=_build_team_transfer_meta(target_member_id),
)
# 管理人增加
await add_credits(
@@ -212,4 +232,5 @@ async def transfer_credits_to_member(
f"来自成员 {member.username}: {desc}",
record_type="team_internal",
biz_key=f"mgr_deduct_in:{manager_id}:{target_member_id}:{xfer_id}",
record_meta=_build_team_transfer_meta(manager_id),
)
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -28,7 +28,7 @@
}
})();
</script>
<script type="module" crossorigin src="/assets/index-DACceVTG.js"></script>
<script type="module" crossorigin src="/assets/index-DrbYyVjF.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-D9_3MPsN.css">
</head>
<body>
+11 -3
View File
@@ -265,9 +265,17 @@ const TeamManagementPage: React.FC = () => {
{ title: '加入时间', dataIndex: 'joinedAt', width: 170, render: (v: string) => formatDateTime(v) },
{
title: '操作', key: 'action', width: 100,
render: (_: any, r: TeamMember) => (
<Button size="small" type="link" style={{ padding: 0 }} onClick={() => { setCreditModal({ open: true, member: r }); creditForm.resetFields(); }}></Button>
),
render: (_: any, r: TeamMember) => {
const currentUserId = useAuthStore.getState().user?.id;
const isSelf = r.id === currentUserId;
return isSelf ? (
<Tooltip title="不能给自己调整积分">
<Button size="small" type="link" style={{ padding: 0, color: '#999', cursor: 'not-allowed' }} disabled></Button>
</Tooltip>
) : (
<Button size="small" type="link" style={{ padding: 0 }} onClick={() => { setCreditModal({ open: true, member: r }); creditForm.resetFields(); }}></Button>
);
},
},
];