rabin 1 週間 前
コミット
27ba2dff8a
100 ファイル変更3910 行追加582 行削除
  1. 9 0
      config/env/localhost.php
  2. 20 2
      config/manage.php
  3. 3 0
      config/setting.php
  4. 1 1
      package/manage/index.html
  5. 0 0
      package/manage/json/china.json
  6. 1 1
      package/manage/sector.html
  7. 0 4
      package/manage/static/css/213.89045697.css
  8. 0 4
      package/manage/static/css/780.4065063c.css
  9. 0 6
      package/manage/static/css/app.d065fbce.css
  10. 0 96
      package/manage/static/css/loading.css
  11. 0 4
      package/manage/static/css/vab-chunk-c6f52c3a.7f144303.css
  12. 0 4
      package/manage/static/css/vab-plugins.f6f5c03c.css
  13. BIN
      package/manage/static/fonts/remixicon.31d28485.f12fd1a0.eot
  14. BIN
      package/manage/static/fonts/remixicon.881fbc46.1e0fb76b.woff
  15. BIN
      package/manage/static/fonts/remixicon.888e61f0.e313410c.ttf
  16. BIN
      package/manage/static/fonts/remixicon.9915fef9.5400338c.woff2
  17. BIN
      package/manage/static/img/403.d6bd8853.png
  18. BIN
      package/manage/static/img/404.f02775f8.png
  19. BIN
      package/manage/static/img/background-1.31e3a0ac.png
  20. BIN
      package/manage/static/img/background.2f742bae.jpg
  21. BIN
      package/manage/static/img/login_form.242d2e10.png
  22. 0 153
      package/manage/static/img/remixicon.95138f36.2b2ee314.svg
  23. 0 5
      package/manage/static/js/213.48e7a62f.js
  24. 0 5
      package/manage/static/js/592.41e25131.js
  25. 0 5
      package/manage/static/js/780.f3d655d2.js
  26. 0 5
      package/manage/static/js/962.faf0c7f7.js
  27. 0 4
      package/manage/static/js/app.73165d0a.js
  28. 0 5
      package/manage/static/js/vab-chunk-0b9a05e8.3a2acba3.js
  29. 0 5
      package/manage/static/js/vab-chunk-54e012b3.e33f7ef1.js
  30. 0 5
      package/manage/static/js/vab-chunk-844ca20f.8fd468cb.js
  31. 0 5
      package/manage/static/js/vab-chunk-b3a4eaa1.14c91d44.js
  32. 0 5
      package/manage/static/js/vab-chunk-c6f52c3a.15a84744.js
  33. 0 5
      package/manage/static/js/vab-plugins.9f353d4c.js
  34. 1 1
      src/cate/manage/level_1.php
  35. 1 1
      src/cate/manage/level_2.php
  36. 1 1
      src/cate/manage/level_3.php
  37. 2 2
      src/place/act/lib/Core.php
  38. 5 0
      src/place/benefit/index.php
  39. 15 0
      src/place/benefit/lib/Code.php
  40. 148 0
      src/place/benefit/lib/Item.php
  41. 104 0
      src/place/benefit/lib/Item/Bonus.php
  42. 29 0
      src/place/benefit/lib/Item/Buy.php
  43. 72 0
      src/place/benefit/lib/Item/Coupon.php
  44. 19 0
      src/place/benefit/lib/Item/Exchange.php
  45. 54 0
      src/place/benefit/lib/Item/Gift.php
  46. 18 0
      src/place/benefit/lib/Item/Held.php
  47. 116 0
      src/place/benefit/lib/Item/Perk.php
  48. 75 0
      src/place/benefit/lib/Item/Promotion.php
  49. 105 0
      src/place/benefit/lib/Item/Rebate.php
  50. 121 0
      src/place/benefit/lib/Item/Score.php
  51. 19 0
      src/place/benefit/lib/Item/Score_num.php
  52. 19 0
      src/place/benefit/lib/Item/Visit.php
  53. 105 0
      src/place/benefit/lib/Scope.php
  54. 255 0
      src/place/benefit/lib/User.php
  55. 60 0
      src/place/benefit/manage/Lib/Api.php
  56. 29 0
      src/place/benefit/manage/Lib/Code.php
  57. 30 0
      src/place/benefit/manage/Lib/Perk.php
  58. 37 0
      src/place/benefit/manage/Lib/Rebate.php
  59. 69 0
      src/place/benefit/manage/Lib/Role.php
  60. 98 0
      src/place/benefit/manage/Lib/Scope.php
  61. 120 0
      src/place/benefit/manage/bonus.php
  62. 66 0
      src/place/benefit/manage/buy.php
  63. 143 0
      src/place/benefit/manage/core.php
  64. 130 0
      src/place/benefit/manage/coupon.php
  65. 44 0
      src/place/benefit/manage/exchange.php
  66. 32 0
      src/place/benefit/manage/exchange_scope.php
  67. 101 0
      src/place/benefit/manage/gift.php
  68. 38 0
      src/place/benefit/manage/held.php
  69. 107 0
      src/place/benefit/manage/perk.php
  70. 43 0
      src/place/benefit/manage/perk_code.php
  71. 17 0
      src/place/benefit/manage/perk_create_code.php
  72. 19 0
      src/place/benefit/manage/perk_voucher.php
  73. 69 0
      src/place/benefit/manage/promotion.php
  74. 62 0
      src/place/benefit/manage/rebate.php
  75. 24 0
      src/place/benefit/manage/rebate_rule.php
  76. 69 0
      src/place/benefit/manage/role.php
  77. 78 0
      src/place/benefit/manage/role_action.php
  78. 25 0
      src/place/benefit/manage/role_period.php
  79. 16 0
      src/place/benefit/manage/role_upgrade.php
  80. 27 0
      src/place/benefit/manage/scope.php
  81. 93 0
      src/place/benefit/manage/score.php
  82. 71 70
      src/place/benefit/manage/score_action.php
  83. 17 0
      src/place/benefit/manage/score_exchange.php
  84. 15 0
      src/place/benefit/manage/score_recharge.php
  85. 61 0
      src/place/benefit/manage/visit.php
  86. 108 0
      src/place/benefit/table/bonus.php
  87. 43 0
      src/place/benefit/table/buy.php
  88. 98 97
      src/place/benefit/table/coupon.php
  89. 30 0
      src/place/benefit/table/exchange.php
  90. 28 0
      src/place/benefit/table/exchange_scope.php
  91. 79 0
      src/place/benefit/table/gift.php
  92. 34 43
      src/place/benefit/table/held.php
  93. 96 0
      src/place/benefit/table/perk.php
  94. 54 38
      src/place/benefit/table/perk_code.php
  95. 43 0
      src/place/benefit/table/perk_code_item.php
  96. 21 0
      src/place/benefit/table/perk_create_code.php
  97. 36 0
      src/place/benefit/table/perk_voucher.php
  98. 49 0
      src/place/benefit/table/promotion.php
  99. 27 0
      src/place/benefit/table/rebate.php
  100. 36 0
      src/place/benefit/table/rebate_rule.php

+ 9 - 0
config/env/localhost.php

@@ -9,6 +9,15 @@ return [
         'pwd' => '123456',
     ],
 
