Explorar el Código

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

liaofei hace 2 años
padre
commit
36de16b949
Se han modificado 97 ficheros con 671 adiciones y 389 borrados
  1. 1 0
      crmeb/app/adminapi/controller/v1/export/ExportExcel.php
  2. 1 1
      crmeb/app/adminapi/controller/v1/order/RefundOrder.php
  3. 1 1
      crmeb/app/adminapi/controller/v1/order/StoreOrder.php
  4. 3 3
      crmeb/app/adminapi/controller/v1/system/SystemTimer.php
  5. 6 6
      crmeb/app/adminapi/route/system.php
  6. 11 5
      crmeb/app/api/controller/v1/TimerController.php
  7. 1 0
      crmeb/app/api/controller/v1/user/DivisionController.php
  8. 11 11
      crmeb/app/api/route/v1.php
  9. 18 0
      crmeb/app/dao/system/crontab/SystemCrontabDao.php
  10. 0 18
      crmeb/app/dao/system/timer/SystemTimerDao.php
  11. 18 18
      crmeb/app/event.php
  12. 1 1
      crmeb/app/jobs/UnpaidOrderSend.php
  13. 1 1
      crmeb/app/listener/admin/AdminLogin.php
  14. 20 38
      crmeb/app/listener/crontab/SystemCrontab.php
  15. 1 1
      crmeb/app/listener/http/HttpEnd.php
  16. 1 1
      crmeb/app/listener/notice/Notice.php
  17. 2 2
      crmeb/app/listener/order/OrderCreateAfter.php
  18. 2 2
      crmeb/app/listener/order/OrderDelivery.php
  19. 2 2
      crmeb/app/listener/order/OrderPaySuccess.php
  20. 2 2
      crmeb/app/listener/order/OrderRefundCancelAfter.php
  21. 1 1
      crmeb/app/listener/order/OrderRefundCreateAfter.php
  22. 2 2
      crmeb/app/listener/order/OrderTake.php
  23. 1 1
      crmeb/app/listener/out/OutPush.php
  24. 2 2
      crmeb/app/listener/pay/Notify.php
  25. 1 1
      crmeb/app/listener/queue/QueueStart.php
  26. 2 2
      crmeb/app/listener/user/Login.php
  27. 2 2
      crmeb/app/listener/user/Register.php
  28. 2 2
      crmeb/app/listener/user/UserLevel.php
  29. 2 2
      crmeb/app/listener/user/UserVisit.php
  30. 2 2
      crmeb/app/listener/wechat/Auth.php
  31. 2 2
      crmeb/app/model/system/timer/SystemTimer.php
  32. 1 1
      crmeb/app/services/activity/advance/StoreAdvanceServices.php
  33. 2 2
      crmeb/app/services/activity/bargain/StoreBargainServices.php
  34. 1 1
      crmeb/app/services/activity/combination/StoreCombinationServices.php
  35. 5 5
      crmeb/app/services/activity/combination/StorePinkServices.php
  36. 1 1
      crmeb/app/services/activity/seckill/StoreSeckillServices.php
  37. 14 12
      crmeb/app/services/order/StoreOrderComputedServices.php
  38. 8 2
      crmeb/app/services/order/StoreOrderCreateServices.php
  39. 10 6
      crmeb/app/services/order/StoreOrderDeliveryServices.php
  40. 9 9
      crmeb/app/services/order/StoreOrderRefundServices.php
  41. 1 1
      crmeb/app/services/order/StoreOrderServices.php
  42. 2 1
      crmeb/app/services/order/StoreOrderSplitServices.php
  43. 4 4
      crmeb/app/services/order/StoreOrderSuccessServices.php
  44. 6 6
      crmeb/app/services/order/StoreOrderTakeServices.php
  45. 6 1
      crmeb/app/services/pay/OrderPayServices.php
  46. 1 1
      crmeb/app/services/product/product/StoreProductServices.php
  47. 1 1
      crmeb/app/services/system/admin/SystemAdminServices.php
  48. 30 16
      crmeb/app/services/system/timer/SystemTimerServices.php
  49. 6 6
      crmeb/app/services/user/LoginServices.php
  50. 2 2
      crmeb/app/services/user/UserBillServices.php
  51. 3 3
      crmeb/app/services/user/UserExtractServices.php
  52. 2 2
      crmeb/app/services/user/UserRechargeServices.php
  53. 4 4
      crmeb/app/services/user/UserServices.php
  54. 1 1
      crmeb/app/services/user/UserSignServices.php
  55. 1 1
      crmeb/config/log.php
  56. 1 1
      crmeb/crmeb/command/Timer.php
  57. 1 1
      crmeb/crmeb/services/AliPayService.php
  58. 2 2
      crmeb/crmeb/services/app/WechatService.php
  59. 1 1
      crmeb/crmeb/services/pay/storage/AllinPay.php
  60. 1 3
      crmeb/crmeb/services/pay/storage/V3WechatPay.php
  61. 11 1
      crmeb/public/install/crmeb.sql
  62. 1 1
      crmeb/vendor/topthink/framework/src/think/cache/driver/File.php
  63. 1 1
      crmeb/vendor/topthink/think-queue/src/queue/command/Listen.php
  64. 6 6
      template/admin/src/api/system.js
  65. 1 0
      template/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less
  66. 1 0
      template/admin/src/components/main/components/header-bar/header-bar.less
  67. 3 4
      template/admin/src/components/main/components/header-bar/header-bar.vue
  68. 1 1
      template/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.less
  69. 1 1
      template/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue
  70. 1 1
      template/admin/src/components/main/components/header-notice/index.vue
  71. 1 1
      template/admin/src/components/main/components/language/language.vue
  72. 13 9
      template/admin/src/components/main/components/side-menu/collapsed-menu.vue
  73. 2 2
      template/admin/src/components/main/components/side-menu/side-menu-item.vue
  74. 8 6
      template/admin/src/components/main/components/side-menu/side-menu.less
  75. 273 44
      template/admin/src/components/main/components/side-menu/side-menu.vue
  76. 4 5
      template/admin/src/components/main/main.less
  77. 44 40
      template/admin/src/components/main/main.vue
  78. 1 1
      template/admin/src/index.less
  79. 3 3
      template/admin/src/pages/account/login/index.vue
  80. 1 1
      template/admin/src/pages/agent/agentManage.vue
  81. 1 1
      template/admin/src/pages/marketing/channelCode/channelCodeIndex.vue
  82. 1 1
      template/admin/src/pages/order/refund/index.vue
  83. 1 0
      template/admin/src/pages/product/productAdd/index.vue
  84. 4 4
      template/admin/src/pages/setting/systemRole/index.vue
  85. 1 1
      template/admin/src/router/modules/index.js
  86. 4 0
      template/admin/src/store/module/menus.js
  87. 1 1
      template/admin/src/styles/style.css
  88. 5 3
      template/uni-app/pages/activity/poster-poster/index.vue
  89. 0 3
      template/uni-app/pages/admin/orderList/index.vue
  90. 2 2
      template/uni-app/pages/annex/components/verify/verifySlider/verifySlider.vue
  91. 3 3
      template/uni-app/pages/annex/components/verify/verifySlider/verifySliderPc.vue
  92. 3 2
      template/uni-app/pages/extension/customer_list/chat.vue
  93. 11 5
      template/uni-app/pages/goods/cashier/index.vue
  94. 2 2
      template/uni-app/pages/users/components/verify/verifySlider/index.vue
  95. 3 3
      template/uni-app/pages/users/components/verify/verifySlider/verifySliderPc.vue
  96. 1 0
      template/uni-app/pages/users/user_goods_collection/index.vue
  97. 2 1
      template/uni-app/pages/users/user_payment/index.vue

