hospital-applets-api/app/Services/CouponService.php
2023-05-11 13:10:18 +08:00

200 lines
8.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}