开放客服 kuaishou-lewan 换绑角色权限
与刷新角色一致,换绑改用 canOperateAssistedTask, 不开放重试/发货/退号等完整任务生命周期能力。
This commit is contained in:
@@ -88,7 +88,7 @@ router.post(
|
|||||||
|
|
||||||
router.post(
|
router.post(
|
||||||
'/tasks/:taskId/kuaishou-cloud/rebind-role',
|
'/tasks/:taskId/kuaishou-cloud/rebind-role',
|
||||||
requireAdminRoles(['admin', 'operator']),
|
requireAdminRoles(['admin', 'operator', 'support']),
|
||||||
createJsonHandler(
|
createJsonHandler(
|
||||||
(req) => rebindAdminTaskKuaishouCloudRole(getTaskId(req), req.adminSession || null),
|
(req) => rebindAdminTaskKuaishouCloudRole(getTaskId(req), req.adminSession || null),
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -354,7 +354,7 @@ export async function getAdminTaskDetail(
|
|||||||
String(task.executor_key || '').trim() === 'kuaishou_ct_assisted' &&
|
String(task.executor_key || '').trim() === 'kuaishou_ct_assisted' &&
|
||||||
Number(kuaishouCloudFulfillment?.binding.vnId || 0) > 0,
|
Number(kuaishouCloudFulfillment?.binding.vnId || 0) > 0,
|
||||||
canRebindKuaishouCloudRole:
|
canRebindKuaishouCloudRole:
|
||||||
viewerContext.canManageTaskLifecycle &&
|
viewerContext.canOperateAssistedTask &&
|
||||||
String(task.executor_key || '').trim() === 'kuaishou_ct_assisted' &&
|
String(task.executor_key || '').trim() === 'kuaishou_ct_assisted' &&
|
||||||
canRebindKuaishouCloudRoleStatus(task.task_status) &&
|
canRebindKuaishouCloudRoleStatus(task.task_status) &&
|
||||||
String(kuaishouCloudFulfillment?.dispatch.status || 'pending').trim() !== 'success' &&
|
String(kuaishouCloudFulfillment?.dispatch.status || 'pending').trim() !== 'success' &&
|
||||||
|
|||||||
@@ -43,9 +43,23 @@ test('createAdminViewerContext lets support operate vouchers without lifecycle p
|
|||||||
const viewerContext = createAdminViewerContext({ role: 'support' })
|
const viewerContext = createAdminViewerContext({ role: 'support' })
|
||||||
|
|
||||||
assert.equal(viewerContext.canOperateKuaishouIndustryVoucher, true)
|
assert.equal(viewerContext.canOperateKuaishouIndustryVoucher, true)
|
||||||
|
assert.equal(viewerContext.canOperateAssistedTask, true)
|
||||||
assert.equal(viewerContext.canManageTaskLifecycle, false)
|
assert.equal(viewerContext.canManageTaskLifecycle, false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('createAdminViewerContext lets support rebind-assisted actions without full lifecycle', () => {
|
||||||
|
const support = createAdminViewerContext({ role: 'support' })
|
||||||
|
const operator = createAdminViewerContext({ role: 'operator' })
|
||||||
|
|
||||||
|
// 客服:可协助换绑/刷新角色,不可管理任务生命周期(重试/发货/退号等)
|
||||||
|
assert.equal(support.canOperateAssistedTask, true)
|
||||||
|
assert.equal(support.canManageTaskLifecycle, false)
|
||||||
|
|
||||||
|
// 运营:两者皆可
|
||||||
|
assert.equal(operator.canOperateAssistedTask, true)
|
||||||
|
assert.equal(operator.canManageTaskLifecycle, true)
|
||||||
|
})
|
||||||
|
|
||||||
test('mapKuaishouCloudFulfillmentContext exposes cloud account display labels', () => {
|
test('mapKuaishouCloudFulfillmentContext exposes cloud account display labels', () => {
|
||||||
const flow = mapKuaishouCloudFulfillmentContext(
|
const flow = mapKuaishouCloudFulfillmentContext(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -210,7 +210,8 @@ export async function rebindAdminTaskKuaishouCloudRole(
|
|||||||
const task = await getRequiredTask(taskId)
|
const task = await getRequiredTask(taskId)
|
||||||
const viewerContext = createAdminViewerContext(session)
|
const viewerContext = createAdminViewerContext(session)
|
||||||
|
|
||||||
if (!viewerContext.canManageTaskLifecycle) {
|
// 与刷新角色一致:客服可换绑协助处理 UID 绑错,不开放完整任务生命周期
|
||||||
|
if (!viewerContext.canOperateAssistedTask) {
|
||||||
throw createHttpError('当前账号没有权限换绑角色', {
|
throw createHttpError('当前账号没有权限换绑角色', {
|
||||||
statusCode: 403,
|
statusCode: 403,
|
||||||
errorCode: 'admin_task_rebind_kuaishou_cloud_forbidden',
|
errorCode: 'admin_task_rebind_kuaishou_cloud_forbidden',
|
||||||
|
|||||||
Reference in New Issue
Block a user