+ 1 - 0
crmeb/app/adminapi/controller/v1/export/ExportExcel.php

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

+ 1 - 1
crmeb/app/adminapi/controller/v1/order/RefundOrder.php

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

+ 1 - 1
crmeb/app/adminapi/controller/v1/order/StoreOrder.php

@@ -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 - 3
crmeb/app/adminapi/controller/v1/system/SystemTimer.php

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

+ 6 - 6
crmeb/app/adminapi/route/system.php

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

+ 11 - 5
crmeb/app/api/controller/v1/TimerController.php

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

+ 1 - 0
crmeb/app/api/controller/v1/user/DivisionController.php

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

+ 11 - 11
crmeb/app/api/route/v1.php

@@ -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 - 0
crmeb/app/dao/system/crontab/SystemCrontabDao.php

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

+ 0 - 18
crmeb/app/dao/system/timer/SystemTimerDao.php

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

+ 18 - 18
crmeb/app/event.php

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

+ 1 - 1
crmeb/app/jobs/UnpaidOrderSend.php

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

+ 1 - 1
crmeb/app/listener/admin/AdminLogin.php

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

+ 20 - 38
crmeb/app/listener/crontab/SystemCrontab.php

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

+ 1 - 1
crmeb/app/listener/http/HttpEnd.php

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

