Преглед изворни кода

更新小程序订阅消息

liaofei пре 6 година
родитељ
комит
caf64b5266
100 измењених фајлова са 3849 додато и 3153 уклоњено
  1. 2 2
      crmeb/.constant
  2. 1 1
      crmeb/.version
  3. 215 210
      crmeb/app/admin/controller/Index.php
  4. 1 7
      crmeb/app/admin/controller/finance/UserRecharge.php
  5. 37 31
      crmeb/app/admin/controller/routine/RoutineTemplate.php
  6. 2 1
      crmeb/app/admin/controller/system/Clear.php
  7. 165 91
      crmeb/app/admin/controller/system/SystemCleardata.php
  8. 446 411
      crmeb/app/admin/controller/user/User.php
  9. 647 627
      crmeb/app/admin/model/order/StoreOrder.php
  10. 677 616
      crmeb/app/admin/model/user/User.php
  11. 170 171
      crmeb/app/admin/model/user/UserExtract.php
  12. 1 0
      crmeb/app/admin/view/index/index.php
  13. 35 0
      crmeb/app/admin/view/order/store_order/order_spread_user.php
  14. 1 1
      crmeb/app/admin/view/system/system_cleardata/index.php
  15. 21 11
      crmeb/app/admin/view/widget/images.php
  16. 0 5
      crmeb/app/api/controller/AuthController.php
  17. 23 23
      crmeb/app/api/controller/PublicController.php
  18. 42 22
      crmeb/app/api/controller/wechat/AuthController.php
  19. 9 7
      crmeb/app/api/controller/wechat/WechatController.php
  20. 37 22
      crmeb/app/common.php
  21. 196 71
      crmeb/app/models/routine/RoutineTemplate.php
  22. 2 1
      crmeb/app/models/store/StoreCategory.php
  23. 230 245
      crmeb/app/models/store/StoreOrder.php
  24. 356 332
      crmeb/app/models/store/StorePink.php
  25. 25 21
      crmeb/app/models/store/StoreProduct.php
  26. 12 11
      crmeb/app/models/system/SystemStore.php
  27. 18 18
      crmeb/app/models/user/User.php
  28. 1 1
      crmeb/app/models/user/WechatUser.php
  29. 4 3
      crmeb/crmeb/repositories/NoticeRepositories.php
  30. 25 14
      crmeb/crmeb/repositories/OrderRepository.php
  31. 6 2
      crmeb/crmeb/services/CacheService.php
  32. 27 27
      crmeb/crmeb/services/GroupDataService.php
  33. 26 2
      crmeb/crmeb/services/MiniProgramService.php
  34. 89 0
      crmeb/crmeb/services/SubscribeTemplateService.php
  35. 29 15
      crmeb/crmeb/services/UploadService.php
  36. 1 0
      crmeb/crmeb/services/YLYService.php
  37. 6 13
      crmeb/crmeb/traits/LogicTrait.php
  38. 115 94
      crmeb/crmeb/traits/ModelTrait.php
  39. 30 9
      crmeb/crmeb/utils/ProgramSubscribe.php
  40. 25 15
      crmeb/crmeb/utils/Template.php
  41. 1 0
      crmeb/public/h5/css/app.e41a6242.css
  42. 1 0
      crmeb/public/h5/css/chunk-06379026.43b190c8.css
  43. 1 0
      crmeb/public/h5/css/chunk-22637d46.ab18b94f.css
  44. 1 0
      crmeb/public/h5/css/chunk-275e4407.4765fa5a.css
  45. 1 0
      crmeb/public/h5/css/chunk-40ea473b.d02dea3c.css
  46. 1 0
      crmeb/public/h5/css/chunk-454f76eb.f58dbaf2.css
  47. 1 0
      crmeb/public/h5/css/chunk-47d0e48c.5dae48a7.css
  48. 1 0
      crmeb/public/h5/css/chunk-61f534f5.114b89a4.css
  49. 1 0
      crmeb/public/h5/css/chunk-6c70f5b1.1ebefd18.css
  50. 1 0
      crmeb/public/h5/css/chunk-a540307a.42feabe3.css
  51. 2 0
      crmeb/public/h5/js/app.9466dfb6.js
  52. 1 0
      crmeb/public/h5/js/app.9466dfb6.js.map
  53. 2 0
      crmeb/public/h5/js/app.edbed276.js
  54. 1 0
      crmeb/public/h5/js/app.edbed276.js.map
  55. 2 0
      crmeb/public/h5/js/chunk-03b2ddff.16d81690.js
  56. 1 0
      crmeb/public/h5/js/chunk-03b2ddff.16d81690.js.map
  57. 2 0
      crmeb/public/h5/js/chunk-06379026.730c506e.js
  58. 1 0
      crmeb/public/h5/js/chunk-06379026.730c506e.js.map
  59. 2 0
      crmeb/public/h5/js/chunk-074d26c0.4c8f6e53.js
  60. 1 0
      crmeb/public/h5/js/chunk-074d26c0.4c8f6e53.js.map
  61. 2 0
      crmeb/public/h5/js/chunk-0b32185c.307181ee.js
  62. 1 0
      crmeb/public/h5/js/chunk-0b32185c.307181ee.js.map
  63. 2 0
      crmeb/public/h5/js/chunk-126715f2.3cacb4ce.js
  64. 1 0
      crmeb/public/h5/js/chunk-126715f2.3cacb4ce.js.map
  65. 2 0
      crmeb/public/h5/js/chunk-146ed97a.7a6fabd0.js
  66. 1 0
      crmeb/public/h5/js/chunk-146ed97a.7a6fabd0.js.map
  67. 2 0
      crmeb/public/h5/js/chunk-2107f928.a047a5de.js
  68. 1 0
      crmeb/public/h5/js/chunk-2107f928.a047a5de.js.map
  69. 2 0
      crmeb/public/h5/js/chunk-22637d46.bf9fd936.js
  70. 1 0
      crmeb/public/h5/js/chunk-22637d46.bf9fd936.js.map
  71. 2 0
      crmeb/public/h5/js/chunk-249cbda8.3a11a19d.js
  72. 1 0
      crmeb/public/h5/js/chunk-249cbda8.3a11a19d.js.map
  73. 2 0
      crmeb/public/h5/js/chunk-275e4407.b6b5e06d.js
  74. 1 0
      crmeb/public/h5/js/chunk-275e4407.b6b5e06d.js.map
  75. 2 0
      crmeb/public/h5/js/chunk-293c3d87.7aa109ae.js
  76. 1 0
      crmeb/public/h5/js/chunk-293c3d87.7aa109ae.js.map
  77. 2 0
      crmeb/public/h5/js/chunk-2d0b995a.41d89d52.js
  78. 1 0
      crmeb/public/h5/js/chunk-2d0b995a.41d89d52.js.map
  79. 2 0
      crmeb/public/h5/js/chunk-2d0c1002.f548018e.js
  80. 1 0
      crmeb/public/h5/js/chunk-2d0c1002.f548018e.js.map
  81. 12 0
      crmeb/public/h5/js/chunk-2d0c4265.e0056573.js
  82. 1 0
      crmeb/public/h5/js/chunk-2d0c4265.e0056573.js.map
  83. 2 0
      crmeb/public/h5/js/chunk-2d0d0177.88479f7f.js
  84. 1 0
      crmeb/public/h5/js/chunk-2d0d0177.88479f7f.js.map
  85. 2 0
      crmeb/public/h5/js/chunk-2d0d3247.a21c1d5c.js
  86. 1 0
      crmeb/public/h5/js/chunk-2d0d3247.a21c1d5c.js.map
  87. 2 0
      crmeb/public/h5/js/chunk-2d0d6b8d.824173a6.js
  88. 1 0
      crmeb/public/h5/js/chunk-2d0d6b8d.824173a6.js.map
  89. 2 0
      crmeb/public/h5/js/chunk-2d0da964.cb78b008.js
  90. 1 0
      crmeb/public/h5/js/chunk-2d0da964.cb78b008.js.map
  91. 2 0
      crmeb/public/h5/js/chunk-2d0f0b4a.9e8ad235.js
  92. 1 0
      crmeb/public/h5/js/chunk-2d0f0b4a.9e8ad235.js.map
  93. 2 0
      crmeb/public/h5/js/chunk-2d21f45b.cfd48a51.js
  94. 1 0
      crmeb/public/h5/js/chunk-2d21f45b.cfd48a51.js.map
  95. 2 0
      crmeb/public/h5/js/chunk-2d5271a2.9c35a64c.js
  96. 1 0
      crmeb/public/h5/js/chunk-2d5271a2.9c35a64c.js.map
  97. 2 0
      crmeb/public/h5/js/chunk-2df2bc60.e89fcf32.js
  98. 1 0
      crmeb/public/h5/js/chunk-2df2bc60.e89fcf32.js.map
  99. 2 0
      crmeb/public/h5/js/chunk-352a53ed.d0c010cf.js
  100. 0 0
      crmeb/public/h5/js/chunk-352a53ed.d0c010cf.js.map

+ 2 - 2
crmeb/.constant

@@ -1,3 +1,3 @@
 <?php
-define('INSTALL_DATE',1567993973);
-define('SERIALNUMBER','BaoWxF');
+define('INSTALL_DATE',1576029123);
+define('SERIALNUMBER','Xwdc05');

+ 1 - 1
crmeb/.version

@@ -1,2 +1,2 @@
-version=CRMEB-KYDT v3.1.2
+version=CRMEB-KYDT v3.1.3
 version_code=134

Разлика између датотеке није приказан због своје велике величине
+ 215 - 210
crmeb/app/admin/controller/Index.php


+ 1 - 7
crmeb/app/admin/controller/finance/UserRecharge.php

@@ -127,13 +127,7 @@ SCRIPT;
                 ],Url::buildUrl('/user/bill/2')->suffix(false)->build());
                 break;
             case 'routine':
-                RoutineTemplate::sendOut('ORDER_REFUND_SUCCESS',$UserRecharge['uid'],[
-                    'keyword1'=>$UserRecharge['order_id'],
-                    'keyword2'=>date('Y-m-d H:i:s',time()),
-                    'keyword3'=>$UserRecharge['price'],
-                    'keyword4'=>'余额充值退款',
-                    'keyword5'=>'亲,您充值的金额已退款,本次退款'. $data['refund_price'].'金额',
-                ]);
+                RoutineTemplate::sendRechargeSuccess($UserRecharge,$data['refund_price']);
                 break;
         }
         UserBill::expend('系统退款',$UserRecharge['uid'],'now_money','user_recharge_refund',$refund_price,$id,$UserRecharge['price'],'退款给用户'.$refund_price.'元');

+ 37 - 31
crmeb/app/admin/controller/routine/RoutineTemplate.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\routine;
 
 use app\admin\controller\AuthController;
+use crmeb\services\CacheService;
 use crmeb\services\FormBuilder as Form;
 use crmeb\services\UtilService as Util;
 use crmeb\services\JsonService as Json;
@@ -19,10 +20,10 @@ class RoutineTemplate extends AuthController
     public function index()
     {
         $where = Util::getMore([
-            ['name',''],
-            ['status','']
-        ],$this->request);
-        $this->assign('where',$where);
+            ['name', ''],
+            ['status', '']
+        ], $this->request);
+        $this->assign('where', $where);
         $this->assign(RoutineTemplateModel::SystemPage($where));
         return $this->fetch();
     }
