增加:酒兑换将额度区分为 瓶装酒和封坛酒

修复:订单完成后 菜卡额度和封坛酒额度未解冻
修复:封坛酒兑换后减少了瓶装酒额度而不是封坛酒额度的问题
修改:酒兑换列表 可用瓶装酒额度和封坛酒额度显示错误,未减少冻结中额度
This commit is contained in:
wuhui_zzw 2024-06-04 11:27:31 +08:00
parent a6d33770ac
commit 7923620413
7 changed files with 186 additions and 57 deletions

View File

@ -2,6 +2,7 @@
namespace app\common\repositories\store\order;
use app\common\model\store\product\Product;
use app\common\model\user\ExchangeIntegralRecord;
use app\common\model\user\ExchangeQuotaRecord;
use app\common\model\user\User;
@ -1323,47 +1324,23 @@ class StoreOrderCreateRepository extends StoreOrderRepository{
]);
$user->save();
}
// 用户兑换酒道馆商品相关操作
if($groupOrder['activity_type'] == 36){
// 减少酒水卡积分
if($groupOrder['exchange_integral'] > 0){
$userInfo = User::where('uid',$user['uid'])->findOrEmpty();
$integralChangeFront = (float)$userInfo->exchange_integral;
$userInfo->exchange_integral -= (float)$groupOrder['exchange_integral'];
$userInfo->exchange_integral = $userInfo->exchange_integral > 0 ? $userInfo->exchange_integral : 0;
$userInfo->save();
ExchangeIntegralRecord::insert([
'uid' => $user['uid'],
'product_id' => 0,
'order_id' => 0,
'order_product_id' => 0,
'change_type' => 0,
'change_quantity' => (float)$groupOrder['exchange_integral'],
'change_front' => $integralChangeFront,
'change_after' => (float)$userInfo->exchange_integral,
'remark' => "兑换消费",
]);
}
// 变更额度
$userHoldInfo = app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user['uid'],'quota_type'=>1])
->findOrEmpty();
$changeFront = (float)$userHoldInfo->surplus_quota;
$userHoldInfo->use_quota += (float)$groupOrder['total_price'];
$userHoldInfo->surplus_quota -= (float)$groupOrder['total_price'];
$userHoldInfo->save();
ExchangeQuotaRecord::insert([
// 用户兑换酒道馆商品 减少酒水卡积分
if($groupOrder['activity_type'] == 36 && $groupOrder['exchange_integral'] > 0){
$userInfo = User::where('uid',$user['uid'])->findOrEmpty();
$integralChangeFront = (float)$userInfo->exchange_integral;
$userInfo->exchange_integral -= (float)$groupOrder['exchange_integral'];
$userInfo->exchange_integral = $userInfo->exchange_integral > 0 ? $userInfo->exchange_integral : 0;
$userInfo->save();
ExchangeIntegralRecord::insert([
'uid' => $user['uid'],
'product_id' => 0,
'order_id' => 0,
'order_product_id' => 0,
'change_type' => 0,
'change_quantity' => (float)$groupOrder['total_price'],
'change_front' => $changeFront,
'change_after' => (float)$userHoldInfo->surplus_quota,
'change_quantity' => (float)$groupOrder['exchange_integral'],
'change_front' => $integralChangeFront,
'change_after' => (float)$userInfo->exchange_integral,
'remark' => "兑换消费",
'source' => 2,
'quota_type' => 1,
]);
}
@ -1502,11 +1479,39 @@ class StoreOrderCreateRepository extends StoreOrderRepository{
// 进货订单 - 补货额度抵扣金额
'mer_quota_deduction' => $cart['mer_quota_deduction'] ?? 0,
];
// 用户兑换商品 变更相关额度
if($cart['product_type'] == 36){
// 酒类型0=未知1=瓶装酒2=封坛酒
$wineType = (int)Product::where('product_id', $cart['product_id'])->value('wine_type');
if($wineType > 0){
// 额度类型1=酒卡额度(瓶装酒)2=菜卡额度3=封坛酒额度4=加油卡额度
$quotaType = $wineType == 2 ? 3 : 1;
$userHoldInfo = app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user['uid'],'quota_type'=>$quotaType])
->findOrEmpty();
$changeFront = (float)$userHoldInfo->surplus_quota;
$userHoldInfo->use_quota += (float)$cart['total_price'];
$userHoldInfo->surplus_quota -= (float)$cart['total_price'];
$userHoldInfo->save();
ExchangeQuotaRecord::insert([
'uid' => $user['uid'],
'product_id' => 0,
'order_id' => 0,
'order_product_id' => 0,
'change_type' => 0,
'change_quantity' => (float)$cart['total_price'],
'change_front' => $changeFront,
'change_after' => (float)$userHoldInfo->surplus_quota,
'remark' => "兑换消费",
'source' => 2,
'quota_type' => $quotaType,
]);
}
}
}
$userMerchantRepository->getInfo($uid,$order['mer_id']);
app()
->make(MerchantRepository::class)
->incSales($order['mer_id'],$order['total_num']);
app()->make(MerchantRepository::class)->incSales($order['mer_id'],$order['total_num']);
}
if(count($bills) > 0){
app()

View File

@ -2138,8 +2138,10 @@ class ProductRepository extends BaseRepository
$productType = 35;// 酒道馆进货商品
if($merchantType == 1) $productType = 36;// 用户兑换酒道馆商品
$count = $storeOrderRepository->getShopMaxCountNumber($merId,$product['product_id'], $productType);
if (($data['cart_num'] + $count) > $product['once_max_count']){
throw new ValidateException('[超出限购总数:'. $product['once_max_count'].']'.mb_substr($product['store_name'],0,10).'...');
$sumCount = $data['cart_num'] + $count;
if ($sumCount > $product['once_max_count']){
throw new ValidateException("超出限购总数!本次购买数量:{$data['cart_num']},已购买数量:{$count},合计:{$sumCount};限购:{$product['once_max_count']}");
// throw new ValidateException('[超出限购总数:'. $product['once_max_count'].']'.mb_substr($product['store_name'],0,10).'...');
}
}
if ($product['type'] && !$data['is_new']) throw new ValidateException('虚拟商品不可加入购物车');
@ -2617,6 +2619,7 @@ class ProductRepository extends BaseRepository
->where('Merchant.status', 1)
->where('Merchant.mer_state', 1)
->where('Merchant.merchant_type', 1)
->where('Product.stock', '>', 0)
->whereIn('Product.wine_type', [1,2])
->when(isset($search['store_name']) && $search['store_name'] !== '', function ($query) use ($search) {
$query->whereLike('Product.store_name', "%{$search['store_name']}%");
@ -2642,7 +2645,8 @@ class ProductRepository extends BaseRepository
'Product.batch_unit',
'Product.image',
'Product.stock',
'Product.once_min_count'
'Product.once_min_count',
'Product.wine_type'
];
// 经纬度
$lng = $search['lng'] ?? 0;

View File

@ -138,6 +138,30 @@ class ExchangeQuotaRepository extends BaseRepository{
]);
});
}
/**
* Common: 获取信息
* Author: wu-hui
* Time: 2024/06/04 10:42
* @param int $uid
* @param int $quotaType 额度类型1=酒卡额度(瓶装酒)2=菜卡额度3=封坛酒额度4=加油卡额度
* @return mixed
*/
public function getInfo(int $uid,int $quotaType = 1){
$info = $this->searchModel([
'uid' => $uid,
'quota_type' => $quotaType,
])
->field('id,uid,total_quota,use_quota,surplus_quota,freeze_quota,quota_type')
->findOrEmpty()
->toArray();
if($info){
// 计算可用额度
$info['available_quota'] = (float)sprintf("%.2f", $info['surplus_quota'] - $info['freeze_quota']);
}
return $info;
}

