set_node_id($sdf['node_id']) ->set_api_name($erpapiMethod) ->dispatch($sdf); echo '
';
print_r($rs);
echo '';
$this->assertTrue(true,$rs['msg']);
}
/**
* 为京东价保退款测试造订单并置为已发货(订单号 tid,平台 skuid item_id 对应子单 oid/sku_uuid)
* 依赖:node_id 对应 360buy 店铺,否则跳过
*/
private function create360buyPriceProtectOrderAndShip(string $nodeId, string $orderBn, string $platformSkuId): bool
{
$shop = app::get('ome')->model('shop')->dump(['node_id' => $nodeId], 'shop_id,shop_type');
if (!$shop || empty($shop['shop_id'])) {
return false;
}
$shopId = $shop['shop_id'];
$db = kernel::database();
$order = $db->selectrow(
'SELECT order_id FROM sdb_ome_orders WHERE order_bn = ' . $db->quote($orderBn) . ' AND shop_id = ' . $db->quote($shopId)
);
if ($order && !empty($order['order_id'])) {
$orderId = (int) $order['order_id'];
$db->exec('UPDATE sdb_ome_orders SET ship_status = \'1\', pay_status = \'1\', payed = 3, total_amount = 3, process_status = \'splited\' WHERE order_id = ' . $orderId);
$hasItem = $db->selectrow(
'SELECT 1 FROM sdb_ome_order_items oi INNER JOIN sdb_ome_order_objects oo ON oi.obj_id = oo.obj_id '
. 'WHERE oi.order_id = ' . $orderId . ' AND oi.shop_product_id = ' . $db->quote($platformSkuId) . ' AND oi.delete = \'false\' AND oo.delete = \'false\' LIMIT 1'
);
if (!$hasItem) {
$oid = '1012_jbp_' . $orderBn . '_' . $platformSkuId;
$skuUuid = 'jbp_uuid_' . $orderBn . '_' . $platformSkuId;
$db->exec(
"INSERT INTO sdb_ome_order_objects (order_id, obj_type, shop_goods_id, goods_id, quantity, price, amount, oid, sku_uuid, divide_order_fee, `delete`) "
. "VALUES ({$orderId}, 'goods', " . $db->quote($platformSkuId) . ", 0, 1, '3', '3', " . $db->quote($oid) . ", " . $db->quote($skuUuid) . ", '3', 'false')"
);
$objId = $db->lastinsertid();
if ($objId) {
$db->exec(
"INSERT INTO sdb_ome_order_items (order_id, obj_id, shop_goods_id, shop_product_id, product_id, bn, nums, sendnum, price, amount, `delete`) "
. "VALUES ({$orderId}, {$objId}, " . $db->quote($platformSkuId) . ", " . $db->quote($platformSkuId) . ", 0, " . $db->quote('TEST-JBP-' . $platformSkuId) . ", 1, 1, '3', '3', 'false')"
);
}
}
return true;
}
$createtime = time();
$db->exec(
"INSERT INTO sdb_ome_orders (order_bn, shop_id, shop_type, createtime, pay_status, ship_status, total_amount, payed, process_status, status, confirm, is_delivery) "
. "VALUES (" . $db->quote($orderBn) . ", " . $db->quote($shopId) . ", " . $db->quote($shop['shop_type'] ?? '360buy') . ", {$createtime}, '1', '1', '3', '3', 'splited', 'active', 'Y', 'Y')"
);
$orderId = $db->lastinsertid();
if (!$orderId) {
return false;
}
$oid = '1012_jbp_' . $orderBn . '_' . $platformSkuId;
$skuUuid = 'jbp_uuid_' . $orderBn . '_' . $platformSkuId;
$db->exec(
"INSERT INTO sdb_ome_order_objects (order_id, obj_type, shop_goods_id, goods_id, quantity, price, amount, oid, sku_uuid, divide_order_fee, `delete`) "
. "VALUES ({$orderId}, 'goods', " . $db->quote($platformSkuId) . ", 0, 1, '3', '3', " . $db->quote($oid) . ", " . $db->quote($skuUuid) . ", '3', 'false')"
);
$objId = $db->lastinsertid();
if (!$objId) {
return false;
}
$db->exec(
"INSERT INTO sdb_ome_order_items (order_id, obj_id, shop_goods_id, shop_product_id, product_id, bn, nums, sendnum, price, amount, `delete`) "
. "VALUES ({$orderId}, {$objId}, " . $db->quote($platformSkuId) . ", " . $db->quote($platformSkuId) . ", 0, " . $db->quote('TEST-JBP-' . $platformSkuId) . ", 1, 1, '3', '3', 'false')"
);
return true;
}
/**
* 京东价保退款:验证入参(refund_item_list 无 oid/sku_uuid)经 360buy 转换后能正确走价保逻辑
* 依赖:node_id 对应 360buy 店铺;测试前会造订单并置为已发货,便于通过 item_id 匹配回填 oid/sku_uuid
*/
public function test360buyPriceProtectRefundAdd(): void
{
set_time_limit(0);
ignore_user_abort(true);
@ini_set('memory_limit', '2048M');
$nodeId = '1272110034';
$orderBn = '3345225012691859';
$platformSkuId = '10172864876538';
$shop = app::get('ome')->model('shop')->dump(['node_id' => $nodeId], 'shop_id');
if (!$shop || empty($shop['shop_id'])) {
$this->markTestSkipped('需要 node_id=1272110034 的 360buy 店铺方可运行本测试');
return;
}
$this->create360buyPriceProtectOrderAndShip($nodeId, $orderBn, $platformSkuId);
$params = [
'status' => 'SUCCESS',
'to_node_id' => '1592150435',
'venderUndertakeAmount' => '',
'refund_id' => '34141299377',
'from_node_id' => '1272110034',
'attribute' => '',
'oid' => '',
'app_id' => 'ecos.ome',
'source_status' => '价保成功',
'node_id' => '1272110034',
'date' => '2026-02-02 15:17:40',
'sign' => 'D6D361DE8E47EAF1E2230126473F43CF',
'refund_fee' => '3.00',
'desc' => '价保服务',
'refund_item_list' => json_encode([
'return_item' => [
[
'price' => '',
'oid' => '',
'modified' => '',
'num' => 1,
'item_id' => '10172864876538',
'outer_id' => '',
],
],
]),
'created' => '2025-12-30 19:37:38',
'modified' => '',
'popPlatformCouponRateAmount' => '3.0',
'tid' => '3345225012691859',
'has_good_return' => 'false',
'method' => 'ome.aftersalev2.add',
'refund_type' => 'refund',
'tag_type' => '价保退款',
];
$sdf = $params;
$erpapiMethod = erpapi_router_mapping::rspServiceMapping('', $sdf['method'], $sdf['node_id']);
if (!$erpapiMethod) {
$erpapiMethod = $sdf['method'];
}
$rs = kernel::single('erpapi_router_response')
->set_node_id($sdf['node_id'])
->set_api_name($erpapiMethod)
->dispatch($sdf);
$this->assertArrayHasKey('rsp', $rs, '响应应包含 rsp');
$this->assertContains($rs['rsp'], ['succ', 'fail'], 'rsp 应为 succ 或 fail');
$this->assertArrayHasKey('msg', $rs, '响应应包含 msg');
$this->assertTrue(true, $rs['msg']);
}
}