Kirin 3 år sedan
förälder
incheckning
d9041d6fe1

+ 2 - 0
app/admin/controller/user/UserLevel.php

@@ -39,6 +39,7 @@ class UserLevel extends AuthController
         $field[] = Form::number('valid_date', '有效时间(天)', isset($vipinfo) ? $vipinfo->valid_date : 0)->min(0)->col(8);
         $field[] = Form::number('valid_date', '有效时间(天)', isset($vipinfo) ? $vipinfo->valid_date : 0)->min(0)->col(8);
         $field[] = Form::number('grade', '等级', isset($vipinfo) ? $vipinfo->grade : 0)->min(0)->col(8);
         $field[] = Form::number('grade', '等级', isset($vipinfo) ? $vipinfo->grade : 0)->min(0)->col(8);
         $field[] = Form::number('discount', '享受折扣', isset($vipinfo) ? $vipinfo->discount : 0)->min(0)->col(8);
         $field[] = Form::number('discount', '享受折扣', isset($vipinfo) ? $vipinfo->discount : 0)->min(0)->col(8);
+        $field[] = Form::number('group_point_award', '团队积分奖', isset($vipinfo) ? $vipinfo->group_point_award : 0)->min(0)->col(8);
         $field[] = Form::frameImageOne('icon', '图标', Url::buildUrl('admin/widget.images/index', array('fodder' => 'icon')), isset($vipinfo) ? $vipinfo->icon : '')->icon('image')->width('100%')->height('500px');
         $field[] = Form::frameImageOne('icon', '图标', Url::buildUrl('admin/widget.images/index', array('fodder' => 'icon')), isset($vipinfo) ? $vipinfo->icon : '')->icon('image')->width('100%')->height('500px');
         $field[] = Form::frameImageOne('image', '会员背景', Url::buildUrl('admin/widget.images/index', array('fodder' => 'image')), isset($vipinfo) ? $vipinfo->image : '')->icon('image')->width('100%')->height('500px');
         $field[] = Form::frameImageOne('image', '会员背景', Url::buildUrl('admin/widget.images/index', array('fodder' => 'image')), isset($vipinfo) ? $vipinfo->image : '')->icon('image')->width('100%')->height('500px');
         $field[] = Form::radio('is_show', '是否显示', isset($vipinfo) ? $vipinfo->is_show : 0)->options([['label' => '显示', 'value' => 1], ['label' => '隐藏', 'value' => 0]])->col(8);
         $field[] = Form::radio('is_show', '是否显示', isset($vipinfo) ? $vipinfo->is_show : 0)->options([['label' => '显示', 'value' => 1], ['label' => '隐藏', 'value' => 0]])->col(8);
@@ -63,6 +64,7 @@ class UserLevel extends AuthController
             ['valid_date', 0],
             ['valid_date', 0],
             ['grade', 0],
             ['grade', 0],
             ['discount', 0],
             ['discount', 0],
+            ['group_point_award', 0],
             ['icon', ''],
             ['icon', ''],
             ['image', ''],
             ['image', ''],
             ['is_show', ''],
             ['is_show', ''],

+ 65 - 50
app/admin/view/user/user_level/index.php

@@ -1,7 +1,7 @@
 {extend name="public/container"}
 {extend name="public/container"}
 {block name="content"}
 {block name="content"}
 <div class="layui-fluid">
 <div class="layui-fluid">
-    <div class="layui-row layui-col-space15"  id="app">
+    <div class="layui-row layui-col-space15" id="app">
         <div class="layui-col-md12">
         <div class="layui-col-md12">
             <div class="layui-card">
             <div class="layui-card">
                 <div class="layui-card-header">搜索条件</div>
                 <div class="layui-card-header">搜索条件</div>
@@ -26,8 +26,10 @@
                             </div>
                             </div>
                             <div class="layui-inline">
                             <div class="layui-inline">
                                 <div class="layui-input-inline">
                                 <div class="layui-input-inline">
