afa 7 months ago
parent
commit
9da3674089

+ 37 - 0
application/admin/controller/product/Pledges.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\admin\controller\product;
+
+use app\common\controller\Backend;
+
+/**
+ * 产品质押管理
+ *
+ * @icon fa fa-circle-o
+ */
+class Pledges extends Backend
+{
+
+    /**
+     * Pledges模型对象
+     * @var \app\admin\model\product\Pledges
+     */
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = new \app\common\model\ProductPledges();
+        $this->view->assign("toLangList", $this->model->getToLangList());
+    }
+
+
+
+    /**
+     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
+     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
+     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+     */
+
+
+}

+ 17 - 0
application/admin/lang/zh-cn/product/pledges.php

@@ -0,0 +1,17 @@
+<?php
+
+return [
+    'Id'          => 'ID',
+    'Title'       => '标题',
+    'Thum'        => '图片',
+    'Type_id'     => '质押类型',
+    'To_lang'     => '所属语言',
+    'Product_id'  => '质押产品',
+    'Day_num'     => '日产币量',
+    'Income_reta' => '收益率',
+    'Detail'      => '详情',
+    'Weigh'       => '权重',
+    'Status'      => '状态',
+    'Create_time' => '创建时间',
+    'Update_time' => '更新时间'
+];

+ 27 - 0
application/admin/validate/product/Pledges.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate\product;
+
+use think\Validate;
+
+class Pledges extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add'  => [],
+        'edit' => [],
+    ];
+    
+}

+ 81 - 0
application/admin/view/product/pledges/add.html

@@ -0,0 +1,81 @@
+<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
+    <div class="form-horizontal">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('To_lang')}:</label>
+        <div class="col-xs-12 col-sm-3">       
+            <input id="c-to_lang" data-rule="required" data-source='[{"id":"zh","title":"中文"},{"id":"en","title":"英文"}]' data-field="title" class="form-control selectpage" name="row[to_lang]" type="text" value="">
+        </div>
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="0">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-title" class="form-control" name="row[title]" type="text" value="">
+        </div>
+    </div>
+  
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Type_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-type_id" data-rule="required" class="form-control selectpicker" name="row[type_id]">
+                <option value="1" >单品</option>
+                <option value="2" >组合</option>
+            </select>
+        </div>
+    </div>
+    <div class="form-group" data-favisible="type_id=1">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Product_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-product_id" data-rule="required" data-source="product/lists/index" class="form-control selectpage" data-field="zh_name" name="row[product_id]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group" data-favisible="type_id=2">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Product_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-product_id" data-rule="required" data-source="product/lists/index" data-multiple="true" class="form-control selectpage" data-field="zh_name" name="row[product_id]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Thum')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-thum" data-rule="required" class="form-control" size="50" name="row[thum]" type="text" value="">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="faupload-thum" class="btn btn-danger faupload" data-input-id="c-thum"  data-params='{"category":"oss"}' data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-thum"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                    <span><button type="button" id="fachoose-thum" class="btn btn-primary fachoose" data-input-id="c-thum" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> 
+                </div>
+                <span class="msg-box n-right" for="c-thum"></span>
+            </div>
+            <ul class="row list-inline faupload-preview" id="p-thum"></ul>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Day_num')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-day_num" data-rule="required" class="form-control" name="row[day_num]" type="number" value="0">
+        </div>
+        <label class="control-label col-xs-12 col-sm-2">{:__('Income_reta')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-income_reta" data-rule="required" min="0" class="form-control" step="0.01" name="row[income_reta]" type="number" value="0.00">
+        </div>
+    </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-detail" data-rule="required" class="form-control editor" rows="5" name="row[detail]" cols="50"></textarea>
+        </div>
+    </div>
+   
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div></div>
+</form>

+ 83 - 0
application/admin/view/product/pledges/edit.html

@@ -0,0 +1,83 @@
+<form id="edit-form" role="form" data-toggle="validator" method="POST" action="">
+    <div class="form-horizontal">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('To_lang')}:</label>
+        <div class="col-xs-12 col-sm-3">       
+            <input id="c-to_lang" data-rule="required" data-source='[{"id":"zh","title":"中文"},{"id":"en","title":"英文"}]' data-field="title" class="form-control selectpage" name="row[to_lang]" type="text" value="{$row.to_lang|htmlentities}">
+        </div>
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-weigh" data-rule="required" class="form-control" name="row[weigh]" type="number" value="{$row.weigh|htmlentities}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-title" class="form-control" name="row[title]" type="text" value="{$row.title|htmlentities}">
+        </div>
+    </div>
+
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Type_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-type_id" data-rule="required" class="form-control selectpicker" name="row[type_id]">
+                <option value="1" {in name="1" value="$row.type_id"}selected{/in}>单品</option>
+                <option value="2" {in name="2" value="$row.type_id"}selected{/in}>组合</option>
+            </select>
+        </div>
+    </div>
+   
+    <div class="form-group" data-favisible="type_id=1">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Product_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-product_id" data-rule="required" data-source="product/lists/index" class="form-control selectpage" data-field="zh_name" name="row[product_id]" type="text" value="{$row.product_id|htmlentities}">
+        </div>
+    </div>
+    <div class="form-group" data-favisible="type_id=2">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Product_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-product_id" data-rule="required" data-source="product/lists/index" data-multiple="true" class="form-control selectpage" data-field="zh_name" name="row[product_id]" type="text" value="{$row.product_id|htmlentities}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Thum')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="input-group">
+                <input id="c-thum" data-rule="required" class="form-control" size="50" name="row[thum]" type="text" value="{$row.thum|htmlentities}">
+                <div class="input-group-addon no-border no-padding">
+                    <span><button type="button" id="faupload-thum" class="btn btn-danger faupload" data-input-id="c-thum"  data-params='{"category":"oss"}' data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-thum"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                    <span><button type="button" id="fachoose-thum" class="btn btn-primary fachoose" data-input-id="c-thum" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span> 
+                </div>
+                <span class="msg-box n-right" for="c-thum"></span>
+            </div>
+            <ul class="row list-inline faupload-preview" id="p-thum"></ul>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Day_num')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-day_num" data-rule="required" class="form-control" name="row[day_num]" type="number" value="{$row.day_num|htmlentities}">
+        </div>
+        <label class="control-label col-xs-12 col-sm-2">{:__('Income_reta')}:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-income_reta" data-rule="required" min="0" class="form-control" step="0.01" name="row[income_reta]" type="number" value="{$row.income_reta|htmlentities}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-detail" data-rule="required" class="form-control editor" rows="5" name="row[detail]" cols="50">{$row.detail|htmlentities}</textarea>
+        </div>
+    </div>
+ 
+ 
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div></div>
+</form>

