From 7a793a61e70453110cee2c4ebdad8b1e2d860722 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 31 May 2024 16:44:57 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BA=86=E6=82=A3=E8=80=85?= =?UTF-8?q?=E7=AB=AF=E8=8D=AF=E5=93=81=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E7=9A=84=E5=86=8D=E6=AC=A1=E5=8F=91=E6=94=BE?= =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=8D=B7=E7=9A=84=E6=96=B9=E6=B3=95=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E3=80=81=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=8F=91=E6=94=BE?= =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=8D=B7=E6=97=B6=E6=95=B0=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E3=80=81=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=86=8D?= =?UTF-8?q?=E6=AC=A1=E5=8F=91=E6=94=BE=E8=AE=A2=E5=8D=95=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GrantUserCouponDelayDirectConsumer.php | 27 ++++-- .../GrantUserCouponDelayDirectProducer.php | 2 +- app/Controller/CallBackController.php | 39 +------- app/Model/CouponGrant.php | 93 +++++++++++++++++++ app/Services/CouponService.php | 75 ++++++++++++++- app/Services/PatientOrderService.php | 66 +++++-------- 6 files changed, 211 insertions(+), 91 deletions(-) create mode 100644 app/Model/CouponGrant.php diff --git a/app/Amqp/Consumer/GrantUserCouponDelayDirectConsumer.php b/app/Amqp/Consumer/GrantUserCouponDelayDirectConsumer.php index 06eee1e..f452e65 100644 --- a/app/Amqp/Consumer/GrantUserCouponDelayDirectConsumer.php +++ b/app/Amqp/Consumer/GrantUserCouponDelayDirectConsumer.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Amqp\Consumer; use App\Model\Coupon; +use App\Model\CouponGrant; use App\Services\CouponService; use App\Utils\Log; use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait; @@ -17,7 +18,7 @@ use Hyperf\DbConnection\Db; use PhpAmqpLib\Message\AMQPMessage; /** - * 再次发放用户优惠卷 + * 发放用户优惠卷 */ #[Consumer(nums: 1)] class GrantUserCouponDelayDirectConsumer extends ConsumerMessage @@ -37,20 +38,28 @@ class GrantUserCouponDelayDirectConsumer extends ConsumerMessage { Log::getInstance("queue-GrantUserCoupon")->info("开始执行 延迟发放用户优惠卷 队列:" . json_encode($data, JSON_UNESCAPED_UNICODE)); - // 获取优惠卷数据 - $params = array(); - $params['coupon_id'] = $data["coupon_id"]; - $coupon = Coupon::getOne($params); - if (empty($coupon)){ - Log::getInstance("queue-GrantUserCoupon")->error("无优惠卷数据"); + // 检测入参参数 + if (empty($data['coupon_id'])) { + Db::rollBack(); + Log::getInstance("queue-GrantUserCoupon")->error("参数错误"); return Result::DROP; } - Db::beginTransaction(); + if (empty($data['user_id'])) { + Db::rollBack(); + Log::getInstance("queue-GrantUserCoupon")->error("参数错误"); + return Result::DROP; + } + $grant_quantity = 1; + if (!empty($data['grant_quantity'])) { + $grant_quantity = $data['grant_quantity']; + } + + Db::beginTransaction(); try { $couponService = new CouponService(); - $res = $couponService->GrantUserCoupon($data["coupon_id"],$data['user_id']); + $res = $couponService->GrantUserCoupon($data["coupon_id"],$data['user_id'],$grant_quantity); if (!$res){ // 发放失败 Db::rollBack(); diff --git a/app/Amqp/Producer/GrantUserCouponDelayDirectProducer.php b/app/Amqp/Producer/GrantUserCouponDelayDirectProducer.php index 4ae1ac1..8e9abaa 100644 --- a/app/Amqp/Producer/GrantUserCouponDelayDirectProducer.php +++ b/app/Amqp/Producer/GrantUserCouponDelayDirectProducer.php @@ -10,7 +10,7 @@ use Hyperf\Amqp\Message\ProducerMessage; use Hyperf\Amqp\Message\Type; /** - * 再次发放用户优惠卷 + * 发放用户优惠卷 */ #[Producer] class GrantUserCouponDelayDirectProducer extends ProducerMessage diff --git a/app/Controller/CallBackController.php b/app/Controller/CallBackController.php index 763e21f..eca58f0 100644 --- a/app/Controller/CallBackController.php +++ b/app/Controller/CallBackController.php @@ -509,41 +509,10 @@ class CallBackController extends AbstractController try { // 再次发放优惠卷数据 if ($order_product['coupon_amount_total'] > 0){ - // 获取药品订单优惠卷数据 - $params = array(); - $params['order_product_id'] = $order_product['order_product_id']; - $order_product_coupons = OrderProductCoupon::getList($params); - if (!empty($order_product_coupons)){ - foreach ($order_product_coupons as $order_product_coupon){ - // 获取用户优惠卷数据 - $params = array(); - $params['user_coupon_id'] = $order_product_coupon['user_coupon_id']; - $user_coupon = UserCoupon::getOne($params); - if (!empty($user_coupon)){ - // 获取优惠卷数据 - $params = array(); - $params['coupon_id'] = $user_coupon['coupon_id']; - $coupon = Coupon::getOne($params); - if (!empty($coupon)){ - if ($coupon['reissue_interval_days'] > 0){ - $data = array(); - $data['coupon_id'] = $coupon['coupon_id']; - $data['user_id'] = $user_coupon['user_id']; - - $time = $coupon['reissue_interval_days'] * 24 * 60 * 60 * 1000; - $message = new GrantUserCouponDelayDirectProducer($data); - $message->setDelayMs($time); - $producer = $this->container->get(Producer::class); - $res = $producer->produce($message); - if (!$res) { - Log::getInstance("CallBack-wxPayProductSuccess")->error("再次发放优惠卷失败"); - } - - Log::getInstance("CallBack-wxPayProductSuccess")->info("再次发放优惠卷成功"); - } - } - } - } + $couponService = new CouponService(); + $res = $couponService->againGrantOrderCoupon($order_product['order_id']); + if (!$res){ + Log::getInstance("CallBack-wxPayProductSuccess")->error("再次发放优惠卷失败"); } } }catch (\Throwable $e){ diff --git a/app/Model/CouponGrant.php b/app/Model/CouponGrant.php new file mode 100644 index 0000000..f914e9f --- /dev/null +++ b/app/Model/CouponGrant.php @@ -0,0 +1,93 @@ +first($fields); + } + + /** + * 获取数据-多 + * @param array $params + * @param array $fields + * @return Collection|array + */ + public static function getList(array $params = [], array $fields = ['*']): Collection|array + { + return self::where($params)->get($fields); + } + + /** + * 新增-批量 + * @param array $data 新增数据 + * @return \Hyperf\Database\Model\Model|CouponGrant + */ + public static function addCouponGrant(array $data): \Hyperf\Database\Model\Model|CouponGrant + { + return self::create($data); + } + + /** + * 修改-批量 + * @param array $params + * @param array $data + * @return int + */ + public static function editCouponGrant(array $params = [], array $data = []): int + { + return self::where($params)->update($data); + } + + /** + * 自增 + * @param array $params + * @param string $field + * @param float $numeral + * @return int + */ + public static function inc(array $params,string $field,float $numeral = 1): int + { + return self::where($params)->increment($field,$numeral); + } +} diff --git a/app/Services/CouponService.php b/app/Services/CouponService.php index 11ebb20..784ba2b 100644 --- a/app/Services/CouponService.php +++ b/app/Services/CouponService.php @@ -3,10 +3,12 @@ namespace App\Services; use App\Amqp\Producer\AutoCompleteInquiryDelayDirectProducer; +use App\Amqp\Producer\GrantUserCouponDelayDirectProducer; use App\Amqp\Producer\UserCouponExpiredDelayDirectProducer; use App\Amqp\Producer\UserCouponExpiredNoticeDelayDirectProducer; use App\Constants\HttpEnumCode; use App\Model\Coupon; +use App\Model\OrderCoupon; use App\Model\Popup; use App\Model\UserCoupon; use App\Model\UserPatient; @@ -25,9 +27,10 @@ class CouponService extends BaseService * 发放优惠卷 * @param string $coupon_id 优惠卷id * @param string $user_id 用户id + * @param int $grant_quantity 发放数量 * @return bool */ - public function GrantUserCoupon(string $coupon_id,string $user_id): bool + public function GrantUserCoupon(string $coupon_id,string $user_id,int $grant_quantity = 1): bool { // 获取患者数据 $params = array(); @@ -47,7 +50,13 @@ class CouponService extends BaseService // 判断优惠卷数量是否充足 if ($coupon['coupon_count'] <= $coupon['coupon_take_count']){ - return true; + return false; + } + + // 优惠卷剩余数量 + $remaining_quantity = $coupon['coupon_count'] - $coupon['coupon_take_count']; + if ($remaining_quantity <= $grant_quantity){ + return false; } // 判断用户是否已有该优惠卷 @@ -216,4 +225,66 @@ class CouponService extends BaseService return true; } + + /** + * 再次发放订单优惠卷 + * @param string $order_id + * @return bool + */ + public function againGrantOrderCoupon(string $order_id): bool + { + try { + // 获取订单优惠卷数据 + $params = array(); + $params['order_id'] = $order_id; + $order_coupons = OrderCoupon::getList($params); + if (empty($order_coupons)){ + // 无订单优惠卷。无需再次发放 + return true; + } + + foreach ($order_coupons as $order_coupon) { + // 获取用户优惠卷数据 + $params = array(); + $params['user_coupon_id'] = $order_coupon['user_coupon_id']; + $user_coupon = UserCoupon::getOne($params); + if (empty($user_coupon)){ + // 未查到患者历史优惠卷数据。无需再次发放 + continue; + } + + // 获取优惠卷数据 + $params = array(); + $params['coupon_id'] = $user_coupon['coupon_id']; + $coupon = Coupon::getOne($params); + if (empty($coupon)){ + // 未查到优惠卷数据。无需再次发放 + continue; + } + + // 确认收货后的再次发放间隔天数 + if ($coupon['reissue_interval_days'] == 0){ + // 无需再次发放 + continue; + } + + $data = array(); + $data['coupon_id'] = $coupon['coupon_id']; + $data['user_id'] = $user_coupon['user_id']; + + $time = $coupon['reissue_interval_days'] * 24 * 60 * 60 * 1000; + $message = new GrantUserCouponDelayDirectProducer($data); + $message->setDelayMs($time); + $producer = $this->container->get(Producer::class); + $res = $producer->produce($message); + if (!$res) { + Log::getInstance("CouponService-againGrantOrderCoupon")->error("再次发放优惠卷失败"); + } + } + }catch (\Throwable $e){ + Log::getInstance("CouponService-againGrantOrderCoupon")->error($e->getMessage()); + } + + return true; + } } \ No newline at end of file diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index 1e2e621..2abc6dc 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -1181,6 +1181,15 @@ class PatientOrderService extends BaseService $order_type = $this->request->input('order_type'); $order_no = $this->request->input('order_no'); + // 获取订单数据 + $params = array(); + $params['order_no'] = $order_no; + $order = Order::getOne($params); + if (empty($order)) + { + return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); + } + Db::beginTransaction(); try { switch ($order_type) { @@ -1347,50 +1356,6 @@ class PatientOrderService extends BaseService $params['order_no'] = $order_product['order_product_no']; Order::edit($params, $data); - try { - if ($order_product['coupon_amount_total'] > 0) { - // 获取药品订单优惠卷数据 - $params = array(); - $params['order_product_id'] = $order_product['order_product_id']; - $order_product_coupons = OrderProductCoupon::getList($params); - if (!empty($order_product_coupons)) { - foreach ($order_product_coupons as $order_product_coupon) { - // 获取用户优惠卷数据 - $params = array(); - $params['user_coupon_id'] = $order_product_coupon['user_coupon_id']; - $user_coupon = UserCoupon::getOne($params); - if (!empty($user_coupon)) { - // 获取优惠卷数据 - $params = array(); - $params['coupon_id'] = $user_coupon['coupon_id']; - $coupon = Coupon::getOne($params); - if (!empty($coupon)) { - if ($coupon['reissue_interval_days'] > 0) { - $data = array(); - $data['coupon_id'] = $coupon['coupon_id']; - $data['user_id'] = $user_coupon['user_id']; - - $time = $coupon['reissue_interval_days'] * 24 * 60 * 60 * 1000; - $message = new GrantUserCouponDelayDirectProducer($data); - $message->setDelayMs($time); - $producer = $this->container->get(Producer::class); - $res = $producer->produce($message); - if (!$res) { - Log::getInstance("PatientOrderService-addPatientOrderPay")->error("再次发放优惠卷失败"); - } - - Log::getInstance("PatientOrderService-addPatientOrderPay")->info("再次发放优惠卷成功"); - } - } - } - } - } - } - } catch (\Throwable $e) { - // 此处异常不做处理 - Log::getInstance("PatientOrderService-addPatientOrderPay")->error($e->getMessage()); - } - break; case 3: // 检测订单 Db::rollBack(); @@ -1414,6 +1379,19 @@ class PatientOrderService extends BaseService return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage()); } + try { + if ($order['coupon_amount_total'] > 0) { + $couponService = new CouponService(); + $res = $couponService->againGrantOrderCoupon($order['order_id']); + if (!$res){ + Log::getInstance("PatientOrderService-addPatientOrderPay")->error("再次发放优惠卷失败"); + } + } + } catch (\Throwable $e) { + // 此处异常不做处理 + Log::getInstance("PatientOrderService-addPatientOrderPay")->error($e->getMessage()); + } + return success(); }