调整红包余额查询

This commit is contained in:
luofei 2024-01-21 13:52:51 +08:00
parent 0b128503b1
commit 092801fa02
7 changed files with 73 additions and 27 deletions

View File

@ -33,6 +33,7 @@ class StoreActivityOrderDao extends BaseDao
$model->spread_id = $spreadId;
$model->pay_price = $groupOrder['pay_price'];
$model->is_first_order = $isFirstOrder;
$model->status = StoreActivityOrder::STATUS_VALID;
$consumptionDetail = StoreConsumptionDetail::where('group_order_id', $groupOrder['group_order_id'])
->field('group_order_id,sum(amount) amount,sum(pay_price) pay_price,coupon_user_id')
->find();

View File

@ -9,6 +9,7 @@ use app\common\model\store\consumption\StoreConsumptionUser;
use app\common\model\store\StoreActivityOrder;
use app\common\model\store\StoreActivityUser;
use app\common\model\user\User;
use app\common\model\user\UserBill;
class StoreActivityUserDao extends BaseDao
{
@ -168,24 +169,45 @@ class StoreActivityUserDao extends BaseDao
/**
* 红包获取记录
* @param int $userId
* @param int $type
* @param int $page
* @param int $limit
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function record(int $userId)
public function record(int $userId, int $type, int $page, int $limit)
{
$consumption = StoreConsumption::whereIn('type', [StoreConsumption::TYPE_OWNER_CONSUMPTION, StoreConsumption::TYPE_PULL_CONSUMPTION])->select()->toArray();
$record = StoreConsumptionUser::where('uid', $userId)
->whereIn('coupon_id', array_column($consumption, 'coupon_id'))
->where('status', '>=', StoreConsumptionUser::STATUS_UNUSED)
->field('coupon_price,order_amount,create_time')
->select();
$totalAmount = 0;
foreach ($record as $item) {
$totalAmount = bcadd($totalAmount, $item['coupon_price'], 2);
$totalAmount = StoreConsumptionUser::where('uid', $userId)
->whereIn('type', $type)
->where('status', StoreConsumptionUser::STATUS_UNUSED)
->sum('balance');
$query = UserBill::where('uid', $userId)
->where('category', 'red_pack')
->where('type', "red_pack_{$type}");
$count = $query->count();
$record = $query->page($page)->limit($limit)->select();
return ['total_amount' => $totalAmount, 'count' => $count, 'record' => $record];
}
/**
* 红包余额统计
* @param int $userId
* @return array
*/
public function total(int $userId)
{
$totalAmount = StoreConsumptionUser::where('uid', $userId)
->whereIn('type', [StoreConsumptionUser::TYPE_ONE, StoreConsumptionUser::TYPE_TWO])
->where('status', StoreConsumptionUser::STATUS_UNUSED)
->field('SUM(balance) as total_amount,type')
->group('type')
->select()->toArray();
foreach ($totalAmount as &$item) {
$item['type_cn'] = StoreConsumptionUser::TYPE_MAP[$item['type']];
}
return ['total_amount' => $totalAmount, 'record' => $record];
return $totalAmount;
}
}

View File

