Merge branch 'v4.7.0dev' of https://gitee.com/ZhongBangKeJi/CRMEB into v4.7.0dev

This commit is contained in:
liaofei 2023-02-22 15:49:54 +08:00
commit 36de16b949
97 changed files with 672 additions and 390 deletions

View File

@ -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'] ?? []));

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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,

View File

@ -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());
}

View File

@ -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);
}

View File

@ -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);

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

View File

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

View File

@ -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],//定时任务事件
],
];

View File

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

View File

@ -17,7 +17,7 @@ namespace app\listener\admin;
* Class AdminLogin
* @package app\listener\admin
*/
class AdminLogin
class AdminLoginListener
{
public function handle($event)

View File

@ -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
* | | | | | |

View File

@ -19,7 +19,7 @@ use think\Response;
* Class Create
* @package app\listener\http
*/
class HttpEnd
class HttpEndListener
{
public function handle(Response $response):void
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -18,10 +18,10 @@ use crmeb\utils\Hook;
/**
* 支付异步回调
* Class Notify
* Class NotifyListener
* @package app\listener\pay
*/
class Notify
class NotifyListener
{
/**
* @param $event

View File

@ -16,7 +16,7 @@ namespace app\listener\queue;
use think\console\Output;
class QueueStart
class QueueStartListener
{
public function handle(Output $output)

View File

@ -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
{

View File

@ -13,10 +13,10 @@ use crmeb\interfaces\ListenerInterface;
/**
* 注册完成后置事件
* Class Register
* Class RegisterListener
* @package app\listener\user
*/
class Register implements ListenerInterface
class RegisterListener implements ListenerInterface
{
/**
* 注册完成后置事件

View File

@ -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
{

View File

@ -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
{

View File

@ -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
{

View File

@ -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;

View File

@ -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;

View File

@ -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];

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

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

View File

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

View File

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

View File

@ -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);

View File

@ -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) {

View File

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

View File

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

View File

@ -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];

View File

@ -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 */

View File

@ -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'],

View File

@ -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);
}
}
}

View File

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

View File

@ -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'] != '') {

View File

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

View File

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

View File

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

View File

@ -93,7 +93,7 @@ class UserSignServices extends BaseServices
//检测会员等级
try {
//用户升级事件
event('user.userLevel', [$uid]);
event('UserLevelListener', [$uid]);
} catch (\Throwable $e) {
Log::error('会员等级升级失败,失败原因:' . $e->getMessage());
}

View File

@ -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' => [],
//是否开启业务成功日志

View File

@ -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();
}

View File

@ -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;
});

View File

@ -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;

View File

@ -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;
});

View File

@ -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;

View File

@ -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);
-- --------------------------------------------------------

View File

@ -108,7 +108,7 @@ class File extends Driver
$content = gzuncompress($content);
}
return ['content' => $content, 'expire' => $expire];
return ['content' => (string)$content, 'expire' => $expire];
}
}

View File

@ -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);
}

View File

@ -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`,
});
}

View File

@ -1,4 +1,5 @@
.custom-bread-crumb {
display: inline-block;
vertical-align: top;
color: #fff;
}

View File

@ -2,6 +2,7 @@
width: 100%;
height: 100%;
position: relative;
color: #fff !important;
.custom-content-con {
float: right;
height: auto;

View File

@ -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 {

View File

@ -8,7 +8,7 @@
height: @size;
display: inline-block;
text-align: center;
color: #5c6b77;
color: #fff;
margin-top: 5px;
.iconcaidanshouqi {
.trans;

View File

@ -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>

View File

@ -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;

View File

@ -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" />

View File

@ -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 {

View File

@ -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>

View File

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

View File

@ -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>

View File

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

View File

@ -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;

View File

@ -2,4 +2,4 @@
@menu-dark-title: #001529;
@menu-dark-active-bg: #000c17;
@layout-sider-background: #001529;
@layout-sider-background: #fff;

View File

@ -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;

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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);
}

View File

@ -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;
});
}
}

View File

@ -42,7 +42,7 @@ const meta = {
const pre = 'home_';
export default {
path: routePre + '/',
path: routePre + '/home',
name: 'home',
header: 'home',
redirect: {

View File

@ -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 }) {

View File

@ -225,7 +225,7 @@ body {
}
.ivu-icon-ios-refresh {
color: #1890ff !important;
color: #1890ff;
}
.product_tabs .ivu-tabs-bar {

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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 {

View File

@ -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({

View File

@ -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

View File

@ -300,6 +300,7 @@
.collectionGoods .item .text {
height: 130rpx;
flex: 1;
font-size: 28rpx;
color: #282828;
}

View File

@ -522,7 +522,8 @@
}
},
})
} else {
} else {
if(this.numberPic == '') this.numberPic = this.money;
this.pay()
}
}