全部
常见问题
产品动态
精选推荐

卡项商品实付价格计算问题

管理 管理 编辑 删除

问题说明:卡项商品实付价格计算有误

解决方法:

修改文件:app/services/order/StoreOrderCartInfoServices.php

修改方法:setActualPaymentPrice()

    public function setActualPaymentPrice($cart_info, $product_id, $sku_unique, $price = 0.00)
    {
        $sumPrice = 0;
        $product = [];
        foreach ($cart_info as $k => $v) {
            $_info = is_string($v['cart_info']) ? json_decode($v['cart_info'], true) : $v['cart_info'];
            $v['cart_info'] = $_info;
            $sumPrice = bcadd((string)$sumPrice, bcmul((string)$_info['price'], (string)$_info['write_times'], 2), 2);
            if ($product_id == $_info['product_id'] && $sku_unique == $_info['product_attr_unique']) {
                $product = $_info;
            }
        }

        return bcmul(bcmul((string)$price, bcdiv((string)$product['price'], (string)$sumPrice, 4), 4), (string)$product['write_times'], 2);
    }

修改方法:updateCardHolderInfo()

    public function updateCardHolderInfo(int $oid, array $cartInfo)
    {
        $cart_info = $this->dao->getCartColunm(['oid' => $oid, 'is_card' => 1], '*');
        $cart = $cartInfo[0];
        $pay_price = 0;
        $count = count($cart_info);
        foreach ($cart_info as $k => $v) {
            if ($k > $count - 2) {
                $v['payPrice'] = bcsub((string)$cart['pay_price'], (string)$pay_price, 2);
            } else {
                $v['payPrice'] = $this->setActualPaymentPrice($cart_info, $v['product_id'],$v['sku_unique'], $cart['pay_price']);
                $pay_price = bcadd((string)$pay_price, (string)$v['payPrice'], 2);
            }
            $this->dao->update(['oid' => $oid, 'id' => $v['id']], ['pay_price' => $v['payPrice']]);
        }
    }


修改方法:getOrderCardRelatedCartInfo()

public function getOrderCardRelatedCartInfo(int $oid = 0, int $uid = 0)
    {
        $cart_info = $this->dao->getCartColunm(['oid' => $oid, 'is_card' => 1], '*');
        $cart = $this->dao->getOne(['oid' => $oid, 'is_card' => 0]);
        /** @var StoreReservationOrderServices $reservationOrderServices */
        $reservationOrderServices = app()->make(StoreReservationOrderServices::class);
        /** @var StoreProductReplyServices $replyServices */
        $replyServices = app()->make(StoreProductReplyServices::class);
        $pay_price = 0;
        $count = count($cart_info);
        foreach ($cart_info as $k => &$v) {
            $_info = is_string($v['cart_info']) ? json_decode($v['cart_info'], true) : $v['cart_info'];
            $v['cart_info'] = $_info;
            $v['waiting_service'] = 0;
            //新增是否评价字段
            $v['is_reply'] = $replyServices->count(['unique' => $v['unique']]);
            if ($k > $count - 2) {
                $v['payPrice'] = bcsub((string)$cart['pay_price'], (string)$pay_price, 2);
            } else {
                $v['payPrice'] = $this->setActualPaymentPrice($cart_info, $v['product_id'],$v['sku_unique'], $cart['pay_price']);
                $pay_price = bcadd((string)$pay_price, (string)$v['payPrice'], 2);
            }
            if ($v['product_type'] == 6) {
                if (!$uid) $uid = $v['uid'];
                $v['waiting_service'] = $reservationOrderServices->count(['uid' => $uid, 'oid' => $oid, 'cart_info_id' => $v['id'], 'status' => 0, 'is_del' => 0]);
            }
        }
        return $cart_info;
    }

修改方法:setCartCartInfo()

