diff --git a/app/Http/Controllers/Business/Pages.php b/app/Http/Controllers/Business/Pages.php index 5a445a7f..bff79fe9 100644 --- a/app/Http/Controllers/Business/Pages.php +++ b/app/Http/Controllers/Business/Pages.php @@ -238,11 +238,13 @@ class Pages extends Controller // 抖音「订单实付含已退款部分」:负差额能在聚水潭退款单/取消子单金额里对上 // (≈差额,或放宽口径 ≈实付−收入=差额+优惠+冲减)才标注。 // 结算后退款会叠在退款合计上(账单里已单独记「退款」):退款合计+账单退款净额≈实付−收入 同样命中。 + // 整单全退(退款合计≈实付)也视为命中:全退后收入只剩后续零星收款(如用户打款)。 $refundEvidence = self::receiptRefundEvidenceSql(); $differenceAbs = 'ABS(' . $effective . ')'; $refundHit = static fn (string $amount): string => 'CASE WHEN ' . $amount . ' > 0.005 THEN ABS(' . $amount . ' - ' . $differenceAbs . ') < 0.02 ELSE 0 END'; $refundGapHit = static fn (string $amount): string => 'CASE WHEN ' . $amount . ' > 0.005 THEN ABS(' . $amount . ' - (COALESCE(paid_amount, 0) - COALESCE(income_amount, 0))) < 0.02 ELSE 0 END'; $refundGapNetHit = static fn (string $amount): string => 'CASE WHEN ' . $amount . ' > 0.005 THEN ABS((' . $amount . ' + COALESCE(refund_amount, 0)) - (COALESCE(paid_amount, 0) - COALESCE(income_amount, 0))) < 0.02 ELSE 0 END'; + $refundFullHit = static fn (string $amount): string => 'CASE WHEN ' . $amount . ' > 0.005 THEN ABS(' . $amount . ' - COALESCE(paid_amount, 0)) < 0.02 ELSE 0 END'; $rules['订单实付含已退款部分'] = 'CASE WHEN (' . $refundEvidence['guard'] . ') THEN (' . $refundHit($refundEvidence['refund_sum']) . ' OR ' . $refundHit($refundEvidence['refund_max']) @@ -251,6 +253,7 @@ class Pages extends Controller . ' OR ' . $refundGapHit($refundEvidence['refund_max']) . ' OR ' . $refundGapHit($refundEvidence['cancelled_sum']) . ' OR ' . $refundGapNetHit($refundEvidence['refund_sum']) + . ' OR ' . $refundFullHit($refundEvidence['refund_sum']) . ') ELSE 0 END = 1'; // 京喜正差额:差额=直营服务费(京喜账单把直营服务费并入「货款(收)」再以费用行扣回, @@ -319,6 +322,7 @@ class Pages extends Controller // 抖音负差额:实付多出来的部分能在聚水潭退款单/取消子单金额里对上 // (≈差额,或放宽口径 ≈实付−收入=差额+优惠+冲减)→「订单实付含已退款部分」。 // 结算后退款会叠在退款合计上(账单里已单独记「退款」):退款合计+账单退款净额≈实付−收入 同样命中。 + // 整单全退(退款合计≈实付)也视为命中:全退后收入只剩后续零星收款(如用户打款)。 if (($row->platform ?? '') === '抖音' && $difference < 0) { $refundGap = (float) ($row->paid_amount ?? 0) - $income; $refunds = [$row->order_refund_sum ?? null, $row->order_refund_max ?? null, $row->order_cancelled_sum ?? null]; @@ -333,7 +337,9 @@ class Pages extends Controller } $refundSum = $row->order_refund_sum ?? null; $refundNet = (float) ($row->refund_amount ?? 0); - if ($refundSum !== null && (float) $refundSum > 0.005 && abs((float) $refundSum + $refundNet - $refundGap) < 0.02) { + $refundFull = (float) ($row->paid_amount ?? 0); + if ($refundSum !== null && (float) $refundSum > 0.005 + && (abs((float) $refundSum + $refundNet - $refundGap) < 0.02 || abs((float) $refundSum - $refundFull) < 0.02)) { return '订单实付含已退款部分'; } } diff --git a/config/business_navigation.php b/config/business_navigation.php index b405a889..dbaebc99 100644 --- a/config/business_navigation.php +++ b/config/business_navigation.php @@ -806,7 +806,7 @@ $navigation = [ 'directory' => [ 'icon' => 'receipt_long', 'status' => '共享镜像', - 'description' => '覆盖店铺收款账户账单各平台页签(总账备注=订单收入),按「店铺 + 订单号」匹配订单侧商品金额与订单实付金额;一行 = 一个店铺的一个订单,商品金额只挂一次。「商品金额」只取主单(拆单子单不参与,整单没有主单时退化为取全部行),并排除虚拟条码(X0000x:信誉订单 / 虚拟订单)明细行;「订单实付金额」取订单级实付(拆单取主单)再减去虚拟条码行实付。「优惠金额」「冲减金额」另取总账备注=优惠收入 / 冲减收入的账单金额,不计入收入金额;「退款金额」另取总账备注=退款的账单金额,只单独列示,不计入收入金额、也不参与差额;「种菜金额」是订单号在种菜明细表或聚水潭订单标签明细(是否种菜订单=是)任意一边出现过时,该订单的收入金额(两个条件是或的关系),只是收入金额里的一部分,不参与差额;差额=(收入金额+优惠金额+冲减金额)−订单实付金额,匹配状态与差额异常备注同样按订单实付金额判定,未匹配到订单实付金额的行按订单实付金额=0 计入差额,只反映真正对不上的部分。挂不到订单行的优惠/冲减会补成一行(收入/商品留空)。「差额异常备注」只说明差额为什么产生,按顺序自动判定:订单实付未匹配(未匹配到订单实付金额,具体原因看「未匹配原因」列);订单实付取数为0(种菜)(订单实付=0 且是种菜单)、订单实付取数为0(订单实付=0 但不是种菜单)、订单实付未减冲减(订单实付=收入+优惠 → 差额=冲减金额)、订单实付未减优惠(订单实付=收入+冲减 → 差额=优惠金额)、订单实付未减优惠和冲减(订单实付=收入 → 差额=优惠+冲减)、订单实付含已退款部分(仅抖音负差额:聚水潭退款单/取消子单金额≈差额,或退款合计+账单退款净额≈实付−收入对上才标注)、订单实付未减联合营销费(仅得物负差额:联合营销费未让利尾数对上才标注)、差额=直营服务费(已计销售费用)(仅京喜正差额);都不满足则留空。「未匹配原因」单独一列,取值:账单无单号 / 单号格式异常 / 订单表无此单 / 订单无实付金额 / 无收款账单。', + 'description' => '覆盖店铺收款账户账单各平台页签(总账备注=订单收入),按「店铺 + 订单号」匹配订单侧商品金额与订单实付金额;一行 = 一个店铺的一个订单,商品金额只挂一次。「商品金额」只取主单(拆单子单不参与,整单没有主单时退化为取全部行),并排除虚拟条码(X0000x:信誉订单 / 虚拟订单)明细行;「订单实付金额」取订单级实付(拆单取主单)再减去虚拟条码行实付。「优惠金额」「冲减金额」另取总账备注=优惠收入 / 冲减收入的账单金额,不计入收入金额;「退款金额」另取总账备注=退款的账单金额,只单独列示,不计入收入金额、也不参与差额;「种菜金额」是订单号在种菜明细表或聚水潭订单标签明细(是否种菜订单=是)任意一边出现过时,该订单的收入金额(两个条件是或的关系),只是收入金额里的一部分,不参与差额;差额=(收入金额+优惠金额+冲减金额)−订单实付金额,匹配状态与差额异常备注同样按订单实付金额判定,未匹配到订单实付金额的行按订单实付金额=0 计入差额,只反映真正对不上的部分。挂不到订单行的优惠/冲减会补成一行(收入/商品留空)。「差额异常备注」只说明差额为什么产生,按顺序自动判定:订单实付未匹配(未匹配到订单实付金额,具体原因看「未匹配原因」列);订单实付取数为0(种菜)(订单实付=0 且是种菜单)、订单实付取数为0(订单实付=0 但不是种菜单)、订单实付未减冲减(订单实付=收入+优惠 → 差额=冲减金额)、订单实付未减优惠(订单实付=收入+冲减 → 差额=优惠金额)、订单实付未减优惠和冲减(订单实付=收入 → 差额=优惠+冲减)、订单实付含已退款部分(仅抖音负差额:聚水潭退款单/取消子单金额≈差额,或退款合计+账单退款净额≈实付−收入,或整单全退(退款合计≈实付)对上才标注)、订单实付未减联合营销费(仅得物负差额:联合营销费未让利尾数对上才标注)、差额=直营服务费(已计销售费用)(仅京喜正差额);都不满足则留空。「未匹配原因」单独一列,取值:账单无单号 / 单号格式异常 / 订单表无此单 / 订单无实付金额 / 无收款账单。', 'empty' => '店铺收款匹配订单明细尚未同步,请先执行 store-receipt:order-match:sync。', 'fields' => [ ['name' => 'platform', 'label' => '平台'],