Procházet zdrojové kódy

【程序目录】更新微信模版消息

吴昊天 před 3 roky
rodič
revize
985f062f90
29 změnil soubory, kde provedl 812 přidání a 459 odebrání
  1. 41 2
      crmeb/app/adminapi/controller/Login.php
  2. 9 1
      crmeb/app/adminapi/controller/v1/setting/LangCode.php
  3. 9 1
      crmeb/app/adminapi/controller/v1/setting/LangCountry.php
  4. 12 2
      crmeb/app/adminapi/controller/v1/setting/LangType.php
  5. 2 0
      crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php
  6. 98 24
      crmeb/app/adminapi/controller/v1/system/SystemFile.php
  7. 8 0
      crmeb/app/adminapi/middleware/AdminAuthTokenMiddleware.php
  8. 53 0
      crmeb/app/adminapi/middleware/AdminEditorTokenMiddleware.php
  9. 4 0
      crmeb/app/adminapi/route/route.php
  10. 19 6
      crmeb/app/adminapi/route/system.php
  11. 44 11
      crmeb/app/api/controller/v1/LoginController.php
  12. 4 0
      crmeb/app/api/route/v1.php
  13. 50 12
      crmeb/app/common.php
  14. 6 16
      crmeb/app/jobs/OrderJob.php
  15. 0 1
      crmeb/app/jobs/TemplateJob.php
  16. 72 52
      crmeb/app/listener/notice/Notice.php
  17. 5 8
      crmeb/app/services/message/notice/SystemMsgService.php
  18. 189 274
      crmeb/app/services/message/notice/WechatTemplateListService.php
  19. 11 12
      crmeb/app/services/order/OtherOrderServices.php
  20. 5 3
      crmeb/app/services/order/StoreOrderDeliveryServices.php
  21. 1 1
      crmeb/app/services/order/StoreOrderRefundServices.php
  22. 9 0
      crmeb/app/services/order/StoreOrderSuccessServices.php
  23. 6 2
      crmeb/app/services/order/StoreOrderTakeServices.php
  24. 7 7
      crmeb/app/services/system/admin/AdminAuthServices.php
  25. 38 0
      crmeb/app/services/system/admin/SystemAdminServices.php
  26. 86 3
      crmeb/app/services/system/log/SystemFileServices.php
  27. 2 2
      crmeb/config/ajcaptcha.php
  28. 1 1
      crmeb/config/cookie.php
  29. 21 18
      crmeb/public/install/crmeb.sql

+ 41 - 2
crmeb/app/adminapi/controller/Login.php

@@ -47,6 +47,34 @@ class Login extends AuthController
         return app()->make(Captcha::class)->create();
         return app()->make(Captcha::class)->create();
     }
     }
 
 
+    /**
+     * @return mixed
+     */
+    public function ajcaptcha()
+    {
+        $captchaType = $this->request->get('captchaType');
+        return app('json')->success(aj_captcha_create($captchaType));
+    }
+
+    /**
+     * 一次验证
+     * @return mixed
+     */
+    public function ajcheck()
+    {
+        [$token, $pointJson, $captchaType] = $this->request->postMore([
+            ['token', ''],
+            ['pointJson', ''],
+            ['captchaType', ''],
+        ], true);
+        try {
+            aj_captcha_check_one($captchaType, $token, $pointJson);
+            return app('json')->success();
+        } catch (\Throwable $e) {
+            return app('json')->fail(400336);
+        }
+    }
+
     /**
     /**
      * 登陆
      * 登陆
      * @return mixed
      * @return mixed
@@ -56,14 +84,25 @@ class Login extends AuthController
      */
      */
     public function login()
     public function login()
     {
     {
-        [$account, $password, $imgcode, $key] = $this->request->postMore([
-            'account', 'pwd', ['imgcode', ''], ['key', '']
+        [$account, $password, $imgcode, $key, $captchaVerification, $captchaType] = $this->request->postMore([
+            'account',
+            'pwd',
+            ['imgcode', ''],
+            ['key', ''],
+            ['captchaVerification', ''],
+            ['captchaType', '']
         ], true);
         ], true);
 
 
         if (!app()->make(Captcha::class)->check($imgcode)) {
         if (!app()->make(Captcha::class)->check($imgcode)) {
             return app('json')->fail(400336);
             return app('json')->fail(400336);
         }
         }
 
 
+        try {
+            aj_captcha_check_two($captchaType, $captchaVerification);
+        } catch (\Throwable $e) {
+            return app('json')->fail(400336);
+        }
+
         $this->validate(['account' => $account, 'pwd' => $password], \app\adminapi\validate\setting\SystemAdminValidata::class, 'get');
         $this->validate(['account' => $account, 'pwd' => $password], \app\adminapi\validate\setting\SystemAdminValidata::class, 'get');
 
 
         return app('json')->success($this->services->login($account, $password, 'admin', $key));
         return app('json')->success($this->services->login($account, $password, 'admin', $key));

+ 9 - 1
crmeb/app/adminapi/controller/v1/setting/LangCode.php

@@ -1,5 +1,13 @@
 <?php
 <?php
-
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
 namespace app\adminapi\controller\v1\setting;
 namespace app\adminapi\controller\v1\setting;
 
 
 use app\adminapi\controller\AuthController;
 use app\adminapi\controller\AuthController;

+ 9 - 1
crmeb/app/adminapi/controller/v1/setting/LangCountry.php

@@ -1,5 +1,13 @@
 <?php
 <?php
-
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
 namespace app\adminapi\controller\v1\setting;
 namespace app\adminapi\controller\v1\setting;
 
 
 use app\adminapi\controller\AuthController;
 use app\adminapi\controller\AuthController;

+ 12 - 2
crmeb/app/adminapi/controller/v1/setting/LangType.php

@@ -1,10 +1,18 @@
 <?php
 <?php
-
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
 namespace app\adminapi\controller\v1\setting;
 namespace app\adminapi\controller\v1\setting;
 
 
 use app\adminapi\controller\AuthController;
 use app\adminapi\controller\AuthController;
-use app\services\system\lang\LangCountryServices;
 use app\services\system\lang\LangTypeServices;
 use app\services\system\lang\LangTypeServices;
+use crmeb\services\CacheService;
 use think\facade\App;
 use think\facade\App;
 
 
 class LangType extends AuthController
 class LangType extends AuthController
@@ -57,6 +65,7 @@ class LangType extends AuthController
             ['status', 0]
             ['status', 0]
         ]);
         ]);
         $this->services->langTypeSave($data);
         $this->services->langTypeSave($data);
+        CacheService::redisHandler()->delete('lang_type_data');
         return app('json')->success(100000);
         return app('json')->success(100000);
     }
     }
 
 
@@ -68,6 +77,7 @@ class LangType extends AuthController
     public function langTypeDel(int $id = 0)
     public function langTypeDel(int $id = 0)
     {
     {
         $this->services->langTypeDel($id);
         $this->services->langTypeDel($id);
+        CacheService::redisHandler()->delete('lang_type_data');
         return app('json')->success(100002);
         return app('json')->success(100002);
     }
     }
 }
 }

+ 2 - 0
crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php

@@ -168,6 +168,8 @@ class SystemAdmin extends AuthController
             ['pwd', ''],
             ['pwd', ''],
             ['new_pwd', ''],
             ['new_pwd', ''],
             ['conf_pwd', ''],
             ['conf_pwd', ''],
+            ['file_pwd', ''],
+            ['conf_file_pwd', ''],
         ]);
         ]);
         if(!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/',$data['new_pwd'])){
         if(!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/',$data['new_pwd'])){
             return app('json')->fail(400183);
             return app('json')->fail(400183);

+ 98 - 24
crmeb/app/adminapi/controller/v1/system/SystemFile.php

@@ -44,32 +44,106 @@ class SystemFile extends AuthController
     }
     }
 
 
     //打开目录
     //打开目录
-//    public function opendir()
-//    {
-//        return app('json')->success($this->services->opendir());
-//    }
+    public function opendir()
+    {
+        return app('json')->success($this->services->opendir());
+    }
 
 
     //读取文件
     //读取文件
-//    public function openfile()
-//    {
-//        $file = $this->request->param('filepath');
-//        if (empty($file)) return app('json')->fail('出现错误');
-//        return app('json')->success($this->services->openfile($file));
-//    }
+    public function openfile()
+    {
+        $file = $this->request->param('filepath');
+        if (empty($file)) return app('json')->fail(410087);
+        return app('json')->success($this->services->openfile($file));
+    }
 
 
     //保存文件
     //保存文件
-//    public function savefile()
-//    {
-//        $comment = $this->request->param('comment');
-//        $filepath = $this->request->param('filepath');
-//        if(empty($comment) || empty($filepath)){
-//            return app('json')->fail('出现错误');
-//        }
-//        $res = $this->services->savefile($filepath,$comment);
-//        if ($res) {
-//            return app('json')->success('保存成功!');
-//        } else {
-//            return app('json')->fail('保存失败');
-//        }
-//    }
+    public function savefile()
+    {
+        $comment = $this->request->param('comment');
+        $filepath = $this->request->param('filepath');
+        if (empty($comment) || empty($filepath)) {
+            return app('json')->fail(410087);
+        }
+        $res = $this->services->savefile($filepath, $comment);
+        if ($res) {
+            return app('json')->success(100000);
+        } else {
+            return app('json')->fail(100006);
+        }
+    }
+
+    /**
+     * 创建文件夹
+     * @return mixed
+     *
+     * @date 2022/09/17
+     * @author yyw
+     */
+    public function createFolder()
+    {
+        [$path] = $this->request->postMore([
+            ['path', '']
+        ], true);
+        try {
+            $this->services->createFolder($path);
+        } catch (\Exception $e) {
+            return app('json')->fail($e->getMessage());
+        }
+        return app('json')->success(100010);
+    }
+
+    /**
+     * 创建文件
+     * @return mixed
+     *
+     * @date 2022/09/17
+     * @author yyw
+     */
+    public function createFile()
+    {
+        [$path] = $this->request->postMore([
+            ['path', '']
+        ], true);
+        try {
+            $this->services->createFile($path);
+        } catch (\Exception $e) {
+            return app('json')->fail($e->getMessage());
+        }
+        return app('json')->success(100010);
+    }
+
+    /**
+     * 删除文件或文件夹
+     * @return mixed
+     *
+     * @date 2022/09/17
+     * @author yyw
+     */
+    public function delFolder()
+    {
+        [$path] = $this->request->postMore([
+            ['path', '']
+        ], true);
+        try {
+            $this->services->delFolder($path);
+        } catch (\Exception $e) {
+            return app('json')->fail($e->getMessage());
+        }
+        return app('json')->success(100010);
+    }
+
+
+    public function copyFolder()
+    {
+        [$surDir, $toDir] = $this->request->postMore([
+            ['surDir', ''],
+            ['toDir', '']
+        ], true);
+        try {
+            return app('json')->success($this->services->copyFolder($surDir, $toDir));
+        } catch (\Exception $e) {
+            return app('json')->fail($e->getMessage());
+        }
+    }
 }
 }

+ 8 - 0
crmeb/app/adminapi/middleware/AdminAuthTokenMiddleware.php

@@ -16,6 +16,7 @@ use app\Request;
 use app\services\system\admin\AdminAuthServices;
 use app\services\system\admin\AdminAuthServices;
 use crmeb\interfaces\MiddlewareInterface;
 use crmeb\interfaces\MiddlewareInterface;
 use think\facade\Config;
 use think\facade\Config;
+use crmeb\services\CacheService;
 
 
 /**
 /**
  * 后台登陆验证中间件
  * 后台登陆验证中间件
@@ -28,6 +29,13 @@ class AdminAuthTokenMiddleware implements MiddlewareInterface
     {
     {
         $authInfo = null;
         $authInfo = null;
         $token = trim(ltrim($request->header(Config::get('cookie.token_name', 'Authori-zation')), 'Bearer'));
         $token = trim(ltrim($request->header(Config::get('cookie.token_name', 'Authori-zation')), 'Bearer'));
+        // 获取文件token,让其失效
+        $invalid_token = trim(ltrim($request->header(Config::get('cookie.invalid_token_name', 'Invalid-zation')), 'Bearer'));
+        if($invalid_token)
+        {
+            $md5Token = md5($invalid_token);
+            $res = CacheService::clearToken($md5Token);
+        }
 
 
         /** @var AdminAuthServices $service */
         /** @var AdminAuthServices $service */
         $service = app()->make(AdminAuthServices::class);
         $service = app()->make(AdminAuthServices::class);

+ 53 - 0
crmeb/app/adminapi/middleware/AdminEditorTokenMiddleware.php

