Compare commits
9 Commits
20250805-0
...
20250806-1
| Author | SHA1 | Date | |
|---|---|---|---|
| eb0ce8a347 | |||
| edf270a6ce | |||
| c4c154cbb9 | |||
| ff36733005 | |||
| f898de515a | |||
| 058b56a348 | |||
| 42dd168c14 | |||
| 4f862caa0b | |||
| ec60074298 |
46
app/Cron/Coupon/UserCouponTask.php
Normal file
46
app/Cron/Coupon/UserCouponTask.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This crontab file is part of item.
|
||||||
|
*
|
||||||
|
* @author ctexthuang
|
||||||
|
* @contact ctexthuang@qq.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Cron\Coupon;
|
||||||
|
|
||||||
|
use App\Constants\Common\CouponCode;
|
||||||
|
use App\Lib\Log;
|
||||||
|
use App\Model\UserCoupon;
|
||||||
|
use Exception;
|
||||||
|
use Hyperf\Crontab\Annotation\Crontab;
|
||||||
|
use Hyperf\Di\Annotation\Inject;
|
||||||
|
|
||||||
|
#[Crontab(rule: "* * * * *", name: "UserCouponTask", singleton: true , callback: "execute", memo: "每秒执行优惠券过期")]
|
||||||
|
class UserCouponTask
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Log
|
||||||
|
*/
|
||||||
|
#[Inject]
|
||||||
|
protected Log $log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var UserCoupon
|
||||||
|
*/
|
||||||
|
#[Inject]
|
||||||
|
protected UserCoupon $userCouponModel;
|
||||||
|
|
||||||
|
public function execute()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->userCouponModel
|
||||||
|
->whereTime('validity_end_time', '>', date('Y-m-d H:i:s'))
|
||||||
|
->where('status', CouponCode::COUPON_STATUS_UNUSED)
|
||||||
|
->update(['status' => CouponCode::COUPON_STATUS_EXPIRE]);
|
||||||
|
}catch (Exception $e){
|
||||||
|
$this->log->error(__CLASS__.$e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,8 +40,8 @@ class UserCoupon extends Model
|
|||||||
*/
|
*/
|
||||||
protected array $casts = ['id' => 'integer', 'coupon_template_id' => 'integer', 'coupon_dispense_id' => 'integer', 'user_id' => 'integer', 'status' => 'integer'];
|
protected array $casts = ['id' => 'integer', 'coupon_template_id' => 'integer', 'coupon_dispense_id' => 'integer', 'user_id' => 'integer', 'status' => 'integer'];
|
||||||
|
|
||||||
const string CREATED_AT = 'created_time';
|
const string CREATED_AT = 'create_time';
|
||||||
const string UPDATED_AT = 'updated_time';
|
const string UPDATED_AT = 'update_time';
|
||||||
|
|
||||||
public function getReceiveCountByUserIds(int $user_id,array $couponIdArr): array
|
public function getReceiveCountByUserIds(int $user_id,array $couponIdArr): array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ class PrintService extends CateringBaseService
|
|||||||
*/
|
*/
|
||||||
public function cancel(): array
|
public function cancel(): array
|
||||||
{
|
{
|
||||||
$service = $this->printOrderFactory->handle($this->request->input('type'));
|
$service = $this->printOrderFactory->handle((int)$this->request->input('type'));
|
||||||
$service->printId = (int)$this->request->input('print_id');
|
$service->printId = (int)$this->request->input('print_id');
|
||||||
$service->handle();
|
$service->handle();
|
||||||
$service->printCancel();
|
$service->printCancel();
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ declare(strict_types=1);
|
|||||||
namespace App\Service\Admin\Catering\Print;
|
namespace App\Service\Admin\Catering\Print;
|
||||||
|
|
||||||
use App\Exception\ErrException;
|
use App\Exception\ErrException;
|
||||||
|
use App\Lib\Log;
|
||||||
use App\Lib\Print\YlyBasicsLib;
|
use App\Lib\Print\YlyBasicsLib;
|
||||||
use App\Model\Printer;
|
use App\Model\Printer;
|
||||||
use Hyperf\Di\Annotation\Inject;
|
use Hyperf\Di\Annotation\Inject;
|
||||||
@@ -58,6 +59,12 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
#[Inject]
|
#[Inject]
|
||||||
protected Printer $printerModel;
|
protected Printer $printerModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Log
|
||||||
|
*/
|
||||||
|
#[Inject]
|
||||||
|
protected Log $log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
* @throws ContainerExceptionInterface
|
* @throws ContainerExceptionInterface
|
||||||
@@ -108,9 +115,12 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
empty($this->data['order_sno']) ||
|
empty($this->data['order_sno']) ||
|
||||||
empty($this->data['username']) ||
|
empty($this->data['username']) ||
|
||||||
empty($this->data['mobile']) ||
|
empty($this->data['mobile']) ||
|
||||||
empty($this->data['date']) ||
|
empty($this->data['date'])
|
||||||
empty($this->data['heapsort'])
|
// empty($this->data['heapsort'])
|
||||||
) throw new ErrException('打印数据丢失');
|
) {
|
||||||
|
$this->log->error('打印数据'.json_encode($this->data));
|
||||||
|
throw new ErrException('打印数据丢失');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -126,9 +136,6 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
//设置宽度
|
//设置宽度
|
||||||
$this->content .= "<PW>048</PW>";
|
$this->content .= "<PW>048</PW>";
|
||||||
|
|
||||||
$this->content .= "\n";
|
|
||||||
$this->content .= "\n";
|
|
||||||
|
|
||||||
//取餐号
|
//取餐号
|
||||||
$this->content .= "<FS3><CA>{$this->data['pickup_code']}</CA></FS3>\n";
|
$this->content .= "<FS3><CA>{$this->data['pickup_code']}</CA></FS3>\n";
|
||||||
|
|
||||||
@@ -190,7 +197,7 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
$contentEdibleTimeTips = config('print.yly.content_edible_time_tips');
|
$contentEdibleTimeTips = config('print.yly.content_edible_time_tips');
|
||||||
$this->content .= "<LR2>保质期,$contentEdibleTimeTips</LR2>";
|
$this->content .= "<LR2>保质期,$contentEdibleTimeTips</LR2>";
|
||||||
|
|
||||||
$this->content .= "<FS3><CA>{$this->data['heapsort']}</CA></FS3>";
|
$this->content .= "<FS3><CA>{$this->data['pickup_code']}</CA></FS3>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -231,6 +238,8 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @return void
|
* @return void
|
||||||
|
* @throws ContainerExceptionInterface
|
||||||
|
* @throws NotFoundExceptionInterface
|
||||||
*/
|
*/
|
||||||
private function checkBoxLabelData(): void
|
private function checkBoxLabelData(): void
|
||||||
{
|
{
|
||||||
@@ -244,7 +253,10 @@ class YlyPrintService implements PrintOrderInterface
|
|||||||
empty($this->data['driver_name']) ||
|
empty($this->data['driver_name']) ||
|
||||||
empty($this->data['current_num']) ||
|
empty($this->data['current_num']) ||
|
||||||
empty($this->data['date_text'])
|
empty($this->data['date_text'])
|
||||||
) throw new ErrException('打印数据丢失');
|
) {
|
||||||
|
$this->log->error('打印数据'.json_encode($this->data));
|
||||||
|
throw new ErrException('打印数据丢失-01');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ use App\Model\CouponTemplate;
|
|||||||
use App\Model\UserCoupon;
|
use App\Model\UserCoupon;
|
||||||
use App\Service\Api\BaseService;
|
use App\Service\Api\BaseService;
|
||||||
use App\Service\ServiceTrait\Admin\Catering\PrintTrait;
|
use App\Service\ServiceTrait\Admin\Catering\PrintTrait;
|
||||||
|
use App\Service\ServiceTrait\Api\CouponTrait;
|
||||||
use App\Service\ServiceTrait\Api\OrderTrait;
|
use App\Service\ServiceTrait\Api\OrderTrait;
|
||||||
use App\Service\ServiceTrait\Common\CycleTrait;
|
use App\Service\ServiceTrait\Common\CycleTrait;
|
||||||
use Hyperf\Di\Annotation\Inject;
|
use Hyperf\Di\Annotation\Inject;
|
||||||
@@ -24,7 +25,7 @@ use Psr\Container\NotFoundExceptionInterface;
|
|||||||
|
|
||||||
abstract class BaseOrderService extends BaseService
|
abstract class BaseOrderService extends BaseService
|
||||||
{
|
{
|
||||||
use CycleTrait,OrderTrait,PrintTrait;
|
use CycleTrait,OrderTrait,PrintTrait,CouponTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int 周期id
|
* @var int 周期id
|
||||||
@@ -100,7 +101,7 @@ abstract class BaseOrderService extends BaseService
|
|||||||
* 优惠券id
|
* 优惠券id
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
protected int $couponId;
|
protected int $couponId = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 地点id
|
* 地点id
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ class PlaceOrderService extends BaseOrderService
|
|||||||
* @return void
|
* @return void
|
||||||
* @throws ContainerExceptionInterface
|
* @throws ContainerExceptionInterface
|
||||||
* @throws NotFoundExceptionInterface
|
* @throws NotFoundExceptionInterface
|
||||||
|
* @throws ErrException
|
||||||
*/
|
*/
|
||||||
private function placeOrder(): void
|
private function placeOrder(): void
|
||||||
{
|
{
|
||||||
@@ -133,12 +134,16 @@ class PlaceOrderService extends BaseOrderService
|
|||||||
|
|
||||||
$this->insertOrderGoods();
|
$this->insertOrderGoods();
|
||||||
|
|
||||||
|
$this->couponLock();
|
||||||
|
|
||||||
Db::commit();
|
Db::commit();
|
||||||
} catch (Exception $e){
|
} catch (Exception $e){
|
||||||
echo $e->getMessage();
|
echo $e->getMessage();
|
||||||
//回滚数据库 和 缓存
|
//回滚数据库 和 缓存
|
||||||
Db::rollBack();
|
Db::rollBack();
|
||||||
$this->rollbackStock();
|
$this->rollbackStock();
|
||||||
|
|
||||||
|
// $this->rollbackCouponLock();
|
||||||
//意外抛出
|
//意外抛出
|
||||||
throw new ErrException($e->getMessage());
|
throw new ErrException($e->getMessage());
|
||||||
}
|
}
|
||||||
@@ -207,7 +212,7 @@ class PlaceOrderService extends BaseOrderService
|
|||||||
$orderInsertModel->is_refund_all = OrderCode::REFUND_NULL;
|
$orderInsertModel->is_refund_all = OrderCode::REFUND_NULL;
|
||||||
$orderInsertModel->order_json = json_encode($this->orderRes);
|
$orderInsertModel->order_json = json_encode($this->orderRes);
|
||||||
|
|
||||||
if (!$orderInsertModel->save()) throw new Exception('下单失败');
|
if (!$orderInsertModel->save()) throw new Exception('下单失败-01');
|
||||||
|
|
||||||
$this->orderId = $orderInsertModel->id;
|
$this->orderId = $orderInsertModel->id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace App\Service\ServiceTrait\Api;
|
|||||||
|
|
||||||
use App\Constants\Common\CouponCode;
|
use App\Constants\Common\CouponCode;
|
||||||
use App\Constants\Common\OrderCode;
|
use App\Constants\Common\OrderCode;
|
||||||
|
use App\Exception\ErrException;
|
||||||
use App\Extend\DateUtil;
|
use App\Extend\DateUtil;
|
||||||
use App\Model\UserCoupon;
|
use App\Model\UserCoupon;
|
||||||
use Exception;
|
use Exception;
|
||||||
@@ -32,14 +33,56 @@ trait CouponTrait
|
|||||||
$couponInfo = $this->userCouponModel->where('id', $orderInfo->coupon_id)->where('user_id',$orderInfo->user_id)->first();
|
$couponInfo = $this->userCouponModel->where('id', $orderInfo->coupon_id)->where('user_id',$orderInfo->user_id)->first();
|
||||||
|
|
||||||
if (empty($couponInfo)) return;
|
if (empty($couponInfo)) return;
|
||||||
|
if ($couponInfo->status != CouponCode::COUPON_STATUS_USED) return;
|
||||||
|
|
||||||
$couponInfo->status = CouponCode::COUPON_STATUS_UNUSED;
|
$couponInfo->status = CouponCode::COUPON_STATUS_UNUSED;
|
||||||
|
$couponInfo->use_time = null;
|
||||||
|
|
||||||
if (date('Y-m-d H:i:s') > $couponInfo->validity_end_time) $couponInfo->status = CouponCode::COUPON_STATUS_EXPIRE;
|
if (date('Y-m-d H:i:s') > $couponInfo->validity_end_time) $couponInfo->status = CouponCode::COUPON_STATUS_EXPIRE;
|
||||||
|
|
||||||
if (!$couponInfo->save()) throw new Exception('CancelOrderConsumer:error:couponStatusUpdateError:'.json_encode($orderInfo->toArray()));
|
if (!$couponInfo->save()) throw new Exception('CancelOrderConsumer:error:couponStatusUpdateError:'.json_encode($orderInfo->toArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
protected function couponLock(): void
|
||||||
|
{
|
||||||
|
if ($this->couponId <= 0) return;
|
||||||
|
|
||||||
|
$couponInfo = $this->userCouponModel->where('id', $this->couponId)->where('user_id',$this->userId)->first();
|
||||||
|
|
||||||
|
if (empty($couponInfo)) return;
|
||||||
|
|
||||||
|
$couponInfo->status = CouponCode::COUPON_STATUS_USED;
|
||||||
|
$couponInfo->use_time = date('Y-m-d H:i:s');
|
||||||
|
|
||||||
|
if (date('Y-m-d H:i:s') > $couponInfo->validity_end_time) throw new Exception('优惠券已过期');
|
||||||
|
|
||||||
|
if (!$couponInfo->save()) throw new Exception('couponLock:error:couponLockUpdateError:'.json_encode($couponInfo->toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
* @throws ErrException
|
||||||
|
*/
|
||||||
|
protected function rollbackCouponLock(): void
|
||||||
|
{
|
||||||
|
if ($this->couponId <= 0) return;
|
||||||
|
|
||||||
|
$couponInfo = $this->userCouponModel->where('id', $this->couponId)->where('user_id',$this->userId)->first();
|
||||||
|
|
||||||
|
if (empty($couponInfo)) return;
|
||||||
|
|
||||||
|
if ($couponInfo->status != CouponCode::COUPON_STATUS_USED) return;
|
||||||
|
|
||||||
|
$couponInfo->status = CouponCode::COUPON_STATUS_UNUSED;
|
||||||
|
$couponInfo->use_time = '1970-01-01 00:00:00';
|
||||||
|
|
||||||
|
if (!$couponInfo->save()) throw new ErrException('系统错误-rollback_coupon失败');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $type
|
* @param int $type
|
||||||
* @param string $value
|
* @param string $value
|
||||||
|
|||||||
Reference in New Issue
Block a user