Kirin há 4 anos atrás
pai
commit
90d89a6c67

+ 1 - 0
app/admin/controller/finance/Finance.php

@@ -139,6 +139,7 @@ class Finance extends AuthController
     {
         $where = $where = UtilService::getMore([
             ['money_type', ''],
+            ['trade_uid', ''],
             ['page', 1],
             ['limit', 10],
             ['status', ''],

+ 3 - 0
app/admin/controller/user/User.php

@@ -360,6 +360,7 @@ class User extends AuthController
         $f[] = Form::textarea('mark', '用户备注', $user->getData('mark'));
 
 //        $f[] = Form::radio('is_promoter', '推广员', $user->getData('is_promoter'))->options([['value' => 1, 'label' => '开启'], ['value' => 0, 'label' => '关闭']]);
+        $f[] = Form::radio('sale_switch', '允许卖币', $user->getData('sale_switch'))->options([['value' => 1, 'label' => '是'], ['value' => 0, 'label' => '否']]);
         $f[] = Form::radio('status', '状态', $user->getData('status'))->options([['value' => 1, 'label' => '开启'], ['value' => 0, 'label' => '锁定']]);
         $form = Form::make_post_form('添加用户通知', $f, Url::buildUrl('update', array('uid' => $uid)), 5);
         $this->assign(compact('form'));
@@ -381,6 +382,7 @@ class User extends AuthController
             ['integration_status', 0],
             ['integration', 0],
             ['status', 0],
+            ['sale_switch', 0],
         ]);
         if (!$uid) return $this->failed('数据不存在');
         $user = UserModel::get($uid);
@@ -442,6 +444,7 @@ class User extends AuthController
         $edit['birthday'] = strtotime($data['birthday']);
         $edit['mark'] = $data['mark'];
         $edit['is_promoter'] = $data['is_promoter'];
+        $edit['sale_switch'] = $data['sale_switch'];
         if ($data['return_uper'] != $user['return_uper']) {
             if ($user['spread_uid']) {
                 $uper = UserModel::where('uid', $user['spread_uid'])->value('return_uper') ?: 0;

+ 50 - 2
app/admin/view/finance/finance/cash_trade.php

@@ -5,6 +5,44 @@
 {block name="content"}
 <div class="layui-fluid" style="background: #fff;margin-top: -10px;">
     <div class="layui-row layui-col-space15">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-header">搜索条件</div>
+                <div class="layui-card-body">
+                    <form class="layui-form layui-form-pane" action="">
+                        <div class="layui-form-item">
+                            <div class="layui-inline">
+                                <label class="layui-form-label">交易人</label>
+                                <div class="layui-input-block">
+                                    <input type="text" name="trade_uid" class="layui-input">
+                                </div>
+                            </div>
+                            <div class="layui-inline">
+                                <label class="layui-form-label">状态</label>
+                                <div class="layui-input-block">
+                                    <select name="status">
+                                        <option value="">全部</option>
+                                        <option value="-1">未支付</option>
+                                        <option value="0">未完成</option>
+                                        <option value="1">已完成</option>
+                                        <option value="2">已收回</option>
+                                        <option value="3">交易中【‘已提交交易凭证’】</option>
+                                    </select>
+                                </div>
+                            </div>
+                            <div class="layui-inline">
+                                <div class="layui-input-inline">
+                                    <button class="layui-btn layui-btn-sm layui-btn-normal" lay-submit="search"
+                                            lay-filter="search">
+                                        <i class="layui-icon layui-icon-search"></i>搜索
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
         <div class="layui-col-md12">
             <div class="layui-card">
                 <div class="layui-card-header">交易列表</div>
@@ -20,6 +58,11 @@
                         结束时间:<p>{{d._end_time}}</p>
                         交易时间:<p>{{d._trade_time}}</p>
                     </script>
+                    <script type="text/html" id="bank">
+                        {{d._name_text}}:<p>{{d._name}}</p>
+                        {{d._account_text}}:<p>{{d._account}}</p>
+                        {{d._code_text}}:<p>{{d._code}}</p>
+                    </script>
                     <script type="text/html" id="proof">
                         <p lay-event="open_image">
                             {{# if(d.proof){ }}
@@ -63,15 +106,17 @@
 {/block}
 {block name="script"}
 <script>
+    layList.form.render();
     layList.tableList('List', "{:Url('cashTradeList')}", function () {
         return [
             {field: 'id', title: 'ID', width: '5%'},
-            {field: '_user', title: '交易发起人', width: '20%'},
+            {field: '_user', title: '交易发起人'},
             {field: '_trade_user', title: '交易参与人'},
             {field: '_trade_type', title: '挂出类型'},
             {field: 'money_num', title: '币额', width: '10%'},
             {field: 'money_type', title: '币种', width: '10%'},
             {field: '_status', title: '状态', width: '10%'},
+            {field: 'bank', title: '收款方式', toolbar: '#bank', width: '10%'},
             {field: 'time', title: '时间', toolbar: '#time', width: '10%'},
             {
                 field: 'proof',
@@ -160,6 +205,9 @@
                 }, code)
                 break;
         }
-    })
+    });
+    layList.search('search', function (where) {
+        layList.reload(where, true);
+    });
 </script>
 {/block}

+ 176 - 140
app/admin/view/finance/user_extract/index.php

@@ -15,94 +15,113 @@
                             <div class="search-item" data-name="date">
                                 <span>选择时间:</span>
                                 <button type="button" class="btn btn-outline btn-link" data-value="">全部</button>
-                                <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.today}">今天</button>
-                                <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.week}">本周</button>
-                                <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.month}">本月</button>
-                                <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.quarter}">本季度</button>
-                                <button type="button" class="btn btn-outline btn-link" data-value="{$limitTimeList.year}">本年</button>
+                                <button type="button" class="btn btn-outline btn-link"
+                                        data-value="{$limitTimeList.today}">今天
+                                </button>
+                                <button type="button" class="btn btn-outline btn-link"
+                                        data-value="{$limitTimeList.week}">本周
+                                </button>
+                                <button type="button" class="btn btn-outline btn-link"
+                                        data-value="{$limitTimeList.month}">本月
+                                </button>
+                                <button type="button" class="btn btn-outline btn-link"
+                                        data-value="{$limitTimeList.quarter}">本季度
+                                </button>
+                                <button type="button" class="btn btn-outline btn-link"
+                                        data-value="{$limitTimeList.year}">本年
+                                </button>
                                 <div class="datepicker" style="display: inline-block;">
-                                    <button type="button" class="btn btn-outline btn-link" data-value="{$where.date?:'no'}">自定义时间</button>
+                                    <button type="button" class="btn btn-outline btn-link"
+                                            data-value="{$where.date?:'no'}">自定义时间
+                                    </button>
                                 </div>
-                                <input class="search-item-value" type="hidden" name="date" value="{$where.date}" />
+                                <input class="search-item-value" type="hidden" name="date" value="{$where.date}"/>
                             </div>
                             <select name="status" aria-controls="editable" class="form-control input-sm">
                                 <option value="">提现状态</option>
-                                <option value="-1" {eq name="where.status" value="-1"}selected="selected"{/eq}>未通过</option>
-                                <option value="0" {eq name="where.status" value="0"}selected="selected"{/eq}>未处理</option>
-                                <option value="1" {eq name="where.status" value="1"}selected="selected"{/eq}>已通过</option>
+                                <option value="-1" {eq name="where.status" value="-1" }selected="selected" {
+                                /eq}>未通过</option>
+                                <option value="0" {eq name="where.status" value="0" }selected="selected" {
+                                /eq}>未处理</option>
+                                <option value="1" {eq name="where.status" value="1" }selected="selected" {
+                                /eq}>已通过</option>
                             </select>
