feat : coupon
This commit is contained in:
@@ -55,4 +55,16 @@ class CouponCode
|
|||||||
* @var int 优惠券发放方式 0 系统发放
|
* @var int 优惠券发放方式 0 系统发放
|
||||||
*/
|
*/
|
||||||
const int SYSTEMIC_DISTRIBUTION = 0;
|
const int SYSTEMIC_DISTRIBUTION = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int 优惠券有效期类型 1 按天 2 按固定日期
|
||||||
|
*/
|
||||||
|
CONST INT VALIDITY_TIME_TYPE_CYCLE = 1;
|
||||||
|
CONST INT VALIDITY_TIME_TYPE_FIX = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int 优惠券分发状态 1 有效 2 无效
|
||||||
|
*/
|
||||||
|
CONST INT DISPENSE_VALIDITY = 1;
|
||||||
|
CONST INT DISPENSE_NULL = 2;
|
||||||
}
|
}
|
||||||
@@ -5,13 +5,18 @@ declare(strict_types=1);
|
|||||||
namespace App\Controller\Api;
|
namespace App\Controller\Api;
|
||||||
|
|
||||||
use App\Controller\AbstractController;
|
use App\Controller\AbstractController;
|
||||||
|
use App\Middleware\Api\JwtAuthMiddleware;
|
||||||
use App\Service\Api\Coupon\CouponListService;
|
use App\Service\Api\Coupon\CouponListService;
|
||||||
use App\Service\Api\Coupon\HomePopupsService;
|
use App\Service\Api\Coupon\HomePopupsService;
|
||||||
use Hyperf\HttpServer\Annotation\Controller;
|
use Hyperf\HttpServer\Annotation\Controller;
|
||||||
|
use Hyperf\HttpServer\Annotation\Middlewares;
|
||||||
use Hyperf\HttpServer\Annotation\RequestMapping;
|
use Hyperf\HttpServer\Annotation\RequestMapping;
|
||||||
use Hyperf\Validation\Annotation\Scene;
|
use Hyperf\Validation\Annotation\Scene;
|
||||||
|
|
||||||
#[Controller(prefix: 'api/coupon')]
|
#[Controller(prefix: 'api/coupon')]
|
||||||
|
#[Middlewares([
|
||||||
|
JwtAuthMiddleware::class,
|
||||||
|
])]
|
||||||
class CouponController extends AbstractController
|
class CouponController extends AbstractController
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ use Hyperf\DbConnection\Model\Model;
|
|||||||
* @property string $use_scene_ids
|
* @property string $use_scene_ids
|
||||||
* @property int $validity_time_type
|
* @property int $validity_time_type
|
||||||
* @property string $validity_time_value
|
* @property string $validity_time_value
|
||||||
|
* @property int $status
|
||||||
* @property string $remark
|
* @property string $remark
|
||||||
* @property string $create_time
|
* @property string $create_time
|
||||||
* @property string $update_time
|
* @property string $update_time
|
||||||
@@ -43,7 +44,7 @@ class CouponDispenseLog extends Model
|
|||||||
/**
|
/**
|
||||||
* The attributes that should be cast to native types.
|
* The attributes that should be cast to native types.
|
||||||
*/
|
*/
|
||||||
protected array $casts = ['id' => 'integer', 'coupon_template_id' => 'integer', 'send_count' => 'integer', 'receive_count' => 'integer', 'left_count' => 'integer', 'item_count' => 'integer', 'appoint_group' => 'integer', 'claim_rule' => 'integer', 'appoint_city_id' => 'integer', 'validity_time_type' => 'integer'];
|
protected array $casts = ['id' => 'integer', 'coupon_template_id' => 'integer', 'send_count' => 'integer', 'receive_count' => 'integer', 'left_count' => 'integer', 'item_count' => 'integer', 'appoint_group' => 'integer', 'claim_rule' => 'integer', 'appoint_city_id' => 'integer', 'validity_time_type' => 'integer','status' => 'integer'];
|
||||||
|
|
||||||
const string CREATED_AT = 'create_time';
|
const string CREATED_AT = 'create_time';
|
||||||
const string UPDATED_AT = 'update_time';
|
const string UPDATED_AT = 'update_time';
|
||||||
@@ -85,12 +86,14 @@ class CouponDispenseLog extends Model
|
|||||||
->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS)
|
->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS)
|
||||||
->whereColumn('total_count','!=','receive_count')
|
->whereColumn('total_count','!=','receive_count')
|
||||||
->where('appoint_group',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE)
|
->where('appoint_group',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE)
|
||||||
|
->where('status',CouponCode::DISPENSE_VALIDITY)
|
||||||
->pluck('id')
|
->pluck('id')
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
$appoint = $this
|
$appoint = $this
|
||||||
->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS)
|
->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS)
|
||||||
->where('appoint_group','!=',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE)
|
->where('appoint_group','!=',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE)
|
||||||
|
->where('status',CouponCode::DISPENSE_VALIDITY)
|
||||||
->pluck('id')
|
->pluck('id')
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ class UserCoupon extends Model
|
|||||||
{
|
{
|
||||||
return $this
|
return $this
|
||||||
->where('user_id', $user_id)
|
->where('user_id', $user_id)
|
||||||
->whereIn('coupon_id', $couponIdArr)
|
->whereIn('coupon_dispense_id', $couponIdArr)
|
||||||
->pluck('coupon_id')
|
->pluck('coupon_dispense_id')
|
||||||
->toArray();
|
->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ namespace App\Service\Api\Coupon;
|
|||||||
|
|
||||||
use App\Constants\Common\CouponCode;
|
use App\Constants\Common\CouponCode;
|
||||||
use App\Exception\ErrException;
|
use App\Exception\ErrException;
|
||||||
|
use App\Extend\DateUtil;
|
||||||
use App\Model\CouponDispenseLog;
|
use App\Model\CouponDispenseLog;
|
||||||
use App\Model\CouponDispenseUser;
|
use App\Model\CouponDispenseUser;
|
||||||
use App\Model\UserCoupon;
|
use App\Model\UserCoupon;
|
||||||
@@ -39,7 +40,9 @@ class HomePopupsService extends BaseService
|
|||||||
#[Inject]
|
#[Inject]
|
||||||
protected UserCoupon $userCouponModel;
|
protected UserCoupon $userCouponModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function handle(): array
|
public function handle(): array
|
||||||
{
|
{
|
||||||
$dispenseIds = $this->couponDispenseUserModel->getNoReceiveCountByUserId($this->userId);
|
$dispenseIds = $this->couponDispenseUserModel->getNoReceiveCountByUserId($this->userId);
|
||||||
@@ -48,7 +51,7 @@ class HomePopupsService extends BaseService
|
|||||||
if (empty($dispenseIds) && empty($data['all']) && empty($data['appoint'])) return $this->returnNullRes();
|
if (empty($dispenseIds) && empty($data['all']) && empty($data['appoint'])) return $this->returnNullRes();
|
||||||
|
|
||||||
$allDispenseIds = [];
|
$allDispenseIds = [];
|
||||||
if (!empty($all['all'])) {
|
if (!empty($data['all'])) {
|
||||||
$allDispenseIds = $this->userCouponModel->getReceiveCountByUserIds($this->userId,$data['all']);
|
$allDispenseIds = $this->userCouponModel->getReceiveCountByUserIds($this->userId,$data['all']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,44 +62,71 @@ class HomePopupsService extends BaseService
|
|||||||
|
|
||||||
if (empty($canReceive)) return $this->returnNullRes();
|
if (empty($canReceive)) return $this->returnNullRes();
|
||||||
|
|
||||||
$this->receive($canReceive);
|
$res = $this->receive($canReceive);
|
||||||
|
|
||||||
return $this->return->success('success',['canReceive'=>$canReceive]);
|
return $this->return->success('success',['coupon_data' => $res]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
* @return void
|
* @return array
|
||||||
*/
|
*/
|
||||||
private function receive(array $data): void
|
private function receive(array $data): array
|
||||||
{
|
{
|
||||||
$list = $this->couponDispenseLogModel->getListByIds($data);
|
$list = $this->couponDispenseLogModel->getListByIds($data);
|
||||||
if (empty($list)) return;
|
if (empty($list)) return [];
|
||||||
|
|
||||||
$insertData = [];
|
$insertData = [];
|
||||||
$appointUpdateData = [];
|
$appointUpdateData = [];
|
||||||
$allUpdateData =[];
|
$allUpdateData =[];
|
||||||
|
$destroyDispenseData = [];
|
||||||
|
|
||||||
|
$resCouponData = [];
|
||||||
|
|
||||||
foreach ($list as $item) {
|
foreach ($list as $item) {
|
||||||
|
$validityTime = [];
|
||||||
|
switch ($item['validity_time_type']) {
|
||||||
|
case CouponCode::VALIDITY_TIME_TYPE_CYCLE:
|
||||||
|
$validityValue = json_decode($item['validity_time_value'],true);
|
||||||
|
$validityTime = [
|
||||||
|
'start_time' => date('Y-m-d H:i:s'),
|
||||||
|
'end_time' => date('Y-m-d H:i:s', time() + ($validityValue['day_num'] * DateUtil::DAY))
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
case CouponCode::VALIDITY_TIME_TYPE_FIX:
|
||||||
|
$validityTime = json_decode($item['validity_time_value'],true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//有效期不存在或者到期销毁当前分发逻辑
|
||||||
|
if (($validityTime['end_time'] ?? date('Y-m-d H:i:s')) < date('Y-m-d H:i:s')) {
|
||||||
|
$destroyDispenseData[] = $item['id'];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$oneData = [
|
$oneData = [
|
||||||
'user_id' => $this->userId,
|
'user_id' => $this->userId,
|
||||||
'coupon_template_id' => $item['coupon_template_id'],
|
'coupon_template_id' => $item['coupon_template_id'],
|
||||||
'coupon_name' => $item['coupon_name']->coupon_name,
|
'coupon_name' => $item['coupon_name'],
|
||||||
'coupon_dispense_id' => $item['id'],
|
'coupon_dispense_id' => $item['id'],
|
||||||
'status' => CouponCode::COUPON_STATUS_UNUSED,
|
'status' => CouponCode::COUPON_STATUS_UNUSED,
|
||||||
'validity_start_time' => $item['validity_start_time'],
|
'validity_start_time' => $validityTime['start_time'] ?? date('Y-m-d H:i:s', time()),
|
||||||
'validity_end_time' => $item['validity_end_time'],
|
'validity_end_time' => $validityTime['end_time'] ?? date('Y-m-d H:i:s', time()),
|
||||||
];
|
];
|
||||||
|
|
||||||
$copies = array_map(function () use ($oneData) {
|
$copies = array_map(function () use ($oneData) {
|
||||||
return $oneData;
|
return $oneData;
|
||||||
}, array_fill(0, $item['item_count'], null));
|
}, array_fill(0, $item['item_count'], null));
|
||||||
|
|
||||||
$insertData = array_merge($insertData, $copies);
|
$insertData = array_merge($insertData, $copies);
|
||||||
|
|
||||||
|
$oneData['count'] = $item['item_count'];
|
||||||
|
|
||||||
if ($item['appoint_group'] != CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) {
|
if ($item['appoint_group'] != CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) {
|
||||||
$appointUpdateData[] = [
|
$appointUpdateData[] = [
|
||||||
'coupon_dispense_id' => $item['id'],
|
'coupon_dispense_id' => $item['id'],
|
||||||
'user_id' => $this->userId,
|
// 'user_id' => $this->userId,
|
||||||
|
'receive_count' => $item['receive_count'],
|
||||||
|
'is_receive' => CouponCode::DISPENSE_STATUS_IS_RECEIVED
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,9 +134,11 @@ class HomePopupsService extends BaseService
|
|||||||
'id' => $item['id'],
|
'id' => $item['id'],
|
||||||
'receive_count' => $item['receive_count'] +$item['item_count'],
|
'receive_count' => $item['receive_count'] +$item['item_count'],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$resCouponData[] = $oneData;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($allUpdateData)) return;
|
if (empty($allUpdateData)) return [];
|
||||||
|
|
||||||
if (!empty($appointUpdateData)) {
|
if (!empty($appointUpdateData)) {
|
||||||
$appointList = $this->couponDispenseUserModel->where('user_id',$this->userId)->whereIn('id',array_column($appointUpdateData,'coupon_dispense_id'))->pluck('id','coupon_dispense_id');
|
$appointList = $this->couponDispenseUserModel->where('user_id',$this->userId)->whereIn('id',array_column($appointUpdateData,'coupon_dispense_id'))->pluck('id','coupon_dispense_id');
|
||||||
@@ -116,19 +148,46 @@ class HomePopupsService extends BaseService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Db::transaction(function () use($allUpdateData,$appointUpdateData,$insertData) {
|
Db::transaction(function () use($allUpdateData,$appointUpdateData,$insertData,$destroyDispenseData) {
|
||||||
$appointUpdateFlag = true;
|
$appointUpdateFlag = true;
|
||||||
|
|
||||||
if (!empty($appointUpdateData)) {
|
if (!empty($appointUpdateData)) {
|
||||||
$appointUpdateFlag = (new CouponDispenseUser())->update($appointUpdateData);
|
$userUpdateModel = new CouponDispenseUser();
|
||||||
|
foreach (array_chunk($appointUpdateData, 500) as $chunk) {
|
||||||
|
foreach ($chunk as $item) {
|
||||||
|
$appointUpdateFlag = $userUpdateModel
|
||||||
|
->where('id',$item['id'])
|
||||||
|
->update(array_diff_key($item, ['coupon_dispense_id' => null,'id' => null]));
|
||||||
|
if (!$appointUpdateFlag) break;
|
||||||
|
}
|
||||||
|
if (!$appointUpdateFlag) break;
|
||||||
|
}
|
||||||
|
// $appointUpdateFlag = (new CouponDispenseUser)->update($appointUpdateData);
|
||||||
}
|
}
|
||||||
|
|
||||||
$allUpdateFlag = (new CouponDispenseLog)->update($allUpdateData);
|
$destroyDispenseFlag = true;
|
||||||
|
if (!empty($destroyDispenseData)) {
|
||||||
|
$destroyDispenseFlag = (new CouponDispenseLog)->whereIn('id',$destroyDispenseData)->update([
|
||||||
|
'status' => CouponCode::DISPENSE_NULL,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $allUpdateFlag = (new CouponDispenseLog)->update($allUpdateData);
|
||||||
|
$allUpdateFlag = true;
|
||||||
|
$updateModel = new CouponDispenseLog();
|
||||||
|
foreach (array_chunk($allUpdateData, 500) as $chunk) {
|
||||||
|
foreach ($chunk as $item) {
|
||||||
|
$allUpdateFlag = $updateModel->where('id',$item['id'])->update(array_diff_key($item, ['id' => null]));
|
||||||
|
if (!$allUpdateFlag) break;
|
||||||
|
}
|
||||||
|
if (!$allUpdateFlag) break;
|
||||||
|
}
|
||||||
|
|
||||||
$insertFlag = (new UserCoupon)->insert($insertData);
|
$insertFlag = (new UserCoupon)->insert($insertData);
|
||||||
|
|
||||||
if (!$allUpdateFlag || !$appointUpdateFlag || !$insertFlag) throw new ErrException('领取失败');
|
if (!$allUpdateFlag || !$appointUpdateFlag || !$insertFlag || !$destroyDispenseFlag) throw new ErrException('领取失败');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return $resCouponData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function returnNullRes(): array
|
private function returnNullRes(): array
|
||||||
|
|||||||
Reference in New Issue
Block a user