更新
This commit is contained in:
@@ -185,6 +185,7 @@ class PrescriptionLogic
|
||||
'bags_per_dose' => isset($raw['bags_per_dose']) ? (int) $raw['bags_per_dose'] : 1,
|
||||
'times_per_day' => (int) ($raw['times_per_day'] ?? 3),
|
||||
'usage_days' => (int) ($raw['usage_days'] ?? 7),
|
||||
'prescription_name' => trim((string) ($raw['prescription_name'] ?? '')),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -2693,6 +2693,36 @@ class PrescriptionOrderLogic
|
||||
return $pathSegments === [] ? '' : implode(';', $pathSegments);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出用:服务套餐(与列表/详情 formatServicePackage 同口径,按 dict_data type_value=server_order 解析)
|
||||
* 入参可能是逗号分隔字符串或数组;空串返回空,避免 Excel 显示「—」占位。
|
||||
*
|
||||
* @param mixed $value zyt_tcm_prescription_order.service_package
|
||||
* @param array<string, string> $packageNameByValue dict_data server_order value=>name 字典缓存
|
||||
*/
|
||||
public static function formatServicePackageForExport($value, array $packageNameByValue): string
|
||||
{
|
||||
if ($value === null || $value === '' || $value === false) {
|
||||
return '';
|
||||
}
|
||||
$items = [];
|
||||
if (\is_array($value)) {
|
||||
$items = $value;
|
||||
} else {
|
||||
$items = explode(',', (string) $value);
|
||||
}
|
||||
$names = [];
|
||||
foreach ($items as $raw) {
|
||||
$key = trim((string) $raw);
|
||||
if ($key === '') {
|
||||
continue;
|
||||
}
|
||||
$names[] = (string) ($packageNameByValue[$key] ?? $packageNameByValue[(string) (int) $key] ?? $key);
|
||||
}
|
||||
|
||||
return $names === [] ? '' : implode('、', $names);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出用:药品形态(丸剂 / 饮片+代煎|自煎等)
|
||||
*
|
||||
@@ -2944,6 +2974,117 @@ class PrescriptionOrderLogic
|
||||
}
|
||||
}
|
||||
|
||||
// 服务套餐字典:与前端 formatServicePackage 同口径(dict_data type_value=server_order;只取启用项做兜底取原值)
|
||||
$packageNameByValue = [];
|
||||
$hasAnyPackage = false;
|
||||
foreach ($lists as $row) {
|
||||
$pkRaw = $row['service_package'] ?? '';
|
||||
if (\is_array($pkRaw)) {
|
||||
if ($pkRaw !== []) {
|
||||
$hasAnyPackage = true;
|
||||
break;
|
||||
}
|
||||
} elseif (trim((string) $pkRaw) !== '') {
|
||||
$hasAnyPackage = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($hasAnyPackage) {
|
||||
try {
|
||||
$packageNameByValue = DictData::where('type_value', 'server_order')->column('name', 'value');
|
||||
} catch (\Throwable) {
|
||||
$packageNameByValue = [];
|
||||
}
|
||||
}
|
||||
|
||||
// 签收时间批量解析:与 ExpressTrackingService::effectiveSignUnixFromTrackingDetail 同口径,
|
||||
// 取 GREATEST(sign_time, max 签收类轨迹 trace_time_stamp, 已签收主表时的最新轨迹 trace_time_stamp);
|
||||
// 与详情/业绩看板提成「签收时间」语义一致,避免历史数据 sign_time=0 但实际已签收时被当作「未签收」。
|
||||
/** @var array<string, int> $signTsByTracking trim 后的 tracking_number => Unix 秒 */
|
||||
$signTsByTracking = [];
|
||||
$trackingNumbers = [];
|
||||
foreach ($lists as $row) {
|
||||
$tn = trim((string) ($row['tracking_number'] ?? ''));
|
||||
if ($tn !== '') {
|
||||
$trackingNumbers[$tn] = true;
|
||||
}
|
||||
}
|
||||
$trackingNumbers = array_keys($trackingNumbers);
|
||||
if ($trackingNumbers !== []) {
|
||||
try {
|
||||
$etRows = Db::name('express_tracking')
|
||||
->whereIn('tracking_number', $trackingNumbers)
|
||||
->whereNull('delete_time')
|
||||
->field(['id', 'tracking_number', 'sign_time', 'current_state', 'is_signed'])
|
||||
->select()
|
||||
->toArray();
|
||||
$etIdToNum = [];
|
||||
$signedEtIds = [];
|
||||
$allEtIds = [];
|
||||
foreach ($etRows as $r) {
|
||||
$tn = trim((string) ($r['tracking_number'] ?? ''));
|
||||
$eid = (int) ($r['id'] ?? 0);
|
||||
if ($tn === '' || $eid <= 0) {
|
||||
continue;
|
||||
}
|
||||
$etIdToNum[$eid] = $tn;
|
||||
$allEtIds[] = $eid;
|
||||
$st = (int) ($r['sign_time'] ?? 0);
|
||||
if ($st > 0) {
|
||||
$signTsByTracking[$tn] = max($signTsByTracking[$tn] ?? 0, $st);
|
||||
}
|
||||
if ((string) ($r['current_state'] ?? '') === '3' || (int) ($r['is_signed'] ?? 0) === 1) {
|
||||
$signedEtIds[$eid] = true;
|
||||
}
|
||||
}
|
||||
if ($allEtIds !== []) {
|
||||
$sigCond = "(`status_code` IN ('3','301','302','304') "
|
||||
. "OR `status` LIKE '%签收%' "
|
||||
. "OR `trace_context` LIKE '%签收%' "
|
||||
. "OR `trace_context` LIKE '%妥投%' "
|
||||
. "OR `trace_context` LIKE '%已送达%' "
|
||||
. "OR `trace_context` LIKE '%本人签收%')";
|
||||
$sigTraces = Db::name('express_trace')
|
||||
->whereIn('tracking_id', $allEtIds)
|
||||
->where('trace_time_stamp', '>', 0)
|
||||
->whereRaw($sigCond)
|
||||
->fieldRaw('tracking_id, MAX(trace_time_stamp) AS max_ts')
|
||||
->group('tracking_id')
|
||||
->select()
|
||||
->toArray();
|
||||
foreach ($sigTraces as $t) {
|
||||
$eid = (int) ($t['tracking_id'] ?? 0);
|
||||
$tn = $etIdToNum[$eid] ?? '';
|
||||
$ts = (int) ($t['max_ts'] ?? 0);
|
||||
if ($tn !== '' && $ts > 0) {
|
||||
$signTsByTracking[$tn] = max($signTsByTracking[$tn] ?? 0, $ts);
|
||||
}
|
||||
}
|
||||
$signedIdList = array_keys($signedEtIds);
|
||||
if ($signedIdList !== []) {
|
||||
$anyTraces = Db::name('express_trace')
|
||||
->whereIn('tracking_id', $signedIdList)
|
||||
->where('trace_time_stamp', '>', 0)
|
||||
->fieldRaw('tracking_id, MAX(trace_time_stamp) AS max_ts')
|
||||
->group('tracking_id')
|
||||
->select()
|
||||
->toArray();
|
||||
foreach ($anyTraces as $t) {
|
||||
$eid = (int) ($t['tracking_id'] ?? 0);
|
||||
$tn = $etIdToNum[$eid] ?? '';
|
||||
$ts = (int) ($t['max_ts'] ?? 0);
|
||||
if ($tn !== '' && $ts > 0) {
|
||||
$signTsByTracking[$tn] = max($signTsByTracking[$tn] ?? 0, $ts);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
Log::warning('appendPrescriptionOrderListExportRows resolve sign_time failed: ' . $e->getMessage());
|
||||
$signTsByTracking = [];
|
||||
}
|
||||
}
|
||||
|
||||
$assistantDeptCache = [];
|
||||
|
||||
foreach ($lists as &$item) {
|
||||
@@ -2982,6 +3123,10 @@ class PrescriptionOrderLogic
|
||||
}
|
||||
|
||||
$item['export_medication_form'] = self::formatMedicationFormForExport(\is_array($rx) ? $rx : []);
|
||||
$item['export_service_package'] = self::formatServicePackageForExport(
|
||||
$item['service_package'] ?? '',
|
||||
$packageNameByValue
|
||||
);
|
||||
|
||||
$item['export_channel'] = (string) ($item['service_channel'] ?? '');
|
||||
$apptIdResolved = $resolvedApptIdByPoId[$poId] ?? 0;
|
||||
@@ -3000,6 +3145,9 @@ class PrescriptionOrderLogic
|
||||
$item['export_agency_collect'] = number_format(round($amt - $paid, 2), 2, '.', '');
|
||||
|
||||
$item['export_tracking_number'] = (string) ($item['tracking_number'] ?? '');
|
||||
$tnTrim = trim((string) ($item['tracking_number'] ?? ''));
|
||||
$signTs = $tnTrim !== '' ? (int) ($signTsByTracking[$tnTrim] ?? 0) : 0;
|
||||
$item['export_sign_time'] = $signTs > 0 ? date('Y-m-d', $signTs) : '';
|
||||
$isGc = trim((string) ($item['gancao_reciperl_order_no'] ?? '')) !== '';
|
||||
$item['export_supply_mode'] = $isGc ? '甘草' : '自营';
|
||||
// 「处方成本」列:与列表/详情一致,取订单 internal_cost(含「测试价格」预报价写入;甘草/自营均导出)
|
||||
|
||||
Reference in New Issue
Block a user