+    'user' => [
+        'type' => 'Pdo',
+        'host' => 'web-mysql',
+        'port' => '3306',
+        'name' => DEVER_PROJECT,
+        'user' => 'root',
+        'pwd' => '123456',
+    ],
+
     'log' => [
         'type' => 'Mongo',
         'host' => 'web-mongodb',

+ 20 - 2
config/manage.php

@@ -1,6 +1,10 @@
 <?php
 # 后台配置
 return [
+
+    # 设置控制台数据
+    'console' => 'place_order/manage/source/stat.getConsole',
+
     # 设置系统
     'system' => [
         'sector' => [
@@ -73,10 +77,17 @@ return [
             'module' => 'sector_place',
             'app' => 'place_source',
         ],
+        'sector_place_benefit' => [
+            'name' => '权益',
+            'icon' => 'award-line',
+            'sort' => '101',
+            'module' => 'sector_place',
+            'app' => 'place_benefit',
+        ],
         'sector_place_channel' => [
             'name' => '渠道',
-            'icon' => 'album-line',
-            'sort' => '101',
+            'icon' => 'open-source-line',
+            'sort' => '102',
             'module' => 'sector_place',
             'app' => 'place_channel',
         ],
@@ -87,6 +98,13 @@ return [
             'module' => 'sector_place',
             'app' => 'place_user',
         ],
+        'sector_place_page' => [
+            'name' => '界面',
+            'icon' => 'pages-line',
+            'sort' => '104',
+            'module' => 'sector_place',
+            'app' => 'place_page',
+        ],
         'sector_place_set' => [
             'name' => '配置',
             'icon' => 'settings-2-line',

+ 3 - 0
config/setting.php

@@ -46,7 +46,10 @@ return [
         # sql优化,暂时无用
         'opt' => true,
         //'default' => [$env['db'], $env['db1'], 'type' => 'Pdo'],//读写分离
+        # 平台默认数据库
         'default' => $env['db'],
+        # 用户数据库
+        'user' => $env['user'],
         'log' => $env['log'],
 
         # 分区设置 

+ 1 - 1
package/manage/index.html

@@ -1 +1 @@
-<!doctype html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="webkit" name="renderer"/><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><link href="favicon.ico" rel="icon"/><title>Dever Manage</title><meta content="Dever,PHP,PHP框架,轻量,微服务,组件化,接口,低代码,后台,自定义后台,开发,快速开发,AI,人工智能,文档,轻应用,应用,时空之翼,神秘城" name="keywords"/><meta content="rabin@shemic.com" name="author"/><link href="static/css/loading.css?random=2025-05-22 17:30:19-shemic" rel="stylesheet"/><script src="config.js?random=2025-05-22 17:30:19-shemic" defer="defer"></script><script defer="defer" src="static/js/app.73165d0a.js"></script><script defer="defer" src="static/js/213.48e7a62f.js"></script><link href="static/css/app.d065fbce.css" rel="stylesheet"><link href="static/css/213.89045697.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="first-loading-wrp"><div class="loading-wrp"><span class="dot dot-spin"><i></i> <i></i> <i></i> <i></i></span></div><h1>Dever Manage</h1></div></div></body></html>
+<!doctype html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="webkit" name="renderer"/><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><link href="favicon.ico" rel="icon"/><title>Dever Manage</title><meta content="Dever,PHP,PHP框架,轻量,微服务,组件化,接口,低代码,后台,自定义后台,开发,快速开发,AI,人工智能,文档,轻应用,应用,时空之翼,神秘城" name="keywords"/><meta content="rabin@shemic.com" name="author"/><link href="static/css/loading.css?v=1753790913" rel="stylesheet"/><script src="config.js?v=1753790913" defer="defer"></script><script defer="defer" src="static/js/element-plus.js?v=1753790913"></script><script defer="defer" src="static/js/app.js?v=1753790913"></script><script defer="defer" src="static/js/89.js?v=1753790913"></script><link href="static/css/element-plus.css?v=1753790913" rel="stylesheet"><link href="static/css/app.css?v=1753790913" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="first-loading-wrp"><div class="loading-wrp"><span class="dot dot-spin"><i></i> <i></i> <i></i> <i></i></span></div><h1>Dever Manage</h1></div></div></body></html>

ファイルの差分が大きいため隠しています
+ 0 - 0
package/manage/json/china.json


+ 1 - 1
package/manage/sector.html

@@ -1 +1 @@
-<!doctype html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="webkit" name="renderer"/><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><link href="favicon.ico" rel="icon"/><title>Dever Manage</title><meta content="Dever,PHP,PHP框架,轻量,微服务,组件化,接口,低代码,后台,自定义后台,开发,快速开发,AI,人工智能,文档,轻应用,应用,时空之翼,神秘城" name="keywords"/><meta content="rabin@shemic.com" name="author"/><link href="static/css/loading.css?random=2025-05-22 17:30:19-shemic" rel="stylesheet"/><script src="sector_config.js?random=2025-05-22 17:30:19-shemic" defer="defer"></script><script defer="defer" src="static/js/app.73165d0a.js"></script><script defer="defer" src="static/js/213.48e7a62f.js"></script><link href="static/css/app.d065fbce.css" rel="stylesheet"><link href="static/css/213.89045697.css" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="first-loading-wrp"><div class="loading-wrp"><span class="dot dot-spin"><i></i> <i></i> <i></i> <i></i></span></div><h1>Dever Manage</h1></div></div></body></html>
+<!doctype html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="webkit" name="renderer"/><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><link href="favicon.ico" rel="icon"/><title>Dever Manage</title><meta content="Dever,PHP,PHP框架,轻量,微服务,组件化,接口,低代码,后台,自定义后台,开发,快速开发,AI,人工智能,文档,轻应用,应用,时空之翼,神秘城" name="keywords"/><meta content="rabin@shemic.com" name="author"/><link href="static/css/loading.css?v=1753790913" rel="stylesheet"/><script src="sector_config.js?v=1753790913" defer="defer"></script><script defer="defer" src="static/js/element-plus.js?v=1753790913"></script><script defer="defer" src="static/js/app.js?v=1753790913"></script><script defer="defer" src="static/js/89.js?v=1753790913"></script><link href="static/css/element-plus.css?v=1753790913" rel="stylesheet"><link href="static/css/app.css?v=1753790913" rel="stylesheet"></head><body><noscript></noscript><div id="app"><div class="first-loading-wrp"><div class="loading-wrp"><span class="dot dot-spin"><i></i> <i></i> <i></i> <i></i></span></div><h1>Dever Manage</h1></div></div></body></html>

ファイルの差分が大きいため隠しています
+ 0 - 4
package/manage/static/css/213.89045697.css


ファイルの差分が大きいため隠しています
+ 0 - 4
package/manage/static/css/780.4065063c.css


ファイルの差分が大きいため隠しています
+ 0 - 6
package/manage/static/css/app.d065fbce.css


+ 0 - 96
package/manage/static/css/loading.css

@@ -1,96 +0,0 @@
-.first-loading-wrp {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 90vh;
-  min-height: 90vh;
-}
-
-.first-loading-wrp > h1 {
-  font-size: 28px;
-  font-weight: bolder;
-}
-
-.first-loading-wrp .loading-wrp {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 98px;
-}
-
-.dot {
-  position: relative;
-  box-sizing: border-box;
-  display: inline-block;
-  width: 64px;
-  height: 64px;
-  font-size: 64px;
-  transform: rotate(45deg);
-  animation: antRotate 1.2s infinite linear;
-}
-
-.dot i {
-  position: absolute;
-  display: block;
-  width: 28px;
-  height: 28px;
-  background-color: #1890ff;
-  border-radius: 100%;
-  opacity: 0.3;
-  transform: scale(0.75);
-  transform-origin: 50% 50%;
-  animation: antSpinMove 1s infinite linear alternate;
-}
-
-.dot i:nth-child(1) {
-  top: 0;
-  left: 0;
-}
-
-.dot i:nth-child(2) {
-  top: 0;
-  right: 0;
-  -webkit-animation-delay: 0.4s;
-  animation-delay: 0.4s;
-}
-
-.dot i:nth-child(3) {
-  right: 0;
-  bottom: 0;
-  -webkit-animation-delay: 0.8s;
-  animation-delay: 0.8s;
-}
-
-.dot i:nth-child(4) {
-  bottom: 0;
-  left: 0;
-  -webkit-animation-delay: 1.2s;
-  animation-delay: 1.2s;
-}
-
-@keyframes antRotate {
-  to {
-    -webkit-transform: rotate(405deg);
-    transform: rotate(405deg);
-  }
-}
-
-@-webkit-keyframes antRotate {
-  to {
-    -webkit-transform: rotate(405deg);
-    transform: rotate(405deg);
-  }
-}
-
-@keyframes antSpinMove {
-  to {
-    opacity: 1;
-  }
-}
-
-@-webkit-keyframes antSpinMove {
-  to {
-    opacity: 1;
-  }
-}

ファイルの差分が大きいため隠しています
+ 0 - 4
package/manage/static/css/vab-chunk-c6f52c3a.7f144303.css


ファイルの差分が大きいため隠しています
+ 0 - 4
package/manage/static/css/vab-plugins.f6f5c03c.css


BIN
package/manage/static/fonts/remixicon.31d28485.f12fd1a0.eot


BIN
package/manage/static/fonts/remixicon.881fbc46.1e0fb76b.woff


BIN
package/manage/static/fonts/remixicon.888e61f0.e313410c.ttf


BIN
package/manage/static/fonts/remixicon.9915fef9.5400338c.woff2


BIN
package/manage/static/img/403.d6bd8853.png


BIN
package/manage/static/img/404.f02775f8.png


BIN
package/manage/static/img/background-1.31e3a0ac.png


BIN
package/manage/static/img/background.2f742bae.jpg


BIN
package/manage/static/img/login_form.242d2e10.png


ファイルの差分が大きいため隠しています
+ 0 - 153
package/manage/static/img/remixicon.95138f36.2b2ee314.svg


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/213.48e7a62f.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/592.41e25131.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/780.f3d655d2.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/962.faf0c7f7.js


ファイルの差分が大きいため隠しています
+ 0 - 4
package/manage/static/js/app.73165d0a.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-chunk-0b9a05e8.3a2acba3.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-chunk-54e012b3.e33f7ef1.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-chunk-844ca20f.8fd468cb.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-chunk-b3a4eaa1.14c91d44.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-chunk-c6f52c3a.15a84744.js


ファイルの差分が大きいため隠しています
+ 0 - 5
package/manage/static/js/vab-plugins.9f353d4c.js


+ 1 - 1
src/cate/manage/level_1.php

@@ -8,7 +8,7 @@ return [
             ],
             'sort' => [
                 'type' => 'input',
-                'tips' => '双击修改排序',
+                'tip' => '双击修改排序',
             ],
             'status' => [
                 'type' => 'switch',

+ 1 - 1
src/cate/manage/level_2.php

@@ -10,7 +10,7 @@ return [
             ],
             'sort' => [
                 'type' => 'input',
-                'tips' => '双击修改排序',
+                'tip' => '双击修改排序',
             ],
             'status' => [
                 'type' => 'switch',

+ 1 - 1
src/cate/manage/level_3.php

@@ -15,7 +15,7 @@ return [
             ],
             'sort' => [
                 'type' => 'input',
-                'tips' => '双击修改排序',
+                'tip' => '双击修改排序',
             ],
             'status' => [
                 'type' => 'switch',

+ 2 - 2
src/place/act/lib/Core.php

@@ -40,7 +40,7 @@ class Core
             if ($state) {
                 # 这里可以判断一下是否优质的评价 以后加
 
-                Dever::load('log', 'place_score')->action('互动', $this->db->config['name'])->add(Place::$uid);
+                Dever::load('log', 'place_score')->action($this->db->config['name'])->add(Place::$uid);
             }
         }
         return 'ok';
@@ -53,7 +53,7 @@ class Core
         if ($info) {
             $state = $this->db->delete($info['id']);
             if ($state) {
-                Dever::load('log', 'place_score')->action('互动', '取消' . $this->db->config['name'])->add(Place::$uid);
+                Dever::load('log', 'place_score')->action('取消' . $this->db->config['name'])->add(Place::$uid);
             }
         }
         return 'ok';

+ 5 - 0
src/place/benefit/index.php

@@ -0,0 +1,5 @@
+<?php
+define('DEVER_APP_NAME', 'place_benefit');
+define('DEVER_APP_LANG', '运营');
+define('DEVER_APP_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+include(DEVER_APP_PATH . '../boot.php');

+ 15 - 0
src/place/benefit/lib/Code.php

@@ -0,0 +1,15 @@
+<?php namespace Place_benefit\Lib;
+use Dever;
+class Code
+{
+    # 创建券码
+    public function create($type, $prefix, $length)
+    {
+        $code = $prefix . \Dever\Helper\Str::rand($length, $type-1);
+        $check = Dever::db('perk_code', 'place_benefit')->find(['code' => $code]);
+        if (!$check) {
+            return $code;
+        }
+        return $this->create($type, $prefix, $length);
+    }
+}

+ 148 - 0
src/place/benefit/lib/Item.php

@@ -0,0 +1,148 @@
+<?php namespace Place_benefit\Lib;
+use Dever;
+class Item
+{
+    # 载入某个权益
+    public function load($name)
+    {
+        return Dever::load('item/' . $name, 'place_benefit');
+    }
+
+    # 直接获取权益数据
+    public function getList($type, $scope = '', $where = [], $set = [])
+    {
+        $result = [];
+        $where['status'] = 1;
+        $data = Dever::db($type, 'place_benefit')->select($where, $set);
+        if ($data) {
+            if ($scope) {
+                foreach ($data as $info) {
+                    $list = Dever::db('scope', 'place_benefit')->select(['type' => $type, 'type_id' => $info['id']]);
+                    if ($list) {
+                        foreach ($list as $v1) {
+                            $state = Dever::load('scope', 'place_benefit')->valid($scope, $v1['value'], $v1['ids']);
+                            if ($state) {
+                                $result[] = $info;
+                            }
+                        }
+                    } else {
+                        $result[] = $info;
+                    }
+                }
+            } else {
+                $result = $data;
+            }
+        }
+        return $result;
+    }
+
+    # 获取权益类型
+    public function getType($type = 1, $column = false)
+    {
+        $value = [
+            ['id' => 'promotion', 'name' => '促销'],
+            ['id' => 'rebate', 'name' => '返利'],
+            ['id' => 'bonus', 'name' => '分红'],
+            ['id' => 'score', 'name' => '积分规则'],
+            # 购买上限
+            ['id' => 'buy', 'name' => '购买限额'],
+            # 内容下载、查看上限
+            ['id' => 'visit', 'name' => '访问限额'],
+        ];
+        if ($type == 1) {
+            # 固定权益
+            $value = array_merge([
+                ['id' => 'select', 'name' => '选择权益'],
+            ], $value);
+            return $value;
+        }
+        $value = array_merge([
+            ['id' => 'select', 'name' => '选择权益'],
+            ['id' => 'score_num', 'name' => '奖励积分'],
+            //['id' => 'exchange', 'name' => '兑换'],# 用优惠券替代
+            ['id' => 'coupon', 'name' => '优惠券'],
+            # 可以余额抵扣
+            ['id' => 'gift', 'name' => '礼品卡'],
+            ['id' => 'held', 'name' => '持有权'],
+        ], $value);
+        if ($type == 2) {
+            # 周期权益
+            $value[] = ['id' => 'perk', 'name' => '权益包'];
+        }
+        if ($column) {
+            return array_column($value, 'name', 'id');
+        }
+        return $value;
+    }
+
+    # 获取权益类型数据
+    public function getTypeData($type, $type_id = false, $desc = [])
+    {
+        if ($type == 'select') {
+            return [];
+        }
+        $where = [];
+        $method = 'select';
+        if ($type_id) {
+            $where = ['id' => $type_id];
+            $method = 'find';
+        }
+        $result = [];
+        switch ($type) {
+            # 积分数值
+            case 'score_num':
+                $result = Dever::db('info', 'place_score')->$method($where);
+                break;
+
+            default:
+                $result = Dever::db($type, 'place_benefit')->$method($where);
+        }
+        if ($type_id && $desc) {
+            # 解析出描述
+            if (is_array($desc)) {
+                $result += $desc;
+            }
+            $result['config_type'] = $type;
+            $result['config_type_id'] = $type_id;
+            $result = Dever::load('item/' . $type, 'place_benefit')->getDesc($result);
+        }
+        return $result;
+    }
+
+    # 获取周期权益通用描述
+    public function getPeriodDesc($info)
+    {
+        if (isset($info['config_day'])) {
+            if (isset($info['desc']) && $info['desc']) {
+                $info['desc'] .= ',';
+            } else {
+                $info['desc'] = '';
+            }
+            if ($info['config_day'] > 0) {
+                $info['desc'] .= '每' . $info['config_day'] . '天';
+            }
+            $info['desc'] .= '可领取' . $this->getNumDesc($info['config_type'], $info['config_type_id'], $info['config_num']);
+            if ($info['config_max'] > 0) {
+                $info['desc'] .= ',最多领取' . $info['config_max'] . '次';
+            }
+        }
+        return $info['desc'];
+    }
+
+    # 获取数量描述
+    public function getNumDesc($type, $type_id, $num)
+    {
+        if ($type == 'score_num') {
+            $score = Dever::db('info', 'place_score')->find($type_id);
+            $result = Dever::load('info', 'place_score')->getText($num, $score);
+        } else {
+            $result = floor($num);
+            if ($type == 'coupon' || $type == 'gift' || $type == 'perk' || $type == 'held') {
+                $result .= '个';
+            } else {
+                $result .= '次';
+            }
+        }
+        return $result;
+    }
+}

+ 104 - 0
src/place/benefit/lib/Item/Bonus.php

@@ -0,0 +1,104 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 分红
+class Bonus
+{
+    # 获取用户是否可以分红
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        if ($price <= 0) {
+            return false;
+        }
+        $data = Dever::load('user', 'place_benefit')->getValid($uid, 'rebate', $scope);
+        if ($data) {
+            $result = ['rule' => $rule, 'buy' => ['name' => '购买立返', 'desc' => []], 'share' => ['name' => '分享可赚', 'desc' => []]];
+            foreach ($data as $info) {
+                $rule = Dever::db('rebate_rule', 'place_benefit')->select(['rebate_id' => $info['id']], ['col' => 'id,value,`condition`,level,score_id']);
+                foreach ($rule as $k => $v) {
+                    if (!$v['value']) {
+                        continue;
+                    }
+                    if ($v['condition'] && !$this->check($uid, $v['condition'])) {
+                        continue;
+                    }
+                    $v['source_value'] = $v['value'];
+                    $v['value'] = Dever::math('value', $price, $v['value']);
+                    if ($v['value'] > 0) {
+                        $score = Dever::db('info', 'place_score')->find($v['score_id'], ['col' => 'id,name,symbol,symbol_location']);
+                        if (isset($result['rule'][$v['id']])) {
+                            $v['value'] += $result['rule'][$v['id']]['value'];
+                        }
+                        $v['value_text'] = Dever::load('info', 'place_score')->getText($v['value'], $score);
+                        $v['rebate_id'] = $info['id'];
+                        $v['name'] = $info['name'];
+                        $result['rule'][$v['id']] = $v;
+                        if ($v['level'] == 0) {
+                            # 购买可得
+                            $result['buy']['desc'][$v['id']] = $v['value_text'];
+                        } elseif ($v['level'] == 1) {
+                            # 分享可得
+                            $result['share']['desc'][$v['id']] = $v['value_text'];
+                        }
+                    }
+                }
+            }
+            $result['buy']['desc'] = implode('、', $result['buy']['desc']);
+            $result['share']['desc'] = implode('、', $result['share']['desc']);
+            return $result;
+        }
+        return false;
+    }
+
+    private function check($uid, $condition)
+    {
+        for ($i = 1; $i <= 3; $i++) {
+            $str = 'child_num_' . $i;
+            if (strstr($condition, $str)) {
+                $child = Dever::load('relation', 'invite')->getChildNum($uid, $i);
+                $condition = str_replace($str, $child, $condition);
+            }
+        }
+        $eval = '$state =  ' . $condition . ';';
+        @eval($eval);
+        return $state;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'bonus');
+        $info['type_name'] = Dever::db('bonus', 'place_benefit')->value('type', $info['type']);
+        $info['give_source_name'] = Dever::db('bonus', 'place_benefit')->value('give_source', $info['give_source']);
+        $info['period_name'] = Dever::db('bonus', 'place_benefit')->value('period', $info['period']);
+        if ($info['period'] == 1) {
+            $info['desc'] = $info['period_name'] . $info['period_day'] . '点';
+        } else {
+            $info['desc'] = $info['period_name'] . '1点';
+        }
+        $info['desc'] .= ',发放';
+        $score = Dever::db('info', 'place_score')->find($info['give_score_id']);
+        if (!strstr($info['give_value'], '%')) {
+            $info['value_text'] = Dever::load('info', 'place_score')->getText($info['give_value'], $score);
+            $info['desc'] .= $info['value_text'];
+            $info['tip'] = '';
+        } else {
+            if ($info['give_source'] == 1) {
+                $info['give_source_name'] = '';
+            }
+            if ($info['give_level'] == 0) {
+                $info['give_source_name'] = '本人';
+            }
+            if ($info['type'] == 2) {
+                $holding = Dever::db('info', 'place_score')->find($info['holding_score_id']);
+                $info['type_name'] .= $holding['name'];
+            }
+            $money = '(转人民币后的总额)';
+            $info['desc'] .= $info['give_source_name'] . $info['type_name'] . '总额'.$money.'的' . $info['give_value'] . $score['name'];
+        }
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        if (isset($info['config_day'])) {
+            $info['tname'] = true;
+        }
+        return $info;
+    }
+}

+ 29 - 0
src/place/benefit/lib/Item/Buy.php

@@ -0,0 +1,29 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 购买限额
+class Buy
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        return false;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'visit');
+        $info['desc'] = $info['day'] . '天内';
+        if ($info['value'] > 0) {
+            $info['desc'] .= '最多购买' . $info['value'] . '次';
+        }
+        if ($info['num'] > 0) {
+            if ($info['value'] > 0) {
+                $info['desc'] .= ',';
+            }
+            $info['desc'] .= '每次购买' . $info['value'] . '个';
+        }
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        return $info;
+    }
+}

+ 72 - 0
src/place/benefit/lib/Item/Coupon.php

@@ -0,0 +1,72 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 优惠券
+class Coupon
+{
+    # 获取基本信息
+    public function getInfo($info, $score = [])
+    {
+        $scoreInfo = Dever::load('info', 'place_score');
+        $info['type_name'] = Dever::db('coupon', 'place_benefit')->value('type', $info['type']) . '券';
+        if (isset($info['sdate'])) {
+            $info['date_name'] = date('Y.m.d H:i', $info['sdate']) . '~'. date('Y.m.d H:i', $info['edate']);
+            unset($info['sdate']);
+            unset($info['edate']);
+        } elseif ($info['date_type'] == 1) {
+            $info['date_name'] = '有效期至' . date('Y.m.d', time()+86400*$info['date_day']);
+        } elseif ($info['date_type'] == 2) {
+            $info['date_name'] = '有效期' . date('Y.m.d', $info['date_start']) . '至'. date('Y.m.d', $info['date_end']);
+        }
+        if ($score) {
+            if ($info['min'] > 0) {
+                $info['min'] = $scoreInfo->toScore($info['min'], $score['exp']);
+                $info['min_text'] = $scoreInfo->getText($info['min'], $score);
+            }
+            if ($info['type'] <= 2) {
+                $info['value'] = $scoreInfo->toScore($info['value'], $score['exp']);
+                $info['value_text'] = $scoreInfo->getText($info['value'], $score);
+            }
+        } elseif (empty($info['value_text'])) {
+            $money = \Place::money();
+            $info['min_text'] = $info['min'] . $money['unit'];
+            if ($info['type'] <= 2) {
+                $info['value_text'] = $info['value'] . $money['unit'];
+                $info['yue_text'] = $info['yue'] . $money['unit'];
+            }
+        }
+        $info['title'] = $this->getTitle($info);
+        return $info;
+    }
+
+    # 获取优惠券标题
+    public function getTitle($info)
+    {
+        $title = '';
+        if ($info['min'] > 0) {
+            $title = '满' . $info['min_text'];
+        }
+        if ($info['type'] == 1) {
+            $title .= '减' . $info['value_text'];
+        } elseif ($info['type'] == 2) {
+            $title .= '抵' . $info['value_text'];
+        } elseif ($info['type'] == 3) {
+            $title .= '打' . floor($info['value']) . '折';
+        } elseif ($info['type'] == 4) {
+            $title .= '可兑换' . floor($info['value']) . '个';
+        }
+        return $title;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $money = \Place::money();
+        $info['min_text'] = $info['min'] . $money['unit'];
+        $info['value_text'] = $info['value'] . $money['unit'];
+        $info['desc'] = $this->getTitle($info);
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'coupon');
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        $info['config_name'] = Dever::db('coupon', 'place_benefit')->value('type', $info['type']) . '券';
+        return $info;
+    }
+}

+ 19 - 0
src/place/benefit/lib/Item/Exchange.php

@@ -0,0 +1,19 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 兑换
+class Exchange
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $exp)
+    {
+        return false;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'exchange');
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        return $info;
+    }
+}

