diff --git a/app/Constants/Common/CouponCode.php b/app/Constants/Common/CouponCode.php index 12773a0..66857ef 100644 --- a/app/Constants/Common/CouponCode.php +++ b/app/Constants/Common/CouponCode.php @@ -55,4 +55,16 @@ class CouponCode * @var int 优惠券发放方式 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; } \ No newline at end of file diff --git a/app/Controller/Api/CouponController.php b/app/Controller/Api/CouponController.php index e7c8913..15647f2 100644 --- a/app/Controller/Api/CouponController.php +++ b/app/Controller/Api/CouponController.php @@ -5,13 +5,18 @@ declare(strict_types=1); namespace App\Controller\Api; use App\Controller\AbstractController; +use App\Middleware\Api\JwtAuthMiddleware; use App\Service\Api\Coupon\CouponListService; use App\Service\Api\Coupon\HomePopupsService; use Hyperf\HttpServer\Annotation\Controller; +use Hyperf\HttpServer\Annotation\Middlewares; use Hyperf\HttpServer\Annotation\RequestMapping; use Hyperf\Validation\Annotation\Scene; #[Controller(prefix: 'api/coupon')] +#[Middlewares([ + JwtAuthMiddleware::class, +])] class CouponController extends AbstractController { /** diff --git a/app/Model/CouponDispenseLog.php b/app/Model/CouponDispenseLog.php index 82896a4..5dbe3c0 100644 --- a/app/Model/CouponDispenseLog.php +++ b/app/Model/CouponDispenseLog.php @@ -22,7 +22,8 @@ use Hyperf\DbConnection\Model\Model; * @property string $appoint_value * @property string $use_scene_ids * @property int $validity_time_type - * @property string $validity_time_value + * @property string $validity_time_value + * @property int $status * @property string $remark * @property string $create_time * @property string $update_time @@ -43,7 +44,7 @@ class CouponDispenseLog extends Model /** * 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 UPDATED_AT = 'update_time'; @@ -85,12 +86,14 @@ class CouponDispenseLog extends Model ->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS) ->whereColumn('total_count','!=','receive_count') ->where('appoint_group',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) + ->where('status',CouponCode::DISPENSE_VALIDITY) ->pluck('id') ->toArray(); $appoint = $this ->where('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS) ->where('appoint_group','!=',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) + ->where('status',CouponCode::DISPENSE_VALIDITY) ->pluck('id') ->toArray(); diff --git a/app/Model/UserCoupon.php b/app/Model/UserCoupon.php index f728bda..b99c517 100644 --- a/app/Model/UserCoupon.php +++ b/app/Model/UserCoupon.php @@ -47,8 +47,8 @@ class UserCoupon extends Model { return $this ->where('user_id', $user_id) - ->whereIn('coupon_id', $couponIdArr) - ->pluck('coupon_id') + ->whereIn('coupon_dispense_id', $couponIdArr) + ->pluck('coupon_dispense_id') ->toArray(); } diff --git a/app/Service/Api/Coupon/HomePopupsService.php b/app/Service/Api/Coupon/HomePopupsService.php index 430da90..d17a4d3 100644 --- a/app/Service/Api/Coupon/HomePopupsService.php +++ b/app/Service/Api/Coupon/HomePopupsService.php @@ -12,6 +12,7 @@ namespace App\Service\Api\Coupon; use App\Constants\Common\CouponCode; use App\Exception\ErrException; +use App\Extend\DateUtil; use App\Model\CouponDispenseLog; use App\Model\CouponDispenseUser; use App\Model\UserCoupon; @@ -39,7 +40,9 @@ class HomePopupsService extends BaseService #[Inject] protected UserCoupon $userCouponModel; - + /** + * @return array + */ public function handle(): array { $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(); $allDispenseIds = []; - if (!empty($all['all'])) { + if (!empty($data['all'])) { $allDispenseIds = $this->userCouponModel->getReceiveCountByUserIds($this->userId,$data['all']); } @@ -59,44 +62,71 @@ class HomePopupsService extends BaseService 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 - * @return void + * @return array */ - private function receive(array $data): void + private function receive(array $data): array { $list = $this->couponDispenseLogModel->getListByIds($data); - if (empty($list)) return; + if (empty($list)) return []; $insertData = []; $appointUpdateData = []; $allUpdateData =[]; + $destroyDispenseData = []; + + $resCouponData = []; + 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 = [ 'user_id' => $this->userId, 'coupon_template_id' => $item['coupon_template_id'], - 'coupon_name' => $item['coupon_name']->coupon_name, + 'coupon_name' => $item['coupon_name'], 'coupon_dispense_id' => $item['id'], 'status' => CouponCode::COUPON_STATUS_UNUSED, - 'validity_start_time' => $item['validity_start_time'], - 'validity_end_time' => $item['validity_end_time'], + 'validity_start_time' => $validityTime['start_time'] ?? date('Y-m-d H:i:s', time()), + 'validity_end_time' => $validityTime['end_time'] ?? date('Y-m-d H:i:s', time()), ]; $copies = array_map(function () use ($oneData) { return $oneData; }, array_fill(0, $item['item_count'], null)); - $insertData = array_merge($insertData, $copies); + $oneData['count'] = $item['item_count']; + if ($item['appoint_group'] != CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) { $appointUpdateData[] = [ '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'], 'receive_count' => $item['receive_count'] +$item['item_count'], ]; + + $resCouponData[] = $oneData; } - if (empty($allUpdateData)) return; + if (empty($allUpdateData)) return []; if (!empty($appointUpdateData)) { $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; - 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); - if (!$allUpdateFlag || !$appointUpdateFlag || !$insertFlag) throw new ErrException('领取失败'); + if (!$allUpdateFlag || !$appointUpdateFlag || !$insertFlag || !$destroyDispenseFlag) throw new ErrException('领取失败'); }); + + return $resCouponData; } private function returnNullRes(): array