@@ -0,0 +1,53 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\middleware;
+
+
+use app\Request;
+use app\services\system\admin\AdminAuthServices;
+use crmeb\exceptions\AuthException;
+use crmeb\interfaces\MiddlewareInterface;
+use think\facade\Config;
+
+/**
+ * 后台登陆验证中间件
+ * Class AdminAuthTokenMiddleware
+ * @package app\adminapi\middleware
+ */
+class AdminEditorTokenMiddleware implements MiddlewareInterface
+{
+    public function handle(Request $request, \Closure $next)
+    {
+        $authInfo = null;
+        $token = trim(ltrim($request->header(Config::get('cookie.token_name', 'Authori-zation')), 'Bearer'));
+
+        /** @var AdminAuthServices $service */
+        $service = app()->make(AdminAuthServices::class);
+        $adminInfo = $service->parseToken($token,110008);
+        if($adminInfo['type'] !== 'admin_edit')
+        {
+            throw new AuthException('登陆异常,请重新登录',[],110008);
+        }
+        Request::macro('isAdminLogin', function () use (&$adminInfo) {
+            return !is_null($adminInfo);
+        });
+        Request::macro('adminId', function () use (&$adminInfo) {
+            return $adminInfo['id'];
+        });
+
+        Request::macro('adminInfo', function () use (&$adminInfo) {
+            return $adminInfo;
+        });
+
+        return $next($request);
+    }
+}

+ 4 - 0
crmeb/app/adminapi/route/route.php

@@ -28,6 +28,10 @@ Route::group(function () {
     Route::get('download', 'PublicController/download')->option(['real_name' => '下载文件']);
     Route::get('download', 'PublicController/download')->option(['real_name' => '下载文件']);
     //验证码
     //验证码
     Route::get('captcha_pro', 'Login/captcha')->name('')->option(['real_name' => '获取验证码']);
     Route::get('captcha_pro', 'Login/captcha')->name('')->option(['real_name' => '获取验证码']);
+    //获取验证码
+    Route::get('ajcaptcha', 'Login/ajcaptcha')->name('ajcaptcha')->option(['real_name' => '获取验证码']);
+    //一次验证
+    Route::post('ajcheck', 'Login/ajcheck')->name('ajcheck')->option(['real_name' => '一次验证']);
     //获取客服数据
     //获取客服数据
     Route::get('get_workerman_url', 'PublicController/getWorkerManUrl')->option(['real_name' => '获取客服数据']);
     Route::get('get_workerman_url', 'PublicController/getWorkerManUrl')->option(['real_name' => '获取客服数据']);
     //测试
     //测试

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

@@ -45,12 +45,6 @@ Route::group('system', function () {
     Route::get('log/search_admin', 'v1.system.SystemLog/search_admin')->option(['real_name' => '系统日志管理员搜索条件']);
     Route::get('log/search_admin', 'v1.system.SystemLog/search_admin')->option(['real_name' => '系统日志管理员搜索条件']);
     //文件校验
     //文件校验
     Route::get('file', 'v1.system.SystemFile/index')->name('SystemFile')->option(['real_name' => '文件校验']);
     Route::get('file', 'v1.system.SystemFile/index')->name('SystemFile')->option(['real_name' => '文件校验']);
-    //打开目录
-//    Route::get('file/opendir', 'v1.system.SystemFile/opendir')->option(['real_name' => '打开目录']);
-    //读取文件
-//    Route::get('file/openfile', 'v1.system.SystemFile/openfile')->option(['real_name' => '读取文件']);
-    //保存文件
-//    Route::post('file/savefile', 'v1.system.SystemFile/savefile')->option(['real_name' => '保存文件']);
     //数据所有表
     //数据所有表
     Route::get('backup', 'v1.system.SystemDatabackup/index')->option(['real_name' => '数据库所有表']);
     Route::get('backup', 'v1.system.SystemDatabackup/index')->option(['real_name' => '数据库所有表']);
     //数据备份详情
     //数据备份详情
@@ -106,3 +100,22 @@ Route::group('system', function () {
     \app\adminapi\middleware\AdminCheckRoleMiddleware::class,
     \app\adminapi\middleware\AdminCheckRoleMiddleware::class,
     \app\adminapi\middleware\AdminLogMiddleware::class
     \app\adminapi\middleware\AdminLogMiddleware::class
 ]);
 ]);
+
+Route::group('system', function () {
+
+    //打开目录
+    Route::get('file/opendir', 'v1.system.SystemFile/opendir')->option(['real_name' => '打开目录']);
+    //读取文件
+    Route::get('file/openfile', 'v1.system.SystemFile/openfile')->option(['real_name' => '读取文件']);
+    //保存文件
+    Route::post('file/savefile', 'v1.system.SystemFile/savefile')->option(['real_name' => '保存文件']);
+    Route::get('file/createFolder', 'v1.system.SystemFile/createFolder')->option(['real_name' => '创建文件夹']);
+    Route::get('file/createFile', 'v1.system.SystemFile/createFile')->option(['real_name' => '创建文件']);
+    Route::get('file/delFolder', 'v1.system.SystemFile/delFolder')->option(['real_name' => '删除文件夹']);
+})->middleware([
+    \app\http\middleware\AllowOriginMiddleware::class,
+    \app\adminapi\middleware\AdminEditorTokenMiddleware::class,
+    \app\adminapi\middleware\AdminCheckRoleMiddleware::class,
+    \app\adminapi\middleware\AdminLogMiddleware::class
+]);
+

+ 44 - 11
crmeb/app/api/controller/v1/LoginController.php

@@ -121,29 +121,35 @@ class LoginController
      */
      */
     public function verify(Request $request, SmsService $services)
     public function verify(Request $request, SmsService $services)
     {
     {
-        [$phone, $type, $key, $code] = $request->postMore([['phone', 0], ['type', ''], ['key', ''], ['code', '']], true);
+        [$phone, $type, $key, $captchaType, $captchaVerification] = $request->postMore([
+            ['phone', 0],
+            ['type', ''],
+            ['key', ''],
+            ['captchaType', ''],
+            ['captchaVerification', ''],
+        ], true);
 
 
         $keyName = 'sms.key.' . $key;
         $keyName = 'sms.key.' . $key;
         $nowKey = 'sms.' . date('YmdHi');
         $nowKey = 'sms.' . date('YmdHi');
 
 
-        if (!Cache::has($keyName))
+        if (!Cache::has($keyName)) {
             return app('json')->fail(410003);
             return app('json')->fail(410003);
-
-        if (($num = Cache::get($keyName)) > 2) {
-            if (!$code)
-                return app('json')->fail(410004);
-
-            if (!$this->checkCaptcha($key, $code))
-                return app('json')->fail(410005);
         }
         }
 
 
         $total = 1;
         $total = 1;
-        if ($has = Cache::has($nowKey)) {
+        if (Cache::has($nowKey)) {
             $total = Cache::get($nowKey);
             $total = Cache::get($nowKey);
             if ($total > Config::get('sms.maxMinuteCount', 20))
             if ($total > Config::get('sms.maxMinuteCount', 20))
                 return app('json')->success(410006);
                 return app('json')->success(410006);
         }
         }
 
 
+        //二次验证
+        try {
+            aj_captcha_check_two($captchaType, $captchaVerification);
+        } catch (\Throwable $e) {
+            return app('json')->fail($e->getError());
+        }
+
         try {
         try {
             validate(RegisterValidates::class)->scene('code')->check(['phone' => $phone]);
             validate(RegisterValidates::class)->scene('code')->check(['phone' => $phone]);
         } catch (ValidateException $e) {
         } catch (ValidateException $e) {
@@ -153,7 +159,6 @@ class LoginController
         $smsCode = $this->services->verify($services, $phone, $type, $time, app()->request->ip());
         $smsCode = $this->services->verify($services, $phone, $type, $time, app()->request->ip());
         if ($smsCode) {
         if ($smsCode) {
             CacheService::set('code_' . $phone, $smsCode, $time * 60);
             CacheService::set('code_' . $phone, $smsCode, $time * 60);
-            Cache::set($keyName, $num + 1, 300);
             Cache::set($nowKey, $total, 61);
             Cache::set($nowKey, $total, 61);
             return app('json')->success(410007);
             return app('json')->success(410007);
         } else {
         } else {
@@ -455,4 +460,32 @@ class LoginController
         }
         }
 
 
     }
     }
+
+    /**
+     * @return mixed
+     */
+    public function ajcaptcha(Request $request)
+    {
+        $captchaType = $request->get('captchaType');
+        return app('json')->success(aj_captcha_create($captchaType));
+    }
+
+    /**
+     * 一次验证
+     * @return mixed
+     */
+    public function ajcheck(Request $request)
+    {
+        [$token, $pointJson, $captchaType] = $request->postMore([
+            ['token', ''],
+            ['pointJson', ''],
+            ['captchaType', ''],
+        ], true);
+        try {
+            aj_captcha_check_one($captchaType, $token, $pointJson);
+            return app('json')->success();
+        } catch (\Throwable $e) {
+            return app('json')->fail(400336);
+        }
+    }
 }
 }

+ 4 - 0
crmeb/app/api/route/v1.php

@@ -30,6 +30,10 @@ Route::group(function () {
     Route::post('login/mobile', 'v1.LoginController/mobile')->name('loginMobile');
     Route::post('login/mobile', 'v1.LoginController/mobile')->name('loginMobile');
     //图片验证码
     //图片验证码
     Route::get('sms_captcha', 'v1.LoginController/captcha')->name('captcha');
     Route::get('sms_captcha', 'v1.LoginController/captcha')->name('captcha');
+    //图形验证码
+    Route::get('ajcaptcha', 'v1.LoginController/ajcaptcha')->name('ajcaptcha');
+    //图形验证码
+    Route::post('ajcheck', 'v1.LoginController/ajcheck')->name('ajcheck');
     //验证码发送
     //验证码发送
     Route::post('register/verify', 'v1.LoginController/verify')->name('registerVerify');
     Route::post('register/verify', 'v1.LoginController/verify')->name('registerVerify');
     //手机号注册
     //手机号注册

+ 50 - 12
crmeb/app/common.php

@@ -11,6 +11,7 @@
 
 
 // 应用公共文件
 // 应用公共文件
 use crmeb\services\CacheService;
 use crmeb\services\CacheService;
+use Fastknife\Service\ClickWordCaptchaService;
 use think\exception\ValidateException;
 use think\exception\ValidateException;
 use crmeb\services\FormBuilder as Form;
 use crmeb\services\FormBuilder as Form;
 use app\services\other\UploadService;
 use app\services\other\UploadService;
@@ -934,10 +935,14 @@ if (!function_exists('getLang')) {
         $langCountryServices = app()->make(LangCountryServices::class);
         $langCountryServices = app()->make(LangCountryServices::class);
         $typeId = $langCountryServices->value(['code' => $range], 'type_id') ?: 1;
         $typeId = $langCountryServices->value(['code' => $range], 'type_id') ?: 1;
 
 
+        // 获取类型
+        $langData = CacheService::redisHandler()->remember('lang_type_data', function () {
+            /** @var LangTypeServices $langTypeServices */
+            $langTypeServices = app()->make(LangTypeServices::class);
+            return $langTypeServices->getColumn(['status' => 1, 'is_del' => 0], 'file_name', 'id');
+        }, 3600);
+
         // 获取缓存key
         // 获取缓存key
-        /** @var LangTypeServices $langTypeServices */
-        $langTypeServices = app()->make(LangTypeServices::class);
-        $langData = $langTypeServices->getColumn(['status' => 1, 'is_del' => 0], 'file_name', 'id');
         $langStr = 'lang_' . str_replace('-', '_', $langData[$typeId]);
         $langStr = 'lang_' . str_replace('-', '_', $langData[$typeId]);
 
 
         //读取当前语言的语言包
         //读取当前语言的语言包
@@ -963,18 +968,30 @@ if (!function_exists('getLang')) {
     }
     }
 }
 }
 
 
-if (!function_exists('aj_captcha_check')) {
+if (!function_exists('aj_captcha_check_one')) {
     /**
     /**
-     * 验证滑块
+     * 验证滑块1次验证
      * @param string $token
      * @param string $token
      * @param string $pointJson
      * @param string $pointJson
      * @return bool
      * @return bool
      */
      */
-    function aj_captcha_check(string $token, string $pointJson)
+    function aj_captcha_check_one(string $captchaType, string $token, string $pointJson)
     {
     {
-        $config = Config::get('ajcaptcha');
-        $service = new BlockPuzzleCaptchaService($config);
-        $service->check($token, $pointJson);
+        aj_get_serevice($captchaType)->check($token, $pointJson);
+        return true;
+    }
+}
+
+if (!function_exists('aj_captcha_check_two')) {
+    /**
+     * 验证滑块2次验证
+     * @param string $token
+     * @param string $pointJson
+     * @return bool
+     */
+    function aj_captcha_check_two(string $captchaType, string $captchaVerification )
+    {
+        aj_get_serevice($captchaType)->verificationByEncryptCode($captchaVerification);
         return true;
         return true;
     }
     }
 }
 }
@@ -985,10 +1002,31 @@ if (!function_exists('aj_captcha_create')) {
      * 创建验证码
      * 创建验证码
      * @return array
      * @return array
      */
      */
-    function aj_captcha_create()
+    function aj_captcha_create(string $captchaType)
+    {
+        return aj_get_serevice($captchaType)->get();
+    }
+}
+
+if (!function_exists('aj_get_serevice')) {
+
+    /**
+     * @param string $captchaType
+     * @return ClickWordCaptchaService|BlockPuzzleCaptchaService
+     */
+    function aj_get_serevice(string $captchaType)
     {
     {
         $config = Config::get('ajcaptcha');
         $config = Config::get('ajcaptcha');
-        $service = new BlockPuzzleCaptchaService($config);
-        return $service->get();
+        switch ($captchaType) {
+            case "clickWord":
+                $service = new ClickWordCaptchaService($config);
+                break;
+            case "blockPuzzle":
+                $service = new BlockPuzzleCaptchaService($config);
+                break;
+            default:
+                throw new ValidateException('captchaType参数不正确!');
+        }
+        return $service;
     }
     }
 }
 }

+ 6 - 16
crmeb/app/jobs/OrderJob.php

@@ -245,22 +245,12 @@ class OrderJob extends BaseJobs
     }
     }
 
 
     /**
     /**
-     *  支付成功短信提醒
-     * @param string $order_id
-     */
-    public function mssageSendPaySuccess($order)
-    {
-        $switch = (bool)sys_config('lower_order_switch');
-        //模板变量
-        $pay_price = $order['pay_price'];
-        $order_id = $order['order_id'];
-        /** @var SmsService $smsServices */
-        $smsServices = app()->make(SmsService::class);
-        $smsServices->send($switch, $order['user_phone'], compact('order_id', 'pay_price'), 'order_pay_success');
-    }
-
-    /**计算节约金额
+     * 计算节约金额
      * @param $order
      * @param $order
+     * @return false|mixed
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
      */
      */
     public function setEconomizeMoney($order)
     public function setEconomizeMoney($order)
     {
     {
@@ -293,7 +283,7 @@ class OrderJob extends BaseJobs
                 if ($cartInfo) {
                 if ($cartInfo) {
                     foreach ($cartInfo as $k => $item) {
                     foreach ($cartInfo as $k => $item) {
                         foreach ($item as $value) {
                         foreach ($item as $value) {
-                            if ($value['price_type'] == 'member') $memberPrice += bcmul($value['vip_truePrice'], $value['cart_num'] ?: 1, 2);
+                            if (isset($value['price_type']) && $value['price_type'] == 'member') $memberPrice += bcmul($value['vip_truePrice'], $value['cart_num'] ?: 1, 2);
                         }
                         }
                     }
                     }
                 }
                 }

+ 0 - 1
crmeb/app/jobs/TemplateJob.php

@@ -64,7 +64,6 @@ class TemplateJob extends BaseJobs
                 $notifyServices = app()->make(SystemNotificationServices::class);
                 $notifyServices = app()->make(SystemNotificationServices::class);
                 return $notifyServices->getNotInfo(['type' => $is_type, 'mark' => $tempCode])['tempid'];
                 return $notifyServices->getNotInfo(['type' => $is_type, 'mark' => $tempCode])['tempid'];
             });
             });