public function setCartCartInfo($oid, $uid, $id)
    {
        if (!$id) return false;
        /** @var StoreCardRelatedServices $relatedService */
        $relatedService = app()->make(StoreCardRelatedServices::class);
        $related = $relatedService->getCardRelatedProduct($id, false);
        $group = [];
        foreach ($related as $cart) {
            $cart = array_merge($cart, ['cart_num' => $cart['write_times'],
                'is_card' => 1,
                'is_support_refund' => 0,
                'pay_price' => 0,
                'pay_postage' => 0,
                'coupon_price' => 0,
                'promotions_price' => 0,
                'first_order_price' => 0,
                'truePrice' => $cart['price'] ?? 0,
                'total_price' => bcmul((string)($cart['price'] ?? 0), (string)$cart['write_times'], 2)
            ]);
            $group[] = [
                'oid' => $oid,
                'uid' => $uid,
                'cart_id' => $this->getUniqueId(''),
                'type' => $cart['productInfo']['type'] ?? 0,
                'relation_id' => $cart['productInfo']['relation_id'] ?? 0,
                'product_id' => $cart['product_id'] ?? $cart['productInfo']['id'],//原商品ID
                'product_type' => $cart['productInfo']['product_type'] ?? 0,
                'sku_unique' => $cart['product_attr_unique'] ?? '',
                'promotions_id' => '',
                'is_gift' => 0,
                'is_card' => 1,
                'is_support_refund' => 0,
                'cart_info' => json_encode($cart),
                'cart_num' => $cart['write_times'] ?? 1,
                'total_price' => bcmul((string)($cart['price'] ?? 0), (string)($cart['write_times'] ?? 1), 2),
                'pay_price' => 0,
                'pay_postage' => 0,
                'coupon_price' => 0,
                'promotions_price' => 0,
                'first_order_price' => 0,
                'surplus_num' => $cart['write_times'],
                'split_surplus_num' => $cart['write_times'],
                'write_times' => $cart['write_times'],
                'write_surplus_times' => $cart['write_times'],
                'unique' => md5($cart['id'] . '' . $oid)
            ];
        }
        /** @var StoreOrderCartInfoServices $cartServices */
        $cartServices = app()->make(StoreOrderCartInfoServices::class);
        $cart = $cartServices->getOne(['oid' => $oid, 'is_card' => 0]);
        $pay_price = 0;
        $count = count($group);
        foreach ($group as $k => &$v) {
            if ($k > $count - 2) {
                $v['pay_price'] = bcsub((string)$cart['pay_price'], (string)$pay_price, 2);
            } else {
                $v['pay_price'] = $cartServices->setActualPaymentPrice($group, $v['product_id'],$v['sku_unique'], $cart['pay_price']);
                $pay_price = bcadd((string)$pay_price, (string)$v['pay_price'], 2);
            }
        }
        return $this->dao->saveAll($group);
    }


修改文件:app/services/user/UserCardHolderServices.php

