diff --git a/app/Http/Controllers/Business/Pages.php b/app/Http/Controllers/Business/Pages.php index ab717354..cccf5c62 100644 --- a/app/Http/Controllers/Business/Pages.php +++ b/app/Http/Controllers/Business/Pages.php @@ -281,12 +281,19 @@ class Pages extends Controller $rules['差额=直营补贴款(订单退款已冲回)'] = $jingxiSubsidyGuard . ' AND ABS(COALESCE(refund_amount, 0)) >= 0.005'; // 京东「索菲亚客厅 / 办公 / 书房」「亿家达全屋」「朴美家居」负差额:订单实付(聚水潭买家实付) - // 口径包含商家承担优惠(店铺东券/单品折扣/调价优惠等)与以旧换新国补——已用京东「营销对账」 - // 导出逐单核实(索菲亚客厅/办公 131/131 对平;书房/亿家达全屋/朴美 40 单同口径,差额≈商家承担优惠合计)。 + // 口径包含商家承担优惠(店铺东券/单品折扣/调价优惠等);差额里含国补的单再并上以旧换新国补。 + // 已用京东「营销对账」导出逐单核实(索菲亚客厅/办公 131 单 + 书房/亿家达全屋/朴美 40 单)。 + // 含国补判定:聚水潭应付(主单优先 pay_amount)− 账单收入 > 0.005——该差额恰等于营销对账里 + // 未计入聚水潭优惠金额的国补等补贴类金额(171 单对照:70 个含国补单全部命中;仅办公 6 月 + // 3544492014564334 的「折上折补贴」7 元属非国补但会被归入,核对记录见营销对账核验)。 $jdSofiaGuard = "platform = '京东账单' AND (store_name LIKE '京东-索菲亚客厅%' OR store_name LIKE '京东-索菲亚办公%'" . " OR store_name LIKE '京东-索菲亚书房%' OR store_name LIKE '京东-亿家达全屋%' OR store_name LIKE '京东-朴美家居%')" . ' AND ' . $effective . ' < -0.005'; - $rules['差额=订单实付包含商家承担优惠和以旧换新国补'] = $jdSofiaGuard; + $jdSofiaPay = 'COALESCE((SELECT COALESCE(MAX(CASE WHEN o.link_o_id IS NULL OR o.link_o_id = 0 THEN o.pay_amount END),' + . ' MAX(o.pay_amount)) FROM ops_jst_orders o WHERE o.so_id = store_receipt_order_match_rows.online_order_no), 0)'; + $jdSofiaGuobu = '(' . $jdSofiaPay . ' - COALESCE(income_amount, 0)) > 0.005'; + $rules['差额=订单实付包含商家承担优惠和以旧换新国补'] = $jdSofiaGuard . ' AND ' . $jdSofiaGuobu; + $rules['差额=订单实付包含商家承担优惠'] = $jdSofiaGuard . ' AND NOT (' . $jdSofiaGuobu . ')'; $rules[$label . '未减冲减'] = "match_status = '已匹配' AND ABS(COALESCE($column, 0) - (COALESCE(income_amount, 0) + COALESCE(discount_amount, 0))) < 0.005"; $rules[$label . '未减优惠'] = "match_status = '已匹配' AND ABS(COALESCE($column, 0) - (COALESCE(income_amount, 0) + COALESCE(offset_amount, 0))) < 0.005"; $rules[$label . '未减优惠和冲减'] = "match_status = '已匹配' AND ABS(COALESCE($column, 0) - COALESCE(income_amount, 0)) < 0.005"; @@ -326,6 +333,32 @@ class Pages extends Controller return $conditions; } + /** + * 该单的聚水潭应付(主单优先 pay_amount)是否大于账单收入(= 含国补/补贴类差额的口径)。 + * + * 与 receiptDifferenceRemarkConditions() 里的聚水潭应付款子查询同口径;按单号缓存应付金额, + * 页面渲染与导出逐行调用时不会对同一单重复查询。 + */ + private static function receiptJdSubsidyPayExceedsIncome(string $orderNo, float $income): bool + { + static $payCache = []; + $orderNo = trim($orderNo); + if ($orderNo === '') { + return false; + } + + if (! array_key_exists($orderNo, $payCache)) { + $row = DB::connection((string) config('upstream_mirrors.connection', 'business_mirror')) + ->table('ops_jst_orders') + ->where('so_id', $orderNo) + ->selectRaw('COALESCE(MAX(CASE WHEN link_o_id IS NULL OR link_o_id = 0 THEN pay_amount END), MAX(pay_amount)) as pay') + ->first(); + $payCache[$orderNo] = (float) ($row->pay ?? 0); + } + + return ($payCache[$orderNo] - $income) > 0.005; + } + /** 单行的「差额异常备注」(与筛选条件同一套口径,页面与导出共用)。 */ private static function receiptDifferenceRemark(object $row): ?string { @@ -381,14 +414,16 @@ class Pages extends Controller : '差额=直营补贴款(待开票结算)'; } // 京东「索菲亚客厅 / 办公 / 书房」「亿家达全屋」「朴美家居」负差额:订单实付口径包含商家承担 - // 优惠和以旧换新国补(营销对账已逐单核实)。 + // 优惠;含国补(聚水潭应付−账单收入>0.005,与下方条件同口径)的再并上以旧换新国补(营销对账已逐单核实)。 if (($row->platform ?? '') === '京东账单' && $difference < -0.005 && (str_starts_with((string) ($row->store_name ?? ''), '京东-索菲亚客厅') || str_starts_with((string) ($row->store_name ?? ''), '京东-索菲亚办公') || str_starts_with((string) ($row->store_name ?? ''), '京东-索菲亚书房') || str_starts_with((string) ($row->store_name ?? ''), '京东-亿家达全屋') || str_starts_with((string) ($row->store_name ?? ''), '京东-朴美家居'))) { - return '差额=订单实付包含商家承担优惠和以旧换新国补'; + return self::receiptJdSubsidyPayExceedsIncome((string) ($row->online_order_no ?? ''), (float) $income) + ? '差额=订单实付包含商家承担优惠和以旧换新国补' + : '差额=订单实付包含商家承担优惠'; } if (abs($product - ($income + $discount)) < 0.005) { return $label . '未减冲减'; diff --git a/config/business_navigation.php b/config/business_navigation.php index c0ba5178..e98b2f64 100644 --- a/config/business_navigation.php +++ b/config/business_navigation.php @@ -807,7 +807,7 @@ $navigation = [ 'directory' => [ 'icon' => 'receipt_long', 'status' => '共享镜像', - 'description' => '覆盖店铺收款账户账单各平台页签(总账备注=订单收入),按「店铺 + 订单号」匹配订单侧商品金额与订单实付金额;一行 = 一个店铺的一个订单,商品金额只挂一次。「商品金额」只取主单(拆单子单不参与,整单没有主单时退化为取全部行),并排除虚拟条码(X0000x:信誉订单 / 虚拟订单)明细行;「订单实付金额」取订单级实付(拆单取主单)再减去虚拟条码行实付。「优惠金额」「冲减金额」另取总账备注=优惠收入 / 冲减收入的账单金额,不计入收入金额;「退款金额」另取总账备注=退款的账单金额,只单独列示,不计入收入金额、也不参与差额;「种菜金额」是订单号在种菜明细表或聚水潭订单标签明细(是否种菜订单=是)任意一边出现过时,该订单的收入金额(两个条件是或的关系),只是收入金额里的一部分,不参与差额;差额=(收入金额+优惠金额+冲减金额)−订单实付金额,匹配状态与差额异常备注同样按订单实付金额判定,未匹配到订单实付金额的行按订单实付金额=0 计入差额,只反映真正对不上的部分。挂不到订单行的优惠/冲减会补成一行(收入/商品留空)。「差额异常备注」只说明差额为什么产生,按顺序自动判定:订单实付未匹配(未匹配到订单实付金额,具体原因看「未匹配原因」列);订单实付取数为0(种菜)(订单实付=0 且是种菜单)、订单实付取数为0(订单实付=0 但不是种菜单)、订单实付未减冲减(订单实付=收入+优惠 → 差额=冲减金额)、订单实付未减优惠(订单实付=收入+冲减 → 差额=优惠金额)、订单实付未减优惠和冲减(订单实付=收入 → 差额=优惠+冲减)、订单实付含已退款部分(仅抖音负差额:聚水潭退款单/取消子单金额≈差额,或退款合计+账单退款净额≈实付−收入,或整单全退(退款合计≈实付)对上才标注)、订单实付未减联合营销费(仅得物负差额:联合营销费未让利尾数对上才标注)、订单实付取供货价(仅京喜正差额:差额=该单直营服务费(供货模式净收)时标注)、差额=直营补贴款(待开票结算)(仅京喜账单·出类拔萃店负差额且无退款:京东直营补贴款待开票结算时标注)、差额=直营补贴款(订单退款已冲回)(同店负差额但订单已退款:补贴款已随退款冲回)、差额=订单实付包含商家承担优惠和以旧换新国补(仅京东账单·索菲亚客厅/办公/书房、亿家达全屋、朴美家居店负差额:差额为商家承担优惠(店铺东券/单品折扣等)与以旧换新国补之和,已用营销对账逐单核实);都不满足则留空。「未匹配原因」单独一列,取值:账单无单号 / 账单无单号(采销收款)/ 单号格式异常 / 订单表无此单 / 1688采销收款(非销售单)/ 订单无实付金额 / 无收款账单(「采销收款」两档专指「支付宝-1688采销专用」账户:该账户收的是采销/供货结算款,不是店铺销售单收款,不按丢单处理)。', + 'description' => '覆盖店铺收款账户账单各平台页签(总账备注=订单收入),按「店铺 + 订单号」匹配订单侧商品金额与订单实付金额;一行 = 一个店铺的一个订单,商品金额只挂一次。「商品金额」只取主单(拆单子单不参与,整单没有主单时退化为取全部行),并排除虚拟条码(X0000x:信誉订单 / 虚拟订单)明细行;「订单实付金额」取订单级实付(拆单取主单)再减去虚拟条码行实付。「优惠金额」「冲减金额」另取总账备注=优惠收入 / 冲减收入的账单金额,不计入收入金额;「退款金额」另取总账备注=退款的账单金额,只单独列示,不计入收入金额、也不参与差额;「种菜金额」是订单号在种菜明细表或聚水潭订单标签明细(是否种菜订单=是)任意一边出现过时,该订单的收入金额(两个条件是或的关系),只是收入金额里的一部分,不参与差额;差额=(收入金额+优惠金额+冲减金额)−订单实付金额,匹配状态与差额异常备注同样按订单实付金额判定,未匹配到订单实付金额的行按订单实付金额=0 计入差额,只反映真正对不上的部分。挂不到订单行的优惠/冲减会补成一行(收入/商品留空)。「差额异常备注」只说明差额为什么产生,按顺序自动判定:订单实付未匹配(未匹配到订单实付金额,具体原因看「未匹配原因」列);订单实付取数为0(种菜)(订单实付=0 且是种菜单)、订单实付取数为0(订单实付=0 但不是种菜单)、订单实付未减冲减(订单实付=收入+优惠 → 差额=冲减金额)、订单实付未减优惠(订单实付=收入+冲减 → 差额=优惠金额)、订单实付未减优惠和冲减(订单实付=收入 → 差额=优惠+冲减)、订单实付含已退款部分(仅抖音负差额:聚水潭退款单/取消子单金额≈差额,或退款合计+账单退款净额≈实付−收入,或整单全退(退款合计≈实付)对上才标注)、订单实付未减联合营销费(仅得物负差额:联合营销费未让利尾数对上才标注)、订单实付取供货价(仅京喜正差额:差额=该单直营服务费(供货模式净收)时标注)、差额=直营补贴款(待开票结算)(仅京喜账单·出类拔萃店负差额且无退款:京东直营补贴款待开票结算时标注)、差额=直营补贴款(订单退款已冲回)(同店负差额但订单已退款:补贴款已随退款冲回)、差额=订单实付包含商家承担优惠和以旧换新国补(仅京东账单·索菲亚客厅/办公/书房、亿家达全屋、朴美家居店负差额、且该单含国补(聚水潭应付−账单收入>0):差额为商家承担优惠(店铺东券/单品折扣等)与以旧换新国补之和,已用营销对账逐单核实)、差额=订单实付包含商家承担优惠(同店负差额但不含国补的单:差额即商家承担优惠);都不满足则留空。「未匹配原因」单独一列,取值:账单无单号 / 账单无单号(采销收款)/ 单号格式异常 / 订单表无此单 / 1688采销收款(非销售单)/ 订单无实付金额 / 无收款账单(「采销收款」两档专指「支付宝-1688采销专用」账户:该账户收的是采销/供货结算款,不是店铺销售单收款,不按丢单处理)。', 'empty' => '店铺收款匹配订单明细尚未同步,请先执行 store-receipt:order-match:sync。', 'fields' => [ ['name' => 'platform', 'label' => '平台'],