-<!--                            <select name="extract_type"  class="form-control input-sm">-->
-<!--                                <option value="">提现方式</option>-->
-<!--                                <option value="alipay" {eq name="where.extract_type" value="alipay" }selected="selected"{/eq}>支付宝</option>-->
-<!--                                <option value="bank" {eq name="where.extract_type" value="bank"}selected="selected"{/eq}>银行卡</option>-->
-<!--                                <option value="weixin" {eq name="where.extract_type" value="weixin"}selected="selected"{/eq}>微信</option>-->
-<!--                            </select>-->
+                            <!--                            <select name="extract_type"  class="form-control input-sm">-->
+                            <!--                                <option value="">提现方式</option>-->
+                            <!--                                <option value="alipay" {eq name="where.extract_type" value="alipay" }selected="selected"{/eq}>支付宝</option>-->
+                            <!--                                <option value="bank" {eq name="where.extract_type" value="bank"}selected="selected"{/eq}>银行卡</option>-->
+                            <!--                                <option value="weixin" {eq name="where.extract_type" value="weixin"}selected="selected"{/eq}>微信</option>-->
+                            <!--                            </select>-->
                             <div class="input-group">
                                   <span class="input-group-btn">
-                                      <input type="text" name="nireid" value="{$where.nireid}" placeholder="昵称/地址" class="input-sm form-control" size="38"/>
+                                      <input type="text" name="nireid" value="{$where.nireid}" placeholder="昵称/地址"
+                                             class="input-sm form-control" size="38"/>
                                       <button type="submit" class="btn btn-sm btn-primary"> 搜索</button>
                                   </span>
                             </div>
                         </form>
                     </div>
-                    <div class="col-sm-3 ui-sortable">
-                        <div class="ibox float-e-margins">
-                            <div class="ibox-title">
-                                <span class="label label-success pull-right">¥</span>
-                                <h5>已提现金额</h5>
-                            </div>
-                            <div class="ibox-content">
-                                <h1 class="no-margins">{$data.priced}</h1>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="col-sm-3 ui-sortable">
-                        <div class="ibox float-e-margins">
-                            <div class="ibox-title">
-                                <span class="label label-danger pull-right">急</span>
-                                <h5>待提现金额</h5>
-                            </div>
-                            <div class="ibox-content">
-                                <h1 class="no-margins">{$data.price}</h1>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="col-sm-3 ui-sortable">
-                        <div class="ibox float-e-margins">
-                            <div class="ibox-title">
-                                <span class="label label-success pull-right">待</span>
-                                <h5>佣金总金额</h5>
-                            </div>
-                            <div class="ibox-content">
-                                <h1 class="no-margins">{$data.brokerage_count}</h1>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="col-sm-3 ui-sortable">
-                        <div class="ibox float-e-margins">
-                            <div class="ibox-title">
-                                <span class="label label-success pull-right">待</span>
-                                <h5>未提现金额</h5>
-                            </div>
-                            <div class="ibox-content">
-                                <h1 class="no-margins">{$data.brokerage_not}</h1>
-                            </div>
-                        </div>
-                    </div>
+                    <!--                    <div class="col-sm-3 ui-sortable">-->
+                    <!--                        <div class="ibox float-e-margins">-->
+                    <!--                            <div class="ibox-title">-->
+                    <!--                                <span class="label label-success pull-right">¥</span>-->
+                    <!--                                <h5>已提现金额</h5>-->
+                    <!--                            </div>-->
+                    <!--                            <div class="ibox-content">-->
+                    <!--                                <h1 class="no-margins">{$data.priced}</h1>-->
+                    <!--                            </div>-->
+                    <!--                        </div>-->
+                    <!--                    </div>-->
+                    <!--                    <div class="col-sm-3 ui-sortable">-->
+                    <!--                        <div class="ibox float-e-margins">-->
+                    <!--                            <div class="ibox-title">-->
+                    <!--                                <span class="label label-danger pull-right">急</span>-->
+                    <!--                                <h5>待提现金额</h5>-->
+                    <!--                            </div>-->
+                    <!--                            <div class="ibox-content">-->
+                    <!--                                <h1 class="no-margins">{$data.price}</h1>-->
+                    <!--                            </div>-->
+                    <!--                        </div>-->
+                    <!--                    </div>-->
+                    <!--                    <div class="col-sm-3 ui-sortable">-->
+                    <!--                        <div class="ibox float-e-margins">-->
+                    <!--                            <div class="ibox-title">-->
+                    <!--                                <span class="label label-success pull-right">待</span>-->
+                    <!--                                <h5>佣金总金额</h5>-->
+                    <!--                            </div>-->
+                    <!--                            <div class="ibox-content">-->
+                    <!--                                <h1 class="no-margins">{$data.brokerage_count}</h1>-->
+                    <!--                            </div>-->
+                    <!--                        </div>-->
+                    <!--                    </div>-->
+                    <!--                    <div class="col-sm-3 ui-sortable">-->
+                    <!--                        <div class="ibox float-e-margins">-->
+                    <!--                            <div class="ibox-title">-->
+                    <!--                                <span class="label label-success pull-right">待</span>-->
+                    <!--                                <h5>未提现金额</h5>-->
+                    <!--                            </div>-->
+                    <!--                            <div class="ibox-content">-->
+                    <!--                                <h1 class="no-margins">{$data.brokerage_not}</h1>-->
+                    <!--                            </div>-->
+                    <!--                        </div>-->
+                    <!--                    </div>-->
                 </div>
                 <div class="table-responsive">
                     <table class="table table-striped  table-bordered">
                         <thead>
-                            <tr>
-                                <th class="text-center">编号</th>
-                                <th class="text-center">用户信息</th>
-                                <th class="text-center">提币金额</th>
-                                <th class="text-center">提币地址</th>
-                                <th class="text-center">添加时间</th>
-                                <th class="text-center">备注</th>
-                                <th class="text-center">审核状态</th>
-<!--                                <th class="text-center">操作</th>-->
-                            </tr>
+                        <tr>
+                            <th class="text-center">编号</th>
+                            <th class="text-center">用户信息</th>
+                            <th class="text-center">提币金额</th>
+                            <th class="text-center">实际到账</th>
+                            <th class="text-center">手续费</th>
+                            <th class="text-center">提币地址</th>
+                            <th class="text-center">地址通道</th>
+                            <th class="text-center">添加时间</th>
+                            <th class="text-center">备注</th>
+                            <th class="text-center">审核状态</th>
+                            <!--                                <th class="text-center">操作</th>-->
+                        </tr>
                         </thead>
                         <tbody class="">
                         {volist name="list" id="vo"}
@@ -111,26 +130,35 @@
                                 {$vo.id}
                             </td>
                             <td class="text-center">
-                               用户昵称: {$vo.nickname}/用户id:{$vo.uid}
+                                用户昵称: {$vo.nickname}/用户id:{$vo.uid}
                             </td>
                             <td class="text-center" style="color: #00aa00;">
                                 {$vo.extract_price}{$vo.money_type}
                             </td>
+                            <td class="text-center" style="color: #00aa00;">
+                                {$vo.real_get}{$vo.money_type}
+                            </td>
+                            <td class="text-center" style="color: #00aa00;">
+                                {$vo.service}{$vo.service_type}
+                            </td>
                             <td class="text-left">
-<!--                                {if condition="$vo['extract_type'] eq 'bank'"}-->
-<!--                                姓名:{$vo.real_name}<br>-->
-<!--                                 银行卡号:{$vo.bank_code}-->
-<!--                                <br/>-->
-<!--                                 银行开户地址:{$vo.bank_address}-->
-<!--                                {elseif condition="$vo['extract_type'] eq 'weixin'"/}-->
-<!--                                昵称:{$vo.nickname}<br>-->
-<!--                                微信号:{$vo.wechat}-->
-<!--                                {else/}-->
-<!--                                姓名:{$vo.real_name}<br>-->
-<!--                                  支付宝号:{$vo.alipay_code}-->
-<!--                                {/if}-->
+                                <!--                                {if condition="$vo['extract_type'] eq 'bank'"}-->
+                                <!--                                姓名:{$vo.real_name}<br>-->
+                                <!--                                 银行卡号:{$vo.bank_code}-->
+                                <!--                                <br/>-->
+                                <!--                                 银行开户地址:{$vo.bank_address}-->
+                                <!--                                {elseif condition="$vo['extract_type'] eq 'weixin'"/}-->
+                                <!--                                昵称:{$vo.nickname}<br>-->
+                                <!--                                微信号:{$vo.wechat}-->
+                                <!--                                {else/}-->
+                                <!--                                姓名:{$vo.real_name}<br>-->
+                                <!--                                  支付宝号:{$vo.alipay_code}-->
+                                <!--                                {/if}-->
                                 {$vo.address}
                             </td>