-
             return $template->send($tempid, $data);
             return $template->send($tempid, $data);
         } catch (\Exception $e) {
         } catch (\Exception $e) {
             Log::error($e->getMessage());
             Log::error($e->getMessage());

+ 72 - 52
crmeb/app/listener/notice/Notice.php

@@ -136,7 +136,7 @@ class Notice implements ListenerInterface
                         $smsdata = ['nickname' => $nickname, 'store_name' => $storeTitle, 'order_id' => $orderInfo['order_id'], 'delivery_name' => $orderInfo['delivery_name'], 'delivery_id' => $orderInfo['delivery_id'], 'user_address' => $orderInfo['user_address']];
                         $smsdata = ['nickname' => $nickname, 'store_name' => $storeTitle, 'order_id' => $orderInfo['order_id'], 'delivery_name' => $orderInfo['delivery_name'], 'delivery_id' => $orderInfo['delivery_id'], 'user_address' => $orderInfo['user_address']];
                         $SystemMsg->sendMsg($orderInfo['uid'], $smsdata);
                         $SystemMsg->sendMsg($orderInfo['uid'], $smsdata);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderPostage($orderInfo['uid'], $orderInfo->toArray(), $datas);
+                        $WechatTemplateList->sendOrderPostage($orderInfo['uid'], $orderInfo->toArray(), $store_name);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendOrderPostage($orderInfo['uid'], $orderInfo->toArray(), $storeTitle, $isGive);
                         $RoutineTemplateList->sendOrderPostage($orderInfo['uid'], $orderInfo->toArray(), $storeTitle, $isGive);
                         break;
                         break;
@@ -169,12 +169,15 @@ class Notice implements ListenerInterface
                     case 'order_refund':
                     case 'order_refund':
                         $datas = $data['data'];
                         $datas = $data['data'];
                         $order = $data['order'];
                         $order = $data['order'];
+                        $order['refund_price'] = $datas['refund_price'];
+                        $order['refund_no'] = $datas['refund_no'];
                         $storeName = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
                         $storeName = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
                         $storeTitle = Str::substrUTf8($storeName, 20, 'UTF-8', '');
                         $storeTitle = Str::substrUTf8($storeName, 20, 'UTF-8', '');
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'pay_price' => $order['pay_price'], 'refund_price' => $datas['refund_price']]);
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'pay_price' => $order['pay_price'], 'refund_price' => $datas['refund_price']]);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderRefundSuccess($order['uid'], $datas, $order);
+                        $title = '亲,您购买的商品已退款';
+                        $WechatTemplateList->sendOrderRefund($order['uid'], $order, $title);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendOrderRefundSuccess($order['uid'], $order, $storeTitle, $datas);
                         $RoutineTemplateList->sendOrderRefundSuccess($order['uid'], $order, $storeTitle, $datas);
                         break;
                         break;
@@ -182,11 +185,13 @@ class Notice implements ListenerInterface
                     case 'send_order_refund_no_status':
                     case 'send_order_refund_no_status':
                         $order = $data['orderInfo'];
                         $order = $data['orderInfo'];
                         $order['pay_price'] = $order['refund_price'];
                         $order['pay_price'] = $order['refund_price'];
+                        $order['refund_no'] = $order['order_id'];
                         $storeTitle = Str::substrUTf8($order['cart_info'][0]['productInfo']['store_name'], 20, 'UTF-8', '');
                         $storeTitle = Str::substrUTf8($order['cart_info'][0]['productInfo']['store_name'], 20, 'UTF-8', '');
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'pay_price' => $order['refund_price'], 'store_name' => $storeTitle]);
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'pay_price' => $order['refund_price'], 'store_name' => $storeTitle]);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderRefundNoStatus($order['uid'], $order);
+                        $title = '亲,您的订单拒绝退款,点击查看原因';
+                        $WechatTemplateList->sendOrderRefund($order['uid'], $order, $title);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendOrderRefundFail($order['uid'], $order, $storeTitle);
                         $RoutineTemplateList->sendOrderRefundFail($order['uid'], $order, $storeTitle);
                         break;
                         break;
@@ -219,7 +224,7 @@ class Notice implements ListenerInterface
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'store_name' => $data['storeTitle'], 'pay_price' => $order['pay_price'], 'gain_integral' => $data['give_integral'], 'integral' => $data['integral']]);
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order['order_id'], 'store_name' => $data['storeTitle'], 'pay_price' => $order['pay_price'], 'gain_integral' => $data['give_integral'], 'integral' => $data['integral']]);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendUserIntegral($order['uid'], $order);
+                        $WechatTemplateList->sendUserIntegral($order['uid'], $order, $data);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendUserIntegral($order['uid'], $data['order'], $data['storeTitle'], $data['give_integral'], $data['integral']);
                         $RoutineTemplateList->sendUserIntegral($order['uid'], $data['order'], $data['storeTitle'], $data['give_integral'], $data['integral']);
                         break;
                         break;
@@ -233,7 +238,7 @@ class Notice implements ListenerInterface
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($spread_uid, ['goods_name' => $goodsName, 'goods_price' => $goodsPrice, 'brokerage_price' => $brokeragePrice]);
                         $SystemMsg->sendMsg($spread_uid, ['goods_name' => $goodsName, 'goods_price' => $goodsPrice, 'brokerage_price' => $brokeragePrice]);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderBrokerageSuccess($spread_uid, $brokeragePrice, $goodsName, $goodsPrice, $add_time);
+                        $WechatTemplateList->sendOrderBrokerageSuccess($spread_uid, $brokeragePrice, $add_time);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendOrderBrokerageSuccess($spread_uid, $brokeragePrice, $goodsName);
                         $RoutineTemplateList->sendOrderBrokerageSuccess($spread_uid, $brokeragePrice, $goodsName);
                         break;
                         break;
@@ -249,6 +254,32 @@ class Notice implements ListenerInterface
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendBargainSuccess($uid, $bargainInfo, $bargainUserInfo, $uid);
                         $RoutineTemplateList->sendBargainSuccess($uid, $bargainInfo, $bargainUserInfo, $uid);
                         break;
                         break;
+                    //开团成功
+                    case 'open_pink_success':
+                        $orderInfo = $data['orderInfo'];
+                        $title = $data['title'];
+                        $pink = $data['pink'];
+                        $nickname = $UserServices->value(['uid' => $orderInfo['uid']], 'nickname');
+                        //站内信
+                        $SystemMsg->sendMsg($orderInfo['uid'], ['title' => $title, 'nickname' => $nickname, 'count' => $pink['people'], 'pink_time' => date('Y-m-d H:i:s', $pink['add_time'])]);
+                        //模板消息公众号模版消息
+                        $WechatTemplateList->sendOrderPinkOpenSuccess($orderInfo['uid'], $pink, $title);
+                        //模板消息小程序订阅消息
+                        $RoutineTemplateList->sendPinkSuccess($orderInfo['uid'], $title, $nickname, $pink['add_time'], $pink['people'], '/pages/users/order_details/index?order_id=' . $pink['order_id']);
+                        break;
+                    //参团成功
+                    case 'can_pink_success':
+                        $orderInfo = $data['orderInfo'];
+                        $title = $data['title'];
+                        $pink = $data['pink'];
+                        $nickname = $UserServices->value(['uid' => $orderInfo['uid']], 'nickname');
+                        //站内信
+                        $SystemMsg->sendMsg($orderInfo['uid'], ['title' => $title, 'nickname' => $nickname, 'count' => $pink['people'], 'pink_time' => date('Y-m-d H:i:s', $pink['add_time'])]);
+                        //模板消息公众号模版消息
+                        $WechatTemplateList->sendOrderPinkUseSuccess($orderInfo['uid'], $orderInfo, $title);
+                        //模板消息小程序订阅消息
+                        $RoutineTemplateList->sendPinkSuccess($orderInfo['uid'], $title, $nickname, $pink['add_time'], $pink['people'], '/pages/users/order_details/index?order_id=' . $pink['order_id']);
+                        break;
                     //拼团成功
                     //拼团成功
                     case 'order_user_groups_success':
                     case 'order_user_groups_success':
                         $list = $data['list'];
                         $list = $data['list'];
@@ -257,7 +288,7 @@ class Notice implements ListenerInterface
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($list['uid'], ['title' => $title, 'nickname' => $list['nickname'], 'count' => $list['people'], 'pink_time' => date('Y-m-d H:i:s', $list['add_time'])]);
                         $SystemMsg->sendMsg($list['uid'], ['title' => $title, 'nickname' => $list['nickname'], 'count' => $list['people'], 'pink_time' => date('Y-m-d H:i:s', $list['add_time'])]);
                         //模板消息公众号模版消息
                         //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderPinkSuccess($list['uid'], $list['order_id'], $list['id'], $title);
+                        $WechatTemplateList->sendOrderPinkSuccess($list['uid'], $list, $title);
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendPinkSuccess($list['uid'], $title, $list['nickname'], $list['add_time'], $list['people'], $url);
                         $RoutineTemplateList->sendPinkSuccess($list['uid'], $title, $list['nickname'], $list['add_time'], $list['people'], $url);
                         break;
                         break;
@@ -283,32 +314,6 @@ class Notice implements ListenerInterface
                         //模板消息小程序订阅消息
                         //模板消息小程序订阅消息
                         $RoutineTemplateList->sendPinkFail($uid, $pink->title, $pink->people, '亲,您拼团失败,自动为您申请退款,退款金额为:' . $pink->price, '/pages/order_details/index?order_id=' . $pink->order_id);
                         $RoutineTemplateList->sendPinkFail($uid, $pink->title, $pink->people, '亲,您拼团失败,自动为您申请退款,退款金额为:' . $pink->price, '/pages/order_details/index?order_id=' . $pink->order_id);
                         break;
                         break;