修改方法:oneCardHolder()

   public function oneCardHolder(int $id,bool $is_price = false)
    {
        $cardHolder = $this->dao->get($id);
        if (!$cardHolder) {
            throw new ValidateException('信息有误');
        }
        /** @var SystemStoreServices $storeServices */
        $storeServices = app()->make(SystemStoreServices::class);
        /** @var StoreProductServices $productServices */
        $productServices = app()->make(StoreProductServices::class);
        /** @var StoreOrderServices $orderServices */
        $orderServices = app()->make(StoreOrderServices::class);
        $cardHolder = $cardHolder->toArray();
        $time = time();
        $cardHolder['store_name'] = '';
        $cardHolder['store_image'] = '';
        if ($cardHolder['store_id']) {
            $store = $storeServices->get($cardHolder['store_id'], ['name', 'image']);
            $cardHolder['store_name'] = $store['name'];
            $cardHolder['store_image'] = $store['image'];
        }
        $order = $orderServices->get($cardHolder['oid'], ['order_id','pay_price']);
        $cardHolder['order_id'] = $order['order_id'];
        $cardHolder['pay_price'] = $order['pay_price'];
        $product_card = $productServices->get($cardHolder['product_id'], ['pid', 'image', 'card_cover', 'card_cover_image', 'card_cover_color']);
        if (!$product_card) {
            return null;
        }
        $cardHolder['pid'] = $product_card['pid'];
        $cardHolder['image'] = $product_card['image'];
        $cardHolder['card_cover'] = $product_card['card_cover'];
        $cardHolder['card_cover_image'] = $product_card['card_cover_image'];
        $cardHolder['card_cover_color'] = $product_card['card_cover_color'];
        if ($cardHolder['write_valid'] == 1) {
            $cardHolder['status'] = 1; // 核销中
        } else if ($time < $cardHolder['write_start']) {
            $cardHolder['status'] = 0; // 核销未开始
        } elseif ($time >= $cardHolder['write_start'] && $time < $cardHolder['write_end']) {
            $cardHolder['status'] = 1; // 核销中
        } else {
            $cardHolder['status'] = 2; // 已过期
        }
        if ($cardHolder['write_start'] && $cardHolder['write_end']) {
            $cardHolder['write_start'] = date('Y-m-d H:i:s', $cardHolder['write_start']);
            $cardHolder['write_end'] = date('Y-m-d H:i:s', $cardHolder['write_end']);
        }
        $cardHolder['add_time'] = date('Y-m-d H:i:s', $cardHolder['add_time']);
        $writeoffedNum = $this->getWriteSurplusTimes($cardHolder['oid']);
        $cardHolder['write_surplus_times'] = bcsub((string)$cardHolder['write_times'], (string)$writeoffedNum, 0);
        $cardHolder['remaining_price'] = 0;
        if($is_price) {
            /** @var StoreOrderCartInfoServices $cartServices */
            $cartServices = app()->make(StoreOrderCartInfoServices::class);
            $cart_info = $cartServices->getCartColunm(['oid' => $cardHolder['oid'], 'is_card' => 1], '*');
            $cart = $cartServices->getOne(['oid' => $cardHolder['oid'], 'is_card' => 0]);
            $pay_price = 0;
            $remaining_price = 0;
            $count = count($cart_info);
            foreach ($cart_info as $k => &$v) {
                $_info = is_string($v['cart_info']) ? json_decode($v['cart_info'], true) : $v['cart_info'];
                $v['cart_info'] = $_info;
                $v['waiting_service'] = 0;
                if ($k > $count - 2) {
                    $v['payPrice'] = bcsub((string)$cart['pay_price'], (string)$pay_price, 2);
                } else {
                    $v['payPrice'] = $cartServices->setActualPaymentPrice($cart_info, $v['product_id'],$v['sku_unique'], $cart['pay_price']);
                    $pay_price = bcadd((string)$pay_price, (string)$v['payPrice'], 2);
                }
                $remaining_price = bcadd((string)$remaining_price, bcmul(bcdiv((string)$v['payPrice'], (string)$v['write_times'], 4), (string)$v['write_surplus_times'], 2), 2);
            }
            $cardHolder['remaining_price'] = $cardHolder['write_times'] == $cardHolder['write_surplus_times'] ? $cardHolder['pay_price'] : $remaining_price;
        }
        return $cardHolder;
    }

修改方法:cardBenefitsData()

    public function cardBenefitsData($id)
    {
        $cardHolder = $this->dao->getOne(['oid' => $id]);
        if (!$cardHolder) {
            throw new ValidateException('信息有误');
        }
        $cardHolder = $cardHolder->toArray();
        /** @var StoreOrderCartInfoServices $cartServices */
        $cartServices = app()->make(StoreOrderCartInfoServices::class);
        $cart_info = $cartServices->getCartColunm(['oid' => $cardHolder['oid'], 'is_card' => 1], '*');
        $cart = $cartServices->getOne(['oid' => $cardHolder['oid'], 'is_card' => 0]);
        $pay_price = 0;
        $remaining_price = 0;
        $count = count($cart_info);
        foreach ($cart_info as $k => &$v) {
            $_info = is_string($v['cart_info']) ? json_decode($v['cart_info'], true) : $v['cart_info'];
            $v['cart_info'] = $_info;
            $v['waiting_service'] = 0;
            if ($k > $count - 2) {
                $v['payPrice'] = bcsub((string)$cart['pay_price'], (string)$pay_price, 2);
            } else {
                $v['payPrice'] = $cartServices->setActualPaymentPrice($cart_info, $v['product_id'],$v['sku_unique'], $cart['pay_price']);
                $pay_price = bcadd((string)$pay_price, (string)$v['payPrice'], 2);
            }
            $remaining_price = bcadd((string)$remaining_price, bcmul(bcdiv((string)$v['payPrice'], (string)$v['write_times'], 4), (string)$v['write_surplus_times'], 2), 2);
        }
        $cardHolder['remaining_price'] = $remaining_price;
        $cardHolder['cart_info'] = $cart_info;
        return $cardHolder;
    }


