添加:商品抵扣金额支持固定金额

This commit is contained in:
wuhui_zzw 2023-11-18 15:36:58 +08:00
parent 1fa3ddbd09
commit d3b8758b67
3 changed files with 66 additions and 57 deletions

View File

@ -76,7 +76,7 @@ class StoreCartDao extends BaseDao
{
return StoreCart::getDb()->where('uid', $uid)->with([
'product' => function (Relation $query) use ($address) {
$query->field('product_id,cate_id,image,store_name,is_show,status,is_del,unit_name,price,mer_status,temp_id,give_coupon_ids,is_gift_bag,is_used,product_type,old_product_id,integral_rate,delivery_way,delivery_free,type,extend,pay_limit,once_max_count,once_min_count,mer_svip_status,svip_price_type,refund_switch,integral_give_switch,integral_give_set,integral_give_type,integral_give_rate,integral_give_money');
$query->field('product_id,cate_id,image,store_name,is_show,status,is_del,unit_name,price,mer_status,temp_id,give_coupon_ids,is_gift_bag,is_used,product_type,old_product_id,integral_rate,delivery_way,delivery_free,type,extend,pay_limit,once_max_count,once_min_count,mer_svip_status,svip_price_type,refund_switch,integral_give_switch,integral_give_set,integral_give_type,integral_give_rate,integral_give_money,integral_deduction_type,integral_deduction_money');
if ($address) {
$cityIds = array_filter([$address->province_id, $address->city_id, $address->district_id, $address->street_id]);
$query->with([

View File

@ -790,68 +790,71 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$integralFlag = $sysIntegralConfig['integral_status'] && $merIntegralConfig['mer_integral_status'] && $integralMoney > 0;
// Log::info('积分抵扣 - 持有积分信息:'.var_export(['商户id'=>$merchantCart['mer_id'],'用户持有'=>$integralInfo],1));
//计算积分抵扣
// 计算积分抵扣
foreach ($merchantCart['list'] as &$cart) {
// 获取积分抵扣比例 可以使用积分抵扣商品支付金额的比例
$integralRate = $cart['product']['integral_rate'];// 商品单独设置比例
if ($integralRate < 0) $integralRate = $merIntegralConfig['mer_integral_rate'];// 商户统一设置比例
else if($integralRate > 0) $integralRate = min(bcdiv($integralRate, 100, 4), 1);
// 获取商品可以抵扣的金额
if($cart['product']['integral_rate'] == -1){
// 统一设置 抵扣比例
$integralRate = $merIntegralConfig['mer_integral_rate'];// 商户统一设置比例
// 当前商品可以抵扣的金额
$productIntegralPrice = (float)min(bcmul(bcmul($this->cartByPrice($cart), $cart['cart_num'], 2), $integralRate, 2), $cart['true_price']);
}else{
// 商品独立设置
if((int)$cart['product']['integral_deduction_type'] == 1) $productIntegralPrice = (float)$cart['product']['integral_deduction_money'];
else $productIntegralPrice = (float)min(bcmul(bcmul($this->cartByPrice($cart), $cart['cart_num'], 2), min(bcdiv($cart['product']['integral_rate'], 100, 4), 1), 2), $cart['true_price']);
}
// 判断:当前商品是否可以参与积分抵扣
$isParticipation = $merchantCart['order']['true_price'] > 0 && $cart['product_type'] == 0 && $integralFlag && $integralRate > 0;
$isParticipation = $merchantCart['order']['true_price'] > 0 && $cart['product_type'] == 0 && $integralFlag && $productIntegralPrice > 0;
if($isParticipation) $is_has_integral_use = 1;// 是否存在积分使用情况 只要存在一个则存在
// 只有普通商品可以抵扣
if ($isParticipation && ($integralInfo['mer_integral'] > 0 || $integralInfo['convert_integral'] > 0) && ($usePlatformIntegral || $useMerIntegral)) {
// 计算积分抵扣
if ($integralRate > 0) {
// 当前商品可以抵扣的金额
$productIntegralPrice = (float)min(bcmul(bcmul($this->cartByPrice($cart), $cart['cart_num'], 2), $integralRate, 2), $cart['true_price']);
// 抵扣需要的积分
$productIntegral = (int)ceil(bcdiv($productIntegralPrice, $integralMoney, 3));
if ($productIntegral > 0 && ($productIntegral <= $integralInfo['mer_integral'] || $productIntegral <= $integralInfo['convert_integral'])) {
// 判断:使用的积分类型
if($useMerIntegral){
// 使用商户积分抵扣
$integralInfo['mer_integral'] = (float)bcsub($integralInfo['mer_integral'], $productIntegral, 2);
$integralInfo['use_integral_type'] = 'mer_integral';
// 判断:积分不足 不使用积分抵扣
if($integralInfo['mer_integral'] < 0) continue;
}else if($usePlatformIntegral) {
// 使用平台积分抵扣
$integralInfo['convert_integral'] = bcsub($integralInfo['convert_integral'], $productIntegral, 2);// 减少转换后的积分
$productIntegral = bcmul($productIntegral, $integralInfo['convert_rate'],2);// 刷新使用积分(使用平台积分,需要根据比例刷新平台积分减少数量)
$integralInfo['integral'] = bcsub($integralInfo['integral'], $productIntegral, 2);// 减少未转化的平台积分
$integralInfo['use_integral_type'] = 'platform_integral';
// 判断:积分不足 不使用积分抵扣
if($integralInfo['convert_integral'] < 0) continue;
}
// 使用多少积分抵扣了多少金额
$cart['integral'] = [
'use' => $productIntegral,
'price' => $productIntegralPrice,
'use_integral_type' => $integralInfo['use_integral_type']
];
// 抵扣后的处理
$cart['true_price'] = bcsub($cart['true_price'], $cart['integral']['price'], 2);
$merchantCart['order']['true_price'] = bcsub($merchantCart['order']['true_price'], $cart['integral']['price'], 2);
if($integralInfo['use_integral_type'] == 'mer_integral') {
$use_mer_integral = bcadd($use_mer_integral, $productIntegral, 2);// 使用的商户积分
$use_mer_integral_price = bcadd($use_mer_integral_price,$productIntegralPrice,2);// 使用商户积分抵扣的金额
}
else {
$use_platform_integral = bcadd($use_platform_integral, $productIntegral, 2);;// 使用的平台积分
$use_platform_integral_price = bcadd($use_platform_integral_price, $productIntegralPrice, 2);;// 使用平台积分抵扣的金额
}
$total_integral_price = bcadd($total_integral_price, $cart['integral']['price'], 2);
$total_integral = bcadd($total_integral, $cart['integral']['use'], 2);
continue;
// 抵扣需要的积分
$productIntegral = (int)ceil(bcdiv($productIntegralPrice, $integralMoney, 3));
if ($productIntegral > 0 && ($productIntegral <= $integralInfo['mer_integral'] || $productIntegral <= $integralInfo['convert_integral'])) {
// 判断:使用的积分类型
if($useMerIntegral){
// 使用商户积分抵扣
$integralInfo['mer_integral'] = (float)bcsub($integralInfo['mer_integral'], $productIntegral, 2);
$integralInfo['use_integral_type'] = 'mer_integral';
// 判断:积分不足 不使用积分抵扣
if($integralInfo['mer_integral'] < 0) continue;
}else if($usePlatformIntegral) {
// 使用平台积分抵扣
$integralInfo['convert_integral'] = bcsub($integralInfo['convert_integral'], $productIntegral, 2);// 减少转换后的积分
$productIntegral = bcmul($productIntegral, $integralInfo['convert_rate'],2);// 刷新使用积分(使用平台积分,需要根据比例刷新平台积分减少数量)
$integralInfo['integral'] = bcsub($integralInfo['integral'], $productIntegral, 2);// 减少未转化的平台积分
$integralInfo['use_integral_type'] = 'platform_integral';
// 判断:积分不足 不使用积分抵扣
if($integralInfo['convert_integral'] < 0) continue;
}
// 使用多少积分抵扣了多少金额
$cart['integral'] = [
'use' => $productIntegral,
'price' => $productIntegralPrice,
'use_integral_type' => $integralInfo['use_integral_type']
];
// 抵扣后的处理
$cart['true_price'] = bcsub($cart['true_price'], $cart['integral']['price'], 2);
$merchantCart['order']['true_price'] = bcsub($merchantCart['order']['true_price'], $cart['integral']['price'], 2);
if($integralInfo['use_integral_type'] == 'mer_integral') {
$use_mer_integral = bcadd($use_mer_integral, $productIntegral, 2);// 使用的商户积分
$use_mer_integral_price = bcadd($use_mer_integral_price,$productIntegralPrice,2);// 使用商户积分抵扣的金额
}
else {
$use_platform_integral = bcadd($use_platform_integral, $productIntegral, 2);;// 使用的平台积分
$use_platform_integral_price = bcadd($use_platform_integral_price, $productIntegralPrice, 2);;// 使用平台积分抵扣的金额
}
$total_integral_price = bcadd($total_integral_price, $cart['integral']['price'], 2);
$total_integral = bcadd($total_integral, $cart['integral']['use'], 2);
continue;
}
}
$cart['integral'] = null;

View File

@ -72,6 +72,9 @@ class ProductRepository extends BaseRepository
['integral_give_type',0],
'integral_give_rate',
'integral_give_money',
// 积分抵扣
['integral_deduction_type',0],
['integral_deduction_money',0],
];
protected $admin_filed = 'Product.product_id,Product.mer_id,brand_id,spec_type,unit_name,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,U.rank,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,Product.ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,star,ficti,integral_total,integral_price_total,sys_labels,param_temp_id,mer_svip_status,svip_price,svip_price_type';
protected $filed = 'Product.product_id,Product.mer_id,brand_id,unit_name,spec_type,mer_status,rate,reply_count,store_info,cate_id,Product.image,slider_image,Product.store_name,Product.keyword,Product.sort,Product.is_show,Product.sales,Product.price,extension_type,refusal,cost,Product.ot_price,stock,is_gift_bag,Product.care_count,Product.status,is_used,Product.create_time,Product.product_type,old_product_id,integral_total,integral_price_total,mer_labels,Product.is_good,Product.is_del,type,param_temp_id,mer_svip_status,svip_price,svip_price_type';
@ -480,6 +483,9 @@ class ProductRepository extends BaseRepository
'integral_give_type' => $data['integral_give_type'] ?? 0,
'integral_give_rate' => $data['integral_give_rate'] ?? 0,
'integral_give_money' => $data['integral_give_money'] ?? 0,
// 积分抵扣
'integral_deduction_type' => $data['integral_deduction_type'] ?? 0,
'integral_deduction_money' => $data['integral_deduction_money'] ?? 0,
];
if (isset($data['extend']))
$result['extend'] = $data['extend'] ? json_encode($data['extend'], JSON_UNESCAPED_UNICODE) : '';