View File

@ -209,18 +209,21 @@ class Auth extends BaseController
$agentCount = app()->make(AgentRepository::class)->getSearchModel(['uid'=>$user->uid])->count();
$data['is_agent'] = $agentCount > 0;
// 用户持有全部额度(冻结中 + 可用额度)
$data['available'] = (float)app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user->uid])
->value('surplus_quota');
$data['vegetable_available'] = (float)app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user->uid,'quota_type'=>2])
->value('surplus_quota');
$data['wine_available'] = (float)app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user->uid,'quota_type'=>3])
->value('surplus_quota');
$data['oil_available'] = (float)app()->make(ExchangeQuotaRepository::class)
->searchModel(['uid'=>$user->uid,'quota_type'=>4])
->value('surplus_quota');
$quotaInfo = app()->make(ExchangeQuotaRepository::class)->getInfo((int)$user->uid);
$data['available'] = $quotaInfo['surplus_quota'] ?? '0.00';
$data['available_quota'] = $quotaInfo['available_quota'] ?? '0.00';
$vegetableQuotaInfo = app()->make(ExchangeQuotaRepository::class)->getInfo((int)$user->uid, (int)2);
$data['vegetable_available'] = $vegetableQuotaInfo['surplus_quota'] ?? '0.00';
$data['vegetable_available_quota'] = $vegetableQuotaInfo['available_quota'] ?? '0.00';
$wineQuotaInfo = app()->make(ExchangeQuotaRepository::class)->getInfo((int)$user->uid, (int)3);
$data['wine_available'] = $wineQuotaInfo['surplus_quota'] ?? '0.00';
$data['wine_available_quota'] = $wineQuotaInfo['available_quota'] ?? '0.00';
$oilQuotaInfo = app()->make(ExchangeQuotaRepository::class)->getInfo((int)$user->uid, (int)4);
$data['oil_available'] = $oilQuotaInfo['surplus_quota'] ?? '0.00';
$data['oil_available_quota'] = $oilQuotaInfo['available_quota'] ?? '0.00';
return app('json')->success($data);
}