-                    //参团成功
-                    case 'can_pink_success':
-                        $orderInfo = $data['orderInfo'];
-                        $title = $data['title'];
-                        $pink = $data['pink'];
-                        $nickname = $UserServices->value(['uid' => $orderInfo['uid']], 'nickname');
-                        //站内信
-                        $SystemMsg->sendMsg($orderInfo['uid'], ['title' => $title, 'nickname' => $nickname, 'count' => $pink['people'], 'pink_time' => date('Y-m-d H:i:s', $pink['add_time'])]);
-                        //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderPinkUseSuccess($orderInfo['uid'], $orderInfo['order_id'], $title, $orderInfo['pink_id']);
-                        //模板消息小程序订阅消息
-                        $RoutineTemplateList->sendPinkSuccess($orderInfo['uid'], $title, $nickname, $pink['add_time'], $pink['people'], '/pages/users/order_details/index?order_id=' . $pink['order_id']);
-                        break;
-                    //开团成功
-                    case 'open_pink_success':
-                        $orderInfo = $data['orderInfo'];
-                        $title = $data['title'];
-                        $pink = $data['pink'];
-                        $nickname = $UserServices->value(['uid' => $orderInfo['uid']], 'nickname');
-                        //站内信
-                        $SystemMsg->sendMsg($orderInfo['uid'], ['title' => $title, 'nickname' => $nickname, 'count' => $pink['people'], 'pink_time' => date('Y-m-d H:i:s', $pink['add_time'])]);
-                        //模板消息公众号模版消息
-                        $WechatTemplateList->sendOrderPinkOpenSuccess($orderInfo['uid'], $pink, $title);
-                        //模板消息小程序订阅消息
-                        $RoutineTemplateList->sendPinkSuccess($orderInfo['uid'], $title, $nickname, $pink['add_time'], $pink['people'], '/pages/users/order_details/index?order_id=' . $pink['order_id']);
-                        break;
                     //提现成功
                     //提现成功
                     case 'user_extract':
                     case 'user_extract':
                         $extractNumber = $data['extractNumber'];
                         $extractNumber = $data['extractNumber'];
@@ -338,24 +343,13 @@ class Notice implements ListenerInterface
                     case 'order_pay_false':
                     case 'order_pay_false':
                         $order = $data['order'];
                         $order = $data['order'];
                         $order_id = $order['order_id'];
                         $order_id = $order['order_id'];
+                        $order['storeName'] = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
                         //短信
                         //短信
                         $NoticeSms->sendSms($order['user_phone'], compact('order_id'));
                         $NoticeSms->sendSms($order['user_phone'], compact('order_id'));
                         //站内信
                         //站内信
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order_id]);
                         $SystemMsg->sendMsg($order['uid'], ['order_id' => $order_id]);
                         $WechatTemplateList->sendOrderPayFalse($order['uid'], $order);
                         $WechatTemplateList->sendOrderPayFalse($order['uid'], $order);
                         break;
                         break;
-                    //申请退款给客服发消息
-                    case 'send_order_apply_refund':
-                        $order = $data['order'];
-                        //站内信
-                        $SystemMsg->kefuSystemSend(['order_id' => $order['order_id']]);
-                        //短信
-                        $NoticeSms->sendAdminRefund($order);
-                        //公众号
-//                        $WechatTemplateList->sendAdminNewRefund($order);
-                        //企业微信通知
-                        $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]);
-                        break;
                     //新订单给客服
                     //新订单给客服
                     case 'admin_pay_success_code':
                     case 'admin_pay_success_code':
                         $order = $data;
                         $order = $data;
@@ -364,17 +358,14 @@ class Notice implements ListenerInterface
                         //短信
                         //短信
                         $NoticeSms->sendAdminPaySuccess($order);
                         $NoticeSms->sendAdminPaySuccess($order);
                         //公众号小程序
                         //公众号小程序
-//                        $WechatTemplateList->sendAdminNewOrder($order);
+                        $storeName = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
+                        $title = '亲,来新订单啦!';
+                        $status = '新订单';
+                        $link = '/pages/admin/orderDetail/index?id=' . $order['order_id'];
+                        $WechatTemplateList->sendAdminOrder($order['order_id'], $storeName, $title, $status, $link);
                         //企业微信通知
                         //企业微信通知
                         $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]);
                         $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]);
                         break;
                         break;
-                    //提现申请给客服
-                    case 'kefu_send_extract_application':
-                        //站内信
-                        $SystemMsg->kefuSystemSend($data);
-                        //企业微信通知
-                        $EnterpriseWechat->sendMsg($data);
-                        break;
                     //确认收货给客服
                     //确认收货给客服
                     case 'send_admin_confirm_take_over':
                     case 'send_admin_confirm_take_over':
                         $order = $data['order'];
                         $order = $data['order'];
@@ -383,9 +374,38 @@ class Notice implements ListenerInterface
                         $SystemMsg->kefuSystemSend(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]);
                         $SystemMsg->kefuSystemSend(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]);
                         //短信
                         //短信
                         $NoticeSms->sendAdminConfirmTakeOver($order);
                         $NoticeSms->sendAdminConfirmTakeOver($order);
+                        //公众号
+                        $storeName = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
+                        $title = '亲,用户已经收到货物啦!';
+                        $status = '订单收货';
+                        $link = '/pages/admin/orderDetail/index?id=' . $order['order_id'];
+                        $WechatTemplateList->sendAdminOrder($order['order_id'], $storeName, $title, $status, $link);
                         //企业微信通知
                         //企业微信通知
                         $EnterpriseWechat->sendMsg(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]);
                         $EnterpriseWechat->sendMsg(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]);
                         break;
                         break;
+                    //申请退款给客服发消息
+                    case 'send_order_apply_refund':
+                        $order = $data['order'];
+                        //站内信
+                        $SystemMsg->kefuSystemSend(['order_id' => $order['order_id']]);
+                        //短信
+                        $NoticeSms->sendAdminRefund($order);
+                        //企业微信通知
+                        $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]);
+                        //公众号
+                        $storeName = $orderInfoServices->getCarIdByProductTitle($order['id'], $order['cart_id']);
+                        $title = '亲,您有个退款订单待处理!';
+                        $status = '订单退款';
+                        $link = '/pages/admin/orderDetail/index?id=' . $order['refund_no'] . '&types=-3';
+                        $WechatTemplateList->sendAdminOrder($order['refund_no'], $storeName, $title, $status, $link);
+                        break;
+                    //提现申请给客服
+                    case 'kefu_send_extract_application':
+                        //站内信
+                        $SystemMsg->kefuSystemSend($data);
+                        //企业微信通知
+                        $EnterpriseWechat->sendMsg($data);
+                        break;
                 }
                 }
 
 
             }
             }

+ 5 - 8
crmeb/app/services/message/notice/SystemMsgService.php

@@ -16,7 +16,6 @@ use app\services\kefu\service\StoreServiceServices;
 use app\services\message\MessageSystemServices;
 use app\services\message\MessageSystemServices;
 use think\facade\Log;
 use think\facade\Log;
 
 
-
 /**
 /**
  * 短信发送消息列表
  * 短信发送消息列表
  * Created by PhpStorm.
  * Created by PhpStorm.
@@ -44,11 +43,11 @@ class SystemMsgService extends NoticeService
 
 
     }
     }
 
 
-
     /**
     /**
      * 发送消息
      * 发送消息
-     * @param $uid uid
-     * @param array $data 模板内容
+     * @param int $uid
+     * @param $data
+     * @return bool|void
      */
      */
     public function sendMsg(int $uid, $data)
     public function sendMsg(int $uid, $data)
     {
     {
@@ -80,8 +79,8 @@ class SystemMsgService extends NoticeService
 
 
     /**
     /**
      * 给客服发站内信
      * 给客服发站内信
-     * @param array $notceinfo
-     * @param array $data
+     * @param $data
+     * @return bool|void
      */
      */
     public function kefuSystemSend($data)
     public function kefuSystemSend($data)
     {
     {
@@ -114,6 +113,4 @@ class SystemMsgService extends NoticeService
             return true;
             return true;
         }
         }
     }
     }
-
-
 }
 }

+ 189 - 274
crmeb/app/services/message/notice/WechatTemplateListService.php

@@ -81,39 +81,42 @@ class WechatTemplateListService extends NoticeService
     }
     }
 
 
     /**
     /**
-     * 支付成功发送模板消息
-     * @param $uid
-     * @param $order
+     * 绑定成功通知
+     * @param string $uid
+     * @param string $userName
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPaySuccess($uid, $order)
+    public function sendBindSpreadUidSuccess(string $uid, string $userName)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您购买的商品已支付成功',
-            'keyword1' => $order['order_id'],
-            'keyword2' => $order['pay_price'],
-            'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id']);
+            'first' => '恭喜,加入您的团队',
+            'keyword1' => $userName,
+            'keyword2' => date('Y-m-d H:i:s', time()),
+            'remark' => '授人以鱼不如授人以渔,一起分享赚钱吧,点击查看详情'
+        ], '/pages/users/promoter-list/index');
     }
     }
 
 
     /**
     /**
-     * 购买会员成功
+     * 支付成功发送模板消息
      * @param $uid
      * @param $uid
      * @param $order
      * @param $order
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendMemberOrderPaySuccess($uid, $order)
+    public function sendOrderPaySuccess($uid, $order)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,购买会员成功,恭喜您成为本平台尊贵会员!',
+            'first' => '亲,您购买的商品已支付成功',
             'keyword1' => $order['order_id'],
             'keyword1' => $order['order_id'],
-            'keyword2' => $order['pay_price'],
+            'keyword2' => $order['storeName'],
+            'keyword3' => $order['pay_price'],
+            'keyword4' => $order['send_name'],
+            'keyword5' => date('Y-m-d H:i:s', $order['pay_time']),
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/annex/vip_paid/index');
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
-     * 订单发货
+     * 订单配送通知
      * @param $uid
      * @param $uid
      * @param string $goodsName
      * @param string $goodsName
      * @param $order
      * @param $order
@@ -123,61 +126,33 @@ class WechatTemplateListService extends NoticeService
     public function sendOrderDeliver($uid, string $goodsName, $order, array $data)
     public function sendOrderDeliver($uid, string $goodsName, $order, array $data)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的订单已发货,请注意查收',
-            'keyword1' => $goodsName,
-            'keyword2' => $order['pay_type'] == 'offline' ? '线下支付' : date('Y/m/d H:i', $order['pay_time']),
-            'keyword3' => $order['user_address'],
-            'keyword4' => $order['delivery_name'],
-            'keyword5' => $order['delivery_id'],
+            'first' => '亲,您的订单已开始送货,请注意查收',
+            'keyword1' => $order['order_id'],
+            'keyword2' => $order['pay_price'],
+            'keyword3' => $order['delivery_name'],
+            'keyword4' => $order['delivery_id'],
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id']);
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
      * 订单发货
      * 订单发货
      * @param $uid
      * @param $uid
      * @param $order
      * @param $order
-     * @param array $data
+     * @param $storeTitle
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPostage($uid, $order, array $data)
+    public function sendOrderPostage($uid, $order, $storeTitle)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'keyword1' => $order['order_id'],
-            'keyword2' => $order['delivery_name'],
-            'keyword3' => $order['delivery_id'],
             'first' => '亲,您的订单已发货,请注意查收',
             'first' => '亲,您的订单已发货,请注意查收',
+            'keyword1' => $order['order_id'],
+            'keyword2' => date('Y-m-d H:i:s', time()),
+            'keyword3' => $storeTitle,
+            'keyword4' => $order['delivery_name'],
+            'keyword5' => $order['delivery_id'],
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id']);
-    }
-
-    /**
-     * 发送客服消息
-     * @param $uid
-     * @param $data
-     * @return bool|void
-     */
-    public function sendServiceNotice($uid, $data)
-    {
-        return $this->sendTemplate((int)$uid, [
-            'keyword1' => '新订单',
-            'keyword2' => $data['delivery_name'],
-            'keyword3' => $data['delivery_id'],
-            'first' => '亲,您有新的订单待处理',
-            'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $data['order_id']);
-    }
-
-    /**
-     * 退款发送客服消息
-     * @param $uid
-     * @param $data
-     * @param string|null $link
-     * @return bool|void
-     */
-    public function sendRefundServiceNotice($uid, $data, ?string $link = null)
-    {
-        return $this->sendTemplate((int)$uid, $data, $link);
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
@@ -192,63 +167,65 @@ class WechatTemplateListService extends NoticeService
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
             'first' => '亲,您的订单已收货',
             'first' => '亲,您的订单已收货',
             'keyword1' => $order['order_id'],
             'keyword1' => $order['order_id'],
-            'keyword2' => '已收货',
-            'keyword3' => date('Y-m-d H:i:s', time()),
-            'keyword4' => $title,
+            'keyword2' => $title,
+            'keyword3' => $order['pay_price'],
+            'keyword4' => date('Y-m-d H:i:s', time()),
             'remark' => '感谢您的光临!'
             'remark' => '感谢您的光临!'
-        ]);
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
-     * 发送退款申请模板消息
+     * 订单改价
      * @param $uid
      * @param $uid
      * @param $order
      * @param $order
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderApplyRefund($uid, $order)
+    public function sendPriceRevision($uid, $order)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '你有一笔退款订单需要处理',
+            'first' => '亲,您的订单已改价',
             'keyword1' => $order['order_id'],
             'keyword1' => $order['order_id'],
-            'keyword2' => $order['status'],
+            'keyword2' => $order['storeName'],
             'keyword3' => date('Y-m-d H:i:s', $order['add_time']),
             'keyword3' => date('Y-m-d H:i:s', $order['add_time']),
-            'remark' => '点击查看退款详情'
-        ], '/pages/admin/orderDetail/index?id=' . $order['order_id']);
+            'keyword4' => $order['pay_price'],
+            'keyword5' => '未支付',
+            'remark' => '点击查看订单详情!'
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
      * 发送退款模板消息
      * 发送退款模板消息
      * @param $uid
      * @param $uid
