Files
zyt/diagnose_gancao_payload.php
T
2026-04-15 16:31:25 +08:00

217 lines
6.8 KiB
PHP

<?php
/**
* 甘草负载诊断脚本
* 用于检查构建的 API 负载中是否有数组转字符串的问题
*/
require __DIR__ . '/server/vendor/autoload.php';
$app = new think\App();
$app->initialize();
echo "=== 甘草负载诊断 ===\n\n";
// 模拟处方数据
$rx = [
'id' => 1,
'diagnosis_id' => 1,
'patient_name' => '测试患者',
'age' => 30,
'gender' => 0,
'phone' => '13800138000',
'clinical_diagnosis' => '中医辨证论治',
'doctor_name' => '测试医生',
'doctor_phone' => '13900139000',
'usage_time' => '饭后半小时服用',
'dietary_taboo' => '忌辛辣',
'usage_way' => '口服',
'usage_instruction' => '温水送服',
'usage_notes' => '注意休息',
'dose_count' => 7,
'herbs' => [
[
'name' => '当归',
'dosage' => 10,
'gc_id' => 1001,
'brief' => '',
],
[
'name' => '黄芪',
'dosage' => 15,
'gc_id' => 1002,
'brief' => '',
],
],
];
// 模拟订单数据
$order = [
'id' => 1,
'recipient_name' => '测试患者',
'recipient_phone' => '13800138000',
'shipping_address' => '四川省成都市武侯区测试街道123号',
'remark_extra' => '测试备注',
];
echo "1. 测试配置读取:\n";
$config = think\facade\Config::get('gancao_scm', []);
$criticalFields = ['express_type', 'callback_url', 'cradle_store', 'df_id'];
foreach ($criticalFields as $field) {
$value = $config[$field] ?? null;
$type = gettype($value);
echo " - {$field}: {$type}";
if ($type === 'array') {
echo " ❌ 错误!这个字段不应该是数组\n";
echo " 值: " . json_encode($value, JSON_UNESCAPED_UNICODE) . "\n";
} else {
echo " ✓\n";
}
}
echo "\n2. 测试 buildPreviewPayload:\n";
try {
$token = 'test_token_' . time();
$previewPayload = \app\common\service\gancao\GancaoScmRecipelService::buildPreviewPayload($rx, $order, $token);
echo " ✓ buildPreviewPayload 成功\n";
echo " 字段数量: " . count($previewPayload) . "\n";
// 检查每个字段的类型
echo "\n 检查字段类型:\n";
foreach ($previewPayload as $key => $value) {
$type = gettype($value);
echo " - {$key}: {$type}";
if ($type === 'array') {
echo " (包含 " . count($value) . " 个元素)";
// 检查数组内部是否有问题
$hasArrayValue = false;
foreach ($value as $subKey => $subValue) {
if (is_array($subValue) && !in_array($key, ['m_list', 'df101ext', 'df102ext', 'df103ext', 'df104ext'])) {
$hasArrayValue = true;
echo "\n ⚠️ 子字段 '{$subKey}' 是数组: " . json_encode($subValue, JSON_UNESCAPED_UNICODE);
}
}
}
echo "\n";
}
} catch (\Throwable $e) {
echo " ❌ 失败: " . $e->getMessage() . "\n";
echo " 文件: " . $e->getFile() . ":" . $e->getLine() . "\n";
}
echo "\n3. 测试 buildSubmitPayload:\n";
try {
$token = 'test_token_' . time();
$addrParts = \app\common\service\gancao\GancaoScmRecipelService::splitCnAddress($order['shipping_address']);
$appNo = 'PO' . $order['id'];
$submitPayload = \app\common\service\gancao\GancaoScmRecipelService::buildSubmitPayload(
$rx,
$order,
$token,
$addrParts,
$appNo
);
echo " ✓ buildSubmitPayload 成功\n";
echo " 字段数量: " . count($submitPayload) . "\n";
// 检查关键字段
echo "\n 检查关键字段:\n";
$keyFields = ['express_type', 'callback_url', 'app_order_no', 'cradle_store', 'express_to', 'patient', 'doctor', 'doct_advice'];
foreach ($keyFields as $field) {
if (!isset($submitPayload[$field])) {
echo " - {$field}: ❌ 缺失\n";
continue;
}
$value = $submitPayload[$field];
$type = gettype($value);
echo " - {$field}: {$type}";
if ($type === 'string') {
if (strlen($value) > 50) {
echo " (长度: " . strlen($value) . ")";
} else {
echo " = " . var_export($value, true);
}
} elseif ($type === 'array') {
echo " (包含 " . count($value) . " 个元素)";
// 检查数组内部
foreach ($value as $subKey => $subValue) {
$subType = gettype($subValue);
if ($subType === 'array') {
echo "\n ⚠️ 子字段 '{$subKey}' 是数组(可能有问题)";
}
}
}
echo "\n";
}
} catch (\Throwable $e) {
echo " ❌ 失败: " . $e->getMessage() . "\n";
echo " 文件: " . $e->getFile() . ":" . $e->getLine() . "\n";
}
echo "\n4. 测试 JSON 编码:\n";
try {
$token = 'test_token_' . time();
$addrParts = \app\common\service\gancao\GancaoScmRecipelService::splitCnAddress($order['shipping_address']);
$appNo = 'PO' . $order['id'];
$submitPayload = \app\common\service\gancao\GancaoScmRecipelService::buildSubmitPayload(
$rx,
$order,
$token,
$addrParts,
$appNo
);
$json = json_encode($submitPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($json === false) {
echo " ❌ JSON 编码失败: " . json_last_error_msg() . "\n";
} else {
echo " ✓ JSON 编码成功\n";
echo " 大小: " . strlen($json) . " 字节\n";
// 检查是否包含 "Array" 字符串
if (strpos($json, '"Array"') !== false) {
echo " ❌ 警告:JSON 中包含 'Array' 字符串,说明有数组被转换为字符串\n";
// 尝试找出是哪个字段
$decoded = json_decode($json, true);
echo "\n 查找包含 'Array' 的字段:\n";
array_walk_recursive($decoded, function($value, $key) {
if (is_string($value) && $value === 'Array') {
echo " - 字段 '{$key}' 的值是 'Array'\n";
}
});
} else {
echo " ✓ JSON 内容正常\n";
}
// 保存到文件以便检查
$filename = 'gancao_payload_' . date('YmdHis') . '.json';
file_put_contents($filename, json_encode($submitPayload, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
echo " 负载已保存到: {$filename}\n";
}
} catch (\Throwable $e) {
echo " ❌ 异常: " . $e->getMessage() . "\n";
echo " 文件: " . $e->getFile() . ":" . $e->getLine() . "\n";
echo " 堆栈:\n" . $e->getTraceAsString() . "\n";
}
echo "\n=== 诊断完成 ===\n";