+ 54 - 0
src/place/benefit/lib/Item/Gift.php

@@ -0,0 +1,54 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 礼品卡
+class Gift
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        return false;
+    }
+
+    # 获取基本信息
+    public function getInfo($info, $score = [])
+    {
+        if (isset($info['sdate'])) {
+            $info['date_name'] = date('Y.m.d H:i', $info['sdate']) . '~'. date('Y.m.d H:i', $info['edate']);
+            unset($info['sdate']);
+            unset($info['edate']);
+        } elseif ($info['date_type'] == 1) {
+            $info['date_name'] = '有效期至' . date('Y.m.d', time()+86400*$info['date_day']);
+        } elseif ($info['date_type'] == 2) {
+            $info['date_name'] = '有效期' . date('Y.m.d', $info['date_start']) . '至'. date('Y.m.d', $info['date_end']);
+        }
+        $info['title'] = '';
+        if ($score) {
+            if ($info['min'] > 0) {
+                $info['min'] = Dever::load('info', 'place_score')->toScore($info['min'], $score['exp']);
+                $info['min_text'] = Dever::load('info', 'place_score')->getText($info['min'], $score);
+            }
+            $info['value'] = Dever::load('info', 'place_score')->toScore($info['value'], $score['exp']);
+            $info['value_text'] = Dever::load('info', 'place_score')->getText($info['value'], $score);
+        } elseif (empty($info['value_text'])) {
+            $money = \Place::money();
+            $info['min_text'] = $info['min'] . $money['unit'];
+            $info['value_text'] = $info['value'] . $money['unit'];
+            $info['yue_text'] = $info['yue'] . $money['unit'];
+        }
+        $info['title'] = '面值' . $info['value_text'];
+        if ($info['min'] > 0) {
+            $info['title'] .= ',满' . $info['min_text'] . '可以使用';
+        }
+        return $info;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'gift');
+        $money = \Place::money();
+        $info['desc'] = '面值:' . $info['value'] . $money['unit'];
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        return $info;
+    }
+}

+ 18 - 0
src/place/benefit/lib/Item/Held.php

@@ -0,0 +1,18 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 持有权
+class Held
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $exp)
+    {
+        return false;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        return $info;
+    }
+}

+ 116 - 0
src/place/benefit/lib/Item/Perk.php

@@ -0,0 +1,116 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 权益包
+class Perk
+{
+    # 获取基本信息
+    public function getInfo($info)
+    {
+        if (isset($info['sdate'])) {
+            $info['date_name'] = date('Y.m.d H:i', $info['sdate']) . '~'. date('Y.m.d H:i', $info['edate']);
+            unset($info['sdate']);
+            unset($info['edate']);
+        } elseif ($info['date_type'] == 1) {
+            $info['date_name'] = '有效期至' . date('Y.m.d', time()+86400*$info['date_day']);
+        } elseif ($info['date_type'] == 2) {
+            $info['date_name'] = '有效期' . date('Y.m.d', $info['date_start']) . '至'. date('Y.m.d', $info['date_end']);
+        }
+        # 共有多少权益
+        $where = ['perk_code_id' => $info['perk_code_id'], 'status' => 1];
+        $info['yue'] = Dever::db('perk_code_item', 'place_benefit')->count($where);
+        $info = $this->getDesc($info);
+        return $info;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info['tip'] = $info['desc'];
+        if (isset($info['config_type_id'])) {
+            $voucher = Dever::db('perk_voucher', 'place_benefit')->select(['perk_id' => $info['config_type_id']]);
+            if ($voucher) {
+                $info['tip'] .= '<table style="width:100%; border-collapse:collapse; text-align:left; table-layout:auto;">';
+                $info['tip'] .= '<tr><td style="border:1px solid #ddd; padding:8px;">权益名称</td><td style="border:1px solid #ddd; padding:8px;">权益数量</td></tr>';
+                foreach ($voucher as $v) {
+                    $item = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id']);
+                    $v['num'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['num']);
+                    $info['tip'] .= '<tr><td style="border:1px solid #ddd; padding:8px;">'.$item['name'].'</td><td style="border:1px solid #ddd; padding:8px;">'.$v['num'].'</td></tr>';
+                }
+                $info['tip'] .= '</table>';
+            }
+            $info['title'] = '权益包内容';
+        } else {
+            $info['title'] = '权益包介绍';
+        }
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        return $info;
+    }
+
+    # 获取包含的权益
+    public function getData($code_id, $edate)
+    {
+        $result = [];
+        $data = Dever::db('perk_code_item', 'place_benefit')->select(['perk_code_id' => $code_id]);
+        if ($data) {
+            $edate = '领取有效期' . date('Y-m-d H:i', $edate);
+            $config = Dever::load('item', 'place_benefit')->getType(2, true);
+            //$desc['config_day'] = 0;
+            $desc['config_max'] = 0;
+            foreach ($data as $v) {
+                if ($v['total'] > 0) {
+                    $v['yue'] = $v['total'] - $v['received'];
+                    if ($v['yue'] > 0) {
+                        $desc['config_num'] = $v['yue'];
+                        $info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id'], $desc);
+                        if ($info) {
+                            if (isset($info['tname']) && $info['tname']) {
+                                $info['tname'] = '次卡';
+                                $info['name'] .= '(优先使用)';
+                            } else {
+                                $info['tname'] = '';
+                            }
+                            $v['yue'] = $desc['config_num'];
+                            $v['name'] = $info['name'];
+                            $v['desc'] = $info['desc'];
+                            $v['type_name'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['yue']);
+                            if (isset($info['config_name'])) {
+                                $v['config_name'] = $info['config_name'] . $info['tname'];
+                            } else {
+                                $v['config_name'] = $config[$v['type']] . $info['tname'];
+                            }
+                            $v['config_id'] = $v['id'];
+                            $v['edate'] = $edate;
+                            if (isset($info['title'])) {
+                                $v['tip'] = $info['tip'];
+                                $v['title'] = $info['title'];
+                            }
+                            $result[] = $v;
+                        }
+                    }
+                }
+            }
+        }
+        return $result;
+    }
+
+    public function createCode($utype, $uid, $id, $num = 1, $total = 1, $code = '')
+    {
+        if (!$num) {
+            $num = 1;
+        }
+        $perk = Dever::db('perk', 'place_benefit')->find($id);
+        $up['perk_id'] = $id;
+        $up['total'] = $total;
+        $up['utype'] = $utype;
+        $up['uid'] = $uid;
+        $result = [];
+        for ($i = 1; $i <= $num; $i++) {
+            $up['code'] = Dever::load('code', 'place_benefit')->create($perk['code_type'], $perk['code_prefix'], $perk['code_length']);
+            Dever::db('perk_code', 'place_benefit')->insert($up);
+            $result[] = $up['code'];
+        }
+        $total = Dever::db('perk_code', 'place_benefit')->count(['perk_id' => $id]);
+        Dever::db('perk', 'place_benefit')->update($id, ['total' => $total]);
+        return implode('、', $result);
+    }
+}

+ 75 - 0
src/place/benefit/lib/Item/Promotion.php

@@ -0,0 +1,75 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 促销
+class Promotion
+{
+    # 获取用户的促销信息
+    public function get($uid, $scope, $price, $exp)
+    {
+        $data = Dever::load('user', 'place_benefit')->getValid($uid, 'promotion', $scope);
+        if ($data) {
+            # 获取最低价格
+            $info = [];
+            foreach ($data as $v) {
+                $r = [];
+                $r['id'] = $v['id'];
+                $r['name'] = $v['name'];
+                $r['type'] = $v['type'];
+                $r['value'] = $v['value'];
+                if ($r['type'] == 1) {
+                    # 折扣
+                    $r['price'] = Dever::math('divMul', $r['value'], 10, $price);
+                    $r['value'] .= '折';
+                } elseif ($r['type'] == 2) {
+                    # 百分比
+                    $r['price'] = Dever::math('divMul', $r['value'], 100, $price);
+                    $r['value'] .= '%';
+                } elseif ($r['type'] == 3) {
+                    # 数值
+                    $r['price'] = Dever::load('info', 'place_score')->toScore($r['value'], $exp);
+                }
+                if (!$info) {
+                    $info = $r;
+                } elseif ($info['price'] > $r['price']) {
+                    $info = $r;
+                }
+            }
+            $info['m_price'] = $price;
+            return $info;
+        }
+        return false;
+    }
+
+    # 获取展示标签的促销信息
+    public function getInfoByTag($scope)
+    {
+        $data = Dever::load('item', 'place_benefit')->getList('promotion', $scope, ['tag' => 1], ['col' => 'id,name']);
+        if ($data) {
+            return $data[0];
+        }
+        return [];
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'promotion');
+        $info['desc'] = '';
+        if ($info['type'] == 1) {
+            # 折扣
+            $info['desc'] .= $info['value'] . '折';
+        } elseif ($info['type'] == 2) {
+            # 百分比
+            $info['desc'] .= $info['value'] . '%';
+        } elseif ($info['type'] == 3) {
+            # 数值
+            $money = \Place::money();
+            $info['desc'] .= $info['value'] . $money['unit'];
+        }
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        if (isset($info['config_day'])) {
+            $info['tname'] = true;
+        }
+        return $info;
+    }
+}

+ 105 - 0
src/place/benefit/lib/Item/Rebate.php

@@ -0,0 +1,105 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 返利
+class Rebate
+{
+    # 获取返利信息
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        if ($price <= 0) {
+            return false;
+        }
+        $data = Dever::load('user', 'place_benefit')->getValid($uid, 'rebate', $scope);
+        if ($data) {
+            $result = ['rule' => $rule, 'buy' => ['name' => '购买立返', 'desc' => []], 'share' => ['name' => '分享可赚', 'desc' => []]];
+            foreach ($data as $info) {
+                $rule = Dever::db('rebate_rule', 'place_benefit')->select(['rebate_id' => $info['id']], ['col' => 'id,value,`condition`,level,score_id']);
+                foreach ($rule as $k => $v) {
+                    if (!$v['value']) {
+                        continue;
+                    }
+                    if ($v['condition'] && !$this->check($uid, $v['condition'])) {
+                        continue;
+                    }
+                    $v['source_value'] = $v['value'];
+                    $v['value'] = Dever::math('value', $price, $v['value']);
+                    if ($v['value'] > 0) {
+                        $score = Dever::db('info', 'place_score')->find($v['score_id'], ['col' => 'id,name,symbol,symbol_location']);
+                        if (isset($result['rule'][$v['id']])) {
+                            $v['value'] += $result['rule'][$v['id']]['value'];
+                        }
+                        $v['value_text'] = Dever::load('info', 'place_score')->getText($v['value'], $score);
+                        $v['rebate_id'] = $info['id'];
+                        $v['name'] = $info['name'];
+                        $result['rule'][$v['id']] = $v;
+                        if ($v['level'] == 0) {
+                            # 购买可得
+                            $result['buy']['desc'][$v['id']] = $v['value_text'];
+                        } elseif ($v['level'] == 1) {
+                            # 分享可得
+                            $result['share']['desc'][$v['id']] = $v['value_text'];
+                        }
+                    }
+                }
+            }
+            $result['buy']['desc'] = implode('、', $result['buy']['desc']);
+            $result['share']['desc'] = implode('、', $result['share']['desc']);
+            return $result;
+        }
+        return false;
+    }
+
+    private function check($uid, $condition)
+    {
+        for ($i = 1; $i <= 3; $i++) {
+            $str = 'child_num_' . $i;
+            if (strstr($condition, $str)) {
+                $child = Dever::load('relation', 'invite')->getChildNum($uid, $i);
+                $condition = str_replace($str, $child, $condition);
+            }
+        }
+        $eval = '$state =  ' . $condition . ';';
+        @eval($eval);
+        return $state;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $uid = \Place::$uid;
+        $info['desc'] = '';
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'rebate');
+        $rule = Dever::db('rebate_rule', 'place_benefit')->select(['rebate_id' => $info['id']], ['col' => 'id,value,`condition`,level,score_id']);
+        if ($rule) {
+            $buy = [];
+            $share = [];
+            foreach ($rule as $k => $v) {
+                $score = Dever::db('info', 'place_score')->find($v['score_id']);
+                $v['value'] = Dever::load('info', 'place_score')->getText($v['value'], $score);
+                if ($v['condition'] && !$this->check($uid, $v['condition'])) {
+                    continue;
+                }
+                if ($v['level'] == 0) {
+                    # 购买立返
+                    $buy[] = $v['value'];
+                } elseif ($v['level'] == 1) {
+                    $share[] = $v['value'];
+                }
+            }
+            if ($buy) {
+                $info['desc'] .= '购买返' . implode('+', $buy);
+            }
+            if ($share) {
+                if ($buy) {
+                    $info['desc'] .= '、';
+                }
+                $info['desc'] .= '分享赚' . implode('+', $share);
+            }
+        }
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        if (isset($info['config_day'])) {
+            $info['tname'] = true;
+        }
+        return $info;
+    }
+}

+ 121 - 0
src/place/benefit/lib/Item/Score.php

@@ -0,0 +1,121 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 积分规则
+class Score
+{
+    # 获取用户的积分规则信息
+    public function get($uid, $info)
+    {
+        $info['rule_id'] = 0;
+        $data = Dever::load('user', 'place_benefit')->getValid($uid, 'score');
+        if ($data) {
+            # 获取信息
+            foreach ($data as $v) {
+                if ($v['score_id'] == $info['id']) {
+                    $info['rule_id'] = $v['id'];
+                    $info['rule_name'] = $v['name'];
+                    $info['recharge'] = $v['recharge'];
+                    $info['exchange'] = $v['exchange'];
+                    $info['withdraw'] = $v['withdraw'];
+                    $info['trade'] = $v['trade'];
+                    if ($info['withdraw'] == 1) {
+                        $info['withdraw_fee'] = $v['withdraw_fee'];
+                        $info['withdraw_limit'] = $v['withdraw_limit'];
+                        $info['withdraw_min'] = $v['withdraw_min'];
+                        $info['withdraw_max'] = $v['withdraw_max'];
+                    }
+                    break;
+                }
+            }
+        }
+        return $info;
+    }
+
+    # 获取充值规则列表
+    public function getRechargeList($info)
+    {
+        $data = Dever::db('score_recharge', 'place_benefit')->select(['score_id' => $info['rule_id']], ['col' => 'id,value,price']);
+        if ($data) {
+            foreach ($data as &$v) {
+                $v['value_text'] = Dever::load('info', 'place_score')->getText($v['value'], $info);
+            }
+        }
+        return $data;
+    }
+
+    # 确认充值
+    public function recharge($info, $recharge_id, $number)
+    {
+        if (!$number || $number <= 0) {
+            if (!$recharge_id) {
+                Dever::error('充值金额错误');
+            }
+            $recharge = Dever::db('score_recharge', 'place_benefit')->find(['id' => $recharge_id, 'score_id' => $info['rule_id'], 'status' => 1]);
+            if (!$recharge) {
+                Dever::error('充值金额错误');
+            }
+            $info['recharge'] = ['id' => $recharge['id'], 'value' => $recharge['value'], 'price' => $recharge['price']];
+        } else {
+            $info['recharge'] = ['id' => 0, 'value' => $number, 'price' => $number];
+        }
+        
+        $data = Dever::load('score/pay', 'place_order')->get([$info], ['score' => $info, 'rebate' => []], false);
+        return $data;
+    }
+
+    # 获取兑换规则列表
+    public function getExchangeList($info)
+    {
+        $result = array();
+        $data = Dever::db('score_exchange', 'place_benefit')->select(['score_id' => $info['rule_id']], ['col' => 'id,exchange_score_id,value']);
+        if ($data) {
+            foreach ($data as $v) {
+                if ($v['exchange_score_id'] != $info['id']) {
+                    $exchange = Dever::db('info', 'place_score')->find($v['exchange_score_id']);
+                    $info['exp'] = $v['value'];
+                    $v['name'] = $exchange['name'];
+                    $v['symbol'] = $exchange['symbol'];
+                    $v['symbol_location'] = $exchange['symbol_location'];
+                    $v['tip'] = Dever::load('info', 'place_score')->getExpTip($info, $exchange);
+                    $result[] = $v;
+                }
+            }
+        }
+        return $result;
+    }
+
+    # 确认兑换
+    public function exchange($info, $user, $id, $number)
+    {
+        $exchange = Dever::db('score_exchange', 'place_benefit')->find(['id' => $id, 'score_id' => $info['rule_id']]);
+        if ($exchange) {
+            if ($info['status'] == 2) {
+                Dever::error('积分已禁用');
+            }
+            if ($exchange['exchange_score_id'] == $info['id']) {
+                Dever::error('源积分不能与目标积分相同');
+            }
+            $exinfo = Dever::load('user', 'place_score')->get($user['uid'], $exchange['exchange_score_id']);
+            if ($exinfo['status'] == 2) {
+                Dever::error('目标积分已禁用');
+            }
+            
+            # 检测剩余数量
+            if ($user['yue'] < $number) {
+                Dever::error('余额不足');
+            }
+            $value = Dever::math('mul', $number, $exchange['value']);
+            Dever::load('log', 'place_score')->action('兑换', $info['id'])->add($user['uid'], '', -1*$number);
+            Dever::load('log', 'place_score')->action('兑换', $exchange['exchange_score_id'])->add($user['uid'], '', $value);
+            return 'ok';
+        } else {
+            Dever::error('兑换失败');
+        }
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        return false;
+    }
+}