-     * @param $data
      * @param $order
      * @param $order
+     * @param $title
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderRefundSuccess($uid, $data, $order)
+    public function sendOrderRefund($uid, $order, $title)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您购买的商品已退款,本次退款' . $data['refund_price'] . '金额',
-            'keyword1' => $data['order_id'],
-            'keyword2' => $order['pay_price'],
-            'keyword3' => date('Y-m-d H:i:s', $order['add_time']),
+            'first' => $title,
+            'keyword1' => $order['pay_price'],
+            'keyword2' => date('Y-m-d H:i:s', time()),
+            'keyword3' => $order['refund_no'],
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $data['order_id'] . '&isReturen=1');
+        ], '/pages/goods/order_details/index?order_id=' . $order['refund_no'] . '&isReturen=1');
     }
     }
 
 
     /**
     /**
-     * 发送退款模板消息
+     * 充值成功
      * @param $uid
      * @param $uid
      * @param $order
      * @param $order
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderRefundNoStatus($uid, $order)
+    public function sendRechargeSuccess($uid, $order)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的退款申请未申请通过',
-            'keyword1' => $order['order_id'],
-            'keyword2' => $order['pay_price'],
-            'keyword3' => date('Y-m-d H:i:s', $order['add_time']),
-            'remark' => '点击查看订单详情'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id'] . '&isReturen=1');
+            'first' => '亲,您的充值已成功',
+            'keyword1' => date('Y-m-d H:i:s', $order['add_time']),
+            'keyword2' => $order['price'],
+            'keyword3' => '充值成功',
+            'remark' => '感谢您的光临!'
+        ]);
     }
     }
 
 
     /**
     /**
@@ -261,85 +238,69 @@ class WechatTemplateListService extends NoticeService
     public function sendRechargeRefundStatus($uid, $data, $userRecharge)
     public function sendRechargeRefundStatus($uid, $data, $userRecharge)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您充值的金额已退款,本次退款' .
-                $data['refund_price'] . '金额',
-            'keyword1' => $userRecharge['order_id'],
-            'keyword2' => $userRecharge['price'],
-            'keyword3' => date('Y-m-d H:i:s', $userRecharge['add_time']),
+            'first' => '亲,您充值的金额已退款',
+            'keyword1' => $data['refund_price'],
+            'keyword2' => date('Y-m-d H:i:s', $userRecharge['add_time']),
+            'keyword3' => $userRecharge['order_id'],
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
         ], '/pages/users/user_bill/index');
         ], '/pages/users/user_bill/index');
     }
     }
 
 
     /**
     /**
-     * 拼团成功发送模板消息
-     * @param $uid
-     * @param $order_id
-     * @param $pinkId
-     * @param $title
-     * @return bool|void
-     */
-    public function sendOrderPinkSuccess($uid, $order_id, $pinkId, $title)
-    {
-        return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的拼团已经完成了',
-            'keyword1' => $order_id,
-            'keyword2' => $title,
-            'remark' => '点击查看订单详情'
-        ], '/pages/activity/goods_combination_status/index?id=' . $pinkId);
-    }
-
-    /**
-     * 参团成功发送模板消息
+     * 获得积分
      * @param $uid
      * @param $uid
-     * @param string $order_id
-     * @param string $title
-     * @param int $pink_id
+     * @param $order
+     * @param $data
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPinkUseSuccess($uid, string $order_id, string $title, int $pink_id)
+    public function sendUserIntegral($uid, $order, $data)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您已成功参与拼团',
-            'keyword1' => $order_id,
-            'keyword2' => $title,
-            'remark' => '点击查看订单详情'
-        ], '/pages/activity/goods_combination_status/index?id=' . $pink_id);
+            'first' => '亲,您的积分已到账',
+            'keyword1' => $data['storeTitle'],
+            'keyword2' => $order['pay_price'],
+            'keyword3' => $order['use_integral'],
+            'keyword4' => $data['give_integral'],
+            'keyword5' => date('Y-m-d H:i:s', $order['add_time']),
+            'remark' => '点击查看订单详情!'
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
     }
     }
 
 
     /**
     /**
-     * 取消拼团发送模板消息
-     * @param $uid
-     * @param $pink
-     * @param $title
+     * 佣金到账发送模板消息
+     * @param string $uid
+     * @param string $brokeragePrice
+     * @param $orderTime
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPinkClone($uid, $pink, $title)
+    public function sendOrderBrokerageSuccess(string $uid, string $brokeragePrice, $orderTime)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的拼团取消',
-            'keyword1' => $title,
-            'keyword2' => $pink->price,
-            'keyword3' => $pink->price,
-            'remark' => '点击查看订单详情'
-        ], '/pages/activity/goods_combination_status/index?id=' . $pink->id);
+            'first' => '亲,您有一笔佣金入账!',
+            'keyword1' => $brokeragePrice,//分销佣金
+            'keyword2' => date('Y-m-d H:i:s', $orderTime),//结算时间
+            'remark' => '点击查看佣金详情'
+        ], '/pages/users/user_spread_money/index?type=2');
     }
     }
 
 
     /**
     /**
-     * 拼团失败发送模板消息
+     * 砍价成功发送模板消息
      * @param $uid
      * @param $uid
-     * @param $pink
-     * @param $title
+     * @param $bargain
+     * @param array $bargainUser
+     * @param int $bargainUserId
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPinkFail($uid, $pink, $title)
+    public function sendBargainSuccess($uid, $bargain, $bargainUser = [], $bargainUserId = 0)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的拼团失败',
-            'keyword1' => $title,
-            'keyword2' => $pink->price,
-            'keyword3' => $pink->price,
+            'first' => '好腻害!你的朋友们已经帮你砍到底价了!',
+            'keyword1' => $bargain['title'],
+            'keyword2' => $bargain['price'],
+            'keyword3' => $bargain['min_price'],
+            'keyword4' => date('Y-m-d H:i:s', time()),
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/activity/goods_combination_status/index?id=' . $pink->id);
+        ], '/pages/activity/goods_bargain_details/index?id=' . $bargain['id'] . '&bargain=' . $bargainUserId);
     }
     }
 
 
     /**
     /**
@@ -354,181 +315,89 @@ class WechatTemplateListService extends NoticeService
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
             'first' => '您好,您已成功开团!赶紧与小伙伴们分享吧!!!',
             'first' => '您好,您已成功开团!赶紧与小伙伴们分享吧!!!',
             'keyword1' => $title,
             'keyword1' => $title,
-            'keyword2' => $pink['total_price'],
+            'keyword2' => $pink['nickname'],
             'keyword3' => $pink['people'],
             'keyword3' => $pink['people'],
+            'keyword4' => date('Y-m-d H:i:s', $pink['stop_time']),
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
         ], '/pages/activity/goods_combination_status/index?id=' . $pink['id']);
         ], '/pages/activity/goods_combination_status/index?id=' . $pink['id']);
     }
     }
 
 
     /**
     /**
-     * 砍价成功发送模板消息
+     * 参团成功发送模板消息
      * @param $uid
      * @param $uid
-     * @param $bargain
-     * @param array $bargainUser
-     * @param int $bargainUserId
-     * @return bool|void
-     */
-    public function sendBargainSuccess($uid, $bargain, $bargainUser = [], $bargainUserId = 0)
-    {
-        return $this->sendTemplate((int)$uid, [
-            'first' => '好腻害!你的朋友们已经帮你砍到底价了!',
-            'keyword1' => $bargain['title'],
-            'keyword2' => $bargain['min_price'],
-            'remark' => '点击查看订单详情'
-        ], '/pages/activity/goods_bargain_details/index?id=' . $bargain['id'] . '&bargain=' . $bargainUserId);
-    }
-
-    /**
-     * 佣金到账发送模板消息
-     * @param string $uid
-     * @param string $brokeragePrice
-     * @param string $goodsName
-     * @param string $goodsPrice
-     * @param $orderTime
+     * @param $orderInfo
+     * @param string $title
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderBrokerageSuccess(string $uid, string $brokeragePrice, string $goodsName, string $goodsPrice, $orderTime)
+    public function sendOrderPinkUseSuccess($uid, $orderInfo, string $title)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您有一笔佣金入账!',
-            'keyword1' => $brokeragePrice,//分销佣金
-            'keyword2' => $goodsPrice . "元",//交易金额
-            'keyword3' => date('Y-m-d H:i:s', $orderTime),//结算时间
+            'first' => '亲,您已成功参与拼团',
+            'keyword1' => $orderInfo['order_id'],
+            'keyword2' => $title,
+            'keyword3' => $orderInfo['pay_price'],
+            'keyword4' => '参团成功',
             'remark' => '点击查看订单详情'
             'remark' => '点击查看订单详情'
-        ], '/pages/users/user_spread_user/index');
-    }
-
-    /**
-     * 绑定推广关系发送消息提醒
-     * @param string $uid
-     * @param string $userName
-     * @return bool|void
-     */
-    public function sendBindSpreadUidSuccess(string $uid, string $userName)
-    {
-        return $this->sendTemplate((int)$uid, [
-            'first' => '恭喜,加入您的团队',
-            'keyword1' => $userName,
-            'keyword2' => date('Y-m-d H:i:s', time()),
-            'remark' => '授人以鱼不如授人以渔,一起分享赚钱吧,点击查看详情!'
-        ], '/pages/users/user_spread_user/index');
-    }
-
-    /**
-     * 新订单给客服提醒
-     * @param $order
-     * @return bool
-     */
-    public function sendAdminNewOrder($order)
-    {
-        /** @var StoreServiceServices $StoreServiceServices */
-        $StoreServiceServices = app()->make(StoreServiceServices::class);
-        $adminList = $StoreServiceServices->getStoreServiceOrderNotice();
-        foreach ($adminList as $item) {
-            $this->sendTemplate((int)$item['uid'],
-                [
-                    'keyword1' => '新订单',
-                    'keyword2' => $order['delivery_name'],
-                    'keyword3' => $order['delivery_id'],
-                    'first' => '亲,您有新的订单待处理',
-                    'remark' => '点击查看订单详情'
-                ], '/pages/admin/orderDetail/index?id=' . $order['order_id']);
-        }
-        return true;
-    }
-
-    /**
-     * 退款给客服提醒
-     * @param $order
-     * @return bool
-     */
-    public function sendAdminNewRefund($order)
-    {
-
-        /** @var StoreServiceServices $StoreServiceServices */
-        $StoreServiceServices = app()->make(StoreServiceServices::class);
-        $adminList = $StoreServiceServices->getStoreServiceOrderNotice();
-        foreach ($adminList as $item) {
-            $this->sendTemplate((int)$item['uid'],
-                [
-                    'keyword1' => '退款申请',
-                    'keyword2' => $order['delivery_name'],
-                    'keyword3' => $order['delivery_id'],
-                    'first' => '亲,您有个退款订单待处理',
-                    'remark' => '点击查看订单详情'
-                ], '/pages/admin/orderDetail/index?id=' . $order['order_id']);
-        }
-        return true;
+        ], '/pages/activity/goods_combination_status/index?id=' . $orderInfo['pink_id']);
     }
     }
 
 
     /**
     /**
-     * 订单改价
+     * 拼团成功发送模板消息
      * @param $uid
      * @param $uid
-     * @param $order
+     * @param $order_id
+     * @param $pinkId
+     * @param $title
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendPriceRevision($uid, $order)
+    public function sendOrderPinkSuccess($uid, $orderInfo, $title)
     {
     {
-        return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的订单已改价',
-            'keyword1' => $order['order_id'],
-            'keyword2' => $order['pay_price'],
-            'remark' => '点击查看订单详情!'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id']);
-    }
 
 
-    /**
-     * 充值成功
-     * @param $uid
-     * @param $order
-     * @return bool|void
-     */
-    public function sendRechargeSuccess($uid, $order)
-    {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的充值已成功',
-            'keyword1' => $uid,
-            'keyword2' => $order['price'],
-            'keyword3' => $order['order_id'],
-            'keyword4' => date('Y-m-d H:i:s', $order['add_time']),
-            'remark' => '感谢您的光临!'
-        ]);
+            'first' => '亲,您的拼团已经完成了',
+            'keyword1' => $orderInfo['order_id'],
+            'keyword2' => $title,
+            'keyword3' => $orderInfo['total_price'],
+            'keyword4' => '拼团完成',
+            'remark' => '点击查看订单详情'
+        ], '/pages/activity/goods_combination_status/index?id=' . $orderInfo['id']);
     }
     }
 
 
     /**
     /**
-     * 获得积分
+     * 取消拼团发送模板消息
      * @param $uid
      * @param $uid
-     * @param $order
+     * @param $pink
+     * @param $title
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendUserIntegral($uid, $order)
+    public function sendOrderPinkClone($uid, $pink, $title)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您的积分已到账',
-            'keyword1' => $uid,
-            'keyword2' => $order['pay_price'],
-            'keyword3' => $order['use_integral'],
-            'keyword4' => $order['gain_integral'],
-            'keyword5' => date('Y-m-d H:i:s', $order['add_time']),
-            'remark' => '点击查看订单详情!'
-        ], '/pages/users/order_details/index?order_id=' . $order['order_id']);
+            'first' => '亲,您的拼团取消',
+            'keyword1' => $pink['order_id'],
+            'keyword2' => $title,
+            'keyword3' => '拼团失败',
+            'keyword4' => '用户取消拼团',
+            'remark' => '点击查看订单详情'
+        ], '/pages/activity/goods_combination_status/index?id=' . $pink->id);
     }
     }
 
 
     /**
     /**
-     * 提醒付款通知
+     * 拼团失败发送模板消息
      * @param $uid
      * @param $uid
-     * @param $order
+     * @param $pink
+     * @param $title
      * @return bool|void
      * @return bool|void
      */
      */
