Просмотр исходного кода

Merge branch 'redesign‌-260706' into dev

shish 11 часов назад
Родитель
Сommit
12064cf9ab

+ 2 - 0
app-ghs/controllers/RefundController.php

@@ -763,6 +763,8 @@ class RefundController extends BaseController
                         'orderSn' => $refundInfo->orderSn ?? '',
                         'sameDay' => intval($refundInfo->sameDay ?? 1),
                         'fundType' => intval($refundInfo->fundType ?? 0),
+                        'onlinePay' => intval($refundInfo->onlinePay ?? 0),
+                        'payWay' => intval($refundInfo->payWay ?? 0),
                         'refundPrice' => $refundInfo->refundPrice ?? 0,
                         'customId' => intval($order->customId ?? 0),
                         'customName' => $custom->name ?? ($order->customName ?? ''),

+ 9 - 0
app-hd/controllers/CgRefundController.php

@@ -237,6 +237,15 @@ class CgRefundController extends BaseController
         if (empty($refund)) {
             util::fail('没有退款信息');
         }
+        // 详情「返回方式」优先用售后单资金快照;历史单无字段时回落采购原单
+        $refundPayWay = $refund['payWay'] ?? ($refund->payWay ?? null);
+        $refundOnlinePay = $refund['onlinePay'] ?? ($refund->onlinePay ?? null);
+        if (($refundPayWay === null || $refundPayWay === '') && !empty($cg)) {
+            $refund['payWay'] = is_array($cg) ? ($cg['payWay'] ?? 0) : ($cg->payWay ?? 0);
+        }
+        if (($refundOnlinePay === null || $refundOnlinePay === '') && !empty($cg)) {
+            $refund['onlinePay'] = is_array($cg) ? ($cg['onlinePay'] ?? 0) : ($cg->onlinePay ?? 0);
+        }
         $orderSn = $refund['orderSn'] ?? '';
         $cgItemList = CgRefundItemClass::getAllByCondition(['orderSn' => $orderSn], null, '*');
         if (!empty($cgItemList)) {

+ 68 - 0
app-hd/controllers/OrderController.php

@@ -4,6 +4,9 @@ namespace hd\controllers;
 
 use bizHd\hb\classes\HbClass;
 use bizHd\hb\classes\HbScopeClass;
+use common\components\cloudPrintUtil;
+use common\components\deliverySlipPrintUtil;
+use common\components\greetingCardPrintUtil;
 use Yii;
 use biz\shop\classes\ShopExtClass;
 use biz\sj\services\MerchantExtendService;
@@ -1800,4 +1803,69 @@ class OrderController extends BaseController
             ->column();
     }
 
+    /**
+     * 链科云打印纸张类型列表
+     */
+    public function actionCloudPrintPaperTypes()
+    {
+        util::success(['list' => cloudPrintPaperSpec::listTypes()]);
+    }
+
+    /**
+     * 解析打印请求中的纸张参数
+     */
+    protected function parseCloudPrintPaperOptions()
+    {
+        $get = Yii::$app->request->get();
+        $options = [];
+        if (!empty($get['paperType'])) {
+            $options['paperType'] = $get['paperType'];
+        }
+        if (!empty($get['paperSize'])) {
+            $options['paperSize'] = intval($get['paperSize']);
+        }
+        return $options;
+    }
+
+    /**
+     * 链科云打印鲜花配送单
+     */
+    public function actionCloudPrintDeliverySlip()
+    {
+        if (!cloudPrintUtil::isEnabled()) {
+            util::fail('链科云打印未启用,请配置 .env 中 LIANKENET_*');
+        }
+        $id = intval(Yii::$app->request->get('id', 0));
+        if ($id <= 0) {
+            util::fail('订单id不对');
+        }
+        try {
+            deliverySlipPrintUtil::printByOrderId($id, $this->mainId, $this->parseCloudPrintPaperOptions());
+        } catch (\Throwable $e) {
+            Yii::error('配送单云打印失败: ' . $e->getMessage(), __METHOD__);
+            util::fail($e->getMessage());
+        }
+        util::complete('已提交打印');
+    }
+
+    /**
+     * 链科云打印节日贺卡(文案暂写死)
+     */
+    public function actionCloudPrintGreetingCard()
+    {
+        if (!cloudPrintUtil::isEnabled()) {
+            util::fail('链科云打印未启用,请配置 .env 中 LIANKENET_*');
+        }
+        $id = intval(Yii::$app->request->get('id', 0));
+        if ($id <= 0) {
+            util::fail('订单id不对');
+        }
+        try {
+            greetingCardPrintUtil::printByOrderId($id, $this->mainId, $this->parseCloudPrintPaperOptions());
+        } catch (\Throwable $e) {
+            Yii::error('节日贺卡云打印失败: ' . $e->getMessage(), __METHOD__);
+            util::fail($e->getMessage());
+        }
+        util::complete('已提交打印');
+    }
 }