+ 35 - 0
application/admin/view/product/pledges/index.html

@@ -0,0 +1,35 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('product/pledges/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('product/pledges/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('product/pledges/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        
+
+                        <div class="dropdown btn-group {:$auth->check('product/pledges/multi')?'':'hide'}">
+                            <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
+                            <ul class="dropdown-menu text-left" role="menu">
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
+                            </ul>
+                        </div>
+
+                        
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('product/pledges/edit')}"
+                           data-operate-del="{:$auth->check('product/pledges/del')}"
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 0 - 1
application/api/controller/Order.php

@@ -307,7 +307,6 @@ class Order extends Api
      */
     public function updateOrder()
     {
-       
         $amount    = $this->request->post('amount'); // 支付金额
         $tx_hash   = $this->request->post('tx_hash'); // 交易hash
         if (empty($amount)) $this->error(__('交易金额不能为空'));

+ 113 - 0
application/api/controller/Pledge.php

@@ -0,0 +1,113 @@
+<?php
+
+
+namespace app\api\controller;
+
+use app\common\controller\Api;
+use app\common\model\ProductLists;
+use app\common\model\ProductOrder;
+use app\common\model\ProductPledges;
+use Exception;
+use app\api\logic\WelfareLoginc;
+use app\common\model\UserModel;
+use think\Db;
+use app\common\logic\PledgeLogic;
+
+
+//质押抵扣
+class Pledge extends Api
+{
+
+      protected string $lan = '';
+
+      public function _initialize()
+      {
+            parent::_initialize();
+            $this->lan = $this->request->getLan();
+      }
+
+      //质押列表
+      public function list(ProductPledges $productPledges, PledgeLogic $pledgeLogic)
+      {     
+            $type_id = $this->request->param('type_id', 0, 'intval');
+            if(empty($type_id)) $this->error(__("参数有误,无可用产品"));
+
+            $list = $productPledges
+                  ->where('status', $productPledges::Normal)
+                  ->where('to_lang', $this->lan)->where('type_id', $type_id)
+                  ->field('id,title,day_num,income_reta,product_id')
+                  ->order('weigh desc')
+                  ->paginate($this->pageSize);
+
+            $list = $pledgeLogic::getByProductIdList($list, $this->lan);  
+            $this->success('', $list);
+      }
+
+
+      /*
+      * 质押详情
+      */
+      public function detail(ProductPledges $productPledges, ProductLists $productList)
+      {
+            $id = $this->request->param('id', 0, 'intval');
+            if(empty($id)) $this->error(__("参数有误,无可用产品"));
+            //质押详情
+            $pledges = $productPledges::get($id);
+            if (!empty($pledges)) {
+                  $pledges->product_list = $productList::getBySynthesisProduct($pledges->product_id, $this->lan);
+            }
+            $this->success('', $pledges);
+      }
+
+      /*
+      * 持有商品列表
+      */
+      public function holdProductList(PledgeLogic $pledgeLogic)
+      {
+            $product_id = $this->request->param('product_id', 0, 'intval');
+            if(empty($product_id)) $this->error(__("参数有误,无可用产品"));
+            $pledges = $pledgeLogic::getHoldProductList($this->auth->id, $product_id);
+            
+            $this->success('', $pledges);
+      }
+
+      /*
+      * 质押存储
+      */
+      public function create( ProductPledges $productPledges, PledgeLogic $pledgeLogic)
+      {
+        $pledge_id  = $this->request->post('pledge_id', 0, 'intval');
+        $order_no   = $this->request->post('order_no/a', '');
+        if(empty($pledge_id) || empty($order_no)) $this->error(__("参数有误,无可用产品"));
+
+        $pledge = $productPledges::get($pledge_id);
+        if (empty($pledge)) $this->error(__("合成活动不存在"));
+        if (empty($pledge->status) )$this->error(__("合成活动已结束"));
+
+        Db::startTrans();
+        try {
+          
+            // 质抵押订单 $this->auth->id
+            $pledgeLogic::setPledgeOrder($pledge, $order_no, 1275);
+
+            // $synthesis->num += $num;
+            // $synthesis->save();
+            // 提交事务
+            Db::commit();
+        } catch (Exception $e) {
+            // 回滚事务
+            Db::rollback();
+            $this->error($e->getMessage(), null, $e->getCode());
+        }
+        $this->success('ok');
+      }
+   
+
+    
+
+   
+
+
+   
+ 
+}

+ 2 - 0
application/api/controller/Product.php

@@ -85,7 +85,9 @@ class Product extends Api
             ->paginate($this->pageSize);
         $this->success('', $list);
     }
+ 
 
+    
 
 
 }