-    public function sendOrderPayFalse($uid, $order)
+    public function sendOrderPinkFail($uid, $pink, $title)
     {
     {
         return $this->sendTemplate((int)$uid, [
         return $this->sendTemplate((int)$uid, [
-            'first' => '亲,您有订单还未付款',
-            'keyword1' => $order['order_id'],
-            'keyword2' => $order['pay_price'],
-            'keyword3' => date('Y-m-d H:i:s', $order['add_time']),
-            'remark' => '感谢您的光临!'
-        ]);
+            'first' => '亲,您的拼团失败',
+            'keyword1' => $pink['order_id'],
+            'keyword2' => $title,
+            'keyword3' => '拼团失败',
+            'keyword4' => '拼团时间超时',
+            'remark' => '点击查看订单详情'
+        ], '/pages/activity/goods_combination_status/index?id=' . $pink->id);
     }
     }
 
 
     /**
     /**
@@ -543,7 +412,8 @@ class WechatTemplateListService extends NoticeService
             'first' => '亲,您的提现申请已通过',
             'first' => '亲,您的提现申请已通过',
             'keyword1' => $extractNumber,
             'keyword1' => $extractNumber,
             'keyword2' => date('Y-m-d H:i:s', time()),
             'keyword2' => date('Y-m-d H:i:s', time()),
-            'keywords' => '已通过',
+            'keyword3' => '已通过',
+            'keyword4' => '已通过',
             'remark' => '感谢您的光临!'
             'remark' => '感谢您的光临!'
         ]);
         ]);
     }
     }
@@ -565,4 +435,49 @@ class WechatTemplateListService extends NoticeService
             'remark' => '请联系管理员!'
             'remark' => '请联系管理员!'
         ]);
         ]);
     }
     }
+
+    /**
+     * 提醒付款通知
+     * @param $uid
+     * @param $order
+     * @return bool|void
+     */
+    public function sendOrderPayFalse($uid, $order)
+    {
+        return $this->sendTemplate((int)$uid, [
+            'first' => '亲,您有订单还未付款',
+            'keyword1' => $order['pay_price'],
+            'keyword2' => $order['storeName'],
+            'keyword3' => $order['order_id'],
+            'remark' => '感谢您的光临!'
+        ], '/pages/goods/order_details/index?order_id=' . $order['order_id']);
+    }
+
+    /**
+     * 订单给客服提醒
+     * @param $orderId
+     * @param $storeName
+     * @param $title
+     * @param $status
+     * @param $link
+     * @return bool
+     */
+    public function sendAdminOrder($orderId, $storeName, $title, $status, $link)
+    {
+        /** @var StoreServiceServices $StoreServiceServices */
+        $StoreServiceServices = app()->make(StoreServiceServices::class);
+        $adminList = $StoreServiceServices->getStoreServiceOrderNotice();
+        foreach ($adminList as $item) {
+            $this->sendTemplate((int)$item['uid'],
+                [
+                    'first' => $title,
+                    'keyword1' => $orderId,
+                    'keyword2' => $storeName,
+                    'keyword3' => $status,
+                    'keyword4' => date('Y-m-d H:i:s', time()),
+                    'remark' => '点击查看订单详情'
+                ], $link);
+        }
+        return true;
+    }
 }
 }

+ 11 - 12
crmeb/app/services/order/OtherOrderServices.php

@@ -334,33 +334,32 @@ class OtherOrderServices extends BaseServices
             $orderInfo['phone'] = $userInfo['phone'];
             $orderInfo['phone'] = $userInfo['phone'];
             $capitalFlowServices->setFlow($orderInfo, $type);
             $capitalFlowServices->setFlow($orderInfo, $type);
         }
         }
-
-
-        //用户推送消息事件
-        event('notice.notice', [$orderInfo, 'order_pay_success']);
-        //支付成功给客服发送消息
-        event('notice.notice', [$orderInfo, 'admin_pay_success_code']);
         $res = $res1 && $res2 && $res3 && $res4;
         $res = $res1 && $res2 && $res3 && $res4;
         return false !== $res;
         return false !== $res;
     }
     }
 
 
     /**
     /**
      * 修改
      * 修改
-     * @param array $where
+     * @param $where
      * @param array $data
      * @param array $data
-     * @return mixed
+     * @return \crmeb\basic\BaseModel
      */
      */
-    public function update(array $where, array $data)
+    public function update($where, array $data)
     {
     {
         return $this->dao->update($where, $data);
         return $this->dao->update($where, $data);
     }
     }
 
 
     /**
     /**
      * 购买会员卡数据校验
      * 购买会员卡数据校验
-     * @param $memberType
-     * @param $pay_price
-     * @param $type
+     * @param string $memberType
+     * @param string $payPrice
+     * @param string $type
+     * @param $uid
+     * @param $mcId
      * @return array
      * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
      */
      */
     public function checkPayMemberType(string $memberType, string $payPrice, string $type, $uid, $mcId)
     public function checkPayMemberType(string $memberType, string $payPrice, string $type, $uid, $mcId)
     {
     {

+ 5 - 3
crmeb/app/services/order/StoreOrderDeliveryServices.php

@@ -22,6 +22,7 @@ use crmeb\exceptions\AdminException;
 use crmeb\exceptions\ApiException;
 use crmeb\exceptions\ApiException;
 use crmeb\services\FormBuilder as Form;
 use crmeb\services\FormBuilder as Form;
 use app\services\shipping\ExpressServices;
 use app\services\shipping\ExpressServices;
+use think\facade\Log;
 
 
 /**
 /**
  * 订单发货
  * 订单发货
@@ -439,9 +440,11 @@ class StoreOrderDeliveryServices extends BaseServices
         switch ($type) {
         switch ($type) {
             case 1://快递发货
             case 1://快递发货
                 $this->orderDeliverGoods($id, $data, $orderInfo, $storeName);
                 $this->orderDeliverGoods($id, $data, $orderInfo, $storeName);
+                event('notice.notice', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_postage_success']);
                 break;
                 break;
             case 2://配送
             case 2://配送
                 $this->orderDelivery($id, $data, $orderInfo, $storeName);
                 $this->orderDelivery($id, $data, $orderInfo, $storeName);
+                event('notice.notice', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_deliver_success']);
                 break;
                 break;
             case 3://虚拟发货
             case 3://虚拟发货
                 $this->orderVirtualDelivery($id, $data, $orderInfo, $storeName);
                 $this->orderVirtualDelivery($id, $data, $orderInfo, $storeName);
@@ -449,9 +452,8 @@ class StoreOrderDeliveryServices extends BaseServices
             default:
             default:
                 throw new AdminException(400522);
                 throw new AdminException(400522);
         }
         }
-        //用户推送消息事件
-        event('notice.notice', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_deliver_success']);
-        event('order.delivery', [$orderInfo, $storeName, $data, $type]);
+        //到期自动收货
+        event('order.orderDelivery', [$orderInfo, $storeName, $data, $type]);
         return true;
         return true;
     }
     }
 
 

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

@@ -948,7 +948,7 @@ class StoreOrderRefundServices extends BaseServices
         $refundData['refund_num'] = $refund_num;
         $refundData['refund_num'] = $refund_num;
         $refundData['refund_type'] = $refundType;
         $refundData['refund_type'] = $refundType;
         $refundData['refund_price'] = $refund_price;
         $refundData['refund_price'] = $refund_price;
-        $refundData['order_id'] = app()->make(StoreOrderCreateServices::class)->getNewOrderId('');
+        $refundData['order_id'] = $order['refund_no'] = app()->make(StoreOrderCreateServices::class)->getNewOrderId('');
         $refundData['add_time'] = time();
         $refundData['add_time'] = time();
         $refundData['cart_info'] = json_encode(array_column($cartInfos, 'cart_info'));
         $refundData['cart_info'] = json_encode(array_column($cartInfos, 'cart_info'));
         $refundData['is_pink_cancel'] = $isPink;
         $refundData['is_pink_cancel'] = $isPink;

+ 9 - 0
crmeb/app/services/order/StoreOrderSuccessServices.php

@@ -58,7 +58,12 @@ class StoreOrderSuccessServices extends BaseServices
      * 支付成功
      * 支付成功
      * @param array $orderInfo
      * @param array $orderInfo
      * @param string $paytype
      * @param string $paytype
+     * @param array $other
      * @return bool
      * @return bool
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
      */
      */
     public function paySuccess(array $orderInfo, string $paytype = PayServices::WEIXIN_PAY, array $other = [])
     public function paySuccess(array $orderInfo, string $paytype = PayServices::WEIXIN_PAY, array $other = [])
     {
     {
@@ -67,6 +72,9 @@ class StoreOrderSuccessServices extends BaseServices
         if ($other && isset($other['trade_no'])) {
         if ($other && isset($other['trade_no'])) {
             $updata['trade_no'] = $other['trade_no'];
             $updata['trade_no'] = $other['trade_no'];
         }
         }
+        /** @var StoreOrderCartInfoServices $orderInfoServices */
+        $orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
+        $orderInfo['storeName'] = $orderInfoServices->getCarIdByProductTitle((int)$orderInfo['id'], $orderInfo['cart_id']);
         $res1 = $this->dao->update($orderInfo['id'], $updata);
         $res1 = $this->dao->update($orderInfo['id'], $updata);
         $resPink = true;
         $resPink = true;
         if ($orderInfo['combination_id'] && $res1 && !$orderInfo['refund_status']) {
         if ($orderInfo['combination_id'] && $res1 && !$orderInfo['refund_status']) {
@@ -82,6 +90,7 @@ class StoreOrderSuccessServices extends BaseServices
             $luckLotteryServices = app()->make(LuckLotteryServices::class);
             $luckLotteryServices = app()->make(LuckLotteryServices::class);
             $luckLotteryServices->setCacheLotteryNum((int)$orderInfo['uid'], 'order');
             $luckLotteryServices->setCacheLotteryNum((int)$orderInfo['uid'], 'order');
         }
         }
+        $orderInfo['send_name'] = $orderInfo['real_name'];
         //订单支付成功后置事件
         //订单支付成功后置事件
         event('order.orderPaySuccess', [$orderInfo]);
         event('order.orderPaySuccess', [$orderInfo]);
         //用户推送消息事件
         //用户推送消息事件

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

@@ -134,6 +134,9 @@ class StoreOrderTakeServices extends BaseServices
      * @param $userInfo
      * @param $userInfo
      * @param $storeTitle
      * @param $storeTitle
      * @return bool
      * @return bool
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
      */
      */
     public function gainUserIntegral($order, $userInfo, $storeTitle)
     public function gainUserIntegral($order, $userInfo, $storeTitle)
     {
     {
@@ -159,6 +162,8 @@ class StoreOrderTakeServices extends BaseServices
             $integral = $userInfo['integral'] + $order['gain_integral'];
             $integral = $userInfo['integral'] + $order['gain_integral'];
             $userInfo->integral = $integral;
             $userInfo->integral = $integral;
             $res1 = false != $userInfo->save();
             $res1 = false != $userInfo->save();
+        } else {
+            $res2 = true;
         }
         }
         $order_integral = 0;
         $order_integral = 0;
 
 
@@ -175,7 +180,6 @@ class StoreOrderTakeServices extends BaseServices
                 }
                 }
             }
             }
             $order_integral = bcmul((string)$order_give_integral, (string)($order_integral ?: $order['pay_price']), 0);
             $order_integral = bcmul((string)$order_give_integral, (string)($order_integral ?: $order['pay_price']), 0);
-
             $res3 = false != $userBillServices->income('order_give_integral', $order['uid'], $order_integral, $userInfo['integral'] + $order_integral, $order['id']);
             $res3 = false != $userBillServices->income('order_give_integral', $order['uid'], $order_integral, $userInfo['integral'] + $order_integral, $order['id']);
             $integral = $userInfo['integral'] + $order_integral;
             $integral = $userInfo['integral'] + $order_integral;
             $userInfo->integral = $integral;
             $userInfo->integral = $integral;