@ -56,11 +56,6 @@ class CommissionDao
if ($redPack > 0) {
$userId = Merchant::where('mer_id', $order['mer_id'])->value('uid');
$storeConsumptionDao->send($consumption, $consumption['config']['red_pack_rate'], $userId, $order['order_id'], $order['pay_price'], StoreConsumptionUser::STATUS_UNUSED, StoreConsumptionUser::TYPE_TWO);
$user = User::where('uid', $userId)->find();
$user->red_pack_balance = bcadd($user->red_pack_balance, $redPack, 2);
if (!$user->save()) {
throw new \Exception('红包余额更新出错');
}
}
$promotionCode = User::where('uid', $order['uid'])->value('promotion_code');
if (!empty($promotionCode)) {

View File

@ -58,10 +58,10 @@ class StoreConsumptionUserDao extends BaseDao
$activityUser = (new StoreActivityUserDao())->getOne($userId);
$consumption = (new StoreConsumptionDao())->getOne($activityUser['value'] ?? 0);
//用户没有参加 消费金活动 或 已超过任务完成时间
if (empty($consumption['config']) || strtotime('+1 year', $activityUser['create_time']) < time()) {
$endTime = $this->getEndTime($activityUser['create_time'] ?? '2024-01-01 00:00:00');
if (empty($consumption['config']) || $endTime < time()) {
return false;
}
$endTime = strtotime('+1 year', $activityUser['create_time']);
$orderValidAmount = min($groupOrder['pay_price'], $this->maxAmount);
$scope = $this->getScope($consumption, $orderValidAmount);
//用户没有达到 消费金活动 任一档次
@ -70,7 +70,7 @@ class StoreConsumptionUserDao extends BaseDao
}
Db::startTrans();
try {
$isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time'], $endTime);
$isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time'], date('Y-m-d H:i:s', $endTime));
$storeActivityOrderDao = new StoreActivityOrderDao();
$storeActivityOrder = $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder);
if ($consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION && $storeActivityOrder['status'] == StoreActivityOrder::STATUS_VALID) {
@ -99,14 +99,14 @@ class StoreConsumptionUserDao extends BaseDao
{
// 查询推荐人的消费金类型
$spreadActivityUser = (new StoreActivityUserDao())->getOne($spreadUserId);
$endTime = $this->getEndTime($spreadActivityUser['create_time'] ?? '2024-01-01 00:00:00');
$spreadConsumption = (new StoreConsumptionDao())->getOne($spreadActivityUser['value'] ?? 0);
// 查询推荐人满足条件的有效订单
$spreadGroupOrder = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->find();
if (empty($spreadGroupOrder) || empty($spreadConsumption['config']) || empty($spreadActivityUser) || strtotime('+1 year', $spreadActivityUser['create_time']) < time()) {
if (empty($spreadGroupOrder) || empty($spreadConsumption['config']) || empty($spreadActivityUser) || $endTime < time()) {
// 推荐人消费金数据为空 或 推荐人的有效订单为空 或推荐人已超过任务完成时间,作为发起人参加活动
return $this->promoter($userId, $groupOrder, 0);
}
$endTime = strtotime('+1 year', $spreadActivityUser['create_time']);
// 订单有效金额为实付金额+红包金额
$orderValidAmount = bcadd($spreadGroupOrder['pay_price'], $spreadGroupOrder['red_pack'], 2);
$orderValidAmount = min($orderValidAmount, $this->maxAmount);
@ -117,7 +117,7 @@ class StoreConsumptionUserDao extends BaseDao
}
Db::startTrans();
try {
$isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time'], $endTime);
$isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time'], date('Y-m-d H:i:s', $endTime));
$storeActivityOrderDao = new StoreActivityOrderDao();
$storeActivityOrder = $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder);
if ($spreadConsumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION && $isFirstOrder && $storeActivityOrder['status'] == StoreActivityOrder::STATUS_VALID) {
@ -147,6 +147,7 @@ class StoreConsumptionUserDao extends BaseDao
foreach ($consumption['config'] as $k => $item) {
if ($item['start'] <= $amount && $item['end'] >= $amount) {
$item['rate'] = bcdiv($item['rate'], 100, 2);
$item['rate_two'] = (isset($item['rate_two']) && $item['rate_two'] > 0) ? bcdiv($item['rate_two'], 100, 2) : 0;
$scope = $item;
break;
}
@ -219,15 +220,16 @@ class StoreConsumptionUserDao extends BaseDao
if (!$model->save()) {
throw new \Exception('发放失败');
}
$title = $type == StoreConsumptionUser::TYPE_TWO ? '现金抵扣红包' : '无门槛实物通用红包';
// 写入红包日志
/** @var $userBillRepository UserBillRepository */
$userBillRepository = app()->make(UserBillRepository::class);
$userBillRepository->incBill($userId, 'red_pack', "red_pack_{$type}", [
'link_id' => $model['coupon_user_id'],
'status' => 1,
'title' => '获得现金抵扣红包',
'title' => '获得' . $title,
'number' => $couponPrice,
'mark' => '获得现金抵扣红包' . $couponPrice,
'mark' => '获得' . $title . $couponPrice,
'balance' => 0
]);
}
@ -247,7 +249,12 @@ class StoreConsumptionUserDao extends BaseDao
return 0;
}
$count = StoreGroupOrder::where('uid', $userId)->where('paid', 1)->whereBetweenTime('pay_time', $startTime, $endTime)->count();
return intval($count == 1);
return intval($count <= 1);
}
public function getEndTime($datetime)
{
return strtotime('+1 year', strtotime($datetime));
}
}

View File

@ -15,6 +15,11 @@ class StoreConsumptionUser extends BaseModel
const TYPE_ONE = 1; //实物通用红包
const TYPE_TWO = 2; //现金抵扣红包
const TYPE_MAP = [
self::TYPE_ONE => '无门槛实物通用红包',
self::TYPE_TWO => '现金抵扣红包',
];
public static function tablePk(): string
{
return 'coupon_user_id';

View File

@ -80,7 +80,22 @@ class StoreActivity extends BaseController
public function record(StoreActivityUserDao $dao)
{
$userId = $this->request->uid();
$result = $dao->record($userId);
$type = $this->request->get('type', 1);
$page = $this->request->get('page', 1);
$limit = $this->request->get('limit', 10);
$result = $dao->record($userId, $type, $page, $limit);
return app('json')->success($result);
}
/**
* 红包余额统计
* @param StoreActivityUserDao $dao
* @return mixed
*/
public function total(StoreActivityUserDao $dao)
{
$userId = $this->request->uid();
$result = $dao->total($userId);
return app('json')->success($result);
}

View File

@ -463,7 +463,8 @@ Route::group('api/', function () {
Route::post('choose', 'api.store.StoreActivity/choose'); //选择消费金类型
Route::get('status', 'api.store.StoreActivity/status'); //获取活动进度
Route::post('receive', 'api.store.StoreActivity/receive'); //领取活动红包
Route::get('record', 'api.store.StoreActivity/record'); //活动红包使用记录
Route::get('record', 'api.store.StoreActivity/record'); //活动红包获取记录
Route::get('total', 'api.store.StoreActivity/total'); //活动红包统计
});
})->middleware(UserTokenMiddleware::class, true);