+ 19 - 0
src/place/benefit/lib/Item/Score_num.php

@@ -0,0 +1,19 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 积分数值
+class Score_num
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        return false;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info['desc'] = Dever::load('item', 'place_benefit')->getPeriodDesc($info);
+        $info['tip'] = '';
+        return $info;
+    }
+}

+ 19 - 0
src/place/benefit/lib/Item/Visit.php

@@ -0,0 +1,19 @@
+<?php namespace Place_benefit\Lib\Item;
+use Dever;
+# 访问限额
+class Visit
+{
+    # 获取信息
+    public function get($uid, $scope, $price, $rule = [])
+    {
+        return false;
+    }
+
+    # 获取描述信息
+    public function getDesc($info)
+    {
+        $info = Dever::load('scope', 'place_benefit')->getInfo($info, 'visit');
+        $info['desc'] = $info['day'] . '天内最多访问' . $info['value'] . '次';
+        return $info;
+    }
+}

+ 105 - 0
src/place/benefit/lib/Scope.php

@@ -0,0 +1,105 @@
+<?php namespace Place_benefit\Lib;
+use Dever;
+class Scope
+{
+    # 验证权益是否在范围内有效
+    public function check($source_type, $data, $type, $scope, $result)
+    {
+        foreach ($data as $k => $v) {
+            $info = Dever::db($type, 'place_benefit')->find($v['type_id']);
+            if ($info && $info['status'] == 1) {
+                $info['source_type'] = $source_type;
+                $info['source_id'] = $v['id'];
+                $info['num'] = $v['num'] ?? 0;
+                $key = $type . '_' . $info['id'];
+                # 验证范围
+                if ($scope) {
+                    $list = Dever::db('scope', 'place_benefit')->select(['type' => $type, 'type_id' => $info['id']]);
+                    if ($list) {
+                        foreach ($list as $v1) {
+                            $state = $this->valid($scope, $v1['value'], $v1['ids']);
+                            if ($state) {
+                                $result[$key] = $info;
+                            }
+                        }
+                    } else {
+                        $result[$key] = $info;
+                    }
+                } else {
+                    $result[$key] = $info;
+                }
+            }
+        }
+        return $result;
+    }
+
+    # 验证范围
+    public function valid($value, $setting, $ids)
+    {
+        $value = explode(',', $value);
+        $setting = explode(',', $setting);
+        $productId = array_pop($value);
+
+        for ($i = 0; $i < count($setting); $i++) {
+            if (!isset($value[$i]) || $value[$i] !== $setting[$i]) {
+                return false;
+            }
+        }
+
+        if (empty($ids)) {
+            return true;
+        }
+
+        $ids = explode(',', $ids);
+        return in_array($productId, $ids);
+    }
+
+    # 获取范围描述
+    public function getInfo($info, $type)
+    {
+        if ($type == 'exchange') {
+            $data = Dever::db($type . '_scope', 'place_benefit')->select([$type . '_id' => $info['id']]);
+        } else {
+            $data = Dever::db('scope', 'place_benefit')->select(['type' => $type, 'type_id' => $info['id']]);
+        }
+        $info['title'] = '可用范围';
+        $info['tip'] = '全场可用';
+        if ($data) {
+            $info['tip'] = '<table style="width:100%; border-collapse:collapse; text-align:left; table-layout:auto;">';
+            foreach ($data as $k => $v) {
+                $v['name'] = '';
+                $v['value'] = explode(',', $v['value']);
+                $value = array_shift($v['value']);
+                if ($value == 1) {
+                    if ($v['ids']) {
+                        $source = Dever::db('info', 'place_source')->columns(['id' => ['in', $v['ids']]], 'name');
+                        $tip = implode('、', $source);
+                    } else {
+                        $tip = Dever::load('channel', 'place_source')->getName($v['value']);
+                        if (!$tip) {
+                            $tip = '全部资源';
+                        }
+                    }
+                    $unit = '个';
+                } elseif ($value == 2) {
+                    if ($v['ids']) {
+                        $source = Dever::db('level', 'place_role')->columns(['id' => ['in', $v['ids']]], 'name');
+                        $tip = implode('、', $source);
+                    } else {
+                        $tip = Dever::load('info', 'place_role')->getName($v['value']);
+                        if (!$tip) {
+                            $tip = '全部角色';
+                        }
+                    }
+                    $unit = '个';
+                }
+                if (isset($v['num']) && $v['num'] > 0) {
+                    $tip .= ' [可兑换'.$v['num'].''.$unit.']';
+                }
+                $info['tip'] .= '<tr><td style="border:0px solid #ddd; padding:8px;">'.$tip.'</td></tr>';
+            }
+            $info['tip'] .= '</table>';
+        }
+        return $info;
+    }
+}

+ 255 - 0
src/place/benefit/lib/User.php

@@ -0,0 +1,255 @@
+<?php namespace Place_benefit\Lib;
+use Dever;
+class User
+{
+    # 获取用户当前有效的权益
+    public function getValid($uid, $type, $scope = '')
+    {
+        $result = [];
+        # 先验证用户是否有该权益
+        $user = Dever::db('user', 'place_benefit')->select(['uid' => $uid, 'type' => $type, 'status' => 1]);
+        if ($user) {
+            $result = Dever::load('scope', 'place_benefit')->check(1, $user, $type, $scope, $result);
+        }
+        # 再验证角色等级是否有该权益
+        $level = Dever::load('role', 'place_user')->getLevel($uid);
+        $role = Dever::db('role_upgrade', 'place_benefit')->select(['type' => $type, 'level_id' => ['in', $level]]);
+        if ($role) {
+            $result = Dever::load('scope', 'place_benefit')->check(2, $role, $type, $scope, $result);
+        }
+        return $result;
+    }
+
+    # 获取用户所有持有的权益
+    public function getList($uid)
+    {
+        $result = [];
+        $config = Dever::load('item', 'place_benefit')->getType(2, true);
+        # 我的权益
+        $user = Dever::db('user', 'place_benefit')->select(['uid' => $uid]);
+        # 固定权益
+        $level = Dever::load('role', 'place_user')->getLevel($uid);
+        if ($level) {
+            $user = array_merge($user, Dever::db('role_upgrade', 'place_benefit')->select(['level_id' => ['in', $level]]));
+        }
+        if ($user) {
+            foreach ($user as $v) {
+                $info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id'], true);
+                if ($info) {
+                    if (empty($info['config_name'])) {
+                        $info['config_name'] = $config[$v['type']];
+                    }
+                    if (isset($v['level_id'])) {
+                        $info = $this->getEdate($uid, $v['level_id'], $info);
+                    } else {
+                        $info['config_user_id'] = $v['id'];
+                        $info['type_name'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['num']);
+                        $info['edate'] = date('Y-m-d H:i', $v['cdate']) . '领取';
+                        $info['receive_tip'] = $this->getLog($uid, 1, $v['id'], $v['type'], $v['type_id']);
+
+                    }
+                    if ($v['type'] == 'exchange1') {
+                        array_unshift($result, $info); // 插到最前面
+                    } else {
+                        $result[] = $info; // 正常追加
+                    }
+                }
+            }
+        }
+        return $result;
+    }
+
+    # 获取待领取权益
+    public function getReceive($uid)
+    {
+        $result = [];
+        $config = Dever::load('item', 'place_benefit')->getType(2, true);
+        # 周期权益
+        $level = Dever::load('role', 'place_user')->getLevel($uid);
+        $period = Dever::db('role_period', 'place_benefit')->select(['level_id' => ['in', $level]]);
+        if ($period) {
+            foreach ($period as $v) {
+                $desc['config_day'] = $v['day'];
+                $desc['config_num'] = $v['num'];
+                $desc['config_max'] = $v['max'];
+                $info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id'], $desc);
+                if ($info) {
+                    if (isset($info['tname']) && $info['tname']) {
+                        $info['tname'] = '次卡';
+                        $info['name'] .= '(优先使用)';
+                    } else {
+                        $info['tname'] = '';
+                    }
+                    if (isset($info['config_name'])) {
+                        $info['config_name'] = $info['config_name'] . $info['tname'];
+                    } else {
+                        $info['config_name'] = $config[$v['type']] . $info['tname'];
+                    }
+                    $info['config_id'] = $v['id'];
+                    if (isset($v['level_id'])) {
+                        $info = $this->getEdate($uid, $v['level_id'], $info);
+                    }
+                    # 判断是否可以领取
+                    $check = $this->check($uid, 1, $v['id'], $v['day'], $v['max']);
+                    if ($check) {
+                        $info['receive'] = 2;
+                        $info['receive_tip'] = '<div style="color:red;text-align:center;margin-bottom:6px;">' . $check . '</div>' . $this->getLog($uid, 1, $v['id'], $v['type']);
+                    } else {
+                        $info['receive'] = 1;
+                    }
+                    
+                    $result[] = $info;
+                }
+            }
+        }
+        return $result;
+    }
+
+    # 检测是否可以领取
+    public function check($uid, $source, $source_id, $day, $max)
+    {
+        $where['uid'] = $uid;
+        $where['source'] = $source;
+        $where['source_id'] = $source_id;
+        # 检测是否达到最大次数
+        if ($max > 0) {
+            $count = Dever::db('user_log', 'place_benefit')->count($where);
+            if ($count >= $max) {
+                return '您已领取' . $count. '次,无法再次领取';
+            }
+        }
+        # 每隔多少天发放一次奖励
+        if ($day > 0) {
+            $now = time();
+            $info = Dever::db('user_log', 'place_benefit')->find($where);
+            if ($info) {
+                $cur = $now - $info['cdate'];
+                $cur = floor($cur / 86400);
+                if ($cur < $day) {
+                    $time = $info['cdate'] + $day * 86400;
+                    return '您可以在' . date('Y-m-d H:i', $time) . '之后再次领取';
+                }
+            }
+        }
+        return false;
+    }
+
+    # 获取领取日志
+    public function getLog($uid, $source, $source_id, $type, $type_id = false)
+    {
+        $where['uid'] = $uid;
+        if ($type_id) {
+            $where['type'] = $type;
+            $where['type_id'] = $type_id;
+        } else {
+            $where['source'] = $source;
+            $where['source_id'] = $source_id;
+        }
+        
+        $log = Dever::db('user_log', 'place_benefit')->select($where);
+        $result = '';
+        if ($log) {
+            $name = '领取明细';
+            if ($type == 'perk') {
+                $result = '<div style="color:red;text-align:center;margin-bottom:6px;">点击兑换码可复制,请到权益包里兑换</div>';
+                $name = '兑换码';
+            }
+            $result .= '<table style="width:100%; border-collapse:collapse; text-align:left; table-layout:auto;">';
+            $result .= '<tr><td style="border:1px solid #ddd; padding:8px;">领取日期</td><td style="border:1px solid #ddd; padding:8px;">'.$name.'</td></tr>';
+            foreach ($log as $k => $v) {
+                $v['cdate'] = date('Y-m-d H:i', $v['cdate']);
+                if ($v['content']) {
+                    $v['num'] = '<a data-content="'.$v['content'].'">' . $v['content'] . '</a>';
+                } else {
+                    $v['num'] = Dever::load('item', 'place_benefit')->getNumDesc($v['type'], $v['type_id'], $v['num']);
+                }
+                $result .= '<tr><td style="border:1px solid #ddd; padding:8px;">'.$v['cdate'].'</td><td style="border:1px solid #ddd; padding:8px;">'.$v['num'].'</td></tr>';
+            }
+            $result .= '</table>';
+        }
+
+
+        return $result;
+    }
+
+    # 领取权益
+    public function receive_commit(){}
+    public function receive($uid, $info, $source = 1)
+    {
+        $level = Dever::load('role', 'place_user')->getLevel($uid);
+        if ($source == 1) {
+            if (is_numeric($info)) {
+                $info = Dever::db('role_period', 'place_benefit')->find(['id' => $info, 'level_id' => ['in', $level]]);
+            }
+            $check = $this->check($uid, $source, $info['id'], $info['day'], $info['max']);
+            if ($check) {
+                Dever::error('未达到领取条件');
+            }
+            $level = Dever::db('level', 'place_role')->find($info['level_id']);
+            $msg = $level['name'] . '权益';
+        } else {
+            # 权益包
+            $msg = $info['name'] . '权益';
+        }
+        
+        if (!$info) {
+            Dever::error('权益不存在');
+        }
+        
+        $log = [
+            'uid' => $uid,
+            'type' => $info['type'],
+            'type_id' => $info['type_id'],
+        ];
+        $user = Dever::db('user', 'place_benefit')->find($log);
+        if (!$user) {
+            $log['num'] = $info['num'];
+            $user_id = Dever::db('user', 'place_benefit')->insert($log);
+        } else {
+            $log['num'] = ['+', $info['num']];
+            $user_id = $user['id'];
+            $log['cdate'] = time();
+            Dever::db('user', 'place_benefit')->update($user_id, $log);
+        }
+        $log['num'] = $info['num'];
+        $log['user_id'] = $user_id;
+        $log['source'] = $source;
+        $log['source_id'] = $info['id'];
+        $state = Dever::db('user_log', 'place_benefit')->insert($log);
+        if ($state) {
+            if ($info['type'] == 'score_num') {
+                # 发积分
+                Dever::load('log', 'place_score')->action('奖励积分', $info['type_id'])->add($uid, $msg, $info['num']);
+            } elseif($info['type'] == 'coupon') {
+                # 发优惠券
+                for ($i = 1; $i <= $info['num']; $i++) {
+                    Dever::load('coupon', 'place_user')->receive($uid, $info['type_id'], false);
+                }
+            } elseif($info['type'] == 'gift') {
+                # 发礼品卡
+                for ($i = 1; $i <= $info['num']; $i++) {
+                    Dever::load('gift', 'place_user')->receive($uid, $info['type_id'], false);
+                }
+            } elseif($info['type'] == 'perk') {
+                # 发放权益包兑换码
+                $content = Dever::load('item', 'place_benefit')->load('perk')->createCode(1, $uid, $info['type_id'], $info['num']);
+                if ($content) {
+                    Dever::db('user_log', 'place_benefit')->update($state, ['content' => $content]);
+                } else {
+                    Dever::error('领取失败,请重新领取');
+                }
+            }
+        }
+        return $state;
+    }
+
+    # 获取有效期
+    public function getEdate($uid, $level_id, $info)
+    {
+        $level = Dever::db('level', 'place_role')->find($level_id);
+        $user = Dever::db('user', 'place_role')->find(['uid' => $uid, 'info_id' => $level['info_id'], 'level_id' => $level['id']]);
+        $info['type_name'] = $level['name'];
+        $info['edate'] = '有效期至' . date('Y-m-d H:i', $user['edate']);
+        return $info;
+    }
+}

+ 60 - 0
src/place/benefit/manage/Lib/Api.php

