问题说明:卡项商品实付价格计算有误
解决方法:
修改文件: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;
}
