request->input('id_arr'); if (empty($idArr)) throw new ErrException('参数错误'); $couponArr = $this->couponDispenseLogModel->getInfoByIds($idArr); if ($couponArr->isEmpty()) throw new ErrException('领取的优惠券中有不存在的优惠券,请刷新后领取'); $couponArr = $couponArr->toArray(); $userBag = $this->userCouponModel->getReceiveCountByUserIds($this->userId, $idArr); if (count(array_diff(array_column($couponArr, 'id'), $userBag)) != count($couponArr)) throw new ErrException('优惠券已领完'); $this->receive($couponArr); return $this->return->success(); } /** * @var array */ private array $insertData = []; private array $allUpdateData =[]; private array $destroyDispenseData = []; /** * @param array $couponArr * @return void */ private function receive(array $couponArr): void { if (empty($couponArr)) return; foreach ($couponArr as $item) { $validityTime = $this->getValidityTime((int)$item['validity_time_type'], $item['validity_time_value']); //有效期不存在或者到期销毁当前分发逻辑 if (empty($validityTime) || ($validityTime['end_time'] ?? date('Y-m-d H:i:s')) < date('Y-m-d H:i:s')) { $this->destroyDispenseData[] = $item['id']; continue; } $oneData = [ 'user_id' => $this->userId, 'coupon_template_id' => $item['coupon_template_id'], 'coupon_name' => $item['coupon_name'], 'coupon_dispense_id' => $item['id'], 'status' => CouponCode::COUPON_STATUS_UNUSED, '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)); $this->insertData = array_merge($this->insertData, $copies); $this->allUpdateData[] = [ 'id' => $item['id'], 'receive_count' => $item['receive_count'] +$item['item_count'], ]; } if (empty($this->allUpdateData) || empty($this->insertData)) return; $this->matters(); } /** * @return void */ private function matters(): void { Db::transaction(function () { $destroyDispenseFlag = true; if (!empty($this->destroyDispenseData)) { $destroyDispenseFlag = (new CouponDispenseLog)->whereIn('id',$this->destroyDispenseData)->update([ 'status' => CouponCode::DISPENSE_NULL, ]); } // $allUpdateFlag = (new CouponDispenseLog)->update($allUpdateData); $allUpdateFlag = true; $updateModel = new CouponDispenseLog(); foreach (array_chunk($this->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($this->insertData); if (!$allUpdateFlag || !$insertFlag || !$destroyDispenseFlag) throw new ErrException('领取失败'); }); } }