更新
This commit is contained in:
@@ -560,6 +560,8 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn
|
||||
|
||||
$poIds = array_values(array_filter(array_map('intval', array_column($lists, 'id'))));
|
||||
$paidSumByPo = [];
|
||||
// 关联支付单数量:批量统计,避免后续逐行 count() 造成 N+1 查询(导出/大列表明显变慢)
|
||||
$linkCountByPo = [];
|
||||
if ($poIds !== []) {
|
||||
$links = PrescriptionOrderPayOrder::whereIn('prescription_order_id', $poIds)
|
||||
->field(['prescription_order_id', 'pay_order_id'])
|
||||
@@ -569,6 +571,9 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn
|
||||
foreach ($links as $l) {
|
||||
$poid = (int) ($l['prescription_order_id'] ?? 0);
|
||||
$oid = (int) ($l['pay_order_id'] ?? 0);
|
||||
if ($poid > 0) {
|
||||
$linkCountByPo[$poid] = ($linkCountByPo[$poid] ?? 0) + 1;
|
||||
}
|
||||
if ($poid > 0 && $oid > 0) {
|
||||
$byPo[$poid][] = $oid;
|
||||
}
|
||||
@@ -664,10 +669,7 @@ class PrescriptionOrderLists extends BaseAdminDataLists implements ListsSearchIn
|
||||
PrescriptionOrderLogic::maskInternalCostIfNeeded($item, $this->adminInfo);
|
||||
PrescriptionOrderLogic::maskRemarkExtraIfNeeded($item, $this->adminInfo);
|
||||
$pid = (int) ($item['id'] ?? 0);
|
||||
$item['linked_pay_order_count'] = (int) PrescriptionOrderPayOrder::where(
|
||||
'prescription_order_id',
|
||||
$pid
|
||||
)->count();
|
||||
$item['linked_pay_order_count'] = (int) ($linkCountByPo[$pid] ?? 0);
|
||||
$item['linked_pay_paid_total'] = $paidSumByPo[$pid] ?? 0.0;
|
||||
$item['deposit_min_amount'] = $depMin;
|
||||
$item['can_upload_gancao_reciperl'] = PrescriptionOrderLogic::canUploadGancaoRecipel(
|
||||
|
||||
@@ -5638,20 +5638,33 @@ class YejiStatsLogic
|
||||
*/
|
||||
private static function commissionSettlementExpressRowSignExpr(string $etTable, string $traceTable): string
|
||||
{
|
||||
$sigTraceCond = "`tr_sig`.`status_code` IN ('3','301','302','304') OR `tr_sig`.`status` LIKE '%签收%' "
|
||||
// 与 ExpressTrackingService::contextLooksSigned 对齐:
|
||||
// 正向「签收/妥投/送达/本人签收/已放在」(顺丰末端 status=送达、context=快件已放在…),
|
||||
// 先排除「准备签收/待签收/即将送达/预计」等「尚未签收」文案(含「签收」「送达」二字易误判)。
|
||||
$sigByCode = "`tr_sig`.`status_code` IN ('3','301','302','304')";
|
||||
$sigByText = "(`tr_sig`.`status` LIKE '%签收%' OR `tr_sig`.`status` LIKE '%送达%' "
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%签收%' OR `tr_sig`.`trace_context` LIKE '%妥投%' "
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%已送达%' OR `tr_sig`.`trace_context` LIKE '%本人签收%'";
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%送达%' OR `tr_sig`.`trace_context` LIKE '%本人签收%' "
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%已放在%')";
|
||||
$sigNotText = "(`tr_sig`.`trace_context` LIKE '%准备签收%' OR `tr_sig`.`trace_context` LIKE '%待签收%' "
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%等待签收%' OR `tr_sig`.`trace_context` LIKE '%即将送达%' "
|
||||
. "OR `tr_sig`.`trace_context` LIKE '%预计%')";
|
||||
$sigTraceCond = $sigByCode . ' OR (' . $sigByText . ' AND NOT ' . $sigNotText . ')';
|
||||
|
||||
return 'GREATEST('
|
||||
. 'IF(IFNULL(`et`.`sign_time`, 0) > 0, `et`.`sign_time`, 0), '
|
||||
. 'IFNULL((SELECT MAX(`tr_sig`.`trace_time_stamp`) FROM `' . $traceTable . '` `tr_sig` '
|
||||
// 与 effectiveSignUnixFromTrackingDetail 一致:轨迹时间最权威,sign_time 列仅兜底。
|
||||
// 用 COALESCE(NULLIF(...,0)) 实现「优先签收轨迹 → 已签收态最新轨迹 → sign_time 列」的取值顺序,
|
||||
// 避免历史同步写入 sign_time 的「拉取当天」把签收时间顶高(旧 GREATEST 会取最大值)。
|
||||
return 'COALESCE('
|
||||
. 'NULLIF((SELECT MAX(`tr_sig`.`trace_time_stamp`) FROM `' . $traceTable . '` `tr_sig` '
|
||||
. 'WHERE `tr_sig`.`tracking_id` = `et`.`id` AND IFNULL(`tr_sig`.`trace_time_stamp`, 0) > 0 AND ('
|
||||
. $sigTraceCond
|
||||
. ')), 0), '
|
||||
. 'IF((`et`.`current_state` = \'3\' OR IFNULL(`et`.`is_signed`, 0) = 1), '
|
||||
. 'NULLIF(IF((`et`.`current_state` = \'3\' OR IFNULL(`et`.`is_signed`, 0) = 1), '
|
||||
. 'IFNULL((SELECT MAX(`tr_any`.`trace_time_stamp`) FROM `' . $traceTable . '` `tr_any` '
|
||||
. 'WHERE `tr_any`.`tracking_id` = `et`.`id` AND IFNULL(`tr_any`.`trace_time_stamp`, 0) > 0), 0), '
|
||||
. '0)'
|
||||
. '0), 0), '
|
||||
. 'NULLIF(IF(IFNULL(`et`.`sign_time`, 0) > 0, `et`.`sign_time`, 0), 0), '
|
||||
. '0'
|
||||
. ')';
|
||||
}
|
||||
|
||||
|
||||
@@ -3150,7 +3150,9 @@ class PrescriptionOrderLogic
|
||||
}
|
||||
}
|
||||
|
||||
// 签收时间:与详情 logisticsTrace / 业绩提成同源;库内无轨迹时导出阶段补查快递100 并落库。
|
||||
// 签收时间:纯读物流库(express_tracking / express_trace),不在导出阶段发起任何快递100 HTTP。
|
||||
// 签收时间的落库由 `php think tcm:backfill-sign-time` 与 `express:auto-update` 定时任务负责,
|
||||
// 导出只读脚本/定时任务处理好的结果——避免逐单 HTTP 让导出变慢、耗时不可控。
|
||||
/** @var array<int, int> $signTsByPoId order_id => Unix 秒 */
|
||||
$signTsByPoId = [];
|
||||
if ($poIds !== []) {
|
||||
@@ -3171,24 +3173,6 @@ class PrescriptionOrderLogic
|
||||
Log::warning('appendPrescriptionOrderListExportRows batch sign_time failed: ' . $e->getMessage());
|
||||
$signTsByPoId = [];
|
||||
}
|
||||
|
||||
foreach ($lists as $row) {
|
||||
$oid = (int) ($row['id'] ?? 0);
|
||||
if ($oid <= 0 || (int) ($signTsByPoId[$oid] ?? 0) > 0) {
|
||||
continue;
|
||||
}
|
||||
if (trim((string) ($row['tracking_number'] ?? '')) === '') {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
$synced = ExpressTrackingService::syncSignUnixFromLogisticsForPrescriptionOrder($oid, true);
|
||||
if ($synced > 0) {
|
||||
$signTsByPoId[$oid] = $synced;
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
Log::warning('appendPrescriptionOrderListExportRows sync sign_time order ' . $oid . ': ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$firstVisitAssistantByDiag = self::batchFirstVisitAssistantNameByDiagnosis($diagIdList, $diagById);
|
||||
|
||||
Reference in New Issue
Block a user