mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-30 14:31:04 +00:00
Merge branch 'v4.7.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v4.7.0dev
This commit is contained in:
commit
36de16b949
@ -207,6 +207,7 @@ class ExportExcel extends AuthController
|
||||
['price_max', ''],
|
||||
['price_min', ''],
|
||||
['excel', '1'],
|
||||
['time', ''],
|
||||
]);
|
||||
$data = $services->getCommissionList($where, false);
|
||||
return app('json')->success($this->service->userCommission($data['list'] ?? []));
|
||||
|
||||
@ -184,7 +184,7 @@ class RefundOrder extends AuthController
|
||||
$refund_data['open_id'] = $wechatUserServices->uidToOpenid((int)$order['uid'], 'routine') ?? '';
|
||||
$refund_data['refund_no'] = $orderRefund['order_id'];
|
||||
//修改订单退款状态
|
||||
unset($data['refund_price']);
|
||||
$data['refund_price'] = $data['refunded_price'];
|
||||
if ($this->services->agreeRefund($id, $refund_data)) {
|
||||
$this->services->update($id, $data);
|
||||
return app('json')->success(400149);
|
||||
|
||||
@ -591,7 +591,7 @@ class StoreOrder extends AuthController
|
||||
}
|
||||
$services->storeProductOrderRefundNo((int)$id, $refund_reason);
|
||||
//提醒推送
|
||||
event('notice.notice', [['orderInfo' => $orderInfo], 'send_order_refund_no_status']);
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo], 'send_order_refund_no_status']);
|
||||
return app('json')->success(100010);
|
||||
}
|
||||
|
||||
|
||||
@ -3,12 +3,12 @@
|
||||
namespace app\adminapi\controller\v1\system;
|
||||
|
||||
use app\adminapi\controller\AuthController;
|
||||
use app\services\system\timer\SystemTimerServices;
|
||||
use app\services\system\crontab\SystemCrontabServices;
|
||||
use think\facade\App;
|
||||
|
||||
class SystemTimer extends AuthController
|
||||
class SystemCrontab extends AuthController
|
||||
{
|
||||
public function __construct(App $app, SystemTimerServices $services)
|
||||
public function __construct(App $app, SystemCrontabServices $services)
|
||||
{
|
||||
parent::__construct($app);
|
||||
$this->services = $services;
|
||||
@ -99,17 +99,17 @@ Route::group('system', function () {
|
||||
|
||||
/** 定时任务 */
|
||||
//定时任务列表
|
||||
Route::get('timer/list', 'v1.system.SystemTimer/getTimerList')->option(['real_name' => '定时任务列表']);
|
||||
Route::get('crontab/list', 'v1.system.SystemCrontab/getTimerList')->option(['real_name' => '定时任务列表']);
|
||||
//定时任务类型
|
||||
Route::get('timer/mark', 'v1.system.SystemTimer/getMarkList')->option(['real_name' => '定时任务类型']);
|
||||
Route::get('crontab/mark', 'v1.system.SystemCrontab/getMarkList')->option(['real_name' => '定时任务类型']);
|
||||
//定时任务详情
|
||||
Route::get('timer/info/:id', 'v1.system.SystemTimer/getTimerInfo')->option(['real_name' => '定时任务详情']);
|
||||
Route::get('crontab/info/:id', 'v1.system.SystemCrontab/getTimerInfo')->option(['real_name' => '定时任务详情']);
|
||||
//定时任务添加编辑
|
||||
Route::post('timer/save', 'v1.system.SystemTimer/saveTimer')->option(['real_name' => '定时任务添加编辑']);
|
||||
Route::post('crontab/save', 'v1.system.SystemCrontab/saveTimer')->option(['real_name' => '定时任务添加编辑']);
|
||||
//删除定时任务
|
||||
Route::delete('timer/del/:id', 'v1.system.SystemTimer/delTimer')->option(['real_name' => '删除定时任务']);
|
||||
Route::delete('crontab/del/:id', 'v1.system.SystemCrontab/delTimer')->option(['real_name' => '删除定时任务']);
|
||||
//定时任务是否开启开关
|
||||
Route::get('timer/set_open/:id/:is_open', 'v1.system.SystemTimer/setTimerStatus')->option(['real_name' => '定时任务是否开启开关']);
|
||||
Route::get('crontab/set_open/:id/:is_open', 'v1.system.SystemCrontab/setTimerStatus')->option(['real_name' => '定时任务是否开启开关']);
|
||||
|
||||
})->middleware([
|
||||
\app\http\middleware\AllowOriginMiddleware::class,
|
||||
|
||||
@ -10,9 +10,15 @@ use app\services\order\StoreOrderServices;
|
||||
use app\services\order\StoreOrderTakeServices;
|
||||
use app\services\product\product\StoreProductServices;
|
||||
use app\services\system\attachment\SystemAttachmentServices;
|
||||
use app\services\system\timer\SystemTimerServices;
|
||||
use app\services\system\crontab\SystemCrontabServices;
|
||||
|
||||
class TimerController
|
||||
/**
|
||||
* 定时任务控制器
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/02/21
|
||||
*/
|
||||
class CrontabController
|
||||
{
|
||||
/**
|
||||
* 定时任务调用接口
|
||||
@ -20,15 +26,15 @@ class TimerController
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/02/17
|
||||
*/
|
||||
public function timerRun()
|
||||
public function crontabRun()
|
||||
{
|
||||
app()->make(SystemTimerServices::class)->timerRun();
|
||||
app()->make(SystemCrontabServices::class)->crontabRun();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测定时任务是否正常,必须6秒执行一次
|
||||
*/
|
||||
public function timerCheck()
|
||||
public function crontabCheck()
|
||||
{
|
||||
file_put_contents(root_path() . 'runtime/.timer', time());
|
||||
}
|
||||
@ -42,6 +42,7 @@ class DivisionController
|
||||
]);
|
||||
$verifyCode = CacheService::get('code_' . $data['phone']);
|
||||
if ($verifyCode != $data['code']) return app('json')->fail(410010);
|
||||
if ($data['division_invite'] == 0) return app('json')->fail(500028);
|
||||
$this->services->applyAgent($data, $id);
|
||||
return app('json')->success(100017);
|
||||
}
|
||||
|
||||
@ -391,27 +391,27 @@ Route::group(function () {
|
||||
|
||||
/** 定时任务接口 */
|
||||
//定时任务调用接口
|
||||
Route::get('timer/run', 'v1.TimerController/timerRun')->name('timerRun');
|
||||
Route::get('crontab/run', 'v1.CrontabController/crontabRun')->name('crontabRun');
|
||||
//检测定时任务接口
|
||||
Route::get('timer/check', 'v1.TimerController/timerCheck')->name('timerCheck');
|
||||
Route::get('crontab/check', 'v1.CrontabController/crontabCheck')->name('crontabCheck');
|
||||
//未支付自动取消订单
|
||||
Route::get('timer/order_cancel', 'v1.TimerController/orderUnpaidCancel')->name('orderUnpaidCancel');
|
||||
Route::get('crontab/order_cancel', 'v1.CrontabController/orderUnpaidCancel')->name('orderUnpaidCancel');
|
||||
//拼团到期订单处理
|
||||
Route::get('timer/pink_expiration', 'v1.TimerController/pinkExpiration')->name('pinkExpiration');
|
||||
Route::get('crontab/pink_expiration', 'v1.CrontabController/pinkExpiration')->name('pinkExpiration');
|
||||
//自动解绑上级绑定
|
||||
Route::get('timer/agent_unbind', 'v1.TimerController/agentUnbind')->name('agentUnbind');
|
||||
Route::get('crontab/agent_unbind', 'v1.CrontabController/agentUnbind')->name('agentUnbind');
|
||||
//更新直播商品状态
|
||||
Route::get('timer/live_product_status', 'v1.TimerController/syncGoodStatus')->name('syncGoodStatus');
|
||||
Route::get('crontab/live_product_status', 'v1.CrontabController/syncGoodStatus')->name('syncGoodStatus');
|
||||
//更新直播间状态
|
||||
Route::get('timer/live_room_status', 'v1.TimerController/syncRoomStatus')->name('syncRoomStatus');
|
||||
Route::get('crontab/live_room_status', 'v1.CrontabController/syncRoomStatus')->name('syncRoomStatus');
|
||||
//自动收货
|
||||
Route::get('timer/take_delivery', 'v1.TimerController/autoTakeOrder')->name('autoTakeOrder');
|
||||
Route::get('crontab/take_delivery', 'v1.CrontabController/autoTakeOrder')->name('autoTakeOrder');
|
||||
//查询预售到期商品自动下架
|
||||
Route::get('timer/advance_off', 'v1.TimerController/downAdvance')->name('downAdvance');
|
||||
Route::get('crontab/advance_off', 'v1.CrontabController/downAdvance')->name('downAdvance');
|
||||
//自动好评
|
||||
Route::get('timer/product_replay', 'v1.TimerController/autoComment')->name('autoComment');
|
||||
Route::get('crontab/product_replay', 'v1.CrontabController/autoComment')->name('autoComment');
|
||||
//清除昨日海报
|
||||
Route::get('timer/clear_poster', 'v1.TimerController/emptyYesterdayAttachment')->name('emptyYesterdayAttachment');
|
||||
Route::get('crontab/clear_poster', 'v1.CrontabController/emptyYesterdayAttachment')->name('emptyYesterdayAttachment');
|
||||
|
||||
|
||||
})->middleware(\app\http\middleware\AllowOriginMiddleware::class)->middleware(\app\api\middleware\StationOpenMiddleware::class)->middleware(\app\api\middleware\AuthTokenMiddleware::class, false);
|
||||
|
||||
18
crmeb/app/dao/system/crontab/SystemCrontabDao.php
Normal file
18
crmeb/app/dao/system/crontab/SystemCrontabDao.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace app\dao\system\crontab;
|
||||
|
||||
use app\dao\BaseDao;
|
||||
use app\model\system\crontab\SystemCrontab;
|
||||
|
||||
class SystemCrontabDao extends BaseDao
|
||||
{
|
||||
/**
|
||||
* 设置模型
|
||||
* @return string
|
||||
*/
|
||||
protected function setModel(): string
|
||||
{
|
||||
return SystemCrontab::class;
|
||||
}
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace app\dao\system\timer;
|
||||
|
||||
use app\dao\BaseDao;
|
||||
use app\model\system\timer\SystemTimer;
|
||||
|
||||
class SystemTimerDao extends BaseDao
|
||||
{
|
||||
/**
|
||||
* 设置模型
|
||||
* @return string
|
||||
*/
|
||||
protected function setModel(): string
|
||||
{
|
||||
return SystemTimer::class;
|
||||
}
|
||||
}
|
||||
@ -19,26 +19,26 @@ return [
|
||||
'listen' => [
|
||||
'AppInit' => [],
|
||||
'HttpRun' => [],
|
||||
'HttpEnd' => [\app\listener\http\HttpEnd::class], //HTTP请求结束回调事件
|
||||
'HttpEnd' => [\app\listener\http\HttpEndListener::class], //HTTP请求结束回调事件
|
||||
'LogLevel' => [],
|
||||
'LogWrite' => [],
|
||||
'queue.start' => [\app\listener\queue\QueueStart::class],
|
||||
'user.login' => [\app\listener\user\Login::class],
|
||||
'admin.login' => [\app\listener\admin\AdminLogin::class],//管理员登录
|
||||
'user.register' => [\app\listener\user\Register::class], //用户注册后置事件
|
||||
'wechat.auth' => [\app\listener\wechat\Auth::class], //用户授权后置事件
|
||||
'order.orderCreateAfter' => [\app\listener\order\OrderCreateAfter::class], //订单创建后置事件
|
||||
'order.orderPaySuccess' => [\app\listener\order\OrderPaySuccess::class], //订单支付成功后置事件
|
||||
'order.orderDelivery' => [\app\listener\order\OrderDelivery::class], //订单发货后置事件
|
||||
'order.orderTake' => [\app\listener\order\OrderTake::class], //订单收货后置事件
|
||||
'order.orderRefundCreateAfter' => [\app\listener\order\OrderRefundCreateAfter::class], //售后单生成后置事件
|
||||
'order.orderRefundCancelAfter' => [\app\listener\order\OrderRefundCancelAfter::class], //售后单取消后置事件
|
||||
'out.outPush' => [\app\listener\out\OutPush::class], //对外推送事件
|
||||
'user.userLevel' => [\app\listener\user\UserLevel::class], //用户升级事件
|
||||
'user.userVisit' => [\app\listener\user\UserVisit::class], //用户访问事件
|
||||
'notice.notice' => [\app\listener\notice\Notice::class], //通知->消息事件
|
||||
'pay.notify' => [\app\listener\pay\Notify::class],//支付异步回调
|
||||
'Crontab' => [\app\listener\crontab\SystemCrontab::class],//定时任务事件
|
||||
'QueueStartListener' => [\app\listener\queue\QueueStartListener::class],
|
||||
'UserLoginListener' => [\app\listener\user\LoginListener::class],
|
||||
'AdminLoginListener' => [\app\listener\admin\AdminLoginListener::class],//管理员登录
|
||||
'UserRegisterListener' => [\app\listener\user\RegisterListener::class], //用户注册后置事件
|
||||
'WechatAuthListener' => [\app\listener\wechat\AuthListener::class], //用户授权后置事件
|
||||
'OrderCreateAfterListener' => [\app\listener\order\OrderCreateAfterListener::class], //订单创建后置事件
|
||||
'OrderPaySuccessListener' => [\app\listener\order\OrderPaySuccessListener::class], //订单支付成功后置事件
|
||||
'OrderDeliveryListener' => [\app\listener\order\OrderDeliveryListener::class], //订单发货后置事件
|
||||
'OrderTakeListener' => [\app\listener\order\OrderTakeListener::class], //订单收货后置事件
|
||||
'OrderRefundCreateAfterListener' => [\app\listener\order\OrderRefundCreateAfterListener::class], //售后单生成后置事件
|
||||
'OrderRefundCancelAfterListener' => [\app\listener\order\OrderRefundCancelAfterListener::class], //售后单取消后置事件
|
||||
'OutPushListener' => [\app\listener\out\OutPushListener::class], //对外推送事件
|
||||
'UserLevelListener' => [\app\listener\user\UserLevelListener::class], //用户升级事件
|
||||
'UserVisitListener' => [\app\listener\user\UserVisitListener::class], //用户访问事件
|
||||
'NoticeListener' => [\app\listener\notice\NoticeListener::class], //通知->消息事件
|
||||
'NotifyListener' => [\app\listener\pay\NotifyListener::class],//支付异步回调
|
||||
'CrontabListener' => [\app\listener\crontab\SystemCrontabListener::class],//定时任务事件
|
||||
],
|
||||
];
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ class UnpaidOrderSend extends BaseJobs
|
||||
return true;
|
||||
}
|
||||
//收货给用户发送消息
|
||||
event('notice.notice', [['order' => $orderInfo], 'order_pay_false']);
|
||||
event('NoticeListener', [['order' => $orderInfo], 'order_pay_false']);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ namespace app\listener\admin;
|
||||
* Class AdminLogin
|
||||
* @package app\listener\admin
|
||||
*/
|
||||
class AdminLogin
|
||||
class AdminLoginListener
|
||||
{
|
||||
|
||||
public function handle($event)
|
||||
@ -10,7 +10,7 @@ use app\services\order\StoreOrderServices;
|
||||
use app\services\order\StoreOrderTakeServices;
|
||||
use app\services\product\product\StoreProductServices;
|
||||
use app\services\system\attachment\SystemAttachmentServices;
|
||||
use app\services\system\timer\SystemTimerServices;
|
||||
use app\services\system\crontab\SystemCrontabServices;
|
||||
use crmeb\interfaces\ListenerInterface;
|
||||
use think\facade\Log;
|
||||
use Workerman\Crontab\Crontab;
|
||||
@ -18,19 +18,18 @@ use Workerman\Crontab\Crontab;
|
||||
/**
|
||||
* 系统定时任务
|
||||
*/
|
||||
class SystemCrontab implements ListenerInterface
|
||||
class SystemCrontabListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
//自动写入文件方便检测是否启动定时任务命令
|
||||
$time = time();
|
||||
new Crontab('*/6 * * * * *', function () use ($time) {
|
||||
file_put_contents(root_path() . 'runtime/.timer', $time);
|
||||
new Crontab('*/6 * * * * *', function () {
|
||||
file_put_contents(root_path() . 'runtime/.timer', time());
|
||||
});
|
||||
|
||||
/** @var SystemTimerServices $systemTimerServices */
|
||||
$systemTimerServices = app()->make(SystemTimerServices::class);
|
||||
$list = $systemTimerServices->selectList(['is_del' => 0, 'is_open' => 1])->toArray();
|
||||
/** @var SystemCrontabServices $systemTimerServices */
|
||||
$systemCrontabServices = app()->make(SystemCrontabServices::class);
|
||||
$list = $systemCrontabServices->selectList(['is_del' => 0, 'is_open' => 1])->toArray();
|
||||
foreach ($list as &$item) {
|
||||
//获取定时任务时间字符串
|
||||
$timeStr = $this->getTimerStr($item);
|
||||
@ -38,9 +37,7 @@ class SystemCrontab implements ListenerInterface
|
||||
if ($item['mark'] == 'order_cancel') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var StoreOrderServices $orderServices */
|
||||
$orderServices = app()->make(StoreOrderServices::class);
|
||||
$orderServices->orderUnpaidCancel();
|
||||
app()->make(StoreOrderServices::class)->orderUnpaidCancel();
|
||||
$this->crontabLog(' 执行未支付自动取消订单');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('自动取消订单失败,失败原因:' . $e->getMessage());
|
||||
@ -51,9 +48,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'pink_expiration') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var StorePinkServices $storePinkServices */
|
||||
$storePinkServices = app()->make(StorePinkServices::class);
|
||||
$storePinkServices->statusPink();
|
||||
app()->make(StorePinkServices::class)->statusPink();
|
||||
$this->crontabLog(' 执行拼团到期订单处理');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('拼团到期订单处理失败,失败原因:' . $e->getMessage());
|
||||
@ -64,9 +59,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'agent_unbind') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var AgentManageServices $agentManage */
|
||||
$agentManage = app()->make(AgentManageServices::class);
|
||||
$agentManage->removeSpread();
|
||||
app()->make(AgentManageServices::class)->removeSpread();
|
||||
$this->crontabLog(' 执行自动解绑上级绑定');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('自动解除上级绑定失败,失败原因:' . $e->getMessage());
|
||||
@ -77,9 +70,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'live_product_status') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var LiveGoodsServices $liveGoods */
|
||||
$liveGoods = app()->make(LiveGoodsServices::class);
|
||||
$liveGoods->syncGoodStatus();
|
||||
app()->make(LiveGoodsServices::class)->syncGoodStatus();
|
||||
$this->crontabLog(' 执行更新直播商品状态');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('更新直播商品状态失败,失败原因:' . $e->getMessage());
|
||||
@ -90,11 +81,8 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'live_room_status') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var LiveRoomServices $liveRoom */
|
||||
$liveRoom = app()->make(LiveRoomServices::class);
|
||||
$liveRoom->syncRoomStatus();
|
||||
app()->make(LiveRoomServices::class)->syncRoomStatus();
|
||||
$this->crontabLog(' 执行更新直播间状态');
|
||||
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('更新直播间状态失败,失败原因:' . $e->getMessage());
|
||||
}
|
||||
@ -104,9 +92,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'take_delivery') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var StoreOrderTakeServices $services */
|
||||
$services = app()->make(StoreOrderTakeServices::class);
|
||||
$services->autoTakeOrder();
|
||||
app()->make(StoreOrderTakeServices::class)->autoTakeOrder();
|
||||
$this->crontabLog(' 执行自动收货');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('自动收货失败,失败原因:' . $e->getMessage());
|
||||
@ -117,9 +103,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'advance_off') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var StoreProductServices $product */
|
||||
$product = app()->make(StoreProductServices::class);
|
||||
$product->downAdvance();
|
||||
app()->make(StoreProductServices::class)->downAdvance();
|
||||
$this->crontabLog(' 执行预售到期商品自动下架');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('预售到期商品自动下架失败,失败原因:' . $e->getMessage());
|
||||
@ -130,9 +114,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'product_replay') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var StoreOrderServices $orderServices */
|
||||
$orderServices = app()->make(StoreOrderServices::class);
|
||||
$orderServices->autoComment();
|
||||
app()->make(StoreOrderServices::class)->autoComment();
|
||||
$this->crontabLog(' 执行自动好评');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('自动好评失败,失败原因:' . $e->getMessage());
|
||||
@ -143,9 +125,7 @@ class SystemCrontab implements ListenerInterface
|
||||
elseif ($item['mark'] == 'clear_poster') {
|
||||
new Crontab($timeStr, function () {
|
||||
try {
|
||||
/** @var SystemAttachmentServices $attach */
|
||||
$attach = app()->make(SystemAttachmentServices::class);
|
||||
$attach->emptyYesterdayAttachment();
|
||||
app()->make(SystemAttachmentServices::class)->emptyYesterdayAttachment();
|
||||
$this->crontabLog(' 执行清除昨日海报');
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('清除昨日海报失败,失败原因:' . $e->getMessage());
|
||||
@ -159,7 +139,8 @@ class SystemCrontab implements ListenerInterface
|
||||
}
|
||||
}
|
||||
|
||||
/** 定时任务日志
|
||||
/**
|
||||
* 定时任务日志
|
||||
* @param $msg
|
||||
*/
|
||||
public function crontabLog($msg)
|
||||
@ -167,9 +148,10 @@ class SystemCrontab implements ListenerInterface
|
||||
$timer_log_open = config("log.timer_log", false);
|
||||
if ($timer_log_open){
|
||||
$date = date('Y-m-d H:i:s', time());
|
||||
Log::notice($date . $msg);
|
||||
Log::info($date . $msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 0 1 2 3 4 5
|
||||
* | | | | | |
|
||||
@ -19,7 +19,7 @@ use think\Response;
|
||||
* Class Create
|
||||
* @package app\listener\http
|
||||
*/
|
||||
class HttpEnd
|
||||
class HttpEndListener
|
||||
{
|
||||
public function handle(Response $response):void
|
||||
{
|
||||
@ -31,7 +31,7 @@ use crmeb\utils\Str;
|
||||
* Class Create
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class Notice implements ListenerInterface
|
||||
class NoticeListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -18,10 +18,10 @@ use crmeb\utils\Arr;
|
||||
|
||||
/**
|
||||
* 订单创建后置事件
|
||||
* Class OrderCreateAfter
|
||||
* Class OrderCreateAfterListener
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderCreateAfter implements ListenerInterface
|
||||
class OrderCreateAfterListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -9,10 +9,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 订单到期自动收货
|
||||
* Class OrderDelivery
|
||||
* Class OrderDeliveryListener
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderDelivery implements ListenerInterface
|
||||
class OrderDeliveryListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -27,10 +27,10 @@ use think\facade\Log;
|
||||
|
||||
/**
|
||||
* 订单支付成功后
|
||||
* Class OrderPaySuccess
|
||||
* Class OrderPaySuccessListener
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderPaySuccess implements ListenerInterface
|
||||
class OrderPaySuccessListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -7,10 +7,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 售后单取消
|
||||
* Class OrderRefundCancelAfter
|
||||
* Class OrderRefundCancelAfterListener
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderRefundCancelAfter implements ListenerInterface
|
||||
class OrderRefundCancelAfterListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -11,7 +11,7 @@ use crmeb\interfaces\ListenerInterface;
|
||||
* Class orderRefundCreateAfter
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderRefundCreateAfter implements ListenerInterface
|
||||
class OrderRefundCreateAfterListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -11,10 +11,10 @@ use think\facade\Log;
|
||||
|
||||
/**
|
||||
* 订单确认收货
|
||||
* Class OrderTake
|
||||
* Class OrderTakeListener
|
||||
* @package app\listener\order
|
||||
*/
|
||||
class OrderTake implements ListenerInterface
|
||||
class OrderTakeListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -9,7 +9,7 @@ use crmeb\services\CacheService;
|
||||
use crmeb\services\HttpService;
|
||||
use think\facade\Log;
|
||||
|
||||
class OutPush implements ListenerInterface
|
||||
class OutPushListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -18,10 +18,10 @@ use crmeb\utils\Hook;
|
||||
|
||||
/**
|
||||
* 支付异步回调
|
||||
* Class Notify
|
||||
* Class NotifyListener
|
||||
* @package app\listener\pay
|
||||
*/
|
||||
class Notify
|
||||
class NotifyListener
|
||||
{
|
||||
/**
|
||||
* @param $event
|
||||
@ -16,7 +16,7 @@ namespace app\listener\queue;
|
||||
|
||||
use think\console\Output;
|
||||
|
||||
class QueueStart
|
||||
class QueueStartListener
|
||||
{
|
||||
|
||||
public function handle(Output $output)
|
||||
@ -8,10 +8,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 用户登录后置事件
|
||||
* Class Login
|
||||
* Class LoginListener
|
||||
* @package app\listener\user
|
||||
*/
|
||||
class Login implements ListenerInterface
|
||||
class LoginListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -13,10 +13,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 注册完成后置事件
|
||||
* Class Register
|
||||
* Class RegisterListener
|
||||
* @package app\listener\user
|
||||
*/
|
||||
class Register implements ListenerInterface
|
||||
class RegisterListener implements ListenerInterface
|
||||
{
|
||||
/**
|
||||
* 注册完成后置事件
|
||||
@ -9,10 +9,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 用户升级事件
|
||||
* Class UserLevel
|
||||
* Class UserLevelListener
|
||||
* @package app\listener\user
|
||||
*/
|
||||
class UserLevel implements ListenerInterface
|
||||
class UserLevelListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -9,10 +9,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 写入用户访问
|
||||
* Class UserVisit
|
||||
* Class UserVisitListener
|
||||
* @package app\listener\user
|
||||
*/
|
||||
class UserVisit implements ListenerInterface
|
||||
class UserVisitListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -8,10 +8,10 @@ use crmeb\interfaces\ListenerInterface;
|
||||
|
||||
/**
|
||||
* 用户授权后置事件
|
||||
* Class Auth
|
||||
* Class AuthListener
|
||||
* @package app\listener\wechat
|
||||
*/
|
||||
class Auth implements ListenerInterface
|
||||
class AuthListener implements ListenerInterface
|
||||
{
|
||||
public function handle($event): void
|
||||
{
|
||||
@ -1,11 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace app\model\system\timer;
|
||||
namespace app\model\system\crontab;
|
||||
|
||||
use crmeb\basic\BaseModel;
|
||||
use crmeb\traits\ModelTrait;
|
||||
|
||||
class SystemTimer extends BaseModel
|
||||
class SystemCrontab extends BaseModel
|
||||
{
|
||||
use ModelTrait;
|
||||
|
||||
@ -319,7 +319,7 @@ class StoreAdvanceServices extends BaseServices
|
||||
$data['productValue'] = $productValue;
|
||||
$data['routine_contact_type'] = sys_config('routine_contact_type', 0);
|
||||
//用户访问事件
|
||||
event('user.userVisit', [$uid, $id, 'advance', $storeInfo['product_id'], 'view']);
|
||||
event('UserVisitListener', [$uid, $id, 'advance', $storeInfo['product_id'], 'view']);
|
||||
//浏览记录
|
||||
ProductLogJob::dispatch(['visit', ['uid' => $uid, 'product_id' => $storeInfo['product_id']]]);
|
||||
return $data;
|
||||
|
||||
@ -505,7 +505,7 @@ class StoreBargainServices extends BaseServices
|
||||
$data['bargain']['price'] = bcsub($data['bargain']['price'], (string)$userBargainInfo['alreadyPrice'], 2);
|
||||
|
||||
//用户访问事件
|
||||
event('user.userVisit', [$user['uid'], $id, 'bargain', $bargain['product_id'], 'view']);
|
||||
event('UserVisitListener', [$user['uid'], $id, 'bargain', $bargain['product_id'], 'view']);
|
||||
|
||||
//浏览记录
|
||||
ProductLogJob::dispatch(['visit', ['uid' => $user['uid'], 'product_id' => $bargain['product_id']]]);
|
||||
@ -646,7 +646,7 @@ class StoreBargainServices extends BaseServices
|
||||
$price = $userHelpService->setBargainRecord($uid, $bargainUserInfo, $bargainInfo);
|
||||
if ($price) {
|
||||
if (!$bargainUserService->getSurplusPrice($bargainUserTableId, 1)) {
|
||||
event('notice.notice', [['uid' => $bargainUserUid, 'bargainInfo' => $bargainInfo, 'bargainUserInfo' => $bargainUserInfo,], 'bargain_success']);
|
||||
event('NoticeListener', [['uid' => $bargainUserUid, 'bargainInfo' => $bargainInfo, 'bargainUserInfo' => $bargainUserInfo,], 'bargain_success']);
|
||||
}
|
||||
}
|
||||
return ['bargainUserInfo' => $bargainUserInfo, 'price' => $price];
|
||||
|
||||
@ -425,7 +425,7 @@ class StoreCombinationServices extends BaseServices
|
||||
$data['routine_contact_type'] = sys_config('routine_contact_type', 0);
|
||||
|
||||
//用户访问事件
|
||||
event('user.userVisit', [$uid, $id, 'combination', $storeInfo['product_id'], 'view']);
|
||||
event('UserVisitListener', [$uid, $id, 'combination', $storeInfo['product_id'], 'view']);
|
||||
//浏览记录
|
||||
ProductLogJob::dispatch(['visit', ['uid' => $uid, 'product_id' => $storeInfo['product_id']]]);
|
||||
return $data;
|
||||
|
||||
@ -300,9 +300,9 @@ class StorePinkServices extends BaseServices
|
||||
{
|
||||
$pink = $this->dao->getOne([['id|k_id', '=', $pid], ['uid', '=', $uid]], '*', ['getProduct']);
|
||||
if ($isRemove) {
|
||||
event('notice.notice', [['uid' => $uid, 'pink' => $pink, 'user_type' => $channel], 'send_order_pink_clone']);
|
||||
event('NoticeListener', [['uid' => $uid, 'pink' => $pink, 'user_type' => $channel], 'send_order_pink_clone']);
|
||||
} else {
|
||||
event('notice.notice', [['uid' => $uid, 'pink' => $pink, 'user_type' => $channel], 'send_order_pink_fial']);
|
||||
event('NoticeListener', [['uid' => $uid, 'pink' => $pink, 'user_type' => $channel], 'send_order_pink_fial']);
|
||||
}
|
||||
$this->dao->update([['id|k_id', '=', $pid]], ['status' => 3, 'stop_time' => time()]);
|
||||
}
|
||||
@ -390,7 +390,7 @@ class StorePinkServices extends BaseServices
|
||||
foreach ($pinkList as $item) {
|
||||
$item['nickname'] = $pinkT_name;
|
||||
//用户发送消息
|
||||
event('notice.notice', [
|
||||
event('NoticeListener', [
|
||||
[
|
||||
'list' => $item,
|
||||
'title' => $title,
|
||||
@ -439,7 +439,7 @@ class StorePinkServices extends BaseServices
|
||||
$res = $this->save($pink);
|
||||
}
|
||||
// 拼团团成功发送模板消息
|
||||
event('notice.notice', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'can_pink_success']);
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'can_pink_success']);
|
||||
|
||||
//处理拼团完成
|
||||
list($pinkAll, $pinkT, $count, $idAll, $uidAll) = $this->getPinkMemberAndPinkK($pink);
|
||||
@ -483,7 +483,7 @@ class StorePinkServices extends BaseServices
|
||||
|
||||
PinkJob::dispatchSecs((int)(($product->effective_time * 3600) + 60), [$pink['id']]);
|
||||
// 开团成功发送模板消息
|
||||
event('notice.notice', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'open_pink_success']);
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'open_pink_success']);
|
||||
|
||||
if ($res) return true;
|
||||
else return false;
|
||||
|
||||
@ -569,7 +569,7 @@ class StoreSeckillServices extends BaseServices
|
||||
$data['routine_contact_type'] = sys_config('routine_contact_type', 0);
|
||||
|
||||
//用户访问事件
|
||||
event('user.userVisit', [$uid, $id, 'seckill', $storeInfo['product_id'], 'view']);
|
||||
event('UserVisitListener', [$uid, $id, 'seckill', $storeInfo['product_id'], 'view']);
|
||||
//浏览记录
|
||||
ProductLogJob::dispatch(['visit', ['uid' => $uid, 'product_id' => $storeInfo['product_id']]]);
|
||||
return $data;
|
||||
|
||||
@ -482,25 +482,27 @@ class StoreOrderComputedServices extends BaseServices
|
||||
$tempNumber = $temp_num[$tempId]['number'] ?? 0;
|
||||
if (!$tempId || !$tempPostage || !$tempNumber) continue;
|
||||
$type = $temp_num[$tempId]['type'];
|
||||
$cartNumber = $item['cart_num'];
|
||||
if ((($cartAlready[$tempId]['number'] ?? 0) + $cartNumber) >= $tempNumber) {
|
||||
|
||||
|
||||
if ($type == 1) {
|
||||
$num = $item['cart_num'];
|
||||
} elseif ($type == 2) {
|
||||
$num = $item['cart_num'] * $item['productInfo']['attrInfo']['weight'];
|
||||
} else {
|
||||
$num = $item['cart_num'] * $item['productInfo']['attrInfo']['volume'];
|
||||
}
|
||||
if ((($cartAlready[$tempId]['number'] ?? 0) + $num) >= $tempNumber) {
|
||||
$price = isset($cartAlready[$tempId]['price']) ? bcsub((string)$tempPostage, (string)$cartAlready[$tempId]['price'], 6) : $tempPostage;
|
||||
} else {
|
||||
$price = bcmul((string)$tempPostage, bcdiv((string)$cartNumber, (string)$tempNumber, 6), 6);
|
||||
$price = bcmul((string)$tempPostage, bcdiv((string)$num, (string)$tempNumber, 6), 6);
|
||||
}
|
||||
$cartAlready[$tempId]['number'] = bcadd((string)($cartNumber[$tempId]['number'] ?? 0), (string)$cartNumber, 4);
|
||||
$cartAlready[$tempId]['price'] = bcadd((string)($cartNumber[$tempId]['price'] ?? 0.00), (string)$price, 4);
|
||||
$cartAlready[$tempId]['number'] = bcadd((string)($cartAlready[$tempId]['number'] ?? 0), (string)$num, 4);
|
||||
$cartAlready[$tempId]['price'] = bcadd((string)($cartAlready[$tempId]['price'] ?? 0.00), (string)$price, 4);
|
||||
|
||||
if ($express_rule_number && $express_rule_number < 100) {
|
||||
$price = bcmul($price, $discountRate, 4);
|
||||
}
|
||||
if ($type == 2) {
|
||||
$price = bcmul($price, $item['productInfo']['attrInfo']['weight'], 6);
|
||||
} elseif ($type == 3) {
|
||||
$price = bcmul($price, $item['productInfo']['attrInfo']['volume'], 6);
|
||||
}
|
||||
$price = sprintf("%.2f", $price);
|
||||
$item['postage_price'] = $price;
|
||||
$item['postage_price'] = sprintf("%.2f", $price);
|
||||
}
|
||||
if ($express_rule_number && $express_rule_number < 100) {
|
||||
$storePostageDiscount = $storePostage;
|
||||
|
||||
@ -70,6 +70,12 @@ class StoreOrderCreateServices extends BaseServices
|
||||
} else {
|
||||
$id = $snowflake->setStartTimeStamp(strtotime('2022-01-01') * 1000)->id();
|
||||
}
|
||||
$replace = '';
|
||||
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
||||
for ($i = 0; $i < 3; $i++) {
|
||||
$replace .= $chars[mt_rand(0, strlen($chars) - 1)];
|
||||
}
|
||||
$id = substr_replace($id, $replace, -3);
|
||||
} else {
|
||||
$is_callable = function ($currentTime) {
|
||||
$redis = Cache::store('redis');
|
||||
@ -266,9 +272,9 @@ class StoreOrderCreateServices extends BaseServices
|
||||
});
|
||||
|
||||
// 订单创建成功后置事件
|
||||
event('order.orderCreateAfter', [$order, compact('cartInfo', 'priceData', 'addressId', 'cartIds', 'news'), $uid, $key, $combinationId, $seckillId, $bargainId]);
|
||||
event('OrderCreateAfterListener', [$order, compact('cartInfo', 'priceData', 'addressId', 'cartIds', 'news'), $uid, $key, $combinationId, $seckillId, $bargainId]);
|
||||
// 推送订单
|
||||
event('out.outPush', ['order_create_push', ['order_id' => (int)$order['id']]]);
|
||||
event('OutPushListener', ['order_create_push', ['order_id' => (int)$order['id']]]);
|
||||
return $order;
|
||||
}
|
||||
|
||||
|
||||
@ -364,6 +364,12 @@ class StoreOrderDeliveryServices extends BaseServices
|
||||
* @param int $id
|
||||
* @param array $data
|
||||
* @return bool
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/02/21
|
||||
*/
|
||||
public function splitDelivery(int $id, array $data)
|
||||
{
|
||||
@ -396,10 +402,8 @@ class StoreOrderDeliveryServices extends BaseServices
|
||||
}
|
||||
|
||||
$cart_ids = $data['cart_ids'];
|
||||
/** @var StoreOrderCartInfoServices $storeOrderCartInfoServices */
|
||||
$storeOrderCartInfoServices = app()->make(StoreOrderCartInfoServices::class);
|
||||
unset($data['cart_ids']);
|
||||
$this->transaction(function () use ($id, $cart_ids, $orderInfo, $data, $storeOrderCartInfoServices) {
|
||||
$this->transaction(function () use ($id, $cart_ids, $orderInfo, $data) {
|
||||
/** @var StoreOrderSplitServices $storeOrderSplitServices */
|
||||
$storeOrderSplitServices = app()->make(StoreOrderSplitServices::class);
|
||||
//订单拆单
|
||||
@ -440,11 +444,11 @@ class StoreOrderDeliveryServices extends BaseServices
|
||||
switch ($type) {
|
||||
case 1://快递发货
|
||||
$this->orderDeliverGoods($id, $data, $orderInfo, $storeName);
|
||||
event('notice.notice', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_postage_success']);
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_postage_success']);
|
||||
break;
|
||||
case 2://配送
|
||||
$this->orderDelivery($id, $data, $orderInfo, $storeName);
|
||||
event('notice.notice', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_deliver_success']);
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_deliver_success']);
|
||||
break;
|
||||
case 3://虚拟发货
|
||||
$this->orderVirtualDelivery($id, $data, $orderInfo, $storeName);
|
||||
@ -453,7 +457,7 @@ class StoreOrderDeliveryServices extends BaseServices
|
||||
throw new AdminException(400522);
|
||||
}
|
||||
//到期自动收货
|
||||
event('order.orderDelivery', [$orderInfo, $storeName, $data, $type]);
|
||||
event('OrderDeliveryListener', [$orderInfo, $storeName, $data, $type]);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -278,7 +278,7 @@ class StoreOrderRefundServices extends BaseServices
|
||||
app()->make(StoreOrderInvoiceServices::class)->update(['order_id' => $order['id']], ['is_refund' => 1]);
|
||||
//订单退款记录
|
||||
ProductLogJob::dispatch(['refund', ['uid' => $order['uid'], 'order_id' => $order['id']]]);
|
||||
event('notice.notice', [['data' => $refundData, 'order' => $order], 'order_refund']);
|
||||
event('NoticeListener', [['data' => $refundData, 'order' => $order], 'order_refund']);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -599,7 +599,7 @@ class StoreOrderRefundServices extends BaseServices
|
||||
$capitalFlowServices->setFlow($order, 'refund');
|
||||
}
|
||||
|
||||
event('notice.notice', [['data' => $data, 'order' => $order], 'order_refund']);
|
||||
event('NoticeListener', [['data' => $data, 'order' => $order], 'order_refund']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -693,7 +693,7 @@ class StoreOrderRefundServices extends BaseServices
|
||||
'change_time' => time()
|
||||
]);
|
||||
});
|
||||
event('notice.notice', [['orderInfo' => $orderRefundInfo], 'send_order_refund_no_status']);
|
||||
event('NoticeListener', [['orderInfo' => $orderRefundInfo], 'send_order_refund_no_status']);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -850,7 +850,7 @@ class StoreOrderRefundServices extends BaseServices
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
//提醒推送
|
||||
event('notice.notice', [['order' => $order], 'send_order_apply_refund']);
|
||||
event('NoticeListener', [['order' => $order], 'send_order_apply_refund']);
|
||||
|
||||
return true;
|
||||
|
||||
@ -1012,11 +1012,11 @@ class StoreOrderRefundServices extends BaseServices
|
||||
});
|
||||
$storeOrderCartInfoServices->clearOrderCartInfo($order['id']);
|
||||
//申请退款事件
|
||||
event('order.orderRefundCreateAfter', [$order]);
|
||||
event('OrderRefundCreateAfterListener', [$order]);
|
||||
//提醒推送
|
||||
event('notice.notice', [['order' => $order], 'send_order_apply_refund']);
|
||||
event('NoticeListener', [['order' => $order], 'send_order_apply_refund']);
|
||||
//推送订单
|
||||
event('out.outPush', ['refund_create_push', ['order_id' => (int)$order['id']]]);
|
||||
event('OutPushListener', ['refund_create_push', ['order_id' => (int)$order['id']]]);
|
||||
try {
|
||||
ChannelService::instance()->send('NEW_REFUND_ORDER', ['order_id' => $order['order_id']]);
|
||||
} catch (\Exception $e) {
|
||||
@ -1294,9 +1294,9 @@ class StoreOrderRefundServices extends BaseServices
|
||||
]);
|
||||
|
||||
//售后订单取消后置事件
|
||||
event('order.orderRefundCancelAfter', [$orderRefundInfo]);
|
||||
event('OrderRefundCancelAfterListener', [$orderRefundInfo]);
|
||||
// 推送订单
|
||||
event('out.outPush', ['refund_cancel_push', ['order_id' => (int)$orderRefundInfo['id']]]);
|
||||
event('OutPushListener', ['refund_cancel_push', ['order_id' => (int)$orderRefundInfo['id']]]);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -782,7 +782,7 @@ HTML;
|
||||
if ($res) {
|
||||
$order = $this->dao->getOne(['id' => $id, 'is_del' => 0]);
|
||||
//改价短信提醒
|
||||
event('notice.notice', [['order' => $order, 'pay_price' => $data['pay_price']], 'price_revision']);
|
||||
event('NoticeListener', [['order' => $order, 'pay_price' => $data['pay_price']], 'price_revision']);
|
||||
return $data['order_id'];
|
||||
} else {
|
||||
throw new AdminException(100007);
|
||||
|
||||
@ -85,7 +85,7 @@ class StoreOrderSplitServices extends BaseServices
|
||||
if (empty($cart_ids_arr['other'])) return [$old_order, ['id' => 0]];
|
||||
return $this->transaction(function () use ($id, $cart_ids_arr, $orderInfo, $orderInfoOld, $cartInfo, $storeOrderCreateServices, $storeOrderCartInfoServices, $statusService) {
|
||||
$order = $otherOrder = [];
|
||||
$statusData = $statusService->getColumn(['oid' => $id], '*');
|
||||
$statusData = $statusService->selectList(['oid' => $id])->toArray();
|
||||
//订单实际支付金额
|
||||
$order_pay_price = bcsub((string)bcadd((string)$orderInfo['total_price'], (string)$orderInfo['pay_postage'], 2), (string)bcadd((string)$orderInfo['deduction_price'], (string)$orderInfo['coupon_price'], 2), 2);
|
||||
//有改价
|
||||
@ -106,6 +106,7 @@ class StoreOrderSplitServices extends BaseServices
|
||||
$allData = [];
|
||||
foreach ($statusData as $data) {
|
||||
$data['oid'] = $new_id;
|
||||
$data['change_time'] = strtotime($data['change_time']);
|
||||
$allData[] = $data;
|
||||
}
|
||||
if ($allData) {
|
||||
|
||||
@ -93,13 +93,13 @@ class StoreOrderSuccessServices extends BaseServices
|
||||
}
|
||||
$orderInfo['send_name'] = $orderInfo['real_name'];
|
||||
//订单支付成功后置事件
|
||||
event('order.orderPaySuccess', [$orderInfo]);
|
||||
event('OrderPaySuccessListener', [$orderInfo]);
|
||||
//用户推送消息事件
|
||||
event('notice.notice', [$orderInfo, 'order_pay_success']);
|
||||
event('NoticeListener', [$orderInfo, 'order_pay_success']);
|
||||
//支付成功给客服发送消息
|
||||
event('notice.notice', [$orderInfo, 'admin_pay_success_code']);
|
||||
event('NoticeListener', [$orderInfo, 'admin_pay_success_code']);
|
||||
// 推送订单
|
||||
event('out.outPush', ['order_pay_push', ['order_id' => (int)$orderInfo['id']]]);
|
||||
event('OutPushListener', ['order_pay_push', ['order_id' => (int)$orderInfo['id']]]);
|
||||
$res = $res1 && $resPink;
|
||||
return false !== $res;
|
||||
}
|
||||
|
||||
@ -106,11 +106,11 @@ class StoreOrderTakeServices extends BaseServices
|
||||
if ($res) {
|
||||
try {
|
||||
// 收货成功后置队列
|
||||
event('order.orderTake', [$order, $userInfo, $storeTitle]);
|
||||
event('OrderTakeListener', [$order, $userInfo, $storeTitle]);
|
||||
//收货给用户发送消息
|
||||
event('notice.notice', [['order' => $order, 'storeTitle' => $storeTitle], 'order_take']);
|
||||
event('NoticeListener', [['order' => $order, 'storeTitle' => $storeTitle], 'order_take']);
|
||||
//收货给客服发送消息
|
||||
event('notice.notice', [['order' => $order, 'storeTitle' => $storeTitle], 'send_admin_confirm_take_over']);
|
||||
event('NoticeListener', [['order' => $order, 'storeTitle' => $storeTitle], 'send_admin_confirm_take_over']);
|
||||
} catch (\Throwable $exception) {
|
||||
|
||||
}
|
||||
@ -182,7 +182,7 @@ class StoreOrderTakeServices extends BaseServices
|
||||
/** @var StoreOrderServices $orderServices */
|
||||
$orderServices = app()->make(StoreOrderServices::class);
|
||||
$orderServices->update($order['id'], ['gain_integral' => $give_integral], 'id');
|
||||
event('notice.notice', [['order' => $order, 'storeTitle' => $storeTitle, 'give_integral' => $give_integral, 'integral' => $integral], 'integral_accout']);
|
||||
event('NoticeListener', [['order' => $order, 'storeTitle' => $storeTitle, 'give_integral' => $give_integral, 'integral' => $integral], 'integral_accout']);
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
@ -473,7 +473,7 @@ class StoreOrderTakeServices extends BaseServices
|
||||
$goodsPrice = $brokeragePrice;
|
||||
}
|
||||
//提醒推送
|
||||
event('notice.notice', [['spread_uid' => $spread_uid, 'userType' => $userType, 'brokeragePrice' => $brokeragePrice, 'goodsName' => $goodsName, 'goodsPrice' => $goodsPrice, 'add_time' => $orderInfo['add_time'] ?? time()], 'order_brokerage']);
|
||||
event('NoticeListener', [['spread_uid' => $spread_uid, 'userType' => $userType, 'brokeragePrice' => $brokeragePrice, 'goodsName' => $goodsName, 'goodsPrice' => $goodsPrice, 'add_time' => $orderInfo['add_time'] ?? time()], 'order_brokerage']);
|
||||
}
|
||||
|
||||
|
||||
@ -510,7 +510,7 @@ class StoreOrderTakeServices extends BaseServices
|
||||
}
|
||||
|
||||
//用户升级事件
|
||||
event('user.userLevel', [$order['uid']]);
|
||||
event('UserLevelListener', [$order['uid']]);
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
@ -186,13 +186,18 @@ class OrderPayServices
|
||||
$payKey = md5($order['order_id']);
|
||||
switch ($payType) {
|
||||
case PayServices::ALIAPY_PAY:
|
||||
$jsConfig->invalid = time() + 60;
|
||||
if (request()->isPc()) $jsConfig->invalid = time() + 60;
|
||||
CacheService::set($payKey, ['order_id' => $order['order_id'], 'other_pay_type' => false], 300);
|
||||
break;
|
||||
case PayServices::ALLIN_PAY:
|
||||
if (request()->isWechat()) {
|
||||
$jsConfig['pay_url'] = AllinPay::UNITODER_H5UNIONPAY;
|
||||
}
|
||||
break;
|
||||
case PayServices::WEIXIN_PAY:
|
||||
if (isset($jsConfig['mweb_url'])) {
|
||||
$jsConfig['h5_url'] = $jsConfig['mweb_url'];
|
||||
}
|
||||
}
|
||||
|
||||
return ['jsConfig' => $jsConfig, 'order_id' => $order['order_id'], 'pay_key' => $payKey];
|
||||
|
||||
@ -1393,7 +1393,7 @@ class StoreProductServices extends BaseServices
|
||||
}
|
||||
$data['priceName'] = $this->getPacketPrice($storeInfo, $attrValue, $uid);
|
||||
//用户访问事件
|
||||
event('user.userVisit', [$uid, $id, 'product', $storeInfo['cate_id'], 'view']);
|
||||
event('UserVisitListener', [$uid, $id, 'product', $storeInfo['cate_id'], 'view']);
|
||||
}
|
||||
|
||||
/** @var StoreProductReplyServices $storeProductReplyService */
|
||||
|
||||
@ -126,7 +126,7 @@ class SystemAdminServices extends BaseServices
|
||||
[$menus, $uniqueAuth] = $services->getMenusList($adminInfo->roles, (int)$adminInfo['level']);
|
||||
$remind = Config::get('app.console_remind', false);
|
||||
if ($remind) {
|
||||
[$queue, $timer] = Event::until('admin.login', [$key]);
|
||||
[$queue, $timer] = Event::until('AdminLoginListener', [$key]);
|
||||
}
|
||||
return [
|
||||
'token' => $tokenInfo['token'],
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace app\services\system\timer;
|
||||
namespace app\services\system\crontab;
|
||||
|
||||
use app\dao\system\timer\SystemTimerDao;
|
||||
use app\dao\system\crontab\SystemCrontabDao;
|
||||
use app\services\activity\combination\StorePinkServices;
|
||||
use app\services\activity\live\LiveGoodsServices;
|
||||
use app\services\activity\live\LiveRoomServices;
|
||||
@ -15,7 +15,7 @@ use app\services\system\attachment\SystemAttachmentServices;
|
||||
use crmeb\exceptions\AdminException;
|
||||
use think\facade\Log;
|
||||
|
||||
class SystemTimerServices extends BaseServices
|
||||
class SystemCrontabServices extends BaseServices
|
||||
{
|
||||
/**
|
||||
* 定时任务类型
|
||||
@ -33,7 +33,7 @@ class SystemTimerServices extends BaseServices
|
||||
'clear_poster' => '清除昨日海报',
|
||||
];
|
||||
|
||||
public function __construct(SystemTimerDao $dao)
|
||||
public function __construct(SystemCrontabDao $dao)
|
||||
{
|
||||
$this->dao = $dao;
|
||||
}
|
||||
@ -203,11 +203,9 @@ class SystemTimerServices extends BaseServices
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/02/17
|
||||
*/
|
||||
public function timerRun()
|
||||
public function crontabRun()
|
||||
{
|
||||
$time = time();
|
||||
$date = date('Y-m-d H:i:s', time());
|
||||
$timer_log_open = config("log.timer_log", false);
|
||||
file_put_contents(root_path() . 'runtime/.timer', $time); //检测定时任务是否正常
|
||||
$list = $this->dao->selectList(['is_open' => 1, 'is_del' => 0])->toArray();
|
||||
foreach ($list as $item) {
|
||||
@ -215,43 +213,59 @@ class SystemTimerServices extends BaseServices
|
||||
if ($item['mark'] == 'order_cancel') {
|
||||
//未支付自动取消订单
|
||||
app()->make(StoreOrderServices::class)->orderUnpaidCancel();
|
||||
if($timer_log_open) Log::notice($date . ' 执行未支付自动取消订单');
|
||||
$this->crontabLog(' 执行未支付自动取消订单');
|
||||
} elseif ($item['mark'] == 'pink_expiration') {
|
||||
//拼团到期订单处理
|
||||
app()->make(StorePinkServices::class)->statusPink();
|
||||
if($timer_log_open) Log::notice($date . ' 执行拼团到期订单处理');
|
||||
$this->crontabLog(' 执行拼团到期订单处理');
|
||||
} elseif ($item['mark'] == 'agent_unbind') {
|
||||
//自动解绑上级绑定
|
||||
app()->make(AgentManageServices::class)->removeSpread();
|
||||
if($timer_log_open) Log::notice($date . ' 执行自动解绑上级绑定');
|
||||
$this->crontabLog(' 执行自动解绑上级绑定');
|
||||
} elseif ($item['mark'] == 'live_product_status') {
|
||||
//更新直播商品状态
|
||||
app()->make(LiveGoodsServices::class)->syncGoodStatus();
|
||||
if($timer_log_open) Log::notice($date . ' 执行更新直播商品状态');
|
||||
$this->crontabLog(' 执行更新直播商品状态');
|
||||
} elseif ($item['mark'] == 'live_room_status') {
|
||||
//更新直播间状态
|
||||
app()->make(LiveRoomServices::class)->syncRoomStatus();
|
||||
if($timer_log_open) Log::notice($date . ' 执行更新直播间状态');
|
||||
$this->crontabLog(' 执行更新直播间状态');
|
||||
} elseif ($item['mark'] == 'take_delivery') {
|
||||
//自动收货
|
||||
app()->make(StoreOrderTakeServices::class)->autoTakeOrder();
|
||||
if($timer_log_open) Log::notice($date . ' 执行自动收货');
|
||||
$this->crontabLog(' 执行自动收货');
|
||||
} elseif ($item['mark'] == 'advance_off') {
|
||||
//查询预售到期商品自动下架
|
||||
app()->make(StoreProductServices::class)->downAdvance();
|
||||
if($timer_log_open) Log::notice($date . ' 执行预售到期商品自动下架');
|
||||
$this->crontabLog(' 执行预售到期商品自动下架');
|
||||
} elseif ($item['mark'] == 'product_replay') {
|
||||
//自动好评
|
||||
app()->make(StoreOrderServices::class)->autoComment();
|
||||
if($timer_log_open) Log::notice($date . ' 执行自动好评');
|
||||
$this->crontabLog(' 执行自动好评');
|
||||
} elseif ($item['mark'] == 'clear_poster') {
|
||||
//清除昨日海报
|
||||
app()->make(SystemAttachmentServices::class)->emptyYesterdayAttachment();
|
||||
if($timer_log_open) Log::notice($date . ' 执行清除昨日海报');
|
||||
$this->crontabLog(' 执行清除昨日海报');
|
||||
}
|
||||
//写入本次执行时间和下次执行时间
|
||||
$this->dao->update(['mark' => $item['mark']], ['last_execution_time' => $time, 'next_execution_time' => $this->getTimerCycleTime($item)]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时任务日志
|
||||
* @param $msg
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/02/21
|
||||
*/
|
||||
public function crontabLog($msg)
|
||||
{
|
||||
$timer_log_open = config("log.timer_log", false);
|
||||
if ($timer_log_open) {
|
||||
$date = date('Y-m-d H:i:s', time());
|
||||
Log::info($date . $msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -117,9 +117,9 @@ class LoginServices extends BaseServices
|
||||
$data['division_id'] = $spreadInfo->division_id;
|
||||
$data['staff_id'] = $spreadInfo->staff_id;
|
||||
//绑定用户后置事件
|
||||
event('user.register', [$spreadUid, $userInfo['user_type'], $userInfo['nickname'], $userInfo['uid'], 0]);
|
||||
event('UserRegisterListener', [$spreadUid, $userInfo['user_type'], $userInfo['nickname'], $userInfo['uid'], 0]);
|
||||
//推送消息
|
||||
event('notice.notice', [['spreadUid' => $spreadUid, 'user_type' => $userInfo['user_type'], 'nickname' => $userInfo['nickname']], 'bind_spread_uid']);
|
||||
event('NoticeListener', [['spreadUid' => $spreadUid, 'user_type' => $userInfo['user_type'], 'nickname' => $userInfo['nickname']], 'bind_spread_uid']);
|
||||
}
|
||||
} else {
|
||||
//永久绑定
|
||||
@ -141,9 +141,9 @@ class LoginServices extends BaseServices
|
||||
$data['division_id'] = $spreadInfo->division_id;
|
||||
$data['staff_id'] = $spreadInfo->staff_id;
|
||||
//绑定用户后置事件
|
||||
event('user.register', [$spreadUid, $userInfo['user_type'], $userInfo['nickname'], $userInfo['uid'], 0]);
|
||||
event('UserRegisterListener', [$spreadUid, $userInfo['user_type'], $userInfo['nickname'], $userInfo['uid'], 0]);
|
||||
//推送消息
|
||||
event('notice.notice', [['spreadUid' => $spreadUid, 'user_type' => $userInfo['user_type'], 'nickname' => $userInfo['nickname']], 'bind_spread_uid']);
|
||||
event('NoticeListener', [['spreadUid' => $spreadUid, 'user_type' => $userInfo['user_type'], 'nickname' => $userInfo['nickname']], 'bind_spread_uid']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -234,9 +234,9 @@ class LoginServices extends BaseServices
|
||||
} else {
|
||||
$userServices->rewardNewUser((int)$re->uid);
|
||||
//用户生成后置事件
|
||||
event('user.register', [$spread, $user_type, $data['nickname'], $re->uid, 1]);
|
||||
event('UserRegisterListener', [$spread, $user_type, $data['nickname'], $re->uid, 1]);
|
||||
//推送消息
|
||||
event('notice.notice', [['spreadUid' => $spread, 'user_type' => $user_type, 'nickname' => $data['nickname']], 'bind_spread_uid']);
|
||||
event('NoticeListener', [['spreadUid' => $spread, 'user_type' => $user_type, 'nickname' => $data['nickname']], 'bind_spread_uid']);
|
||||
return $re;
|
||||
}
|
||||
}
|
||||
|
||||
@ -667,7 +667,7 @@ class UserBillServices extends BaseServices
|
||||
//检测会员等级
|
||||
try {
|
||||
//用户升级事件
|
||||
event('user.userLevel', [$spreadUid]);
|
||||
event('UserLevelListener', [$spreadUid]);
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('会员等级升级失败,失败原因:' . $e->getMessage());
|
||||
}
|
||||
@ -750,7 +750,7 @@ class UserBillServices extends BaseServices
|
||||
$where_data = [];
|
||||
$where_data['time'] = $where['time'];
|
||||
if (isset($where['nickname']) && $where['nickname']) {
|
||||
$where_data[] = ['u.account|u.nickname|u.uid|u.phone', 'LIKE', "%$where[nickname]%"];
|
||||
$where_data[] = ['u.nickname|u.uid', 'LIKE', "%$where[nickname]%"];
|
||||
}
|
||||
if (isset($where['price_max']) && isset($where['price_min'])) {
|
||||
if ($where['price_max'] != '' && $where['price_min'] != '') {
|
||||
|
||||
@ -142,7 +142,7 @@ class UserExtractServices extends BaseServices
|
||||
}
|
||||
});
|
||||
|
||||
event('notice.notice', [['uid' => $uid, 'userType' => strtolower($user['user_type']), 'extract_number' => $extract_number, 'nickname' => $user['nickname'], 'message' => $message], 'user_balance_change']);
|
||||
event('NoticeListener', [['uid' => $uid, 'userType' => strtolower($user['user_type']), 'extract_number' => $extract_number, 'nickname' => $user['nickname'], 'message' => $message], 'user_balance_change']);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ class UserExtractServices extends BaseServices
|
||||
$userType = $userServices->value(['uid' => $userExtract['uid']], 'user_type');
|
||||
$nickname = $userServices->value(['uid' => $userExtract['uid']], 'nickname');
|
||||
$phone = $userServices->value(['uid' => $userExtract['uid']], 'phone');
|
||||
event('notice.notice', [['uid' => $userExtract['uid'], 'userType' => strtolower($userType), 'extractNumber' => $extractNumber, 'nickname' => $nickname], 'user_extract']);
|
||||
event('NoticeListener', [['uid' => $userExtract['uid'], 'userType' => strtolower($userType), 'extractNumber' => $extractNumber, 'nickname' => $nickname], 'user_extract']);
|
||||
|
||||
if (!$this->dao->update($id, ['status' => 1])) {
|
||||
throw new AdminException(100007);
|
||||
@ -511,7 +511,7 @@ class UserExtractServices extends BaseServices
|
||||
$systemAdmin = app()->make(SystemAdminServices::class);
|
||||
$systemAdmin->adminNewPush();
|
||||
//消息
|
||||
event('notice.notice', [['nickname' => $user['nickname'], 'money' => $data['money']], 'kefu_send_extract_application']);
|
||||
event('NoticeListener', [['nickname' => $user['nickname'], 'money' => $data['money']], 'kefu_send_extract_application']);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -278,7 +278,7 @@ class UserRechargeServices extends BaseServices
|
||||
$userMoneyServices->income('user_recharge_refund', $UserRecharge['uid'], $number, $now_money, $id);
|
||||
|
||||
//提醒推送
|
||||
event('notice.notice', [['user_type' => strtolower($userInfo['user_type']), 'data' => $data, 'UserRecharge' => $UserRecharge, 'now_money' => $refund_price], 'recharge_order_refund_status']);
|
||||
event('NoticeListener', [['user_type' => strtolower($userInfo['user_type']), 'data' => $data, 'UserRecharge' => $UserRecharge, 'now_money' => $refund_price], 'recharge_order_refund_status']);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -471,7 +471,7 @@ class UserRechargeServices extends BaseServices
|
||||
$capitalFlowServices->setFlow($order, 'recharge');
|
||||
|
||||
//提醒推送
|
||||
event('notice.notice', [['order' => $order, 'now_money' => $now_money], 'recharge_success']);
|
||||
event('NoticeListener', [['order' => $order, 'now_money' => $now_money], 'recharge_success']);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -139,9 +139,9 @@ class UserServices extends BaseServices
|
||||
//新用户注册奖励
|
||||
$this->rewardNewUser((int)$res->uid);
|
||||
//用户生成后置事件
|
||||
event('user.register', [$spreadUid, $userType, $user['nickname'], $res->uid, 1]);
|
||||
event('UserRegisterListener', [$spreadUid, $userType, $user['nickname'], $res->uid, 1]);
|
||||
//推送消息
|
||||
event('notice.notice', [['spreadUid' => $spreadUid, 'user_type' => $userType, 'nickname' => $user['nickname']], 'bind_spread_uid']);
|
||||
event('NoticeListener', [['spreadUid' => $spreadUid, 'user_type' => $userType, 'nickname' => $user['nickname']], 'bind_spread_uid']);
|
||||
return $res;
|
||||
}
|
||||
|
||||
@ -775,7 +775,7 @@ class UserServices extends BaseServices
|
||||
}
|
||||
$res1 = $userMoneyServices->income('system_sub', $user['uid'], $data['money'], $edit['now_money'], $data['adminId'] ?? 0);
|
||||
}
|
||||
event('out.outPush', ['user_update_push', ['uid' => $id, 'type' => 'money', 'value' => $data['money_status'] == 2 ? -floatval($data['money']) : $data['money']]]);
|
||||
event('OutPushListener', ['user_update_push', ['uid' => $id, 'type' => 'money', 'value' => $data['money_status'] == 2 ? -floatval($data['money']) : $data['money']]]);
|
||||
} else {
|
||||
$res1 = true;
|
||||
}
|
||||
@ -796,7 +796,7 @@ class UserServices extends BaseServices
|
||||
$integral_data['mark'] = '系统扣除了' . floatval($data['integration']) . '积分';
|
||||
$res2 = $userBill->expendIntegral($user['uid'], 'system_sub', $integral_data);
|
||||
}
|
||||
event('out.outPush', ['user_update_push', ['uid' => $id, 'type' => 'point', 'value' => $data['integration_status'] == 2 ? -intval($data['integration']) : $data['integration']]]);
|
||||
event('OutPushListener', ['user_update_push', ['uid' => $id, 'type' => 'point', 'value' => $data['integration_status'] == 2 ? -intval($data['integration']) : $data['integration']]]);
|
||||
} else {
|
||||
$res2 = true;
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ class UserSignServices extends BaseServices
|
||||
//检测会员等级
|
||||
try {
|
||||
//用户升级事件
|
||||
event('user.userLevel', [$uid]);
|
||||
event('UserLevelListener', [$uid]);
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('会员等级升级失败,失败原因:' . $e->getMessage());
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ return [
|
||||
// 默认日志记录通道
|
||||
'default' => Env::get('log.channel', 'file'),
|
||||
// 日志记录级别
|
||||
'level' => ['error', 'warning', 'fail', 'success'],
|
||||
'level' => ['error', 'warning', 'fail', 'success', 'info', 'notice'],
|
||||
// 日志类型记录的通道 ['error'=>'email',...]
|
||||
'type_channel' => [],
|
||||
//是否开启业务成功日志
|
||||
|
||||
@ -62,7 +62,7 @@ class Timer extends Command
|
||||
date_default_timezone_set('PRC');
|
||||
$task->count = 1;
|
||||
$task->onWorkerStart = function () {
|
||||
event('Crontab');
|
||||
event('CrontabListener');
|
||||
};
|
||||
$task->runAll();
|
||||
}
|
||||
|
||||
@ -209,7 +209,7 @@ class AliPayService
|
||||
'transaction_id' => $notify->trade_no
|
||||
];
|
||||
|
||||
return Event::until('pay.notify', [$data, PayServices::ALIAPY_PAY]);
|
||||
return Event::until('NotifyListener', [$data, PayServices::ALIAPY_PAY]);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
@ -174,7 +174,7 @@ class WechatService
|
||||
$data['out_trade_no'] = $message['order_info']['trade_no'];
|
||||
$data['transaction_id'] = $message['order_info']['transaction_id'];
|
||||
$data['opneid'] = $message['FromUserName'];
|
||||
if (Event::until('pay.notify', [$data, PayServices::WEIXIN_PAY])) {
|
||||
if (Event::until('NotifyListener', [$data, PayServices::WEIXIN_PAY])) {
|
||||
$response = 'success';
|
||||
} else {
|
||||
$response = 'faild';
|
||||
@ -635,7 +635,7 @@ class WechatService
|
||||
'transaction_id' => $notify->transaction_id
|
||||
];
|
||||
|
||||
return Event::until('pay.notify', [$data, PayServices::WEIXIN_PAY]);
|
||||
return Event::until('NotifyListener', [$data, PayServices::WEIXIN_PAY]);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@ -147,7 +147,7 @@ class AllinPay extends BasePay implements PayInterface
|
||||
'transaction_id' => $notify['trxid']
|
||||
];
|
||||
|
||||
return Event::until('pay.notify', [$data, PayServices::ALLIN_PAY]);
|
||||
return Event::until('NotifyListener', [$data, PayServices::ALLIN_PAY]);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
@ -201,8 +201,6 @@ class V3WechatPay extends BasePay implements PayInterface
|
||||
{
|
||||
return $this->instance->v3pay->handleNotify(function ($notify, $successful) {
|
||||
|
||||
Log::info('支付回调:' . json_encode($notify));
|
||||
|
||||
if ($successful) {
|
||||
$data = [
|
||||
'attach' => $notify->attach,
|
||||
@ -210,7 +208,7 @@ class V3WechatPay extends BasePay implements PayInterface
|
||||
'transaction_id' => $notify->transaction_id
|
||||
];
|
||||
|
||||
return Event::until('pay.notify', [$data, PayServices::WEIXIN_PAY]);
|
||||
return Event::until('NotifyListener', [$data, PayServices::WEIXIN_PAY]);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@ -26510,7 +26510,17 @@ INSERT INTO `eb_lang_code` (`id`, `type_id`, `code`, `remarks`, `lang_explain`,
|
||||
(24967, 7, '500027', '您有未付款订单,订单号为:{:order_id},商品数量有限,请及时付款。', '미결제 주문이 있습니다. 주문 번호: {:order_id}, 상품 수량이 제한되어 있습니다. 제시간에 결제하세요.', 1),
|
||||
(24968, 8, '500027', '您有未付款订单,订单号为:{:order_id},商品数量有限,请及时付款。', 'Танд төлөгдөөгүй захиалга байна, захиалгын дугаар: {:order_id}, барааны тоо хязгаартай тул цаг тухайд нь төлнө үү.', 1),
|
||||
(24969, 9, '500027', '您有未付款订单,订单号为:{:order_id},商品数量有限,请及时付款。', 'คุณมีคำสั่งซื้อที่ยังไม่ได้ชำระเงิน หมายเลขคำสั่งซื้อคือ: {:order_id} สินค้ามีจำนวนจำกัด โปรดชำระเงินให้ตรงเวลา', 1),
|
||||
(24970, 10, '500027', '您有未付款订单,订单号为:{:order_id},商品数量有限,请及时付款。', 'Bạn có đơn hàng chưa thanh toán, số đơn hàng là: {:order_id}, số lượng hàng có hạn, vui lòng thanh toán kịp thời.', 1);
|
||||
(24970, 10, '500027', '您有未付款订单,订单号为:{:order_id},商品数量有限,请及时付款。', 'Bạn có đơn hàng chưa thanh toán, số đơn hàng là: {:order_id}, số lượng hàng có hạn, vui lòng thanh toán kịp thời.', 1),
|
||||
(24971, 1, '500028', '请填写邀请码', '请填写邀请码', 1),
|
||||
(24972, 2, '500028', '请填写邀请码', 'Please fill in the invitation code', 1),
|
||||
(24973, 3, '500028', '请填写邀请码', '請填寫邀請碼', 1),
|
||||
(24974, 4, '500028', '请填写邀请码', 'Merci de remplir le code dinvitation', 1),
|
||||
(24975, 5, '500028', '请填写邀请码', 'Si prega di compilare il codice di invito', 1),
|
||||
(24976, 6, '500028', '请填写邀请码', '招待状を記入してください', 1),
|
||||
(24977, 7, '500028', '请填写邀请码', '초대 코드를 입력하십시오.', 1),
|
||||
(24978, 8, '500028', '请填写邀请码', 'Урилгын кодыг бөглөнө үү', 1),
|
||||
(24979, 9, '500028', '请填写邀请码', 'กรุณากรอกรหัสเชิญ', 1),
|
||||
(24980, 10, '500028', '请填写邀请码', 'Vui lòng điền mã mời', 1);
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
|
||||
@ -108,7 +108,7 @@ class File extends Driver
|
||||
$content = gzuncompress($content);
|
||||
}
|
||||
|
||||
return ['content' => $content, 'expire' => $expire];
|
||||
return ['content' => (string)$content, 'expire' => $expire];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ class Listen extends Command
|
||||
$sleep = $input->getOption('sleep');
|
||||
$tries = $input->getOption('tries');
|
||||
|
||||
$this->app->event->trigger('queue.start', [$output]);
|
||||
$this->app->event->trigger('QueueStartListener', [$output]);
|
||||
|
||||
$this->listener->listen($connection, $queue, $delay, $sleep, $tries, $memory, $timeout);
|
||||
}
|
||||
|
||||
@ -723,7 +723,7 @@ export function upgradeableListApi(params) {
|
||||
*/
|
||||
export function timerIndex(params) {
|
||||
return request({
|
||||
url: `system/timer/list`,
|
||||
url: `system/crontab/list`,
|
||||
params,
|
||||
});
|
||||
}
|
||||
@ -735,7 +735,7 @@ export function timerIndex(params) {
|
||||
*/
|
||||
export function showTimer(id, is_open) {
|
||||
return request({
|
||||
url: `system/timer/set_open/${id}/${is_open}`,
|
||||
url: `system/crontab/set_open/${id}/${is_open}`,
|
||||
});
|
||||
}
|
||||
|
||||
@ -746,7 +746,7 @@ export function showTimer(id, is_open) {
|
||||
*/
|
||||
export function timerInfo(id) {
|
||||
return request({
|
||||
url: `system/timer/info/${id}`,
|
||||
url: `system/crontab/info/${id}`,
|
||||
});
|
||||
}
|
||||
|
||||
@ -757,7 +757,7 @@ export function timerInfo(id) {
|
||||
*/
|
||||
export function saveTimer(data) {
|
||||
return request({
|
||||
url: `system/timer/save`,
|
||||
url: `system/crontab/save`,
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
@ -771,7 +771,7 @@ export function saveTimer(data) {
|
||||
*/
|
||||
export function updateTimer(id, data) {
|
||||
return request({
|
||||
url: `system/timer/update/${id}`,
|
||||
url: `system/crontab/update/${id}`,
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
@ -783,6 +783,6 @@ export function updateTimer(id, data) {
|
||||
*/
|
||||
export function timerTask() {
|
||||
return request({
|
||||
url: `/system/timer/mark`,
|
||||
url: `system/crontab/mark`,
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
.custom-bread-crumb {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
color: #fff !important;
|
||||
.custom-content-con {
|
||||
float: right;
|
||||
height: auto;
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
<div class="header-bar">
|
||||
<sider-trigger :collapsed="collapsed" @on-change="handleCollpasedChange"></sider-trigger>
|
||||
<span class="i-layout-header-trigger" @click="handleReload">
|
||||
<Icon type="ios-refresh" />
|
||||
<Icon type="ios-refresh" color='#fff' />
|
||||
</span>
|
||||
<custom-bread-crumb
|
||||
<!-- <custom-bread-crumb
|
||||
show-icon
|
||||
style="margin-left: 30px"
|
||||
:list="breadCrumbList"
|
||||
:listLast="crumbPast"
|
||||
:collapsed="collapsed"
|
||||
></custom-bread-crumb>
|
||||
></custom-bread-crumb> -->
|
||||
<div class="custom-content-con">
|
||||
<slot></slot>
|
||||
</div>
|
||||
@ -18,7 +18,6 @@
|
||||
</template>
|
||||
<style scoped lang="less">
|
||||
.ivu-icon-ios-refresh {
|
||||
color: #999 !important;
|
||||
font-size: 23px;
|
||||
}
|
||||
.i-layout-header-trigger {
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
height: @size;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
color: #5c6b77;
|
||||
color: #fff;
|
||||
margin-top: 5px;
|
||||
.iconcaidanshouqi {
|
||||
.trans;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<a @click="handleChange" type="text" :class="['sider-trigger-a', collapsed ? 'collapsed' : '']"
|
||||
><i class="iconfont" :class="collapsed ? 'iconcaidanzhankai' : 'iconcaidanshouqi'"></i
|
||||
><i class="iconfont" color='#fff' :class="collapsed ? 'iconcaidanzhankai' : 'iconcaidanshouqi'"></i
|
||||
></a>
|
||||
</template>
|
||||
<script>
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
font-size: 14px !important;
|
||||
font-weight: 400;
|
||||
line-height: 22px;
|
||||
color: #515a6e;
|
||||
color: #fff;
|
||||
}
|
||||
.header-notice .ivu-dropdown-item ~ .ivu-dropdown-item {
|
||||
border-top: 1px solid #e8eaec;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<Dropdown trigger="click" @on-click="selectLang" transfer="true">
|
||||
<Dropdown trigger="click" @on-click="selectLang" :transfer="true">
|
||||
<a href="javascript:void(0)">
|
||||
{{ title }}
|
||||
<Icon :size="18" type="md-arrow-dropdown" />
|
||||
|
||||
@ -9,28 +9,28 @@
|
||||
<a
|
||||
class="drop-menu-a"
|
||||
type="text"
|
||||
:class="{ on: parentItem.path == activeMenuPath }"
|
||||
@mouseover="handleMousemove($event, children)"
|
||||
:style="{ textAlign: !hideTitle ? 'left' : '' }"
|
||||
><common-icon :size="rootIconSize" :color="textColor" :type="parentItem.icon" /><span
|
||||
class="menu-title"
|
||||
><common-icon :color="textColor" :type="parentItem.icon" /><Icon
|
||||
style="float: right"
|
||||
v-if="!hideTitle"
|
||||
>{{ parentItem.title }}</span
|
||||
><Icon style="float: right" v-if="!hideTitle" type="ios-arrow-forward" :size="16"
|
||||
/></a>
|
||||
type="ios-arrow-forward"
|
||||
:size="16"
|
||||
/>
|
||||
<span class="title">{{ parentItem.title }}</span></a
|
||||
>
|
||||
<DropdownMenu ref="dropdown" slot="list">
|
||||
<div v-for="child in children">
|
||||
<template v-if="child.auth === undefined">
|
||||
<collapsed-menu
|
||||
class="child-menu"
|
||||
v-if="showChildren(child)"
|
||||
:icon-size="iconSize"
|
||||
:parent-item="child"
|
||||
:key="`drop-${child.path}`"
|
||||
></collapsed-menu>
|
||||
<DropdownItem v-else :key="`drop-${child.path}`" :name="child.path"
|
||||
><common-icon :size="iconSize" :type="child.icon" /><span class="menu-title">{{
|
||||
child.title
|
||||
}}</span></DropdownItem
|
||||
><common-icon :type="child.icon" /><span class="menu-title">{{ child.title }}1</span></DropdownItem
|
||||
>
|
||||
</template>
|
||||
</div>
|
||||
@ -54,6 +54,10 @@ export default {
|
||||
type: Number,
|
||||
default: 16,
|
||||
},
|
||||
activeMenuPath: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -9,13 +9,13 @@
|
||||
<template v-if="item.children && item.children.length === 1">
|
||||
<side-menu-item v-if="showChildren(item)" :key="`menu${item.path}`" :parent-item="item"></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu${item.children[0].path}`"
|
||||
><common-icon :type="item.children[0].icon || ''" /><span>{{ item.children[0].title }}</span></menu-item
|
||||
><common-icon :type="item.children[0].icon || ''" /><span class="title">{{ item.children[0].title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
<template v-else>
|
||||
<side-menu-item v-if="showChildren(item)" :key="`menu${item.path}`" :parent-item="item"></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu${item.path}`"
|
||||
><common-icon :type="item.icon || ''" /><span>{{ item.title }}</span></menu-item
|
||||
><common-icon :type="item.icon || ''" /><span class="title">{{ item.title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
@ -1,18 +1,17 @@
|
||||
.side-menu-wrapper {
|
||||
user-select: none;
|
||||
.menu-collapsed {
|
||||
padding-top: 10px;
|
||||
|
||||
padding-top: 8px;
|
||||
.ivu-dropdown {
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 4px;
|
||||
.ivu-dropdown-rel a {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
.ivu-tooltip {
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 4px;
|
||||
|
||||
.ivu-tooltip-rel {
|
||||
width: 100%;
|
||||
@ -30,12 +29,15 @@
|
||||
}
|
||||
a.drop-menu-a {
|
||||
display: inline-block;
|
||||
padding: 6px 15px;
|
||||
padding: 10px 15px 10px 10px;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
color: #495060;
|
||||
}
|
||||
}
|
||||
.menu-title {
|
||||
padding-left: 6px;
|
||||
.ivu-select-dropdown{
|
||||
left: 95px !important;
|
||||
}
|
||||
.menu-title {
|
||||
// padding-left: 6px;
|
||||
}
|
||||
|
||||
@ -1,39 +1,77 @@
|
||||
<template>
|
||||
<div class="side-menu-wrapper">
|
||||
<slot></slot>
|
||||
<Menu
|
||||
ref="menu"
|
||||
v-show="!collapsed"
|
||||
:active-name="activeName"
|
||||
:open-names="openMenus"
|
||||
:accordion="accordion"
|
||||
:theme="theme"
|
||||
width="auto"
|
||||
@on-open-change="openNameData"
|
||||
@on-select="handleSelect"
|
||||
>
|
||||
<template v-for="item in menuList">
|
||||
<template v-if="item.children && item.children.length === 1">
|
||||
<side-menu-item v-if="showChildren(item)" :key="`menu-${item.path}`" :parent-item="item"></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu-${item.children[0].path}`"
|
||||
><common-icon :type="item.children[0].icon || ''" /><span>{{ item.children[0].title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
<template v-else>
|
||||
<side-menu-item v-if="showChildren(item)" :key="`menu${item.path}`" :parent-item="item"></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu${item.path}`"
|
||||
><common-icon :type="item.icon || ''" /><span>{{ item.title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
</template>
|
||||
</Menu>
|
||||
<div class="side-menu-box" v-show="!collapsed">
|
||||
<div class="parent-menu">
|
||||
<Menu
|
||||
ref="menu"
|
||||
:active-name="activeMenuPath"
|
||||
:open-names="openedNames"
|
||||
:accordion="accordion"
|
||||
:theme="theme"
|
||||
width="75px"
|
||||
@on-open-change="openNameData"
|
||||
@on-select="handleSelect"
|
||||
>
|
||||
<template v-for="item in menuList">
|
||||
<template>
|
||||
<menu-item :name="item.path" :key="`menu${item.path}`"
|
||||
><common-icon :type="item.icon || ''" /><span class="title">{{ item.title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
</template>
|
||||
</Menu>
|
||||
</div>
|
||||
|
||||
<div class="child-menu" v-if="childList.length">
|
||||
<div class="cat-name">{{ catName }}</div>
|
||||
<Menu
|
||||
ref="childMenu"
|
||||
:active-name="activePath"
|
||||
:open-names="openMenus"
|
||||
:accordion="accordion"
|
||||
:theme="theme"
|
||||
width="140px"
|
||||
@on-open-change="openChildNameData"
|
||||
@on-select="handleChildSelect"
|
||||
>
|
||||
<template v-for="item in childList">
|
||||
<template v-if="item.auth === undefined">
|
||||
<template v-if="item.children && item.children.length >= 1">
|
||||
<side-menu-item
|
||||
v-if="showChildren(item)"
|
||||
:key="`menu${item.path}`"
|
||||
:parent-item="item"
|
||||
></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu${item.path}`"
|
||||
><common-icon :type="item.children[0].icon || ''" /><span class="title">{{
|
||||
item.children[0].title
|
||||
}}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
<template v-else>
|
||||
<side-menu-item
|
||||
v-if="showChildren(item)"
|
||||
:key="`menu${item.path}`"
|
||||
:parent-item="item"
|
||||
></side-menu-item>
|
||||
<menu-item v-else :name="item.path" :key="`menu${item.path}`"
|
||||
><common-icon :type="item.icon || ''" /><span class="title">{{ item.title }}</span></menu-item
|
||||
>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</Menu>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="menu-collapsed" v-show="collapsed" :list="menuList">
|
||||
<template v-for="item in menuList">
|
||||
<collapsed-menu
|
||||
v-if="item.children && item.children.length > 0"
|
||||
@on-click="handleSelect"
|
||||
hide-title
|
||||
:hide-title="true"
|
||||
:activeMenuPath="activeMenuPath"
|
||||
:root-icon-size="rootIconSize"
|
||||
:icon-size="iconSize"
|
||||
:theme="theme"
|
||||
@ -41,12 +79,14 @@
|
||||
:key="`drop-menu-${item.path}`"
|
||||
></collapsed-menu>
|
||||
<Tooltip transfer v-else :content="item.title" placement="right" :key="`drop-menu-${item.path}`">
|
||||
<a @click="handleSelect(getNameOrHref(item, true))" class="drop-menu-a" :style="{ textAlign: 'center' }"
|
||||
><common-icon
|
||||
:size="rootIconSize"
|
||||
:color="textColor"
|
||||
:type="item.icon || (item.children && item.children[0].icon)"
|
||||
/></a>
|
||||
<a
|
||||
@click="handleSelect(item)"
|
||||
class="drop-menu-a"
|
||||
:class="{ on: item.path == activeMenuPath }"
|
||||
:style="{ textAlign: 'center' }"
|
||||
><common-icon :color="textColor" :type="item.icon || (item.children && item.children[0].icon)" />
|
||||
<span class="title">{{ item.title }}</span>
|
||||
</a>
|
||||
</Tooltip>
|
||||
</template>
|
||||
</div>
|
||||
@ -58,10 +98,11 @@ import CollapsedMenu from './collapsed-menu.vue';
|
||||
import { getUnion } from '@/libs/tools';
|
||||
import { mapState } from 'vuex';
|
||||
import mixin from './mixin';
|
||||
import itemMixin from './item-mixin';
|
||||
|
||||
export default {
|
||||
name: 'SideMenu',
|
||||
mixins: [mixin],
|
||||
mixins: [mixin, itemMixin],
|
||||
components: {
|
||||
SideMenuItem,
|
||||
CollapsedMenu,
|
||||
@ -78,7 +119,7 @@ export default {
|
||||
},
|
||||
theme: {
|
||||
type: String,
|
||||
default: 'dark',
|
||||
default: 'light',
|
||||
},
|
||||
rootIconSize: {
|
||||
type: Number,
|
||||
@ -89,10 +130,6 @@ export default {
|
||||
default: 16,
|
||||
},
|
||||
accordion: Boolean,
|
||||
activeName: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
openNames: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
@ -101,12 +138,56 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
openedNames: [],
|
||||
childList: [],
|
||||
activeChildName: '',
|
||||
childOptions: [],
|
||||
activePath: '',
|
||||
activeMenuPath: '',
|
||||
catName: '',
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
handleSelect(name) {
|
||||
this.$emit('on-select', name);
|
||||
// this.$store.commit('menus/getopenMenus', this.openedNames)
|
||||
handleSelect(name, type) {
|
||||
if (!type) {
|
||||
this.$emit('on-select', name);
|
||||
}
|
||||
this.childOptions = [];
|
||||
this.menuList.map((e) => {
|
||||
if (e.path === name) {
|
||||
console.log(e, 'eeee');
|
||||
if (e.children) {
|
||||
this.catName = e.title;
|
||||
this.activeMenuPath = e.path;
|
||||
this.childList = e.children || [];
|
||||
this.activeChildName = e.children[0].path;
|
||||
this.childOptions = [e.children[0].path];
|
||||
this.$store.commit('menus/childMenuList', this.childList);
|
||||
} else {
|
||||
this.childList = [];
|
||||
this.$store.commit('menus/childMenuList', []);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
handleChildSelect(name) {
|
||||
this.turnToPage(name);
|
||||
},
|
||||
turnToPage(route, all) {
|
||||
let { path, name, params, query } = {};
|
||||
if (typeof route === 'string' && !all) path = route;
|
||||
else if (typeof route === 'string' && all) name = route;
|
||||
else {
|
||||
path = route.path;
|
||||
name = route.name;
|
||||
params = route.params;
|
||||
query = route.query;
|
||||
}
|
||||
this.$router.push({
|
||||
path,
|
||||
name,
|
||||
params,
|
||||
query,
|
||||
});
|
||||
},
|
||||
getOpenedNamesByActiveName() {
|
||||
return this.$route.matched.map((item) => item.path).filter((item) => item !== name);
|
||||
@ -119,6 +200,17 @@ export default {
|
||||
// this.openedNames = n
|
||||
// this.$store.commit('menus/getopenMenus', n)
|
||||
},
|
||||
openChildNameData(e) {
|
||||
console.log(e);
|
||||
},
|
||||
handleUpdateMenuState() {
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs.childMenu) {
|
||||
this.$refs.childMenu.updateActiveName();
|
||||
if (this.accordion) this.$refs.childMenu.updateOpened();
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState('menus', ['openMenus']),
|
||||
@ -130,18 +222,32 @@ export default {
|
||||
activeName(name) {
|
||||
if (this.accordion) this.openedNames = this.getOpenedNamesByActiveName();
|
||||
else this.openedNames = getUnion(this.openedNames, this.getOpenedNamesByActiveName());
|
||||
// this.handleSelect(this.activeName);
|
||||
},
|
||||
openNames(newNames) {
|
||||
this.openedNames = newNames;
|
||||
},
|
||||
openedNames() {
|
||||
this.$nextTick(() => {
|
||||
// this.$refs.menu.updateOpened()
|
||||
this.$refs.menu.updateOpened();
|
||||
});
|
||||
},
|
||||
$route(newRoute) {},
|
||||
$route: {
|
||||
handler(newRoute) {
|
||||
console.log(newRoute, 'newRoutenewRoute');
|
||||
this.activePath = newRoute.path;
|
||||
this.activeMenuPath = newRoute.matched[0].path;
|
||||
this.handleUpdateMenuState();
|
||||
console.log(activeMenuPath, 'activeMenuPath');
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.openedNames = getUnion(this.openedNames, this.getOpenedNamesByActiveName());
|
||||
this.handleSelect(this.openedNames[0], 'one');
|
||||
this.activeMenuPath = this.openedNames[0];
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@ -149,8 +255,9 @@ export default {
|
||||
@import './side-menu.less';
|
||||
.ivu-menu {
|
||||
.side-menu-wrapper a.drop-menu-a {
|
||||
padding: 15px !important;
|
||||
padding: 1px !important;
|
||||
}
|
||||
|
||||
.ivu-select-dropdown.ivu-dropdown-transfer {
|
||||
background: rgb(0, 21, 41) !important;
|
||||
width: 170px !important;
|
||||
@ -191,6 +298,8 @@ export default {
|
||||
> .drop-menu-a
|
||||
> .menu-title {
|
||||
color: #fff !important;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
}
|
||||
.ivu-select-dropdown.ivu-dropdown-transfer
|
||||
.collased-menu-dropdown:hover
|
||||
@ -200,4 +309,124 @@ export default {
|
||||
color: #fff !important;
|
||||
}
|
||||
}
|
||||
.side-menu-wrapper a.drop-menu-a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.side-menu-box {
|
||||
display: flex;
|
||||
.drop-menu-a {
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 10px 10px;
|
||||
margin-bottom: 4px;
|
||||
.ivu-icon {
|
||||
font-size: 14px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
.parent-menu {
|
||||
z-index: 99;
|
||||
padding: 0 8px;
|
||||
box-shadow: 2px 0px 4px 0px rgba(0, 0, 0, 0.06);
|
||||
height: calc(~'100vh - 50px');
|
||||
.ivu-menu-item-selected {
|
||||
background-color: #1890ff !important;
|
||||
color: #fff !important;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.ivu-menu-vertical .ivu-menu-item {
|
||||
padding: 10px 10px;
|
||||
margin-bottom: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.title {
|
||||
line-height: 14px;
|
||||
}
|
||||
}
|
||||
.ivu-menu-vertical .ivu-menu-item:first-child {
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
.child-menu {
|
||||
z-index: 88;
|
||||
.ivu-menu-vertical .ivu-menu-item {
|
||||
padding: 12px 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.title {
|
||||
line-height: 14px;
|
||||
}
|
||||
}
|
||||
.ivu-menu-submenu {
|
||||
.ivu-menu-item {
|
||||
padding-left: 16px !important;
|
||||
}
|
||||
.ivu-menu-submenu {
|
||||
.ivu-menu-submenu-title {
|
||||
padding-left: 16px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.ivu-menu-vertical .ivu-menu-submenu-title {
|
||||
padding: 12px 10px;
|
||||
line-height: 16px;
|
||||
}
|
||||
.cat-name {
|
||||
font-size: 16px;
|
||||
line-height: 16px;
|
||||
font-weight: 600;
|
||||
color: #303133;
|
||||
padding: 18px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
}
|
||||
> .ivu-menu {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.ivu-menu-vertical.ivu-menu-light:after {
|
||||
width: 0px !important;
|
||||
}
|
||||
.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):after {
|
||||
width: 0px;
|
||||
}
|
||||
}
|
||||
.menu-collapsed {
|
||||
padding: 0 8px;
|
||||
.drop-menu-a.on {
|
||||
background-color: #1890ff !important;
|
||||
color: #fff !important;
|
||||
border-radius: 4px;
|
||||
.ivu-icon {
|
||||
color: #fff !important;
|
||||
}
|
||||
}
|
||||
.drop-menu-a {
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 10px 11px;
|
||||
margin-bottom: 4px;
|
||||
flex-wrap: nowrap;
|
||||
.ivu-icon {
|
||||
font-size: 14px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
.title {
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
.drop-menu-a {
|
||||
padding: 0;
|
||||
}
|
||||
.collased-menu-dropdown * {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
.main {
|
||||
.logo-con {
|
||||
height: 64px;
|
||||
padding: 10px;
|
||||
height: 50px;
|
||||
img {
|
||||
height: 44px;
|
||||
width: auto;
|
||||
@ -23,7 +22,7 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
.main-content-con {
|
||||
height: ~'calc(100% - 60px)';
|
||||
height: ~'calc(100% - 70px)';
|
||||
overflow: hidden;
|
||||
}
|
||||
.tag-nav-wrapper {
|
||||
@ -32,14 +31,14 @@
|
||||
background: #f0f0f0;
|
||||
}
|
||||
.content-wrapper {
|
||||
padding: 18px;
|
||||
padding: 16px;
|
||||
height: ~'calc(100% - 80px)';
|
||||
overflow: auto;
|
||||
}
|
||||
.left-sider {
|
||||
.ivu-layout-sider-children {
|
||||
overflow-y: scroll;
|
||||
margin-right: -18px;
|
||||
margin-right: -16px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,45 +1,45 @@
|
||||
<template>
|
||||
<Layout style="height: 100%" class="main">
|
||||
<Sider
|
||||
hide-trigger
|
||||
collapsible
|
||||
:width="200"
|
||||
:collapsed-width="isMobile ? 0 : 80"
|
||||
v-model="collapsed"
|
||||
class="left-sider"
|
||||
:style="{ overflow: 'hidden' }"
|
||||
v-if="!headMenuNoShow"
|
||||
>
|
||||
<side-menu
|
||||
accordion
|
||||
ref="sideMenu"
|
||||
:active-name="$route.path"
|
||||
:collapsed="collapsed"
|
||||
@on-select="turnToPage"
|
||||
:menu-list="menuList"
|
||||
>
|
||||
<!-- 需要放在菜单上面的内容,如Logo,写在side-menu标签内部,如下 -->
|
||||
<div class="logo-con">
|
||||
<img v-show="!collapsed" :src="maxLogo" key="max-logo" />
|
||||
<img v-show="collapsed" :src="minLogo" key="min-logo" />
|
||||
</div>
|
||||
</side-menu>
|
||||
</Sider>
|
||||
<Header class="header-con" v-if="!headMenuNoShow">
|
||||
<div class="logo-con">
|
||||
<img v-show="!collapsed" :src="maxLogo" key="max-logo" />
|
||||
<img v-show="collapsed" :src="minLogo" key="min-logo" />
|
||||
</div>
|
||||
<header-bar :collapsed="collapsed" @on-coll-change="handleCollapsedChange" @on-reload="handleReload">
|
||||
<user :message-unread-count="unreadCount" :user-avatar="userAvatar" />
|
||||
<language v-if="$config.useI18n" @on-lang-change="setLocal" style="margin-right: 10px" :lang="local" />
|
||||
<header-notice></header-notice>
|
||||
<fullscreen v-model="isFullscreen" style="margin-right: 10px" />
|
||||
<error-store
|
||||
v-if="$config.plugin['error-store'] && $config.plugin['error-store'].showInHeader"
|
||||
:has-read="hasReadErrorPage"
|
||||
:count="errorCount"
|
||||
></error-store>
|
||||
<header-search></header-search>
|
||||
</header-bar>
|
||||
</Header>
|
||||
<Layout>
|
||||
<Header class="header-con" v-if="!headMenuNoShow">
|
||||
<header-bar :collapsed="collapsed" @on-coll-change="handleCollapsedChange" @on-reload="handleReload">
|
||||
<user :message-unread-count="unreadCount" :user-avatar="userAvatar" />
|
||||
<language v-if="$config.useI18n" @on-lang-change="setLocal" style="margin-right: 10px" :lang="local" />
|
||||
<header-notice></header-notice>
|
||||
<fullscreen v-model="isFullscreen" style="margin-right: 10px" />
|
||||
<error-store
|
||||
v-if="$config.plugin['error-store'] && $config.plugin['error-store'].showInHeader"
|
||||
:has-read="hasReadErrorPage"
|
||||
:count="errorCount"
|
||||
></error-store>
|
||||
<header-search></header-search>
|
||||
</header-bar>
|
||||
</Header>
|
||||
<Sider
|
||||
hide-trigger
|
||||
collapsible
|
||||
:width="childMenuList.length ? 220 : 90"
|
||||
:collapsed-width="isMobile ? 0 : 90"
|
||||
v-model="collapsed"
|
||||
class="left-sider"
|
||||
:style="{ overflow: 'hidden' }"
|
||||
v-if="!headMenuNoShow"
|
||||
>
|
||||
<side-menu
|
||||
accordion
|
||||
ref="sideMenu"
|
||||
:active-name="$route.path"
|
||||
:collapsed="collapsed"
|
||||
@on-select="turnToPage"
|
||||
:menu-list="menuList"
|
||||
>
|
||||
<!-- 需要放在菜单上面的内容,如Logo,写在side-menu标签内部,如下 -->
|
||||
</side-menu>
|
||||
</Sider>
|
||||
<Content class="main-content-con">
|
||||
<Layout class="main-layout-con">
|
||||
<div class="tag-nav-wrapper" v-if="!headMenuNoShow">
|
||||
@ -115,6 +115,7 @@ export default {
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState('menus', ['childMenuList']),
|
||||
...mapGetters(['errorCount']),
|
||||
...mapState('media', ['isMobile']),
|
||||
tagNavList() {
|
||||
@ -281,10 +282,13 @@ export default {
|
||||
</script>
|
||||
<style lang="less">
|
||||
.main .header-con {
|
||||
padding: 0 20px 0 0px;
|
||||
padding: 0 0px 0 0px;
|
||||
display: flex;
|
||||
background: linear-gradient(270deg, #1570ef 0%, #1570ef 100%);
|
||||
}
|
||||
.main .logo-con img {
|
||||
height: 50px;
|
||||
transition: all 1s;
|
||||
}
|
||||
.main .tag-nav-wrapper {
|
||||
// height: 10px;
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
|
||||
@menu-dark-title: #001529;
|
||||
@menu-dark-active-bg: #000c17;
|
||||
@layout-sider-background: #001529;
|
||||
@layout-sider-background: #fff;
|
||||
|
||||
@ -231,7 +231,7 @@ export default {
|
||||
if (data.timer === false) {
|
||||
this.$Notice.warning({
|
||||
title: '温馨提示',
|
||||
desc: '您的【定时任务】未开启,没有开启会导致自动收货、未支付自动取消订单、订单自动好评、拼团到期退款等任务无法正常执行。请尽快执行命令开启!!<a href="https://doc.crmeb.com/single/crmeb_v4/6962" target="_blank">点击查看开启方法</a>',
|
||||
desc: '您的【定时任务】未开启,没有开启会导致自动收货、未支付自动取消订单、订单自动好评、拼团到期退款等任务无法正常执行。请尽快执行命令开启!!<a href="https://doc.crmeb.com/single/crmeb_v4/7211" target="_blank">点击查看开启方法</a>',
|
||||
duration: 30,
|
||||
});
|
||||
}
|
||||
@ -239,10 +239,10 @@ export default {
|
||||
this.checkSocket();
|
||||
} catch (e) {}
|
||||
|
||||
return this.$router.replace({ path: this.$routeProStr + '/home/' || this.$routeProStr + '/' });
|
||||
return this.$router.replace({ path: res.data.menus[0].path || this.$routeProStr + '/' });
|
||||
})
|
||||
.catch((res) => {
|
||||
msg()
|
||||
msg();
|
||||
let data = res === undefined ? {} : res;
|
||||
this.$Message.error(data.msg || '登录失败');
|
||||
this.login_captcha = res.data.login_captcha;
|
||||
|
||||
@ -74,7 +74,7 @@
|
||||
<a @click="promoters(row, 'man')">推广人</a>
|
||||
<Divider type="vertical" />
|
||||
<template>
|
||||
<Dropdown @on-click="changeMenu(row, $event, index)" transfer="true">
|
||||
<Dropdown @on-click="changeMenu(row, $event, index)" :transfer="true">
|
||||
<a href="javascript:void(0)">
|
||||
更多
|
||||
<Icon type="ios-arrow-down"></Icon>
|
||||
|
||||
@ -109,7 +109,7 @@
|
||||
<Divider type="vertical" />
|
||||
<a @click="del(row, '删除二维码', index)">删除</a>
|
||||
<Divider type="vertical" />
|
||||
<Dropdown @on-click="changeMenu(row, $event)" transfer="true">
|
||||
<Dropdown @on-click="changeMenu(row, $event)" :transfer="true">
|
||||
<a href="javascript:void(0)"
|
||||
>更多
|
||||
<Icon type="ios-arrow-down"></Icon>
|
||||
|
||||
@ -162,7 +162,7 @@
|
||||
<!-- "-->
|
||||
<!-- />-->
|
||||
<template>
|
||||
<Dropdown @on-click="changeMenu(row, $event)" transfer="true">
|
||||
<Dropdown @on-click="changeMenu(row, $event)" :transfer="true">
|
||||
<a href="javascript:void(0)"
|
||||
>更多
|
||||
<Icon type="ios-arrow-down"></Icon>
|
||||
|
||||
@ -1944,6 +1944,7 @@ export default {
|
||||
this.formValidate.spec_type = this.spec_type;
|
||||
this.$Message.error(res.msg);
|
||||
});
|
||||
} else {
|
||||
if (this.formValidate.spec_type == 1) {
|
||||
this.generate(1);
|
||||
}
|
||||
|
||||
@ -288,12 +288,12 @@ export default {
|
||||
this.menusList = data.menus;
|
||||
this.menusList.map((item, index) => {
|
||||
if (item.title === '主页') {
|
||||
item.checked = true;
|
||||
item.disableCheckbox = true;
|
||||
// item.checked = true;
|
||||
// item.disableCheckbox = true;
|
||||
if (item.children.length) {
|
||||
item.children.map((v) => {
|
||||
v.checked = true;
|
||||
v.disableCheckbox = true;
|
||||
// v.checked = true;
|
||||
// v.disableCheckbox = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ const meta = {
|
||||
const pre = 'home_';
|
||||
|
||||
export default {
|
||||
path: routePre + '/',
|
||||
path: routePre + '/home',
|
||||
name: 'home',
|
||||
header: 'home',
|
||||
redirect: {
|
||||
|
||||
@ -25,6 +25,7 @@ export default {
|
||||
state: {
|
||||
menusName: getMenusName(),
|
||||
openMenus: [],
|
||||
childMenuList: [],
|
||||
},
|
||||
mutations: {
|
||||
getmenusNav(state, menuList) {
|
||||
@ -36,6 +37,9 @@ export default {
|
||||
setopenMenus(state, openList) {
|
||||
state.openMenus = openList;
|
||||
},
|
||||
childMenuList(state, list) {
|
||||
state.childMenuList = list;
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
getMenusNavList({ commit }) {
|
||||
|
||||
@ -225,7 +225,7 @@ body {
|
||||
}
|
||||
|
||||
.ivu-icon-ios-refresh {
|
||||
color: #1890ff !important;
|
||||
color: #1890ff;
|
||||
}
|
||||
|
||||
.product_tabs .ivu-tabs-bar {
|
||||
|
||||
@ -168,7 +168,8 @@
|
||||
let userData = await getUserInfo()
|
||||
this.uid = userData.data.uid
|
||||
let goods_img, mp_code, resData, arr, mpUrl
|
||||
// #ifdef MP
|
||||
// #ifdef MP
|
||||
|
||||
// #endif
|
||||
uni.showLoading({
|
||||
title: that.$t(`海报生成中`),
|
||||
@ -198,7 +199,8 @@
|
||||
let imgData = await this.imgToBase(resData.image, resData.url)
|
||||
arr = [this.posterBag, imgData.image, imgData.code || this.codeSrc]
|
||||
// #endif
|
||||
// #ifdef MP
|
||||
// #ifdef MP
|
||||
resData.image = that.setDomain(resData.image);
|
||||
mpUrl = resData.url ? await this.downloadFilestoreImage(resData.url) : await this
|
||||
.downloadFilestoreImage(this.mpUrl)
|
||||
arr = [this.posterBag, await this.downloadFilestoreImage(resData.image), mpUrl]
|
||||
@ -235,7 +237,7 @@
|
||||
})
|
||||
},
|
||||
//替换安全域名
|
||||
setDomain: function(image, url) {
|
||||
setDomain: function(url) {
|
||||
url = url ? url.toString() : '';
|
||||
//本地调试打开,生产请注销
|
||||
if (url.indexOf('https://') > -1) return url;
|
||||
|
||||
@ -177,9 +177,6 @@
|
||||
},
|
||||
searchBut() {
|
||||
let that = this;
|
||||
if (!that.where.keywords.trim()) return this.$util.Tips({
|
||||
title: that.$t(`请输入要搜索的商品`)
|
||||
});
|
||||
that.focus = false;
|
||||
that.where.page = 1;
|
||||
that.loading = false;
|
||||
|
||||
@ -392,13 +392,13 @@
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
background-color: rgb(197, 150, 63, 0.5);
|
||||
background-color: rgb(17, 200, 26, 0.5);
|
||||
line-height: 30px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.suc-bg {
|
||||
background-color: rgb(197, 150, 63, 0.5);
|
||||
background-color: rgb(17, 200, 26, 0.5);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7f5CB85C, endcolorstr=#7f5CB85C);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -921,13 +921,14 @@
|
||||
font-size: 28rpx;
|
||||
color: #333333;
|
||||
height: 85rpx;
|
||||
font-weight: 800;
|
||||
font-weight: 800;
|
||||
line-height: 40rpx;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
text-align: left !important;
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.broadcast_details_pic {
|
||||
|
||||
@ -518,11 +518,17 @@
|
||||
|
||||
case 'ALIPAY_PAY':
|
||||
//#ifdef H5
|
||||
uni.hideLoading();
|
||||
that.formContent = res.data.result.jsConfig;
|
||||
that.$nextTick(() => {
|
||||
document.getElementById('alipaysubmit').submit();
|
||||
})
|
||||
uni.hideLoading();
|
||||
that.$util.Tips({
|
||||
title: that.$t(`等待支付中`)
|
||||
}, {
|
||||
tab: 4,
|
||||
url: goPages + '&status=0'
|
||||
});
|
||||
that.formContent = res.data.result.jsConfig;
|
||||
setTimeout(() => {
|
||||
document.getElementById('alipaysubmit').submit();
|
||||
}, 1500);
|
||||
//#endif
|
||||
// #ifdef MP
|
||||
uni.navigateTo({
|
||||
|
||||
@ -392,13 +392,13 @@
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
background-color: rgb(197, 150, 63, 0.5);;
|
||||
background-color: rgb(17, 200, 26, 0.5);;
|
||||
line-height: 30px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.suc-bg {
|
||||
background-color: rgb(197, 150, 63, 0.5);;
|
||||
background-color: rgb(17, 200, 26, 0.5);;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7f5CB85C, endcolorstr=#7f5CB85C);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -300,6 +300,7 @@
|
||||
|
||||
.collectionGoods .item .text {
|
||||
height: 130rpx;
|
||||
flex: 1;
|
||||
font-size: 28rpx;
|
||||
color: #282828;
|
||||
}
|
||||
|
||||
@ -522,7 +522,8 @@
|
||||
}
|
||||
},
|
||||
})
|
||||
} else {
|
||||
} else {
|
||||
if(this.numberPic == '') this.numberPic = this.money;
|
||||
this.pay()
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user