@@ -316,7 +320,7 @@ class StoreOrderTakeServices extends BaseServices
                     $userBrokerageServices->income('get_pink_master_brokerage', $pinkMasterUid, [
                     $userBrokerageServices->income('get_pink_master_brokerage', $pinkMasterUid, [
                         'number' => floatval($pinkMasterPrice),
                         'number' => floatval($pinkMasterPrice),
                         'frozen_time' => $frozen_time
                         'frozen_time' => $frozen_time
-                    ], bcadd((string)$userInfo['brokerage_price'],$pinkMasterPrice,2), $orderInfo['id']);
+                    ], bcadd((string)$userInfo['brokerage_price'], $pinkMasterPrice, 2), $orderInfo['id']);
                 }
                 }
             }
             }
             if (!$combinationInfo['is_commission']) {
             if (!$combinationInfo['is_commission']) {

+ 7 - 7
crmeb/app/services/system/admin/AdminAuthServices.php

@@ -43,13 +43,13 @@ class AdminAuthServices extends BaseServices
      * @return array
      * @return array
      * @throws \Psr\SimpleCache\InvalidArgumentException
      * @throws \Psr\SimpleCache\InvalidArgumentException
      */
      */
-    public function parseToken(string $token): array
+    public function parseToken(string $token,int $code = 110003): array
     {
     {
         /** @var CacheService $cacheService */
         /** @var CacheService $cacheService */
         $cacheService = app()->make(CacheService::class);
         $cacheService = app()->make(CacheService::class);
 
 
         if (!$token || $token === 'undefined') {
         if (!$token || $token === 'undefined') {
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
         /** @var JwtAuth $jwtAuth */
         /** @var JwtAuth $jwtAuth */
         $jwtAuth = app()->make(JwtAuth::class);
         $jwtAuth = app()->make(JwtAuth::class);
@@ -60,7 +60,7 @@ class AdminAuthServices extends BaseServices
         $md5Token = md5($token);
         $md5Token = md5($token);
         if (!$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) {
         if (!$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) {
             $this->authFailAfter($id, $type);
             $this->authFailAfter($id, $type);
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
         //是否超出有效次数
         //是否超出有效次数
         if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) {
         if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) {
@@ -68,7 +68,7 @@ class AdminAuthServices extends BaseServices
                 $cacheService->clearToken($md5Token);
                 $cacheService->clearToken($md5Token);
             }
             }
             $this->authFailAfter($id, $type);
             $this->authFailAfter($id, $type);
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
 
 
 
 
@@ -84,7 +84,7 @@ class AdminAuthServices extends BaseServices
                 $cacheService->clearToken($md5Token);
                 $cacheService->clearToken($md5Token);
             }
             }
             $this->authFailAfter($id, $type);
             $this->authFailAfter($id, $type);
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
 
 
         //获取管理员信息
         //获取管理员信息
@@ -94,10 +94,10 @@ class AdminAuthServices extends BaseServices
                 $cacheService->clearToken($md5Token);
                 $cacheService->clearToken($md5Token);
             }
             }
             $this->authFailAfter($id, $type);
             $this->authFailAfter($id, $type);
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
         if ($pwd !== md5($adminInfo->pwd)) {
         if ($pwd !== md5($adminInfo->pwd)) {
-            throw new AuthException(110003);
+            throw new AuthException($code);
         }
         }
 
 
         $adminInfo->type = $type;
         $adminInfo->type = $type;

+ 38 - 0
crmeb/app/services/system/admin/SystemAdminServices.php

@@ -79,6 +79,35 @@ class SystemAdminServices extends BaseServices
         return $adminInfo;
         return $adminInfo;
     }
     }
 
 
+    /**
+     * 文件管理员登陆
+     * @param string $account
+     * @param string $password
+     * @return array|\think\Model
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function verifyFileLogin(string $account, string $password)
+    {
+        $adminInfo = $this->dao->accountByAdmin($account);
+        if (!$adminInfo) {
+            throw new AdminException(400594);
+        }
+        if (!$adminInfo->status) {
+            throw new AdminException(400595);
+        }
+        if (!password_verify($password, $adminInfo->file_pwd)) {
+            throw new AdminException(400140);
+        }
+        $adminInfo->last_time = time();
+        $adminInfo->last_ip = app('request')->ip();
+        $adminInfo->login_count++;
+        $adminInfo->save();
+
+        return $adminInfo;
+    }
+
     /**
     /**
      * 后台登陆获取菜单获取token
      * 后台登陆获取菜单获取token
      * @param string $account
      * @param string $account
@@ -327,6 +356,15 @@ class SystemAdminServices extends BaseServices
                 throw new AdminException(400264);
                 throw new AdminException(400264);
             $adminInfo->pwd = $this->passwordHash($data['new_pwd']);
             $adminInfo->pwd = $this->passwordHash($data['new_pwd']);
         }
         }
+        if($data['file_pwd'])
+        {
+            if($adminInfo->level != 0) throw new AdminException(400611);
+            if (!$data['conf_file_pwd'])
+                throw new AdminException(400263);
+            if($data['file_pwd'] != $data['conf_file_pwd'])
+                throw new AdminException(400264);
+            $adminInfo->file_pwd = $this->passwordHash($data['file_pwd']);
+        }
 
 
         $adminInfo->real_name = $data['real_name'];
         $adminInfo->real_name = $data['real_name'];
         $adminInfo->head_pic = $data['head_pic'];
         $adminInfo->head_pic = $data['head_pic'];

+ 86 - 3
crmeb/app/services/system/log/SystemFileServices.php

@@ -14,6 +14,7 @@ namespace app\services\system\log;
 
 
 use app\dao\system\log\SystemFileDao;
 use app\dao\system\log\SystemFileDao;
 use app\services\BaseServices;
 use app\services\BaseServices;
+use app\services\system\admin\SystemAdminServices;
 use crmeb\exceptions\AdminException;
 use crmeb\exceptions\AdminException;
 use crmeb\services\CacheService;
 use crmeb\services\CacheService;
 use crmeb\services\FileService as FileClass;
 use crmeb\services\FileService as FileClass;
@@ -35,6 +36,32 @@ class SystemFileServices extends BaseServices
         $this->dao = $dao;
         $this->dao = $dao;
     }
     }
 
 
+    /**
+     * @param array $admin
+     * @param string $password
+     * @param string $type
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     *
+     * @date 2022/09/07
+     * @author yyw
+     */
+    public function Login($account, string $password, string $type)
+    {
+        /** @var SystemAdminServices $adminServer */
+        $adminServer = app()->make(SystemAdminServices::class);
+        $adminInfo = $adminServer->verifyFileLogin($account, $password);
+        $tokenInfo = $this->createToken($adminInfo->id, $type,$adminInfo->pwd);
+        return [
+            'token' => $tokenInfo['token'],
+            'expires_time' => $tokenInfo['params']['exp'],
+        ];
+
+    }
+
+
     /**
     /**
      * 获取文件校验列表
      * 获取文件校验列表
      * @return array
      * @return array
@@ -191,11 +218,19 @@ class SystemFileServices extends BaseServices
             $rootdir = str_replace('\\', '\\\\', $rootdir);
             $rootdir = str_replace('\\', '\\\\', $rootdir);
         }
         }
         $list = array_merge($fileAll['dir'], $fileAll['file']);
         $list = array_merge($fileAll['dir'], $fileAll['file']);
+        $navList = [];
         foreach ($list as $key => $value) {
         foreach ($list as $key => $value) {
             $list[$key]['real_path'] = str_replace($rootdir, '', $value['pathname']);
             $list[$key]['real_path'] = str_replace($rootdir, '', $value['pathname']);
             $list[$key]['mtime'] = date('Y-m-d H:i:s', $value['mtime']);
             $list[$key]['mtime'] = date('Y-m-d H:i:s', $value['mtime']);
+
+            $navList[$key]['title'] = $value['filename'];
+            if($value['isDir']) $navList[$key]['loading'] = false;
+            $navList[$key]['children'] = [];
+            $navList[$key]['path'] = $value['path'];
+            $navList[$key]['isDir'] = $value['isDir'];
+            $navList[$key]['pathname'] = $value['pathname'];
         }
         }
-        return compact('dir', 'list');
+        return compact('dir', 'list','navList');
     }
     }
 
 
     //读取文件
     //读取文件
@@ -205,11 +240,16 @@ class SystemFileServices extends BaseServices
         $ext = FileClass::getExt($filepath);
         $ext = FileClass::getExt($filepath);
         $extarray = [
         $extarray = [
             'js' => 'text/javascript'
             'js' => 'text/javascript'
+            , 'htm' => 'text/html'
+            , 'shtml' => 'text/html'
+            , 'xml' => 'text/xml'
             , 'php' => 'text/x-php'
             , 'php' => 'text/x-php'
             , 'html' => 'text/html'
             , 'html' => 'text/html'
             , 'sql' => 'text/x-mysql'
             , 'sql' => 'text/x-mysql'
-            , 'css' => 'text/x-scss'];
-        $mode = empty($extarray[$ext]) ? '' : $extarray[$ext];
+            , 'css' => 'text/x-scss'
+            , 'txt'=>'text/plain'
+        ];
+        $mode = empty($extarray[$ext]) ? 'text/plain' : $extarray[$ext];
         return compact('content', 'mode', 'filepath');
         return compact('content', 'mode', 'filepath');
     }
     }
 
 
@@ -225,4 +265,47 @@ class SystemFileServices extends BaseServices
         }
         }
         return FileClass::writeFile($filepath, $comment);
         return FileClass::writeFile($filepath, $comment);
     }
     }
+
+
+    public function delFolder(string $path)
+    {
+        if (!file_exists($path)) {
+            return false;
+        }
+        if(is_file($path))
+        {
+            return unlink($path);
+        }
+        $dir = opendir($path);
+        while ($fileName = readdir($dir)) {
+            $file = $path . '/' . $fileName;
+            if ($fileName != '.' && $fileName != '..') {
+                if (is_dir($file)) {
+                    self::delDir($file);
+                } else {
+                    unlink($file);
+                }
+            }
+        }
+        closedir($dir);
+        return rmdir($path);
+    }
+
+    public function createFolder(string $path, int $permissions = 0755)
+    {
+        /** @var FileClass $fileClass */
+        $fileClass = app()->make(FileClass::class);
+        return $fileClass->createDir($path,$permissions);
+    }
+
+    public function createFile(string $path)
+    {
+        /** @var FileClass $fileClass */
+        $fileClass = app()->make(FileClass::class);
+        return $fileClass->createFile($path);
+    }
+    public function copyFolder($surDir,$toDir)
+    {
+        return FileClass::copyDir($surDir,$toDir);
+    }
 }
 }

+ 2 - 2
crmeb/config/ajcaptcha.php