+ 124 - 10
biz-ghs/order/services/NextDayRefundService.php

@@ -1,8 +1,8 @@
 <?php
 /**
- * 隔天售后(冲销辅助服务
- * 用途:资格校验、资金方式解析、隔天通过后的金额缓存与返余额;不建独立冲销表
- * 对应:xhRefund/xhCgRefund.sameDay=0,订单 nextDayTkPrice 累计且不改 actPrice
+ * 售后资金/隔天冲销辅助服务
+ * 用途:资格校验、资金快照(fundType/onlinePay/payWay)、隔天通过后的金额与返余额
+ * 字段:sameDay 区分当天/隔天;fundType 当天隔天通用;onlinePay/payWay 落在售后单上
  */
 namespace bizGhs\order\services;
 
@@ -25,10 +25,16 @@ class NextDayRefundService
     const SAME_DAY_YES = 1;
     const SAME_DAY_NO = 0;
 
+    /** 资金未确认 */
     const FUND_UNUSED = 0;
+    /** 原路退回 */
     const FUND_ORIGINAL = 1;
+    /** 返充到余额 */
     const FUND_BALANCE = 2;
+    /** 线下自行转账(原「仅记账」) */
     const FUND_NONE = 3;
+    /** 与 FUND_NONE 同义,便于语义阅读 */
+    const FUND_OFFLINE = 3;
 
     /**
      * 是否有有效支付时间(售后唯一时间依据;无支付时间不能售后)
@@ -134,7 +140,6 @@ class NextDayRefundService
 
     /**
      * 隔天售后未选手选资金时的默认值:线上默认原路,其它默认返余额。
-     * 最终仍须经 resolveFundType 收敛(挂账/余额强制返余额)。
      */
     public static function defaultNextDayFundType($order)
     {
@@ -142,13 +147,30 @@ class NextDayRefundService
     }
 
     /**
-     * 解析隔天资金方式:挂账/余额强制返余额;线上可选原路/返余额/仅记账。
-     * $hasRelateOrder=false 表示无原单退款(工作台「退款」),不可原路退。
+     * 当天售后未选手选资金时的默认值:线上原路;余额/挂账返余额;线下默认线下转账。
+     */
+    public static function defaultSameDayFundType($order)
+    {
+        if (self::isOnlinePayOrder($order)) {
+            return self::FUND_ORIGINAL;
+        }
+        $payWay = intval($order->payWay ?? 0);
+        $balancePay = dict::getDict('payWay', 'balancePay');
+        $debtPay = dict::getDict('payWay', 'debtPay');
+        if ($payWay === $balancePay || $payWay === $debtPay) {
+            return self::FUND_BALANCE;
+        }
+        return self::FUND_NONE;
+    }
+
+    /**
+     * 解析资金方式(当天/隔天通用):挂账/余额强制返余额;线上可选原路/返余额/线下转账。
+     * $hasRelateOrder=false 表示无原单退款,不可原路退。
      */
     public static function resolveFundType($fundType, $order, $hasRelateOrder = true)
     {
         $fundType = intval($fundType);
-        // 无原单:只能返余额或仅记账
+        // 无原单:只能返余额或线下自行转
         if (!$hasRelateOrder || empty($order)) {
             if ($fundType === self::FUND_ORIGINAL) {
                 util::fail('无原单退款不能原路退回');
@@ -161,23 +183,115 @@ class NextDayRefundService
         $payWay = intval($order->payWay ?? 0);
         $debtPay = dict::getDict('payWay', 'debtPay');
         $balancePay = dict::getDict('payWay', 'balancePay');
-        // 挂账/余额付款:隔天只能返余额
+        // 挂账/余额付款:资金落到返充余额
         if ($payWay === $debtPay || $payWay === $balancePay) {
             return self::FUND_BALANCE;
         }
-        // 线上付款:隔天也允许原路退回(与当天售后一致)
+        // 线上付款:可选原路 / 返余额 / 线下转账
         if (self::isOnlinePayOrder($order)) {
             if (!in_array($fundType, [self::FUND_ORIGINAL, self::FUND_BALANCE, self::FUND_NONE], true)) {
                 util::fail('请选择资金处理方式');
             }
             return $fundType;
         }
+        // 线下付款:返余额或线下自行转账
         if (!in_array($fundType, [self::FUND_BALANCE, self::FUND_NONE], true)) {
             return self::FUND_BALANCE;
         }
         return $fundType;
     }
 
+    /**
+     * 生成写入售后单的资金快照:fundType + onlinePay + payWay(落 xhRefund/xhCgRefund)。
+     * onlinePay:原路且走线上通道为 2,否则 1;payWay:原路/线下转账的具体渠道。
+     *
+     * @param int $fundTypeInput 前端/上游传入,0 表示按 sameDay 自动默认
+     * @param object|null $order 原销售单;无原单传 null
+     * @param bool $hasRelateOrder 是否有关联原单
+     * @param array $options sameDay、payWay(线下转账选手选渠道)
+     * @return array{fundType:int,onlinePay:int,payWay:int}
+     */
+    public static function buildRefundFundSnapshot($fundTypeInput, $order = null, $hasRelateOrder = true, $options = [])
+    {
+        $fundTypeInput = intval($fundTypeInput);
+        $sameDay = intval($options['sameDay'] ?? self::SAME_DAY_YES);
+        $onlineNot = intval(dict::getDict('onlinePay', 'not'));
+        $onlineYes = intval(dict::getDict('onlinePay', 'yes'));
+
+        if ($fundTypeInput === self::FUND_UNUSED && $hasRelateOrder && !empty($order)) {
+            $fundTypeInput = ($sameDay === self::SAME_DAY_NO)
+                ? self::defaultNextDayFundType($order)
+                : self::defaultSameDayFundType($order);
+        }
+
+        $fundType = self::resolveFundType($fundTypeInput, $order, $hasRelateOrder);
+
+        // 返充余额:渠道固定为余额,非线上原路
+        if ($fundType === self::FUND_BALANCE) {
+            return [
+                'fundType' => self::FUND_BALANCE,
+                'onlinePay' => $onlineNot,
+                'payWay' => intval(dict::getDict('payWay', 'balancePay')),
+            ];
+        }
+
+        // 线下自行转账:优先用选手选 payWay(微信/支付宝/现金/银行卡)
+        if ($fundType === self::FUND_NONE) {
+            $payWay = self::normalizeOfflinePayWay($options['payWay'] ?? null, $order);
+            return [
+                'fundType' => self::FUND_NONE,
+                'onlinePay' => $onlineNot,
+                'payWay' => $payWay,
+            ];
+        }
+
+        // 原路退回:线上微信/支付宝标记 onlinePay=2;否则记线下原路渠道
+        if ($fundType === self::FUND_ORIGINAL && !empty($order)) {
+            $orderPayWay = intval($order->payWay ?? 0);
+            if (self::isOnlinePayOrder($order)) {
+                return [
+                    'fundType' => self::FUND_ORIGINAL,
+                    'onlinePay' => $onlineYes,
+                    'payWay' => $orderPayWay,
+                ];
+            }
+            return [
+                'fundType' => self::FUND_ORIGINAL,
+                'onlinePay' => $onlineNot,
+                'payWay' => $orderPayWay,
+            ];
+        }
+
+        return [
+            'fundType' => self::FUND_UNUSED,
+            'onlinePay' => $onlineNot,
+            'payWay' => 0,
+        ];
+    }
+
+    /**
+     * 线下转账渠道:允许 0微信/1支付宝/4现金/5银行卡;非法则回落原单或现金
+     */
+    protected static function normalizeOfflinePayWay($payWay, $order = null)
+    {
+        $allowed = [
+            intval(dict::getDict('payWay', 'wxPay')),
+            intval(dict::getDict('payWay', 'alipay')),
+            intval(dict::getDict('payWay', 'cash')),
+            intval(dict::getDict('payWay', 'bankCard')),
+        ];
+        if ($payWay !== null && $payWay !== '' && in_array(intval($payWay), $allowed, true)) {
+            return intval($payWay);
+        }
+        if (!empty($order)) {
+            $orderPayWay = intval($order->payWay ?? -1);
+            if (in_array($orderPayWay, $allowed, true)) {
+                return $orderPayWay;
+            }
+        }
+        return intval(dict::getDict('payWay', 'cash'));
+    }
+
     /**
      * GHS 侧隔天通过:累计 nextDayTkPrice,按 fundType 处理资金,不改 actPrice。
      * @return string 返余额后的客户余额(非返余额则为当前余额)
@@ -209,7 +323,7 @@ class NextDayRefundService
             $custom = CustomClass::getById($customId, true);
             $balance = bcadd((string)($custom->balance ?? '0'), '0', 2);
         }
-        // FUND_ORIGINAL:网关退款在采购侧 CgRefundClass 执行;FUND_NONE:仅记账
+        // FUND_ORIGINAL:网关退款在采购侧执行;FUND_NONE:线下自行转账(只记账)
         return $balance;
     }
 

+ 6 - 2
biz-ghs/order/services/OrderService.php

@@ -1016,9 +1016,11 @@ class OrderService extends BaseService
             'cause' => $cause,
             'refundSendCost' => $refundSendCost,
             'refundPackCost' => $refundPackCost,
-            // 与销售侧售后成对写入隔天标记
+            // 与销售侧售后成对写入 sameDay + 资金快照
             'sameDay' => $saleRefund->sameDay ?? \bizGhs\order\classes\RefundOrderClass::SAME_DAY_YES,
             'fundType' => $saleRefund->fundType ?? 0,
+            'onlinePay' => $saleRefund->onlinePay ?? 0,
+            'payWay' => $saleRefund->payWay ?? 0,
         ];
         $cgRefund = CgRefundService::addRefund($cgData, $cg);
         $cgRefundId = $cgRefund->id;
@@ -1028,7 +1030,9 @@ class OrderService extends BaseService
         $cgRefund->saleRefundId = $saleRefundId;
         $cgRefund->sameDay = intval($saleRefund->sameDay ?? 1);
         $cgRefund->fundType = intval($saleRefund->fundType ?? 0);
-        $cgRefund->save();
+        $cgRefund->onlinePay = intval($saleRefund->onlinePay ?? 0);
+        $cgRefund->payWay = intval($saleRefund->payWay ?? 0);
+        $cgRefund->save(false, ['saleRefundId', 'sameDay', 'fundType', 'onlinePay', 'payWay']);
 
         return $saleRefund;
     }

+ 49 - 40
biz-ghs/order/services/RefundOrderService.php

@@ -134,28 +134,35 @@ class RefundOrderService extends BaseService
 
     /**
      * 将当天售后单转为隔天冲销类型(审核跨日/已结清时调用)
-     * 同步写销售售后单与采购售后单的 sameDay、fundType;
-     * 花店申请无资金弹窗时:线上默认原路,其它默认返余额。
+     * 同步写销售/采购售后单的 sameDay、fundType、onlinePay、payWay。
      */
     public static function convertRefundToNextDay($refund, $order)
     {
-        $fundType = intval($refund->fundType ?? 0);
-        if ($fundType === NextDayRefundService::FUND_UNUSED) {
-            $fundType = NextDayRefundService::defaultNextDayFundType($order);
-        }
-        $fundType = NextDayRefundService::resolveFundType($fundType, $order, true);
+        $snap = NextDayRefundService::buildRefundFundSnapshot(
+            intval($refund->fundType ?? 0),
+            $order,
+            true,
+            [
+                'sameDay' => NextDayRefundService::SAME_DAY_NO,
+                'payWay' => $refund->payWay ?? null,
+            ]
+        );
 
         $refund->sameDay = RefundOrderClass::SAME_DAY_NO;
-        $refund->fundType = $fundType;
-        $refund->save(false, ['sameDay', 'fundType']);
+        $refund->fundType = $snap['fundType'];
+        $refund->onlinePay = $snap['onlinePay'];
+        $refund->payWay = $snap['payWay'];
+        $refund->save(false, ['sameDay', 'fundType', 'onlinePay', 'payWay']);
 
         $cgRefundId = intval($refund->cgRefundId ?? 0);
         if ($cgRefundId > 0) {
             $cgRefund = CgRefundClass::getById($cgRefundId, true);
             if (!empty($cgRefund)) {
                 $cgRefund->sameDay = CgRefundClass::SAME_DAY_NO;
-                $cgRefund->fundType = $fundType;
-                $cgRefund->save(false, ['sameDay', 'fundType']);
+                $cgRefund->fundType = $snap['fundType'];
+                $cgRefund->onlinePay = $snap['onlinePay'];
+                $cgRefund->payWay = $snap['payWay'];
+                $cgRefund->save(false, ['sameDay', 'fundType', 'onlinePay', 'payWay']);
             }
         }
     }
@@ -269,7 +276,7 @@ class RefundOrderService extends BaseService
 
         // 无支付时间不能售后
         NextDayRefundService::assertCanRefund($order);
-        // 隔天冲销:sameDay=0 + fundType;非当天/已结清强制冲销(即使创建时未传 sameDay)
+        // sameDay:非当天/已结清强制隔天;资金快照当天/隔天都写入 fundType/onlinePay/payWay
         $sameDay = intval($post['sameDay'] ?? RefundOrderClass::SAME_DAY_YES);
         if (NextDayRefundService::mustUseNextDay($order)) {
             $sameDay = RefundOrderClass::SAME_DAY_NO;
@@ -279,18 +286,20 @@ class RefundOrderService extends BaseService
             if (empty($check['ok'])) {
                 util::fail($check['reason'] ?? '当前订单不可隔天冲销');
             }
-            $fundTypeInput = intval($post['fundType'] ?? 0);
-            // 未选手选资金时:线上默认原路,其它默认返余额(商家弹窗会覆盖)
-            if ($fundTypeInput === NextDayRefundService::FUND_UNUSED) {
-                $fundTypeInput = NextDayRefundService::defaultNextDayFundType($order);
-            }
-            $fundType = NextDayRefundService::resolveFundType($fundTypeInput, $order, true);
-            $data['sameDay'] = RefundOrderClass::SAME_DAY_NO;
-            $data['fundType'] = $fundType;
-        } else {
-            $data['sameDay'] = RefundOrderClass::SAME_DAY_YES;
-            $data['fundType'] = NextDayRefundService::FUND_UNUSED;
         }
+        $snap = NextDayRefundService::buildRefundFundSnapshot(
+            intval($post['fundType'] ?? 0),
+            $order,
+            true,
+            [
+                'sameDay' => $sameDay,
+                'payWay' => $post['payWay'] ?? null,
+            ]
+        );
+        $data['sameDay'] = $sameDay;
+        $data['fundType'] = $snap['fundType'];
+        $data['onlinePay'] = $snap['onlinePay'];
+        $data['payWay'] = $snap['payWay'];
 
         $refund = RefundOrderClass::add($data, true);
         return $refund;
@@ -332,32 +341,28 @@ class RefundOrderService extends BaseService
             $refundType = intval($post['refundType'] ?? RefundOrderClass::REFUND_TYPE_MONEY_GOOD);
         }
 
-        // 前端 toBalance:1返充余额→fundType2;0否→仅记账3
+        // 前端 toBalance:1返充余额→fundType2;0否→线下自行转账3
         $toBalance = intval($post['toBalance'] ?? -1);
         if ($toBalance === 1) {
             $post['fundType'] = NextDayRefundService::FUND_BALANCE;
         } elseif ($toBalance === 0) {
             $post['fundType'] = NextDayRefundService::FUND_NONE;
         }
-        $fundType = NextDayRefundService::resolveFundType($post['fundType'] ?? 0, null, false);
+        // 无原单:写入 fundType/onlinePay/payWay(payWay 为线下转账渠道)
+        $snap = NextDayRefundService::buildRefundFundSnapshot(
+            intval($post['fundType'] ?? 0),
+            null,
+            false,
+            [
+                'sameDay' => NextDayRefundService::SAME_DAY_NO,
+                'payWay' => $post['payWay'] ?? null,
+            ]
+        );
 
         $sjId = intval($post['sjId'] ?? 0);
         $shopId = intval($post['shopId'] ?? 0);
         $orderSn = orderSn::getGhsRefundSn();
-
-        // xhRefund 暂无 payWay 字段:退款方式写入备注便于追溯
-        $payWay = intval($post['payWay'] ?? -1);
-        $payWayNameMap = [
-            0 => '线下微信',
-            1 => '线下支付宝',
-            4 => '现金',
-            5 => '银行卡',
-        ];
         $remark = trim((string)($post['remark'] ?? ''));
-        if (isset($payWayNameMap[$payWay])) {
-            $payTag = '退款方式:' . $payWayNameMap[$payWay];
-            $remark = $remark === '' ? $payTag : ($remark . ';' . $payTag);
-        }
 
         $data = [
             'status' => RefundOrderClass::STATUS_UN_COMPLETE,
@@ -381,7 +386,9 @@ class RefundOrderService extends BaseService
             'refundPrice' => $refundPrice,
             'refundType' => $refundType,
             'sameDay' => RefundOrderClass::SAME_DAY_NO,
-            'fundType' => $fundType,
+            'fundType' => $snap['fundType'],
+            'onlinePay' => $snap['onlinePay'],
+            'payWay' => $snap['payWay'],
         ];
 
         $postProduct = $post['product'] ?? [];
@@ -456,7 +463,9 @@ class RefundOrderService extends BaseService
             'id' => intval($refund->id ?? 0),
             'orderSn' => $refund->orderSn ?? '',
             'sameDay' => RefundOrderClass::SAME_DAY_NO,
-            'fundType' => intval($refund->fundType ?? $fundType),
+            'fundType' => intval($refund->fundType ?? $snap['fundType']),
+            'onlinePay' => intval($refund->onlinePay ?? $snap['onlinePay']),
+            'payWay' => intval($refund->payWay ?? $snap['payWay']),
             'refundPrice' => $refund->refundPrice ?? $refundPrice,
             'customId' => $customId,
             'customName' => $custom->name ?? ($refund->customName ?? ''),

+ 4 - 2
biz-hd/cg/classes/CgRefundClass.php

@@ -41,11 +41,12 @@ class CgRefundClass extends BaseClass
 
     /**
      * 隔天冲销原路退:走拉卡拉退款,不改采购单 actPrice
+     * 优先读售后单资金快照 onlinePay/payWay,缺省回落采购原单
      */
     public static function nextDayOriginalOnlineRefund($cgRefund, $cg)
     {
-        $onlinePay = $cg->onlinePay ?? 1;
-        $payWay = $cg->payWay ?? 0;
+        $onlinePay = $cgRefund->onlinePay ?? ($cg->onlinePay ?? 1);
+        $payWay = $cgRefund->payWay ?? ($cg->payWay ?? 0);
         if ($onlinePay != dict::getDict('onlinePay', 'yes')) {
             util::fail('非在线支付无法原路退回');
         }
@@ -75,6 +76,7 @@ class CgRefundClass extends BaseClass
             'lklCertificatePath' => $lklCertificatePath,
         ];
         $laResource = new Lakala($params);
+        // 流水号策略暂维持售后单号;唯一性撞号问题另行处理
         $refundOrderSn = $cgRefund->orderSn ?? orderSn::getCgRefundSn();
         $aliParams = [
             'refundSn' => $refundOrderSn,

+ 25 - 13
biz-hd/cg/services/CgRefundService.php

@@ -56,19 +56,25 @@ class CgRefundService extends BaseService
         // 无支付时间不能售后;仅用 payTime 判当天/隔天
         NextDayRefundService::assertCanRefund($order);
 
-        // 非当天 / 已结账 / 挂账结清 → 申请即写隔天售后;无资金弹窗时按支付方式默认(线上原路,其它返余额)
+        // 非当天 / 已结账 / 挂账结清 → 隔天;资金快照当天/隔天都写 fundType/onlinePay/payWay
         $sameDay = CgRefundClass::SAME_DAY_YES;
-        $fundType = NextDayRefundService::FUND_UNUSED;
         if (NextDayRefundService::mustUseNextDay($order)) {
             $sameDay = CgRefundClass::SAME_DAY_NO;
-            $fundType = NextDayRefundService::resolveFundType(
-                NextDayRefundService::defaultNextDayFundType($order),
-                $order,
-                true
-            );
         }
+        $snap = NextDayRefundService::buildRefundFundSnapshot(
+            intval($cgData['fundType'] ?? 0),
+            $order,
+            true,
+            [
+                'sameDay' => $sameDay,
+                'payWay' => $cgData['payWay'] ?? null,
+            ]
+        );
         $cgData['sameDay'] = $sameDay;
-        $cgData['fundType'] = $fundType;
+        $cgData['fundType'] = $snap['fundType'];
+        $cgData['onlinePay'] = $snap['onlinePay'];
+        $cgData['payWay'] = $snap['payWay'];
+        $fundType = $snap['fundType'];
 
         $respond = self::addRefund($cgData, $cg);
         $remark = $cgData['remark'] ?? '';
@@ -133,18 +139,22 @@ class CgRefundService extends BaseService
             'mainId' => $mainId,
             'product' => $newProductList,
             'sameDay' => $sameDay,
-            'fundType' => $fundType,
+            'fundType' => $snap['fundType'],
+            'onlinePay' => $snap['onlinePay'],
+            'payWay' => $snap['payWay'],
         ];
         $cgRefundId = $respond->id ?? 0;
         $saleRefund = RefundOrderService::addRefund($orderData, $order);
         $saleRefund->cgRefundId = $cgRefundId;
         $saleRefund->save();
         $saleRefundId = $saleRefund->id ?? 0;
-        // 与销售侧最终 sameDay/fundType 对齐(addRefund 内可能再次强制隔天)
+        // 与销售侧最终资金快照对齐(addRefund 内可能再次强制隔天)
         $respond->saleRefundId = $saleRefundId;
         $respond->sameDay = intval($saleRefund->sameDay ?? $sameDay);
-        $respond->fundType = intval($saleRefund->fundType ?? $fundType);
-        $respond->save();
+        $respond->fundType = intval($saleRefund->fundType ?? $snap['fundType']);
+        $respond->onlinePay = intval($saleRefund->onlinePay ?? $snap['onlinePay']);
+        $respond->payWay = intval($saleRefund->payWay ?? $snap['payWay']);
+        $respond->save(false, ['saleRefundId', 'sameDay', 'fundType', 'onlinePay', 'payWay']);
         return $respond;
     }
 
@@ -212,9 +222,11 @@ class CgRefundService extends BaseService
         $data['bigNum'] = $bigNum;
         $data['smallNum'] = $smallNum;
         $data['cause'] = $cause;
-        // 隔天冲销与销售侧成对:sameDay/fundType 由上游传入
+        // 与销售侧成对:sameDay + 资金快照由上游传入
         $data['sameDay'] = intval($post['sameDay'] ?? CgRefundClass::SAME_DAY_YES);
         $data['fundType'] = intval($post['fundType'] ?? 0);
+        $data['onlinePay'] = intval($post['onlinePay'] ?? dict::getDict('onlinePay', 'not'));
+        $data['payWay'] = intval($post['payWay'] ?? 0);
         $cgRefund = CgRefundClass::add($data, true);
 
         if ($refundType == CgRefundClass::REFUND_TYPE_MONEY_GOOD) {