@@ -34,15 +35,16 @@ class RoutineTemplate extends AuthController
     public function create()
     {
         $f = array();
-        $f[] = Form::input('tempkey','模板编号');
-        $f[] = Form::input('tempid','模板ID');
-        $f[] = Form::input('name','模板名');
-        $f[] = Form::input('content','回复内容')->type('textarea');
-        $f[] = Form::radio('status','状态',1)->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
-        $form = Form::make_post_form('添加模板消息',$f,Url::buildUrl('save'));
+        $f[] = Form::input('tempkey', '模板编号');
+        $f[] = Form::input('tempid', '模板ID');
+        $f[] = Form::input('name', '模板名');
+        $f[] = Form::input('content', '回复内容')->type('textarea');
+        $f[] = Form::radio('status', '状态', 1)->options([['label' => '开启', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
+        $form = Form::make_post_form('添加模板消息', $f, Url::buildUrl('save'));
         $this->assign(compact('form'));
         return $this->fetch('public/form-builder');
     }
+
     public function save()
     {
         $data = Util::postMore([
@@ -50,16 +52,17 @@ class RoutineTemplate extends AuthController
             'tempid',
             'name',
             'content',
-            ['status',0]
+            ['status', 0]
         ]);
-        if($data['tempkey'] == '') return Json::fail('请输入模板编号');
-        if($data['tempkey'] != '' && RoutineTemplateModel::be($data['tempkey'],'tempkey'))
+        if ($data['tempkey'] == '') return Json::fail('请输入模板编号');
+        if ($data['tempkey'] != '' && RoutineTemplateModel::be($data['tempkey'], 'tempkey'))
             return Json::fail('请输入模板编号已存在,请重新输入');
-        if($data['tempid'] == '') return Json::fail('请输入模板ID');
-        if($data['name'] == '') return Json::fail('请输入模板名');
-        if($data['content'] == '') return Json::fail('请输入回复内容');
+        if ($data['tempid'] == '') return Json::fail('请输入模板ID');
+        if ($data['name'] == '') return Json::fail('请输入模板名');
+        if ($data['content'] == '') return Json::fail('请输入回复内容');
         $data['add_time'] = time();
         RoutineTemplateModel::create($data);
+        CacheService::clear();
         return Json::successful('添加模板消息成功!');
     }
 
@@ -70,15 +73,15 @@ class RoutineTemplate extends AuthController
      */
     public function edit($id)
     {
-        if(!$id) return $this->failed('数据不存在');
+        if (!$id) return $this->failed('数据不存在');
         $product = RoutineTemplateModel::get($id);
-        if(!$product) return Json::fail('数据不存在!');
+        if (!$product) return Json::fail('数据不存在!');
         $f = array();
-        $f[] = Form::input('tempkey','模板编号',$product->getData('tempkey'))->disabled(1);
-        $f[] = Form::input('name','模板名',$product->getData('name'))->disabled(1);
-        $f[] = Form::input('tempid','模板ID',$product->getData('tempid'));
-        $f[] = Form::radio('status','状态',$product->getData('status'))->options([['label'=>'开启','value'=>1],['label'=>'关闭','value'=>0]]);
-        $form = Form::make_post_form('编辑模板消息',$f,Url::buildUrl('update',compact('id')));
+        $f[] = Form::input('tempkey', '模板编号', $product->getData('tempkey'))->disabled(1);
+        $f[] = Form::input('name', '模板名', $product->getData('name'))->disabled(1);
+        $f[] = Form::input('tempid', '模板ID', $product->getData('tempid'));
+        $f[] = Form::radio('status', '状态', $product->getData('status'))->options([['label' => '开启', 'value' => 1], ['label' => '关闭', 'value' => 0]]);
+        $form = Form::make_post_form('编辑模板消息', $f, Url::buildUrl('update', compact('id')));
         $this->assign(compact('form'));
         return $this->fetch('public/form-builder');
     }
@@ -87,13 +90,14 @@ class RoutineTemplate extends AuthController
     {
         $data = Util::postMore([
             'tempid',
-            ['status',0]
+            ['status', 0]
         ]);
-        if($data['tempid'] == '') return Json::fail('请输入模板ID');
-        if(!$id) return $this->failed('数据不存在');
+        if ($data['tempid'] == '') return Json::fail('请输入模板ID');
+        if (!$id) return $this->failed('数据不存在');
         $product = RoutineTemplateModel::get($id);
-        if(!$product) return Json::fail('数据不存在!');
-        RoutineTemplateModel::edit($data,$id);
+        if (!$product) return Json::fail('数据不存在!');
+        RoutineTemplateModel::edit($data, $id);
+        CacheService::clear();
         return Json::successful('修改成功!');
     }
 
@@ -104,11 +108,13 @@ class RoutineTemplate extends AuthController
      */
     public function delete($id)
     {
-        if(!$id) return Json::fail('数据不存在!');
-        if(!RoutineTemplateModel::del($id))
+        if (!$id) return Json::fail('数据不存在!');
+        if (!RoutineTemplateModel::del($id))
             return Json::fail(RoutineTemplateModel::getErrorInfo('删除失败,请稍候再试!'));
-        else
+        else {
+            CacheService::clear();
             return Json::successful('删除成功!');
+        }
     }
 
 

+ 2 - 1
crmeb/app/admin/controller/system/Clear.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller\system;
 
 use app\admin\controller\AuthController;
+use crmeb\services\CacheService;
 use crmeb\services\JsonService as Json;
 
 /**
@@ -48,7 +49,7 @@ class Clear extends AuthController
                 }
             }
         }
-
+        CacheService::clear();
         return app('json')->successful('数据缓存刷新成功!');
     }
 

+ 165 - 91
crmeb/app/admin/controller/system/SystemCleardata.php

@@ -12,6 +12,8 @@ namespace app\admin\controller\system;
 use app\admin\controller\AuthController;
 use app\admin\model\store\StoreProduct;
 use crmeb\services\JsonService as Json;
+use crmeb\services\SystemConfigService;
+use think\facade\Config;
 use think\facade\Db;
 
 /**
@@ -19,117 +21,137 @@ use think\facade\Db;
  * Class SystemclearData
  * @package app\admin\controller\system
  */
-class SystemclearData  extends AuthController
+class SystemclearData extends AuthController
 {
 
-    public function index(){
-      return $this->fetch();
+    public function index()
+    {
+        return $this->fetch();
     }
+
     //清除用户数据
-    public function userRelevantData(){
-        self::clearData('user_recharge',1);
-        self::clearData('user_address',1);
-        self::clearData('user_bill',1);
-        self::clearData('user_enter',1);
-        self::clearData('user_extract',1);
-        self::clearData('user_notice',1);
-        self::clearData('user_notice_see',1);
-        self::clearData('wechat_qrcode',1);
-        self::clearData('wechat_message',1);
-        self::clearData('store_visit',1);
-        self::clearData('store_coupon_user',1);
-        self::clearData('store_coupon_issue_user',1);
-        self::clearData('store_bargain_user',1);
-        self::clearData('store_bargain_user_help',1);
-        self::clearData('store_product_reply',1);
-        self::clearData('store_product_cate',1);
-        self::clearData('routine_qrcode',1);
-        self::clearData('routine_form_id',1);
-        self::clearData('user_sign',1);
-        self::clearData('user_task_finish',1);
-        self::clearData('user_level',1);
-        self::clearData('user_token',1);
-        self::clearData('user_group',1);
+    public function userRelevantData()
+    {
+        self::clearData('user_recharge', 1);
+        self::clearData('user_address', 1);
+        self::clearData('user_bill', 1);
+        self::clearData('user_enter', 1);
+        self::clearData('user_extract', 1);
+        self::clearData('user_notice', 1);
+        self::clearData('user_notice_see', 1);
+        self::clearData('wechat_qrcode', 1);
+        self::clearData('wechat_message', 1);
+        self::clearData('store_visit', 1);
+        self::clearData('store_coupon_user', 1);
+        self::clearData('store_coupon_issue_user', 1);
+        self::clearData('store_bargain_user', 1);
+        self::clearData('store_bargain_user_help', 1);
+        self::clearData('store_product_reply', 1);
+        self::clearData('store_product_cate', 1);
+        self::clearData('routine_qrcode', 1);
+        self::clearData('routine_form_id', 1);
+        self::clearData('user_sign', 1);
+        self::clearData('user_task_finish', 1);
+        self::clearData('user_level', 1);
+        self::clearData('user_token', 1);
+        self::clearData('user_group', 1);
         $this->delDirAndFile('./public/uploads/store/comment');
-        self::clearData('store_product_relation',1);
+        self::clearData('store_product_relation', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除商城数据
-    public function storeData(){
-        self::clearData('store_coupon',1);
-        self::clearData('store_coupon_issue',1);
-        self::clearData('store_bargain',1);
-        self::clearData('store_combination',1);
-        self::clearData('store_combination_attr',1);
-        self::clearData('store_combination_attr_result',1);
-        self::clearData('store_combination_attr_value',1);
-        self::clearData('store_product_attr',1);
-        self::clearData('store_product_cate',1);
-        self::clearData('store_product_attr_result',1);
-        self::clearData('store_product_attr_value',1);
-        self::clearData('store_seckill',1);
-        self::clearData('store_seckill_attr',1);
-        self::clearData('store_seckill_attr_result',1);
-        self::clearData('store_seckill_attr_value',1);
-        self::clearData('store_product',1);
-        self::clearData('store_visit',1);
+    public function storeData()
+    {
+        self::clearData('store_coupon', 1);
+        self::clearData('store_coupon_issue', 1);
+        self::clearData('store_bargain', 1);
+        self::clearData('store_combination', 1);
+        self::clearData('store_combination_attr', 1);
+        self::clearData('store_combination_attr_result', 1);
+        self::clearData('store_combination_attr_value', 1);
+        self::clearData('store_product_attr', 1);
+        self::clearData('store_product_cate', 1);
+        self::clearData('store_product_attr_result', 1);
+        self::clearData('store_product_attr_value', 1);
+        self::clearData('store_seckill', 1);
+        self::clearData('store_seckill_attr', 1);
+        self::clearData('store_seckill_attr_result', 1);
+        self::clearData('store_seckill_attr_value', 1);
+        self::clearData('store_product', 1);
+        self::clearData('store_visit', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除产品分类
-    public function categoryData(){
-        self::clearData('store_category',1);
+    public function categoryData()
+    {
+        self::clearData('store_category', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除订单数据
-    public function orderData(){
-        self::clearData('store_order',1);
-        self::clearData('store_order_cart_info',1);
-        self::clearData('store_order_status',1);
-        self::clearData('store_pink',1);
-        self::clearData('store_cart',1);
-        self::clearData('store_order_status',1);
+    public function orderData()
+    {
+        self::clearData('store_order', 1);
+        self::clearData('store_order_cart_info', 1);
+        self::clearData('store_order_status', 1);
+        self::clearData('store_pink', 1);
+        self::clearData('store_cart', 1);
+        self::clearData('store_order_status', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除客服数据
-    public function kefuData(){
-        self::clearData('store_service',1);
+    public function kefuData()
+    {
+        self::clearData('store_service', 1);
         $this->delDirAndFile('./public/uploads/store/service');
-        self::clearData('store_service_log',1);
+        self::clearData('store_service_log', 1);
         return Json::successful('清除数据成功!');
     }
 
     //清除微信管理数据
-    public function wechatData(){
-        self::clearData('wechat_media',1);
-        self::clearData('wechat_reply',1);
-        self::clearData('cache',1);
+    public function wechatData()
+    {
+        self::clearData('wechat_media', 1);
+        self::clearData('wechat_reply', 1);
+        self::clearData('cache', 1);
         $this->delDirAndFile('./public/uploads/wechat');
         return Json::successful('清除数据成功!');
     }
+
     //清除所有附件
-    public function uploadData(){
-        self::clearData('system_attachment',1);
-        self::clearData('system_attachment_category',1);
+    public function uploadData()
+    {
+        self::clearData('system_attachment', 1);
+        self::clearData('system_attachment_category', 1);
         $this->delDirAndFile('./public/uploads/');
         return Json::successful('清除上传文件成功!');
     }
+
     //清除微信用户
-    public function  wechatuserData(){
-        self::clearData('wechat_user',1);
-        self::clearData('user',1);
+    public function wechatuserData()
+    {
+        self::clearData('wechat_user', 1);
+        self::clearData('user', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除内容分类
-    public function articledata(){
-        self::clearData('article_category',1);
-        self::clearData('article',1);
-        self::clearData('article_content',1);
+    public function articledata()
+    {
+        self::clearData('article_category', 1);
+        self::clearData('article', 1);
+        self::clearData('article_content', 1);
         return Json::successful('清除数据成功!');
     }
+
     //清除系统记录
-    public function systemdata(){
-        self::clearData('system_notice_admin',1);
-        self::clearData('system_log',1);
+    public function systemdata()
+    {
+        self::clearData('system_notice_admin', 1);
+        self::clearData('system_log', 1);
         return Json::successful('清除数据成功!');
     }
 
@@ -140,39 +162,91 @@ class SystemclearData  extends AuthController
      */
     public function undata($type = 1)
     {
-        switch ((int)$type){
+        switch ((int)$type) {
             case 1:
-                \app\admin\model\system\SystemAttachment::where('module_type',2)->delete();
+                $fileImage = \app\admin\model\system\SystemAttachment::where('module_type', 2)->field(['att_dir', 'satt_dir'])->select();
+                foreach ($fileImage as $image) {
+                    if ($image['att_dir'] && ($imagePath = strstr($image['att_dir'], 'uploads')) !== false) {
+                        if (is_file($imagePath))
+                            unlink($imagePath);
+                        unset($imagePath);
+                    }
+
+                    if ($image['satt_dir'] && ($imagePath = strstr($image['satt_dir'], 'uploads')) !== false) {
+                        if (is_file($imagePath))
+                            unlink($imagePath);
+                        unset($imagePath);
+                    }
+                }
+                \app\admin\model\system\SystemAttachment::where('module_type', 2)->delete();
+                @unlink('uploads/follow/follow.jpg');//删除海报二维码
                 break;
             case 2:
-                StoreProduct::where('is_del',1)->delete();
+                StoreProduct::where('is_del', 1)->delete();
+                break;
+            case 3:
+                $value = $this->request->param('value');
+                if (!$value)
+                    return Json::fail('请输入需要更换的域名');
+                if (!verify_domain($value))
+                    return Json::fail('域名不合法');
+                $siteUrl = SystemConfigService::get('site_url', true);
+                $siteUrlJosn = str_replace('http://', 'http:\\/\\/', $siteUrl);
+                $valueJosn = str_replace('http://', 'http:\\/\\/', $value);
+                $prefix = Config::get('database.connections.' . Config::get('database.default') . '.prefix');
+                $sql = [
+                    "UPDATE `{$prefix}system_attachment` SET `att_dir` = replace(att_dir ,'{$siteUrl}','{$value}'),`satt_dir` = replace(satt_dir ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_product` SET `image` = replace(image ,'{$siteUrl}','{$value}'),`slider_image` = replace(slider_image ,'{$siteUrl}','{$value}'),`description`= replace(description,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_product_attr_value` SET `image` = replace(image ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_seckill` SET `image` = replace(image ,'{$siteUrl}','{$value}'),`images` = replace(images,'{$siteUrl}','{$value}'),`description` = replace(description,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_combination` SET `image` = replace(image ,'{$siteUrl}','{$value}'),`images` = replace(images,'{$siteUrl}','{$value}'),`description` = replace(description,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_bargain` SET `image` = replace(image ,'{$siteUrl}','{$value}'),`images` = replace(images,'{$siteUrl}','{$value}'),`description` = replace(description,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}system_config` SET `value` = replace(value ,'{$siteUrlJosn}','{$valueJosn}')",
+                    "UPDATE `{$prefix}article_category` SET `image` = replace(`image` ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}article` SET `image_input` = replace(`image_input` ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}article_content` SET `content` = replace(`content` ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}store_category` SET `pic` = replace(`pic` ,'{$siteUrl}','{$value}')",
+                    "UPDATE `{$prefix}system_group_data` SET `value` = replace(value ,'{$siteUrlJosn}','{$valueJosn}')"
+                ];
+                try {
+                    foreach ($sql as $item) {
+                        db::execute($item);
+                    }
+                } catch (\Throwable $e) {
+                    return Json::fail('替换失败,失败原因:' . $e->getMessage());
+                }
+                return Json::success('替换成功!');
                 break;
         }
         return Json::successful('清除数据成功!');
     }
+
     //清除制定表数据
-    public  function  clearData($table_name,$status){
-        $table_name = config('database.connections.' . config('database.default'))['prefix'].$table_name;
-        if($status){
-            @db::execute('TRUNCATE TABLE '.$table_name);
-        }else{
-            @db::execute('DELETE FROM'.$table_name);
+    public function clearData($table_name, $status)
+    {
+        $table_name = config('database.connections.' . config('database.default'))['prefix'] . $table_name;
+        if ($status) {
+            @db::execute('TRUNCATE TABLE ' . $table_name);
+        } else {
+            @db::execute('DELETE FROM' . $table_name);
         }
 
     }
+
     //递归删除文件
-    function delDirAndFile($dirName,$subdir=true){
-        if ($handle = @opendir("$dirName")){
-            while(false !== ($item = readdir($handle))){
-                if($item != "." && $item != ".."){
-                    if(is_dir("$dirName/$item"))
-                        $this->delDirAndFile("$dirName/$item",false);
+    function delDirAndFile($dirName, $subdir = true)
+    {
+        if ($handle = @opendir("$dirName")) {
+            while (false !== ($item = readdir($handle))) {
+                if ($item != "." && $item != "..") {
+                    if (is_dir("$dirName/$item"))
+                        $this->delDirAndFile("$dirName/$item", false);
                     else
                         @unlink("$dirName/$item");
                 }
             }
             closedir($handle);
-            if(!$subdir) @rmdir($dirName);
+            if (!$subdir) @rmdir($dirName);
         }
     }
 }

Разлика између датотеке није приказан због своје велике величине
+ 446 - 411
crmeb/app/admin/controller/user/User.php


Разлика између датотеке није приказан због своје велике величине
+ 647 - 627
crmeb/app/admin/model/order/StoreOrder.php


Разлика између датотеке није приказан због своје велике величине
+ 677 - 616
crmeb/app/admin/model/user/User.php


+ 170 - 171
crmeb/app/admin/model/user/UserExtract.php

@@ -5,6 +5,7 @@
  * Date: 2018-03-03
  * Time: 16:47
  */
+
 namespace app\admin\model\user;
 
 use app\admin\model\wechat\WechatUser;
@@ -40,9 +41,9 @@ class UserExtract extends BaseModel
      * @param $uid
      * @return mixed
      */
-    public static function userExtractTotalPrice($uid,$status=1,$where=[])
+    public static function userExtractTotalPrice($uid, $status = 1, $where = [])
     {
-        return self::getModelTime($where,self::where('uid','in',$uid)->where('status',$status))->sum('extract_price')?:0;
+        return self::getModelTime($where, self::where('uid', 'in', $uid)->where('status', $status))->sum('extract_price') ?: 0;
     }
 
     public static function extractStatistics()
@@ -54,7 +55,7 @@ class UserExtract extends BaseModel
         //已提现金额
         $data['priced'] = floatval(self::where('status', 1)->sum('extract_price'));
         //未提现金额
-        $data['brokerage_not'] =  bcsub(bcsub($data['brokerage_count'], $data['priced'], 2), $data['price'], 2);
+        $data['brokerage_not'] = bcsub(bcsub($data['brokerage_count'], $data['priced'], 2), $data['price'], 2);
         return compact('data');
     }
 
@@ -65,61 +66,56 @@ class UserExtract extends BaseModel
     public static function systemPage($where)
     {
         $model = new self;
-        if($where['date'] != '') {
+        if ($where['date'] != '') {
             list($startTime, $endTime) = explode(' - ', $where['date']);
             $model = $model->where('a.add_time', '>', strtotime($startTime));
             $model = $model->where('a.add_time', '<', (int)bcadd(strtotime($endTime), 86400, 0));
         }
-        if($where['status'] != '')  $model = $model->where('a.status',$where['status']);
-        if($where['extract_type'] != '')  $model = $model->where('a.extract_type',$where['extract_type']);
-        if($where['nireid'] != '') $model = $model->where('a.real_name|a.id|b.nickname|a.bank_code|a.alipay_code','like',"%$where[nireid]%");
+        if ($where['status'] != '') $model = $model->where('a.status', $where['status']);
+        if ($where['extract_type'] != '') $model = $model->where('a.extract_type', $where['extract_type']);
+        if ($where['nireid'] != '') $model = $model->where('a.real_name|a.id|b.nickname|a.bank_code|a.alipay_code', 'like', "%$where[nireid]%");
         $model = $model->alias('a');
         $model = $model->field('a.*,b.nickname');
-        $model = $model->join('user b','b.uid=a.uid','LEFT');
+        $model = $model->join('user b', 'b.uid=a.uid', 'LEFT');
         $model = $model->order('a.id desc');
         return self::page($model, $where);
     }
 
-    public static function changeFail($id,$fail_msg)
+    public static function changeFail($id, $fail_msg)
     {
         $fail_time = time();
-        $data =self::get($id);
-        $extract_number=$data['extract_price'];
-        $mark='提现失败,退回佣金'.$extract_number.'元';
-        $uid=$data['uid'];
+        $data = self::get($id);
+        $extract_number = $data['extract_price'];
+        $mark = '提现失败,退回佣金' . $extract_number . '元';
+        $uid = $data['uid'];
         $status = -1;
-        $User= User::where('uid', $uid)->find()->toArray();
-        UserBill::income('提现失败',$uid,'now_money','extract',$extract_number,$id,bcadd($User['now_money'],$extract_number,2),$mark);
-        User::bcInc($uid,'brokerage_price',$extract_number,'uid');
-        $extract_type='未知方式';
-        switch ($data['extract_type']){
+        $User = User::where('uid', $uid)->find()->toArray();
+        UserBill::income('提现失败', $uid, 'now_money', 'extract', $extract_number, $id, bcadd($User['now_money'], $extract_number, 2), $mark);
+        User::bcInc($uid, 'brokerage_price', $extract_number, 'uid');
+        $extract_type = '未知方式';
+        switch ($data['extract_type']) {
             case 'alipay':
-                $extract_type='支付宝';
+                $extract_type = '支付宝';
                 break;
             case 'bank':
-                $extract_type='银行卡';
+                $extract_type = '银行卡';
                 break;
             case 'weixin':
-                $extract_type='微信';
+                $extract_type = '微信';
                 break;
         }
-        if(strtolower($User['user_type']) == 'wechat'){
-            WechatTemplateService::sendTemplate(WechatUser::where('uid',$uid)->value('openid'),WechatTemplateService::USER_BALANCE_CHANGE,[
-                'first'=> $mark,
-                'keyword1'=>'佣金提现',
-                'keyword2'=>date('Y-m-d H:i:s',time()),
-                'keyword3'=>$extract_number,
-                'remark'=>'错误原因:'.$fail_msg
-            ],Url::buildUrl('/user/cashrecord')->suffix('')->domain(true)->build());
-        }else if(strtolower($User['user_type'])=='routine'){
-            RoutineTemplate::sendOut('USER_EXTRACT_FALSE',$uid,[
-                'keyword1'=>$fail_msg,
-                'keyword2'=>$extract_number,
-                'keyword3'=>$extract_type,
-                'keyword4'=>date('Y-m-d H:i:s',time()),
-            ]);
+        if (strtolower($User['user_type']) == 'wechat') {
+            WechatTemplateService::sendTemplate(WechatUser::where('uid', $uid)->value('openid'), WechatTemplateService::USER_BALANCE_CHANGE, [
+                'first' => $mark,
+                'keyword1' => '佣金提现',
+                'keyword2' => date('Y-m-d H:i:s', time()),
+                'keyword3' => $extract_number,
+                'remark' => '错误原因:' . $fail_msg
+            ], Url::buildUrl('/user/cashrecord')->suffix('')->domain(true)->build());
+        } else if (strtolower($User['user_type']) == 'routine') {
+            RoutineTemplate::sendExtractFail($uid, $fail_msg, $extract_number, $User['nickname']);
         }
-        return self::edit(compact('fail_time','fail_msg','status'),$id);
+        return self::edit(compact('fail_time', 'fail_msg', 'status'), $id);
     }
 
     public static function changeSuccess($id)
@@ -127,29 +123,24 @@ class UserExtract extends BaseModel
 
         $data = self::get($id);
         $extractNumber = $data['extract_price'];
-        $mark = '成功提现佣金'.$extractNumber.'元';
-        $wechatUserInfo = WechatUser::where('uid',$data['uid'])->field('openid,user_type,routine_openid')->find();
-        $extract_type='未知方式';
-        switch ($data['extract_type']){
+        $mark = '成功提现佣金' . $extractNumber . '元';
+        $wechatUserInfo = WechatUser::where('uid', $data['uid'])->field('openid,user_type,routine_openid,nickname')->find();
+        $extract_type = '未知方式';
+        switch ($data['extract_type']) {
             case 'alipay':
-                $extract_type='支付宝';
+                $extract_type = '支付宝';
                 break;
             case 'bank':
-                $extract_type='银行卡';
+                $extract_type = '银行卡';
                 break;
             case 'weixin':
-                $extract_type='微信';
+                $extract_type = '微信';
                 break;
         }
-        if($wechatUserInfo){
-            if(strtolower($wechatUserInfo->user_type)=='routine'){
-                RoutineTemplate::sendOut('USER_EXTRACT_TRUE',$data['uid'],[
-                    'keyword1'=>$extractNumber.'元',
-                    'keyword2'=>'审核成功',
-                    'keyword3'=>date('Y-m-d H:i:s', time()),
-                    'keyword4'=>$extract_type,
-                ]);
-            }else if(strtolower($wechatUserInfo->user_type)=='wechat'){
+        if ($wechatUserInfo) {
+            if (strtolower($wechatUserInfo->user_type) == 'routine') {
+                RoutineTemplate::sendExtractSuccess($data['uid'], $extractNumber, $wechatUserInfo->nickname);
+            } else if (strtolower($wechatUserInfo->user_type) == 'wechat') {
                 WechatTemplateService::sendTemplate($wechatUserInfo->openid, WechatTemplateService::USER_BALANCE_CHANGE, [
                     'first' => $mark,
                     'keyword1' => '佣金提现',
@@ -159,163 +150,169 @@ class UserExtract extends BaseModel
                 ], Url::buildUrl('/user/cashrecord')->suffix('')->domain(true)->build());
             }
         }
-        return self::edit(['status'=>1],$id);
+        return self::edit(['status' => 1], $id);
     }
+
     //测试数据
-    public static function test(){
-        $uids=User::order('uid desc')->limit(2,20)->field(['uid','nickname'])->select()->toArray();
-        $type=['bank','alipay','weixin'];
-        foreach ($uids as $item){
-            $data=[
-                'uid'=>$item['uid'],
-                'real_name'=>$item['nickname'],
-                'extract_type'=>isset($type[rand(0,2)]) ? $type[rand(0,2)] :'alipay',
-                'bank_code'=>rand(1000000,999999999),
-                'bank_address'=>'中国',
-                'alipay_code'=>rand(1000,9999999),
-                'extract_price'=>rand(100,9999),
-                'mark'=>'测试数据',
-                'add_time'=>time(),
-                'status'=>1,
-                'wechat'=>rand(999,878788).$item['uid'],
+    public static function test()
+    {
+        $uids = User::order('uid desc')->limit(2, 20)->field(['uid', 'nickname'])->select()->toArray();
+        $type = ['bank', 'alipay', 'weixin'];
+        foreach ($uids as $item) {
+            $data = [
+                'uid' => $item['uid'],
+                'real_name' => $item['nickname'],
+                'extract_type' => isset($type[rand(0, 2)]) ? $type[rand(0, 2)] : 'alipay',
+                'bank_code' => rand(1000000, 999999999),
+                'bank_address' => '中国',
+                'alipay_code' => rand(1000, 9999999),
+                'extract_price' => rand(100, 9999),
+                'mark' => '测试数据',
+                'add_time' => time(),
+                'status' => 1,
+                'wechat' => rand(999, 878788) . $item['uid'],
             ];
             self::create($data);
         }
     }
+
     //获取头部提现信息
-    public static function getExtractHead(){
+    public static function getExtractHead()
+    {
         //本月提现人数
-        $month=self::getModelTime(['data'=>'month'],self::where('status', 1))->group('uid')->count();
+        $month = self::getModelTime(['data' => 'month'], self::where('status', 1))->group('uid')->count();
         //本月提现笔数
-        $new_month=self::getModelTime(['data'=>'month'],self::where('status', 1))->distinct(true)->count();
+        $new_month = self::getModelTime(['data' => 'month'], self::where('status', 1))->distinct(true)->count();
         //上月提现人数
-        $last_month=self::whereTime('add_time','last month')->where('status',1)->group('uid')->distinct(true)->count();
+        $last_month = self::whereTime('add_time', 'last month')->where('status', 1)->group('uid')->distinct(true)->count();
         //上月提现笔数
-        $last_count=self::whereTime('add_time','last month')->where('status',1)->count();
+        $last_count = self::whereTime('add_time', 'last month')->where('status', 1)->count();
         //本月提现金额
-        $extract_price=self::getModelTime(['data'=>'month'],self::where('status', 1))->sum('extract_price');
+        $extract_price = self::getModelTime(['data' => 'month'], self::where('status', 1))->sum('extract_price');
         //上月提现金额
-        $last_extract_price=self::whereTime('add_time','last month')->where('status',1)->sum('extract_price');
+        $last_extract_price = self::whereTime('add_time', 'last month')->where('status', 1)->sum('extract_price');
 
         return [
             [
-                'name'=>'总提现人数',
-                'field'=>'个',
-                'count'=>self::where('status', 1)->group('uid')->count(),
-                'content'=>'',
-                'background_color'=>'layui-bg-blue',
-                'sum'=>'',
-                'class'=>'fa fa-bar-chart',
+                'name' => '总提现人数',
+                'field' => '个',
+                'count' => self::where('status', 1)->group('uid')->count(),
+                'content' => '',
+                'background_color' => 'layui-bg-blue',
+                'sum' => '',
+                'class' => 'fa fa-bar-chart',
             ],
             [
-                'name'=>'总提现笔数',
-                'field'=>'笔',
-                'count'=>self::where('status', 1)->distinct(true)->count(),
-                'content'=>'',
-                'background_color'=>'layui-bg-cyan',
-                'sum'=>'',
-                'class'=>'fa fa-line-chart',
+                'name' => '总提现笔数',
+                'field' => '笔',
+                'count' => self::where('status', 1)->distinct(true)->count(),
+                'content' => '',
+                'background_color' => 'layui-bg-cyan',
+                'sum' => '',
+                'class' => 'fa fa-line-chart',
             ],
             [
-                'name'=>'本月提现人数',
-                'field'=>'人',
-                'count'=>$month,
-                'content'=>'',
-                'background_color'=>'layui-bg-orange',
-                'sum'=>'',
-                'class'=>'fa fa-line-chart',
+                'name' => '本月提现人数',
+                'field' => '人',
+                'count' => $month,
+                'content' => '',
+                'background_color' => 'layui-bg-orange',
+                'sum' => '',
+                'class' => 'fa fa-line-chart',
             ],
             [
-                'name'=>'本月提现笔数',
-                'field'=>'笔',
-                'count'=>$new_month,
-                'content'=>'',
-                'background_color'=>'layui-bg-green',
-                'sum'=>'',
-                'class'=>'fa fa-line-chart',
+                'name' => '本月提现笔数',
+                'field' => '笔',
+                'count' => $new_month,
+                'content' => '',
+                'background_color' => 'layui-bg-green',
+                'sum' => '',
+                'class' => 'fa fa-line-chart',
             ],
             [
-                'name'=>'本月提现金额',
-                'field'=>'元',
-                'count'=>$extract_price,
-                'content'=>'提现总金额',
-                'background_color'=>'layui-bg-cyan',
-                'sum'=>self::where('status', 1)->sum('extract_price'),
-                'class'=>'fa fa-line-chart',
+                'name' => '本月提现金额',
+                'field' => '元',
+                'count' => $extract_price,
+                'content' => '提现总金额',
+                'background_color' => 'layui-bg-cyan',
+                'sum' => self::where('status', 1)->sum('extract_price'),
+                'class' => 'fa fa-line-chart',
             ],
             [
-                'name'=>'上月提现人数',
-                'field'=>'个',
-                'count'=>$last_month,
-                'content'=>'环比增幅',
-                'background_color'=>'layui-bg-blue',
-                'sum'=>$last_month==0 ? '100%' :bcdiv($month,$last_month,2)*100,
-                'class'=>$last_month==0 ? 'fa fa-level-up':'fa fa-level-down',
+                'name' => '上月提现人数',
+                'field' => '个',
+                'count' => $last_month,
+                'content' => '环比增幅',
+                'background_color' => 'layui-bg-blue',
+                'sum' => $last_month == 0 ? '100%' : bcdiv($month, $last_month, 2) * 100,
+                'class' => $last_month == 0 ? 'fa fa-level-up' : 'fa fa-level-down',
             ],
             [
-                'name'=>'上月提现笔数',
-                'field'=>'笔',
-                'count'=>$last_count,
-                'content'=>'环比增幅',
-                'background_color'=>'layui-bg-black',
-                'sum'=>$last_count==0 ? '100%':bcdiv($new_month,$last_count,2)*100,
-                'class'=>$last_count==0 ? 'fa fa-level-up':'fa fa-level-down',
+                'name' => '上月提现笔数',
+                'field' => '笔',
+                'count' => $last_count,
+                'content' => '环比增幅',
+                'background_color' => 'layui-bg-black',
+                'sum' => $last_count == 0 ? '100%' : bcdiv($new_month, $last_count, 2) * 100,
+                'class' => $last_count == 0 ? 'fa fa-level-up' : 'fa fa-level-down',
             ],
             [
-                'name'=>'上月提现金额',
-                'field'=>'元',
-                'count'=>$last_extract_price,
-                'content'=>'环比增幅',
-                'background_color'=>'layui-bg-gray',
-                'sum'=>$last_extract_price==0 ? '100%':bcdiv($extract_price,$last_extract_price,2)*100,
-                'class'=>$last_extract_price==0 ? 'fa fa-level-up':'fa fa-level-down',
+                'name' => '上月提现金额',
+                'field' => '元',
+                'count' => $last_extract_price,
+                'content' => '环比增幅',
+                'background_color' => 'layui-bg-gray',
+                'sum' => $last_extract_price == 0 ? '100%' : bcdiv($extract_price, $last_extract_price, 2) * 100,
+                'class' => $last_extract_price == 0 ? 'fa fa-level-up' : 'fa fa-level-down',
             ],
         ];
     }
+
     //获取提现分布图和提现人数金额曲线图
-    public static function getExtractList($where,$limit=15){
-        $legdata=['提现人数','提现金额'];
-        $list=self::getModelTime($where,self::where('status',1))
+    public static function getExtractList($where, $limit = 15)
+    {
+        $legdata = ['提现人数', '提现金额'];
+        $list = self::getModelTime($where, self::where('status', 1))
             ->field('FROM_UNIXTIME(add_time,"%Y-%c-%d") as un_time,count(uid) as count,sum(extract_price) as sum_price')->group('un_time')->order('un_time asc')->select();
-        if(count($list)) $list=$list->toArray();
+        if (count($list)) $list = $list->toArray();
         $xdata = [];
-        $itemList = [0=>[],1=>[]];
+        $itemList = [0 => [], 1 => []];
         $chatrList = [];
         $zoom = '';
-        foreach ($list as $value){
-            $xdata[]=$value['un_time'];
-            $itemList[0][]=$value['count'];
-            $itemList[1][]=$value['sum_price'];
+        foreach ($list as $value) {
+            $xdata[] = $value['un_time'];
+            $itemList[0][] = $value['count'];
+            $itemList[1][] = $value['sum_price'];
         }
-        foreach ($legdata as $key=>$name){
-            $item['name']=$name;
-            $item['type']='line';
-            $item['data']=$itemList[$key];
-            $chatrList[]=$item;
+        foreach ($legdata as $key => $name) {
+            $item['name'] = $name;
+            $item['type'] = 'line';
+            $item['data'] = $itemList[$key];
+            $chatrList[] = $item;
         }
-        unset($item,$name,$key);
-        if(count($xdata)>$limit) $zoom=$xdata[$limit-5];
+        unset($item, $name, $key);
+        if (count($xdata) > $limit) $zoom = $xdata[$limit - 5];
         //饼状图
-        $cake=['支付宝','银行卡','微信'];
-        $fenbulist=self::getModelTime($where,self::where('status',1))
+        $cake = ['支付宝', '银行卡', '微信'];
+        $fenbulist = self::getModelTime($where, self::where('status', 1))
             ->field('count(uid) as count,extract_type')->group('extract_type')->order('count asc')->select();
-        if(count($fenbulist)) $fenbulist = $fenbulist->toArray();
-        $sum_count = self::getModelTime($where,self::where('status',1))->count();
-        $color = ['#FB7773','#81BCFE','#91F3FE'];
+        if (count($fenbulist)) $fenbulist = $fenbulist->toArray();
+        $sum_count = self::getModelTime($where, self::where('status', 1))->count();
+        $color = ['#FB7773', '#81BCFE', '#91F3FE'];
         $fenbudata = [];
-        foreach ($fenbulist as $key=>$item){
-            if($item['extract_type']=='bank'){
-                $item_date['name']='银行卡';
-            }else if($item['extract_type']=='alipay'){
-                $item_date['name']='支付宝';
-            }else if($item['extract_type']=='weixin'){
-                $item_date['name']='微信';
+        foreach ($fenbulist as $key => $item) {
+            if ($item['extract_type'] == 'bank') {
+                $item_date['name'] = '银行卡';
+            } else if ($item['extract_type'] == 'alipay') {
+                $item_date['name'] = '支付宝';
+            } else if ($item['extract_type'] == 'weixin') {
+                $item_date['name'] = '微信';
             }
-            $item_date['value']=bcdiv($item['count'],$sum_count,2)*100;
-            $item_date['itemStyle']['color']=$color[$key];
-            $fenbudata[]=$item_date;
+            $item_date['value'] = bcdiv($item['count'], $sum_count, 2) * 100;
+            $item_date['itemStyle']['color'] = $color[$key];
+            $fenbudata[] = $item_date;
         }
-        return compact('xdata','chatrList','legdata','zoom','cake','fenbudata');
+        return compact('xdata', 'chatrList', 'legdata', 'zoom', 'cake', 'fenbudata');
     }
 
     /**
@@ -323,9 +320,10 @@ class UserExtract extends BaseModel
      * @param int $uid
      * @return int|mixed
      */
-    public static function getUserCountPrice($uid = 0){
-        if(!$uid) return 0;
-        $price = self::where('uid',$uid)->where('status',1)->sum('extract_price');
+    public static function getUserCountPrice($uid = 0)
+    {
+        if (!$uid) return 0;
+        $price = self::where('uid', $uid)->where('status', 1)->sum('extract_price');
         return $price ? $price : 0;
     }
 
@@ -334,8 +332,9 @@ class UserExtract extends BaseModel
      * @param int $uid
      * @return int|string
      */
-    public static function getUserCountNum($uid = 0){
-        if(!$uid) return 0;
-        return self::where('uid',$uid)->count();
+    public static function getUserCountNum($uid = 0)
+    {
+        if (!$uid) return 0;
+        return self::where('uid', $uid)->count();
     }
 }

+ 1 - 0
crmeb/app/admin/view/index/index.php

@@ -266,6 +266,7 @@
 {include file="public/style"}
 <script>
     window.newOrderAudioLink='{$new_order_audio_link}';
+    window.workermanPort = '{$workermanPort}';
 </script>
 <script src="{__FRAME_PATH}js/index.js"></script>
 </body>

+ 35 - 0
crmeb/app/admin/view/order/store_order/order_spread_user.php

@@ -0,0 +1,35 @@
+{extend name="public/container"}
+{block name="content"}
+<div class="ibox-content order-info">
+
+    <div class="row">
+        <div class="col-sm-12">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <img src="{$spread.avatar}" width="50" height="50" style="border-radius: 60px;" />
+                    <span style="font-size: 16px">{$spread.nickname}</span>
+                </div>
+                <div class="panel-body">
+                    <div class="row show-grid">
+                        <div class="col-xs-6" style="color: #ff0005">余额:¥ {$spread.now_money}</div>
+                        <div class="col-xs-6">UID:{$spread.uid}</div>
+                        <div class="col-xs-6" style="color: green">佣金:¥ {$spread.brokerage_price}</div>
+                        <div class="col-xs-6">真实姓名:{$spread.real_name}</div>
+                        <div class="col-xs-6">身份证::{$spread.card_id}</div>
+                        <div class="col-xs-6">手机号码:{$spread.phone}</div>
+                        <div class="col-xs-6">生日:{$spread.birthday}</div>
+                        <div class="col-xs-6">积分:{$spread.integral}</div>
+                        <div class="col-xs-6">用户备注:{$spread.mark}</div>
+                        <div class="col-xs-6">最后登录时间:{$spread.last_time|date="Y/m/d H:i"}</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="{__FRAME_PATH}js/content.min.js?v=1.0.0"></script>
+{/block}
+{block name="script"}
+
+{/block}

+ 1 - 1
crmeb/app/admin/view/system/system_cleardata/index.php

@@ -4,7 +4,7 @@
     .clear_tit span{font-size: 12px; color: #ED4014;margin: 15px 0;}
     .clear_box{border: 1px solid #DADFE6;border-radius: 3px;display: flex;flex-direction: column;align-items: center;padding: 30px 10px;box-sizing:border-box}
     .clear_box_sp1{font-size: 16px;color: #000000;display: block;}
-    .clear_box_sp2{font-size: 14px;color: #ED4014;display: block;margin: 12px 0;}
+    .clear_box_sp2{font-size: 14px;color: #808695;display: block;margin: 12px 0;}
     .layui-btn-danger {background-color: #FF5722;}
 </style>
 <div class="layui-fluid">

+ 21 - 11
crmeb/app/admin/view/widget/images.php

@@ -126,9 +126,11 @@
                     </div>
                     <div class="layui-card-body clearfix image-box" style="padding: 10px;height: 360px;z-index:10;">
                         <div class="layui-col-md2 layui-col-xs2 layui-col-sm2 image" v-for="(item,index) in imageList">
+                            <span class="layui-badge layui-bg-cyan" style="position: absolute;" v-if="item.sort">{{ item.sort }}</span>
                             <div class="layui-img-box"  :class="item.isSelect ? 'on': '' ">
-                                <img :src="item.att_dir" v-if="small == 1" @click="changImage(item,index)">
-                                <img :src="item.att_dir" v-else @click="changImage(item,index)">
+
+                                <img :src="item.att_dir" v-if="small == 1" @click="changImage(item)">
+                                <img :src="item.att_dir" v-else @click="changImage(item)">
                             </div>
                         </div>
                         <div class="empty-image" style="width: 100%;height: 100%;text-align: center;" v-if="!imageList.length && loading == false">
@@ -251,17 +253,25 @@
             },
             //图片选中和取消
             changImage:function(item,index){
-                var len = this.imageList.length,selectImages=[],selectImagesIDS=[];
-
-                this.$set(this.imageList[index],'isSelect',item.isSelect == undefined ? true : !item.isSelect);
-                for (var i=0;i<len;i++){
-                    if(this.imageList[i].isSelect === true) {
-                        selectImages.push(small == 1 ? this.imageList[i]['satt_dir'] : this.imageList[i]['att_dir']);
-                        selectImagesIDS.push(this.imageList[i]['att_id']);
+                this.$set(item,'isSelect',item.isSelect == undefined ? true : !item.isSelect);
+                var val = small == 1 ? item['satt_dir'] : item['att_dir'];
+                if(item.isSelect === true) {
+                    this.selectImages[this.selectImages.length] = val;
+                    this.selectImagesIDS[this.selectImages.length] = item['att_id'];
+                    item.sort = this.selectImages.length;
+                }else{
+                    this.selectImages.splice(this.selectImages.indexOf(val),1);
+                    this.selectImagesIDS.splice(this.selectImages.indexOf(item['att_id']),1);
+                    for (var i=0;i<this.imageList.length;i++){
+                        if(this.imageList[i].sort > item.sort) {
+                            this.imageList[i].sort = (this.imageList[i].sort-1)>=0? this.imageList[i].sort-1 : 0;
+                        }
                     }
+                    item.sort = 0;
                 }
-                this.$set(this,'selectImages',selectImages);
-                this.$set(this,'selectImagesIDS',selectImagesIDS);
+//                console.log(this.selectImagesIDS)
+                this.$set(this,'selectImages',this.selectImages);
+                this.$set(this,'selectImagesIDS',this.selectImagesIDS);
             },
             //获取图片列表
             getImageList:function(){

+ 0 - 5
crmeb/app/api/controller/AuthController.php

@@ -70,11 +70,6 @@ class AuthController
         return app('json')->success('成功');
     }
 
-    public function test()
-    {
-        echo 'test';
-    }
-
     /**
      * 验证码发送
      * @param Request $request

+ 23 - 23
crmeb/app/api/controller/PublicController.php

@@ -12,7 +12,6 @@ use app\models\user\UserBill;
 use app\models\user\WechatUser;
 use app\Request;
 use crmeb\services\GroupDataService;
-use crmeb\services\SystemConfigService;
 use crmeb\services\UploadService;
 use crmeb\services\UtilService;
 use crmeb\services\workerman\ChannelService;
@@ -38,28 +37,29 @@ class PublicController
         $menus = GroupDataService::getData('routine_home_menus') ?: [];//TODO 首页按钮
         $roll = GroupDataService::getData('routine_home_roll_news') ?: [];//TODO 首页滚动新闻
         $activity = GroupDataService::getData('routine_home_activity', 3) ?: [];//TODO 首页活动区域图片
-        $site_name = sysConfig('site_name');
+        $site_name = sys_config('site_name');
         $routine_index_page = GroupDataService::getData('routine_index_page');
-        $info['fastInfo'] = $routine_index_page[0]['fast_info'] ?? '';//sysConfig('fast_info');//TODO 快速选择简介
-        $info['bastInfo'] = $routine_index_page[0]['bast_info'] ?? '';//sysConfig('bast_info');//TODO 精品推荐简介
-        $info['firstInfo'] = $routine_index_page[0]['first_info'] ?? '';//sysConfig('first_info');//TODO 首发新品简介
-        $info['salesInfo'] = $routine_index_page[0]['sales_info'] ?? '';//sysConfig('sales_info');//TODO 促销单品简介
-        $logoUrl = sysConfig('routine_index_logo');//TODO 促销单品简介
-        if (strstr($logoUrl, 'http') === false) $logoUrl = sysConfig('site_url') . $logoUrl;
+        $info['fastInfo'] = $routine_index_page[0]['fast_info'] ?? '';//sys_config('fast_info');//TODO 快速选择简介
+        $info['bastInfo'] = $routine_index_page[0]['bast_info'] ?? '';//sys_config('bast_info');//TODO 精品推荐简介
+        $info['firstInfo'] = $routine_index_page[0]['first_info'] ?? '';//sys_config('first_info');//TODO 首发新品简介
+        $info['salesInfo'] = $routine_index_page[0]['sales_info'] ?? '';//sys_config('sales_info');//TODO 促销单品简介
+        $logoUrl = sys_config('routine_index_logo');//TODO 促销单品简介
+        if (strstr($logoUrl, 'http') === false && $logoUrl) $logoUrl = sys_config('site_url') . $logoUrl;
         $logoUrl = str_replace('\\', '/', $logoUrl);
-        $fastNumber = $routine_index_page[0]['fast_number'] ?? 6;//sysConfig('fast_number');//TODO 快速选择分类个数
-        $bastNumber = $routine_index_page[0]['bast_number'] ?? 6;//sysConfig('bast_number');//TODO 精品推荐个数
-        $firstNumber = $routine_index_page[0]['first_number'] ?? 6;//sysConfig('first_number');//TODO 首发新品个数
-        $info['fastList'] = StoreCategory::byIndexList((int)$fastNumber);//TODO 快速选择分类个数
-        $info['bastList'] = StoreProduct::getBestProduct('id,image,store_name,cate_id,price,ot_price,IFNULL(sales,0) + IFNULL(ficti,0) as sales,unit_name', (int)$bastNumber, $request->uid());//TODO 精品推荐个数
-        $info['firstList'] = StoreProduct::getNewProduct('id,image,store_name,cate_id,price,unit_name,IFNULL(sales,0) + IFNULL(ficti,0) as sales', (int)$firstNumber, $request->uid());//TODO 首发新品个数
+        $fastNumber = $routine_index_page[0]['fast_number'] ?? 0;//sys_config('fast_number');//TODO 快速选择分类个数
+        $bastNumber = $routine_index_page[0]['bast_number'] ?? 0;//sys_config('bast_number');//TODO 精品推荐个数
+        $firstNumber = $routine_index_page[0]['first_number'] ?? 0;//sys_config('first_number');//TODO 首发新品个数
+        $info['fastList'] = StoreCategory::byIndexList((int)$fastNumber, false);//TODO 快速选择分类个数
+        $info['bastList'] = StoreProduct::getBestProduct('id,image,store_name,cate_id,price,ot_price,IFNULL(sales,0) + IFNULL(ficti,0) as sales,unit_name', (int)$bastNumber, $request->uid(), false);//TODO 精品推荐个数
+        $info['firstList'] = StoreProduct::getNewProduct('id,image,store_name,cate_id,price,unit_name,IFNULL(sales,0) + IFNULL(ficti,0) as sales', (int)$firstNumber, $request->uid(), false);//TODO 首发新品个数
         $info['bastBanner'] = GroupDataService::getData('routine_home_bast_banner') ?? [];//TODO 首页精品推荐图片
         $benefit = StoreProduct::getBenefitProduct('id,image,store_name,cate_id,price,ot_price,stock,unit_name', 3);//TODO 首页促销单品
         $lovely = GroupDataService::getData('routine_home_new_banner') ?: [];//TODO 首发新品顶部图
         $likeInfo = StoreProduct::getHotProduct('id,image,store_name,cate_id,price,unit_name', 3);//TODO 热门榜单 猜你喜欢
         $couponList = StoreCouponIssue::getIssueCouponList($request->uid(), 3);
         $subscribe = WechatUser::where('uid', $request->uid() ?? 0)->value('subscribe') ? true : false;
-        return app('json')->successful(compact('banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name','subscribe'));
+        $newGoodsBananr = sys_config('new_goods_bananr');
+        return app('json')->successful(compact('banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name', 'subscribe','newGoodsBananr'));
     }
 
     /**
@@ -68,11 +68,11 @@ class PublicController
      */
     public function share()
     {
-        $data['img'] = sysConfig('wechat_share_img');
-        if (strstr($data['img'], 'http') === false) $data['img'] = sysConfig('site_url') . $data['img'];
+        $data['img'] = sys_config('wechat_share_img');
+        if (strstr($data['img'], 'http') === false) $data['img'] = sys_config('site_url') . $data['img'];
         $data['img'] = str_replace('\\', '/', $data['img']);
-        $data['title'] = sysConfig('wechat_share_title');
-        $data['synopsis'] = sysConfig('wechat_share_synopsis');
+        $data['title'] = sys_config('wechat_share_title');
+        $data['synopsis'] = sys_config('wechat_share_synopsis');
         return app('json')->successful(compact('data'));
     }
 
@@ -89,11 +89,11 @@ class PublicController
     {
         $menusInfo = GroupDataService::getData('routine_my_menus') ?? [];
         $user = $request->user();
-        $vipOpen = sysConfig('vip_open');
+        $vipOpen = sys_config('vip_open');
         $vipOpen = is_string($vipOpen) ? (int)$vipOpen : $vipOpen;
         foreach ($menusInfo as $key => &$value) {
-            $value['pic'] = UtilService::setSiteUrl($value['pic']);
-            if ($value['id'] == 137 && !(intval(sysConfig('store_brokerage_statu')) == 2 || $user->is_promoter == 1))
+            $value['pic'] = set_file_url($value['pic']);
+            if ($value['id'] == 137 && !(intval(sys_config('store_brokerage_statu')) == 2 || $user->is_promoter == 1))
                 unset($menusInfo[$key]);
             if ($value['id'] == 174 && !StoreService::orderServiceStatus($user->uid))
                 unset($menusInfo[$key]);
@@ -149,7 +149,7 @@ class PublicController
             $start_uploads = 0;
         $start_uploads++;
         Cache::set('start_uploads_' . $request->uid(), $start_uploads, 86400);
-        $res['dir'] = UploadService::pathToUrl($res['dir']);
+        $res['dir'] = UtilService::pathToUrl($res['dir']);
         if (strpos($res['dir'], 'http') === false) $res['dir'] = $request->domain() . $res['dir'];
         return app('json')->successful('图片上传成功!', ['name' => $res['name'], 'url' => $res['dir']]);
     }

+ 42 - 22
crmeb/app/api/controller/wechat/AuthController.php

@@ -4,8 +4,10 @@
 namespace app\api\controller\wechat;
 
 
+use app\models\routine\RoutineTemplate;
 use app\models\user\WechatUser;
 use app\Request;
+use crmeb\services\CacheService;
 use crmeb\services\MiniProgramService;
 use crmeb\services\UtilService;
 use app\models\user\UserToken;
@@ -13,6 +15,7 @@ use crmeb\services\SystemConfigService;
 use app\models\user\User;
 use app\models\routine\RoutineFormId;
 use think\facade\Cache;
+use crmeb\services\SubscribeTemplateService;
 
 /**
  * 小程序相关
@@ -34,20 +37,20 @@ class AuthController
     public function mp_auth(Request $request)
     {
         $cache_key = '';
-        list($code,$post_cache_key,$login_type) = UtilService::postMore([
-            ['code',''],
-            ['cache_key',''],
-            ['login_type','']
-        ],$request,true);
-        $session_key = Cache::get('eb_api_code_'.$post_cache_key);
+        list($code, $post_cache_key, $login_type) = UtilService::postMore([
+            ['code', ''],
+            ['cache_key', ''],
+            ['login_type', '']
+        ], $request, true);
+        $session_key = Cache::get('eb_api_code_' . $post_cache_key);
         if (!$code && !$session_key)
             return app('json')->fail('授权失败,参数有误');
-        if($code && !$session_key){
+        if ($code && !$session_key) {
             try {
                 $userInfoCong = MiniProgramService::getUserInfo($code);
                 $session_key = $userInfoCong['session_key'];
-                $cache_key = md5(time().$code);
-                Cache::set('eb_api_code_'.$cache_key,$session_key,86400);
+                $cache_key = md5(time() . $code);
+                Cache::set('eb_api_code_' . $cache_key, $session_key, 86400);
             } catch (\Exception $e) {
                 return app('json')->fail('获取session_key失败,请检查您的配置!', ['line' => $e->getLine(), 'message' => $e->getMessage()]);
             }
@@ -72,12 +75,12 @@ class AuthController
         $userInfo['session_key'] = $session_key;
         $userInfo['login_type'] = $login_type;
         $uid = WechatUser::routineOauth($userInfo);
-        $userInfo = User::where('uid',$uid)->find();
-        if($userInfo->login_type == 'h5' && ($h5UserInfo = User::where(['account'=>$userInfo->phone,'phone'=>$userInfo->phone,'user_type'=>'h5'])->find()))
+        $userInfo = User::where('uid', $uid)->find();
+        if ($userInfo->login_type == 'h5' && ($h5UserInfo = User::where(['account' => $userInfo->phone, 'phone' => $userInfo->phone, 'user_type' => 'h5'])->find()))
             $token = UserToken::createToken($userInfo, 'routine');
         else
             $token = UserToken::createToken($userInfo, 'routine');
-        if($token) {
+        if ($token) {
             event('UserLogin', [$userInfo, $token]);
             return app('json')->successful('登陆成功!', [
                 'token' => $token->token,
@@ -85,7 +88,7 @@ class AuthController
                 'expires_time' => strtotime($token->expires_time),
                 'cache_key' => $cache_key
             ]);
-        }else
+        } else
             return app('json')->fail('获取用户访问token失败!');
     }
 
@@ -96,20 +99,20 @@ class AuthController
      */
     public function get_logo(Request $request)
     {
-        $logoType = $request->get('type',1);
+        $logoType = $request->get('type', 1);
         switch ((int)$logoType) {
             case 1:
-                $logo = sysConfig('routine_logo');
+                $logo = sys_config('routine_logo');
                 break;
             case 2:
-                $logo = sysConfig('wechat_avatar');
+                $logo = sys_config('wechat_avatar');
                 break;
             default:
                 $logo = '';
                 break;
         }
-        if (strstr($logo,'http') === false && $logo) $logo = sysConfig('site_url').$logo;
-        return app('json')->successful(['logo_url'=>str_replace('\\','/',$logo)]);
+        if (strstr($logo, 'http') === false && $logo) $logo = sys_config('site_url') . $logo;
+        return app('json')->successful(['logo_url' => str_replace('\\', '/', $logo)]);
     }
 
     /**
@@ -119,10 +122,10 @@ class AuthController
      */
     public function set_form_id(Request $request)
     {
-        $formId = $request->post('formId','');
-        if(!$formId) return app('json')->fail('缺少form id');
-        RoutineFormId::SetFormId($formId,$request->uid());
-        return app('json')->successful('保存form id 成功!',['uid'=>$request->uid()]);
+        $formId = $request->post('formId', '');
+        if (!$formId) return app('json')->fail('缺少form id');
+        RoutineFormId::SetFormId($formId, $request->uid());
+        return app('json')->successful('保存form id 成功!', ['uid' => $request->uid()]);
     }
 
     /**
@@ -132,4 +135,21 @@ class AuthController
     {
         MiniProgramService::handleNotify();
     }
+
+    /**
+     * 获取小程序订阅消息id
+     * @return mixed
+     */
+    public function teml_ids()
+    {
+        $temlIdsName = SubscribeTemplateService::getConstants();
+        $temlIdsList = CacheService::get('TEML_IDS_LIST', function () use ($temlIdsName) {
+            $temlId = [];
+            foreach ($temlIdsName as $key => $item) {
+                $temlId[strtolower($key)] = SubscribeTemplateService::setTemplateId($item);
+            }
+            return $temlId;
+        });
+        return app('json')->success($temlIdsList);
+    }
 }

+ 9 - 7
crmeb/app/api/controller/wechat/WechatController.php

@@ -8,8 +8,8 @@ use app\models\user\User;
 use app\models\user\UserToken;
 use app\models\user\WechatUser;
 use app\Request;
-use crmeb\utils\Canvas;
 use crmeb\services\WechatService;
+use crmeb\utils\Canvas;
 use think\facade\Cookie;
 
 /**
@@ -25,6 +25,7 @@ class WechatController
      */
     public function serve()
     {
+        ob_clean();
         return WechatService::serve();
     }
 
@@ -33,6 +34,7 @@ class WechatController
      */
     public function notify()
     {
+        ob_clean();
         WechatService::handleNotify();
     }
 
@@ -61,7 +63,7 @@ class WechatController
         try {
             $wechatInfo = WechatService::oauthService()->user()->getOriginal();
         } catch (\Exception $e) {
-            return app('json')->fail('授权失败');
+            return app('json')->fail('授权失败', ['message' => $e->getMessage(), 'line' => $e->getLine()]);
         }
         if (!isset($wechatInfo['nickname'])) {
             $wechatInfo = WechatService::getUserInfo($wechatInfo['openid']);
@@ -99,12 +101,13 @@ class WechatController
         $path = 'uploads/follow/';
         $imageType = 'jpg';
         $name = 'follow';
-        $siteUrl = sysConfig('site_url');
-        if (file_exists($path . $name . '.' . $imageType)) {
-            return app('json')->success('ok', ['path' => $siteUrl . '/' . $path . $name . '.' . $imageType]);
+        $siteUrl = sys_config('site_url');
+        $imageUrl = $path . $name . '.' . $imageType;
+        if (file_exists($imageUrl)) {
+            return app('json')->success('ok', ['path' => $siteUrl . '/' . $imageUrl]);
         }
         $canvas->setImageUrl('static/qrcode/follow.png')->setImageHeight(720)->setImageWidth(500)->pushImageValue();
-        $wechatQrcode = sysConfig('wechat_qrcode');
+        $wechatQrcode = sys_config('wechat_qrcode');
         if (($strlen = stripos($wechatQrcode, 'uploads')) !== false) {
             $wechatQrcode = substr($wechatQrcode, $strlen);
         }
@@ -114,5 +117,4 @@ class WechatController
         $image = $canvas->setFileName($name)->setImageType($imageType)->setPath($path)->setBackgroundWidth(500)->setBackgroundHeight(720)->starDrawChart();
         return app('json')->success('ok', ['path' => $image ? $siteUrl . '/' . $image : '']);
     }
-
 }

+ 37 - 22
crmeb/app/common.php

@@ -152,30 +152,45 @@ if (!function_exists('sysData')) {
     }
 }
 
-if (!function_exists('sort_list_tier')) {
+if (!function_exists('sys_config')) {
     /**
-     * 分级排序
-     * @param $data
-     * @param int $pid
-     * @param string $field
-     * @param string $pk
-     * @param string $html
-     * @param int $level
-     * @param bool $clear
-     * @return array
+     * 获取系统单个配置
+     * @param string $name
+     * @return string | null
      */
-    function sort_list_tier($data, $pid = 0, $field = 'pid', $pk = 'id', $html = '|-----', $level = 1, $clear = true)
+    function sys_config(string $name)
     {
-        static $list = [];
-        if ($clear) $list = [];
-        foreach ($data as $k => $res) {
-            if ($res[$field] == $pid) {
-                $res['html'] = str_repeat($html, $level);
-                $list[] = $res;
-                unset($data[$k]);
-                sort_list_tier($data, $res[$pk], $field, $pk, $html, $level + 1, false);
-            }
-        }
-        return $list;
+        if (empty($name))
+            return null;
+
+        return app('sysConfig')->get($name);
+    }
+}
+
+if (!function_exists('sys_data')) {
+    /**
+     * 获取系统单个配置
+     * @param string $name
+     * @return string
+     */
+    function sys_data($name)
+    {
+        return app('sysGroupData')->getData($name);
+    }
+}
+
+if (!function_exists('set_file_url')) {
+    /**
+     * 设置附加路径
+     * @param $url
+     * @return bool
+     */
+    function set_file_url($image, $siteUrl = '')
+    {
+        if (!strlen(trim($siteUrl))) $siteUrl = sys_config('site_url');
+        $domainTop = substr($image, 0, 4);
+        if ($domainTop == 'http') return $image;
+        $image = str_replace('\\', '/', $image);
+        return $siteUrl . $image;
     }
 }

+ 196 - 71
crmeb/app/models/routine/RoutineTemplate.php

@@ -2,6 +2,8 @@
 
 namespace app\models\routine;
 
+use app\admin\model\wechat\StoreService as ServiceModel;
+use crmeb\basic\BaseModel;
 use crmeb\utils\Template;
 use app\models\store\StoreOrder;
 use app\models\user\WechatUser;
@@ -12,7 +14,7 @@ use app\models\user\WechatUser;
  * Class RoutineTemplate
  * @package app\models\routine
  */
-class RoutineTemplate
+class RoutineTemplate extends BaseModel
 {
     /**
      * 数据表主键
@@ -26,51 +28,99 @@ class RoutineTemplate
      */
     protected $name = 'routine_template';
 
-    public static function sendOrderTakeOver()
+    /**
+     * 确认收货
+     * @param $order
+     * @param $title
+     * @return bool
+     */
+    public static function sendOrderTakeOver($order, $title)
     {
-
+        return self::sendOut('OREDER_TAKEVER', $order['uid'], [
+            'thing1' => $order['order_id'],
+            'thing2' => $title,
+            'date5' => date('Y-m-d H:i:s', time()),
+        ], '/pages/order_details/index?order_id=' . $order['order_id']);
     }
 
     /**
      * 送货和发货
      * @param $order
-     * @param int $isGive
+     * @param int $isGive 0 = 同城配送, 1 = 快递发货
      * @return bool
      */
     public static function sendOrderPostage($order, $isGive = 0)
     {
-        if ($isGive) {
-            $data['keyword1'] = $order['order_id'];
-            $data['keyword2'] = $order['delivery_name'];
-            $data['keyword3'] = $order['delivery_id'];
-            $data['keyword4'] = date('Y-m-d H:i:s', time());
-            $data['keyword5'] = '您的商品已经发货请注意查收';
-            return self::sendOut('ORDER_POSTAGE_SUCCESS', $order['uid'], $data);
-        } else {
-            $data['keyword1'] = $order['order_id'];
-            $data['keyword2'] = $order['delivery_name'];
-            $data['keyword3'] = $order['delivery_id'];
-            $data['keyword4'] = date('Y-m-d H:i:s', time());
-            return self::sendOut('ORDER_DELIVER_SUCCESS', $order['uid'], $data);
+        if (is_string($order['cart_id']))
+            $order['cart_id'] = json_decode($order['cart_id'], true);
+        $storeTitle = StoreOrder::getProductTitle($order['cart_id']);
+        $storeTitle = StoreOrder::getSubstrUTf8($storeTitle, 20,'UTF-8','');
+        if ($isGive) {//快递发货
+            return self::sendOut('ORDER_DELIVER_SUCCESS', $order['uid'], [
+                'character_string2' => $order['delivery_id'],
+                'thing1' => $order['delivery_name'],
+                'time3' => date('Y-m-d H:i:s', time()),
+                'thing5' => $storeTitle,
+            ], '/pages/order_details/index?order_id=' . $order['order_id']);
+        } else {//同城配送
+            return self::sendOut('ORDER_POSTAGE_SUCCESS', $order['uid'], [
+                'thing8' => $storeTitle,
+                'character_string1' => $order['order_id'],
+                'name4' => $order['delivery_name'],
+                'phone_number10' => $order['delivery_id']
+            ], '/pages/order_details/index?order_id=' . $order['order_id']);
         }
     }
 
     /**
-     * 退款成功发送消息
+     * 充值金额退款
+     * @param $UserRecharge
+     * @param $refund_price
+     * @return bool
+     */
+    public static function sendRechargeSuccess($UserRecharge, $refund_price)
+    {
+        return self::sendOut('ORDER_REFUND', $UserRecharge['uid'], [
+            'thing1' => '亲,您充值的金额已退款,本次退款' . $refund_price . '金额',
+            'thing2' => '余额充值退款',
+            'amount3' => $UserRecharge['price'],
+            'character_string6' => $UserRecharge['order_id'],
+        ], '/pages/user_bill/index?type=2');
+    }
+
+    /**
+     * 订单退款成功发送消息
      * @param array $order
      * @return bool
      */
     public static function sendOrderRefundSuccess($order = array())
     {
         if (!$order) return false;
-        $data['keyword1'] = $order['order_id'];
-        $data['keyword2'] = date('Y-m-d H:i:s', time());
-        $data['keyword3'] = $order['pay_price'];
-        if ($order['pay_type'] == 'yue') $data['keyword4'] = '余额支付';
-        else if ($order['pay_type'] == 'weixin') $data['keyword4'] = '微信支付';
-        else if ($order['pay_type'] == 'offline') $data['keyword4'] = '线下支付';
-        $data['keyword5']['value'] = '已成功退款';
-        return self::sendOut('ORDER_REFUND_SUCCESS', $order['uid'], $data);
+        if (is_string($order['cart_id']))
+            $order['cart_id'] = json_decode($order['cart_id'], true);
+        $storeTitle = StoreOrder::getProductTitle($order['cart_id']);
+        $storeTitle = StoreOrder::getSubstrUTf8($storeTitle, 20,'UTF-8','');
+        return self::sendOut('ORDER_REFUND', $order['uid'], [
+            'thing1' => '已成功退款',
+            'thing2' => $storeTitle,
+            'amount3' => $order['pay_price'],
+            'character_string6' => $order['order_id']
+        ], '/pages/order_details/index?order_id=' . $order['order_id'] . '&isReturen=1');
+    }
+
+    /**
+     * 订单退款失败
+     * @param $order
+     * @return bool
+     */
+    public static function sendOrderRefundFail($order, $storeTitle)
+    {
+        return self::sendOut('ORDER_REFUND', $order['uid'], [
+            'thing1' => '退款失败',
+            'thing2' => $storeTitle,
+            'amount3' => $order['pay_price'],
+            'character_string6' => $order['order_id']
+        ], '/pages/order_details/index?order_id=' . $order['order_id'] . '&isReturen=1');
     }
 
     /**
@@ -79,14 +129,15 @@ class RoutineTemplate
      * @param string $refundReasonWap
      * @param array $adminList
      */
-    public static function sendOrderRefundStatus($order = array(), $refundReasonWap = '', $adminList = array())
+    public static function sendOrderRefundStatus($order)
     {
-        $data['keyword1'] = $order['order_id'];
-        $data['keyword2'] = $refundReasonWap;
-        $data['keyword3'] = date('Y-m-d H:i:s', time());
-        $data['keyword4'] = $order['pay_price'];
-        $data['keyword5'] = '原路返回';
-        foreach ($adminList as $uid) {
+        $data['character_string4'] = $order['order_id'];
+        $data['date5'] = date('Y-m-d H:i:s', time());
+        $data['amount2'] = $order['pay_price'];
+        $data['phrase7'] = '申请退款中';
+        $data['thing8'] = '请及时处理';
+        $kefuIds = ServiceModel::where('notify', 1)->column('uid', 'uid');
+        foreach ($kefuIds as $uid) {
             self::sendOut('ORDER_REFUND_STATUS', $uid, $data);
         }
     }
@@ -100,35 +151,122 @@ class RoutineTemplate
      */
     public static function sendBargainSuccess($bargain = array(), $bargainUser = array(), $bargainUserId = 0)
     {
-        $data['keyword1'] = $bargain['title'];
-        $data['keyword2'] = $bargainUser['bargain_price'];
-        $data['keyword3'] = $bargainUser['bargain_price_min'];
-        $data['keyword4'] = $bargainUser['price'];
-        $data['keyword5'] = $bargainUser['bargain_price_min'];
-        $data['keyword6'] = '恭喜您,已经砍到最低价了';
-        return self::sendOut('BARGAIN_SUCCESS', $bargainUser['uid'], $data);
+        $data['thing1'] = $bargain['title'];
+        $data['amount2'] = $bargainUser['min_price'];
+        $data['thing3'] = '恭喜您,已经砍到最低价了';
+        return self::sendOut('BARGAIN_SUCCESS', $bargainUser['uid'], $data, '/pages/activity/user_goods_bargain_list/index');
     }
 
     /**
      * 订单支付成功发送模板消息
-     * @param string $formId
-     * @param string $orderId
+     * @param $uid
+     * @param $pay_price
+     * @param $orderId
+     * @param $payTime
      * @return bool|void
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
      */
-    public static function sendOrderSuccess($formId = '', $orderId = '')
+    public static function sendOrderSuccess($uid, $pay_price, $orderId)
     {
         if ($orderId == '') return;
-        $order = StoreOrder::where('order_id', $orderId)->find();
-        $data['keyword1'] = $orderId;
-        $data['keyword2'] = date('Y-m-d H:i:s', time());
-        $data['keyword3'] = '已支付';
-        $data['keyword4'] = $order['pay_price'];
-        if ($order['pay_type'] == 'yue') $data['keyword5'] = '余额支付';
-        else if ($order['pay_type'] == 'weixin') $data['keyword5'] = '微信支付';
-        return self::sendOut('ORDER_PAY_SUCCESS', $order['uid'], $data, $formId, '/pages/order_details/index?order_id=' . $orderId);
+        $data['character_string1'] = $orderId;
+        $data['amount2'] = $pay_price . '元';
+        $data['date3'] = date('Y-m-d H:i:s', time());
+        return self::sendOut('ORDER_PAY_SUCCESS', $uid, $data, '/pages/order_details/index?order_id=' . $orderId);
+    }
+
+    /**
+     *提现失败
+     * @param $uid
+     * @param $msg
+     * @param $extract_number
+     * @param $extract_type
+     * @return bool
+     */
+    public static function sendExtractFail($uid, $msg, $extract_number, $nickname)
+    {
+        return self::sendOut('USER_EXTRACT', $uid, [
+            'thing1' => '提现失败:' . $msg,
+            'amount2' => $extract_number . '元',
+            'thing3' => $nickname,
+            'date4' => date('Y-m-d H:i:s', time())
+        ], '/pages/user_spread_money/index');
+    }
+
+    /**
+     * 提现成功
+     * @param $uid
+     * @param $extract_number
+     * @param $nickname
+     * @return bool
+     */
+    public static function sendExtractSuccess($uid, $extract_number, $nickname)
+    {
+        return self::sendOut('USER_EXTRACT', $uid, [
+            'thing1' => '提现成功',
+            'amount2' => $extract_number . '元',
+            'thing3' => $nickname,
+            'date4' => date('Y-m-d H:i:s', time())
+        ], '/pages/user_spread_money/index');
+    }
+
+    /**
+     * 拼团成功通知
+     * @param $uid
+     * @param $pinkTitle
+     * @param $nickname
+     * @param $pinkTime
+     * @param $count
+     * @return bool
+     */
+    public static function sendPinkSuccess($uid, $pinkTitle, $nickname, $pinkTime, $count, string $link = '')
+    {
+        return self::sendOut('PINK_TRUE', $uid, [
+            'thing1' => StoreOrder::getSubstrUTf8($pinkTitle, 20,'UTF-8',''),
+            'name3' => $nickname,
+            'date5' => date('Y-m-d H:i:s', $pinkTime),
+            'number2' => $count
+        ], $link);
+    }
+
+    /**
+     * 拼团状态通知
+     * @param $uid
+     * @param $pinkTitle
+     * @param $count
+     * @param $remarks
+     * @return bool
+     */
+    public static function sendPinkFail($uid, $pinkTitle, $count, $remarks, $link)
+    {
+        return self::sendOut('PINK_STATUS', $uid, [
+            'thing2' => StoreOrder::getSubstrUTf8($pinkTitle,20,'UTF-8',''),
+            'thing1' => $count,
+            'thing3' => $remarks
+        ], $link);
+    }
+
+    /**
+     * 赠送积分消息提醒
+     * @param $uid
+     * @param $order
+     * @param $gainIntegral
+     * @param $integral
+     * @return bool
+     */
+    public static function sendUserIntegral($uid, $order, $gainIntegral, $integral)
+    {
+        if (!$order) return false;
+        if (is_string($order['cart_id']))
+            $order['cart_id'] = json_decode($order['cart_id'], true);
+        $storeTitle = StoreOrder::getProductTitle($order['cart_id']);
+        $storeTitle = StoreOrder::getSubstrUTf8($storeTitle, 20);
+        return self::sendOut('INTEGRAL_ACCOUT', $uid, [
+            'character_string2' => $order['order_id'],
+            'thing3' => $storeTitle,
+            'amount4' => $order['pay_price'],
+            'number5' => $gainIntegral,
+            'number6' => $integral
+        ], '/pages/user_bill/index?type=2');
     }
 
     /**
@@ -136,26 +274,13 @@ class RoutineTemplate
      * @param string $TempCode 模板消息常量名称
      * @param int $uid 用户uid
      * @param array $data 模板内容
-     * @param string $formId formId
      * @param string $link 跳转链接
      * @return bool
      */
-    public static function sendOut($TempCode, $uid = null, $data = null, $formId = '', $link = '')
+    public static function sendOut(string $tempCode, $uid, array $data, string $link = '')
     {
-        try {
-            $openid = WechatUser::uidToOpenid($uid);
-            if (!$openid) return false;
-            if (!$formId) {
-                $form = RoutineFormId::getFormIdOne($uid, true);
-                if (!$form) return false;
-                if (isset($form['id'])) RoutineFormId::where('id', $form['id'])->delete();
-            } else {
-                $form['form_id'] = $formId;
-            }
-            return Template::instance()->routine()->setTemplateUrl($link)->setTemplateOpenId($openid)
-                ->setTemplateData($data)->setTemplateFormId($form['form_id'])->setTemplateCode($TempCode)->send();
-        } catch (\Exception $e) {
-            return false;
-        }
+        $openid = WechatUser::uidToOpenid($uid);
+        if (!$openid) return false;
+        return Template::instance()->subscribe()->setTemplateUrl($link)->setTemplateOpenId($openid)->setTemplateData($data)->setTemplateCode($tempCode)->send();
     }
 }

+ 2 - 1
crmeb/app/models/store/StoreCategory.php

@@ -74,8 +74,9 @@ class StoreCategory extends BaseModel
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
-    public static function byIndexList($limit = 4, $field = 'id,cate_name,pid,pic')
+    public static function byIndexList($limit = 4,bool $bool = true, $field = 'id,cate_name,pid,pic')
     {
+        if(!$limit && !$bool) return [];
         return self::where('pid', '>', 0)->where('is_show', 1)->field($field)->order('sort DESC')->limit($limit)->select();
     }
 

Разлика између датотеке није приказан због своје велике величине
+ 230 - 245
crmeb/app/models/store/StoreOrder.php


Разлика између датотеке није приказан због своје велике величине
+ 356 - 332
crmeb/app/models/store/StorePink.php


+ 25 - 21
crmeb/app/models/store/StoreProduct.php

@@ -58,9 +58,9 @@ class StoreProduct extends BaseModel
         else return false;
     }
 
-    public static function getGoodList($limit=18,$field='*')
+    public static function getGoodList($limit = 18, $field = '*')
     {
-        return self::validWhere()->where('is_good',1)->order('sort desc,id desc')->limit($limit)->field($field)->select();
+        return self::validWhere()->where('is_good', 1)->order('sort desc,id desc')->limit($limit)->field($field)->select();
     }
 
     public static function validWhere()
@@ -104,8 +104,8 @@ class StoreProduct extends BaseModel
         if ($salesOrder) $baseOrder = $salesOrder == 'desc' ? 'sales DESC' : 'sales ASC';//虚拟销量
         if ($baseOrder) $baseOrder .= ', ';
         $model->order($baseOrder . 'sort DESC, add_time DESC');
-        $list = $model->page((int)$page, (int)$limit)->field('id,store_name,cate_id,image,IFNULL(sales,0) + IFNULL(ficti,0) as sales,price,stock')->select()->each(function ($item) use($uid,$type){
-            if($type) {
+        $list = $model->page((int)$page, (int)$limit)->field('id,store_name,cate_id,image,IFNULL(sales,0) + IFNULL(ficti,0) as sales,price,stock')->select()->each(function ($item) use ($uid, $type) {
+            if ($type) {
                 $item['is_att'] = StoreProductAttrValueModel::where('product_id', $item['id'])->count() ? true : false;
                 if ($uid) $item['cart_num'] = StoreCart::where('is_pay', 0)->where('is_del', 0)->where('is_new', 0)->where('type', 'product')->where('product_id', $item['id'])->where('uid', $uid)->value('cart_num');
                 else $item['cart_num'] = 0;
@@ -154,8 +154,9 @@ class StoreProduct extends BaseModel
      * @param int $limit
      * @return false|\PDOStatement|string|\think\Collection
      */
-    public static function getNewProduct($field = '*', $limit = 0, $uid = 0)
+    public static function getNewProduct($field = '*', $limit = 0, $uid = 0, bool $bool = true)
     {
+        if (!$limit && !$bool) return [];
         $model = self::where('is_new', 1)->where('is_del', 0)->where('mer_id', 0)
             ->where('stock', '>', 0)->where('is_show', 1)->field($field)
             ->order('sort DESC, id DESC');
@@ -192,11 +193,11 @@ class StoreProduct extends BaseModel
      */
     public static function getHotProductLoading($field = '*', $page = 0, $limit = 0)
     {
-        if(!$limit) return  [];
+        if (!$limit) return [];
         $model = self::where('is_hot', 1)->where('is_del', 0)->where('mer_id', 0)
             ->where('stock', '>', 0)->where('is_show', 1)->field($field)
             ->order('sort DESC, id DESC');
-        if($page) $model->page($page, $limit);
+        if ($page) $model->page($page, $limit);
         $list = $model->select();
         if (is_object($list)) return $list->toArray();
         return $list;
@@ -208,8 +209,9 @@ class StoreProduct extends BaseModel
      * @param int $limit
      * @return false|\PDOStatement|string|\think\Collection
      */
-    public static function getBestProduct($field = '*', $limit = 0, $uid = 0)
+    public static function getBestProduct($field = '*', $limit = 0, $uid = 0, bool $bool = true)
     {
+        if (!$limit && !$bool) return [];
         $model = self::where('is_best', 1)->where('is_del', 0)->where('mer_id', 0)
             ->where('stock', '>', 0)->where('is_show', 1)->field($field)
             ->order('sort DESC, id DESC');
@@ -217,7 +219,7 @@ class StoreProduct extends BaseModel
         return self::setLevelPrice($model->select(), $uid);
     }
 
-    /*
+    /**
      * 设置会员价格
      * @param object | array $list 产品列表
      * @param int $uid 用户uid
@@ -226,7 +228,7 @@ class StoreProduct extends BaseModel
     public static function setLevelPrice($list, $uid, $isSingle = false)
     {
         if (is_object($list)) $list = count($list) ? $list->toArray() : [];
-        if (!sysConfig('vip_open')) {
+        if (!sys_config('vip_open')) {
             if (is_array($list)) return $list;
             return $isSingle ? $list : 0;
         }
@@ -314,13 +316,14 @@ class StoreProduct extends BaseModel
         } else {
             $res = false !== self::where('id', $productId)->dec('stock', $num)->inc('sales', $num)->update();
         }
-        if($res){
+        if ($res) {
             $stock = self::where('id', $productId)->value('stock');
-            $replenishment_num = sysConfig('store_stock') ?? 0;//库存预警界限
-            if($replenishment_num >= $stock){
-                try{
-                    ChannelService::instance()->send('STORE_STOCK', ['id'=>$productId]);
-                }catch (\Exception $e){}
+            $replenishment_num = sys_config('store_stock') ?? 0;//库存预警界限
+            if ($replenishment_num >= $stock) {
+                try {
+                    ChannelService::instance()->send('STORE_STOCK', ['id' => $productId]);
+                } catch (\Exception $e) {
+                }
             }
         }
         return $res;
@@ -359,7 +362,7 @@ class StoreProduct extends BaseModel
      */
     public static function getPacketPrice($storeInfo, $productValue)
     {
-        $store_brokerage_ratio = sysConfig('store_brokerage_ratio');
+        $store_brokerage_ratio = sys_config('store_brokerage_ratio');
         $store_brokerage_ratio = bcdiv($store_brokerage_ratio, 100, 2);
         if (count($productValue)) {
             $Maxkey = self::getArrayMax($productValue, 'price');
@@ -452,11 +455,12 @@ class StoreProduct extends BaseModel
      * @param string $field
      * @return mixed
      */
-    public static function getProductField($id,$field = 'store_name'){
-        if(is_array($id))
-            return self::where('id','in',$id)->field($field)->select();
+    public static function getProductField($id, $field = 'store_name')
+    {
+        if (is_array($id))
+            return self::where('id', 'in', $id)->field($field)->select();
         else
-            return self::where('id',$id)->value($field);
+            return self::where('id', $id)->value($field);
     }
 
 }

+ 12 - 11
crmeb/app/models/system/SystemStore.php

@@ -28,33 +28,34 @@ class SystemStore extends BaseModel
     protected $name = 'system_store';
 
 
-    public static function getLatlngAttr($value,$data)
+    public static function getLatlngAttr($value, $data)
     {
-        return $data['latitude'].','.$data['longitude'];
+        return $data['latitude'] . ',' . $data['longitude'];
     }
 
     public static function verificWhere()
     {
-        return self::where('is_show',1)->where('is_del',0);
+        return self::where('is_show', 1)->where('is_del', 0);
     }
+
     /*
      * 获取门店信息
      * @param int $id
      * */
-    public static function getStoreDispose($id = 0,$felid='')
+    public static function getStoreDispose($id = 0, $felid = '')
     {
-        if($id)
-            $storeInfo = self::verificWhere()->where('id',$id)->find();
+        if ($id)
+            $storeInfo = self::verificWhere()->where('id', $id)->find();
         else
             $storeInfo = self::verificWhere()->find();
-        if($storeInfo) {
+        if ($storeInfo) {
             $storeInfo['latlng'] = self::getLatlngAttr(null, $storeInfo);
             $storeInfo['valid_time'] = $storeInfo['valid_time'] ? explode(' - ', $storeInfo['valid_time']) : [];
-            $storeInfo['_valid_time'] = str_replace('-','/',($storeInfo['valid_time'][0] ?? '').' ~ '.($storeInfo['valid_time'][1]) ?? '');
-            $storeInfo['day_time'] = $storeInfo['day_time'] ? str_replace(' - ',' ~ ',$storeInfo['day_time']) : [];
-            $storeInfo['_detailed_address'] = $storeInfo['address'].' '.$storeInfo['detailed_address'];
+            $storeInfo['_valid_time'] = str_replace('-', '/', ($storeInfo['valid_time'][0] ?? '') . ' ~ ' . ($storeInfo['valid_time'][1] ?? ""));
+            $storeInfo['day_time'] = $storeInfo['day_time'] ? str_replace(' - ', ' ~ ', $storeInfo['day_time']) : [];
+            $storeInfo['_detailed_address'] = $storeInfo['address'] . ' ' . $storeInfo['detailed_address'];
             $storeInfo['address'] = $storeInfo['address'] ? explode(',', $storeInfo['address']) : [];
-            if($felid) return $storeInfo[$felid] ?? '';
+            if ($felid) return $storeInfo[$felid] ?? '';
         }
         return $storeInfo;
     }

+ 18 - 18
crmeb/app/models/user/User.php

@@ -114,7 +114,7 @@ class User extends BaseModel
                 'last_ip' => request()->ip(),
             ];
             //TODO 获取后台分销类型
-            $storeBrokerageStatus = sysConfig('store_brokerage_statu');
+            $storeBrokerageStatus = sys_config('store_brokerage_statu');
             $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
             if (isset($wechatUser['code']) && $wechatUser['code'] && $wechatUser['code'] != $uid && $uid != self::where('uid', $wechatUser['code'])->value('spread_uid')) {
                 if ($storeBrokerageStatus == 1) {
@@ -155,7 +155,7 @@ class User extends BaseModel
         if ($spread == $uid) return true;
         if ($uid == self::where('uid', $spread)->value('spread_uid')) return true;
         //TODO 获取后台分销类型
-        $storeBrokerageStatus = sysConfig('store_brokerage_statu');
+        $storeBrokerageStatus = sys_config('store_brokerage_statu');
         $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
         if ($storeBrokerageStatus == 1) {
             $spreadCount = self::where('uid', $spread)->count();
@@ -183,7 +183,7 @@ class User extends BaseModel
         self::beginTrans();
         $res1 = true;
         if ($spread_uid) $res1 = self::where('uid', $spread_uid)->inc('spread_count', 1)->update();
-//        $storeBrokerageStatu = sysConfig('store_brokerage_statu') ? : 1;//获取后台分销类型
+//        $storeBrokerageStatu = sys_config('store_brokerage_statu') ? : 1;//获取后台分销类型
         $res2 = self::create([
             'account' => 'rt' . $routineUser['uid'] . time(),
             'pwd' => md5(123456),
@@ -242,7 +242,7 @@ class User extends BaseModel
     public static function isUserSpread($uid = 0)
     {
         if (!$uid) return false;
-        $status = (int)sysConfig('store_brokerage_statu');
+        $status = (int)sys_config('store_brokerage_statu');
         $isPromoter = true;
         if ($status == 1) $isPromoter = self::where('uid', $uid)->value('is_promoter');
         if ($isPromoter) return true;
@@ -259,7 +259,7 @@ class User extends BaseModel
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
-    public static function backOrderBrokerage($orderInfo)
+    public static function backOrderBrokerage($orderInfo,bool $open = true)
     {
         //TODO 如果时营销产品不返佣金
         if (isset($orderInfo['combination_id']) && $orderInfo['combination_id']) return true;
@@ -272,14 +272,14 @@ class User extends BaseModel
         //TODO 当前用户不存在 没有上级 或者 当用用户上级时自己  直接返回
         if (!$userInfo || !$userInfo['spread_uid'] || $userInfo['spread_uid'] == $orderInfo['uid']) return true;
         //TODO 获取后台分销类型  1 指定分销 2 人人分销
-        $storeBrokerageStatus = sysConfig('store_brokerage_statu');
+        $storeBrokerageStatus = sys_config('store_brokerage_statu');
         $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
         //TODO 指定分销 判断 上级是否时推广员  如果不是推广员直接跳转二级返佣
         if ($storeBrokerageStatus == 1) {
-            if (!User::be(['uid' => $userInfo['spread_uid'], 'is_promoter' => 1])) return self::backOrderBrokerageTwo($orderInfo);
+            if (!User::be(['uid' => $userInfo['spread_uid'], 'is_promoter' => 1])) return self::backOrderBrokerageTwo($orderInfo,$open);
         }
         //TODO 获取后台一级返佣比例
-        $storeBrokerageRatio = sysConfig('store_brokerage_ratio');
+        $storeBrokerageRatio = sys_config('store_brokerage_ratio');
         //TODO 一级返佣比例 小于等于零时直接返回 不返佣
         if ($storeBrokerageRatio <= 0) return true;
         //TODO 计算获取一级返佣比例
@@ -299,14 +299,14 @@ class User extends BaseModel
         //TODO 上级推广员返佣之后的金额
         $balance = bcadd($spreadUserInfo['brokerage_price'], $brokeragePrice, 2);
         $mark = $userInfo['nickname'] . '成功消费' . floatval($orderInfo['pay_price']) . '元,奖励推广佣金' . floatval($brokeragePrice);
-        self::beginTrans();
+        $open && self::beginTrans();
         //TODO 添加推广记录
         $res1 = UserBill::income('获得推广佣金', $userInfo['spread_uid'], 'now_money', 'brokerage', $brokeragePrice, $orderInfo['id'], $balance, $mark);
         //TODO 添加用户余额
         $res2 = self::bcInc($userInfo['spread_uid'], 'brokerage_price', $brokeragePrice, 'uid');
         //TODO 一级返佣成功 跳转二级返佣
-        $res = $res1 && $res2 && self::backOrderBrokerageTwo($orderInfo);
-        self::checkTrans($res);
+        $res = $res1 && $res2 && self::backOrderBrokerageTwo($orderInfo,$open);
+        $open && self::checkTrans($res);
 //        if($res) return self::backOrderBrokerageTwo($orderInfo);
         return $res;
     }
@@ -320,7 +320,7 @@ class User extends BaseModel
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
-    public static function backOrderBrokerageTwo($orderInfo)
+    public static function backOrderBrokerageTwo($orderInfo,bool $open = true)
     {
         //TODO 获取购买商品的用户
         $userInfo = User::getUserInfo($orderInfo['uid']);
@@ -329,14 +329,14 @@ class User extends BaseModel
         //TODO 上推广人不存在 或者 上推广人没有上级  或者 当用用户上上级时自己  直接返回
         if (!$userInfoTwo || !$userInfoTwo['spread_uid'] || $userInfoTwo['spread_uid'] == $orderInfo['uid']) return true;
         //TODO 获取后台分销类型  1 指定分销 2 人人分销
-        $storeBrokerageStatus = sysConfig('store_brokerage_statu');
+        $storeBrokerageStatus = sys_config('store_brokerage_statu');
         $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
         //TODO 指定分销 判断 上上级是否时推广员  如果不是推广员直接返回
         if ($storeBrokerageStatus == 1) {
             if (!User::be(['uid' => $userInfoTwo['spread_uid'], 'is_promoter' => 1])) return true;
         }
         //TODO 获取二级返佣比例
-        $storeBrokerageTwo = sysConfig('store_brokerage_two');
+        $storeBrokerageTwo = sys_config('store_brokerage_two');
         //TODO 二级返佣比例小于等于0 直接返回
         if ($storeBrokerageTwo <= 0) return true;
         //TODO 计算获取二级返佣比例
@@ -356,13 +356,13 @@ class User extends BaseModel
         //TODO 获取上上级推广员返佣之后余额
         $balance = bcadd($spreadUserInfoTwo['brokerage_price'], $brokeragePrice, 2);
         $mark = '二级推广人' . $userInfo['nickname'] . '成功消费' . floatval($orderInfo['pay_price']) . '元,奖励推广佣金' . floatval($brokeragePrice);
-        self::beginTrans();
+        $open && self::beginTrans();
         //TODO 添加返佣记录
         $res1 = UserBill::income('获得推广佣金', $userInfoTwo['spread_uid'], 'now_money', 'brokerage', $brokeragePrice, $orderInfo['id'], $balance, $mark);
         //TODO 添加用户余额
         $res2 = self::bcInc($userInfoTwo['spread_uid'], 'brokerage_price', $brokeragePrice, 'uid');
         $res = $res1 && $res2;
-        self::checkTrans($res);
+        $open && self::checkTrans($res);
         return $res;
     }
 
@@ -505,7 +505,7 @@ class User extends BaseModel
         // 自己不能绑定自己为上级
         if ($uid == $spreadUid) return false;
         //TODO 获取后台分销类型
-        $storeBrokerageStatus = sysConfig('store_brokerage_statu');
+        $storeBrokerageStatus = sys_config('store_brokerage_statu');
         $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
         if ($storeBrokerageStatus == 1) {
             $spreadCount = self::where('uid', $spreadUid)->count();
@@ -561,7 +561,7 @@ class User extends BaseModel
         $data['last_time'] = time();
         $data['last_ip'] = app('request')->ip();
         $data['nickname'] = substr(md5($account . time()), 0, 12);
-        $data['avatar'] = $data['headimgurl'] = sysConfig('h5_avatar');
+        $data['avatar'] = $data['headimgurl'] = sys_config('h5_avatar');
         $data['city'] = '';
         $data['language'] = '';
         $data['province'] = '';

+ 1 - 1
crmeb/app/models/user/WechatUser.php

@@ -160,7 +160,7 @@ class WechatUser extends BaseModel
         if (isset($userInfo['unionid'])) {
             $wechatInfo = self::where('unionid', $userInfo['unionid'])->find();
             if ($wechatInfo) {
-                return self::edit($userInfo, $userInfo['unionid'], 'unionid');
+                return self::edit(is_object($userInfo) ? $userInfo->toArray() : $userInfo, $userInfo['unionid'], 'unionid');
             }
         }
         self::beginTrans();

+ 4 - 3
crmeb/crmeb/repositories/NoticeRepositories.php

@@ -15,6 +15,7 @@ use app\models\routine\RoutineTemplate;
 use app\models\store\StoreOrderCartInfo;
 use app\models\user\User;
 use crmeb\services\YLYService;
+use think\facade\Log;
 use think\facade\Route;
 
 /** 消息通知静态类
@@ -52,7 +53,7 @@ class NoticeRepositories
                     //订单支付成功后给客服发送客服消息
                     CustomerRepository::sendOrderPaySuccessCustomerService($order, 1);
                 } else if ($routineOpenid && in_array($order['is_channel'],[1,2])) {//小程序发送模板消息
-                    RoutineTemplate::sendOrderSuccess($formId, $order['order_id']);
+                    RoutineTemplate::sendOrderSuccess($order['uid'],$order['pay_price'], $order['order_id']);
                     //订单支付成功后给客服发送客服消息
                     CustomerRepository::sendOrderPaySuccessCustomerService($order, 0);
                 }
@@ -61,7 +62,7 @@ class NoticeRepositories
             }
         }
         //打印小票
-        $switch = sysConfig('pay_success_printing_switch') ? true : false;
+        $switch = sys_config('pay_success_printing_switch') ? true : false;
         if ($switch) {
             try {
                 $order['cart_id'] = is_string($order['cart_id']) ? json_decode($order['cart_id'], true) : $order['cart_id'];
@@ -74,7 +75,7 @@ class NoticeRepositories
                     $value['productInfo']['store_name'] = StoreOrderCartInfo::getSubstrUTf8($value['productInfo']['store_name'], 10, 'UTF-8', '');
                     $product[] = $value;
                 }
-                YLYService::instance()->setContent(sysConfig('site_name'), is_object($order) ? $order->toArray() : $order, $product)->orderPrinting();
+                YLYService::instance()->setContent(sys_config('site_name'), is_object($order) ? $order->toArray() : $order, $product)->orderPrinting();
             } catch (\Exception $e) {
                 Log::error('小票打印出现错误,错误原因:' . $e->getMessage());
             }

+ 25 - 14
crmeb/crmeb/repositories/OrderRepository.php

@@ -1,4 +1,5 @@
 <?php
+
 namespace crmeb\repositories;
 
 use app\models\store\StoreOrder;
@@ -30,8 +31,8 @@ class OrderRepository
         $res2 = User::backOrderBrokerage($order);
         StoreOrder::orderTakeAfter($order);
         $giveCouponMinPrice = sysConfig('store_give_con_min_price');
-        if($order['total_price'] >= $giveCouponMinPrice) WechatUser::userTakeOrderGiveCoupon($uid);
-        if(!($res1 && $res2)) exception('收货失败!');
+        if ($order['total_price'] >= $giveCouponMinPrice) WechatUser::userTakeOrderGiveCoupon($uid);
+        if (!($res1 && $res2)) exception('收货失败!');
     }
 
     /**
@@ -45,7 +46,21 @@ class OrderRepository
         $res1 = AdminStoreOrder::gainUserIntegral($order);
         $res2 = User::backOrderBrokerage($order);
         AdminStoreOrder::orderTakeAfter($order);
-        if(!($res1 && $res2)) exception('收货失败!');
+        if (!($res1 && $res2)) exception('收货失败!');
+    }
+
+    /**
+     * 修改状态 为已收货  定时任务使用
+     * @param $order
+     * @throws \Exception
+     */
+    public static function storeProductOrderTakeDeliveryTimer($order)
+    {
+
+        $res1 = AdminStoreOrder::gainUserIntegral($order, false);
+        $res2 = User::backOrderBrokerage($order, false);
+        AdminStoreOrder::orderTakeAfter($order);
+        if (!($res1 && $res2)) exception('收货失败!');
     }
 
 
@@ -58,12 +73,13 @@ class OrderRepository
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
-    public static function storeProductOrderRefundY($data,$oid){
+    public static function storeProductOrderRefundY($data, $oid)
+    {
         $order = AdminStoreOrder::where('id', $oid)->find();
-        if($order['is_channel'] == 1)
+        if ($order['is_channel'] == 1)
             return AdminStoreOrder::refundRoutineTemplate($oid); //TODO 小程序余额退款模板消息
         else
-            return AdminStoreOrder::refundTemplate($data,$oid);//TODO 公众号余额退款模板消息
+            return AdminStoreOrder::refundTemplate($data, $oid);//TODO 公众号余额退款模板消息
     }
 
 
@@ -73,10 +89,10 @@ class OrderRepository
      * @param $refund_data
      * @throws \Exception
      */
-    public static function storeOrderYueRefund($product,$refund_data)
+    public static function storeOrderYueRefund($product, $refund_data)
     {
         $res = AdminStoreOrder::integralBack($product['id']);
-        if(!$res) exception('退积分失败!');
+        if (!$res) exception('退积分失败!');
     }
 
     /**
@@ -84,12 +100,7 @@ class OrderRepository
      * @param $product $product 商品信息
      * @param $back_integral $back_integral 退多少积分
      */
-    public static function storeOrderIntegralBack($product,$back_integral){
-
-    }
-
-
-    public static function computedOrder()
+    public static function storeOrderIntegralBack($product, $back_integral)
     {
 
     }

+ 6 - 2
crmeb/crmeb/services/CacheService.php

@@ -44,9 +44,13 @@ class CacheService
      * @param bool $default
      * @return mixed
      */
-    public static function get(string $name, $default = false)
+    public static function get(string $name, $default = false, int $expire = null)
     {
-        return self::handler()->remember($name, $default);
+        //这里不要去读取缓存配置,会导致死循环
+        $expire = $expire ?: SystemConfigService::get('cache_config', null, true);
+        if (!is_int($expire))
+            $expire = (int)$expire;
+        return self::handler()->remember($name, $default, $expire);
     }
 
     /**

+ 27 - 27
crmeb/crmeb/services/GroupDataService.php

@@ -24,10 +24,14 @@ class GroupDataService
     public static function getGroupData(string $config_name, $limit = 0, bool $isCaChe = false): array
     {
         $callable = function () use ($config_name, $limit) {
-            $data = SystemGroupData::getGroupData($config_name, $limit);
-            if (is_object($data))
-                $data = $data->toArray();
-            return $data;
+            try {
+                $data = SystemGroupData::getGroupData($config_name, $limit);
+                if (is_object($data))
+                    $data = $data->toArray();
+                return $data;
+            } catch (\Exception $e) {
+                return [];
+            }
         };
         try {
             $cacheName = $limit ? "group_data_{$config_name}_{$limit}" : "data_{$config_name}";
@@ -38,11 +42,7 @@ class GroupDataService
             return CacheService::get($cacheName, $callable);
 
         } catch (\Throwable $e) {
-            try {
-                return $callable();
-            } catch (\Exception $e) {
-                return [];
-            }
+            return $callable();
         }
     }
 
@@ -56,10 +56,14 @@ class GroupDataService
     public static function getData(string $config_name, int $limit = 0, bool $isCaChe = false): array
     {
         $callable = function () use ($config_name, $limit) {
-            $data = SystemGroupData::getAllValue($config_name, $limit);
-            if (is_object($data))
-                $data = $data->toArray();
-            return $data;
+            try {
+                $data = SystemGroupData::getAllValue($config_name, $limit);
+                if (is_object($data))
+                    $data = $data->toArray();
+                return $data;
+            } catch (\Exception $e) {
+                return [];
+            }
         };
         try {
             $cacheName = $limit ? "data_{$config_name}_{$limit}" : "data_{$config_name}";
@@ -70,11 +74,7 @@ class GroupDataService
             return CacheService::get($cacheName, $callable);
 
         } catch (\Throwable $e) {
-            try {
-                return $callable();
-            } catch (\Exception $e) {
-                return [];
-            }
+            return $callable();
         }
     }
 
@@ -87,10 +87,14 @@ class GroupDataService
     public static function getDataNumber(int $id, bool $isCaChe = false): array
     {
         $callable = function () use ($id) {
-            $data = SystemGroupData::getDateValue($id);
-            if (is_object($data))
-                $data = $data->toArray();
-            return $data;
+            try {
+                $data = SystemGroupData::getDateValue($id);
+                if (is_object($data))
+                    $data = $data->toArray();
+                return $data;
+            } catch (\Exception $e) {
+                return [];
+            }
         };
         try {
             $cacheName = "data_number_{$id}";
@@ -101,11 +105,7 @@ class GroupDataService
             return CacheService::get($cacheName, $callable);
 
         } catch (\Throwable $e) {
-            try {
-                return $callable();
-            } catch (\Exception $e) {
-                return [];
-            }
+            return $callable();
         }
     }
 }

+ 26 - 2
crmeb/crmeb/services/MiniProgramService.php

@@ -39,7 +39,7 @@ class MiniProgramService
             'key' => trim($payment['pay_routine_key']),
             'cert_path' => realpath('.' . $payment['pay_routine_client_cert']),
             'key_path' => realpath('.' . $payment['pay_routine_client_key']),
-            'notify_url' => $wechat['site_url'] . Url::buildUrl('/api/routine/notify')
+            'notify_url' => $wechat['site_url'] . Url::buildUrl('/api/routine/notify')->suffix(false)->build()
         ];
         return $config;
     }
@@ -49,7 +49,7 @@ class MiniProgramService
         (self::$instance === null || $cache === true) && (self::$instance = new Application(self::options()));
         return self::$instance;
     }
-    
+
     /**
      * 小程序接口
      * @return \EasyWeChat\MiniProgram\MiniProgram
@@ -133,6 +133,15 @@ class MiniProgramService
         return self::miniprogram()->notice;
     }
 
+    /**
+     * 订阅模板消息接口
+     * @return \crmeb\utils\ProgramSubscribe
+     */
+    public static function SubscribenoticeService()
+    {
+        return self::miniprogram()->now_notice;
+    }
+
     /**发送小程序模版消息
      * @param $openid
      * @param $templateId
@@ -150,6 +159,21 @@ class MiniProgramService
         return $notice->send($message);
     }
 
+    /**
+     * 发送订阅消息
+     * @param string $touser 接收者(用户)的 openid
+     * @param string $templateId 所需下发的订阅模板id
+     * @param array $data 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
+     * @param string $link 击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
+     * @return \EasyWeChat\Support\Collection|null
+     * @throws \EasyWeChat\Core\Exceptions\HttpException
+     * @throws \EasyWeChat\Core\Exceptions\InvalidArgumentException
+     */
+    public static function sendSubscribeTemlate(string $touser, string $templateId, array $data, string $link = '')
+    {
+        return self::SubscribenoticeService()->to($touser)->template($templateId)->andData($data)->withUrl($link)->send();
+    }
+
 
     /**
      * 支付

+ 89 - 0
crmeb/crmeb/services/SubscribeTemplateService.php

@@ -0,0 +1,89 @@
+<?php
+
+namespace crmeb\services;
+
+use app\admin\model\wechat\WechatUser;
+use app\admin\model\wechat\StoreService as ServiceModel;
+use app\models\routine\RoutineTemplate;
+use crmeb\interfaces\ProviderInterface;
+use think\facade\Db;
+
+/**
+ * 小程序模板消息
+ * Class RoutineTemplate
+ * @package app\routine\model\routine
+ */
+class SubscribeTemplateService implements ProviderInterface
+{
+
+    //订单发货提醒(送货)
+    const ORDER_POSTAGE_SUCCESS = 1128;
+    //提现成功通知
+    const USER_EXTRACT = 1470;
+    //确认收货通知
+    const OREDER_TAKEVER = 1481;
+    //订单取消
+    const ORDER_CLONE = 1134;
+    //订单发货提醒(快递)
+    const ORDER_DELIVER_SUCCESS = 1458;
+    //拼团成功
+    const PINK_TRUE = 3098;
+    //砍价成功
+    const BARGAIN_SUCCESS = 2727;
+    //核销成功通知
+    const ORDER_WRITE_OFF = 3116;
+    //新订单提醒
+    const ORDER_NEW = 1476;
+    //退款通知
+    const ORDER_REFUND = 1451;
+    //充值成功
+    const RECHARGE_SUCCESS = 755;
+    //订单支付成功
+    const ORDER_PAY_SUCCESS = 1927;
+    //申请退款通知 管理员提醒
+    const ORDER_REFUND_STATUS = 1468;
+    //积分到账提醒
+    const INTEGRAL_ACCOUT = 335;
+    //拼团状态通知
+    const PINK_STATUS = 3353;
+
+    public static function getConstants($code = '')
+    {
+        $oClass = new \ReflectionClass(__CLASS__);
+        $stants = $oClass->getConstants();
+        if ($code) return isset($stants[$code]) ? $stants[$code] : '';
+        else return $stants;
+    }
+
+    public function register($config)
+    {
+
+    }
+
+    /**
+     * 根据模板编号获取模板ID
+     * @param string $tempKey
+     * @return mixed|string
+     */
+    public static function setTemplateId($tempKey = '')
+    {
+        if ($tempKey == '') return '';
+        return RoutineTemplate::where('tempkey', $tempKey)->where('status', 1)->value('tempid');
+    }
+
+
+    /**
+     * 发送订阅模板消息
+     * @param string $tempCode 所需下发的模板编号
+     * @param string $openId 接收者(用户)的 openid
+     * @param array $dataKey 模板内容,不填则下发空模板
+     * @param string $link 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
+     * @return bool|\EasyWeChat\Support\Collection|null
+     */
+    public static function sendTemplate(string $tempCode, string $openId, array $dataKey, string $link = '')
+    {
+        if (!$openId || !$tempCode) return false;
+        return MiniProgramService::sendSubscribeTemlate($openId, trim(self::setTemplateId(self::getConstants($tempCode))), $dataKey, $link);
+    }
+
+}

+ 29 - 15
crmeb/crmeb/services/UploadService.php

@@ -13,6 +13,7 @@ use crmeb\services\storage\Qiniu;
 use crmeb\traits\LogicTrait;
 use think\exception\ValidateException;
 use think\facade\Filesystem;
+use Guzzle\Http\EntityBody;
 use think\File;
 
 /**
@@ -191,7 +192,7 @@ class UploadService
     {
         $info = [];
         try {
-            $uploadType = $this->uploadType ?: sysConfig('upload_type');
+            $uploadType = $this->uploadType ?: sys_config('upload_type');
             //TODO 没有选择默认使用本地上传
             if (!$uploadType)
                 $uploadType = 1;
@@ -257,8 +258,6 @@ class UploadService
             if (!isset($header['Content-Length'])) $header['Content-Length'] = 0;
             if (!isset($header['Content-Type'])) $header['Content-Type'] = 'image/jpeg';
         } catch (\Exception $e) {
-            $header['Content-Length'] = 0;
-            $header['Content-Type'] = 'image/jpeg';
         }
         return $header;
     }
@@ -301,7 +300,7 @@ class UploadService
      */
     public function uploadLocalStream($key, $content, $root = '')
     {
-        $siteUrl = sysConfig('site_url') . '/';
+        $siteUrl = sys_config('site_url') . '/';
         $path = self::uploadDir($this->uploadPath, $root);
         $path = str_replace('\\', DS, $path);
         $path = str_replace('/', DS, $path);
@@ -325,7 +324,7 @@ class UploadService
      */
     public function imageStream($key, $content, $root = '')
     {
-        $uploadType = sysConfig('upload_type');
+        $uploadType = sys_config('upload_type');
         //TODO 没有选择默认使用本地上传
         if (!$uploadType) $uploadType = 1;
         $info = [];
@@ -405,11 +404,10 @@ class UploadService
      */
     public function file($fileName)
     {
-        if (!isset($_FILES[$fileName])) return self::setError('上传文件不存在!');
-        $extension = strtolower(pathinfo($_FILES[$fileName]['name'], PATHINFO_EXTENSION));
-        if (strtolower($extension) == 'php' || !$extension)
-            return self::setError('上传文件非法!');
         $file = request()->file($fileName);
+        if (!$file) return self::setError('上传文件不存在!');
+        if (strtolower($file->getOriginalExtension()) === 'php' || !$file->getOriginalExtension())
+            return self::setError('上传文件非法!');
         if ($this->autoValidate) {
             try {
                 validate([$fileName => $this->imageValidate])->check([$fileName => $file]);
@@ -422,11 +420,11 @@ class UploadService
         return self::successful(str_replace('\\', '/', $fileName));
     }
 
-    public static function pathToUrl($path)
-    {
-        return trim(str_replace(DS, '/', $path), '.');
-    }
-
+    /**
+     * 打开图片
+     * @param $filePath
+     * @return \think\Image
+     */
     public function openImage($filePath)
     {
         return \think\Image::open($filePath);
@@ -443,7 +441,13 @@ class UploadService
      */
     public function thumb($filePath, $ratio = 5, $pre = 's_')
     {
-        $img = $this->openImage($filePath);
+        try {
+            $img = $this->openImage($filePath);
+        } catch (\Throwable $e) {
+            $dir = dirname($filePath);
+            $fileName = basename($filePath);
+            return $dir . DS . $fileName;
+        }
         $width = $img->width() * $ratio / 10;
         $height = $img->height() * $ratio / 10;
         $dir = dirname($filePath);
@@ -453,4 +457,14 @@ class UploadService
         if (substr($savePath, 0, 2) == './') return substr($savePath, 1, strlen($savePath));
         return DS . $savePath;
     }
+
+    /**
+     * TODO 转为文件流
+     * @param $resource
+     * @return EntityBody
+     */
+    public static function resourceStream($resource)
+    {
+        return EntityBody::factory($resource)->__toString();
+    }
 }

+ 1 - 0
crmeb/crmeb/services/YLYService.php

@@ -3,6 +3,7 @@
 namespace crmeb\services;
 
 use app\models\system\Cache as CacheModel;
+use crmeb\exceptions\AuthException;
 use crmeb\interfaces\ProviderInterface;
 use crmeb\traits\LogicTrait;
 

+ 6 - 13
crmeb/crmeb/traits/LogicTrait.php

@@ -23,17 +23,6 @@ trait LogicTrait
      */
     protected static $instance;
 
-    /**
-     * 静态方法调用
-     * @param $method 调用方法
-     * @param $params 参数
-     * @return mixed
-     */
-    public static function __callStatic($method, $params)
-    {
-        return call_user_func_array([self::$instance, $method], $params);
-    }
-
     /**
      * 配置参数
      * @param array $config
@@ -171,8 +160,12 @@ trait LogicTrait
                 return $this;
             }
         } else if (in_array($method, $keys)) {
-            $this->sendType = $method;
-            return $this;
+            if (property_exists($this, 'handleType') && array_shift($ages) !== true) {
+                $this->handleType = $method;
+                return $this;
+            } else {
+                return $this->{$method};
+            }
         } else {
             throw new AuthException('Method does not exist:' . $method);
         }

+ 115 - 94
crmeb/crmeb/traits/ModelTrait.php

@@ -4,6 +4,7 @@
  * @author: xaboy<365615158@qq.com>
  * @day: 2017/11/11
  */
+
 namespace crmeb\traits;
 
 use think\db\Query;
@@ -13,14 +14,15 @@ trait ModelTrait
 {
     public static function get($where)
     {
-        if(!is_array($where)){
+        if (!is_array($where)) {
             return self::find($where);
-        }else{
+        } else {
             return self::where($where)->find();
         }
     }
 
-    public static function all($function){
+    public static function all($function)
+    {
         $query = self::newQuery();
         $function($query);
         return $query->select();
@@ -34,7 +36,7 @@ trait ModelTrait
      */
     public static function setAll($group, $replace = false)
     {
-        return self::insertAll($group,$replace);
+        return self::insertAll($group, $replace);
     }
 
     /**
@@ -44,17 +46,17 @@ trait ModelTrait
      * @param $field
      * @return bool $type 返回成功失败
      */
-    public static function edit($data,$id,$field = null)
+    public static function edit($data, $id, $field = null)
     {
         $model = new self;
-        if(!$field) $field = $model->getPk();
+        if (!$field) $field = $model->getPk();
 //        return false !== $model->update($data,[$field=>$id]);
 //        return 0 < $model->update($data,[$field=>$id])->result;
-        $res = $model->update($data,[$field=>$id]);
-        if(isset($res->result))
+        $res = $model->update($data, [$field => $id]);
+        if (isset($res->result))
             return 0 < $res->result;
-        else if(isset($res['data']['result']))
-            return  0 < $res['data']['result'];
+        else if (isset($res['data']['result']))
+            return 0 < $res['data']['result'];
         else
             return false !== $res;
     }
@@ -69,8 +71,8 @@ trait ModelTrait
     public static function be($map, $field = '')
     {
         $model = (new self);
-        if(!is_array($map) && empty($field)) $field = $model->getPk();
-        $map = !is_array($map) ? [$field=>$map] : $map;
+        if (!is_array($map) && empty($field)) $field = $model->getPk();
+        $map = !is_array($map) ? [$field => $map] : $map;
         return 0 < $model->where($map)->count();
     }
 
@@ -95,40 +97,41 @@ trait ModelTrait
      */
     public static function page($model = null, $eachFn = null, $params = [], $limit = 20)
     {
-        if(is_numeric($eachFn) && is_numeric($model)){
-            return parent::page($model,$eachFn);
+        if (is_numeric($eachFn) && is_numeric($model)) {
+            return parent::page($model, $eachFn);
         }
-        
-        if(is_numeric($eachFn)){
+
+        if (is_numeric($eachFn)) {
             $limit = $eachFn;
             $eachFn = null;
-        }else if(is_array($eachFn)){
+        } else if (is_array($eachFn)) {
             $params = $eachFn;
             $eachFn = null;
         }
 
-        if(is_callable($model)){
+        if (is_callable($model)) {
             $eachFn = $model;
             $model = null;
-        }elseif(is_numeric($model)){
+        } elseif (is_numeric($model)) {
             $limit = $model;
             $model = null;
-        }elseif(is_array($model)){
+        } elseif (is_array($model)) {
             $params = $model;
             $model = null;
         }
 
-        if(is_numeric($params)){
+        if (is_numeric($params)) {
             $limit = $params;
             $params = [];
         }
 
-        $paginate = $model === null ? self::paginate($limit,false,['query'=>$params]) : $model->paginate($limit,false,['query'=>$params]);
+        $paginate = $model === null ? self::paginate($limit, false, ['query' => $params]) : $model->paginate($limit, false, ['query' => $params]);
         $list = is_callable($eachFn) ? $paginate->each($eachFn) : $paginate;
         $page = $list->render();
         $total = $list->total();
-        return compact('list','page','total');
+        return compact('list', 'page', 'total');
     }
+
     /**
      * 获取分页 生成where 条件和 whereOr 支持多表查询生成条件
      * @param object $model 模型对象
@@ -139,115 +142,129 @@ trait ModelTrait
      * @param string $like 模糊查找 关键字
      * @return array
      */
-    public static function setWherePage($model=null,$where=[],$field=[],$fieldOr=[],$fun=null,$like='LIKE'){
-        if(!is_array($where) || !is_array($field)) return false;
-        if($model===null) $model=new self();
+    public static function setWherePage($model = null, $where = [], $field = [], $fieldOr = [], $fun = null, $like = 'LIKE')
+    {
+        if (!is_array($where) || !is_array($field)) return false;
+        if ($model === null) $model = new self();
         //处理等于行查询
-        foreach ($field as $key=>$item){
-            if(($count=strpos($item,'.'))===false){
-                if(isset($where[$item]) && $where[$item]!='') {
-                    $model=$model->where($item,$where[$item]);
+        foreach ($field as $key => $item) {
+            if (($count = strpos($item, '.')) === false) {
+                if (isset($where[$item]) && $where[$item] != '') {
+                    $model = $model->where($item, $where[$item]);
                 }
-            }else{
-                $item_l=substr($item,$count+1);
-                if(isset($where[$item_l]) && $where[$item_l]!=''){
-                    $model=$model->where($item,$where[$item_l]);
+            } else {
+                $item_l = substr($item, $count + 1);
+                if (isset($where[$item_l]) && $where[$item_l] != '') {
+                    $model = $model->where($item, $where[$item_l]);
                 }
             }
         }
         //回收变量
-        unset($count,$key,$item,$item_l);
+        unset($count, $key, $item, $item_l);
         //处理模糊查询
-        if(!empty($fieldOr) && is_array($fieldOr) && isset($fieldOr[0])){
-            if(($count=strpos($fieldOr[0],'.'))===false){
-                if(isset($where[$fieldOr[0]]) && $where[$fieldOr[0]]!='') {
-                    $model=$model->where(self::get_field($fieldOr),$like,"%".$where[$fieldOr[0]]."%");
+        if (!empty($fieldOr) && is_array($fieldOr) && isset($fieldOr[0])) {
+            if (($count = strpos($fieldOr[0], '.')) === false) {
+                if (isset($where[$fieldOr[0]]) && $where[$fieldOr[0]] != '') {
+                    $model = $model->where(self::get_field($fieldOr), $like, "%" . $where[$fieldOr[0]] . "%");
                 }
-            }else{
-                $item_l = substr($fieldOr[0],$count+1);
-                if(isset($where[$item_l]) && $where[$item_l]!='') {
-                    $model=$model->where(self::get_field($fieldOr),$like,"%".$where[$item_l]."%");
+            } else {
+                $item_l = substr($fieldOr[0], $count + 1);
+                if (isset($where[$item_l]) && $where[$item_l] != '') {
+                    $model = $model->where(self::get_field($fieldOr), $like, "%" . $where[$item_l] . "%");
                 }
             }
         }
-        unset($count,$key,$item,$item_l);
+        unset($count, $key, $item, $item_l);
         return $model;
     }
+
     /**
      * 字符串拼接
      * @param int|array $id
      * @param string $str
      * @return string
      */
-    private static function get_field($id,$str='|'){
-        if(is_array($id)){
-            $sql="";
-            $i=0;
-            foreach($id as $val){
+    private static function get_field($id, $str = '|')
+    {
+        if (is_array($id)) {
+            $sql = "";
+            $i = 0;
+            foreach ($id as $val) {
                 $i++;
-                if($i<count($id)){
-                    $sql.=$val.$str;
-                }else{
-                    $sql.=$val;
+                if ($i < count($id)) {
+                    $sql .= $val . $str;
+                } else {
+                    $sql .= $val;
                 }
             }
-            return  $sql;
-        }else{
+            return $sql;
+        } else {
             return $id;
         }
     }
+
     /**
      * 条件切割
      * @param string $order
      * @param string $file
      * @return string
      */
-    public static function setOrder($order,$file='-'){
-        if(empty($order)) return '';
-        return str_replace($file,' ',$order);
+    public static function setOrder($order, $file = '-')
+    {
+        if (empty($order)) return '';
+        return str_replace($file, ' ', $order);
     }
+
     /**
      * 获取时间段之间的model
      * @param int|string $time
      * @param string $ceil
      * @return array
      */
-    public static function getModelTime($where,$model=null,$prefix='add_time',$data='data',$field=' - '){
+    public static function getModelTime($where, $model = null, $prefix = 'add_time', $data = 'data', $field = ' - ')
+    {
         if ($model == null) $model = new self;
-        if(!isset($where[$data])) return $model;
-        switch ($where[$data]){
-            case 'today':case 'week':case 'month':case 'year':case 'yesterday':
-            $model=$model->whereTime($prefix,$where[$data]);
-            break;
+        if (!isset($where[$data])) return $model;
+        switch ($where[$data]) {
+            case 'today':
+            case 'week':
+            case 'month':
+            case 'year':
+            case 'yesterday':
+                $model = $model->whereTime($prefix, $where[$data]);
+                break;
             case 'quarter':
-                list($startTime,$endTime)=self::getMonth();
+                list($startTime, $endTime) = self::getMonth();
                 $model = $model->where($prefix, '>', strtotime($startTime));
                 $model = $model->where($prefix, '<', strtotime($endTime));
                 break;
             case 'lately7':
-                $model = $model->where($prefix,'between',[strtotime("-7 day"),time()]);
+                $model = $model->where($prefix, 'between', [strtotime("-7 day"), time()]);
                 break;
             case 'lately30':
-                $model = $model->where($prefix,'between',[strtotime("-30 day"),time()]);
+                $model = $model->where($prefix, 'between', [strtotime("-30 day"), time()]);
                 break;
             default:
-                if(strstr($where[$data],$field)!==false){
+                if (strstr($where[$data], $field) !== false) {
                     list($startTime, $endTime) = explode($field, $where[$data]);
                     $model = $model->where($prefix, '>', strtotime($startTime));
-                    $model = $model->where($prefix, '<', bcadd(strtotime($endTime),86400,0));
+                    $model = $model->where($prefix, '<', bcadd(strtotime($endTime), 86400, 0));
                 }
                 break;
         }
         return $model;
     }
+
     /**
      * 获取去除html去除空格去除软回车,软换行,转换过后的字符串
      * @param string $str
      * @return string
      */
-    public static function HtmlToMbStr($str){
-        return trim(strip_tags(str_replace(["\n","\t","\r"," ","&nbsp;"],'',htmlspecialchars_decode($str))));
+    public static function HtmlToMbStr($str)
+    {
+        return trim(strip_tags(str_replace(["\n", "\t", "\r", " ", "&nbsp;"], '', htmlspecialchars_decode($str))));
     }
+
     /**
      * 截取中文指定字节
      * @param string $str
@@ -256,27 +273,31 @@ trait ModelTrait
      * @param string $file
      * @return string
      */
-    public static function getSubstrUTf8($str,$utf8len=100,$chaet='UTF-8',$file='....'){
-        if(mb_strlen($str,$chaet) > $utf8len){
-            $str = mb_substr($str,0,$utf8len,$chaet).$file;
+    public static function getSubstrUTf8($str, $utf8len = 100, $chaet = 'UTF-8', $file = '....')
+    {
+        if (mb_strlen($str, $chaet) > $utf8len) {
+            $str = mb_substr($str, 0, $utf8len, $chaet) . $file;
         }
         return $str;
     }
+
     /**
      * 获取本季度 time
      * @param int|string $time
      * @param string $ceil
      * @return array
      */
-    public static function getMonth($time='',$ceil=0){
-        if($ceil!=0)
-            $season = ceil(date('n') /3)-$ceil;
+    public static function getMonth($time = '', $ceil = 0)
+    {
+        if ($ceil != 0)
+            $season = ceil(date('n') / 3) - $ceil;
         else
-            $season = ceil(date('n') /3);
-        $firstday = date('Y-m-01',mktime(0,0,0,($season - 1) *3 +1,1,date('Y')));
-        $lastday = date('Y-m-t',mktime(0,0,0,$season * 3,1,date('Y')));
-        return array($firstday,$lastday);
+            $season = ceil(date('n') / 3);
+        $firstday = date('Y-m-01', mktime(0, 0, 0, ($season - 1) * 3 + 1, 1, date('Y')));
+        $lastday = date('Y-m-t', mktime(0, 0, 0, $season * 3, 1, date('Y')));
+        return array($firstday, $lastday);
     }
+
     /**
      * 高精度 加法
      * @param int|string $uid id
@@ -286,14 +307,14 @@ trait ModelTrait
      * @param int $acc 精度
      * @return bool
      */
-    public static function bcInc($key, $incField, $inc, $keyField = null, $acc=2)
+    public static function bcInc($key, $incField, $inc, $keyField = null, $acc = 2)
     {
-        if(!is_numeric($inc)) return false;
+        if (!is_numeric($inc)) return false;
         $model = new self();
-        if($keyField === null) $keyField = $model->getPk();
-        $result = self::where($keyField,$key)->find();
-        if(!$result) return false;
-        $new = bcadd($result[$incField],$inc,$acc);
+        if ($keyField === null) $keyField = $model->getPk();
+        $result = self::where($keyField, $key)->find();
+        if (!$result) return false;
+        $new = bcadd($result[$incField], $inc, $acc);
         $result->$incField = $new;
         return false !== $result->save();
 //        return false !== $model->where($keyField,$key)->update([$incField=>$new]);
@@ -310,15 +331,15 @@ trait ModelTrait
      * @param int $acc 精度
      * @return bool
      */
-    public static function bcDec($key, $decField, $dec, $keyField = null, $minus = false, $acc=2)
+    public static function bcDec($key, $decField, $dec, $keyField = null, $minus = false, $acc = 2)
     {
-        if(!is_numeric($dec)) return false;
+        if (!is_numeric($dec)) return false;
         $model = new self();
-        if($keyField === null) $keyField = $model->getPk();
-        $result = self::where($keyField,$key)->find();
-        if(!$result) return false;
-        if(!$minus && $result[$decField] < $dec) return false;
-        $new = bcsub($result[$decField],$dec,$acc);
+        if ($keyField === null) $keyField = $model->getPk();
+        $result = self::where($keyField, $key)->find();
+        if (!$result) return false;
+        if (!$minus && $result[$decField] < $dec) return false;
+        $new = bcsub($result[$decField], $dec, $acc);
         $result->$decField = $new;
         return false !== $result->save();
 //        return false !== $model->where($keyField,$key)->update([$decField=>$new]);

+ 30 - 9
crmeb/crmeb/utils/ProgramSubscribe.php

@@ -11,18 +11,19 @@ use EasyWeChat\Core\Exceptions\InvalidArgumentException;
  * Class ProgramSubscribe
  * @package crmeb\utils
  * @method $this
- * @method $this withTemplate(string $template_id) 设置模板id
+ * @method $this template(string $template_id) 设置模板id
  * @method $this withTemplateId(string $template_id) 设置模板id
  * @method $this andTemplateId(string $template_id) 设置模板id
  * @method $this andTemplate(string $template_id) 设置模板id
  * @method $this andUses(string $template_id) 设置模板id
- * @method $this andTo(string $touser) 设置opendid
+ * @method $this to(string $touser) 设置opendid
  * @method $this andReceiver(string $touser) 设置opendid
  * @method $this withReceiver(string $touser) 设置opendid
  * @method $this with(array $data) 设置发送内容
  * @method $this andData(array $data) 设置发送内容
  * @method $this withData(array $data) 设置发送内容
  * @method $this data(array $data) 设置发送内容
+ * @method $this withUrl(string $page) 设置跳转路径
  */
 class ProgramSubscribe extends AbstractAPI
 {
@@ -205,13 +206,33 @@ class ProgramSubscribe extends AbstractAPI
     }
 
     /**
-     * TODO: 未实现
-     * @param $data
-     * @return mixed
+     * 设置订阅消息发送data
+     * @param array $data
+     * @return array
      */
-    protected function formatData($data)
+    protected function formatData(array $data)
     {
-        return $data;
+        $return = [];
+
+        foreach ($data as $key => $item) {
+            if (is_scalar($item)) {
+                $value = $item;
+            } elseif (is_array($item) && !empty($item)) {
+                if (isset($item['value'])) {
+                    $value = strval($item['value']);
+                } elseif (count($item) < 2) {
+                    $value = array_shift($item);
+                } else {
+                    [$value] = $item;
+                }
+            } else {
+                $value = 'error data item.';
+            }
+
+            $return[$key] = ['value' => $value];
+        }
+
+        return $return;
     }
 
 
@@ -230,8 +251,8 @@ class ProgramSubscribe extends AbstractAPI
             'uses' => 'template_id',
             'to' => 'touser',
             'receiver' => 'touser',
-            'url' => 'url',
-            'link' => 'url',
+            'url' => 'page',
+            'link' => 'page',
             'data' => 'data',
             'with' => 'data',
         ];

+ 25 - 15
crmeb/crmeb/utils/Template.php

@@ -20,22 +20,24 @@ use think\app\Url;
  * @method $this setTemplateFormId(string $templateFormId) 设置发送模板消息formid
  * @method $this setTemplateDefaultColor(string $templateDefaultColor) 设置发送模板消息默认背景颜色
  * @method $this setTemplateCode(string $templateCode) 设置模板id
- * @method $this setSendType($sendType) 设置发送类型句柄 1 = 小程序 , 2 = 公众号
+ * @method $this setHandleType($handleType) 设置发送类型句柄 1 = 小程序 , 2 = 公众号
  * @method $this setDefaultData($defaultData) 设置默认数据
  * @method $this setTemplateUrl(Url $url, string $sux = '') 设置跳转Url
  * @method $this routine() 设置当前发送类型句柄为 小程序
  * @method $this wechat() 设置当前发送类型句柄为 公众号
+ * @method $this subscribe() 设置当前发送类型句柄为 小程序订阅消息
  */
 class Template
 {
     use LogicTrait;
 
     /**
-     * 注册服务 会自动添加$providers对应的key名称方法方便设置$sendType
+     * 注册服务 会自动添加$providers对应的key名称方法方便设置$handleType
      * @var array
      */
     protected $providers = [
         'routine' => \crmeb\services\ProgramTemplateService::class,
+        'subscribe' => \crmeb\services\SubscribeTemplateService::class,
         'wechat' => \crmeb\services\WechatTemplateService::class,
     ];
 
@@ -49,7 +51,7 @@ class Template
         'templateData' => [[], 'array'],
         'templateUrl' => [null, 'callable', 'postpositionUrl'],
         'templateFormId' => [null, 'string'],
-        'sendType' => [null, 'string'],
+        'handleType' => [null, 'string'],
         'templateOpenId' => [null, 'string'],
         'templateOpenId' => [null, 'string'],
     ];
@@ -88,7 +90,7 @@ class Template
      * 发送类型 对应 $providers key
      * @var string | int
      */
-    protected $sendType;
+    protected $handleType;
 
     /**
      * 接收人openid 小程序 和 公众号使用
@@ -118,7 +120,7 @@ class Template
      */
     public function postpositionUrl($url, string $suffix = '')
     {
-        if($url instanceof Url)
+        if ($url instanceof Url)
             $url = $url->suffix($suffix)->domain(true)->build();
         return $url;
     }
@@ -129,16 +131,16 @@ class Template
     protected function validate()
     {
         $keys = array_keys($this->providers);
-        if (is_string($this->sendType)) {
-            if (!in_array($this->sendType, $keys))
-                throw new AuthException('设置的发送类型句柄不存在:' . $this->sendType);
-        } elseif (is_int($this->sendType)) {
-            if ($this->sendType > count($keys))
-                throw new AuthException('设置的发送类型句柄不存在:' . $this->sendType);
-            $this->sendType = $keys[$this->sendType - 1];
+        if (is_string($this->handleType)) {
+            if (!in_array($this->handleType, $keys))
+                throw new AuthException('设置的发送类型句柄不存在:' . $this->handleType);
+        } elseif (is_int($this->handleType)) {
+            if ($this->handleType > count($keys))
+                throw new AuthException('设置的发送类型句柄不存在:' . $this->handleType);
+            $this->handleType = $keys[$this->handleType - 1];
         }
 
-        if (!$this->sendType)
+        if (!$this->handleType)
             throw new AuthException('请设置发送类型句柄');
 
         if (!$this->templateData)
@@ -160,7 +162,7 @@ class Template
             $this->validate();
 
             $resource = null;
-            switch ($this->sendType) {
+            switch ($this->handleType) {
                 case 'routine':
                     $resource = self::$instance->routine->sendTemplate(
                         $this->templateCode,
@@ -180,6 +182,14 @@ class Template
                         $this->templateDefaultColor
                     );
                     break;
+                case 'subscribe':
+                    $resource = self::$instance->subscribe->sendTemplate(
+                        $this->templateCode,
+                        $this->templateOpenId,
+                        $this->templateData,
+                        $this->templateUrl
+                    );
+                    break;
                 default:
                     $resource = false;
                     break;
@@ -206,7 +216,7 @@ class Template
         $this->templateDefaultColor = null;
         $this->templateData = [];
         $this->templateUrl = null;
-        $this->sendType = null;
+        $this->handleType = null;
         $this->templateFormId = null;
         $this->templateCode = null;
         return $this;

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/app.e41a6242.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-06379026.43b190c8.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-22637d46.ab18b94f.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-275e4407.4765fa5a.css


+ 1 - 0
crmeb/public/h5/css/chunk-40ea473b.d02dea3c.css

@@ -0,0 +1 @@
+.noCart[data-v-69b4fdee]{margin-top:.17rem;padding-top:.1rem}.noCart .pictrue[data-v-69b4fdee]{width:4rem;height:3rem;margin:.7rem auto .5rem auto}.noCart .pictrue img[data-v-69b4fdee]{width:100%;height:100%}

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-454f76eb.f58dbaf2.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-47d0e48c.5dae48a7.css


+ 1 - 0
crmeb/public/h5/css/chunk-61f534f5.114b89a4.css

@@ -0,0 +1 @@
+.noscroll[data-v-f4f096a6]{height:100%;overflow:hidden}.product-con .nav[data-v-f4f096a6]{padding:0 .2rem}

Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-6c70f5b1.1ebefd18.css


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/css/chunk-a540307a.42feabe3.css


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/app.9466dfb6.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/app.9466dfb6.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/app.edbed276.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/app.edbed276.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-03b2ddff.16d81690.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-03b2ddff.16d81690.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-06379026.730c506e.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-06379026.730c506e.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-074d26c0.4c8f6e53.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-074d26c0.4c8f6e53.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-0b32185c.307181ee.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-0b32185c.307181ee.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-126715f2.3cacb4ce.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-126715f2.3cacb4ce.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-146ed97a.7a6fabd0.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-146ed97a.7a6fabd0.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2107f928.a047a5de.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2107f928.a047a5de.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-22637d46.bf9fd936.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-22637d46.bf9fd936.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-249cbda8.3a11a19d.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-249cbda8.3a11a19d.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-275e4407.b6b5e06d.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-275e4407.b6b5e06d.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-293c3d87.7aa109ae.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-293c3d87.7aa109ae.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0b995a.41d89d52.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0b995a.41d89d52.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0c1002.f548018e.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0c1002.f548018e.js.map


Разлика између датотеке није приказан због своје велике величине
+ 12 - 0
crmeb/public/h5/js/chunk-2d0c4265.e0056573.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0c4265.e0056573.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0d0177.88479f7f.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0d0177.88479f7f.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0d3247.a21c1d5c.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0d3247.a21c1d5c.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0d6b8d.824173a6.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0d6b8d.824173a6.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0da964.cb78b008.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0da964.cb78b008.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d0f0b4a.9e8ad235.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d0f0b4a.9e8ad235.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d21f45b.cfd48a51.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d21f45b.cfd48a51.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2d5271a2.9c35a64c.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2d5271a2.9c35a64c.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-2df2bc60.e89fcf32.js


Разлика између датотеке није приказан због своје велике величине
+ 1 - 0
crmeb/public/h5/js/chunk-2df2bc60.e89fcf32.js.map


Разлика између датотеке није приказан због своје велике величине
+ 2 - 0
crmeb/public/h5/js/chunk-352a53ed.d0c010cf.js


+ 0 - 0
crmeb/public/h5/js/chunk-352a53ed.d0c010cf.js.map


Неке датотеке нису приказане због велике количине промена