200 lines
8.2 KiB
PHP
200 lines
8.2 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
use App\Amqp\Producer\AutoCompleteInquiryDelayDirectProducer;
|
||
use App\Amqp\Producer\UserCouponExpiredDelayDirectProducer;
|
||
use App\Amqp\Producer\UserCouponExpiredNoticeDelayDirectProducer;
|
||
use App\Constants\HttpEnumCode;
|
||
use App\Model\Coupon;
|
||
use App\Model\Popup;
|
||
use App\Model\UserCoupon;
|
||
use App\Utils\Log;
|
||
use Hyperf\Amqp\Producer;
|
||
use Hyperf\DbConnection\Db;
|
||
use Psr\Container\ContainerExceptionInterface;
|
||
use Psr\Container\NotFoundExceptionInterface;
|
||
|
||
/**
|
||
* 优惠卷
|
||
*/
|
||
class CouponService extends BaseService
|
||
{
|
||
/**
|
||
* 获取用户某状态全部优惠卷-列表
|
||
* @param string|int $user_id 用户id
|
||
* @param array $inquiry_type [1,2,3,4,5]适用范围(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药)
|
||
* @param int $user_coupon_status 状态(0:未使用 1:已使用 3:已过期)
|
||
* @return array
|
||
*/
|
||
public function getUserCouponStatusList(string|int $user_id, array $inquiry_type, int $user_coupon_status): array
|
||
{
|
||
$params = array();
|
||
$params[] = ['user_id', '=', $user_id];
|
||
$params[] = ['user_coupon_status', '=', $user_coupon_status];// 状态(0:未使用 1:已使用 3:已过期)
|
||
|
||
$coupon_params = array();
|
||
$coupon_params[] = ['coupon_client', '=', 1];
|
||
$coupon_params[] = ['coupon_status', '=', 1]; // 状态(1:正常 2:强制失效 3:结束 4:删除)
|
||
|
||
$application_scope_params = $inquiry_type; // 适用范围(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药)
|
||
|
||
$user_coupon = UserCoupon::getWithCouponList($params, $coupon_params, $application_scope_params);
|
||
if (empty($user_coupon)) {
|
||
return array();
|
||
}
|
||
|
||
return $user_coupon->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;
|
||
}
|
||
} |