hospital-applets-api/app/Services/UserPatientService.php

410 lines
13 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\Constants\HttpEnumCode;
use App\Model\Coupon;
use App\Model\DoctorConfigFollowPackageItem;
use App\Model\OrderInquiry;
use App\Model\OrderServicePackage;
use App\Model\PatientFamily;
use App\Model\PatientHistoryInquiry;
use App\Model\Product;
use App\Model\ProductPlatformAmount;
use App\Model\User;
use App\Model\UserCoupon;
use App\Model\UserPatient;
use App\Utils\Mask;
use Hyperf\DbConnection\Db;
use Hyperf\Redis\Redis;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/**
* 患者
*/
class UserPatientService extends BaseService
{
/**
* 获取患者个人中心数据
* @return array
*/
public function getPatientCenter(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取患者信息
$fields = [
'patient_id',
'user_id',
'user_name',
'avatar',
];
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$user_patient = UserPatient::getOne($params,$fields);
if (empty($user_patient)){
return fail(HttpEnumCode::HTTP_ERROR, "非法用户");
}
// 获取福利数据
$coupon = UserCoupon::getUserObjectTypeCoupon($user_patient['user_id'],2);
$coupon = $coupon->toArray();
// 获取问诊数量-待支付
$InquiryService = new InquiryService();
$order_inquiry_count = $InquiryService->getPatientInquiryWithStatus($user_patient['patient_id'],1);
// 获取处方数量-未使用
$OrderPrescriptionService = new OrderPrescriptionService();
$order_prescription_count = $OrderPrescriptionService->getPatientPrescriptionWithStatus($user_patient['patient_id'],2);
// 获取药品数量-待支付
$OrderProductService = new OrderProductService();
$order_product_count = $OrderProductService->getPatientProductWithStatus($user_patient['patient_id'],1);
// 获取检测数量-待支付
$detectionService = new DetectionService();
$order_detection_count = $detectionService->getPatientDetectionWithStatus($user_patient['patient_id'],1);
// 处理头像
$user_patient['avatar'] = addAliyunOssWebsite($user_patient['avatar']);
$result = array();
$result['patient_id'] = $user_patient['patient_id'];
$result['avatar'] = $user_patient['avatar'];
$result['user_name'] = $user_patient['user_name'];
$result['coupon'] = !empty($coupon);
$result['order_inquiry_count'] = $order_inquiry_count;
$result['order_prescription_count'] = $order_prescription_count;
$result['order_product_count'] = $order_product_count;
$result['order_detection_count'] = $order_detection_count;
return success($result);
}
/**
* 获取患者信息
* @return array
*/
public function getPatientCenterInfo(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取患者信息
$fields = [
'patient_id',
'user_id',
'user_name',
'avatar',
];
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$user_patient = UserPatient::getOne($params,$fields);
if (empty($user_patient)){
return fail(HttpEnumCode::HTTP_ERROR, "非法用户");
}
$params = array();
$params['user_id'] = $user_patient['user_id'];
$user = User::getOne($params);
if (empty($user)){
return fail(HttpEnumCode::HTTP_ERROR, "非法用户");
}
// 手机号
$user_patient['mobile'] = Mask::maskPhoneStr($user['mobile']);
// 头像
$user_patient['avatar'] = addAliyunOssWebsite($user_patient['avatar']);
return success($user_patient->toArray());
}
/**
* 获取患者优惠卷列表
* @return array
*/
public function getPatientCouponList(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$user_coupon_status = $this->request->input('user_coupon_status');
// 获取患者信息
$fields = [
'patient_id',
'user_id',
'user_name',
'avatar',
];
$params = array();
$params['patient_id'] = $user_info['client_user_id'];
$user_patient = UserPatient::getOne($params,$fields);
if (empty($user_patient)){
return fail(HttpEnumCode::HTTP_ERROR, "非法用户");
}
// 获取优惠卷列表
$params = array();
$params["user_id"] = $user_patient['user_id'];
$params["user_coupon_status"] = $user_coupon_status;// 状态0:未使用 1:已使用 3:已过期)
$user_coupon = UserCoupon::getWithCouponList($params);
$result = [];
foreach ($user_coupon as $item){
$data = array();
$data['user_coupon_id'] = $item['user_coupon_id'];
$data['coupon_id'] = $item['coupon_id'];
$data['user_coupon_status'] = $item['user_coupon_status'];
if ($item['user_coupon_status'] == 0){
// 未使用
if ($item['valid_end_time'] <= date('Y-m-d H:i:s',time())){
// 已过期
$data['user_coupon_status'] = 3;
}
}
$data['coupon_use_date'] = $item['coupon_use_date'];
$data['valid_start_time'] = $item['valid_start_time'];
$data['valid_end_time'] = $item['valid_end_time'];
$data['coupon_name'] = $item['coupon']['coupon_name'];
$data['coupon_price'] = $item['coupon']['coupon_price'];
$data['application_scope'] = $item['coupon']['application_scope'];
$data['inquiry_type'] = $item['coupon']['inquiry_type'];
$result[] = $data;
}
unset($user_coupon);
return success($result);
}
/**
* 删除服务过患者的医生
* 首页-个人中心
* @return array
*/
public function deletePatientDoctor(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$doctor_id = $this->request->route('doctor_id');
$params = array();
$params['doctor_id'] = $doctor_id;
$params['patient_id'] = $user_info['client_user_id'];
$params['history_status'] = 1; //
$patient_history_inquiry = PatientHistoryInquiry::getList($params);
if (empty($patient_history_inquiry)){
return fail();
}
$params['doctor_id'] = $doctor_id;
$params['patient_id'] = $user_info['client_user_id'];
$params['history_status'] = 1; //
$data = array();
$data['history_status'] = 0;
PatientHistoryInquiry::edit($params,$data);
return success();
}
/**
* 获取购物车药品数据
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function getShoppingCart(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$redis = $this->container->get(Redis::class);
$redis_key = "shopping_cart" . $user_info['client_user_id'];
$shopping_cart = $redis->get($redis_key);
if (empty($shopping_cart)){
// 购物车为空
return success();
}
$shopping_cart = json_decode($shopping_cart,true);
if (empty($shopping_cart)){
return success();
}
$data = array();
foreach ($shopping_cart as $item){
// 获取商品数据
$params =array();
$params['product_id'] = $item['product_id'];
$product = Product::getOne($params);
if (empty($product)){
continue;
}
$item['product_cover_img'] = addAliyunOssWebsite($product['product_cover_img']);
$item['product_price'] = $product['product_price'];
$item['product_name'] = $product['product_name'];
$item['product_spec'] = $product['product_spec'];
$item['manufacturer'] = $product['manufacturer'];
$item['packaging_unit'] = $product['packaging_unit'];
$data[] = $item;
}
return success($data);
}
/**
* 修改购物车药品数据
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function putShoppingCart(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$product_id = $this->request->input("product_id");
$shopping_cart_num = $this->request->input("shopping_cart_num");
if ($shopping_cart_num > 0){
// 验证商品数据
$params =array();
$params['product_id'] = $product_id;
$product = Product::getOne($params);
if (empty($product)){
return fail();
}
// 获取商品库存
$params =array();
$params['product_platform_id'] = $product['product_platform_id'];
$product_platform_amount = ProductPlatformAmount::getOne($params);
if ($product_platform_amount['stock'] <= 0){
return fail(HttpEnumCode::HTTP_ERROR,"商品库存不足");
}
}
// 读取缓存数据
$redis = $this->container->get(Redis::class);
$redis_key = "shopping_cart" . $user_info['client_user_id'];
$shopping_cart = $redis->get($redis_key);
if (!empty($shopping_cart)){
$shopping_cart = json_decode($shopping_cart,true);
}
// 处理缓存数据为空的情况
if (empty($shopping_cart)){
if ($shopping_cart_num > 0){
// 处理存储数据
$data = array();
$data['product_id'] = $product_id;
$data['shopping_cart_num'] = $shopping_cart_num;
$res = $redis->set($redis_key,json_encode([$data],JSON_UNESCAPED_UNICODE));
if (!$res){
return fail(HttpEnumCode::SERVER_ERROR);
}
}
return success();
}
$product_ids = array_column($shopping_cart,'product_id');
if (in_array($product_id,$product_ids)){
// 商品存在于购物车缓存中
foreach ($shopping_cart as $key => $value){
if ($value['product_id'] == $product_id){
if ($shopping_cart_num <= 0){
// 商品存在于购物车缓存中,此数据表示删除
unset($shopping_cart[$key]);
}else{
$shopping_cart[$key]['shopping_cart_num'] = $shopping_cart_num;
}
}
}
}else{
// 商品未存在于购物车缓存中。
$data = array();
$data['product_id'] = $product_id;
$data['shopping_cart_num'] = $shopping_cart_num;
array_unshift($shopping_cart,$data);
}
if (!empty($shopping_cart)){
// 重置数组排列
array_values($shopping_cart);
// 添加到缓存中
$res = $redis->set($redis_key,json_encode($shopping_cart,JSON_UNESCAPED_UNICODE));
if (!$res){
return fail(HttpEnumCode::SERVER_ERROR);
}
}else{
$res = $redis->del($redis_key);
if (!$res){
return fail(HttpEnumCode::SERVER_ERROR);
}
}
return success();
}
/**
* 获取用户可领取优惠卷
* @param string|int $user_id
* @param int $coupon_client
* @return array
*/
public function getPatientAvailableCouponList(string|int $user_id,int $coupon_client): array
{
// 获取全部优惠卷
$params = array();
$params['coupon_client'] = $coupon_client;
$params['coupon_status'] = 1;
$params['is_display'] = 1;
$coupon = Coupon::getList($params);
if (empty($coupon)){
return [];
}
// 处理优惠卷
$result = array();
foreach ($coupon as $item){
if ($item['coupon_count'] <= $item['coupon_take_count']){
// 已发放完毕
continue;
}
if ($item['valid_type'] == 1){
// 绝对时效
$date = date('Y-m-d H:i:s',time());
if ($item['valid_end_time'] < $date){
// 超出结束使用时间
continue;
}
}
// 检测当前优惠卷是否被用户领取
$params = array();
$params['user_id'] = $user_id;
$params['coupon_id'] = $item['coupon_id'];
$user_coupon = UserCoupon::getOne($params);
if (empty($user_coupon)){
// 未被领取
$result[] = $item;
}
}
return $result;
}
}