拆分后台打手账号服务
This commit is contained in:
@@ -9,13 +9,11 @@ import {
|
|||||||
unassignWorkOrder,
|
unassignWorkOrder,
|
||||||
countWorkerActiveOrders,
|
countWorkerActiveOrders,
|
||||||
countWorkOrderPendingSharingSubmissions,
|
countWorkOrderPendingSharingSubmissions,
|
||||||
countTimeoutEventsByWorkerIds,
|
|
||||||
createWorkProductMatchLog,
|
createWorkProductMatchLog,
|
||||||
createWorkOrder,
|
createWorkOrder,
|
||||||
createWorkOrderEvent,
|
createWorkOrderEvent,
|
||||||
deductPendingDepositUnfreeze,
|
deductPendingDepositUnfreeze,
|
||||||
deleteWorkOrder,
|
deleteWorkOrder,
|
||||||
getWorkerLevelById,
|
|
||||||
getWorkerUserById,
|
getWorkerUserById,
|
||||||
getWorkOrderStatistics,
|
getWorkOrderStatistics,
|
||||||
getWorkOrderByOrderItemId,
|
getWorkOrderByOrderItemId,
|
||||||
@@ -35,9 +33,6 @@ import {
|
|||||||
reviewWorkerCancelRequest,
|
reviewWorkerCancelRequest,
|
||||||
updateWorkOrder,
|
updateWorkOrder,
|
||||||
updateWorkOrderBasic,
|
updateWorkOrderBasic,
|
||||||
updateWorkerUser,
|
|
||||||
updateWorkerPassword,
|
|
||||||
revokeAllWorkerSessions,
|
|
||||||
type WorkOrderRow,
|
type WorkOrderRow,
|
||||||
} from '../../repositories/worker-platform/index.js'
|
} from '../../repositories/worker-platform/index.js'
|
||||||
import type { JsonObject } from '../../types/json.js'
|
import type { JsonObject } from '../../types/json.js'
|
||||||
@@ -67,7 +62,6 @@ import {
|
|||||||
DEFAULT_DEPOSIT_THRESHOLD_AMOUNT,
|
DEFAULT_DEPOSIT_THRESHOLD_AMOUNT,
|
||||||
mapWorkOrderAdmin,
|
mapWorkOrderAdmin,
|
||||||
mapWorkOrderShare,
|
mapWorkOrderShare,
|
||||||
mapWorkerUser,
|
|
||||||
mapWorkerCancelRequest,
|
mapWorkerCancelRequest,
|
||||||
mapWorkerOrderFeedback,
|
mapWorkerOrderFeedback,
|
||||||
normalizeAmountFen,
|
normalizeAmountFen,
|
||||||
@@ -78,15 +72,9 @@ import {
|
|||||||
normalizeProblemResolutionAction,
|
normalizeProblemResolutionAction,
|
||||||
normalizeRequirementFields,
|
normalizeRequirementFields,
|
||||||
normalizeRequirementFieldsFromPayload,
|
normalizeRequirementFieldsFromPayload,
|
||||||
normalizeReviewStatus,
|
|
||||||
normalizeSessionVersion,
|
|
||||||
hashWorkerPassword,
|
|
||||||
validateWorkerPassword,
|
|
||||||
normalizeStatuses,
|
normalizeStatuses,
|
||||||
normalizeSubmittedFields,
|
normalizeSubmittedFields,
|
||||||
normalizeUploadedFiles,
|
normalizeUploadedFiles,
|
||||||
normalizeWorkerType,
|
|
||||||
normalizeWorkerFreezeReason,
|
|
||||||
resolveFreezeDepositAmount,
|
resolveFreezeDepositAmount,
|
||||||
mapWorkOrderEvents,
|
mapWorkOrderEvents,
|
||||||
resolveMatchingProductRuleDecision,
|
resolveMatchingProductRuleDecision,
|
||||||
@@ -108,96 +96,11 @@ import {
|
|||||||
type KuaishouIndustryShopConfig,
|
type KuaishouIndustryShopConfig,
|
||||||
} from '../platforms/kuaishou-industry/source-config-service.js'
|
} from '../platforms/kuaishou-industry/source-config-service.js'
|
||||||
|
|
||||||
export async function listAdminWorkerUsers(query: JsonObject = {}) {
|
export {
|
||||||
const page = normalizePage(query.page)
|
listAdminWorkerUsers,
|
||||||
const pageSize = normalizePageSize(query.pageSize)
|
resetAdminWorkerPassword,
|
||||||
const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0
|
reviewAdminWorkerUser,
|
||||||
const { items, total } = await listWorkerUsers({
|
} from './admin-worker-user-service.js'
|
||||||
page,
|
|
||||||
pageSize,
|
|
||||||
workerId,
|
|
||||||
status: String(query.status || '').trim(),
|
|
||||||
keyword: String(query.keyword || '').trim(),
|
|
||||||
workerType: String(query.workerType || query.worker_type || '').trim(),
|
|
||||||
})
|
|
||||||
const timeoutCounts = await countTimeoutEventsByWorkerIds(items.map((item) => Number(item.id)))
|
|
||||||
return {
|
|
||||||
items: items.map((item) => {
|
|
||||||
const worker = mapWorkerUser(item)
|
|
||||||
return {
|
|
||||||
...worker,
|
|
||||||
timeoutOrderCount: timeoutCounts.get(Number(item.id)) || 0,
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
pagination: { page, pageSize, total },
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function reviewAdminWorkerUser(workerId: number | string, payload: JsonObject = {}) {
|
|
||||||
const worker = await getRequiredWorker(workerId)
|
|
||||||
const status = normalizeReviewStatus(payload.status)
|
|
||||||
const freezeReason =
|
|
||||||
status === 'rejected'
|
|
||||||
? normalizeWorkerFreezeReason(payload.freezeReason ?? payload.freeze_reason)
|
|
||||||
: worker.frozen_reason || ''
|
|
||||||
const workerType = normalizeWorkerType(payload.workerType ?? payload.worker_type)
|
|
||||||
const requestedLevelId = normalizeOptionalId(payload.levelId)
|
|
||||||
let levelId = worker.level_id || null
|
|
||||||
if (requestedLevelId) {
|
|
||||||
const level = await getWorkerLevelById(requestedLevelId)
|
|
||||||
if (!level) {
|
|
||||||
throw createHttpError('接单等级不存在', {
|
|
||||||
statusCode: 404,
|
|
||||||
errorCode: 'worker_level_not_found',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
levelId = Number(level.id)
|
|
||||||
}
|
|
||||||
if (!levelId) {
|
|
||||||
levelId = (await ensureWorkerPlatformDefaults()).level?.id || null
|
|
||||||
}
|
|
||||||
const now = nowIso()
|
|
||||||
const updated = await updateWorkerUser(worker.id, {
|
|
||||||
status,
|
|
||||||
worker_type: workerType,
|
|
||||||
level_id: levelId,
|
|
||||||
review_note:
|
|
||||||
status === 'rejected'
|
|
||||||
? freezeReason
|
|
||||||
: String((payload.reviewNote ?? payload.note ?? worker.review_note) || '').trim(),
|
|
||||||
frozen_reason: freezeReason,
|
|
||||||
frozen_at: status === 'rejected' ? now : worker.frozen_at,
|
|
||||||
session_version: normalizeSessionVersion(worker.session_version) + 1,
|
|
||||||
reviewed_at: now,
|
|
||||||
updated_at: now,
|
|
||||||
})
|
|
||||||
await revokeAllWorkerSessions(worker.id, now)
|
|
||||||
return { worker: mapWorkerUser(updated || worker) }
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function resetAdminWorkerPassword(
|
|
||||||
workerId: number | string,
|
|
||||||
payload: JsonObject = {},
|
|
||||||
) {
|
|
||||||
const worker = await getRequiredWorker(workerId)
|
|
||||||
const password = String(payload.password || payload.newPassword || '').trim()
|
|
||||||
if (!password) {
|
|
||||||
throw createHttpError('请输入新密码', {
|
|
||||||
statusCode: 400,
|
|
||||||
errorCode: 'worker_password_required',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
validateWorkerPassword(password)
|
|
||||||
const now = nowIso()
|
|
||||||
const updated = await updateWorkerPassword({
|
|
||||||
workerId: worker.id,
|
|
||||||
passwordHash: hashWorkerPassword(password),
|
|
||||||
sessionVersion: normalizeSessionVersion(worker.session_version) + 1,
|
|
||||||
now,
|
|
||||||
})
|
|
||||||
await revokeAllWorkerSessions(worker.id, now)
|
|
||||||
return { worker: mapWorkerUser(updated || worker), reloginRequired: true }
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function assignAdminWorkOrderToWorker(
|
export async function assignAdminWorkOrderToWorker(
|
||||||
workOrderId: number | string,
|
workOrderId: number | string,
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
import {
|
||||||
|
countTimeoutEventsByWorkerIds,
|
||||||
|
getWorkerLevelById,
|
||||||
|
listWorkerUsers,
|
||||||
|
revokeAllWorkerSessions,
|
||||||
|
updateWorkerPassword,
|
||||||
|
updateWorkerUser,
|
||||||
|
} from '../../repositories/worker-platform/index.js'
|
||||||
|
import type { JsonObject } from '../../types/json.js'
|
||||||
|
import { createHttpError } from '../../utils/http.js'
|
||||||
|
import { nowIso } from '../../utils/time.js'
|
||||||
|
import { normalizePage, normalizePageSize } from '../admin/admin-query-utils.js'
|
||||||
|
import {
|
||||||
|
hashWorkerPassword,
|
||||||
|
mapWorkerUser,
|
||||||
|
normalizeOptionalId,
|
||||||
|
normalizeReviewStatus,
|
||||||
|
normalizeSessionVersion,
|
||||||
|
normalizeWorkerFreezeReason,
|
||||||
|
normalizeWorkerType,
|
||||||
|
validateWorkerPassword,
|
||||||
|
} from './mappers.js'
|
||||||
|
import { ensureWorkerPlatformDefaults } from './worker-platform-defaults.js'
|
||||||
|
import { getRequiredWorker } from './worker-session-context-service.js'
|
||||||
|
|
||||||
|
export async function listAdminWorkerUsers(query: JsonObject = {}) {
|
||||||
|
const page = normalizePage(query.page)
|
||||||
|
const pageSize = normalizePageSize(query.pageSize)
|
||||||
|
const workerId = normalizeOptionalId(query.workerId ?? query.worker_id) || 0
|
||||||
|
const { items, total } = await listWorkerUsers({
|
||||||
|
page,
|
||||||
|
pageSize,
|
||||||
|
workerId,
|
||||||
|
status: String(query.status || '').trim(),
|
||||||
|
keyword: String(query.keyword || '').trim(),
|
||||||
|
workerType: String(query.workerType || query.worker_type || '').trim(),
|
||||||
|
})
|
||||||
|
const timeoutCounts = await countTimeoutEventsByWorkerIds(items.map((item) => Number(item.id)))
|
||||||
|
return {
|
||||||
|
items: items.map((item) => ({
|
||||||
|
...mapWorkerUser(item),
|
||||||
|
timeoutOrderCount: timeoutCounts.get(Number(item.id)) || 0,
|
||||||
|
})),
|
||||||
|
pagination: { page, pageSize, total },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function reviewAdminWorkerUser(workerId: number | string, payload: JsonObject = {}) {
|
||||||
|
const worker = await getRequiredWorker(workerId)
|
||||||
|
const status = normalizeReviewStatus(payload.status)
|
||||||
|
const freezeReason =
|
||||||
|
status === 'rejected'
|
||||||
|
? normalizeWorkerFreezeReason(payload.freezeReason ?? payload.freeze_reason)
|
||||||
|
: worker.frozen_reason || ''
|
||||||
|
const workerType = normalizeWorkerType(payload.workerType ?? payload.worker_type)
|
||||||
|
const requestedLevelId = normalizeOptionalId(payload.levelId)
|
||||||
|
let levelId = worker.level_id || null
|
||||||
|
if (requestedLevelId) {
|
||||||
|
const level = await getWorkerLevelById(requestedLevelId)
|
||||||
|
if (!level) {
|
||||||
|
throw createHttpError('接单等级不存在', {
|
||||||
|
statusCode: 404,
|
||||||
|
errorCode: 'worker_level_not_found',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
levelId = Number(level.id)
|
||||||
|
}
|
||||||
|
if (!levelId) {
|
||||||
|
levelId = (await ensureWorkerPlatformDefaults()).level?.id || null
|
||||||
|
}
|
||||||
|
const now = nowIso()
|
||||||
|
const updated = await updateWorkerUser(worker.id, {
|
||||||
|
status,
|
||||||
|
worker_type: workerType,
|
||||||
|
level_id: levelId,
|
||||||
|
review_note:
|
||||||
|
status === 'rejected'
|
||||||
|
? freezeReason
|
||||||
|
: String((payload.reviewNote ?? payload.note ?? worker.review_note) || '').trim(),
|
||||||
|
frozen_reason: freezeReason,
|
||||||
|
frozen_at: status === 'rejected' ? now : worker.frozen_at,
|
||||||
|
session_version: normalizeSessionVersion(worker.session_version) + 1,
|
||||||
|
reviewed_at: now,
|
||||||
|
updated_at: now,
|
||||||
|
})
|
||||||
|
await revokeAllWorkerSessions(worker.id, now)
|
||||||
|
return { worker: mapWorkerUser(updated || worker) }
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function resetAdminWorkerPassword(
|
||||||
|
workerId: number | string,
|
||||||
|
payload: JsonObject = {},
|
||||||
|
) {
|
||||||
|
const worker = await getRequiredWorker(workerId)
|
||||||
|
const password = String(payload.password || payload.newPassword || '').trim()
|
||||||
|
if (!password) {
|
||||||
|
throw createHttpError('请输入新密码', {
|
||||||
|
statusCode: 400,
|
||||||
|
errorCode: 'worker_password_required',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
validateWorkerPassword(password)
|
||||||
|
const now = nowIso()
|
||||||
|
const updated = await updateWorkerPassword({
|
||||||
|
workerId: worker.id,
|
||||||
|
passwordHash: hashWorkerPassword(password),
|
||||||
|
sessionVersion: normalizeSessionVersion(worker.session_version) + 1,
|
||||||
|
now,
|
||||||
|
})
|
||||||
|
await revokeAllWorkerSessions(worker.id, now)
|
||||||
|
return { worker: mapWorkerUser(updated || worker), reloginRequired: true }
|
||||||
|
}
|
||||||
@@ -24,6 +24,7 @@ export * from './admin-worker-finance-service.js'
|
|||||||
export * from './admin-worker-catalog-service.js'
|
export * from './admin-worker-catalog-service.js'
|
||||||
export * from './admin-kuaishou-match-service.js'
|
export * from './admin-kuaishou-match-service.js'
|
||||||
export * from './admin-worker-config-service.js'
|
export * from './admin-worker-config-service.js'
|
||||||
|
export * from './admin-worker-user-service.js'
|
||||||
export * from './worker-product-match-config-service.js'
|
export * from './worker-product-match-config-service.js'
|
||||||
export * from './worker-announcement-config-service.js'
|
export * from './worker-announcement-config-service.js'
|
||||||
export * from './worker-hall-config-service.js'
|
export * from './worker-hall-config-service.js'
|
||||||
|
|||||||
Reference in New Issue
Block a user