217 lines
6.8 KiB
PHP
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";
|