+ 1 - 1
crmeb/app/listener/notice/Notice.php

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

+ 2 - 2
crmeb/app/listener/order/OrderCreateAfter.php

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

+ 2 - 2
crmeb/app/listener/order/OrderDelivery.php

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

+ 2 - 2
crmeb/app/listener/order/OrderPaySuccess.php

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

+ 2 - 2
crmeb/app/listener/order/OrderRefundCancelAfter.php

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

+ 1 - 1
crmeb/app/listener/order/OrderRefundCreateAfter.php

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

+ 2 - 2
crmeb/app/listener/order/OrderTake.php

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

+ 1 - 1
crmeb/app/listener/out/OutPush.php

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

+ 2 - 2
crmeb/app/listener/pay/Notify.php

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

+ 1 - 1
crmeb/app/listener/queue/QueueStart.php

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

+ 2 - 2
crmeb/app/listener/user/Login.php

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

+ 2 - 2
crmeb/app/listener/user/Register.php

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

+ 2 - 2
crmeb/app/listener/user/UserLevel.php

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

+ 2 - 2
crmeb/app/listener/user/UserVisit.php

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

+ 2 - 2
crmeb/app/listener/wechat/Auth.php

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

+ 2 - 2
crmeb/app/model/system/timer/SystemTimer.php

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

+ 1 - 1
crmeb/app/services/activity/advance/StoreAdvanceServices.php

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

+ 2 - 2
crmeb/app/services/activity/bargain/StoreBargainServices.php

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

+ 1 - 1
crmeb/app/services/activity/combination/StoreCombinationServices.php

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

+ 5 - 5
crmeb/app/services/activity/combination/StorePinkServices.php

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

+ 1 - 1
crmeb/app/services/activity/seckill/StoreSeckillServices.php

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

+ 14 - 12
crmeb/app/services/order/StoreOrderComputedServices.php

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

+ 8 - 2
crmeb/app/services/order/StoreOrderCreateServices.php

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

+ 10 - 6
crmeb/app/services/order/StoreOrderDeliveryServices.php

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

+ 9 - 9
crmeb/app/services/order/StoreOrderRefundServices.php

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

+ 1 - 1
crmeb/app/services/order/StoreOrderServices.php

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

+ 2 - 1
crmeb/app/services/order/StoreOrderSplitServices.php

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

+ 4 - 4
crmeb/app/services/order/StoreOrderSuccessServices.php

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

+ 6 - 6
crmeb/app/services/order/StoreOrderTakeServices.php

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

+ 6 - 1
crmeb/app/services/pay/OrderPayServices.php

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

+ 1 - 1
crmeb/app/services/product/product/StoreProductServices.php

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

+ 1 - 1
crmeb/app/services/system/admin/SystemAdminServices.php

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

+ 30 - 16
crmeb/app/services/system/timer/SystemTimerServices.php

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

+ 6 - 6
crmeb/app/services/user/LoginServices.php

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

+ 2 - 2
crmeb/app/services/user/UserBillServices.php

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