+ 8 - 10
application/api/controller/Synthesis.php

@@ -6,12 +6,11 @@ namespace app\api\controller;
 use app\common\controller\Api;
 use app\common\model\ProductLists;
 use app\common\model\ProductOrder;
-use app\common\model\Synthesis as SynthesisModel;
+use think\Db;
 use Exception;
 use app\api\logic\WelfareLoginc;
 use app\common\model\UserModel;
-use think\Db;
-use think\Log;
+use app\common\model\Synthesis as SynthesisModel;
 
 
 //合成管理
@@ -29,11 +28,11 @@ class Synthesis extends Api
     public function list(SynthesisModel $synthesis)
     {
         $list = $synthesis->alias('a')
-        ->join("product_list b", "a.product_id = b.id", "left")
-        ->field('a.id,a.title,a.start_time,a.end_time,b.thum as img_url')
-        ->where('a.status', $synthesis::Normal)->where('a.to_lang', $this->lan)
-        ->order('a.weigh desc')
-        ->paginate($this->pageSize);
+            ->join("product_list b", "a.product_id = b.id", "left")
+            ->field('a.id,a.title,a.start_time,a.end_time,b.thum as img_url')
+            ->where('a.status', $synthesis::Normal)->where('a.to_lang', $this->lan)
+            ->order('a.weigh desc')
+            ->paginate($this->pageSize);
         $this->success('', $list);
     }
 
@@ -67,7 +66,7 @@ class Synthesis extends Api
     /*
      * 合成
      */
