import type { Context } from '@netlify/functions' 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' type OrderCancelSubRequest = { supplierId?: string token?: string userId?: string orderId?: string mainOrderId?: string } type BridgeOrderResponse = { resultCode?: number message?: string } const normalizeBase = (base: string) => base.replace(/\/$/, '') 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 token = String(body.token || '').trim() const userId = String(body.userId || '').trim() const orderId = String(body.orderId || '').trim() if (!supplierId || !token || !userId || !orderId) { return fail('供应商、用户、授权或子单信息不能为空') } const apiBase = normalizeBase(process.env.POINTS_MALL_OPEN_API_BASE || '') if (!apiBase) { return fail('平台积分商城接口地址未配置', 500, 'OPEN_API_BASE_MISSING') } const subOrder = await prisma.supplierOrderSub.findFirst({ where: { orderId, supplierId, userId, deleted: 0 } }) if (!subOrder) { return fail('子单不存在或已取消', 404, 'SUB_ORDER_NOT_FOUND') } const mainOrderId = String(body.mainOrderId || subOrder.mainOrderId).trim() const bridgeResponse = await fetch(`${apiBase}/pointOrder/pushOrderInfoMsg`, { method: 'POST', headers: { 'Content-Type': 'application/json', token }, body: JSON.stringify({ supplierId, orderType: 3, orderId, mainOrderId, userId, time: Date.now(), token }) }) const bridgePayload = (await bridgeResponse.json().catch(() => ({}))) as BridgeOrderResponse if (!bridgeResponse.ok || bridgePayload.resultCode !== 0) { return fail(bridgePayload.message || '取消子单推送失败', 502, 'BRIDGE_CANCEL_SUB_FAILED') } await prisma.$transaction(async tx => { await tx.supplierOrderSub.update({ where: { orderId }, data: { deleted: 1, updateTime: new Date() } }) await tx.supplierOrderProduct.updateMany({ where: { subOrderId: orderId, deleted: 0 }, data: { deleted: 1 } }) }) return ok({ supplierId, orderType: 3, orderId, mainOrderId, userId }) })