toArray(); } /** * 获取用户可用优惠卷-单条 * @param string|int $user_id 用户id * @param string|int $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药) * @param int $coupon_client 使用平台(1:小程序) * @return array */ public function getUserUsableCouponOne(string|int $user_id, string|int $inquiry_type, int $coupon_client = 1): array { // 问诊类型需加1 $inquiry_type = $inquiry_type + 1; $params = array(); $params[] = ['user_id', '=', $user_id]; $params[] = ['user_coupon_status', '=', 0];// 状态(0:未使用 1:已使用 3:已过期) $params[] = ['valid_start_time', '<', date('Y-m-d H:i:s', time())]; // 有效使用时间 $params[] = ['valid_end_time', '>', date('Y-m-d H:i:s', time())]; // 过期使用时间 $coupon_params = array(); $coupon_params[] = ['coupon_client', '=', $coupon_client]; $coupon_params[] = ['coupon_status', '=', 1]; // 状态(1:正常 2:强制失效 3:结束 4:删除) $application_scope_params = [1, $inquiry_type]; // 适用范围(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药) $user_coupon = UserCoupon::getDateWithCouponOne($params, $coupon_params, $application_scope_params); if (empty($user_coupon)) { return array(); } return $user_coupon->toArray(); } /** * 发放用户优惠卷 * @param int $distribution_object 发放对象(1:新注册用户 2:会员 3:近期消费 4:近期购药) * @param string $user_id * @param string $patient_id * @param int $coupon_client 使用平台(1:小程序) * @return bool * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function DistributeCoupon(int $distribution_object, string $user_id, string $patient_id, int $coupon_client = 1): bool { $params = array(); $params['coupon_client'] = $coupon_client; $params['coupon_status'] = 1; $params['distribution_object'] = $distribution_object; // 发放对象(1:新注册用户 2:会员 3:近期消费 4:近期购药) $coupon = Coupon::getList($params); if (empty($coupon)) { return true; } foreach ($coupon as $key => $value) { // 判断发放数量 if ($value['coupon_count'] == $value['coupon_take_count']) { continue; } // 添加用户优惠卷表 $data = array(); $data['user_id'] = $user_id; $data['patient_id'] = $patient_id; $data['coupon_id'] = $value['coupon_id']; if ($value['valid_type'] == 1) { // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) $data['valid_start_time'] = $value['valid_start_time']; // 有效使用时间 $data['valid_end_time'] = $value['valid_end_time']; // 过期使用时间 } elseif ($value['valid_type'] == 2) { // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) $data['valid_start_time'] = date('Y-m-d H:i:s', time()); // 有效使用时间 $data['valid_end_time'] = date("Y-m-d H:i:s", strtotime($value['valid_days'] . " day")); } else { return false; } $user_coupon = UserCoupon::addUserCoupon($data); if (empty($user_coupon)) { return false; } // 添加弹窗表 $data = array(); $data['user_id'] = $user_id; $data['app_type'] = 1; $data['client_type'] = 1;// 客户端类型(1:患者端 2:医生端 3:药师端) $data['popup_type'] = 2;// 弹窗类型(1:结算费用规则 2:新优惠卷弹窗) $data['popup_title'] = "新人红包福利"; $popup_content = [ 'user_coupon_id' => (string)$user_coupon->user_coupon_id, // 优惠卷金额 'coupon_price' => $value['coupon_price'], // 优惠卷金额 'application_scope' => $value['application_scope'], // 适用范围(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药) 'valid_type' => $value['valid_type'], // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) 'valid_days' => $value['valid_days'], // 自领取之日起有效天数 'valid_start_time' => $value['valid_start_time'], // 开始使用时间 'valid_end_time' => $value['valid_end_time'], // 结束使用时间 ]; $data['popup_content'] = json_encode($popup_content, JSON_UNESCAPED_UNICODE); $popup = Popup::addPopup($data); if (empty($popup)) { return false; } // 添加用户优惠卷自动过期队列 // 添加优惠卷过期队列 $valid_end_time = strtotime($user_coupon->valid_end_time); $data = array(); $data['user_coupon_id'] = $user_coupon['user_coupon_id']; $time = $valid_end_time - time(); $message = new UserCouponExpiredDelayDirectProducer($data); $message->setDelayMs(1000 * $time); $producer = $this->container->get(Producer::class); $res = $producer->produce($message); if (!$res) { return false; } // 添加优惠卷即将过期提醒队列 if ($time > 60 * 60 * 24 * 2) { $time = 60 * 60 * 24 * 2; } else { if ($time > 60 * 60 * 5){ $time = $time - 60 * 60 * 5; } } $message = new UserCouponExpiredNoticeDelayDirectProducer($data); $message->setDelayMs(1000 * $time); $producer = $this->container->get(Producer::class); $res = $producer->produce($message); if (!$res) { return false; } try { // 患者-优惠卷发放 $MessagePush = new MessagePush($user_id); $MessagePush->patientDistributeCoupon($value['coupon_name']); } catch (\Exception $e) { // 不做处理 Log::getInstance()->error($e->getMessage()); } } return true; } }