-                                    <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit="search" lay-filter="search">
+                                    <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit="search"
-                                        <i class="layui-icon layui-icon-search"></i>搜索</button>
+                                            lay-filter="search">
+                                        <i class="layui-icon layui-icon-search"></i>搜索
+                                    </button>
                                 </div>
                                 </div>
                             </div>
                             </div>
                         </div>
                         </div>
@@ -41,36 +43,44 @@
                 <div class="layui-card-header">等级列表</div>
                 <div class="layui-card-header">等级列表</div>
                 <div class="layui-card-body">
                 <div class="layui-card-body">
                     <div class="layui-btn-container">
                     <div class="layui-btn-container">
-                        <button class="layui-btn layui-btn-sm" onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}')">添加会员等级</button>
+                        <button class="layui-btn layui-btn-sm"
+                                onclick="$eb.createModalFrame(this.innerText,'{:Url('create')}')">添加会员等级
+                        </button>
                     </div>
                     </div>
                     <table class="layui-hide" id="List" lay-filter="List"></table>
                     <table class="layui-hide" id="List" lay-filter="List"></table>
                     <script type="text/html" id="icon">
                     <script type="text/html" id="icon">
                         <img style="cursor: pointer;max-width: 50px;" lay-event='open_image' src="{{d.icon}}">
                         <img style="cursor: pointer;max-width: 50px;" lay-event='open_image' src="{{d.icon}}">
                     </script>
                     </script>
                     <script type="text/html" id="is_forever">
                     <script type="text/html" id="is_forever">
-                        <input type='checkbox' name='id' disabled lay-skin='switch' value="{{d.id}}" lay-filter='is_forever' lay-text='永久|非永久'  {{ d.is_forever == 1 ? 'checked' : '' }}>
+                        <input type='checkbox' name='id' disabled lay-skin='switch' value="{{d.id}}"
+                               lay-filter='is_forever' lay-text='永久|非永久' {{ d.is_forever== 1 ? 'checked' : '' }}>
                     </script>
                     </script>
                     <script type="text/html" id="is_show">
                     <script type="text/html" id="is_show">
-                        <input type='checkbox' name='id' lay-skin='switch' value="{{d.id}}" lay-filter='is_show' lay-text='开启|关闭'  {{ d.is_show == 1 ? 'checked' : '' }}>
+                        <input type='checkbox' name='id' lay-skin='switch' value="{{d.id}}" lay-filter='is_show'
+                               lay-text='开启|关闭' {{ d.is_show== 1 ? 'checked' : '' }}>
                     </script>
                     </script>
                     <script type="text/html" id="is_pay">
                     <script type="text/html" id="is_pay">
-                        <input type='checkbox' name='id' disabled lay-skin='switch' value="{{d.id}}" lay-filter='is_pay' lay-text='付费|免费'  {{ d.is_pay == 1 ? 'checked' : '' }}>
+                        <input type='checkbox' name='id' disabled lay-skin='switch' value="{{d.id}}" lay-filter='is_pay'
+                               lay-text='付费|免费' {{ d.is_pay== 1 ? 'checked' : '' }}>
                     </script>
                     </script>
                     <script type="text/html" id="act">
                     <script type="text/html" id="act">
-                        <button type="button" class="layui-btn layui-btn-xs" onclick="dropdown(this)">操作 <span class="caret"></span></button>
+                        <button type="button" class="layui-btn layui-btn-xs" onclick="dropdown(this)">操作 <span
+                                    class="caret"></span></button>
                         <ul class="layui-nav-child layui-anim layui-anim-upbit">
                         <ul class="layui-nav-child layui-anim layui-anim-upbit">
                             <li>
                             <li>
-                                <a href="javascript:void(0)" onclick="$eb.createModalFrame(this.innerText,'{:Url(\'tash\')}?level_id={{d.id}}',{w:1000})">
+                                <a href="javascript:void(0)"
+                                   onclick="$eb.createModalFrame(this.innerText,'{:Url(\'tash\')}?level_id={{d.id}}',{w:1000})">
                                     <i class="fa fa-wrench"></i> 等级任务
                                     <i class="fa fa-wrench"></i> 等级任务
                                 </a>
                                 </a>
                             </li>
                             </li>
                             <li>
                             <li>