-    public function create( ProductOrder $productOrder, UserModel $userModel)
+    public function create(ProductOrder $productOrder, UserModel $userModel)
     {
         $id         = $this->request->post('id', 0, 'intval');
         $num        = $this->request->post('num', 0, 'intval');
@@ -88,7 +87,6 @@ class Synthesis extends Api
             $productOrder->setSynthesisOrder($synthesis, $productList, $num, $this->auth->id);
 
             // 添加新订单
-            //$result = WelfareLoginc::setUserWelfareLos($this->auth->id, $synthesis->product_id, $num, time(), $this->lan, $productOrder::Synthesi);
             WelfareLoginc::setUserProductOrder($num, 0, $synthesis->id, 0, $synthesis->product_id, $this->auth->id, $productOrder::Synthesi);
 
             $synthesis->num += $num;

+ 1 - 0
application/api/lang/en.php

@@ -33,6 +33,7 @@ return [
     '已转让'                                                                      => 'Consigned',
     '已提货'                                                                      => 'Gifted',
     '已取消'                                                                      => 'Cancelled',
+    '质押'                                                                        => 'Pledge', 
     '物流运费'                                                                    => 'Logistics freight',
     '茶宝标记激活'                                                                => 'Tea treasure mark activation',
     '暂未开启'                                                                    => 'Not yet enabled',

+ 1 - 0
application/api/lang/zh-cn.php

@@ -122,6 +122,7 @@ return [
     '已转让'                                                                      => '已寄售',
     '已提货'                                                                      => '已提货',
     '已取消'                                                                      => '已取消',
+    '质押'                                                                        => '质押',        
     '物流运费'                                                                    => '物流运费',
     '茶宝标记激活'                                                                => '茶宝标记激活',
     '不能购买自己寄售的商品'                                                       => '不能购买自己寄售的商品',

+ 56 - 0
application/common/logic/PledgeLogic.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace app\common\logic;
+
+use Exception;
+use think\Env;
+use think\Error;
+use think\Loader ;
+use app\common\model\UserPledge;
+use app\common\model\ProductPledges;
+
+class PledgeLogic
+{
+  
+    //获取产品信息 user_pledge
+    public  static function getByProductIdList(object $list, string $lan = 'zh')
+    {
+        $model  = Loader::model('ProductLists');
+        foreach ($list as &$item) {
+            $item['product_list'] = $model->whereIn('id', $item->product_id)->column('id,thum,'.$lan.'_name as name');
+        }
+        return $list;
+    }
+
+    /*
+     * 获取产品信息
+     */
+    public static function getHoldProductList($user_id, $product_id)
+    {
+        $model  = Loader::model('ProductOrder');
+        return $model::where('user_id', $user_id)->where('product_id', $product_id)->where('status', $model::Paid)->field('id,order_no')->select();
+      
+    }
+
+    //添加质抵押订单
+    public static function setPledgeOrder(object $pledge, array $order_no, int $user_id)
+    {
+        $model  = Loader::model('ProductOrder');
+        $order  = $model::where('user_id', $user_id)->whereIn('order_no', $order_no)->select();
+        if(empty($order) || count($order) != count($order_no))  throw new Exception('订单不存在');
+        $pledge_num = 1;
+        if($pledge->type_id == ProductPledges::Single){
+            $pledge_num = count($order);
+        }
+      
+        //添加订单 
+        Loader::model('UserPledge')::setPledgeData($user_id, $pledge->id, $pledge->product_id, $pledge->day_num, $pledge_num);
+   
+        //修改状态
+        return $model->whereIn('order_no', $order_no)->setField('status', $model::Freeze);
+
+
+    }
+
+
+}

+ 0 - 452
application/common/logic/ScanLogic.php

@@ -1,452 +0,0 @@
-<?php
-
-namespace app\common\logic;
-
-use app\common\library\Log;
-use app\common\model\LedgerWalletModel;
-use app\common\model\OfflineRechargeRecordModel;
-use app\common\model\OfflineRechargeVerifyModel;
-use app\common\model\ParametersModel;
-use app\common\model\UserModel;
-use app\common\model\ServersModel;
-use Exception;
-use fast\Action;
-use fast\Asset;
-use fast\Http;
-use fast\RechargeOrderType;
-use fast\RechargeStatus;
-use fast\RechargeType;
-use think\Db;
-use think\Env;
-use think\Error;
-use think\Model;
-
-class ScanLogic
-{
-
-    /**
-     * 币安API地址
-     * @var string
-     */
-    private string $bscApiUrl = '';
-
-    /**
-     * 币安链USDT地址
-     * @var string
-     */
-    private string $bscUSDAddress = '0x55d398326f99059ff775485246999027b3197955';
-
-    /**
-     * 平台收款钱包地址
-     * @var string
-     */
-    private string $collectionAddress = '';
-
-    /**
-     * 最少确认节点数量
-     * @var int
-     */
-    private int $minConfirmations = 12;
-
-    /**
-     * value的放大比例 固定为: 10的18次方
-     * @var int
-     */
-    private string $valueScale = '1000000000000000000';
-
-    public function __construct()
-    {
-        $apikey = (new ParametersModel)->getValue('bscApiKey');
-        if (empty($apikey)) {
-            dump("读取币安apikey错误");
-            exit(1);
-        }
-
-        $collectionAddress = Env::get('rental.pay_address');
-        if (empty($collectionAddress)) {
-            dump("读取平台收款钱包地址错误");
-            exit(1);
-        }
-
-        $this->collectionAddress = strtolower($collectionAddress);
-        $this->bscApiUrl = "https://api.bscscan.com/api?module=account&action=tokentx&contractaddress=$this->bscUSDAddress&page=1&offset=10000&endblock=99999999&apikey=$apikey&address=";
-        $this->hashStatusUrl = "https://api.bscscan.com/api?module=transaction&action=gettxreceiptstatus&apikey=$apikey&txhash=";
-
-    }
-
-    public function scanRechargeOrders()
-    {
-        $recharges = (new OfflineRechargeRecordModel())->where([
-            'type'   => RechargeType::CashFromChain,
-            'status' => RechargeStatus::StatusUnAuth,
-        ])->order('id DESC')->limit(20)->select();
-        if (!is_null($recharges)) {
-            foreach ($recharges as $v) {
-                $vArr = $v->toArray();
-                // 请求api
-                $result = $this->verifyTxHash($vArr);
-
-                // 记录执行记录
-                (new OfflineRechargeVerifyModel())->insert([
-                    'order_id'    => $vArr['id'],
-                    'user_id'     => $vArr['user_id'],
-                    'result'      => $result == '',
-                    'fail_reason' => $result,
-                    'create_time' => time(),
-                ]);
-            }
-        }
-
-    }
-
-    /*
-     * 扫描收款地址
-     */
-    public function scanCollectionAddress()
-    {
-        $max_block_number = (new OfflineRechargeRecordModel())
-            ->max('block_number');
-        $max_block_number ++;
-
-        $url = $this->bscApiUrl . $this->collectionAddress . "&startblock=" . $max_block_number;
-        //$user['address'] = strtolower($user['address']); // 转小写
-        // 发起请求
-        $body = Http::get($url);
-        if (empty($body)) {
-            return "api返回内容为空";
-        }
-
-        // 转成数组
-        $rsArr = json_decode($body, true);
-        if (empty($rsArr) || !is_array($rsArr)) {
-            return "api返回数据异常";
-        }
-
-        if ($rsArr['status'] != '1') {
-            return 'api返回status不为1,错误信息:' . $rsArr['message'];
-        }
-
-        $errMsg = '';
-        $new_block_number = 0;
-        $all_user_address = [];//钱包地址为键值的所有会员的数组
-        $orderInfo = [];
-        // 查询匹配交易列表
-        (new Log())->info('开始匹配交易');
-        (new Log())->info($rsArr['result']);
-        foreach ($rsArr['result'] as $v) {
-            $errMsg = '';
-            if ($v['to'] != $this->collectionAddress) {
-                $new_block_number = $v['blockNumber'];
-                (new Log())->info('收款地址不是平台地址:' . $v['hash']);
-                continue;//转载地址不是收款地址的数据直接跳过不处理
-            }
-
-            if ($v['contractAddress'] != $this->bscUSDAddress) {
-//                $errMsg = '币种错误: ' . $v['contractAddress'];
-                $new_block_number = $v['blockNumber'];
-                continue;//交易币种的合约地址不是指定代币,不处理。一般币种为USDT
-            }
-
-            $orderInfo['amount'] = bcdiv($v['value'], $this->valueScale, 6);//交易金额
-            if(!($orderInfo['amount'] > 0)){
-                $new_block_number = $v['blockNumber'];
-                continue;//交易金额必须大于0
-            }else{
-                $minUsdt = (new ParametersModel)->getValue('minUsdt') ?? '0';//最小购买金额
-                if($minUsdt > $orderInfo['amount']){
-                    $new_block_number = $v['blockNumber'];
-                    $errMsg = '交易金额必须大于系统最小购买金额:' . $v['hash'];
-                    (new Log())->info('交易金额必须大于系统最小购买金额:' . $v['hash']);
-                    continue;//交易金额必须大于系统最小购买金额
-                }
-            }
-
-            $check_user = (new UserModel())->getByAddress(strtolower($v['from']));
-            if(empty($check_user)){
-                $new_block_number = $v['blockNumber'];
-                (new Log())->info('转账地址不是平台用户账号:' . $v['hash']);
-                continue;//转账地址不是平台账号的数据不处理
-            }
-
-            $orderInfo['user_id'] = $check_user['id'];
-
-//            if(empty($all_user_address)){
-//                $all_user_address = (new UserModel())->getAllAddress();
-//            }
-//            if(!(isset($all_user_address[$v['from']]) || isset($all_user_address[strtolower($v['from'])]))){
-//                $new_block_number = $v['blockNumber'];
-//                (new Log())->info('转账地址不是平台用户账号:' . $v['hash']);
-//                continue;//转账地址不是平台账号的数据不处理
-//            }else{
-//                if(isset($all_user_address[$v['from']])){
-//                    $orderInfo['user_id'] = $all_user_address[$v['from']];
-//                }else{
-//                    $orderInfo['user_id'] = $all_user_address[strtolower($v['from'])];
-//                }
-//            }
-
-            $rsData = $this->getHashStatus($v['hash']);
-            if($rsData['status'] == 0){//当前哈希交易状态为失败,跳出循环,等待下次判断,若真是失败交易,过几分钟后,这个数据不会再出现,这个接口拿到的都是有效的交易数据
-                break;
-            }
-
-            //判断当前hash是否存在于充值记录
-            $check_recharge_record = (new OfflineRechargeRecordModel())
-                ->where('tx_hash', $v['hash'])
-                ->find();
-            if(empty($check_recharge_record)){//充值记录表中没有当前记录,则补充插入
-                (new Log())->info('补单:' . $v['hash']);
-                $orderInfo['order_type'] = RechargeOrderType::RentalPower;//订单类型
-                //判断是否服务器购买订单
-                $servers_list = (new ServersModel())
-                    ->field('id,title,price,power')
-                    ->select();
-                foreach ($servers_list as $item){
-                    if($item['price'] == $orderInfo['amount']){
-                        $orderInfo['order_type'] = RechargeOrderType::RentalServer;//订单类型
-                    }
-                }
-                try {
-                    $orderInfo['id'] = (new OfflineRechargeRecordModel())->createRecord(RechargeType::CashFromChain, $v['hash'], $orderInfo['user_id'], $orderInfo['amount'], RechargeStatus::StatusUnAuth, $orderInfo['order_type'], $v['blockNumber'], '自动补单');
-                } catch (Exception $e) {
-                    (new Log())->error('自动补单失败:' . $e);
-                    break;
-                }
-            }else if($check_recharge_record['status'] == 1){
-                $new_block_number = $v['blockNumber'];
-                continue;//当前交易已处理
-            }else{
-                $orderInfo = $check_recharge_record->toArray();
-                if (bccomp($v['value'], bcmul($check_recharge_record['amount'], $this->valueScale, 6)) !== 0) {
-                    $errMsg = '金额错误: ' . $v['value'] . ',' . $check_recharge_record['amount'];
-                    (new Log())->info('金额错误: ' . $v['value'] . ',' . $check_recharge_record['amount']);
-                }
-            }
-            $orderInfo['block_number'] = $v['blockNumber'];
-
-            // 校验正确,更新订单信息为成功,并触发各项收益的发放
-            $updateErrMsg = $this->updateOrderStatus($orderInfo, $errMsg == '');
-            if (!empty($updateErrMsg)) {
-                $errMsg .= '|' . $updateErrMsg;
-            }
-
-            // 记录执行记录
-            (new OfflineRechargeVerifyModel())->insert([
-                'order_id'    => $orderInfo['id'],
-                'user_id'     => $orderInfo['user_id'],
-                'result'      => $errMsg == '',
-                'fail_reason' => $errMsg,
-                'create_time' => time(),
-            ]);
-        }
-
-        if($new_block_number > $max_block_number){
-            //更新最新一条充值记录的区块为最新扫描过的区块
-            $max_info = (new OfflineRechargeRecordModel())
-                ->order('id desc')
-                ->find();
-            $max_info->save([
-                'block_number' => $new_block_number
-            ]);
-        }
-        return $errMsg;
-    }
-
-    private function verifyTxHash(array $orderInfo): string
-    {
-
-        $user = (new UserModel())->getById($orderInfo['user_id']);
-        if (empty($user)) {
-            return "用户不存在,ID:" . $orderInfo['user_id'];
-        }
-
-        $rsData = $this->getHashStatus($orderInfo['tx_hash']);
-        if($rsData['status'] == 0){
-            return $rsData['msg'];
-        }
-
-        $user['address'] = strtolower($user['address']); // 转小写
-        $url             = $this->bscApiUrl . $user['address'];
-        // 发起请求
-        $body = Http::get($url);
-        if (empty($body)) {
-            return "api返回内容为空";
-        }
-
-        // 转成数组
-        $rsArr = json_decode($body, true);
-        if (empty($rsArr) || !is_array($rsArr)) {
-            return "api返回数据异常";
-        }
-
-        if ($rsArr['status'] != '1') {
-            return 'api返回status不为1,错误信息:' . $rsArr['message'];
-        }
-
-        $errMsg = '';
-        // 查询匹配交易列表
-        foreach ($rsArr['result'] as $v) {
-            // 跳过hash不匹配或确认区块不足的记录
-            if ($v['hash'] != $orderInfo['tx_hash'] || $v['confirmations'] < $this->minConfirmations) {
-                continue;
-            }
-
-            // 开始校验
-            if ($v['from'] != $user['address']) {
-                $errMsg = 'from地址不是用户地址,from: ' . $v['from'];
-            } else if ($v['to'] != $this->collectionAddress) {
-                $errMsg = 'to地址不是平台收款地址,to: ' . $v['to'];
-            } else if ($v['contractAddress'] != $this->bscUSDAddress) {
-                $errMsg = '币种错误: ' . $v['contractAddress'];
-            } else if (bccomp($v['value'], bcmul($orderInfo['amount'], $this->valueScale, 6)) !== 0) {
-                $errMsg = '金额错误: ' . $v['value'] . ',' . $orderInfo['amount'];
-            }
-            break;
-        }
-
-        // 校验正确,更新订单信息为成功,并触发各项收益的发放
-        $updateErrMsg = $this->updateOrderStatus($orderInfo, $errMsg == '');
-        if (!empty($updateErrMsg)) {
-            $errMsg .= '|' . $updateErrMsg;
-        }
-        return $errMsg;
-    }
-
-
-    private function updateOrderStatus(array $orderInfo, bool $verify): string
-    {
-        if (!$verify) { // 验证失败的处理
-            try {
-                (new Log())->error('充值交易验证失败: ' . $verify);
-
-                (new OfflineRechargeRecordModel())->updateOrderStatus($orderInfo['id'], RechargeStatus::StatusAuthFail, $orderInfo['block_number']);
-            } catch (Exception $e) {
-                return $e->getMessage();
-            }
-            return '';
-        }
-        if($orderInfo['order_type'] == 1){
-            //算力租赁订单处理
-            // 查询兑换比例
-            $usdtToPower      = (new ParametersModel)->getValue('usdtToPowerRate');
-            $usdtToPowerFloat = floatval($usdtToPower);
-            if (is_null($usdtToPower) || $usdtToPowerFloat <= 0) {
-                return '获取USDT兑换算力的比例失败';
-            }
-
-            $uid   = $orderInfo['user_id'];
-            $fee   = $orderInfo['amount'];
-            $power = bcmul($fee, $usdtToPowerFloat, 6); // 该用户兑得的算力
-
-            // 启动事务
-            Db::startTrans();
-            try {
-                // 更新总算力和账变
-                (new LedgerWalletModel)->changeWalletAccount($uid, Asset::POWER, $power, Action::PowerRentalPower, $orderInfo['id']);
-
-                // 更新服务器算力,不账变
-                (new LedgerWalletModel)->changeWalletOnly($uid, Asset::RENTAL_POWER, $power);
-
-                // 更新自己(有效会员时间)和所有上级的信息(有效直推人数和团队总算力)
-                (new UserModel())->updateForRental($uid, $power);
-
-                // 发放直推USDT收益
-                (new LedgerWalletModel)->sendUsdtProfit($uid, $fee);
-
-                // 发放直推算力收益
-                (new LedgerWalletModel)->sendDirectProfit($uid, $power);
-
-                // 发代数收益
-                (new LedgerWalletModel)->sendGenerateProfit($uid, $fee);
-
-                // 发放见点奖
-                (new LedgerWalletModel)->sendRegBonus($uid, $fee);
-
-                // 更新购买(充值)记录
-                (new OfflineRechargeRecordModel())->updateOrderStatus($orderInfo['id'], RechargeStatus::StatusAuthSuccess, 0, $power);
-
-                // 提交事务
-                Db::commit();
-            } catch (Exception $e) {
-                // 回滚事务
-                Db::rollback();
-                return $e->getMessage();
-            }
-        }else{
-            //服务器购买订单处理
-            $servers_info = (new ServersModel())
-                ->where('price', $orderInfo['amount'])
-                ->find();
-            if(empty($servers_info)){
-                return '支付价格和服务器价格不匹配';
-            }
-
-            // 启动事务
-            Db::startTrans();
-            try {
-                // 更新服务器算力,不账变
-                (new LedgerWalletModel)->changeWalletOnly($orderInfo['user_id'], Asset::SERVER_POWER, $servers_info['power']);
-
-                // 发放服务器市场推荐相关收益
-                //(new LedgerWalletModel)->sendMarketBonus($orderInfo['user_id'], $servers_info);
-
-                // 更新购买(充值)记录
-                (new OfflineRechargeRecordModel())->updateOrderStatus($orderInfo['id'], RechargeStatus::StatusAuthSuccess, 0, $servers_info['power']);
-
-                // 提交事务
-                Db::commit();
-            } catch (Exception $e) {
-                // 回滚事务
-                Db::rollback();
-                return $e->getMessage();
-            }
-
-        }
-        return '';
-    }
-
-    /**
-     * 获取哈希地址成功状态
-     *
-     * api接口返回数据格式
-     * {
-            "status": "1",
-            "message": "OK",
-            "result": {
-                "status": "1"
-            }
-        }
-     * @param $orderInfo
-     * @return array|string
-     */
-    private function getHashStatus($tx_hash):array
-    {
-        $rsData['status'] = 0;//0 失败,1 成功
-        $rsData['msg'] = '';
-        $hashStatusUrl = $this->hashStatusUrl . $tx_hash;//接口地址
-        $body = Http::get($hashStatusUrl);
-        if (empty($body)) {
-            $rsData['msg'] = '状态api返回内容为空';
-            return $rsData;
-        }
-        // 转成数组
-        $rsArr = json_decode($body, true);
-        if (empty($rsArr) || !is_array($rsArr)) {
-            $rsData['msg'] = '状态api返回数据异常';
-            return $rsData;
-        }
-
-        if ($rsArr['status'] != '1') {
-            $rsData['msg'] = '状态api返回status不为1,当前值为:' . $rsArr['status'];
-            return $rsData;
-        }
-
-        if ($rsArr['result']['status'] != 1) {
-            $rsData['msg'] = '状态api返回result中的status不为1,当前值为:' . $rsArr['result']['status'];
-            return $rsData;
-        }
-
-        $rsData['status'] = 1;
-        return $rsData;
-    }
-}

+ 0 - 41
application/common/model/EtcWithdrawRecordModel.php

@@ -1,41 +0,0 @@
-<?php
-
-namespace app\common\model;
-
-use fast\Asset;
-use fast\Http;
-use fast\Random;
-use think\Cache;
-use think\Log;
-use think\Model;
-use think\Request;
-class EtcWithdrawRecordModel extends Model
-{
-
-    protected $name = "etc_withdraw_record";
-
-    /*
-     * 获取ETC的USDT价格
-     */
-    public function getEtcPrice(){
-        $etc_price = Cache::remember('etc_price', function(){
-            $etc_usdt_price = 16;
-            $url = "https://www.binance.com/api/v1/klines?symbol=ETCUSDT&limit=1&interval=3m";
-            $body = Http::get($url);
-            if (empty($body)) {
-                dump('获取ETC价格接口返回为空');
-                Log::info('拨币时:获取ETC价格接口返回为空');
-                return "获取ETC价格接口返回为空";
-            }
-            // 转成数组
-            $rsArr = json_decode($body, true);
-            $etc_usdt_price = $rsArr[0][2];
-
-            return $etc_usdt_price;
-        }, 36000);
-        if(empty($etc_price)){
-            $etc_price = 16;
-        }
-        return $etc_price;
-    }
-}

+ 0 - 12
application/common/model/LedgerPowerChangeModel.php

@@ -1,12 +0,0 @@
-<?php
-
-namespace app\common\model;
-
-use think\Model;
-
-class LedgerPowerChangeModel extends Model
-{
-
-    protected $name = "ledger_power_change";
-
-}

+ 12 - 0
application/common/model/LedgerTeacChangeModel.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class LedgerTeacChangeModel extends Model
+{
+    // LedgerPowerChangeModel
+    protected $name = "ledger_teac_change";
+
+}

+ 7 - 4
application/common/model/ProductOrder.php

@@ -4,7 +4,6 @@ namespace app\common\model;
 
 use think\Model;
 use Exception;
-use Google\Service\Storage\Resource\Objects;
 
 class ProductOrder extends Model
 {
@@ -26,14 +25,16 @@ class ProductOrder extends Model
         'update_time_text'
     ];
 
-
+    //状态
     const Ordered           = 0;
     const Paid              = 1;
     const Transferred       = 2;
     const Shipped           = 3;
     const Cancelled         = 4;
     const Closure           = 5;
+    const Freeze            = 6; //冻结
 
+    //类型
     const Popular           = 0; //热销
     const Transfer          = 1; //转让
     const Giveaway          = 2; //赠送
@@ -52,6 +53,7 @@ class ProductOrder extends Model
         self::Shipped           => '提货',
         self::Cancelled         => '已取消',
         self::Closure           => '关闭',
+        self::Freeze            => '质押',
     ];
 
 
@@ -168,7 +170,7 @@ class ProductOrder extends Model
     public static function getStatusList()
     {
         return [self::Ordered => __('已下单'), self::Paid  => __('已付款'), self::Transferred => __('已转让'), 
-        self::Shipped => __('提货'), self::Cancelled  => __('已取消'), self::Closure => __('关闭')];
+        self::Shipped => __('提货'), self::Cancelled  => __('已取消'), self::Closure => __('关闭'), self::Freeze => __('质押')];
     }
 
     //全部类型: 
@@ -180,7 +182,8 @@ class ProductOrder extends Model
             ['type_id'=>self::Giveaway, 'status'=> self::Closure, 'text' => __('已赠送')],
             ['type_id'=>self::Transfer, 'status'=> self::Closure, 'text' => __('已转让')], 
             ['type_id'=>self::Popular, 'status' => self::Shipped, 'text' => __('已提货')],
-            ['type_id'=>self::Transfer, 'status'=> self::Cancelled,'text' => __('已取消')]
+            ['type_id'=>self::Transfer, 'status'=> self::Cancelled,'text' => __('已取消')],
+            ['type_id'=>self::Popular, 'status' => self::Freeze, 'text' => __('质押')],
         ];
     }
 

+ 86 - 0
application/common/model/ProductPledges.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+
+class ProductPledges extends Model
+{
+
+    // 产品质押表
+    protected $table = 'product_pledge';
+    
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+
+    // 定义时间戳字段名
+    protected $createTime = 'create_time';
+    protected $updateTime = 'update_time';
+    protected $deleteTime = false;
+
+    // 追加属性
+    protected $append = [
+        'to_lang_text',
+        'create_time_text',
+        'update_time_text'
+    ];
+    
+    const Stop           = 0;
+    const Normal         = 1;
+
+    //类型
+    const Single         = 1;//单品
+    const Combin         = 2; //组合
+
+
+ 
+
+
+    protected static function init()
+    {
+        self::afterInsert(function ($row) {
+            $pk = $row->getPk();
+            $row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
+        });
+    }
+
+    public function getToLangList()
+    {
+        return ['en' => __('En'), 'zh' => __('Zh')];
+    }
+
+
+    public function getToLangTextAttr($value, $data)
+    {
+        $value = $value ? $value : (isset($data['to_lang']) ? $data['to_lang'] : '');
+        $list = $this->getToLangList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+
+    public function getCreateTimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : (isset($data['create_time']) ? $data['create_time'] : '');
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+
+    public function getUpdateTimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : (isset($data['update_time']) ? $data['update_time'] : '');
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+    protected function setCreateTimeAttr($value)
+    {
+        return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
+    }
+
+    protected function setUpdateTimeAttr($value)
+    {
+        return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
+    }
+
+
+}

+ 68 - 0
application/common/model/UserPledge.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace app\common\model;
+
+use fast\Asset;
+use fast\Http;
+use fast\Random;
+use think\Cache;
+use think\Log;
+use think\Model;
+use think\Request;
+
+class UserPledge extends Model
+{
+
+    protected $name = "user_pledge";
+
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+
+    // 定义时间戳字段名
+    protected $createTime = 'create_time';
+    protected $updateTime = 'update_time';
+    protected $deleteTime = false;
+
+    // 追加属性
+    protected $append = [
+        'create_time_text',
+        'update_time_text'
+    ];
+
+
+    public static function setPledgeData($user_id, $pledge_id, $product_id, $day_num, $num)
+    {
+        return self::create([
+            'user_id'   => $user_id,
+            'pledge_id' => $pledge_id,
+            'product_id' => $product_id,
+            'day_num'    => $day_num,
+            'num'        => $num
+        ]);
+    }
+
+
+    public function getCreateTimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : (isset($data['create_time']) ? $data['create_time'] : '');
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+
+    public function getUpdateTimeTextAttr($value, $data)
+    {
+        $value = $value ? $value : (isset($data['update_time']) ? $data['update_time'] : '');
+        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
+    }
+
+    protected function setCreateTimeAttr($value)
+    {
+        return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
+    }
+
+    protected function setUpdateTimeAttr($value)
+    {
+        return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
+    }
+
+}

+ 64 - 0
public/assets/js/backend/product/pledges.js

@@ -0,0 +1,64 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'product/pledges/index' + location.search,
+                    add_url: 'product/pledges/add',
+                    edit_url: 'product/pledges/edit',
+                    del_url: 'product/pledges/del',
+                    multi_url: 'product/pledges/multi',
+                    import_url: 'product/pledges/import',
+                    table: 'product_pledge',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'weigh',
+                fixedColumns: true,
+                fixedRightNumber: 1,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'title', title: __('Title'), operate: 'LIKE'},
+                        { field: 'thum', title: __('Thum'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
+                        {field: 'type_id', title: __('Type_id'), searchList: {"1":__('单品'),"2":__('组合')}, formatter: Table.api.formatter.normal},
+                        {field: 'to_lang', title: __('To_lang'), searchList: {"en":__('En'),"zh":__('Zh')}, formatter: Table.api.formatter.normal},
+                        {field: 'day_num', title: __('Day_num')},
+                        {field: 'income_reta', title: __('Income_reta'), operate: false},
+                        {field: 'weigh', title: __('Weigh'), operate: false},
+                        {field: 'status', title: __('Status'), searchList: {0:__('关闭'),1 :__('正常')}, formatter: Table.api.formatter.toggle},
+                        {field: 'create_time', title: __('Create_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
+                        {field: 'update_time', title: __('Update_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+          
+
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});