+                            <td class="text-center">
+                                {$vo.way}
+                            </td>
                             <td class="text-center">
                                 {$vo.add_time|date='Y-m-d H:i:s'}
                             </td>
@@ -147,13 +175,18 @@
                                 未通过时间:{$vo.fail_time|date='Y-m-d H:i:s'}
                                 {else/}
                                 未提现<br/>
-                                <button data-url="{:url('fail',['id'=>$vo['id']])}" class="j-fail btn btn-danger btn-xs" type="button"><i class="fa fa-close"></i> 无效</button>
-                                <button data-url="{:url('succ',['id'=>$vo['id']])}" class="j-success btn btn-primary btn-xs" type="button"><i class="fa fa-check"></i> 通过</button>
+                                <button data-url="{:url('fail',['id'=>$vo['id']])}" class="j-fail btn btn-danger btn-xs"
+                                        type="button"><i class="fa fa-close"></i> 无效
+                                </button>
+                                <button data-url="{:url('succ',['id'=>$vo['id']])}"
+                                        class="j-success btn btn-primary btn-xs" type="button"><i
+                                            class="fa fa-check"></i> 通过
+                                </button>
                                 {/if}
                             </td>
-<!--                            <td class="text-center">-->
-<!--                                <button class="btn btn-info btn-xs" type="button"  onclick="$eb.createModalFrame('编辑','{:Url('edit',array('id'=>$vo['id']))}')"><i class="fa fa-edit"></i> 编辑</button>-->
-<!--                            </td>-->
+                            <!--                            <td class="text-center">-->
+                            <!--                                <button class="btn btn-info btn-xs" type="button"  onclick="$eb.createModalFrame('编辑','{:Url('edit',array('id'=>$vo['id']))}')"><i class="fa fa-edit"></i> 编辑</button>-->
+                            <!--                            </td>-->
                         </tr>
                         {/volist}
                         </tbody>
@@ -169,21 +202,23 @@
 <script>
     $(function init() {
         $('.search-item>.btn').on('click', function () {
-            var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'), form = p.parents();
+            var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'),
+                form = p.parents();
             form.find('input[name="' + name + '"]').val(value);
             $('input[name=export]').val(0);
             form.submit();
         });
         $('.tag-item>.btn').on('click', function () {
-            var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'), form = p.parents(),list = $('input[name="' + name + '"]').val().split(',');
+            var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name'),
+                form = p.parents(), list = $('input[name="' + name + '"]').val().split(',');
             var bool = 0;
-            $.each(list,function (index,item) {
-                if(item == value){
+            $.each(list, function (index, item) {
+                if (item == value) {
                     bool = 1
-                    list.splice(index,1);
+                    list.splice(index, 1);
                 }
             })
-            if(!bool) list.push(''+value+'');
+            if (!bool) list.push('' + value + '');
             form.find('input[name="' + name + '"]').val(list.join(','));
             $('input[name=export]').val(0);
             form.submit();
@@ -196,65 +231,66 @@
         });
         $('.search-item>li').each(function () {
             var that = $(this), value = that.data('value'), p = that.parent(), name = p.data('name');
-            if($where[name]) $('.'+name).css('color','#1ab394');
+            if ($where[name]) $('.' + name).css('color', '#1ab394');
         });
         $('.search-item-value').each(function () {
-            var that = $(this), name = that.attr('name'), value = that.val(), dom = $('.search-item[data-name="' + name + '"] .btn[data-value="' + value + '"]');
+            var that = $(this), name = that.attr('name'), value = that.val(),
+                dom = $('.search-item[data-name="' + name + '"] .btn[data-value="' + value + '"]');
             dom.eq(0).removeClass('btn-outline btn-link').addClass('btn-primary btn-sm')
                 .siblings().addClass('btn-outline btn-link').removeClass('btn-primary btn-sm')
         });
     })
-    $('.j-fail').on('click',function(){
+    $('.j-fail').on('click', function () {
         var url = $(this).data('url');
-        $eb.$alert('textarea',{
-            title:'请输入未通过原因',
-            value:'输入信息不完整或有误!',
-        },function(value){
-            $eb.axios.post(url,{message:value}).then(function(res){
-                if(res.data.code == 200) {
+        $eb.$alert('textarea', {
+            title: '请输入未通过原因',
+            value: '输入信息不完整或有误!',
+        }, function (value) {
+            $eb.axios.post(url, {message: value}).then(function (res) {
+                if (res.data.code == 200) {
                     $eb.$swal('success', res.data.msg);
                     setTimeout(function () {
                         window.location.reload();
-                    },1000);
-                }else
-                    $eb.$swal('error',res.data.msg||'操作失败!');
+                    }, 1000);
+                } else
+                    $eb.$swal('error', res.data.msg || '操作失败!');
             });
         });
     });
-    $('.j-success').on('click',function(){
+    $('.j-success').on('click', function () {
         var url = $(this).data('url');
-        $eb.$swal('delete',function(){
-            $eb.axios.post(url).then(function(res){
-                if(res.data.code == 200) {
+        $eb.$swal('delete', function () {
+            $eb.axios.post(url).then(function (res) {
+                if (res.data.code == 200) {
                     setTimeout(function () {
                         window.location.reload();
-                    },1000);
+                    }, 1000);
                     $eb.$swal('success', res.data.msg);
-                }else
-                    $eb.$swal('error',res.data.msg||'操作失败!');
+                } else
+                    $eb.$swal('error', res.data.msg || '操作失败!');
             });
-        },{
-            title:'确定审核通过?',
-            text:'通过后无法撤销,请谨慎操作!',
-            confirm:'审核通过'
+        }, {
+            title: '确定审核通过?',
+            text: '通过后无法撤销,请谨慎操作!',
+            confirm: '审核通过'
         });
     });
-    $('.btn-warning').on('click',function(){
+    $('.btn-warning').on('click', function () {
         window.t = $(this);
-        var _this = $(this),url =_this.data('url');
-        $eb.$swal('delete',function(){
-            $eb.axios.get(url).then(function(res){
-                if(res.status == 200 && res.data.code == 200) {
-                    $eb.$swal('success',res.data.msg);
+        var _this = $(this), url = _this.data('url');
+        $eb.$swal('delete', function () {
+            $eb.axios.get(url).then(function (res) {
+                if (res.status == 200 && res.data.code == 200) {
+                    $eb.$swal('success', res.data.msg);
                     _this.parents('tr').remove();
-                }else
+                } else
                     return Promise.reject(res.data.msg || '删除失败')
-            }).catch(function(err){
-                $eb.$swal('error',err);
+            }).catch(function (err) {
+                $eb.$swal('error', err);
             });
         })
     });
-    $(".open_image").on('click',function (e) {
+    $(".open_image").on('click', function (e) {
         var image = $(this).data('image');
         $eb.openImage(image);
     })
@@ -271,20 +307,20 @@
             '本月': [moment().startOf('month'), moment().endOf('month')],
             '上月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
         },
-        "locale" : {
-            applyLabel : '确定',
-            cancelLabel : '取消',
-            fromLabel : '起始时间',
-            toLabel : '结束时间',
-            format : 'YYYY/MM/DD',
-            customRangeLabel : '自定义',
-            daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ],
-            monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月',
-                '七月', '八月', '九月', '十月', '十一月', '十二月' ],
-            firstDay : 1
+        "locale": {
+            applyLabel: '确定',
+            cancelLabel: '取消',
+            fromLabel: '起始时间',
+            toLabel: '结束时间',
+            format: 'YYYY/MM/DD',
+            customRangeLabel: '自定义',
+            daysOfWeek: ['日', '一', '二', '三', '四', '五', '六'],
+            monthNames: ['一月', '二月', '三月', '四月', '五月', '六月',
+                '七月', '八月', '九月', '十月', '十一月', '十二月'],
+            firstDay: 1
         }
     });
-    dateInput.on('apply.daterangepicker', function(ev, picker) {
+    dateInput.on('apply.daterangepicker', function (ev, picker) {
         $("input[name=date]").val(picker.startDate.format('YYYY/MM/DD') + ' - ' + picker.endDate.format('YYYY/MM/DD'));
         $('form').submit();
     });

+ 3 - 1
app/api/controller/PublicController.php

@@ -43,6 +43,8 @@ class PublicController
     public function index(Request $request)
     {
         $banner = sys_data('routine_home_banner') ?: [];//TODO 首页banner图
+        $wechat_switch = sys_config('wechat_switch') ?: [];//TODO 首页banner图
+        $alipay_switch = sys_config('alipay_switch') ?: [];//TODO 首页banner图
         $menus = sys_data('routine_home_menus') ?: [];//TODO 首页按钮
         $roll = sys_data('routine_home_roll_news') ?: [];//TODO 首页滚动新闻
         $activity = sys_data('routine_home_activity', 3) ?: [];//TODO 首页活动区域图片
@@ -74,7 +76,7 @@ class PublicController
         }
         $newGoodsBananr = sys_config('new_goods_bananr');
         $tengxun_map_key = sys_config('tengxun_map_key');
-        return app('json')->successful(compact('banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name', 'subscribe', 'newGoodsBananr', 'tengxun_map_key'));
+        return app('json')->successful(compact('wechat_switch', 'alipay_switch', 'banner', 'menus', 'roll', 'info', 'activity', 'lovely', 'benefit', 'likeInfo', 'logoUrl', 'couponList', 'site_name', 'subscribe', 'newGoodsBananr', 'tengxun_map_key'));
     }
 
     /**

+ 115 - 10
app/api/controller/trade/CashTradeController.php

@@ -7,6 +7,7 @@ namespace app\api\controller\trade;
 use app\models\trade\CashTradeOrder;
 use app\models\trade\CashTradeOrderPayment;
 use app\models\user\User;
+use app\models\user\UserBanks;
 use app\models\user\UserMoney;
 use app\Request;
 use crmeb\basic\BaseModel;
@@ -20,6 +21,15 @@ use think\db\exception\ModelNotFoundException;
 
 class CashTradeController
 {
+
+
+    public function merged($type)
+    {
+        $url = "https://api.huobi.de.com/market/detail/merged?symbol={$type}usdt";
+        $res = do_request($url, [], [], false);
+        return $res;
+    }
+
     /**
      * @param Request $request
      * @return mixed
@@ -56,7 +66,20 @@ class CashTradeController
             }
         }
         foreach ($new as $k => $v) {
-            $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
+            if (!(explode('_', $v['code'])[0] == "USDT")) {
+                $res = json_decode($this->merged($v['huobi_code']), true);
+                $new[$k]['usdt'] = $res['tick']['close'];
+                $new[$k]['price'] = bcmul($usdt_price, $new[$k]['usdt'], 2);
+                $new[$k]['up'] = bcdiv(bcsub($res['tick']['close'], $res['tick']['open'], 8), $res['tick']['open'], 4);
+                //$new[$k]['merged'] = $res;
+            } else {
+                $new[$k]['usdt'] = 1;
+                $new[$k]['up'] = 0;
+                //$new[$k]['merged'] = $res;
+            }
+//            if ($request->uid()) {
+//                $new[$k]['user'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
+//            }
         }
         return app('json')->success('ok', $new);
     }
@@ -83,7 +106,20 @@ class CashTradeController
             $new[] = $v;
         }
         foreach ($new as $k => $v) {
-            $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
+            if (!(explode('_', $v['code'])[0] == "USDT")) {
+                $res = json_decode($this->merged($v['huobi_code']), true);
+                $new[$k]['usdt'] = $res['tick']['close'];
+                $new[$k]['price'] = bcmul($usdt_price, $new[$k]['usdt'], 2);
+                $new[$k]['up'] = bcdiv(bcsub($res['tick']['close'], $res['tick']['open'], 8), $res['tick']['open'], 4);
+                //$new[$k]['merged'] = $res;
+            } else {
+                $new[$k]['usdt'] = 1;
+                $new[$k]['up'] = 0;
+                //$new[$k]['merged'] = $res;
+            }
+//            if ($request->uid()) {
+//                $new[$k]['user'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
+//            }
         }
         return app('json')->success('ok', $new);
     }
@@ -117,7 +153,20 @@ class CashTradeController
             }
         }
         foreach ($new as $k => $v) {
-            $new[$k]['usdt'] = (isset($usdt_price) && $usdt_price > 0) ? bcdiv($new[$k]['price'], $usdt_price, 8) : 0;
+            if (!(explode('_', $v['code'])[0] == "USDT")) {
+                $res = json_decode($this->merged($v['huobi_code']), true);
+                $new[$k]['usdt'] = $res['tick']['close'];
+                $new[$k]['price'] = bcmul($usdt_price, $new[$k]['usdt'], 2);
+                $new[$k]['up'] = bcdiv(bcsub($res['tick']['close'], $res['tick']['open'], 8), $res['tick']['open'], 4);
+                //$new[$k]['merged'] = $res;
+            } else {
+                $new[$k]['usdt'] = 1;
+                $new[$k]['up'] = 0;
+                //$new[$k]['merged'] = $res;
+            }
+//            if ($request->uid()) {
+//                $new[$k]['user'] = UserMoney::initialUserMoney($request->uid(), $v['code']);
+//            }
         }
         return app('json')->success('ok', $new);
     }
@@ -169,7 +218,7 @@ class CashTradeController
     {
         $user = $request->user();
         $uid = $user['uid'];
-        list($money_type, $money_num, $price, $trade_type, $trade_way, $from, $hang_time, , $captcha) = UtilService::postMore([
+        list($money_type, $money_num, $price, $trade_type, $trade_way, $from, $hang_time, , $captcha, $bank_id) = UtilService::postMore([
             ['money_type', 'USDT', '', '', ['not_empty_check', function ($item) {
                 $moneys = sys_data('money_type');
                 $new_money = [];
@@ -193,7 +242,8 @@ class CashTradeController
             ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
                 return md5(md5($item)) == $user['trade_pwd'];
             }], ['请输入交易密码', '交易密码错误']],
-            ['captcha', '']
+            ['captcha', ''],
+            ['bank_id', '']
         ], $request, true);
         if ($money_num <= 0) {
             return app('json')->fail('请输入币数');
@@ -217,7 +267,7 @@ class CashTradeController
         }
         switch ($trade_type) {
             case 1:
-                $res = CashTradeOrder::hangSale($uid, $money_type, $money_num, $price, $hang_time);
+                $res = CashTradeOrder::hangSale($uid, $money_type, $money_num, $price, $hang_time, $bank_id);
                 break;
             case 2:
                 $res = CashTradeOrder::hangBuy2($uid, $money_type, $money_num, $price, $hang_time);//改方式
@@ -291,18 +341,69 @@ class CashTradeController
         }
     }
 
+    public function fast_sale(Request $request)
+    {
+        $user = $request->user();
+        $uid = $user['uid'];
+        list($money_type, $money_num, , $captcha, $bank_id) = UtilService::postMore([
+            ['money_type', 'USDT', '', '', ['not_empty_check', function ($item) {
+                $moneys = sys_data('money_type');
+                $new_money = [];
+                foreach ($moneys as $v) {
+                    if ($v['is_trade'] == 1) {
+                        $new_money[] = $v['code'];
+                    }
+                }
+                return in_array($item, $new_money);
+            }], ['请选择交易的币种', '请选择支持交易的币种']],
+            ['money_num', 0],
+            ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
+                return md5(md5($item)) == $user['trade_pwd'];
+            }], ['请输入交易密码', '交易密码错误']],
+            ['captcha', ''],
+            ['bank_id', '', '', '', ['not_empty_check'], ['请选择收款方式']]
+        ], $request, true);
+        if ($money_num <= 0) {
+            return app('json')->fail('请输入币数');
+        }
+//        var_dump($bank_id);
+        $price = 0;
+        $money = sys_data('money_type');
+        foreach ($money as $v) {
+            if ($v['code'] == $money_type) {
+                $price = $v['price'] ?: CashTradeOrder::averagePrice($v['code']);
+            }
+        }
+        $sum = bcmul($money_num, $price, 2);
+        if ($sum >= 10000) {
+            $verifyCode = CacheService::get('code_' . $user['account']);
+            if (!$verifyCode)
+                return app('json')->fail('请先获取验证码');
+            $verifyCode = substr($verifyCode, 0, 6);
+            if ($verifyCode != $captcha)
+                return app('json')->fail('验证码错误');
+        }
+        $res = CashTradeOrder::fastSale($uid, $money_type, $money_num, $price, $bank_id);
+        if ($res) {
+            return app('json')->success('卖出成功,请等待商家处理');
+        } else {
+            return app('json')->fail('卖出失败:' . CashTradeOrder::getErrorInfo('挂出错误'));
+        }
+    }
+
     public function trade(Request $request)
     {
         $user = $request->user();
         $uid = $user['uid'];
-        list($id, $trade_way, $from, , $captcha) = UtilService::postMore([
+        list($id, $trade_way, $from, , $captcha, $bank_id) = UtilService::postMore([
             ['id', 'USDT', '', '', ['not_empty_check'], ['请选择要进行的交易']],
             ['trade_way', 'weixin'],
             ['from', 'weixin'],
             ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
                 return md5(md5($item)) == $user['trade_pwd'];
             }], ['请输入交易密码', '交易密码错误']],
-            ['captcha', '']
+            ['captcha', ''],
+            ['bank_id', '']
         ], $request, true);
         $order = CashTradeOrder::setStatus(1)->where('id', $id)->find();
         if ($order['uid'] == $uid) {
@@ -323,7 +424,7 @@ class CashTradeController
         }
         switch ($order['trade_type']) {
             case 2:
-                $res = CashTradeOrder::sale($uid, $id);
+                $res = CashTradeOrder::sale($uid, $id, $bank_id);
                 break;
             case 1:
                 $res = CashTradeOrder::buy2($uid, $id);
@@ -390,7 +491,11 @@ class CashTradeController
                 break;
         }
         if ($res) {
-            return app('json')->success('交易开始进行,' . $order['trade_type'] == 1 ? '请通过用户的转账方式交易并上传交易凭证' : '请等待买家转账并上传凭证');
+            $info = CashTradeOrder::get($id);
+            $info['user'] = User::getUserInfo($info['uid']);
+            if ($info['bank_info'])
+                $info['bank'] = json_decode($info['bank_info'], true);
+            return app('json')->success('交易开始进行,' . $order['trade_type'] == 1 ? '请通过用户的转账方式交易并上传交易凭证' : '请等待买家转账并上传凭证', ['data' => $info]);
         } else {
             return app('json')->fail('交易失败:' . CashTradeOrder::getErrorInfo('挂出错误'));
         }

+ 10 - 2
app/api/controller/trade/TradeController.php

@@ -5,6 +5,7 @@ namespace app\api\controller\trade;
 
 
 use app\models\trade\CashTradeOrder;
+use app\models\user\User;
 use app\models\user\UserMoney;
 use app\models\user\UserMoneyOrder;
 use app\Request;
@@ -114,7 +115,7 @@ class TradeController
     {
         $user = $request->user();
         $uid = $user['uid'];
-        list($type, $num, $to_uid, , $captcha) = UtilService::postMore(
+        list($type, $num, $to_uid, $mobile, $captcha) = UtilService::postMore(
             [
                 ['type', 'USDT', '', '', ['not_empty_check', function ($item) {
                     $moneys = sys_data('money_type');
@@ -128,14 +129,21 @@ class TradeController
                 }], ['请选择交易的币种', '请选择支持交易的币种']],
                 ['num', 0],
                 ['to_uid', 0],
+                ['mobile', 0],
                 ['trade_psw', '', '', '', ['not_empty_check', function ($item) use ($user) {
                     return md5(md5($item)) == $user['trade_pwd'];
                 }], ['请输入交易密码', '交易密码错误']],
                 ['captcha', '']
             ], $request, true);
-        if (!$num || !$to_uid) {
+        if (!$num) {
             return app('json')->fail('参数不足');
         }
+        if (!$to_uid) {
+            $to_uid = User::where('phone', $mobile)->value('uid');
+            if (!$to_uid) {
+                return app('json')->fail('请输入正确的手机号');
+            }
+        }
         $price = 0;
         $list = sys_data('money_type');
         foreach ($list as $v) {

+ 87 - 4
app/api/controller/user/UserController.php

@@ -2,9 +2,11 @@
 
 namespace app\api\controller\user;
 
+use app\api\controller\trade\CashTradeController;
 use app\http\validates\user\AddressValidate;
 use app\models\system\SystemCity;
 use app\models\trade\CashTradeOrder;
+use app\models\user\UserBanks;
 use app\models\user\UserMoney;
 use app\models\user\UserVisit;
 use crmeb\services\CacheService;
@@ -782,7 +784,6 @@ class UserController
         $back = [];
         $like_rmb = 0;
         foreach ($money_type as $v) {
-
             unset($v['cash_commission_ratio']);
             unset($v['cash_commission_type']);
             unset($v['can_cash']);
@@ -790,14 +791,28 @@ class UserController
 //            unset($v['price']);
             unset($v['is_trade']);
             $back[$v['code']] = $v;
-            $back[$v['code']]['price'] = $back[$v['code']]['price'] > 0 ? $back[$v['code']]['price'] : CashTradeOrder::averagePrice($v['code']);
             $back[$v['code']]['money'] = UserMoney::initialUserMoney($uid, $v['code']);
-            $back[$v['code']]['rmb'] = bcmul($back[$v['code']]['money']['money'], $back[$v['code']]['price'], 2);
-            $like_rmb += $back[$v['code']]['rmb'];
+            $back[$v['code']]['price'] = $back[$v['code']]['price'] > 0 ? $back[$v['code']]['price'] : CashTradeOrder::averagePrice($v['code']);
             if (explode('_', $v['code'])[0] == "USDT") {
                 $usdt_price = $back[$v['code']]['price'];
             }
         }
+
+        foreach ($back as $k => $v) {
+            if (!(explode('_', $v['code'])[0] == "USDT")) {
+                $res = json_decode((new CashTradeController())->merged($v['huobi_code']), true);
+                $back[$k]['usdt'] = $res['tick']['close'];
+                $back[$k]['price'] = bcmul($usdt_price, $back[$k]['usdt'], 2);
+                $back[$k]['up'] = bcdiv(bcsub($res['tick']['close'], $res['tick']['open'], 8), $res['tick']['open'], 4);
+                //$new[$k]['merged'] = $res;
+            } else {
+                $back[$k]['usdt'] = 1;
+                $back[$k]['up'] = 0;
+                //$new[$k]['merged'] = $res;
+            }
+            $back[$k]['rmb'] = bcmul($back[$k]['money']['money'], $back[$k]['price'], 2);
+            $like_rmb += $back[$k]['rmb'];
+        }
         $like_usdt = 0;
         if (isset($usdt_price) && $usdt_price > 0) $like_usdt = bcdiv($like_rmb, $usdt_price, 8);
         return app('json')->success('ok', compact('back', 'like_rmb', 'like_usdt'));
@@ -953,4 +968,72 @@ class UserController
         if ($res) return app('json')->success('设置成功');
         else  return app('json')->fail('设置失败');
     }
+
+    public function banks(Request $request)
+    {
+        list($page, $limit, $type) = UtilService::getMore([['page', 0], ['limit', 20], ['type', 3]], $request, true);
+        $list = UserBanks::getUserValidAddressList($request->uid(), $type, $page, $limit);
+        return app('json')->successful($list);
+    }
+
+    public function bank($id, Request $request)
+    {
+        $addressInfo = [];
+        if ($id && is_numeric($id) && UserBanks::be(['is_del' => 0, 'id' => $id, 'uid' => $request->uid()])) {
+            $addressInfo = UserBanks::find($id)->toArray();
+        }
+        return app('json')->successful($addressInfo);
+    }
+
+
+    /**
+     * 修改 添加地址
+     * @param Request $request
+     * @return mixed
+     */
+    public function bank_edit(Request $request)
+    {
+        $addressInfo = UtilService::postMore([
+            ['code', '', '', '', ['not_empty_check'], ['请输入完整参数']],
+            ['name', '', '', '', ['not_empty_check'], ['请输入完整参数']],
+            ['account', '', '', '', ['not_empty_check'], ['请输入完整参数']],
+            ['id', 0],
+            ['type', 0, '', '', ['not_empty_check'], ['请选择类型']]
+        ], $request);
+
+        if ($addressInfo['id'] && UserBanks::be(['id' => $addressInfo['id'], 'uid' => $request->uid(), 'is_del' => 0])) {
+            $id = $addressInfo['id'];
+            unset($addressInfo['id']);
+            if (UserBanks::edit($addressInfo, $id, 'id')) {
+                return app('json')->successful();
+            } else
+                return app('json')->fail('编辑收款地址失败!');
+        } else {
+            $addressInfo['add_time'] = time();
+            $addressInfo['uid'] = $request->uid();
+            if ($address = UserBanks::create($addressInfo)) {
+                return app('json')->successful();
+            } else {
+                return app('json')->fail('添加收款地址失败!');
+            }
+        }
+    }
+
+    /**
+     * 删除地址
+     *
+     * @param Request $request
+     * @return mixed
+     */
+    public function bank_del(Request $request)
+    {
+        list($id) = UtilService::postMore([['id', 0]], $request, true);
+        if (!$id || !is_numeric($id)) return app('json')->fail('参数错误!');
+        if (!UserBanks::be(['is_del' => 0, 'id' => $id, 'uid' => $request->uid()]))
+            return app('json')->fail('地址不存在!');
+        if (UserBanks::edit(['is_del' => '1'], $id, 'id'))
+            return app('json')->successful();
+        else
+            return app('json')->fail('删除地址失败!');
+    }
 }

+ 67 - 4
app/api/controller/user/UserExtractController.php

@@ -52,6 +52,53 @@ class UserExtractController
         return app('json')->successful($data);
     }
 
+    public function cash_calculator(Request $request)
+    {
+        $extractInfo = UtilService::postMore([
+            ['money', 0],
+            ['money_type', ''],
+            ['way', '']
+        ], $request);
+//        if (!preg_match('/^(([1-9]\d*)|0)(\.\d{1-8})?$/', $extractInfo['money'])) return app('json')->fail('提现金额输入有误');
+        $user = $request->user();
+        $money_type = sys_data('money_type');
+        foreach ($money_type as $v) {
+            if ($v['code'] == $extractInfo['money_type']) {
+                if (!$v['can_cash']) {
+                    return app('json')->fail('该币种不可提币');
+                }
+                switch ($extractInfo['way']) {
+                    case 'ERC20':
+                        $v['cash_commission_ratio'] = $v['cash_commission_ratio2'];
+                        break;
+                    case 'TRC20':
+                        break;
+                    default:
+                        return app('json')->fail('提币通道错误');
+                        break;
+                }
+                if ($v['cash_commission_count_type'] == 1) {
+                    $service = bcmul(bcdiv($v['cash_commission_ratio'], 100, 2), $extractInfo['money'], 8);
+                } else {
+                    $service = $v['cash_commission_ratio'];
+                }
+                $service_type = $v['cash_commission_type'];
+            }
+        }
+        if (!isset($service) || !isset($service_type)) {
+            return app('json')->fail('该币种不可提币');
+        }
+        $extractInfo = array_merge($extractInfo, compact('service', 'service_type'));
+        if ($extractInfo['money_type'] != $extractInfo['service_type']) {
+            $extractInfo['extract_price'] = $extractInfo['money'];
+        } else {
+            $extractInfo['extract_price'] = bcsub($extractInfo['money'], $extractInfo['service'], 8);
+        }
+        $extractInfo['_money_type'] = init_money_type()[$extractInfo['money_type']];
+        $extractInfo['_service_type'] = init_money_type()[$extractInfo['service_type']];
+        return app('json')->success('ok', $extractInfo);
+    }
+
     /**
      * 提现申请
      * @param Request $request
@@ -69,9 +116,13 @@ class UserExtractController
             ['weixin', ''],
             ['money_type', ''],
             ['address', ''],
+            ['way', '']
         ], $request);
-        if (!preg_match('/^(([1-9]\d*)|0)(\.\d{1-8})?$/', $extractInfo['money'])) return app('json')->fail('提现金额输入有误');
+//        if (!preg_match('/^(([1-9]\d*)|0)(\.\d{1-8})?$/', $extractInfo['money'])) return app('json')->fail('提现金额输入有误');
         $user = $request->user();
+        if (!$extractInfo['way']) {
+            return app('json')->fail('请选择提币通道');
+        }
 //        $broken_time = intval(sys_config('extract_time'));
 //        $search_time = time() - 86400 * $broken_time;
 //        //可提现佣金
@@ -97,6 +148,16 @@ class UserExtractController
                 if (!$v['can_cash']) {
                     return app('json')->fail('该币种不可提币');
                 }
+                switch ($extractInfo['way']) {
+                    case 'ERC20':
+                        $v['cash_commission_ratio'] = $v['cash_commission_ratio2'];
+                        break;
+                    case 'TRC20':
+                        break;
+                    default:
+                        return app('json')->fail('提币通道错误');
+                        break;
+                }
                 if ($v['cash_commission_count_type'] == 1) {
                     $service = bcmul(bcdiv($v['cash_commission_ratio'], 100, 2), $extractInfo['money'], 8);
                 } else {
@@ -116,14 +177,16 @@ class UserExtractController
             if ($extractInfo['money'] > $money['money']) return app('json')->fail('可提现佣金不足');
             if ($service > $money2['money']) return app('json')->fail('用于支付手续费的' . init_money_type()[$service_type] . '不足');
         } else {
-            if (bcadd($extractInfo['money'], $service, 8) > $money['money']) return app('json')->fail('可提现佣金不足');
+            if ($extractInfo['money'] > $money['money']) return app('json')->fail('可提现佣金不足');
+//            if (bcadd($extractInfo['money'], $service, 8) > $money['money']) return app('json')->fail('可提现佣金不足');
         }
 
         if ($extractInfo['address'] == '') return app('json')->fail('钱包地址错误');
 //            if (!preg_match('/^([1-9]{1})(\d{14}|\d{18})$/', $extractInfo['cardnum']))
 //                return app('json')->fail('银行卡号输入有误');
-        if (UserExtract::userExtract($user, $extractInfo)) {
-            return app('json')->successful('申请提币成功!', []);
+        $res = UserExtract::userExtract($user, $extractInfo);
+        if ($res) {
+            return app('json')->successful('申请提币成功!', ['data' => $res]);
         } else
             return app('json')->fail(UserExtract::getErrorInfo('提币失败'));
     }

+ 21 - 21
app/http/middleware/AuthTokenMiddleware.php

@@ -31,27 +31,27 @@ class AuthTokenMiddleware implements MiddlewareInterface
         try {
             $authInfo = UserRepository::parseToken($token);
             if (!is_null($authInfo)) {
-                $sub_uid = $request->header('UID', 0);
-                if ($authInfo['user']['main_uid'] == 0) {
-                    $check = function ($item) use ($authInfo) {
-                        return User::getUserInfo($item)['main_uid'] == $authInfo['user']['uid'] || User::getUserInfo($item)['uid'] == $authInfo['user']['uid'];
-                    };
-                } else {
-                    $check = function ($item) use ($authInfo) {
-                        return (User::getUserInfo($item)['main_uid'] == $authInfo['user']['main_uid']) || User::getUserInfo($item)['uid'] == $authInfo['user']['main_uid'];
-                    };
-                }
-                if ($sub_uid) {
-                    if ($check($sub_uid)) {
-                        $authInfo['user'] = User::where('uid', $sub_uid)->find();
-                    }
-                    $main_user = User::getUserInfo($authInfo['user']['main_uid'] ?: $authInfo['user']['uid']);
-                    if ($main_user['real_check'] == 1) {
-                        $authInfo['user']['real_check'] = 1;
-                        $authInfo['user']['real_name'] = $main_user['real_name'];
-                        $authInfo['user']['card_id'] = $main_user['card_id'];
-                    }
-                }
+//                $sub_uid = $request->header('UID', 0);
+//                if ($authInfo['user']['main_uid'] == 0) {
+//                    $check = function ($item) use ($authInfo) {
+//                        return User::getUserInfo($item)['main_uid'] == $authInfo['user']['uid'] || User::getUserInfo($item)['uid'] == $authInfo['user']['uid'];
+//                    };
+//                } else {
+//                    $check = function ($item) use ($authInfo) {
+//                        return (User::getUserInfo($item)['main_uid'] == $authInfo['user']['main_uid']) || User::getUserInfo($item)['uid'] == $authInfo['user']['main_uid'];
+//                    };
+//                }
+//                if ($sub_uid) {
+//                    if ($check($sub_uid)) {
+//                        $authInfo['user'] = User::where('uid', $sub_uid)->find();
+//                    }
+//                    $main_user = User::getUserInfo($authInfo['user']['main_uid'] ?: $authInfo['user']['uid']);
+//                    if ($main_user['real_check'] == 1) {
+//                        $authInfo['user']['real_check'] = 1;
+//                        $authInfo['user']['real_name'] = $main_user['real_name'];
+//                        $authInfo['user']['card_id'] = $main_user['card_id'];
+//                    }
+//                }
 //                if (!$authInfo['user']['real_check'] && !in_array($request->action(), ['realNameCheck', 'logout', 'user', 'userinfo'])) {
 //                    throw new AuthException('请先进行实名认证');
 //                }

+ 109 - 10
app/models/trade/CashTradeOrder.php

@@ -4,6 +4,7 @@
 namespace app\models\trade;
 
 use app\models\user\User;
+use app\models\user\UserBanks;
 use app\models\user\UserBill;
 use app\models\user\UserMoney;
 use app\models\user\UserMoneyOrder;
@@ -106,19 +107,53 @@ class CashTradeOrder extends BaseModel
         if (isset($where['money_type']) && $where['money_type'] != '') {
             $model = $model->where('money_type', $where['money_type']);
         }
+        if (isset($where['trade_uid']) && $where['trade_uid'] != '') {
+            $model = $model->where('trade_uid', $where['trade_uid']);
+        }
         $count = $model->count();
 //        var_dump(self::getLastSql());
         $list = $model->order('add_time', 'desc')->page((int)$where['page'], (int)$where['limit'])->select()
 //        var_dump(self::getLastSql());
             ->each(function ($item) {
                 $item['user'] = User::getUserInfo($item['uid']);
-                $item['trade_user'] = User::getUserInfo($item['trade_uid']);
+                $item['trade_user'] = $item['trade_user'] === 0 ? [] : User::getUserInfo($item['trade_uid']);
 //                $item['_add_time'] = time_format($item['add_time']);
 //                $item['_end_time'] = time_format($item['end_time']);
 //                $item['_trade_time'] = time_format($item['trade_time']);
                 $money_type = init_money_type();
                 $item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
-                $item['_trade_user'] = $item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--';
+                $item['bank'] = json_decode($item['bank_info'], true);
+                $item['_name_text'] = '--';
+                $item['_account_text'] = '--';
+                $item['_code_text'] = '--';
+                $item['_name'] = '--';
+                $item['_account'] = '--';
+                $item['_code'] = '--';
+                if ($item['bank']) {
+                    if ($item['bank']['type'] == 1) {
+                        $item['_name_text'] = '支付宝用户';
+                        $item['_account_text'] = '支付宝账号';
+                        $item['_code_text'] = '支付宝二维码';
+                        $item['_name'] = $item['bank']['name'];
+                        $item['_account'] = $item['bank']['account'];
+                        $item['_code'] = "<img src='" . $item['bank']['code'] . "'>";
+                    } else if ($item['bank']['type'] == 2) {
+                        $item['_name_text'] = '微信用户';
+                        $item['_account_text'] = '微信账号';
+                        $item['_code_text'] = '微信二维码';
+                        $item['_name'] = $item['bank']['name'];
+                        $item['_account'] = $item['bank']['account'];
+                        $item['_code'] = "<img src='" . $item['bank']['code'] . "'>";
+                    } else {
+                        $item['_name_text'] = '开户人';
+                        $item['_account_text'] = '银行卡号';
+                        $item['_code_text'] = '开户行';
+                        $item['_name'] = $item['bank']['name'];
+                        $item['_account'] = $item['bank']['account'];
+                        $item['_code'] = $item['bank']['code'];
+                    }
+                }
+                $item['_trade_user'] = $item['trade_user'] === 0 ? '系统/0' : $item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--';
                 $item['_add_time'] = time_format($item['add_time']);
                 $item['_end_time'] = $item['end_time'] ? time_format($item['end_time']) : '--';
                 $item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
@@ -209,11 +244,18 @@ class CashTradeOrder extends BaseModel
     }
 
 
-    public static function hangSale($uid, $money_type, $money_num, $price, $hang_time)
+    public static function hangSale($uid, $money_type, $money_num, $price, $hang_time, $bank_id)
     {
         $user = User::getUserInfo($uid);
-        if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
-            return self::setErrorInfo('请先设置收款方式!');
+        if (!$user['sale_switch']) {
+            return self::setErrorInfo('当前用户不可挂卖!');
+        }
+        if (!$bank_id) {
+            return self::setErrorInfo('请选择收款方式!');
+        }
+        $bank = UserBanks::get($bank_id);
+        if (!$bank || $bank['uid'] != $uid) {
+            return self::setErrorInfo('收款方式错误!');
         }
         $money = UserMoney::initialUserMoney($uid, $money_type);
         if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
@@ -235,6 +277,7 @@ class CashTradeOrder extends BaseModel
                 'add_time' => time(),
                 'hang_time' => $hang_time,
                 'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
+                'bank_info' => json_encode($bank)
             ]);
             if ($res) {
                 BaseModel::commitTrans();
@@ -247,6 +290,54 @@ class CashTradeOrder extends BaseModel
         }
     }
 
+    public static function fastSale($uid, $money_type, $money_num, $price, $bank_id)
+    {
+//        $user = User::getUserInfo($uid);
+//        if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
+//            return self::setErrorInfo('请先设置收款方式!');
+//        }
+        if (!$bank_id) {
+            return self::setErrorInfo('请选择收款方式!');
+        }
+        $bank = UserBanks::get($bank_id);
+        if (!$bank || $bank['uid'] != $uid) {
+            return self::setErrorInfo('收款方式错误!');
+        }
+        $money = UserMoney::initialUserMoney($uid, $money_type);
+        if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
+        $sum = bcmul($money_num, $price, 2);
+        BaseModel::beginTrans();
+        try {
+            $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
+            if (!$res) {
+                return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
+            }
+            $res = self::create([
+                'order_id' => self::getOrderId(),
+                'uid' => $uid,
+                'money_type' => $money_type,
+                'money_num' => $money_num,
+                'price' => $price,
+                'all_price' => $sum,
+                'trade_type' => 1,
+                'add_time' => time(),
+                'hang_time' => 0,
+                'trade_uid' => 0,
+                'status' => -1,
+                'end_time' => PHP_INT_MAX,
+                'bank_info' => json_encode($bank)
+            ]);
+            if ($res) {
+                self::commitTrans();
+                return true;
+            } else {
+                return self::setErrorInfo('挂卖失败', true);
+            }
+        } catch (Exception $e) {
+            return self::setErrorInfo($e->getMessage(), true);
+        }
+    }
+
     public static function hangBuy2($uid, $money_type, $money_num, $price, $hang_time)
     {
         $sum = bcmul($money_num, $price, 2);
@@ -323,16 +414,23 @@ class CashTradeOrder extends BaseModel
     }
 
 
-    public static function sale($uid, $id)
+    public static function sale($uid, $id, $bank_id)
     {
+        if (!$bank_id) {
+            return self::setErrorInfo('请选择收款方式!');
+        }
+        $bank = UserBanks::get($bank_id);
+        if (!$bank || $bank['uid'] != $uid) {
+            return self::setErrorInfo('收款方式错误!');
+        }
         $order = self::setStatus(1)->where('id', $id)->find();
         if (!$order) {
             return self::setErrorInfo('订单不存在或已结束挂出');
         }
-        $user = User::getUserInfo($uid);
-        if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
-            return self::setErrorInfo('请先设置收款方式!');
-        }
+//        $user = User::getUserInfo($uid);
+//        if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
+//            return self::setErrorInfo('请先设置收款方式!');
+//        }
         $money = UserMoney::initialUserMoney($uid, $order['money_type']);
         if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
         BaseModel::beginTrans();
@@ -344,6 +442,7 @@ class CashTradeOrder extends BaseModel
             $res = self::where('id', $id)->update([
                 'status' => 0,
                 'trade_uid' => $uid,
+                'bank_info' => json_encode($bank),
                 //'trade_way' => $order['pay_type'],
 //                'trade_time' => time(),
             ]);

+ 73 - 0
app/models/user/UserBanks.php

@@ -0,0 +1,73 @@
+<?php
+/**
+ *
+ * @author: xaboy<365615158@qq.com>
+ * @day: 2017/12/25
+ */
+
+namespace app\models\user;
+
+use crmeb\basic\BaseModel;
+use crmeb\traits\ModelTrait;
+
+/**
+ * TODO 用户收货地址
+ * Class UserAddress
+ * @package app\models\user
+ */
+class UserBanks extends BaseModel
+{
+    /**
+     * 数据表主键
+     * @var string
+     */
+    protected $pk = 'id';
+
+    /**
+     * 模型名称
+     * @var string
+     */
+    protected $name = 'user_banks';
+
+    use ModelTrait;
+
+    protected $insert = ['add_time'];
+
+    protected $hidden = ['add_time', 'is_del', 'uid'];
+
+    protected function setAddTimeAttr()
+    {
+        return time();
+    }
+
+
+    /**
+     * 设置用户地址查询初始条件
+     * @param null $model
+     * @param string $prefix
+     * @return \think\Model
+     */
+    public static function userValidAddressWhere($model = null, $prefix = '')
+    {
+        if ($prefix) $prefix .= '.';
+        $model = self::getSelfModel($model);
+        return $model->where("{$prefix}is_del", 0);
+    }
+
+    /**
+     * 获取用户收货地址并分页
+     * @param $uid 用户uid
+     * @param int $page 页码
+     * @param int $limit 展示条数
+     * @param string $field 展示字段
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public static function getUserValidAddressList($uid, $type, $page = 1, $limit = 8, $field = '*')
+    {
+        if ($page) return self::userValidAddressWhere()->where('type', $type)->where('uid', $uid)->order('add_time DESC')->field($field)->page((int)$page, (int)$limit)->select()->toArray() ?: [];
+        else return self::userValidAddressWhere()->where('type', $type)->where('uid', $uid)->order('add_time DESC')->field($field)->select()->toArray() ?: [];
+    }
+}

+ 1 - 0
app/models/user/UserExtract.php

@@ -85,6 +85,7 @@ class UserExtract extends BaseModel
             'address' => $data['address'],
             'service' => $data['service'],
             'service_type' => $data['service_type'],
+            'way' => $data['way'],
         ];
 //        var_dump($insertData);
 //        exit;

+ 3 - 0
app/models/user/UserMoney.php

@@ -56,6 +56,9 @@ class UserMoney extends BaseModel
         $user_info = User::getUserInfo($uid);
         $to_user = self::initialUserMoney($to_uid, $money_type);
         $to_user_info = User::getUserInfo($to_uid);
+        if (!$to_user_info) {
+            return self::setErrorInfo('用户不存在');
+        }
 
         if ($user['money'] < $money) {
             return self::setErrorInfo('余额不足');

+ 59 - 0
crmeb/services/HuobiService.php

@@ -0,0 +1,59 @@
+<?php
+/**
+ *
+ * @author: xaboy<365615158@qq.com>
+ * @day: 2017/11/23
+ */
+
+namespace crmeb\services;
+
+
+class HuobiService
+{
+    const API_URL = 'https://sapi.ztpay.org/api/v2';//接口地址
+
+    private static $app_id = '84cef8cf-ghxertfvbf-13a8a0ca-997b0';
+    private static $app_secret = '739a0682-163aad52-b6c3ad63-40431';
+
+    /**
+     * 实例化
+     * @return HuobiService
+     */
+    public static function instance()
+    {
+        $instance = new self();
+        $instance::$app_id = sys_config('huobi_Access_Key', '');
+        $instance::$app_secret = sys_config('huobi_Secret_Key', '');
+        return $instance;
+    }
+
+    /**
+     * 获取签名
+     * @param $data
+     * @return string
+     */
+    private static function getSign($data)
+    {
+        $signPars = "";
+        ksort($data);
+        foreach ($data as $k => $v) {
+            if ("sign" != $k && "" != $v && $v != "0") {
+                $signPars .= $k . "=" . $v . "&";
+            }
+        }
+        $signPars .= "key=" . self::$app_secret;
+        return strtoupper(md5($signPars));
+    }
+
+    /**
+     * 通用请求
+     * @param $data
+     * @return bool|false|string
+     */
+    private static function request($data)
+    {
+        $data['sign'] = self::getSign($data);
+        return json_decode(do_request(self::API_URL, $data), true);
+    }
+
+}

+ 7 - 1
route/api/route.php

@@ -81,7 +81,8 @@ Route::group(function () {
     Route::get('vote/my_list', 'VoteController/my_list')->name('myVoteList');//我参与的投票列表
     //交易类
     Route::post('trade/hang', 'trade.CashTradeController/hang')->name('hang');//挂出
-    Route::post('trade/trade', 'trade.CashTradeController/trade')->name('trade');//交易
+    Route::post('trade/fast', 'trade.CashTradeController/fast_sale')->name('fast_sale');//挂出
+    Route::post('trade/trade', 'trade.CashTradeController/trade')->name('trade');//快捷卖币
     Route::get('trade/my', 'trade.CashTradeController/myOrder')->name('myOrder');//我的订单
     Route::post('trade/cancel/:id', 'trade.CashTradeController/cancel')->name('cancel');//取消订单
     Route::post('trade/upload/:id', 'trade.CashTradeController/uploadProof')->name('uploadProof');//上传凭证
@@ -98,6 +99,10 @@ Route::group(function () {
 
     //用户类  用户coupons/order
     Route::get('user', 'user.UserController/user')->name('user');//个人中心
+    Route::get('user/bank', 'user.UserController/banks')->name('banks');//收款方式列表
+    Route::get('user/bank/:id', 'user.UserController/bank')->name('user');//收款方式单条
+    Route::post('user/bank', 'user.UserController/bank_edit')->name('bank_edit');//新增编辑首款地址
+    Route::post('user/del_bank', 'user.UserController/del_bank')->name('del_bank');//新增编辑首款地址
     Route::post('set_bank/:type', 'user.UserController/setMoneyAccount')->name('setMoneyAccount');//设置收款账户
     Route::get('group', 'user.UserController/myGroup')->name('group');//我的社区
     Route::get('money/log/:money_type', 'user.UserController/moneyLog')->name('moneyLog');//钱包流水
@@ -202,6 +207,7 @@ Route::group(function () {
     //提现类
     Route::get('extract/bank', 'user.UserExtractController/bank')->name('extractBank');//提现银行/提现最低金额
     Route::post('extract/cash', 'user.UserExtractController/cash')->name('extractCash');//提现申请
+    Route::post('extract/calculator', 'user.UserExtractController/cash_calculator')->name('cashCalculator');//提现计算
     //充值类
     Route::post('recharge/routine', 'user.UserRechargeController/routine')->name('rechargeRoutine');//小程序充值
     Route::post('recharge/wechat', 'user.UserRechargeController/wechat')->name('rechargeWechat');//公众号充值