userIds = $this->beneficiary(); $this->checkCouponTemplate(); $this->checkClaimRuleData(); Db::transaction(function () { $this->dispenseId = $this->addMasterTableInformation(); $this->addSubTableInformation($this->dispenseId); }); if ($this->claimRule == CouponCode::DISPENSE_CLAIM_RULE_POST_ACCOUNT) { //mq发放优惠券 $message = new CouponAutoDispenseProducer([ 'coupon_dispense_id' => $this->dispenseId, ]); $producer = ApplicationContext::getContainer()->get(Producer::class); $producer->produce($message); } return $this->return->success(); }catch (Exception $e) { throw new ErrException($e->getMessage()); } } /** * @param int $dispenseId * @return void * @throws Exception */ private function addSubTableInformation(int $dispenseId): void { if ($this->groupType == CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE) return; if ($this->claimRule == CouponCode::DISPENSE_CLAIM_RULE_SINGLE_PAGE) return; if (empty($this->userIds)) return; $insertData = []; foreach ($this->userIds as $userId) { $insertData[] = [ 'coupon_dispense_id' => $dispenseId, 'user_id' => $userId, 'total_count' => $this->itemCount, 'create_time' => date('Y-m-d H:i:s'), ]; } if (empty($insertData)) throw new Exception('添加失败'); if (!((new CouponDispenseUser)->insert($insertData))) throw new Exception('添加失败'); } /** * @return int * @throws Exception */ private function addMasterTableInformation(): int { $insertModel = new CouponDispenseLog(); $insertModel->title = $this->request->input('title',date('Ymd').'分发优惠券'); $insertModel->coupon_name = $this->request->input('coupon_name', $this->couponTemplateInfo->name); $insertModel->coupon_template_id = $this->couponTemplateInfo->id; $insertModel->total_count = $this->request->input('total_count',count($this->userIds) * $this->itemCount); $insertModel->receive_count = 0; $insertModel->item_count = $this->itemCount; $insertModel->appoint_group = $this->groupType; $insertModel->claim_rule = $this->claimRule; $insertModel->claim_value = $this->request->input('claim_value'); $insertModel->appoint_value = !empty($this->appointValue) ? json_encode($this->appointValue) : null; $insertModel->validity_time_type = $this->request->input('validity_time_type'); $insertModel->validity_time_value = json_encode($this->request->input('validity_time_value')); $insertModel->remark = $this->request->input('remark'); if (!$insertModel->save()) throw new Exception('添加分发记录失败'); return $insertModel->id; } /** * @return void * @throws Exception */ private function checkClaimRuleData(): void { $this->claimRule = (int)$this->request->input('claim_rule',CouponCode::DISPENSE_CLAIM_RULE_HOME_POPUPS); if ($this->claimRule == CouponCode::DISPENSE_CLAIM_RULE_SINGLE_PAGE && empty($this->request->input('claim_value'))) { throw new Exception('单页请输入路径'); } } /** * @return void * @throws Exception */ private function checkCouponTemplate(): void { $this->couponTemplateInfo = $this->couponTemplateModel->getInfoById((int)$this->request->input('coupon_template_id')); $this->itemCount = (int)$this->request->input('item_count',1); if (empty($this->couponTemplateInfo)) throw new Exception('未找到该优惠券模板'); if ($this->couponTemplateInfo->status == CouponCode::COUPON_TEMPLATE_STATUS_ENABLE) throw new Exception('该优惠券模板已被禁用'); } /** * @return array * @throws Exception */ private function beneficiary(): array { return match ($this->groupType = (int)$this->request->input('appoint_group',CouponCode::DISPENSE_APPOINT_GROUP_ALL_PEOPLE)) { CouponCode::DISPENSE_APPOINT_GROUP_DESIGNATED_USERS => $this->handleDesignatedUsers(), CouponCode::DISPENSE_APPOINT_GROUP_DESIGNATED_SITES => $this->handleDesignatedSites(), CouponCode::DISPENSE_APPOINT_GROUP_DESIGNATED_GOODS => $this->handleDesignatedGoods(), CouponCode::DISPENSE_APPOINT_GROUP_DESIGNATED_SITES_AND_GOODS => $this->handleDesignatedSitesAndGoods(), default => [] }; } }