1
This commit is contained in:
@@ -12,6 +12,7 @@ from app.enums.user import UserType
|
|||||||
from app.models.team import Team
|
from app.models.team import Team
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.services.credits import add_credits, deduct_credits
|
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
|
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:
|
if not team or team.manager_id != manager_id:
|
||||||
raise HTTPException(status_code=403, detail="只有团队管理人才能分配积分")
|
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 "团队积分扣减")
|
desc = description or ("团队积分发放" if direction == "increase" else "团队积分扣减")
|
||||||
xfer_id = generate_id()
|
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":
|
if direction == "increase":
|
||||||
# 管理人扣减
|
# 管理人扣减
|
||||||
await deduct_credits(
|
await deduct_credits(
|
||||||
@@ -184,6 +201,7 @@ async def transfer_credits_to_member(
|
|||||||
f"分配给成员 {member.username}: {desc}",
|
f"分配给成员 {member.username}: {desc}",
|
||||||
record_type="team_internal",
|
record_type="team_internal",
|
||||||
biz_key=f"mgr_xfer_out:{manager_id}:{target_member_id}:{xfer_id}",
|
biz_key=f"mgr_xfer_out:{manager_id}:{target_member_id}:{xfer_id}",
|
||||||
|
record_meta=_build_team_transfer_meta(manager_id),
|
||||||
)
|
)
|
||||||
# 成员增加
|
# 成员增加
|
||||||
await add_credits(
|
await add_credits(
|
||||||
@@ -193,6 +211,7 @@ async def transfer_credits_to_member(
|
|||||||
f"来自团队管理人: {desc}",
|
f"来自团队管理人: {desc}",
|
||||||
record_type="team_internal",
|
record_type="team_internal",
|
||||||
biz_key=f"mgr_xfer_in:{manager_id}:{target_member_id}:{xfer_id}",
|
biz_key=f"mgr_xfer_in:{manager_id}:{target_member_id}:{xfer_id}",
|
||||||
|
record_meta=_build_team_transfer_meta(target_member_id),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# 成员扣减
|
# 成员扣减
|
||||||
@@ -203,6 +222,7 @@ async def transfer_credits_to_member(
|
|||||||
f"扣减给团队管理人: {desc}",
|
f"扣减给团队管理人: {desc}",
|
||||||
record_type="team_internal",
|
record_type="team_internal",
|
||||||
biz_key=f"mgr_deduct_out:{manager_id}:{target_member_id}:{xfer_id}",
|
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(
|
await add_credits(
|
||||||
@@ -212,4 +232,5 @@ async def transfer_credits_to_member(
|
|||||||
f"来自成员 {member.username}: {desc}",
|
f"来自成员 {member.username}: {desc}",
|
||||||
record_type="team_internal",
|
record_type="team_internal",
|
||||||
biz_key=f"mgr_deduct_in:{manager_id}:{target_member_id}:{xfer_id}",
|
biz_key=f"mgr_deduct_in:{manager_id}:{target_member_id}:{xfer_id}",
|
||||||
|
record_meta=_build_team_transfer_meta(manager_id),
|
||||||
)
|
)
|
||||||
|
|||||||
+505
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -28,7 +28,7 @@
|
|||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
</script>
|
</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">
|
<link rel="stylesheet" crossorigin href="/assets/index-D9_3MPsN.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -265,9 +265,17 @@ const TeamManagementPage: React.FC = () => {
|
|||||||
{ title: '加入时间', dataIndex: 'joinedAt', width: 170, render: (v: string) => formatDateTime(v) },
|
{ title: '加入时间', dataIndex: 'joinedAt', width: 170, render: (v: string) => formatDateTime(v) },
|
||||||
{
|
{
|
||||||
title: '操作', key: 'action', width: 100,
|
title: '操作', key: 'action', width: 100,
|
||||||
render: (_: any, r: TeamMember) => (
|
render: (_: any, r: TeamMember) => {
|
||||||
<Button size="small" type="link" style={{ padding: 0 }} onClick={() => { setCreditModal({ open: true, member: r }); creditForm.resetFields(); }}>调整积分</Button>
|
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>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user