-                                <a href="javascript:void(0)" onclick="$eb.createModalFrame(this.innerText,'{:Url(\'create\')}?id={{d.id}}')">
+                                <a href="javascript:void(0)"
+                                   onclick="$eb.createModalFrame(this.innerText,'{:Url(\'create\')}?id={{d.id}}')">
                                     <i class="fa fa-edit"></i> 编辑等级
                                     <i class="fa fa-edit"></i> 编辑等级
                                 </a>
                                 </a>
                             </li>
                             </li>
                             <li>
                             <li>
-                                <a lay-event='delete' href="javascript:void(0)" >
+                                <a lay-event='delete' href="javascript:void(0)">
                                     <i class="fa fa-times"></i> 删除等级
                                     <i class="fa fa-times"></i> 删除等级
                                 </a>
                                 </a>
                             </li>
                             </li>
@@ -88,22 +98,23 @@
     //实例化form
     //实例化form
     layList.form.render();
     layList.form.render();
     //加载列表
     //加载列表
-    layList.tableList('List',"{:Url('get_system_vip_list')}",function (){
+    layList.tableList('List', "{:Url('get_system_vip_list')}", function () {
         return [
         return [
-            {field: 'id', title: '编号', sort: true,event:'id',width:'6%',align:"center"},
+            {field: 'id', title: '编号', sort: true, event: 'id', width: '6%', align: "center"},
-            {field: 'icon', title: '等级图标',templet:'#icon',align:"center",width:'10%'},
+            {field: 'icon', title: '等级图标', templet: '#icon', align: "center", width: '10%'},
-            {field: 'name', title: '等级名称',edit:'name',width:'6%',align:"center"},
+            {field: 'name', title: '等级名称', edit: 'name', width: '6%', align: "center"},
-            {field: 'grade', title: '等级',edit:'grade',width:'6%',align:"center"},
+            {field: 'grade', title: '等级', edit: 'grade', width: '6%', align: "center"},
-            {field: 'discount', title: '享受折扣',edit:'discount',width:'8%',align:"center"},
+            {field: 'discount', title: '享受折扣', edit: 'discount', width: '8%', align: "center"},
-            {field: 'valid_date', title: '有效时间',width:'12%',align:"center"},
+            {field: 'group_point_award', title: '团队积分奖(%)', edit: 'group_point_award', width: '8%', align: "center"},
-            {field: 'is_forever', title: '是否永久',templet:'#is_forever',width:'8%',align:"center"},
+            {field: 'valid_date', title: '有效时间', width: '12%', align: "center"},
-            {field: 'is_show', title: '是否使用',templet:'#is_show',width:'8%',align:"center"},
+            {field: 'is_forever', title: '是否永久', templet: '#is_forever', width: '8%', align: "center"},
-            {field: 'explain', title: '等级说明',align:"center"},
+            {field: 'is_show', title: '是否使用', templet: '#is_show', width: '8%', align: "center"},
-            {field: 'right', title: '操作',align:'center',toolbar:'#act',width:'8%'},
+            {field: 'explain', title: '等级说明', align: "center"},
+            {field: 'right', title: '操作', align: 'center', toolbar: '#act', width: '8%'},
         ];
         ];
     });
     });
     //自定义方法
     //自定义方法