@@ -0,0 +1,60 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Api
+{
+    # 获取权益类型
+    public function getType($value)
+    {
+        $result = [];
+        $result['type_id']['value'] = '';
+        $result['type_id']['option'] = Dever::load('item', 'place_benefit')->getTypeData($value);
+        return $result;
+    }
+
+    # 获取权益所需要的范围数据:具体项目选择
+    public function getScope($value)
+    {
+        if (is_array($value)) {
+            $result = [];
+            $result['ids']['value'] = [];
+            if ($value[0] == 1) {
+                //$where = ['status' => 1];
+                $where = [];
+                if (isset($value[3]) && $value[3]) {
+                    $where['cate_child_id'] = $value[3];
+                } elseif (isset($value[2]) && $value[2]) {
+                    $where['cate_parent_id'] = $value[2];
+                } elseif (isset($value[1]) && $value[1]) {
+                    $where['channel_id'] = $value[1];
+                }
+                $result['ids']['option'] = Dever::db('info', 'place_source')->select($where);
+            } elseif ($value[0] == 2) {
+                $result['ids']['option'] = Dever::db('level', 'place_role')->select(['info_id' => $value[1]]);
+            }
+            
+            //$result['ids']['url'] = Dever::url('place/manage.getProfitData', ['s' => $value]);
+            return $result;
+        }
+    }
+
+    # 获取权益所需要的信息:项目下的数据
+    public function getProfitData()
+    {
+        return Dever::load('common', 'manage')->cascader(2, function($level, $parent) {
+            $data = [];
+            if ($level == 1) {
+                $data = [
+                    ['id' => 1, 'name' => '资源'],
+                    ['id' => 2, 'name' => '角色'],
+                ];
+            } elseif ($level == 2) {
+                if ($parent == 1) {
+                    $data = Dever::db('channel', 'place_source')->select([]);
+                } elseif ($parent == 2) {
+                    $data = Dever::db('info', 'place_role')->select(['status' => 1]);
+                }
+            }
+            return $data;
+        });
+    }
+}

+ 29 - 0
src/place/benefit/manage/Lib/Code.php

@@ -0,0 +1,29 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Code
+{
+    # 检查券码
+    public function check($db, $data)
+    {
+        if ($data['id'] > 0) {
+            $info = $db->find($data['id']);
+            if ($data['total'] < $info['used']) {
+                Dever::error('总兑换次数不能小于已兑换次数');
+            }
+        } else {
+            $data['utype'] = 2;
+            $data['uid'] = Dever::$data['muser']['id'];
+            Dever::db('perk', 'place_benefit')->update($data['perk_id'], ['total' => ['+', 1]]);
+        }
+        return $data;
+    }
+
+    # 创建券码
+    public function create($db, $data)
+    {
+        if (empty($data['total'])) {
+            $data['total'] = 1;
+        }
+        Dever::load('item', 'place_benefit')->load('perk')->createCode(2, Dever::$data['muser']['id'], $data['perk_id'], $data['num'], $data['total']);
+    }
+}

+ 30 - 0
src/place/benefit/manage/Lib/Perk.php

@@ -0,0 +1,30 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Perk
+{
+    # 获取权益数量
+    public function getVoucher($id)
+    {
+        return Dever::db('perk_voucher', 'place_benefit')->count(['perk_id' => $id]);
+    }
+
+    # 获取创建人
+    public function getCodeUser($utype, $uid)
+    {
+        if ($utype && $uid) {
+            if ($utype == 1) {
+                $user = Dever::db('info', 'place_user')->find($uid);
+            } elseif ($utype == 2) {
+                $user = Dever::db('user', 'sector')->find($uid);
+            } else {
+                $user['name'] = $user['id'] = '';
+            }
+            if (!$user) {
+                return '';
+            }
+            return $user['name'] . ' | '.$user['id'];
+        } else {
+            return '';
+        }
+    }
+}

+ 37 - 0
src/place/benefit/manage/Lib/Rebate.php

@@ -0,0 +1,37 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Rebate
+{
+    # 获取规则信息
+    public function getRule($id)
+    {
+        $rule = Dever::db('rebate_rule', 'place_benefit')->select(['rebate_id' => $id]);
+        if (!$rule) {
+            return '无';
+        }
+        $body = '';
+        foreach ($rule as $v) {
+            $body .= '<tr>';
+            $score = Dever::db('info', 'place_score')->find($v['score_id']);
+            $body .= '<td>'.$score['name'].'</td>';
+            $body .= '<td>'.$v['level'].'</td>';
+            $body .= '<td>'.$v['value'].'</td>';
+            $body .= '<td>'.$v['condition'].'</td>';
+            $body .= '</tr>';
+        }
+        return '<table border="1" cellspacing="0" cellpadding="8" style="border-collapse: collapse; text-align: left;">
+  <thead style="background-color: #f2f2f2;">
+    <tr>
+      <th>积分</th>
+      <th>层级</th>
+      <th>数值</th>
+      <th>条件</th>
+    </tr>
+  </thead>
+  <tbody>
+    '.$body.'
+  </tbody>
+</table>
+';
+    }
+}

+ 69 - 0
src/place/benefit/manage/Lib/Role.php

@@ -0,0 +1,69 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Role
+{
+    # 获取升级奖励信息
+    public function getUpgrade($id)
+    {
+        $info = Dever::db('role_upgrade', 'place_benefit')->select(['level_id' => $id]);
+        if (!$info) {
+            return '无';
+        }
+        $body = '';
+        foreach ($info as $v) {
+            $type_name = Dever::db('role_upgrade', 'place_benefit')->value('type', $v['type']);
+            $type_info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id']);
+            $body .= '<tr>';
+            $body .= '<td>'.$type_name.'</td>';
+            $body .= '<td>'.$type_info['name'].'</td>';
+            $body .= '</tr>';
+        }
+        return '<table border="1" cellspacing="0" cellpadding="8" style="border-collapse: collapse; text-align: left;">
+  <thead style="background-color: #f2f2f2;">
+    <tr>
+      <th>类型</th>
+      <th>权益</th>
+    </tr>
+  </thead>
+  <tbody>
+    '.$body.'
+  </tbody>
+</table>
+';
+    }
+
+    public function getPeriod($id)
+    {
+        $info = Dever::db('role_period', 'place_benefit')->select(['level_id' => $id]);
+        if (!$info) {
+            return '无';
+        }
+        $body = '';
+        foreach ($info as $v) {
+            $type_name = Dever::db('role_period', 'place_benefit')->value('type', $v['type']);
+            $type_info = Dever::load('item', 'place_benefit')->getTypeData($v['type'], $v['type_id']);
+            $body .= '<tr>';
+            $body .= '<td>'.$type_name.'</td>';
+            $body .= '<td>'.$type_info['name'].'</td>';
+            $body .= '<td>'.$v['num'].'</td>';
+            $body .= '<td>'.$v['day'].'</td>';
+            $body .= '<td>'.$v['max'].'</td>';
+            $body .= '</tr>';
+        }
+        return '<table border="1" cellspacing="0" cellpadding="8" style="border-collapse: collapse; text-align: left;">
+  <thead style="background-color: #f2f2f2;">
+    <tr>
+      <th>类型</th>
+      <th>权益</th>
+      <th>数量</th>
+      <th>天数</th>
+      <th>上限</th>
+    </tr>
+  </thead>
+  <tbody>
+    '.$body.'
+  </tbody>
+</table>
+';
+    }
+}

+ 98 - 0
src/place/benefit/manage/Lib/Scope.php

@@ -0,0 +1,98 @@
+<?php namespace Place_benefit\Manage\Lib;
+use Dever;
+class Scope
+{
+    # 更新角色权益
+    public function update($db, $data)
+    {
+        if ($data['select']) {
+            $data['select'] = explode(',', $data['select']);
+            $update['parent_id'] = $data['select'][0];
+            $update['child_id'] = $data['select'][1];
+            $db->update($data['id'], $update);
+        }
+    }
+
+    # 获取权益所需要的范围数据
+    public function getData($extend = false)
+    {
+        $channel = Dever::load('manage/cate', 'place_source')->getList(true);
+        $role = Dever::db('info', 'place_role')->select(['status' => 1]);
+        $data = [
+            ['id' => 1, 'name' => '资源', 'children' => $channel],
+        ];
+        if ($role) {
+            $data[] = ['id' => 2, 'name' => '角色', 'children' => $role];
+        }
+
+        # 积分充值
+
+        # 购买礼品卡
+
+        return $data;
+    }
+
+    # 获取权益拥有的范围信息
+    public function getInfo($id, $type)
+    {
+        if ($type == 'exchange') {
+            $data = Dever::db($type . '_scope', 'place_benefit')->select([$type . '_id' => $id]);
+        } else {
+            $data = Dever::db('scope', 'place_benefit')->select(['type' => $type, 'type_id' => $id]);
+        }
+        
+        $result = [];
+        if ($data) {
+            foreach ($data as $v) {
+                $v['name'] = '';
+                $v['value'] = explode(',', $v['value']);
+                $value = array_shift($v['value']);
+                if ($value == 1) {
+                    $content = '范围内全部资源';
+                    $name = Dever::load('channel', 'place_source')->getName($v['value']);
+                    if ($name) {
+                        $v['name'] = '['.$name.']';
+                    } else {
+                        $v['name'] = '[全部资源]';
+                    }
+                    if ($v['ids']) {
+                        $source = Dever::db('info', 'place_source')->columns(['id' => ['in', $v['ids']]], 'name');
+                        $content = implode('、', $source);
+                    }
+                    $unit = '个';
+                } elseif ($value == 2) {
+                    $content = '范围内全部角色';
+                    $name = Dever::load('info', 'place_role')->getName($v['value']);
+                    if ($name) {
+                        $v['name'] = '['.$name.']';
+                    } else {
+                        $v['name'] = '[全部角色]';
+                    }
+                    if ($v['ids']) {
+                        $source = Dever::db('level', 'place_role')->columns(['id' => ['in', $v['ids']]], 'name');
+                        $content = implode('、', $source);
+                    }
+                    $unit = '个';
+                }
+                
+                $data['name'] = $v['name'];
+                if (isset($v['num']) && $v['num'] > 0) {
+                    $data['name'] .= ' ' . $v['num'] . $unit;
+                }
+                $data['content'] = [
+                    'type' => 'tip',
+                    'content' => $content,
+                ];
+                $result[] = $data;
+            }
+        } else {
+            $data['name'] = '全场';
+            $data['content'] = [
+                'type' => 'tip',
+                'content' => '全场通用',
+            ];
+            $result[] = $data;
+        }
+        return $result;
+    }
+}

+ 120 - 0
src/place/benefit/manage/bonus.php

@@ -0,0 +1,120 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name',
+            'type',
+            'give_source',
+            'give_score_id',
+            'give_value',
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'give_level' => [
+                'give_source' => [2,4],
+            ],
+            'place_benefit/scope' => 'type=1',
+            'sell_cash' => 'type=1',
+            'holding_score_id' => 'type=2',
+            'holding_score_value' => 'type=2',
+        ],
+        'tab' => [
+            '基本信息' => 'name,type,place_benefit/scope,sell_cash,holding_score_id,holding_score_value,',
+            '奖励设置' => 'give_source,give_level,give_score_id,give_value,give_value_max',
+            '结算设置' => 'period,period_day',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+
+            'sell_cash' => [
+                'desc' => '用户本人最少消费多少支付货币才能参与本次分红,输入10,就是10元',
+            ],
+
+            'holding_score_id' => [
+                'type' => 'select',
+            ],
+
+            'holding_score_value' => [
+                'desc' => '用户本人最少持有多少积分数值才能参与本次分红',
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '消费范围',
+                'tip' => '不添加消费范围,全场可用',
+                'where'  => ['type' => 'bonus', 'type_id' => 'id'],
+            ],
+
+            'give_source' => [
+                'rules' => true,
+                'type' => 'radio',
+                'tip' => '全站:全站所有用户消费或持有的积分<br />团队:团队内所有用户消费或持有的积分<br />区域:区域内所有用户消费或持有的积分',
+            ],
+            'give_level' => [
+                'tip' => '输入0就是用户自己<br />输入1,就是1层下级团队<br />输入2,就是2层下级团队(不含1层)<br />输入>=2,就是2层下级团队(含1层)',
+            ],
+
+
+            'give_score_id' => [
+                'rules' => true,
+                'type' => 'select',
+            ],
+            'give_value' => [
+                'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+                'tip' => '输入分红的奖励数值
+                <br />输入10,就是奖励10积分
+                <br />输入10%,就是奖励10%积分,对于百分比有以下说明:
+                <br />消费分红:将根据奖励来源里消费的支付货币总额进行百分比计算
+                <br />持有分红:将根据奖励来源里总持有积分数量转换的支付货币总额进行百分比计算',
+                'default' => "10%",
+                'desc' => '暂时仅支持数值填写,未来增加公式',
+            ],
+            'give_value_max' => [
+                'desc' => '设置之后,每人每次分红不超过该上限,分红上限不填或者填0时,默认不限制上限。',
+            ],
+
+            'period' => [
+                'type' => 'radio',
+                'desc' => '选择结算周期,将按照周期结算代理分成',
+            ],
+
+            'period_day' => [
+                'rules' => true,
+                'type' => 'text',
+                'tip' => '输入结算时间,如输入2
+                    <br />结算周期选择按天时,就是每天2点结算昨天数据
+                    <br />结算周期选择按周时,就是每周星期2凌晨1点结算前一周数据
+                    <br />结算周期选择按月时,就是每月2号凌晨1点结算上个月数据
+                    <br />结算周期选择按季时,就是每季度第2天凌晨1点结算上一季度数据
+                    <br />结算周期选择按年时,就是每年第2天凌晨1点结算上一年数据',
+            ],
+
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+        ],
+    ],
+];

+ 66 - 0
src/place/benefit/manage/buy.php