+ 3 - 3
crmeb/app/services/user/UserExtractServices.php

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

+ 2 - 2
crmeb/app/services/user/UserRechargeServices.php

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

+ 4 - 4
crmeb/app/services/user/UserServices.php

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

+ 1 - 1
crmeb/app/services/user/UserSignServices.php

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

+ 1 - 1
crmeb/config/log.php

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

+ 1 - 1
crmeb/crmeb/command/Timer.php

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

+ 1 - 1
crmeb/crmeb/services/AliPayService.php

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

+ 2 - 2
crmeb/crmeb/services/app/WechatService.php

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

+ 1 - 1
crmeb/crmeb/services/pay/storage/AllinPay.php

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

+ 1 - 3
crmeb/crmeb/services/pay/storage/V3WechatPay.php

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

+ 11 - 1
crmeb/public/install/crmeb.sql

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

+ 1 - 1
crmeb/vendor/topthink/framework/src/think/cache/driver/File.php

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

+ 1 - 1
crmeb/vendor/topthink/think-queue/src/queue/command/Listen.php

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

+ 6 - 6
template/admin/src/api/system.js

@@ -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 - 0
template/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less

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

+ 1 - 0
template/admin/src/components/main/components/header-bar/header-bar.less

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

+ 3 - 4
template/admin/src/components/main/components/header-bar/header-bar.vue

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

+ 1 - 1
template/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.less

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

+ 1 - 1
template/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue

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

+ 1 - 1
template/admin/src/components/main/components/header-notice/index.vue

@@ -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 - 1
template/admin/src/components/main/components/language/language.vue

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

+ 13 - 9
template/admin/src/components/main/components/side-menu/collapsed-menu.vue

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

+ 2 - 2
template/admin/src/components/main/components/side-menu/side-menu-item.vue

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

+ 8 - 6
template/admin/src/components/main/components/side-menu/side-menu.less

@@ -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;
   }
 }
+.ivu-select-dropdown{
+  left: 95px !important;
+}
 .menu-title {
-  padding-left: 6px;
+  // padding-left: 6px;
 }

+ 273 - 44
template/admin/src/components/main/components/side-menu/side-menu.vue

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

+ 4 - 5
template/admin/src/components/main/main.less

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

+ 44 - 40
template/admin/src/components/main/main.vue

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

+ 1 - 1
template/admin/src/index.less

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

+ 3 - 3
template/admin/src/pages/account/login/index.vue

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

+ 1 - 1
template/admin/src/pages/agent/agentManage.vue

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

+ 1 - 1
template/admin/src/pages/marketing/channelCode/channelCodeIndex.vue

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

+ 1 - 1
template/admin/src/pages/order/refund/index.vue

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

+ 1 - 0
template/admin/src/pages/product/productAdd/index.vue

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

+ 4 - 4
template/admin/src/pages/setting/systemRole/index.vue

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

+ 1 - 1
template/admin/src/router/modules/index.js

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

+ 4 - 0
template/admin/src/store/module/menus.js

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

+ 1 - 1
template/admin/src/styles/style.css

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

+ 5 - 3
template/uni-app/pages/activity/poster-poster/index.vue

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

+ 0 - 3
template/uni-app/pages/admin/orderList/index.vue

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

+ 2 - 2
template/uni-app/pages/annex/components/verify/verifySlider/verifySlider.vue

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

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3 - 3
template/uni-app/pages/annex/components/verify/verifySlider/verifySliderPc.vue


+ 3 - 2
template/uni-app/pages/extension/customer_list/chat.vue

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

+ 11 - 5
template/uni-app/pages/goods/cashier/index.vue

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

+ 2 - 2
template/uni-app/pages/users/components/verify/verifySlider/index.vue

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

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3 - 3
template/uni-app/pages/users/components/verify/verifySlider/verifySliderPc.vue


+ 1 - 0
template/uni-app/pages/users/user_goods_collection/index.vue

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

+ 2 - 1
template/uni-app/pages/users/user_payment/index.vue

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