@@ -25,11 +25,11 @@ return [
     'watermark' => [
     'watermark' => [
         'fontsize' => 12,
         'fontsize' => 12,
         'color' => '#000000',
         'color' => '#000000',
-        'text' => '我的水印'
+        'text' => 'CRMEB标准版'
     ],
     ],
     'cache' => [
     'cache' => [
         //若您使用了框架,并且想使用类似于redis这样的缓存驱动,则应换成框架的中的缓存驱动
         //若您使用了框架,并且想使用类似于redis这样的缓存驱动,则应换成框架的中的缓存驱动
-        'constructor' => [think\Facade\Cache::class, 'instance'],
+        'constructor' => app()->make(\think\Cache::class),
         'method' => [
         'method' => [
             //遵守PSR-16规范不需要设置此项(tp6, laravel,hyperf)。如tp5就不支持(tp5缓存方法是rm,所以要配置为"delete" => "rm")
             //遵守PSR-16规范不需要设置此项(tp6, laravel,hyperf)。如tp5就不支持(tp5缓存方法是rm,所以要配置为"delete" => "rm")
             /**
             /**

+ 1 - 1
crmeb/config/cookie.php

@@ -28,7 +28,7 @@ return [
     // 跨域header
     // 跨域header
     'header'    => [
     'header'    => [
         'Access-Control-Allow-Origin'       => '*',
         'Access-Control-Allow-Origin'       => '*',
-        'Access-Control-Allow-Headers'      => 'Authori-zation,Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With, Form-type, Cb-lang',
+        'Access-Control-Allow-Headers'      => 'Authori-zation,Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With, Form-type, Cb-lang, Invalid-zation',
         'Access-Control-Allow-Methods'      => 'GET,POST,PATCH,PUT,DELETE,OPTIONS,DELETE',
         'Access-Control-Allow-Methods'      => 'GET,POST,PATCH,PUT,DELETE,OPTIONS,DELETE',
         'Access-Control-Max-Age'            =>  '1728000',
         'Access-Control-Max-Age'            =>  '1728000',
         'Access-Control-Allow-Credentials'  => 'true'
         'Access-Control-Allow-Credentials'  => 'true'

+ 21 - 18
crmeb/public/install/crmeb.sql

@@ -33476,7 +33476,9 @@ INSERT INTO `eb_system_menus` (`id`, `pid`, `icon`, `menu_name`, `module`, `cont
 (1067, 25, '', '语言设置', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang', '25', 1, '', 0, 'admin-lang', 0),
 (1067, 25, '', '语言设置', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang', '25', 1, '', 0, 'admin-lang', 0),
 (1068, 1067, '', '语言列表', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/list', '12/1067', 1, '', 0, 'admin-lang-list', 0),
 (1068, 1067, '', '语言列表', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/list', '12/1067', 1, '', 0, 'admin-lang-list', 0),
 (1069, 1067, '', '语言详情', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/info', '12/1067', 1, '', 0, 'admin-lang-info', 0),
 (1069, 1067, '', '语言详情', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/info', '12/1067', 1, '', 0, 'admin-lang-info', 0),
-(1070, 1067, '', '国家列表', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/country', '25/1067', 1, '', 0, 'admin-lang-country', 0);
+(1070, 1067, '', '地区列表', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/lang/country', '25/1067', 1, '', 0, 'admin-lang-country', 0),
+(1071, 25, '', '文件管理', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/system/maintain/system_file/opendir', '25', 1, '', 0, 'system-maintain-system-file', 0);
+
 -- --------------------------------------------------------
 -- --------------------------------------------------------
 
 
 --
 --
@@ -33748,23 +33750,24 @@ INSERT INTO `eb_template_message` (`id`, `notification_id`, `type`, `tempkey`, `
 (12, 2, 0, '1927', '付款成功通知', '', '付款单号{{character_string1.DATA}}\n付款金额{{amount2.DATA}}\n付款时间{{date3.DATA}}', '', '', '1637554360', 1),
 (12, 2, 0, '1927', '付款成功通知', '', '付款单号{{character_string1.DATA}}\n付款金额{{amount2.DATA}}\n付款时间{{date3.DATA}}', '', '', '1637554360', 1),
 (14, 8, 0, '335', '积分到账提醒', '', '订单编号{{character_string2.DATA}}\n商品名称{{thing3.DATA}}\n支付金额{{amount4.DATA}}\n获得积分{{number5.DATA}}\n累计积分{{number6.DATA}}', '', '', '1637554360', 1),
 (14, 8, 0, '335', '积分到账提醒', '', '订单编号{{character_string2.DATA}}\n商品名称{{thing3.DATA}}\n支付金额{{amount4.DATA}}\n获得积分{{number5.DATA}}\n累计积分{{number6.DATA}}', '', '', '1637554360', 1),
 (15, 12, 0, '3353', '拼团状态通知', '', '商品名称{{thing2.DATA}}\n拼团人数{{thing1.DATA}}\n备注{{thing3.DATA}}', '', '', '1637554360', 1),
 (15, 12, 0, '3353', '拼团状态通知', '', '商品名称{{thing2.DATA}}\n拼团人数{{thing1.DATA}}\n备注{{thing3.DATA}}', '', '', '1637554360', 1),
-(16, 21, 1, 'OPENTM200565259', '订单发货提醒', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n物流公司:{{keyword2.DATA}}\n物流单号:{{keyword3.DATA}}\n{{remark.DATA}}', '', '', '1515052638', 1),
-(17, 3, 1, 'OPENTM413386489', '订单收货通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n订单状态:{{keyword2.DATA}}\n收货时间:{{keyword3.DATA}}\n商品详情:{{keyword4.DATA}}\n{{remark.DATA}}', '', '', '1515052765', 1),
-(18, 5, 1, 'OPENTM410119152', '退款进度通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n订单金额:{{keyword2.DATA}}\n下单时间:{{keyword3.DATA}}\n{{remark.DATA}}', '', '', '1515053049', 1),
-(20, 20, 1, 'OPENTM207707249', '订单发货提醒', '', '{{first.DATA}}\r\n商品明细:{{keyword1.DATA}}\r\n下单时间:{{keyword2.DATA}}\r\n配送地址:{{keyword3.DATA}}\r\n配送人:{{keyword4.DATA}}\r\n联系电话:{{keyword5.DATA}}\r\n{{remark.DATA}}', '', '', '1515053313', 1),
-(23, 11, 1, 'OPENTM407456411', '拼团成功通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n团购商品:{{keyword2.DATA}}\n{{remark.DATA}}', '', '', '1520063823', 1),
-(24, 12, 1, 'OPENTM401113750', '拼团失败通知', '', '{{first.DATA}}\n拼团商品:{{keyword1.DATA}}\n商品金额:{{keyword2.DATA}}\n退款金额:{{keyword3.DATA}}\n{{remark.DATA}}', '', '', '1520064059', 1),
-(26, 2, 1, 'OPENTM207791277', '订单支付成功通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n支付金额:{{keyword2.DATA}}\n{{remark.DATA}}', '', '', '1528966759', 1),
-(27, 10, 1, 'OPENTM410292733', '砍价成功提醒', '', '{{first.DATA}}\n商品名称:{{keyword1.DATA}}\n底价:{{keyword2.DATA}}\n{{remark.DATA}}', '', '', '1564566678', 1),
-(28, 23, 1, 'OPENTM414349441', '开团成功通知', '', '{{first.DATA}}\n拼团名称:{{keyword1.DATA}}\n团购价格:{{keyword2.DATA}}\n拼团人数:{{keyword3.DATA}}\n{{remark.DATA}}', '', '', '1564567037', 1),
-(30, 9, 1, 'OPENTM409909643', '佣金到账提醒', '', '{{first.DATA}}\r\n分销佣金:{{keyword1.DATA}}\r\n交易金额:{{keyword2.DATA}}\r\n结算时间:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1602500478', 1),
-(31, 1, 1, 'OPENTM410239001', '下级推广者绑定成功提醒', '', '{{first.DATA}}\r\n关联用户:{{keyword1.DATA}}\r\n关联说明:{{keyword2.DATA}}\r\n{{remark.DATA}}', '', '', '1602558146', 1),
-(36, 4, 1, 'OPENTM410137124', '改价提醒发送', '', '{{first.DATA}}\r\n订单编号:{{keyword1.DATA}}\r\n订单金额:{{keyword2.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
-(37, 7, 1, 'OPENTM411706852', '充值成功提醒发送', '', '{{first.DATA}}\r\n会员账号:{{keyword1.DATA}}\r\n充值金额:{{keyword2.DATA}}\r\n充值订单:{{keyword3.DATA}}\r\n充值时间:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
-(38, 14, 1, 'OPENTM418265600', '提现成功提醒发送', '', '{{first.DATA}}\r\n提现金额:{{keyword1.DATA}}\r\n申请时间:{{keyword2.DATA}}\r\n提现状态:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
-(39, 15, 1, 'OPENTM408529050', '提现失败提醒发送', '', '{{first.DATA}}\r\n提现金额:{{keyword1.DATA}}\r\n提现时间:{{keyword2.DATA}}\r\n失败原因:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
-(40, 26, 1, 'OPENTM413741318', '提醒付款通知', '', '{{first.DATA}}\r\n订单编号:{{keyword1.DATA}}\r\n订单金额:{{keyword2.DATA}}\r\n下单时间:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
-(41, 8, 1, 'OPENTM418252271', '积分到账提醒发送', '', '{{first.DATA}}\r\n会员ID:{{keyword1.DATA}}\r\n消费金额:{{keyword2.DATA}}\r\n使用积分:{{keyword3.DATA}}\r\n获得积分:{{keyword4.DATA}}\r\n时间:{{keyword5.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1);
+(16, 21, 1, 'OPENTM415939287', '订单发货通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n发货日期:{{keyword2.DATA}}\n商品详细:{{keyword3.DATA}}\n物流公司:{{keyword4.DATA}}\n物流单号:{{keyword5.DATA}}\n{{remark.DATA}}', '', '', '1515052638', 1),
+(17, 3, 1, 'OPENTM418528119', '订单收货通知', '', '{{first.DATA}}\n订单编号:{{keyword1.DATA}}\n商品名称:{{keyword2.DATA}}\n金额:{{keyword3.DATA}}\n时间:{{keyword4.DATA}}\n{{remark.DATA}}', '', '', '1515052765', 1),
+(18, 5, 1, 'OPENTM207284059', '退款通知', '', '{{first.DATA}}\r\n退款金额:{{keyword1.DATA}}\r\n退款时间:{{keyword2.DATA}}\r\n订单编号:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1515053049', 1),
+(20, 20, 1, 'OPENTM416122303', '订单配送通知', '', '{{first.DATA}}\r\n订单编号:{{keyword1.DATA}}\r\n订单金额:{{keyword2.DATA}}\r\n配送员:{{keyword3.DATA}}\r\n联系电话:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1515053313', 1),
+(23, 11, 1, 'OPENTM409367318', '拼团成功通知', '', '{{first.DATA}}\r\n订单号:{{keyword1.DATA}}\r\n商品信息:{{keyword2.DATA}}\r\n拼团价格:{{keyword3.DATA}}\r\n组团信息:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1520063823', 1),
+(24, 12, 1, 'OPENTM418350969', '拼团失败通知', '', '{{first.DATA}}\r\n订单号:{{keyword1.DATA}}\r\n商品信息:{{keyword2.DATA}}\r\n失败类型:{{keyword3.DATA}}\r\n失败原因:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1520064059', 1),
+(26, 2, 1, 'OPENTM418062102', '订单支付成功通知', '', '{{first.DATA}}\n订单号:{{keyword1.DATA}}\n商品名称:{{keyword2.DATA}}\n支付金额:{{keyword3.DATA}}\n下单人:{{keyword4.DATA}}\n订单支付时间:{{keyword5.DATA}}\n{{remark.DATA}}', '', '', '1528966759', 1),
+(27, 10, 1, 'OPENTM418554923', '砍价成功通知', '', '{{first.DATA}}\n商品名称:{{keyword1.DATA}}\n底价:{{keyword2.DATA}}\n{{remark.DATA}}', '', '', '1564566678', 1),
+(28, 23, 1, 'OPENTM410867947', '开团成功提醒', '', '{{first.DATA}}\r\n商品信息:{{keyword1.DATA}}\r\n团长:{{keyword2.DATA}}\r\n拼团人数:{{keyword3.DATA}}\r\n截止时间:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1564567037', 1),
+(30, 9, 1, 'OPENTM400590844', '佣金提醒', '', '{{first.DATA}}\r\n佣金金额:{{keyword1.DATA}}\r\n时间:{{keyword2.DATA}}\r\n{{remark.DATA}}', '', '', '1602500478', 1),
+(31, 1, 1, 'OPENTM409880752', '绑定成功通知', '', '{{first.DATA}}\r\n姓名:{{keyword1.DATA}}\r\n绑定时间:{{keyword2.DATA}}\r\n{{remark.DATA}}', '', '', '1602558146', 1),
+(36, 4, 1, 'OPENTM401202515', '订单修改价格通知', '', '{{first.DATA}}\n订单号:{{keyword1.DATA}}\n商品名称:{{keyword2.DATA}}\n下单时间:{{keyword3.DATA}}\n订单总价:{{keyword4.DATA}}\n订单状态:{{keyword5.DATA}}\n{{remark.DATA}}', '', '', '1632305076', 1),
+(37, 7, 1, 'OPENTM414089457', '充值成功通知', '', '{{first.DATA}}\r\n充值时间:{{keyword1.DATA}}\r\n充值金额:{{keyword2.DATA}}\r\n充值状态:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
+(38, 14, 1, 'OPENTM405876306', '提现审核通知', '', '{{first.DATA}}\n提现金额:{{keyword1.DATA}}\n申请时间:{{keyword2.DATA}}\n审核状态:{{keyword3.DATA}}\n原因说明:{{keyword4.DATA}}\n{{remark.DATA}}', '', '', '1632305076', 1),
+(39, 15, 1, 'OPENTM403167119', '提现失败通知', '', '{{first.DATA}}\r\n提现金额:{{keyword1.DATA}}\r\n提现时间:{{keyword2.DATA}}\r\n原因说明:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
+(40, 26, 1, 'OPENTM408199008', '订单待支付提醒', '', '{{first.DATA}}\r\n订单金额:{{keyword1.DATA}}\r\n订单详情:{{keyword2.DATA}}\r\n订单编号:{{keyword3.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
+(41, 8, 1, 'OPENTM201661503', '消费成功通知', '', '{{first.DATA}}\r\n商品名称:{{keyword1.DATA}}\r\n消费金额:{{keyword2.DATA}}\r\n抵扣积分:{{keyword3.DATA}}\r\n获得积分:{{keyword4.DATA}}\r\n消费时间:{{keyword5.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1),
+(42, 8, 1, 'OPENTM415269411', '订单进度提醒', '', '{{first.DATA}}\r\n订单编号:{{keyword1.DATA}}\r\n订单内容:{{keyword2.DATA}}\r\n订单状态:{{keyword3.DATA}}\r\n时间:{{keyword4.DATA}}\r\n{{remark.DATA}}', '', '', '1632305076', 1);
 
 
 -- --------------------------------------------------------
 -- --------------------------------------------------------