@@ -0,0 +1,66 @@
+<?php
+return [
+    'list' => [
+        'desc' => '设置用户购买的限制',
+        'field'      => [
+            'name',
+            'day',
+            'value',
+            'num',
+            'scope' => [
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "buy"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'tab' => [
+            '基本信息' => 'name,day,value,num',
+            '应用范围' => 'place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'day' => [
+                'rules' => true,
+                'desc' => '限额的天数时效,输入2,就是2天内',
+            ],
+            'value' => [
+                'rules' => true,
+                'desc' => '限制购买次数,输入1,就是2天之内只能购买1次',
+            ],
+            'num' => [
+                'rules' => true,
+                'desc' => '每次购买数量,输入1,就是每次购买仅能购买1个',
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'buy', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 143 - 0
src/place/benefit/manage/core.php

@@ -0,0 +1,143 @@
+<?php
+return [
+    'menu' => [
+        'place_benefit' => [
+            'parent'    => 'sector_place_benefit',
+            'name'      => '基础权益',
+            'icon'      => 'mini-program-line',
+            'sort'      => '2',
+        ],
+        
+        'promotion' => [
+            'parent'    => 'place_benefit',
+            'name'      => '促销',
+            'icon'      => 'discord-line',
+            'sort'      => '1',
+        ],
+        'rebate' => [
+            'parent'    => 'place_benefit',
+            'name'      => '返利',
+            'icon'      => 'cast-line',
+            'sort'      => '10',
+        ],
+        'bonus' => [
+            'parent'    => 'place_benefit',
+            'name'      => '分红',
+            'icon'      => 'money-cny-box-line',
+            'sort'      => '20',
+        ],
+        
+        'coupon' => [
+            'parent'    => 'place_benefit',
+            'name'      => '优惠券',
+            'icon'      => 'coupon-3-line',
+            'sort'      => '30',
+        ],
+
+        'gift' => [
+            'parent'    => 'place_benefit',
+            'name'      => '礼品卡',
+            'icon'      => 'bank-card-line',
+            'sort'      => '40',
+        ],
+
+        'score' => [
+            'parent'    => 'place_benefit',
+            'name'      => '积分规则',
+            'icon'      => 'currency-line',
+            'sort'      => '50',
+        ],
+
+        'score_action' => [
+            'parent'    => 'place_benefit',
+            'name'      => '角色行为权益',
+            'sort'      => '100',
+            'show'      => 3
+        ],
+
+        /*
+        'exchange' => [
+            'parent'    => 'place_benefit',
+            'name'      => '兑换',
+            'icon'      => 'dribbble-fill',
+            'sort'      => '60',
+        ],
+        */
+
+        'held' => [
+            'parent'    => 'place_benefit',
+            'name'      => '持有权',
+            'icon'      => 'flood-line',
+            'sort'      => '70',
+        ],
+
+        'buy' => [
+            'parent'    => 'place_benefit',
+            'name'      => '购买限额',
+            'icon'      => 'product-hunt-line',
+            'sort'      => '80',
+        ],
+        'visit' => [
+            'parent'    => 'place_benefit',
+            'name'      => '访问限额',
+            'icon'      => 'coupon-5-line',
+            'sort'      => '90',
+        ],
+
+        'perk' => [
+            'parent'    => 'place_benefit',
+            'name'      => '权益包',
+            'icon'      => 'database-2-line',
+            'sort'      => '100',
+        ],
+        
+        'perk_code' => [
+            'parent'    => 'place_benefit',
+            'name'      => '权益包兑换码',
+            'sort'      => '100',
+            'show'      => 3
+        ],
+        'perk_voucher' => [
+            'parent'    => 'place_benefit',
+            'name'      => '权益包权益',
+            'sort'      => '100',
+            'show'      => 3
+        ],
+
+        'perk_create_code' => [
+            'parent'    => 'place_benefit',
+            'name'      => '兑换码生成',
+            'icon'      => 'coupon-3-line',
+            'sort'      => '100',
+            'show'      => 3
+        ],
+
+        'scope' => [
+            'parent'    => 'place_benefit',
+            'name'      => '权益应用范围',
+            'sort'      => '100',
+            'show'      => 3
+        ],
+
+        'place_benefit_role' => [
+            'parent'    => 'sector_place_benefit',
+            'name'      => '权益分配',
+            'icon'      => 'device-line',
+            'sort'      => '1',
+        ],
+
+        'role' => [
+            'parent'    => 'place_benefit_role',
+            'name'      => '角色权益',
+            'icon'      => 'surround-sound-line',
+            'sort'      => '1',
+        ],
+
+        'user' => [
+            'parent'    => 'place_benefit_role',
+            'name'      => '用户权益',
+            'icon'      => 'admin-line',
+            'sort'      => '2',
+        ],
+    ],
+];

+ 130 - 0
src/place/benefit/manage/coupon.php

@@ -0,0 +1,130 @@
+<?php
+return [
+    'list' => [
+        'desc' => '优惠券的面值单位以支付货币为准,如支付货币为人民币,那么优惠券的面值单位就是元,使用积分时,将自动按照积分的货币换算规则转换成相应的积分',
+        'field'      => [
+            'name',
+            'type',
+            'get',
+            'value',
+            'min',
+            'wallet' => [
+                'name' => '数量',
+                'tip' => '总数/总领取/总使用',
+                'show' => '{total}/{received}/{used}',
+            ],
+            'scope' => [
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "coupon"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+            //'删除' => 'delete',
+        ],
+        'search'    => [
+            'name',
+            'type',
+            'get',
+            'status',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'date_start,date_end' => 'date_type=2',
+            'date_day' => 'date_type=1',
+            'value_1' => [
+                'type' => [1,2],
+            ],
+            'value_2' => 'type=3',
+            'value_3' => 'type=4',
+        ],
+
+        'tab' => [
+            '基本信息' => 'name,desc,get,min,type,value_1,value_2,value_3,total,limit',
+            '有效期设置' => 'date_type,date_start,date_end,date_day',
+            '应用范围' => 'place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'type' => [
+                'type' => 'radio',
+                'tip' => '满减券:仅可使用一次<br />现金券:可以使用多次,直到余额用光<br />折扣券:仅可使用一次,按照支付金额计算折扣<br />兑换券:可以使用多次,直接抵扣支付金额',
+            ],
+            'get' => [
+                'type' => 'radio',
+                'tip' => '开启后,用户可以主动领取优惠券',
+            ],
+            'value_1' => [
+                'name' => '面值',
+                'field' => 'value',
+                //'rules' => true,
+                'desc' => '填写优惠券面值',
+                'default' => '{value}',
+            ],
+            'value_2' => [
+                'name' => '折扣',
+                'field' => 'value',
+                //'rules' => true,
+                'desc' => '填写数字9,则为9折',
+                'default' => '{value}',
+            ],
+            'value_3' => [
+                'name' => '兑换数量',
+                'field' => 'value',
+                //'rules' => true,
+                'desc' => '填写可以兑换的数量',
+                'default' => '{value}',
+            ],
+            'min' => [
+                'tip' => '设置当前优惠券最低可用金额,设置100,则支付金额达到100元时可用',
+            ],
+            'total' => [
+                'tip' => '设置优惠券总数量,无总数量请填写0',
+            ],
+            'limit' => [
+                'tip' => '设置每个优惠券每人可以领取的最多数量,0为无限领取',
+            ],
+            'date_type' => [
+                'type' => 'radio',
+            ],
+            'date_start' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 00:00:00"),
+            ],
+            'date_end' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 23:59:59", time()+7*86400),
+            ],
+            'date_day' => [
+                //'rules' => true,
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'coupon', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 44 - 0
src/place/benefit/manage/exchange.php

@@ -0,0 +1,44 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name',
+            'scope' => [
+                'type' => 'popover',
+                'name' => '兑换范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "exchange"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'desc' => [
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/exchange_scope' => [
+                'name' => '可兑换范围',
+                'where'  => ['exchange_id' => 'id'],
+                'desc' => '如填写数量是10,就是在当前可兑换范围内任意选择10个进行免费兑换',
+            ],
+        ],
+    ],
+];

+ 32 - 0
src/place/benefit/manage/exchange_scope.php

@@ -0,0 +1,32 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'value' => [
+                'name'      => '可兑换范围',
+                'type' => 'cascader',
+                'check' => true,
+                'option'    => 'Dever::call("place_benefit/manage/scope.getData")',
+                'remote' => 'place_benefit/manage/api.getScope',
+                'width' => '100%',
+            ],
+            'ids' => [
+                'name'      => '关联项目',
+                'type' => 'select2',
+                # select2需要有默认值
+                'option' => [],
+                'multiple' => true,
+                'tip' => '不选择关联项目,则当前选择的应用范围内均有效',
+                'placeholder' => '不选择关联项目,则当前选择的应用范围内均有效',
+                'width' => '100%',
+                'tags' => true,
+                'max_tags' => 3,
+            ],
+            'num' => [
+                'rules' => true,
+                'name' => '数量',
+                'tip' => '可兑换的数量',
+            ],
+        ],
+    ],
+];

+ 101 - 0
src/place/benefit/manage/gift.php

@@ -0,0 +1,101 @@
+<?php
+return [
+    'list' => [
+        'desc' => '礼品卡的面值单位以支付货币为准,如支付货币为人民币,那么礼品卡的面值单位就是元,使用积分时,将自动按照积分的货币换算规则转换成相应的积分',
+        'field'      => [
+            'name',
+            'value',
+            'min',
+            'limit',
+            'wallet' => [
+                'name' => '数量',
+                'tip' => '总数/总领取/总使用',
+                'show' => '{total}/{received}/{used}',
+            ],
+            'scope' => [
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "gift"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+            //'删除' => 'delete',
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'date_start,date_end' => 'date_type=2',
+            'date_day' => 'date_type=1',
+        ],
+
+        'tab' => [
+            '基本信息' => 'name,desc,min,value,total,limit',
+            '有效期设置' => 'date_type,date_start,date_end,date_day',
+            '应用范围' => 'place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'value' => [
+                'rules' => true,
+                'desc' => '礼品卡面值',
+            ],
+            'min' => [
+                'rules' => true,
+                'tip' => '设置当前礼品卡最低可用金额,设置100,则支付金额达到100元时可用',
+            ],
+            'total' => [
+                'rules' => true,
+                'tip' => '设置礼品卡发行总数量,无总数量请填写0',
+            ],
+            'limit' => [
+                'rules' => true,
+                'tip' => '设置每个礼品卡每人可以领取的最多数量,0为无限领取',
+            ],
+            'date_type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'date_start' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 00:00:00"),
+            ],
+            'date_end' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 23:59:59", time()+7*86400),
+            ],
+            'date_day' => [
+                //'rules' => true,
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'gift', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 38 - 0
src/place/benefit/manage/held.php

@@ -0,0 +1,38 @@
+<?php
+return [
+    'list' => [
+        'desc' => '设置持有权,一般为赠送的特权',
+        'field'      => [
+            'name',
+            'day',
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['fastadd'],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+            'day' => [
+                'rules' => true,
+                'desc' => '有效期天数,领取后生效,填写365,就是365天',
+            ],
+        ],
+    ],
+];

+ 107 - 0
src/place/benefit/manage/perk.php

@@ -0,0 +1,107 @@
+<?php
+return [
+    'list' => [
+        'desc' => '权益包是多个权益的集合,可以自己使用,也可以赠送他人,使用兑换码可以兑换权益包',
+        'field'      => [
+            'name',
+            'give',
+            'limit',
+            'voucher' => [
+                'name' => '权益数量',
+                'show' => 'Dever::call("place_benefit/manage/perk.getVoucher", {id})',
+            ],
+            'wallet' => [
+                'name' => '数量',
+                'tip' => '总数/总兑换',
+                'show' => '{total}/{received}',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+            //'删除' => 'delete',
+            '兑换码' => ['route', [
+                'path' => 'place_benefit/perk_code',
+                'param' => [
+                    'set' => ['perk_id' => 'id', 'menu' => 'place_benefit/perk', 'parent' => 'place_benefit/perk'],
+                ],
+            ]],
+        ],
+        'search'    => [
+            'name',
+            'give',
+            'status',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'date_start,date_end' => 'date_type=2',
+            'date_day' => 'date_type=1',
+        ],
+
+        'tab' => [
+            '基本信息' => 'name,desc,give,limit',
+            '有效期设置' => 'date_type,date_start,date_end,date_day',
+            '兑换码设置' => 'code_type,code_prefix,code_length',
+            '权益设置' => 'place_benefit/perk_voucher',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'give' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'limit' => [
+                'rules' => true,
+                'tip' => '设置每个权益包每人可以领取的最多数量,0为无限领取',
+            ],
+            'date_type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'date_start' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 00:00:00"),
+            ],
+            'date_end' => [
+                //'rules' => true,
+                'type' => 'date',
+                'date_type' => 'datetime',
+                //'default' => date("Y-m-d 23:59:59", time()+7*86400),
+            ],
+            'date_day' => [
+                //'rules' => true,
+            ],
+            'desc' => [
+                'rules' => true,
+                'desc' => '因权益包包含内容较多,这里需要简单描述一下权益包内容',
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'code_type' => [
+                'type' => 'select',
+            ],
+            'code_prefix' => [
+                'tip' => '输入生成的兑换码前缀',
+            ],
+            'code_length' => [
+                'tip' => '输入生成的兑换码长度,不包括前缀',
+            ],
+
+            'place_benefit/perk_voucher' => [
+                'name' => '权益列表',
+                'where'  => ['perk_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 43 - 0
src/place/benefit/manage/perk_code.php

@@ -0,0 +1,43 @@
+<?php
+$perk_id = Dever::input(['set', 'field'])['perk_id'] ?? 0;
+return [
+    'list' => [
+        'where' => ['perk_id' => $perk_id],
+        'field'      => [
+            'perk_id',
+            'utype',
+            'uid' => [
+                'show' => 'Dever::call("place_benefit/manage/perk.getCodeUser", ["{utype}", "{uid}"])',
+            ],
+            'code',
+            'total',
+            'used',
+            'status' => '',
+        ],
+        'button' => [
+            '新增' => ['fastadd', ['perk_id' => $perk_id]],
+            '批量生成' => ['fastadd', ['path' => 'place_benefit/perk_create_code', 'field' => ['perk_id' => $perk_id]]],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit', ['perk_id' => $perk_id]],
+        ],
+        'search'    => [
+            'code',
+            'status',
+        ],
+    ],
+
+    'update' => [
+        'start' => 'place_benefit/manage/code.check',
+        'field'    => [
+            'perk_id',
+            'code' => [
+                'desc' => '用户输入正确的兑换码即可绑定相应的权益包',
+            ],
+            'total' => [
+                'desc' => '当前兑换码最多可兑换次数,如输入10,则该兑换码可以兑换10次权益包,输入0则无限制次数<br />适合发放节假日权益',
+            ],
+        ],
+        'check' => 'code',
+    ],
+];

+ 17 - 0
src/place/benefit/manage/perk_create_code.php

@@ -0,0 +1,17 @@
+<?php
+return [
+    'update' => [
+        'end' => 'place_benefit/manage/code.create',
+        'field'    => [
+            'perk_id',
+            'num' => [
+                'tip' => '输入本次生成的数量',
+            ],
+            /*
+            'total' => [
+                'tip' => '生成的券码总使用/兑换次数,建议保持默认值1',
+            ],
+            */
+        ],
+    ],
+];

+ 19 - 0
src/place/benefit/manage/perk_voucher.php

@@ -0,0 +1,19 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'type' => [
+                'type' => 'select',
+                'remote' => 'place_benefit/manage/api.getType',
+            ],
+            'type_id' => [
+                'rules' => true,
+                'type' => 'select',
+            ],
+            'num' => [
+                'name' => '数量',
+                'tip' => '可兑换的数量<br />如选择返利,输入5,将享受返利权益5次,5次后失效',
+            ],
+        ],
+    ],
+];

+ 69 - 0
src/place/benefit/manage/promotion.php

@@ -0,0 +1,69 @@
+<?php
+return [
+    'list' => [
+        'desc' => '促销的类型为价格时,数值单位以支付货币为准,如支付货币为人民币,那么数值单位就是元,使用积分时,将自动按照积分的货币换算规则转换成相应的积分',
+        'field'      => [
+            'name',
+            'type',
+            'value',
+            'tag',
+            'scope' => [
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "promotion"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'type',
+            'status',
+        ],
+    ],
+    'update' => [
+        'tab' => [
+            '基本信息' => 'name,desc,type,value',
+            '应用范围' => 'tag,place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'tip' => '显示在角色等级介绍中',
+                'maxlength' => 15,
+                'rules' => true,
+            ],
+            /*
+            'desc' => [
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],*/
+            'type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'value' => [
+                'rules' => true,
+                'desc' => '类型为折扣时:填写数字9,则为9折<br />类型为百分比时:填写数字9,则为9%<br />类型为活动价时:填写数字9,则为9元',
+            ],
+            'tag' => [
+                'rules' => true,
+                'type' => 'radio',
+                'desc' => '展示在选择应用范围内的价格标签中,仅展示排序第一个',
+            ],
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'promotion', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 62 - 0
src/place/benefit/manage/rebate.php

@@ -0,0 +1,62 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name' => [
+                'width' => '200px',
+            ],
+            'rule' => [
+                'name' => '返利规则',
+                'show' => 'Dever::call("place_benefit/manage/rebate.getRule", {id})',
+            ],
+            'scope' => [
+                'width' => '120px',
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                //'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "rebate"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'tab' => [
+            '基本信息' => 'name,place_benefit/rebate_rule',
+            '应用范围' => 'place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/rebate_rule' => [
+                'name' => '返利规则',
+                'where'  => ['rebate_id' => 'id'],
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'rebate', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 24 - 0
src/place/benefit/manage/rebate_rule.php

@@ -0,0 +1,24 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'score_id',
+            'level' => [
+                'tip' => '输入返利的层级<br />输入0,给购买者本人返利<br />输入1,给购买者上级返利<br />输入2,给购买者上上级返利<br /><span style="color:red">注意:本功能仅返积分,目前仅支持三层返利,请勿违反法律法规</span>',
+            ],
+            'value' => [
+                'tip' => '输入返利的奖励数值<br />输入10,就是奖励10积分<br />输入10%,就是奖励订单支付货币总额的10%积分<br />订单购买积分将自动转换成支付货币,如订单支付货币总额为100元,10%就是奖励10积分',
+            ],
+            'condition' => [
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 1],
+                'tip' => '达成返利的条件公式,目前支持如下变量:<br />
+                child_num_1:推荐1层用户数量<br />
+                child_num_2:推荐2层用户数量<br />
+                child_num_3:推荐3层用户数量<br />
+                如直推1级小于等于30人:child_num_1<=30',
+            ],
+        ],
+        'drag' => 'sort',
+    ],
+];

+ 69 - 0
src/place/benefit/manage/role.php

@@ -0,0 +1,69 @@
+<?php
+return [
+    'source' => 'place_role/level',
+    'list' => [
+        'field'      => [
+            'info_id' => [
+                'name' => '角色',
+                'width' => '100px',
+            ],
+            'name' => [
+                'name' => '等级',
+                'width' => '100px',
+            ],
+            'role_upgrade' => [
+                'name' => '固定权益',
+                'show' => 'Dever::call("place_benefit/manage/role.getUpgrade", {id})',
+            ],
+            'role_period' => [
+                'name' => '周期权益',
+                'show' => 'Dever::call("place_benefit/manage/role.getPeriod", {id})',
+            ],
+        ],
+        'button' => [
+            
+        ],
+        'data_button' => [
+            '修改权益' => ['edit'],
+
+            /* 这里很复杂,以后再加吧,所有用户的行为都有不同的权益
+            '行为权益' => ['route', [
+                'path' => 'place_benefit/role_action',
+                'param' => [
+                    'set' => ['level_id' => 'id', 'menu' => 'place_benefit/role', 'parent' => 'place_benefit/role'],
+                ],
+            ]],*/
+        ],
+        'search'    => [
+            'name',
+            'info_id',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'info_id' => [
+                'type' => 'text',
+                'disable' => true,
+            ],
+            'name' => [
+                'type' => 'text',
+                'disable' => true,
+            ],
+            'place_benefit/role_upgrade' => [
+                'name' => '固定权益',
+                'tip' => '无需用户主动领取<br />增加和删除权益将影响现有角色等级所有用户',
+                'where'  => ['level_id' => 'id'],
+            ],
+
+            'place_benefit/role_period' => [
+                'name' => '周期权益',
+                'tip' => '需要用户在权益里手动领取,领取本周期权益后才可以领取下一周期权益<br />增加和删除权益仅影响后续发放奖励的用户',
+                'where'  => ['level_id' => 'id'],
+            ],
+            'benefit' => [
+                'type' => 'radio',
+                'desc' => '升级后是否立即发放周期权益<br />如果选是,升级到本等级,系统会自动发放一次周期权益,无需用户手动领取<br />如果后续还有周期权益,需要用户手动领取',
+            ],
+        ],
+    ],
+];

+ 78 - 0
src/place/benefit/manage/role_action.php

@@ -0,0 +1,78 @@
+<?php
+$level_id = Dever::input(['set', 'field'])['level_id'] ?? 0;
+return [
+    'list' => [
+        'where' => ['level_id' => $level_id],
+        'field'      => [
+            'action_id',
+            'num',
+            'upper',
+            'status' => [
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ],
+        ],
+        'button' => [
+            '新增' => ['fastadd', ['level_id' => $level_id]],
+        ],
+        'data_button' => [
+            '编辑'  => ['fastedit'],
+        ],
+        'search'    => [
+            'action_id',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'upper_type' => [
+                'upper' => 2,
+            ],
+            'upper_time' => [
+                'upper' => 2,
+                'upper_type' => 2,
+            ],
+            'upper_limit' => [
+                'upper' => 2,
+            ],
+            'action_num' => 'action_type=2',
+        ],
+        'field'    => [
+            'level_id',
+            'action_type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'action_id' => [
+                'rules' => true,
+            ],
+            'action_num' => [
+                'tip' => '这里直接填写支付货币即可,如填写100就是100元<br />如果用户行为达到了该数值则获得以下设置的权益<br />如行为选择购买资源,填写100,则每次购买资源超过100元会赠送权益',
+            ],
+            'num' => [
+                'rules' => true,
+            ],
+            'upper' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'upper_type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'upper_time' => [
+                'rules' => true,
+            ],
+            'upper_limit' => [
+                'rules' => true,
+                'tip' => '按照所选的限制类型设置限制次数<br />如限制类型为按8小时,限制次数填写2,则该积分规则每8个小时仅能生效2次',
+            ],
+
+            /*
+            'limit_money' => [
+                'tip' => '填写限制金额后,每次行为触发该积分规则,先验证是否达到该限制金额,未达到则不发放积分< br />仅限购买、充值、提现、兑换等有金额的行为可用',
+            ],*/
+        ],
+    ],
+];

+ 25 - 0
src/place/benefit/manage/role_period.php

@@ -0,0 +1,25 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'type' => [
+                'type' => 'select',
+                'remote' => 'place_benefit/manage/api.getType',
+            ],
+            'type_id' => [
+                'rules' => true,
+                'type' => 'select',
+            ],
+            'num' => [
+                'tip' => '发放数量',
+            ],
+            'day' => [
+                'tip' => '每隔多少天发放一次奖励,这里填写天数',
+            ],
+            'max' => [
+                'tip' => '限制最多发放次数,为0则不限制',
+            ],
+        ],
+        'drag' => 'sort',
+    ],
+];