修改文件:app/services/order/store/WriteOffOrderServices.php

修改方法:getOrderCartInfo()

public function getOrderCartInfo(int $uid, int $id, string $userType = 'admin')
    {
        $orderInfo = $this->writeoffOrderInfo($uid, '', $userType, $id);
        $writeoff_count = 0;
        /** @var StoreOrderCartInfoServices $cartInfoServices */
        $cartInfoServices = app()->make(StoreOrderCartInfoServices::class);
        $where = [];
        if ($orderInfo['type'] == 11) {
            $where['is_card'] = 1;
        }
        $cartInfo = $cartInfoServices->getCartColunm(['oid' => $orderInfo['id']] + $where, 'id,product_id,cart_id,cart_num,surplus_num,is_writeoff,cart_info,product_type,is_support_refund,is_gift,write_times,write_surplus_times,sku_unique');
        /** @var StoreReservationOrderServices $reservationOrderServices */
        $reservationOrderServices = app()->make(StoreReservationOrderServices::class);
        $pay_price = 0;
        $count = count($cartInfo);
        foreach ($cartInfo as $k => &$item) {
            $_info = is_string($item['cart_info']) ? json_decode($item['cart_info'], true) : $item['cart_info'];
            if (!isset($_info['productInfo'])) $_info['productInfo'] = [];
            //缩略图处理
            if (isset($_info['productInfo']['attrInfo'])) {
                $_info['productInfo']['attrInfo'] = get_thumb_water($_info['productInfo']['attrInfo']);
            }
            if ($orderInfo['type'] == 11) {
                if ($k > $count - 2) {
                    $_info['truePrice'] = bcsub((string)$orderInfo['pay_price'], (string)$pay_price, 2);
                } else {
                    $_info['truePrice'] = $cartInfoServices->setActualPaymentPrice($cartInfo, $item['product_id'],$item['sku_unique'], $orderInfo['pay_price']);
                    $pay_price = bcadd((string)$pay_price, (string)$_info['truePrice'], 4);
                }
            }
            $_info['productInfo'] = get_thumb_water($_info['productInfo']);
            $item['cart_info'] = $_info;
            $writeoffed_num = 0;
            if ($item['write_times'] > $item['write_surplus_times']) {
                $writeoffed_num = bcsub((string)$item['write_times'], (string)$item['write_surplus_times']);
                $writeoff_count = bcadd((string)$writeoff_count, (string)$writeoffed_num);
            }
            $item['surplus_num'] = $item['write_surplus_times'];
            $item['unservice_num'] = 0;
            if ($orderInfo['type'] == 12 || $item['product_type'] == 6) {//预约单 || 预约商品
                $item['unservice_num'] = $reservationOrderServices->count(['oid' => $orderInfo['id'], 'cart_info_id' => $item['id'], 'status' => [0, 1], 'is_del' => 0, 'is_system_del' => 0]);
            }
            $item['writeoffed_num'] = max((int)bcsub((string)$writeoffed_num, (string)$item['unservice_num']), 0);
            unset($_info);
            if ($item['writeoffed_num'] <= 0 && $item['write_surplus_times'] == 0 && $item['is_writeoff'] == 0) {
                $item['is_writeoff'] = 1;
            }
        }
        $orderInfo['cart_count'] = count($cartInfo);
        $orderInfo['writeoff_count'] = $writeoff_count;
        $orderInfo['cart_info'] = $cartInfo;
        return $orderInfo;
    }


请登录后查看

全 最后编辑于2025-10-22 15:43:23

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}} 【已收集】
沙发 板凳 地板 {{item.floor}}# 【已收集】
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打赏
已打赏¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打赏
已打赏¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
打赏
已打赏¥{{reward_price}}
58
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定
打赏金额
当前余额:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
请输入 0.1-{{reward_max_price}} 范围内的数值
打赏成功
¥{{price}}
完成 确认打赏

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服