使用NetSuite PHP Toolkit关闭销售订单报错:Invalid orderstatus reference key H
问题描述
我尝试用NetSuite PHP Toolkit关闭销售订单,最初只更新订单状态时收到「Invalid orderstatus reference key H」错误。后来添加了设置订单商品isClosed = true的逻辑,但还是报同样的错,不知道还需要做什么才能成功关闭订单。
尝试的代码
<?php $request = new GetRequest(); $request->baseRef = new RecordRef(); $request->baseRef->internalId = $internal_id; $request->baseRef->type = "salesOrder"; $getResponse = $service->get($request); if (!$getResponse->readResponse->status->isSuccess) { $this->updateTaskStatus($task_id, 'error'); $error = "Failed to close order, error message: "; $error .= print_r($getResponse->readResponse->status->statusDetail, true); $result = array("succeeded" => false, "error" => $error, "task_id" => $task_id, "so_id" => $internal_id); return $result; } else { $initial_so = $getResponse->readResponse->record; $so = new SalesOrder(); $so->internalId = $internal_id; $so->orderStatus = SalesOrderOrderStatus::_closed; $so->itemList = new SalesOrderItemList(); foreach($initial_so->itemList->item as $item) { $item->isClosed = true; $so->itemList->item[] = $item; } $so->itemList->replaceAll = false; $updateRequest = new UpdateRequest(); $updateRequest->record = $so; $updateResponse = $service->update($updateRequest); if(!$updateResponse->writeResponse->status->isSuccess) { $this->updateTaskStatus($task_id, 'error'); $error = "Failed to close order, error message: "; $error .= print_r($updateResponse->writeResponse->status->statusDetail, true); $result = array("succeeded" => false, "error" => $error, "task_id" => $task_id, "so_id" => $internal_id); return $result; } else { $result = array("succeeded" => true, "msg" => "Successfully closed order."); return $result; } }
解决方案
「Invalid orderstatus reference key H」错误的核心原因是直接修改orderStatus字段不符合NetSuite的业务规则——关闭销售订单必须通过专用的CloseTask操作,而非直接更新状态值。以下是具体修正方案:
1. 使用CloseTask执行关闭操作
NetSuite要求通过创建CloseTask记录来触发订单关闭流程,而非直接更新销售订单的orderStatus。替换原代码中的更新逻辑为以下内容:
// 获取订单成功后,创建CloseTask请求 $closeTask = new CloseTask(); $closeTask->record = new RecordRef(); $closeTask->record->internalId = $internal_id; $closeTask->record->type = "salesOrder"; // 执行关闭请求 $closeRequest = new AddRequest(); $closeRequest->record = $closeTask; $closeResponse = $service->add($closeRequest); // 处理响应 if (!$closeResponse->writeResponse->status->isSuccess) { $this->updateTaskStatus($task_id, 'error'); $error = "Failed to close order, error message: "; $error .= print_r($closeResponse->writeResponse->status->statusDetail, true); $result = array("succeeded" => false, "error" => $error, "task_id" => $task_id, "so_id" => $internal_id); return $result; } else { $result = array("succeeded" => true, "msg" => "Successfully closed order."); return $result; }
2. 确保订单满足关闭前置条件
如果使用CloseTask仍报错,需检查订单是否符合以下要求:
- 所有行项目的数量已全部完成/发货,无未履行的部分
- 订单无未处理的退款、退货或其他关联待办交易
- 当前角色拥有销售订单关闭的权限
- 订单未被系统锁定(如处于审批流程中)
3. 关闭部分行项目的处理(可选)
若只需关闭订单中的部分行项目,可在CloseTask中指定itemList:
$closeTask->itemList = new CloseTaskItemList(); $closeTask->itemList->replaceAll = false; foreach($initial_so->itemList->item as $item) { // 仅关闭特定行,比如内部ID为123的行 if ($item->internalId == 123) { $closeItem = new CloseTaskItem(); $closeItem->line = $item->line; $closeItem->isClosed = true; $closeTask->itemList->item[] = $closeItem; } }
内容的提问来源于stack exchange,提问作者joeybab3
相关产品推荐
相关产品推荐

