Base path: /system/order
Authentication: RuoYi 管理后台 Bearer token
Permission: system:order:edit
Content-Type: application/json
沿用 AjaxResult:
{
"code": 200,
"msg": "操作成功",
"data": {}
}
业务校验、状态冲突或网关失败沿用项目约定返回非 200 的业务 code 与安全错误消息。前端不得只根据 HTTP 状态推断业务成功。
所有写操作必须携带弹窗打开时的四状态快照:
{
"expectedState": 2,
"expectedDeliveryStatus": 2,
"expectedPayStatus": 1,
"expectedAfterSaleStatus": 0,
"reason": "骑手端漏操作"
}
reason trim 后 1~200 字。expectedDeliveryStatus 可为 null,其他快照字段必填。
如果订单在上下文读取后被回调、骑手、定时任务或另一管理员更新:
{
"code": 500,
"msg": "订单状态已变化,请刷新后重试"
}
冲突请求不得产生订单、账单、积分、日志或推送副作用。
GET /system/order/{id}/status-context读取修改弹窗所需的最小数据和服务端能力。
Response:
{
"code": 200,
"data": {
"id": 123,
"ddId": "202608100001",
"type": 0,
"payType": "7",
"state": 2,
"deliveryStatus": 2,
"payStatus": 1,
"afterSaleStatus": 0,
"sdTime": null,
"riderAssigned": true,
"allowedOrderStates": [2],
"allowedDeliveryStatuses": [2, 3],
"canConfirmOfflinePayment": false,
"canConfirmOfflineRefund": false,
"canReconcileOmg": false,
"canRefundOmg": true,
"canConfirmManualOmgRefund": false,
"omgPaymentStatus": 1,
"manualRefundPending": false,
"refundUnknown": false
}
}
规则:
allowed* 至少包含当前值,终态只有当前值;allowedDeliveryStatuses=[];omgPaymentStatus=null 且所有 OMG 写能力为 false;PUT /system/order/{id}/statusAnnotations: @PreAuthorize(system:order:edit)、@RepeatSubmit
Request:
{
"expectedState": 2,
"expectedDeliveryStatus": 2,
"expectedPayStatus": 1,
"expectedAfterSaleStatus": 0,
"targetState": null,
"targetDeliveryStatus": 3,
"reason": "骑手已实际送达,客户端漏操作"
}
至少一个目标字段非空且与当前值不同。未提交的目标字段保持不变。
Success response: 返回最新状态上下文。
{
"code": 200,
"msg": "修改成功",
"data": {
"id": 123,
"state": 3,
"deliveryStatus": 3,
"payStatus": 1,
"afterSaleStatus": 0,
"sdTime": "2026-08-10 11:30:00"
}
}
targetState 只能是 0~4;targetDeliveryStatus 只能是 0~3;sdTime。POST /system/order/{id}/offline-payment/confirmRequest: Common snapshot fields only.
{
"expectedState": 2,
"expectedDeliveryStatus": null,
"expectedPayStatus": 0,
"expectedAfterSaleStatus": 0,
"reason": "门店确认已收到现金"
}
Allowed:
payType="1";payStatus=0;state 不是 3/4;afterSaleStatus=0。Result: 只把 payStatus 改为 1,不创建 OMG/历史在线支付流水,不自动完成订单。
POST /system/order/{id}/offline-refund/confirm此操作代表管理员已经在线下实际退回款项,前端必须先显示不可逆二次确认。
Request:
{
"expectedState": 1,
"expectedDeliveryStatus": null,
"expectedPayStatus": 1,
"expectedAfterSaleStatus": 0,
"reason": "门店无法履约,已现场退还现金"
}
Allowed:
payType="1";payStatus=1;state!=3;afterSaleStatus=0。Atomic result:
{
"state": 4,
"payStatus": 2,
"afterSaleStatus": 3
}
订单使用积分时调用现有幂等积分返还逻辑。已完成订单返回“已完成订单需结算冲正,本期不支持退款”。
POST /system/order/{id}/omg-payment/reconcileRequest: Common snapshot fields.
Allowed:
payType="7";payStatus=0;state!=4;Behavior:
reconcileByQuery(ddId, "admin");order.payStatus=1;Paid response:
{
"code": 200,
"msg": "OMG 支付核验成功",
"data": {
"payStatus": 1,
"reconciled": true
}
}
Still unpaid response:
{
"code": 200,
"msg": "OMG 尚未确认支付",
"data": {
"payStatus": 0,
"reconciled": false
}
}
金额/订单信息不一致返回错误并写系统核对日志,不向前端返回原始网关报文。
POST /system/order/{id}/omg-refund前端必须显示不可逆二次确认。
Request: Common snapshot fields.
Allowed:
payType="7";payStatus=1;state!=3;afterSaleStatus=0;{
"code": 200,
"msg": "退款成功",
"data": {
"outcome": "REFUNDED",
"state": 4,
"payStatus": 2,
"afterSaleStatus": 3
}
}
{
"code": 200,
"msg": "该支付方式需在 OMG 后台人工退款,订单暂保持已支付",
"data": {
"outcome": "MANUAL_PENDING",
"payStatus": 1,
"manualRefundPending": true
}
}
重复调用不重复新增人工待办。
{
"code": 500,
"msg": "OMG 退款结果待确认,请勿重复发起",
"data": {
"outcome": "UNKNOWN",
"payStatus": 1,
"refundUnknown": true
}
}
OMG 流水保持退款中,后续请求不得再次调用网关。
{
"code": 500,
"msg": "OMG 退款失败,请核对后重试",
"data": {
"outcome": "FAILED",
"payStatus": 1
}
}
错误消息不包含 HashKey、HashIV、完整响应或堆栈。
POST /system/order/{id}/omg-refund/manual-confirm此接口只用于支付方式不支持 OMG 退款 API、平台管理员已经在 OMG 后台核实退款完成的场景。前端必须进行不可逆二次确认。
Request: Common snapshot fields;reason 必须说明人工退款核实依据。
Allowed:
payType="7"、订单 payStatus=1、state!=3、afterSaleStatus=0;action=NULL, rtnCode=NULL 的未决人工待办;action=NULL, rtnCode=1 的人工完成记录。Behavior:
1→4→3,不调用网关;action=NULL, rtnCode=1 的人工退款完成记录,rtnMsg 标明管理员确认;state=4, payStatus=2, afterSaleStatus=3;Response:
{
"code": 200,
"msg": "已确认 OMG 人工退款完成",
"data": {
"outcome": "REFUNDED",
"state": 4,
"payStatus": 2,
"afterSaleStatus": 3,
"manualRefundPending": false
}
}
无待办、已完成订单、流水状态变化或重复确认均不得产生新的退款记录或业务副作用。
PUT /system/order继续保留历史非状态编辑能力,但请求含以下任意字段时拒绝:
statedeliveryStatuspayStatusafterSaleStatussdTimeResponse:
{
"code": 500,
"msg": "订单状态请使用状态专用操作"
}
旧 state=7/12、kefuState→state=5 等逻辑必须删除。
新状态接口 DTO 不声明并不得使用以下字段:
amount, userId, shId, mdId, food, freight, points,
payType, type, qsId, sdTime, payStatus, afterSaleStatus
其中 expectedPayStatus、expectedAfterSaleStatus 仅作为旧快照,不是目标值。服务端必须从数据库读取订单类型、支付类型、金额、骑手和业务标识。
每次实际改变数据的管理员操作写一条 operatorType=1 的同步订单日志,包含:
相同目标的幂等请求不重复写成功日志。OMG 补单/退款还保留现有 operatorType=0 系统资金日志。