+ 16 - 0
src/place/benefit/manage/role_upgrade.php

@@ -0,0 +1,16 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'type' => [
+                'type' => 'select',
+                'remote' => 'place_benefit/manage/api.getType',
+            ],
+            'type_id' => [
+                'rules' => true,
+                'type' => 'select',
+            ],
+        ],
+        'drag' => 'sort',
+    ],
+];

+ 27 - 0
src/place/benefit/manage/scope.php

@@ -0,0 +1,27 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'value' => [
+                'name'      => '选择范围',
+                'type' => 'cascader',
+                'check' => true,
+                'option'    => 'Dever::call("place_benefit/manage/scope.getData")',
+                'remote' => 'place_benefit/manage/api.getScope',
+                'width' => '100%',
+            ],
+            'ids' => [
+                'name'      => '关联项目',
+                'type' => 'select2',
+                # select2需要有默认值
+                'option' => [],
+                'multiple' => true,
+                'tip' => '不选择关联项目,则当前选择范围内有效',
+                'placeholder' => '不选择关联项目,则当前选择范围内有效',
+                'width' => '100%',
+                'tags' => true,
+                'max_tags' => 3,
+            ],
+        ],
+    ],
+];

+ 93 - 0
src/place/benefit/manage/score.php

@@ -0,0 +1,93 @@
+<?php
+return [
+    'list' => [
+        'field'      => [
+            'name' => [
+                'width' => '200px',
+            ],
+            'score_info_id' => [
+                'show' => '{score_id}',
+            ],
+            'score_id',
+            'recharge',
+            'withdraw',
+            'exchange',
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['fastadd', 'name,score_id,desc,recharge,exchange,withdraw'],
+        ],
+        'data_button' => [
+            '编辑' => ['fastedit', 'name,score_id,desc,recharge,exchange,withdraw'],
+            '行为' => ['route', [
+                'path' => 'place_benefit/score_action',
+                'param' => [
+                    'set' => ['score_id' => 'id', 'score_info_id' => 'score_info_id', 'menu' => 'place_benefit/score', 'parent' => 'place_benefit/score'],
+                ],
+            ]],
+            '充值' => ['fastedit', 'place_benefit/score_recharge', '','recharge=1'],
+            '兑换' => ['fastedit', 'place_benefit/score_exchange', '','exchange=1'],
+            '提现' => ['fastedit', 'withdraw_fee,withdraw_min,withdraw_max,withdraw_limit', '','withdraw=1'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'score_id' => [
+                'rules' => true,
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'recharge' => [
+                'tip' => '开启后,根据货币换算规则,用户可以充值任意金额到该积分账户上',
+                'rules' => true,
+                'type' => 'radio',
+            ],
+
+            'place_benefit/score_recharge' => [
+                'name' => '充值设置',
+                'where'  => ['score_id' => 'id'],
+            ],
+
+            'exchange' => [
+                'tip' => '开启后,可以设置转换的目标积分,用户可以将该积分转成目标积分',
+                'rules' => true,
+                'type' => 'radio',
+            ],
+
+            'place_benefit/score_exchange' => [
+                'name' => '兑换设置',
+                'where'  => ['score_id' => 'id'],
+            ],
+
+            'withdraw' => [
+                'tip' => '开启后,根据货币换算规则,用户可以将积分提现到微信账户、支付宝账户、银行卡、个人收款码上',
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'withdraw_fee' => [
+                'desc' => '提现将扣除用户当前积分百分比手续费,如设置5,提现100,则实际到账95',
+            ],
+            'withdraw_min' => [
+                'desc' => '填写提现到账的货币金额下限,每次提现不允许低于该金额',
+            ],
+            'withdraw_max' => [
+                'desc' => '填写提现到账的货币金额上限,每次提现不允许高于该金额',
+            ],
+            'withdraw_limit' => [
+                'desc' => '每天提现不允许超过该次数',
+            ],
+        ],
+    ],
+];

+ 71 - 70
src/place/score/manage/rule.php → src/place/benefit/manage/score_action.php

@@ -1,71 +1,72 @@
-<?php
-$info_id = Dever::input(['set', 'field'])['info_id'] ?? 0;
-return [
-    'list' => [
-        'where' => ['info_id' => $info_id],
-        'field'      => [
-            'action_id',
-            'num',
-            'upper',
-            'status' => [
-                'type' => 'switch',
-                'show'  => '{status}',
-                'active_value' => 1,
-                'inactive_value' => 2,
-            ],
-        ],
-        'button' => [
-            '新增' => ['fastadd', ['info_id' => $info_id]],
-        ],
-        'data_button' => [
-            '编辑'  => ['fastedit'],
-        ],
-        'search'    => [
-            'action_id',
-        ],
-    ],
-    'update' => [
-        'control' => [
-            'upper_type' => [
-                'upper' => 2,
-            ],
-            'upper_time' => [
-                'upper' => 2,
-                'upper_type' => 2,
-            ],
-            'upper_limit' => [
-                'upper' => 2,
-            ],
-        ],
-        'field'    => [
-            'info_id',
-            'action_id' => [
-                'rules' => true,
-            ],
-            'num' => [
-                'rules' => true,
-            ],
-            'upper' => [
-                'rules' => true,
-                'type' => 'radio',
-            ],
-            'upper_type' => [
-                'rules' => true,
-                'type' => 'radio',
-            ],
-            'upper_time' => [
-                'rules' => true,
-            ],
-            'upper_limit' => [
-                'rules' => true,
-                'tips' => '按照所选的限制类型设置限制次数<br />如限制类型为按8小时,限制次数填写2,则该积分规则每8个小时仅能生效2次',
-            ],
-            /*
-            'place_score/rebate' => [
-                'name' => '返利积分',
-                'tips' => '选择返利积分后,当用户获得积分后,将按照规则返利',
-                'where'  => ['type' => 5,'type_id' => 'id'],
-            ],*/
-        ],
-    ],
+<?php
+$score_id = Dever::input(['set', 'field'])['score_id'] ?? 0;
+$score_info_id = Dever::input(['set', 'field'])['score_info_id'] ?? 0;
+return [
+    'list' => [
+        'where' => ['score_id' => $score_id],
+        'field'      => [
+            'action_id',
+            'num',
+            'upper',
+            'status' => [
+                'type' => 'switch',
+                'show'  => '{status}',
+                'active_value' => 1,
+                'inactive_value' => 2,
+            ],
+        ],
+        'button' => [
+            '新增' => ['fastadd', ['score_id' => $score_id, 'score_info_id' => $score_info_id]],
+        ],
+        'data_button' => [
+            '编辑'  => ['fastedit'],
+        ],
+        'search'    => [
+            'action_id',
+        ],
+    ],
+    'update' => [
+        'control' => [
+            'upper_type' => [
+                'upper' => 2,
+            ],
+            'upper_time' => [
+                'upper' => 2,
+                'upper_type' => 2,
+            ],
+            'upper_limit' => [
+                'upper' => 2,
+            ],
+        ],
+        'field'    => [
+            'score_id',
+            'score_info_id',
+            'action_id' => [
+                'rules' => true,
+            ],
+            'num' => [
+                'rules' => true,
+            ],
+            'upper' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'upper_type' => [
+                'rules' => true,
+                'type' => 'radio',
+            ],
+            'upper_time' => [
+                'rules' => true,
+            ],
+            'upper_limit' => [
+                'rules' => true,
+                'tip' => '按照所选的限制类型设置限制次数<br />如限制类型为按8小时,限制次数填写2,则该积分规则每8个小时仅能生效2次',
+            ],
+
+            /*
+            'limit_money' => [
+                'tip' => '填写限制金额后,每次行为触发该积分规则,先验证是否达到该限制金额,未达到则不发放积分< br />仅限购买、充值、提现、兑换等有金额的行为可用',
+            ],*/
+        ],
+    ],
 ];

+ 17 - 0
src/place/benefit/manage/score_exchange.php

@@ -0,0 +1,17 @@
+<?php
+$score_id = Dever::input(['set', 'field'])['score_id'] ?? 0;
+return [
+    'update' => [
+        'field'    => [
+            'exchange_score_id' => [
+                'type' => 'select',
+                'tip' => '选择要兑换的目标积分',
+                'option' => 'Dever::call("place_score/manage/info.getList", '.$score_id.')',
+            ],
+            'value' => [
+                'tip' => '直接输入要兑换的数值,如输入100,就是当前积分1个可以兑换100个目标积分',
+                'placeholder' => '输入兑换数值',
+            ],
+        ],
+    ],
+];

+ 15 - 0
src/place/benefit/manage/score_recharge.php

@@ -0,0 +1,15 @@
+<?php
+return [
+    'update' => [
+        'field'    => [
+            'price' => [
+                'rules' => true,
+                'tip' => '支付的金额,这里直接填写积分数值,系统自动转换成支付货币',
+            ],
+            'value' => [
+                'rules' => true,
+                'tip' => '到账的金额,这里直接填写积分数值',
+            ],
+        ],
+    ],
+];

+ 61 - 0
src/place/benefit/manage/visit.php

@@ -0,0 +1,61 @@
+<?php
+return [
+    'list' => [
+        'desc' => '设置用户使用内容或功能的限制',
+        'field'      => [
+            'name',
+            'day',
+            'value',
+            'scope' => [
+                'type' => 'popover',
+                'name' => '应用范围',
+                'location' => 'right',
+                'tag' => true,
+                'show' => 'Dever::call("place_benefit/manage/scope.getInfo", [{id}, "visit"])',
+            ],
+            'sort',
+            'status',
+        ],
+        'button' => [
+            '新增' => ['add'],
+        ],
+        'data_button' => [
+            '编辑' => ['edit'],
+        ],
+        'search'    => [
+            'name',
+            'status',
+        ],
+    ],
+    'update' => [
+        'tab' => [
+            '基本信息' => 'name,day,value,start,end',
+            '应用范围' => 'place_benefit/scope',
+        ],
+
+        'field'    => [
+            'name' => [
+                'rules' => true,
+            ],
+            'day' => [
+                'rules' => true,
+                'desc' => '限额的天数时效,输入2,就是2天内',
+            ],
+            'value' => [
+                'rules' => true,
+                'desc' => '限额数字,输入100,就是2天之内只能访问100次',
+            ],
+            'desc' => [
+                //'rules' => true,
+                'type' => 'textarea',
+                'autosize' => ['minRows' => 4],
+            ],
+
+            'place_benefit/scope' => [
+                'name' => '应用范围',
+                'tip' => '不添加应用范围,全场可用',
+                'where'  => ['type' => 'visit', 'type_id' => 'id'],
+            ],
+        ],
+    ],
+];

+ 108 - 0
src/place/benefit/table/bonus.php

@@ -0,0 +1,108 @@
+<?php
+return [
+    'name' => '分红表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '分红名称',
+            'type'      => 'varchar(32)',
+        ],
+
+        'type' => [
+            'name'      => '分红类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '消费',
+                2 => '持有',
+            ],
+        ],
+
+        'sell_cash' => [
+            'name'      => '最低消费',
+            'type'      => 'decimal(11,2)',
+        ],
+
+        'holding_score_id'        => [
+            'name'      => '持有积分',
+            'type'      => 'int(11)',
+            'value'     => 'place_score/info',
+            'default'   => 1,
+        ],
+
+        'holding_score_value'        => [
+            'name'      => '最低持有数值',
+            'type'      => 'decimal(11,2)',
+        ],
+
+        'give_source' => [
+            'name'      => '奖励来源',
+            'type'      => 'tinyint(1)',
+            'default'   => 2,
+            'value'     => [
+                1 => '全站',
+                2 => '团队',
+                3 => '区域',
+                //4 => '团队+区域',
+            ],
+        ],
+
+        'give_level' => [
+            'name'      => '团队层级',
+            'type'      => 'varchar(11)',
+            'default'   => 1,
+        ],
+
+        'give_score_id'        => [
+            'name'      => '奖励积分',
+            'type'      => 'int(11)',
+            'value'     => 'place_score/info',
+            'default'   => 1,
+        ],
+
+        'give_value' => [
+            'name'      => '奖励数值',
+            'type'      => 'varchar(100)',
+        ],
+
+        'give_value_max' => [
+            'name'      => '奖励上限',
+            'type'      => 'decimal(11,2)',
+        ],
+
+        'period' => [
+            'name'      => '结算周期',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '每天',
+                2 => '每周',
+                3 => '每月',
+                4 => '每季',
+                4 => '每年',
+            ],
+        ],
+
+        'period_day' => [
+            'name'      => '结算时间',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 43 - 0
src/place/benefit/table/buy.php

@@ -0,0 +1,43 @@
+<?php
+return [
+    'name' => '购买限额表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc',
+    'struct' => [
+        'name' => [
+            'name'      => '限额名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '限额介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'day' => [
+            'name'      => '限额时长',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+        'value' => [
+            'name'      => '购买次数',
+            'type'      => 'int(11)',
+        ],
+        'num' => [
+            'name'      => '购买数量',
+            'type'      => 'int(11)',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 98 - 97
src/place/source/table/coupon.php → src/place/benefit/table/coupon.php

@@ -1,98 +1,99 @@
-<?php
-return [
-    'name' => '资源优惠券',
-    'partition' => 'Dever::call("manage/common.system")',
-    'order' => 'sort asc',
-    'struct' => [
-        'name' => [
-            'name'      => '优惠券名称',
-            'type'      => 'varchar(32)',
-        ],
-        'desc' => [
-            'name'      => '优惠券介绍',
-            'type'      => 'varchar(500)',
-        ],
-        'type' => [
-            'name'      => '类型',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '满减',
-                2 => '现金',
-                3 => '折扣',
-            ],
-        ],
-        'value' => [
-            'name'      => '面值/折扣',
-            'type'      => 'decimal(20,2)',
-        ],
-        'min' => [
-            'name'      => '最小金额',
-            'type'      => 'decimal(20,2)',
-            'default'   => '0',
-        ],
-        'total' => [
-            'name'      => '总数量',
-            'type'      => 'int(11)',
-            'default'   => '0',
-        ],
-        'get' => [
-            'name'      => '主动领取',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '开启',
-                2 => '关闭',
-            ],
-        ],
-        'received' => [
-            'name'      => '领取数量',
-            'type'      => 'int(11)',
-        ],
-        'used' => [
-            'name'      => '使用数量',
-            'type'      => 'int(11)',
-        ],
-        'limit' => [
-            'name'      => '限领数量',
-            'type'      => 'int(11)',
-            'default'   => 1,
-        ],
-        'date_type' => [
-            'name'      => '有效期类型',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '领取后生效',
-                2 => '固定时间',
-            ],
-        ],
-        'date_start' => [
-            'name'      => '开始时间',
-            'type'      => 'int(11)',
-        ],
-        'date_end' => [
-            'name'      => '结束时间',
-            'type'      => 'int(11)',
-        ],
-        'date_day' => [
-            'name'      => '有效天数',
-            'type'      => 'int(11)',
-            'default'   => '7',
-        ],
-        'status' => [
-            'name'      => '状态',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '生效',
-                2 => '失效',
-            ],
-        ],
-        'sort' => [
-            'name'      => '排序',
-            'type'      => 'int(11)',
-            'default'   => '1',
-        ],
-    ],
+<?php
+return [
+    'name' => '优惠券',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '优惠券名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '优惠券介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'type' => [
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '满减',
+                2 => '现金',
+                3 => '折扣',
+                4 => '兑换',
+            ],
+        ],
+        'value' => [
+            'name'      => '面值/折扣',
+            'type'      => 'decimal(11,2)',
+        ],
+        'min' => [
+            'name'      => '最小金额',
+            'type'      => 'decimal(11,2)',
+            'default'   => '0',
+        ],
+        'total' => [
+            'name'      => '总数量',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'get' => [
+            'name'      => '主动领取',
+            'type'      => 'tinyint(1)',
+            'default'   => 2,
+            'value'     => [
+                1 => '开启',
+                2 => '关闭',
+            ],
+        ],
+        'received' => [
+            'name'      => '领取数量',
+            'type'      => 'int(11)',
+        ],
+        'used' => [
+            'name'      => '使用数量',
+            'type'      => 'int(11)',
+        ],
+        'limit' => [
+            'name'      => '每人限额',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+        'date_type' => [
+            'name'      => '有效期类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '领取后生效',
+                2 => '固定时间',
+            ],
+        ],
+        'date_start' => [
+            'name'      => '开始时间',
+            'type'      => 'int(11)',
+        ],
+        'date_end' => [
+            'name'      => '结束时间',
+            'type'      => 'int(11)',
+        ],
+        'date_day' => [
+            'name'      => '有效天数',
+            'type'      => 'int(11)',
+            'default'   => '7',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
 ];

+ 30 - 0
src/place/benefit/table/exchange.php

@@ -0,0 +1,30 @@
+<?php
+return [
+    'name' => '兑换',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '兑换名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '兑换介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 28 - 0
src/place/benefit/table/exchange_scope.php

@@ -0,0 +1,28 @@
+<?php
+return [
+    'name' => '兑换范围',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'id asc',
+    'struct' => [
+        'exchange_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '权益包',
+        ],
+        'value' => [
+            'name'      => '兑换范围',
+            'type'      => 'varchar(100)',
+        ],
+        'ids' => [
+            'name'      => '关联项目',
+            'type'      => 'text',
+        ],
+        'num'        => [
+            'name'      => '数量',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+    'index' => [
+        'search' => 'exchange_id',
+    ],
+];

+ 79 - 0
src/place/benefit/table/gift.php

@@ -0,0 +1,79 @@
+<?php
+return [
+    'name' => '礼品卡',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '礼品卡名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '礼品卡介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'value' => [
+            'name'      => '面值',
+            'type'      => 'decimal(11,2)',
+        ],
+        'min' => [
+            'name'      => '最小金额',
+            'type'      => 'decimal(11,2)',
+            'default'   => '0',
+        ],
+        'total' => [
+            'name'      => '总数量',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'received' => [
+            'name'      => '领取数量',
+            'type'      => 'int(11)',
+        ],
+        'used' => [
+            'name'      => '使用数量',
+            'type'      => 'int(11)',
+        ],
+        'limit' => [
+            'name'      => '每人限额',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+        'date_type' => [
+            'name'      => '有效期类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '领取后生效',
+                2 => '固定时间',
+            ],
+        ],
+        'date_start' => [
+            'name'      => '开始时间',
+            'type'      => 'int(11)',
+        ],
+        'date_end' => [
+            'name'      => '结束时间',
+            'type'      => 'int(11)',
+        ],
+        'date_day' => [
+            'name'      => '有效天数',
+            'type'      => 'int(11)',
+            'default'   => '365',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 34 - 43
src/place/score/table/recharge.php → src/place/benefit/table/held.php

@@ -1,44 +1,35 @@
-<?php
-return [
-    'name' => '用户积分充值设置表',
-    'partition' => 'Dever::call("manage/common.system")',
-    'order' => 'sort asc,id desc',
-    'struct' => [
-        'info_id'        => [
-            'name'      => '积分名称',
-            'type'      => 'int(11)',
-            'value'     => 'place_score/info',
-        ],
-
-        'name' => [
-            'name'      => '充值名称',
-            'type'      => 'varchar(32)',
-        ],
-
-        'value'        => [
-            'name'      => '充值金额',
-            'type'      => 'decimal(11,2)',
-        ],
-
-        'price'        => [
-            'name'      => '支付金额',
-            'type'      => 'decimal(11,2)',
-        ],
-
-        'sort' => [
-            'name'      => '排序',
-            'type'      => 'int(11)',
-            'default'   => 1,
-        ],
-
-        'status' => [
-            'name'      => '状态',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '正常',
-                2 => '封禁',
-            ],
-        ],
-    ],
+<?php
+return [
+    'name' => '持有权',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'day' => [
+            'name'      => '有效期',
+            'type'      => 'int(11)',
+            'default'   => '365',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
 ];

+ 96 - 0
src/place/benefit/table/perk.php

@@ -0,0 +1,96 @@
+<?php
+return [
+    'name' => '权益包',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '权益包名称',
+            'type'      => 'varchar(32)',
+        ],
+        'desc' => [
+            'name'      => '权益包介绍',
+            'type'      => 'varchar(500)',
+        ],
+        'give' => [
+            'name'      => '是否可赠送',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '是',
+                2 => '否',
+            ],
+        ],
+        'total' => [
+            'name'      => '总数量',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'received' => [
+            'name'      => '兑换数量',
+            'type'      => 'int(11)',
+        ],
+        'limit' => [
+            'name'      => '每人限额',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+        'date_type' => [
+            'name'      => '有效期类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '领取后生效',
+                2 => '固定时间',
+            ],
+        ],
+        'date_start' => [
+            'name'      => '开始时间',
+            'type'      => 'int(11)',
+        ],
+        'date_end' => [
+            'name'      => '结束时间',
+            'type'      => 'int(11)',
+        ],
+        'date_day' => [
+            'name'      => '有效天数',
+            'type'      => 'int(11)',
+            'default'   => '365',
+        ],
+        'code_type' => [
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '全数字',
+                2 => '全小写字符',
+                3 => '全大写字符',
+                4 => '大小写字符',
+                5 => '数字+大小写字符',
+            ],
+        ],
+        'code_prefix'       => [
+            'name'      => '前缀',
+            'type'      => 'varchar(50)',
+        ],
+        'code_length' => [
+            'name'      => '长度',
+            'type'      => 'int(11)',
+            'default'   => '15',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 54 - 38
src/place/source/table/coupon_code.php → src/place/benefit/table/perk_code.php

@@ -1,39 +1,55 @@
-<?php
-return [
-    'name' => '优惠券券码表',
-    'partition' => 'Dever::call("manage/common.system")',
-    'struct' => [
-        'coupon_id'       => [
-            'type'      => 'int(11)',
-            'name'      => '优惠券',
-            'value'     => 'place_source/coupon',
-        ],
-        'code'       => [
-            'name'      => '券码',
-            'type'      => 'varchar(50)',
-        ],
-        'total' => [
-            'name'      => '总兑换次数',
-            'type'      => 'int(11)',
-            'default'   => '0',
-        ],
-        'used' => [
-            'name'      => '已兑换次数',
-            'type'      => 'int(11)',
-            'default'   => '0',
-        ],
-        'status' => [
-            'name'      => '状态',
-            'type'      => 'tinyint(1)',
-            'default'   => 1,
-            'value'     => [
-                1 => '生效',
-                2 => '失效',
-            ],
-        ],
-    ],
-
-    'index' => [
-        'search' => 'coupon_id,code',
-    ],
+<?php
+return [
+    'name' => '权益包兑换码表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => [
+        'perk_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '权益包',
+            'value'     => 'place_benefit/perk',
+        ],
+        'code'       => [
+            'name'      => '兑换码',
+            'type'      => 'varchar(50)',
+        ],
+        'utype' => [
+            'name'      => '创建人类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                -1 => '系统',
+                1 => '用户',
+                2 => '后台',
+            ],
+        ],
+
+        'uid'       => [
+            'type'      => 'int(11)',
+            'name'      => '创建人',
+            'default'   => 1,
+        ],
+        'total' => [
+            'name'      => '总兑换次数',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'used' => [
+            'name'      => '已兑换次数',
+            'type'      => 'int(11)',
+            'default'   => '0',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+    ],
+
+    'index' => [
+        'search' => 'perk_id,code',
+    ],
 ];

+ 43 - 0
src/place/benefit/table/perk_code_item.php

@@ -0,0 +1,43 @@
+<?php
+return [
+    'name' => '权益包包含项目',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => [
+        'perk_code_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '兑换码',
+        ],
+        'type'        => [
+            'name'      => '类型',
+            'type'      => 'varchar(15)',
+            'default'   => 'select',
+            'value'    => 'Dever::call("place_benefit/item.getType", 3)',
+        ],
+
+        'type_id'        => [
+            'name'      => '项目',
+            'type'      => 'int(11)',
+        ],
+        'total'        => [
+            'name'      => '总数',
+            'type'      => 'decimal(11,2)',
+            'default'   => '1',
+        ],
+        'received'        => [
+            'name'      => '领取数量',
+            'type'      => 'decimal(11,2)',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+    ],
+    'index' => [
+        'search' => 'perk_code_id',
+    ],
+];

+ 21 - 0
src/place/benefit/table/perk_create_code.php

@@ -0,0 +1,21 @@
+<?php
+return [
+    'name' => '权益包兑换码生成表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'struct' => [
+        'perk_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '权益包',
+        ],
+        'num' => [
+            'name'      => '数量',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+        'total' => [
+            'name'      => '总使用次数',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 36 - 0
src/place/benefit/table/perk_voucher.php

@@ -0,0 +1,36 @@
+<?php
+return [
+    'name' => '权益包权益',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id asc',
+    'struct' => [
+        'perk_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '权益包',
+        ],
+        'type'        => [
+            'name'      => '类型',
+            'type'      => 'varchar(15)',
+            'default'   => 'select',
+            'value'    => 'Dever::call("place_benefit/item.getType", 3)',
+        ],
+
+        'type_id'        => [
+            'name'      => '项目',
+            'type'      => 'int(11)',
+        ],
+        'num'        => [
+            'name'      => '数量',
+            'type'      => 'decimal(11,2)',
+            'default'   => '1',
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+    ],
+    'index' => [
+        'search' => 'perk_id',
+    ],
+];

+ 49 - 0
src/place/benefit/table/promotion.php

@@ -0,0 +1,49 @@
+<?php
+return [
+    'name' => '促销表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '促销名称',
+            'type'      => 'varchar(32)',
+        ],
+        'tag' => [
+            'name'      => '标签展示',
+            'type'      => 'tinyint(1)',
+            'default'   => 2,
+            'value'     => [
+                1 => '展示',
+                2 => '不展示',
+            ],
+        ],
+        'type' => [
+            'name'      => '类型',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '折扣',
+                2 => '百分比',
+                3 => '活动价',
+            ],
+        ],
+        'value' => [
+            'name'      => '数值',
+            'type'      => 'decimal(11,2)',
+        ],
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 27 - 0
src/place/benefit/table/rebate.php

@@ -0,0 +1,27 @@
+<?php
+return [
+    'name' => '返利表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id desc',
+    'struct' => [
+        'name' => [
+            'name'      => '返利名称',
+            'type'      => 'varchar(32)',
+        ],
+
+        'status' => [
+            'name'      => '状态',
+            'type'      => 'tinyint(1)',
+            'default'   => 1,
+            'value'     => [
+                1 => '生效',
+                2 => '失效',
+            ],
+        ],
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => '1',
+        ],
+    ],
+];

+ 36 - 0
src/place/benefit/table/rebate_rule.php

@@ -0,0 +1,36 @@
+<?php
+return [
+    'name' => '返利规则设置表',
+    'partition' => 'Dever::call("manage/common.system")',
+    'order' => 'sort asc,id asc',
+    'struct' => [
+        'rebate_id'       => [
+            'type'      => 'int(11)',
+            'name'      => '返利id',
+        ],
+        'score_id'        => [
+            'name'      => '奖励积分',
+            'type'      => 'int(11)',
+            'value'     => 'place_score/info',
+        ],
+        'level'       => [
+            'name'      => '奖励层级',
+            'type'      => 'int(11)',
+        ],
+        'value' => [
+            'name'      => '奖励数值',
+            'type'      => 'varchar(20)',
+        ],
+        //level == 1 && level_num <= 30
+        'condition' => [
+            'name'      => '限制条件',
+            'type'      => 'varchar(500)',
+        ],
+
+        'sort' => [
+            'name'      => '排序',
+            'type'      => 'int(11)',
+            'default'   => 1,
+        ],
+    ],
+];

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません