import type { Context } from '../utils/handler.js' import { guardMethod } from '../utils/method.js' import { fail, ok } from '../utils/http.js' import { readJson } from '../utils/request.js' import { prisma } from '../utils/prisma.js' import { withErrorBoundary } from '../utils/handler.js' import { ORDER_EVENT_TYPE, ORDER_STATE } from '../utils/order-state.js' import { bridgeFetchWithAuth } from '../utils/bridge-auth.js' type OrderCancelMainRequest = { supplierId?: string userId?: string orderId?: string mainOrderId?: string } type BridgeOrderResponse = { resultCode?: number message?: string } export default withErrorBoundary(async (request: Request, _context: Context) => { const methodResponse = guardMethod(request, ['POST']) if (methodResponse) return methodResponse const body = await readJson(request) const supplierId = String(body.supplierId || '').trim() const userId = String(body.userId || '').trim() const mainOrderId = String(body.mainOrderId || body.orderId || '').trim() const orderId = String(body.orderId || mainOrderId).trim() if (!supplierId || !userId || !mainOrderId) { return fail('供应商、用户或订单信息不能为空') } const order = await prisma.supplierOrderMain.findFirst({ where: { orderId: mainOrderId, supplierId, userId, deleted: 0 } }) if (!order) { return fail('主单不存在或已取消', 404, 'MAIN_ORDER_NOT_FOUND') } if (order.orderState !== ORDER_STATE.PENDING_PAY) { return fail('已支付主单不能通过未支付取消接口取消', 400, 'MAIN_ORDER_ALREADY_PAID') } await prisma.$transaction(async tx => { await tx.supplierOrderMain.update({ where: { orderId: mainOrderId }, data: { orderState: ORDER_STATE.CANCELLED, updateTime: new Date() } }) await tx.supplierOrderSub.updateMany({ where: { mainOrderId, supplierId, userId, deleted: 0 }, data: { orderState: ORDER_STATE.CANCELLED, updateTime: new Date() } }) }) const { response: bridgeResponse, payload: bridgePayload } = await bridgeFetchWithAuth( supplierId, '/pointOrder/pushOrderInfoMsg', { orderType: ORDER_EVENT_TYPE.CANCEL_MAIN, orderId, mainOrderId, userId, time: Date.now() } ) if (!bridgeResponse.ok || bridgePayload.resultCode !== 0) { return fail(bridgePayload.message || '取消主单推送失败', 502, 'BRIDGE_CANCEL_MAIN_FAILED') } return ok({ supplierId, orderType: ORDER_EVENT_TYPE.CANCEL_MAIN, orderId, mainOrderId, userId }) })