View File

@ -78,7 +78,7 @@ class Wine extends BaseController{
$query->field(['product_id','detail','image','price','sku','unique','value_id', 'stock']);
},
'product' => function($query){
$query->field(['product_id','store_name','unit_name','is_batch','batch_num','batch_unit']);
$query->field(['product_id','store_name','unit_name','is_batch','batch_num','batch_unit', 'wine_type']);
}
])
->select()

View File

@ -36,10 +36,13 @@ class OrderTakeEvent{
// 酒卡额度解冻
$this->quotaThawing($order);
// 菜卡额度解冻
$this->vegetableQuotaThawing($order);
// 封坛酒额度解冻
$this->wineQuotaThawing($order);
// 商户佣金结算
$this->merMoneyHandle($order->order_id);
}
}catch(\Exception $e){
if($order->activity_type == 35){
@ -74,6 +77,58 @@ class OrderTakeEvent{
$hold->save();
}
}
// 菜卡额度解冻
private function vegetableQuotaThawing($order){
# 获取变更记录 条件order_id=当前订单id、变更类型=增加
$sum = (float)app()->make(ExchangeQuotaRecordRepository::class)
->searchModel([
'order_id' => $order->order_id,
'change_type' => 1,
'source' => 0,// 仅查询购买赠送 进行解冻
'quota_type' => 2,
])->sum('change_quantity');
$refundSum = (float)app()->make(ExchangeQuotaRecordRepository::class)
->searchModel([
'order_id' => $order->order_id,
'change_type' => 0,
'source' => 1,// 仅查询订单退款 减少内容
'quota_type' => 2,
])->sum('change_quantity');
// 剩余数量 解冻
$surplusQuota = (float)sprintf("%.2f",$sum - $refundSum);
if($surplusQuota > 0){
$hold = app()->make(ExchangeQuotaRepository::class)->searchModel(['uid'=>$order->uid,'quota_type'=>2])->findOrEmpty();
$freezeQuota = sprintf("%.2f",$hold->freeze_quota - $surplusQuota);
$hold->freeze_quota = $freezeQuota < 0 ? 0 : $freezeQuota;
$hold->save();
}
}
// 封坛酒额度解冻
private function wineQuotaThawing($order){
# 获取变更记录 条件order_id=当前订单id、变更类型=增加
$sum = (float)app()->make(ExchangeQuotaRecordRepository::class)
->searchModel([
'order_id' => $order->order_id,
'change_type' => 1,
'source' => 0,// 仅查询购买赠送 进行解冻
'quota_type' => 3,
])->sum('change_quantity');
$refundSum = (float)app()->make(ExchangeQuotaRecordRepository::class)
->searchModel([
'order_id' => $order->order_id,
'change_type' => 0,
'source' => 1,// 仅查询订单退款 减少内容
'quota_type' => 3,
])->sum('change_quantity');
// 剩余数量 解冻
$surplusQuota = (float)sprintf("%.2f",$sum - $refundSum);
if($surplusQuota > 0){
$hold = app()->make(ExchangeQuotaRepository::class)->searchModel(['uid'=>$order->uid,'quota_type'=>3])->findOrEmpty();
$freezeQuota = sprintf("%.2f",$hold->freeze_quota - $surplusQuota);
$hold->freeze_quota = $freezeQuota < 0 ? 0 : $freezeQuota;
$hold->save();
}
}
// 商户佣金结算
private function merMoneyHandle($order_id){
$list = FinancialRecord::getDB()

View File

@ -27,6 +27,8 @@ class OrderVerifyEvent{
$this->wineCard($orderId, $order);
// 菜卡额度解冻
$this->dish($orderId, $order);
// 封坛酒额度解冻
$this->windQuota($orderId, $order);
// 商户佣金结算
$this->merMoneyHandle($orderId);
@ -79,7 +81,7 @@ class OrderVerifyEvent{
Log::info('订单核销 - 酒卡额度相关处理 - 错误: '.$e->getMessage());
}
}
// 酒水卡额度解冻
// 卡额度解冻
public function dish($orderId, $order){
try{
# 获取变更记录 条件order_id=当前订单id、变更类型=增加
@ -114,6 +116,42 @@ class OrderVerifyEvent{
Log::info('订单核销 - 菜卡额度相关处理 - 错误: '.$e->getMessage());
}
}
// 封坛酒额度解冻
public function windQuota($orderId, $order){
try{
# 获取变更记录 条件order_id=当前订单id、变更类型=增加
$sum = (float)app()->make(ExchangeQuotaRecordRepository::class)->searchModel([
'order_id' => $orderId,
'change_type' => 1,
'source' => 0,// 仅查询购买赠送 进行解冻
'quota_type' => 3,
])->sum('change_quantity');
$refundSum = (float)app()->make(ExchangeQuotaRecordRepository::class)
->searchModel([
'order_id' => $orderId,
'change_type' => 0,
'source' => 1,// 仅查询订单退款 减少内容
'quota_type' => 3,
])->sum('change_quantity');
// 剩余数量 解冻
$surplusQuota = (float)sprintf("%.2f",$sum - $refundSum);
if($surplusQuota > 0){
// 核销订单 会进行拆分操作 需要获取当前订单占总订单数量的比例
$totalNum = (float)$this->getRate($orderId);
$currentTotalNum = (float)$order->total_num;
$rate = (float)sprintf("%.2f",$currentTotalNum / $totalNum * 100);
$surplusQuota = (float)sprintf("%.2f",$surplusQuota * $rate / 100);
// 解冻操作
$hold = app()->make(ExchangeQuotaRepository::class)->searchModel(['uid'=>$order->uid,'quota_type'=>3])->findOrEmpty();
$freezeQuota = sprintf("%.2f",$hold->freeze_quota - $surplusQuota);
$hold->freeze_quota = $freezeQuota < 0 ? 0 : $freezeQuota;
$hold->save();
}
}catch(\Exception $e){
Log::info('订单核销 - 菜卡额度相关处理 - 错误: '.$e->getMessage());
}
}
// 商户佣金结算
private function merMoneyHandle($order_id){
$list = FinancialRecord::getDB()