调整消费金发放校验
This commit is contained in:
parent
55384b2c45
commit
f5a0094e1d
@ -4,7 +4,6 @@ namespace app\common\dao\store;
|
|||||||
|
|
||||||
use app\common\dao\BaseDao;
|
use app\common\dao\BaseDao;
|
||||||
use app\common\model\store\StoreActivityOrder;
|
use app\common\model\store\StoreActivityOrder;
|
||||||
use think\facade\Db;
|
|
||||||
|
|
||||||
class StoreActivityOrderDao extends BaseDao
|
class StoreActivityOrderDao extends BaseDao
|
||||||
{
|
{
|
||||||
|
@ -75,7 +75,7 @@ class StoreActivityUserDao extends BaseDao
|
|||||||
*/
|
*/
|
||||||
public function getValue(int $userId, int $activityId = 1)
|
public function getValue(int $userId, int $activityId = 1)
|
||||||
{
|
{
|
||||||
$data = StoreActivityUser::where('user_id', $userId)->where('activity_id', $activityId)->find();
|
$data = StoreActivityUser::where('user_id', $userId)->where('activity_id', $activityId)->where('status', 1)->find();
|
||||||
return $data->value ?? 0;
|
return $data->value ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,8 +110,7 @@ class StoreActivityUserDao extends BaseDao
|
|||||||
return ['target' => $target, 'allow_receive' => false, 'user_info' => $userInfo];
|
return ['target' => $target, 'allow_receive' => false, 'user_info' => $userInfo];
|
||||||
}
|
}
|
||||||
$storeConsumptionUserDao = new StoreConsumptionUserDao();
|
$storeConsumptionUserDao = new StoreConsumptionUserDao();
|
||||||
$storeConsumptionUserDao->consumption = $consumption;
|
$scope = $storeConsumptionUserDao->getScope($consumption, $myOrder['total_amount']);
|
||||||
$scope = $storeConsumptionUserDao->getScope($myOrder['total_amount']);
|
|
||||||
$userInfo = User::where('spread_uid', $userId)->field('uid,nickname,avatar')->select()->toArray();
|
$userInfo = User::where('spread_uid', $userId)->field('uid,nickname,avatar')->select()->toArray();
|
||||||
$orders = StoreActivityOrder::where('spread_id', $userId)
|
$orders = StoreActivityOrder::where('spread_id', $userId)
|
||||||
->whereIn('user_id', array_column($userInfo, 'uid'))
|
->whereIn('user_id', array_column($userInfo, 'uid'))
|
||||||
|
@ -4,6 +4,7 @@ namespace app\common\dao\store\consumption;
|
|||||||
|
|
||||||
use app\common\dao\BaseDao;
|
use app\common\dao\BaseDao;
|
||||||
use app\common\dao\store\StoreActivityOrderDao;
|
use app\common\dao\store\StoreActivityOrderDao;
|
||||||
|
use app\common\dao\store\StoreActivityUserDao;
|
||||||
use app\common\model\store\consumption\StoreConsumption;
|
use app\common\model\store\consumption\StoreConsumption;
|
||||||
use app\common\model\store\consumption\StoreConsumptionUser;
|
use app\common\model\store\consumption\StoreConsumptionUser;
|
||||||
use app\common\model\store\order\StoreGroupOrder;
|
use app\common\model\store\order\StoreGroupOrder;
|
||||||
@ -14,8 +15,6 @@ use think\facade\Db;
|
|||||||
class StoreConsumptionUserDao extends BaseDao
|
class StoreConsumptionUserDao extends BaseDao
|
||||||
{
|
{
|
||||||
|
|
||||||
public $consumption;
|
|
||||||
|
|
||||||
protected function getModel(): string
|
protected function getModel(): string
|
||||||
{
|
{
|
||||||
return StoreConsumptionUser::class;
|
return StoreConsumptionUser::class;
|
||||||
@ -23,73 +22,123 @@ class StoreConsumptionUserDao extends BaseDao
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验用户是否满足红包拉新活动条件
|
* 校验用户是否满足红包拉新活动条件
|
||||||
|
* @param int $userId 用户id
|
||||||
* @param int $groupOrderId 订单id
|
* @param int $groupOrderId 订单id
|
||||||
* @return false|void
|
* @return false|void
|
||||||
* @throws \think\db\exception\DataNotFoundException
|
* @throws \think\db\exception\DataNotFoundException
|
||||||
* @throws \think\db\exception\DbException
|
* @throws \think\db\exception\DbException
|
||||||
* @throws \think\db\exception\ModelNotFoundException
|
* @throws \think\db\exception\ModelNotFoundException
|
||||||
*/
|
*/
|
||||||
public function check(int $groupOrderId)
|
public function check(int $userId, int $groupOrderId)
|
||||||
{
|
{
|
||||||
$groupOrder = StoreGroupOrder::where('group_order_id', $groupOrderId)->where('paid', 1)->where('pay_time', '>=', $this->consumption['start_time'])->find()->toArray();
|
$spreadUserId = User::where('uid', $userId)->value('spread_uid');
|
||||||
if (!empty($this->consumption['config'])) {
|
$groupOrder = StoreGroupOrder::where('group_order_id', $groupOrderId)->find()->toArray();
|
||||||
// 根据当前订单金额,计算是否满足消费金发放条件
|
if (empty($spreadUserId)) {
|
||||||
$scope = $this->getScope($groupOrder['pay_price']);
|
$this->promoter($userId, $groupOrder, $spreadUserId);
|
||||||
if ($scope['rate'] <= 0) {
|
} else {
|
||||||
return false;
|
$this->guest($userId, $groupOrder, $spreadUserId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起人活动校验
|
||||||
|
* @param int $userId
|
||||||
|
* @param array $groupOrder
|
||||||
|
* @param int $spreadUserId
|
||||||
|
* @return bool
|
||||||
|
* @throws \think\db\exception\DataNotFoundException
|
||||||
|
* @throws \think\db\exception\DbException
|
||||||
|
* @throws \think\db\exception\ModelNotFoundException
|
||||||
|
*/
|
||||||
|
public function promoter(int $userId, array $groupOrder, int $spreadUserId)
|
||||||
|
{
|
||||||
|
$consumptionId = (new StoreActivityUserDao())->getValue($userId);
|
||||||
|
$consumption = StoreConsumption::where('coupon_id', $consumptionId)->where('status', 1)->find()->toArray();
|
||||||
|
//用户没有参加 消费金活动
|
||||||
|
if (!empty($consumption['config'])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$scope = $this->getScope($consumption, $groupOrder['pay_price']);
|
||||||
|
//用户没有达到 消费金活动 任一档次
|
||||||
|
if ($scope['rate'] <= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Db::startTrans();
|
||||||
|
try {
|
||||||
|
$isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time']);
|
||||||
|
$storeActivityOrderDao = new StoreActivityOrderDao();
|
||||||
|
$storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder);
|
||||||
|
if ($consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION) {
|
||||||
|
$this->send($consumption, $scope['rate'], $userId, $groupOrder['group_order_id'], $groupOrder['pay_price'], StoreConsumptionUser::STATUS_UNUSED);
|
||||||
|
$storeActivityOrderDao->repeal($groupOrder['group_order_id']);
|
||||||
}
|
}
|
||||||
Db::startTrans();
|
Db::commit();
|
||||||
try {
|
} catch (\Exception $e) {
|
||||||
$isFirstOrder = $this->isFirstOrder($groupOrder['uid'], $groupOrderId, $this->consumption['start_time']);
|
Db::rollback();
|
||||||
$storeActivityOrderDao = new StoreActivityOrderDao();
|
}
|
||||||
$spreadUserId = User::where('uid', $groupOrder['uid'])->value('spread_uid');
|
return true;
|
||||||
$spreadUserId = empty($spreadUserId) ? 0 : $spreadUserId;
|
}
|
||||||
$storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder);
|
|
||||||
if ($this->consumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION) {
|
/**
|
||||||
// 拉新返消费金
|
* 受邀人活动校验
|
||||||
// 用户作为推荐人,是否满足任务条件
|
* @param int $userId
|
||||||
$mineOrderIds = $this->isFinished($groupOrder['uid'], $scope);
|
* @param array $groupOrder
|
||||||
if ($mineOrderIds !== false) {
|
* @param int $spreadUserId
|
||||||
$mineOrderIds = "{$groupOrder['group_order_id']}," . $mineOrderIds;
|
* @return bool|void
|
||||||
$this->send($scope['rate'], $groupOrder['uid'], $mineOrderIds, $groupOrder['pay_price']);
|
* @throws \think\db\exception\DataNotFoundException
|
||||||
$storeActivityOrderDao->batchRepeal(explode(',', $mineOrderIds));
|
* @throws \think\db\exception\DbException
|
||||||
}
|
* @throws \think\db\exception\ModelNotFoundException
|
||||||
// 用户作为受邀人且当前订单是首单
|
*/
|
||||||
if ($spreadUserId && $isFirstOrder) {
|
public function guest(int $userId, array $groupOrder, int $spreadUserId)
|
||||||
// 查询推荐人满足条件的订单
|
{
|
||||||
$spreadGroupOrder = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->find();
|
// 查询推荐人的消费金类型
|
||||||
if ($spreadGroupOrder) {
|
$spreadConsumptionId = (new StoreActivityUserDao())->getValue($spreadUserId);
|
||||||
$spreadScope = $this->getScope($spreadGroupOrder['total_amount']);
|
$spreadConsumption = StoreConsumption::where('coupon_id', $spreadConsumptionId)->where('status', 1)->find()->toArray();
|
||||||
if ($spreadScope['start'] == $scope['start']) {
|
// 查询推荐人满足条件的有效订单
|
||||||
$spreadOrderIds = $this->isFinished($spreadUserId, $scope);
|
$spreadGroupOrderId = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->value('group_order_id');
|
||||||
if ($spreadOrderIds !== false) {
|
$spreadGroupOrder = StoreGroupOrder::where('group_order_id', $spreadGroupOrderId)->where('paid', 1)->find()->toArray();
|
||||||
$spreadOrderIds = "{$spreadGroupOrder['group_order_id']}," . $spreadOrderIds;
|
if (empty($spreadGroupOrder) || empty($spreadConsumption['config'])) {
|
||||||
$this->send($scope['rate'], $spreadUserId, $spreadOrderIds, $spreadGroupOrder['total_amount']);
|
// 推荐人消费金数据或推荐人的有效订单为空,作为发起人参加活动
|
||||||
$storeActivityOrderDao->batchRepeal(explode(',', $spreadOrderIds));
|
return $this->promoter($userId, $groupOrder, 0);
|
||||||
}
|
}
|
||||||
}
|
$spreadScope = $this->getScope($spreadConsumption, $spreadGroupOrder['pay_price']);
|
||||||
}
|
if ($groupOrder['pay_price'] < $spreadScope['start']) {
|
||||||
}
|
// 当前用户的订单不在推荐人的档位区间,作为发起人参加活动
|
||||||
} elseif ($this->consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION) {
|
return $this->promoter($userId, $groupOrder, 0);
|
||||||
$this->send($scope['rate'], $groupOrder['uid'], $groupOrder['group_order_id'], $groupOrder['pay_price'], StoreConsumptionUser::STATUS_UNUSED);
|
}
|
||||||
$storeActivityOrderDao->repeal($groupOrder['group_order_id']);
|
Db::startTrans();
|
||||||
|
try {
|
||||||
|
$isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time']);
|
||||||
|
$storeActivityOrderDao = new StoreActivityOrderDao();
|
||||||
|
$storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder);
|
||||||
|
if ($spreadConsumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION && $isFirstOrder) {
|
||||||
|
// 推荐人消费金类型为拉新且当前用户为首单
|
||||||
|
$spreadOrderIds = $this->isFinished($spreadUserId, $spreadScope);
|
||||||
|
if ($spreadOrderIds !== false) {
|
||||||
|
$spreadOrderIds = "{$spreadGroupOrder['group_order_id']}," . $spreadOrderIds;
|
||||||
|
$this->send($spreadConsumption, $spreadScope['rate'], $spreadUserId, $spreadOrderIds, $spreadGroupOrder['total_amount']);
|
||||||
|
$storeActivityOrderDao->batchRepeal(explode(',', $spreadOrderIds));
|
||||||
}
|
}
|
||||||
Db::commit();
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
Db::rollback();
|
|
||||||
}
|
}
|
||||||
|
Db::commit();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Db::rollback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取消费档位区间
|
* 获取消费档位区间
|
||||||
|
* @param array $consumption
|
||||||
* @param float $amount
|
* @param float $amount
|
||||||
* @return array|mixed
|
* @return array|mixed
|
||||||
*/
|
*/
|
||||||
public function getScope(float $amount)
|
public function getScope(array $consumption, float $amount)
|
||||||
{
|
{
|
||||||
$scope = [];
|
$scope = [];
|
||||||
foreach ($this->consumption['config'] as $item) {
|
foreach ($consumption['config'] as $k => $item) {
|
||||||
|
if (($k + 1) == count($consumption['config'])) {
|
||||||
|
$item['end'] = 100000000;
|
||||||
|
}
|
||||||
if ($item['start'] <= $amount && $item['end'] >= $amount) {
|
if ($item['start'] <= $amount && $item['end'] >= $amount) {
|
||||||
$item['rate'] = bcdiv($item['rate'], 100, 2);
|
$item['rate'] = bcdiv($item['rate'], 100, 2);
|
||||||
$scope = $item;
|
$scope = $item;
|
||||||
@ -110,7 +159,11 @@ class StoreConsumptionUserDao extends BaseDao
|
|||||||
*/
|
*/
|
||||||
public function isFinished(int $userId, array $scope)
|
public function isFinished(int $userId, array $scope)
|
||||||
{
|
{
|
||||||
$groupOrders = StoreActivityOrder::where('spread_id', $userId)->where('is_first_order', StoreActivityOrder::IS_FIRST_ORDER)->where('total_amount', '>=', $scope['start'])->where('status', StoreActivityOrder::STATUS_VALID)->field('group_order_id,user_id,total_amount')->select()->toArray();
|
$groupOrders = StoreActivityOrder::where('spread_id', $userId)
|
||||||
|
->where('is_first_order', StoreActivityOrder::IS_FIRST_ORDER)
|
||||||
|
->where('total_amount', '>=', $scope['start'])
|
||||||
|
->where('status', StoreActivityOrder::STATUS_VALID)
|
||||||
|
->field('group_order_id,user_id,total_amount')->select()->toArray();
|
||||||
$userOrders = [];
|
$userOrders = [];
|
||||||
foreach ($groupOrders as $groupOrder) {
|
foreach ($groupOrders as $groupOrder) {
|
||||||
if (!isset($userOrders[$groupOrder['user_id']])) {
|
if (!isset($userOrders[$groupOrder['user_id']])) {
|
||||||
@ -125,6 +178,7 @@ class StoreConsumptionUserDao extends BaseDao
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 发放消费金
|
* 发放消费金
|
||||||
|
* @param array $consumption 消费金类型
|
||||||
* @param float $rate 红包发放比例
|
* @param float $rate 红包发放比例
|
||||||
* @param int $userId 用户id
|
* @param int $userId 用户id
|
||||||
* @param string $groupOrderIds 订单id集合
|
* @param string $groupOrderIds 订单id集合
|
||||||
@ -133,12 +187,12 @@ class StoreConsumptionUserDao extends BaseDao
|
|||||||
* @return void
|
* @return void
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public function send(float $rate, int $userId, string $groupOrderIds, float $amount, $status = -2)
|
public function send(array $consumption, float $rate, int $userId, string $groupOrderIds, float $amount, $status = -2)
|
||||||
{
|
{
|
||||||
$model = new StoreConsumptionUser();
|
$model = new StoreConsumptionUser();
|
||||||
$model->coupon_id = $this->consumption['coupon_id'];
|
$model->coupon_id = $consumption['coupon_id'];
|
||||||
$model->uid = $userId;
|
$model->uid = $userId;
|
||||||
$model->coupon_title = $this->consumption['title'];
|
$model->coupon_title = $consumption['title'];
|
||||||
$model->order_id_set = $groupOrderIds;
|
$model->order_id_set = $groupOrderIds;
|
||||||
$model->coupon_price = bcmul($amount, $rate, 2);
|
$model->coupon_price = bcmul($amount, $rate, 2);
|
||||||
$model->balance = $model->coupon_price;
|
$model->balance = $model->coupon_price;
|
||||||
@ -155,19 +209,18 @@ class StoreConsumptionUserDao extends BaseDao
|
|||||||
/**
|
/**
|
||||||
* 判断是否是首单
|
* 判断是否是首单
|
||||||
* @param int $userId 用户id
|
* @param int $userId 用户id
|
||||||
* @param int $groupOrderId 订单id
|
|
||||||
* @param string $startTime 活动开始时间
|
* @param string $startTime 活动开始时间
|
||||||
* @return int
|
* @return int
|
||||||
* @throws \think\db\exception\DbException
|
* @throws \think\db\exception\DbException
|
||||||
*/
|
*/
|
||||||
public function isFirstOrder(int $userId, int $groupOrderId, string $startTime)
|
public function isFirstOrder(int $userId, string $startTime)
|
||||||
{
|
{
|
||||||
$isNewUser = User::where('uid', $userId)->where('create_time', '>=', $startTime)->count();
|
$isNewUser = User::where('uid', $userId)->where('create_time', '>=', $startTime)->count();
|
||||||
if ($isNewUser == 0) {
|
if ($isNewUser == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
$count = StoreGroupOrder::where('group_order_id', '<>', $groupOrderId)->where('paid', 1)->where('pay_time', '>=', $startTime)->count();
|
$count = StoreGroupOrder::where('uid', $userId)->where('paid', 1)->where('pay_time', '>=', $startTime)->count();
|
||||||
return intval($count == 0); // 如果是0 则表示是首单
|
return intval($count == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace app\listener;
|
namespace app\listener;
|
||||||
|
|
||||||
use app\common\dao\store\consumption\StoreConsumptionDao;
|
|
||||||
use app\common\dao\store\consumption\StoreConsumptionUserDao;
|
use app\common\dao\store\consumption\StoreConsumptionUserDao;
|
||||||
use app\common\dao\store\order\StoreCartDao;
|
use app\common\dao\store\order\StoreCartDao;
|
||||||
use app\common\dao\store\StoreActivityUserDao;
|
use app\common\dao\store\StoreActivityUserDao;
|
||||||
@ -35,13 +34,8 @@ class paySuccess
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$orderList = $event['groupOrder']['orderList'];
|
$orderList = $event['groupOrder']['orderList'];
|
||||||
$consumptionId = (new StoreActivityUserDao())->getValue($event['groupOrder']['uid']);
|
$storeConsumptionUserDao = new StoreConsumptionUserDao();
|
||||||
$consumption = (new StoreConsumptionDao())->getOne($consumptionId);
|
$storeConsumptionUserDao->check($event['groupOrder']['uid'], $event['groupOrder']['group_order_id']);
|
||||||
if (!empty($consumption)) {
|
|
||||||
$storeConsumptionUserDao = new StoreConsumptionUserDao();
|
|
||||||
$storeConsumptionUserDao->consumption = $consumption;
|
|
||||||
$storeConsumptionUserDao->check($event['groupOrder']['group_order_id']);
|
|
||||||
}
|
|
||||||
foreach ($orderList as $k => $order) {
|
foreach ($orderList as $k => $order) {
|
||||||
|
|
||||||
$this->recordOrderAddr($order);
|
$this->recordOrderAddr($order);
|
||||||
|
@ -463,6 +463,7 @@ Route::group('api/', function () {
|
|||||||
Route::post('choose', 'api.store.StoreActivity/choose'); //选择消费金类型
|
Route::post('choose', 'api.store.StoreActivity/choose'); //选择消费金类型
|
||||||
Route::get('status', 'api.store.StoreActivity/status'); //获取活动进度
|
Route::get('status', 'api.store.StoreActivity/status'); //获取活动进度
|
||||||
Route::post('receive', 'api.store.StoreActivity/receive'); //领取活动红包
|
Route::post('receive', 'api.store.StoreActivity/receive'); //领取活动红包
|
||||||
|
Route::get('record', 'api.store.StoreActivity/record'); //活动红包使用记录
|
||||||
});
|
});
|
||||||
})->middleware(UserTokenMiddleware::class, true);
|
})->middleware(UserTokenMiddleware::class, true);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user