-    var action= {
+    var action = {
         set_value: function (field, id, value) {
         set_value: function (field, id, value) {
             layList.baseGet(layList.Url({
             layList.baseGet(layList.Url({
                 a: 'set_value',
                 a: 'set_value',
@@ -114,51 +125,54 @@
         },
         },
     }
     }
     //查询
     //查询
-    layList.search('search',function(where){
+    layList.search('search', function (where) {
-        layList.reload(where,true);
+        layList.reload(where, true);
     });
     });
-    layList.switch('is_show',function (odj,value) {
+    layList.switch('is_show', function (odj, value) {
-        if(odj.elem.checked==true){
+        if (odj.elem.checked == true) {
-            layList.baseGet(layList.Url({a:'set_show',p:{is_show:1,id:value}}),function (res) {
+            layList.baseGet(layList.Url({a: 'set_show', p: {is_show: 1, id: value}}), function (res) {
                 layList.msg(res.msg);
                 layList.msg(res.msg);
             });
             });
-        }else{
+        } else {
-            layList.baseGet(layList.Url({a:'set_show',p:{is_show:0,id:value}}),function (res) {
+            layList.baseGet(layList.Url({a: 'set_show', p: {is_show: 0, id: value}}), function (res) {
                 layList.msg(res.msg);
                 layList.msg(res.msg);
             });
             });
         }
         }
     });
     });
     //快速编辑
     //快速编辑
     layList.edit(function (obj) {
     layList.edit(function (obj) {
-        var id=obj.data.id,value=obj.value;
+        var id = obj.data.id, value = obj.value;
         switch (obj.field) {
         switch (obj.field) {
             case 'name':
             case 'name':
-                action.set_value('name',id,value);
+                action.set_value('name', id, value);
                 break;
                 break;
             case 'grade':
             case 'grade':
-                action.set_value('grade',id,value);
+                action.set_value('grade', id, value);
                 break;
                 break;
             case 'discount':
             case 'discount':
-                action.set_value('discount',id,value);
+                action.set_value('discount', id, value);
+                break;
+            case 'group_point_award':
+                action.set_value('group_point_award', id, value);
                 break;
                 break;
         }
         }
     });
     });
     //监听并执行排序
     //监听并执行排序
-    layList.sort(['id','sort'],true);
+    layList.sort(['id', 'sort'], true);
     //点击事件绑定
     //点击事件绑定
-    layList.tool(function (event,data,obj) {
+    layList.tool(function (event, data, obj) {
         switch (event) {
         switch (event) {
             case 'delete':
             case 'delete':
-                var url=layList.U({a:'delete',q:{id:data.id}});
+                var url = layList.U({a: 'delete', q: {id: data.id}});
-                $eb.$swal('delete',function(){
+                $eb.$swal('delete', function () {
-                    $eb.axios.get(url).then(function(res){
+                    $eb.axios.get(url).then(function (res) {
-                        if(res.status == 200 && res.data.code == 200) {
+                        if (res.status == 200 && res.data.code == 200) {
-                            $eb.$swal('success',res.data.msg);
+                            $eb.$swal('success', res.data.msg);
                             obj.del();
                             obj.del();
-                        }else
+                        } else
                             return Promise.reject(res.data.msg || '删除失败')
                             return Promise.reject(res.data.msg || '删除失败')
-                    }).catch(function(err){
+                    }).catch(function (err) {
-                        $eb.$swal('error',err);
+                        $eb.$swal('error', err);
                     });
                     });
                 })
                 })
                 break;
                 break;
@@ -171,28 +185,29 @@
     $(document).click(function (e) {
     $(document).click(function (e) {
         $('.layui-nav-child').hide();
         $('.layui-nav-child').hide();
     })
     })
-    function dropdown(that){
+
+    function dropdown(that) {
         var oEvent = arguments.callee.caller.arguments[0] || event;
         var oEvent = arguments.callee.caller.arguments[0] || event;
         oEvent.stopPropagation();
         oEvent.stopPropagation();
         var offset = $(that).offset();
         var offset = $(that).offset();
-        var top=offset.top-$(window).scrollTop();
+        var top = offset.top - $(window).scrollTop();
         var index = $(that).parents('tr').data('index');
         var index = $(that).parents('tr').data('index');
         $('.layui-nav-child').each(function (key) {
         $('.layui-nav-child').each(function (key) {
             if (key != index) {
             if (key != index) {
                 $(this).hide();
                 $(this).hide();
             }
             }
         })
         })
-        if($(document).height() < top+$(that).next('ul').height()){
+        if ($(document).height() < top + $(that).next('ul').height()) {
             $(that).next('ul').css({
             $(that).next('ul').css({
                 'padding': 10,
                 'padding': 10,
-                'top': - ($(that).parent('td').height() / 2 + $(that).height() + $(that).next('ul').height()/2),
+                'top': -($(that).parent('td').height() / 2 + $(that).height() + $(that).next('ul').height() / 2),
                 'min-width': 'inherit',
                 'min-width': 'inherit',
                 'position': 'absolute'
                 'position': 'absolute'
             }).toggle();
             }).toggle();
-        }else{
+        } else {
             $(that).next('ul').css({
             $(that).next('ul').css({
                 'padding': 10,
                 'padding': 10,
-                'top':$(that).parent('td').height() / 2 + $(that).height(),
+                'top': $(that).parent('td').height() / 2 + $(that).height(),
                 'min-width': 'inherit',
                 'min-width': 'inherit',
                 'position': 'absolute'
                 'position': 'absolute'
             }).toggle();
             }).toggle();

+ 22 - 0
app/api/controller/user/UserController.php

@@ -611,4 +611,26 @@ class UserController
         $puid = $request->post('puid/d', 0);
         $puid = $request->post('puid/d', 0);
         return app('json')->success(User::setSpread($puid, $request->uid()));
         return app('json')->success(User::setSpread($puid, $request->uid()));
     }
     }
+
+    public function tradeIntegral(Request $request)
+    {
+        $user = $request->user();
+        $uid = $user['uid'];
+        list($num, $to_user_account) = UtilService::postMore(
+            [
+                ['num', 0],
+                ['to_user_account', ''],
+            ], $request, true);
+        if (!$num || !$to_user_account) {
+            return app('json')->fail('参数不足');
+        }
+        $to_uid = User::where('account', $to_user_account)->value('uid');
+        if (!$to_uid) return app('json')->fail('目标用户不存在');
+        $res = User::tradeIntegral($uid, $to_uid, $num);
+        if ($res) {
+            return app('json')->success('支付成功');
+        } else {
+            return app('json')->fail('支付失败:' . User::getErrorInfo('支付错误'));
+        }
+    }
 }
 }

+ 31 - 1
app/models/store/StoreOrder.php

@@ -881,7 +881,7 @@ class StoreOrder extends BaseModel
             $userInfo = User::getUserInfo($order['uid']);
             $userInfo = User::getUserInfo($order['uid']);
 //            $res1 = false != User::where('uid', $userInfo['uid'])->update(['integral' => bcadd($userInfo['integral'], $order['gain_integral'], 2)]);
 //            $res1 = false != User::where('uid', $userInfo['uid'])->update(['integral' => bcadd($userInfo['integral'], $order['gain_integral'], 2)]);
             $res2 = false != UserBill::income('购买商品赠送积分', $order['uid'], 'integral', 'gain', $order['gain_integral'], $order['id'], $userInfo['integral'], '购买商品赠送' . floatval($order['gain_integral']) . '积分', 0);
             $res2 = false != UserBill::income('购买商品赠送积分', $order['uid'], 'integral', 'gain', $order['gain_integral'], $order['id'], $userInfo['integral'], '购买商品赠送' . floatval($order['gain_integral']) . '积分', 0);
-            $res = $res2 && self::spreadIntegral($order);
+            $res = $res2 && self::spreadIntegral($order) && self::groupIntegral($order);
             return $res;
             return $res;
         }
         }
         return true;
         return true;
@@ -902,6 +902,36 @@ class StoreOrder extends BaseModel
         return true;
         return true;
     }
     }
 
 
+    /**
+     * @param $order
+     * @return bool``
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function groupIntegral($order): bool
+    {
+
+        $userInfo = User::getUserInfo($order['uid']);
+        $spread = User::getUserInfo($userInfo['spread_uid']);
+        $send = 0;
+        $res = true;
+
+        while ($spread) {
+            $level = UserLevel::getUserLevelInfo(UserLevel::getUserLevel($spread['uid']));
+            if ($level) {
+                $integral = bcmul($order['gain_integral'], bcdiv($level['group_point_award'], 100, 4), 2);
+                if ($integral > $send) {
+                    $real_send = $integral - $send;
+                    $res = false != UserBill::income('团队用户购买商品赠送积分', $spread['uid'], 'integral', 'group_gain', $real_send, $order['id'], $spread['integral'], '团队用户购买商品赠送' . floatval($real_send) . '积分', 0);
+                    $send = $integral;
+                }
+            }
+            $spread = User::getUserInfo($spread['spread_uid']);
+        }
+        return $res;
+    }
+
     public static function areaAward($order)
     public static function areaAward($order)
     {
     {
         if (isset($order['combination_id']) && $order['combination_id']) return true;
         if (isset($order['combination_id']) && $order['combination_id']) return true;

+ 25 - 0
app/models/user/User.php

@@ -763,4 +763,29 @@ class User extends BaseModel
         }
         }
         return $model->where('brokerage_price', '>', $brokerage_price)->count('uid');
         return $model->where('brokerage_price', '>', $brokerage_price)->count('uid');
     }
     }
+
+    public static function tradeIntegral($uid, $to_uid, $num)
+    {
+        if ($uid == $to_uid) return self::setErrorInfo('不可以转账给自己');
+        $user = self::get($uid);
+        $to_user = self::get($to_uid);
+        if ($user['integral'] < $num) return self::setErrorInfo('积分不足');
+        BaseModel::beginTrans();
+        try {
+            $res1 = self::bcDec($uid, 'integral', $num, 'uid')
+                && UserBill::expend('积分转出', $uid, 'integral', 'trade_out', $num, 0, $user['integral'] - $num, '积分转出' . $num);
+            $res2 = self::bcInc($to_uid, 'integral', $num, 'uid')
+                && UserBill::income('积分转入', $to_uid, 'integral', 'trade_in', $num, 0, $to_user['integral'] + $num, '积分转入' . $num);
+            if ($res1 && $res2) {
+                BaseModel::commitTrans();
+                return true;
+            } else {
+                BaseModel::rollbackTrans();
+                return self::setErrorInfo('转账失败');
+            }
+        } catch (\Exception $e) {
+            BaseModel::rollbackTrans();
+            return self::setErrorInfo($e->getMessage());
+        }
+    }
 }
 }

+ 1 - 1
app/models/user/UserLevel.php

@@ -152,7 +152,7 @@ class UserLevel extends BaseModel
      */
      */
     public static function getUserLevelInfo($id, $keyName = '')
     public static function getUserLevelInfo($id, $keyName = '')
     {
     {
-        $vipinfo = self::valiWhere('a')->where('a.id', $id)->field('l.id,a.add_time,l.discount,a.level_id,l.name,l.money,l.icon,l.is_pay,l.grade')
+        $vipinfo = self::valiWhere('a')->where('a.id', $id)->field('l.id,a.add_time,l.discount,a.level_id,l.name,l.money,l.icon,l.is_pay,l.grade,l.group_point_award')
             ->join('system_user_level l', 'l.id=a.level_id')->find();
             ->join('system_user_level l', 'l.id=a.level_id')->find();
         if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
         if ($keyName) if (isset($vipinfo[$keyName])) return $vipinfo[$keyName]; else return '';
         return $vipinfo;
         return $vipinfo;

+ 1 - 0
route/api/route.php

@@ -56,6 +56,7 @@ Route::group(function () {
     Route::get('logout', 'AuthController/logout')->name('logout');// 退出登录
     Route::get('logout', 'AuthController/logout')->name('logout');// 退出登录
     Route::post('switch_h5', 'AuthController/switch_h5')->name('switch_h5');// 切换账号
     Route::post('switch_h5', 'AuthController/switch_h5')->name('switch_h5');// 切换账号
     Route::post('binding', 'AuthController/binding_phone')->name('bindingPhone');// 绑定手机号
     Route::post('binding', 'AuthController/binding_phone')->name('bindingPhone');// 绑定手机号
+    Route::post('trade', 'user.UserController/tradeIntegral')->name('tradeIntegral');// 积分转帐
     //产品类
     //产品类
     Route::get('product/code/:id', 'store.StoreProductController/code')->name('productCode');//产品分享二维码 推广员
     Route::get('product/code/:id', 'store.StoreProductController/code')->name('productCode');//产品分享二维码 推广员
     Route::post('product/poster', 'store.StoreProductController/poster')->name('productPost');//产品分享海报
     Route::post('product/poster', 'store.StoreProductController/poster')->name('productPost');//产品分享海报