Browse Source

奖池礼物重建

lizhen_gitee 1 year ago
parent
commit
dd88dc6b10

+ 58 - 107
application/admin/controller/egg/Gift.php

@@ -3,21 +3,15 @@
 namespace app\admin\controller\egg;
 
 use app\common\controller\Backend;
-use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
-use PhpOffice\PhpSpreadsheet\Reader\Csv;
-use PhpOffice\PhpSpreadsheet\Reader\Xls;
-use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
-use think\Exception;
-use think\exception\PDOException;
-
+use think\Db;
 /**
- *
+ * 奖池礼物管理
  *
  * @icon fa fa-circle-o
  */
 class Gift extends Backend
 {
-    protected $searchFields = 'gift_id,gift_name';
+    
     /**
      * Gift模型对象
      * @var \app\admin\model\egg\Gift
@@ -33,100 +27,7 @@ class Gift extends Backend
 
     public function import()
     {
-        $file = $this->request->request('file');
-        if (!$file) {
-            $this->error(__('Parameter %s can not be empty', 'file'));
-        }
-        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
-        if (!is_file($filePath)) {
-            $this->error(__('No results were found'));
-        }
-        //实例化reader
-        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
-        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
-            $this->error(__('Unknown data format'));
-        }
-        if ($ext === 'csv') {
-            $file = fopen($filePath, 'r');
-            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
-            $fp = fopen($filePath, "w");
-            $n = 0;
-            while ($line = fgets($file)) {
-                $line = rtrim($line, "\n\r\0");
-                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
-                if ($encoding != 'utf-8') {
-                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
-                }
-                if ($n == 0 || preg_match('/^".*"$/', $line)) {
-                    fwrite($fp, $line . "\n");
-                } else {
-                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
-                }
-                $n++;
-            }
-            fclose($file) || fclose($fp);
-
-            $reader = new Csv();
-        } elseif ($ext === 'xls') {
-            $reader = new Xls();
-        } else {
-            $reader = new Xlsx();
-        }
-
-        //加载文件
-        $insert = [];
-        try {
-            if (!$PHPExcel = $reader->load($filePath)) {
-                $this->error(__('Unknown data format'));
-            }
-            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
-            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
-            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
-            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
-
-            // 获取奖池礼物表最后一条记录的ID
-            $lastId = $this->model->order('id','desc')->value('id');
-            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
-                $values = [];
-                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
-                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
-                    $values[] = is_null($val) ? '' : $val;
-                }
-
-                $giftInfo = \app\admin\model\gift\Gift::get($values[1]);
-                if(!$giftInfo) $this->error('礼物ID:'.$values[1].'未找到对应礼物');
-                for ($i = 0;$i<$values[2];$i++){
-                    $insert[] = [
-                        'Jackpot_id' => $values[0],
-                        'gift_id' => $values[1],
-                        'image' => $giftInfo['image'],
-                        'special' => $giftInfo['special'],
-                        'gift_name' => $giftInfo['name'],
-                        'price' => $giftInfo['price'],
-                        'prize_no' => ++$lastId
-                    ];
-                }
-            }
-        } catch (Exception $exception) {
-            $this->error($exception->getMessage());
-        }
-        if (!$insert) {
-            $this->error(__('No rows were updated'));
-        }
-
-        try {
-            $this->model->saveAll($insert);
-        } catch (PDOException $exception) {
-            $msg = $exception->getMessage();
-            if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {
-                $msg = "导入失败,包含【{$matches[1]}】的记录已存在";
-            };
-            $this->error($msg);
-        } catch (Exception $e) {
-            $this->error($e->getMessage());
-        }
-
-        $this->success();
+        parent::import();
     }
 
     /**
@@ -134,12 +35,15 @@ class Gift extends Backend
      * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
      * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
      */
+    
 
     /**
-     * 列表
+     * 查看
      */
     public function index()
     {
+        //当前是否为关联查询
+        $this->relationSearch = true;
         //设置过滤方法
         $this->request->filter(['strip_tags', 'trim']);
         if ($this->request->isAjax()) {
@@ -150,15 +54,62 @@ class Gift extends Backend
             list($where, $sort, $order, $offset, $limit) = $this->buildparams();
 
             $list = $this->model
-                ->where($where)
-                ->order($sort, $order)
-                ->paginate($limit);
+                    ->with(['eggjackpot'])
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->paginate($limit);
 
             $totalMoney = $this->model->where($where)->sum('price');
+            foreach ($list as $row) {
+                
+                $row->getRelation('eggjackpot')->visible(['name']);
+            }
+
             $result = array("total" => $list->total(), "rows" => $list->items(), "extend" => ['total_price' => $totalMoney]);
 
             return json($result);
         }
         return $this->view->fetch();
     }
+
+    /**
+     * 添加
+     */
+    public function add()
+    {
+        if ($this->request->isPost()) {
+            $gift_id    = $this->request->post('gift_id');
+            $jackpot_id = $this->request->post('jackpot_id');
+            $number     = $this->request->post('number');
+
+            $gift_info = Db::name('gift')->where('id',$gift_id)->find();
+            if(empty($gift_info)){
+                $this->error('不存在的礼物');
+            }
+
+            $data_all = [];
+
+            for($i=1;$i<=$number;$i++){
+                $one = [
+                    'gift_id' => $gift_id,
+                    'image'   => $gift_info['image'],
+                    'special' => $gift_info['special'],
+                    'gift_name' => $gift_info['name'],
+                    'Jackpot_id' => $jackpot_id,
+                    'prize_no' => 0,
+                    'price' => $gift_info['price'],
+                    'is_use' => 0,
+                ];
+                $data_all[] = $one;
+            }
+
+            Db::startTrans();
+            $rs = Db::name('egg_gift')->insertAll($data_all);
+            Db::commit();
+
+            $this->success('添加完成');
+        }
+        return $this->view->fetch();
+    }
+
 }

+ 12 - 10
application/admin/lang/zh-cn/egg/gift.php

@@ -1,14 +1,16 @@
 <?php
 
 return [
-    'Gift_id'    => '礼物ID',
-    'Image'      => '图片',
-    'Special'    => '特效',
-    'Gift_name'  => '礼物名称',
-    'Jackpot_id' => '奖池ID',
-    'Prize_no'   => '中奖编号',
-    'Price'      => '价值',
-    'Is_use'     => '是否被抽走',
-    'Is_use 1'   => '是',
-    'Is_use 0'   => '否'
+    'Gift_id'         => '礼物ID',
+    'Image'           => '图片',
+    'Special'         => '特效',
+    'Gift_name'       => '礼物名称',
+    'Jackpot_id'      => '奖池ID',
+    'Prize_no'        => '中奖编号',
+    'Price'           => '价值',
+    'Is_use'          => '是否被抽走',
+    'Is_use 1'        => '是',
+    'Is_use 0'        => '否',
+    'Updatetime'      => '更新时间',
+    'Eggjackpot.name' => '奖池名称'
 ];

+ 11 - 7
application/admin/model/egg/Gift.php

@@ -8,28 +8,28 @@ use think\Model;
 class Gift extends Model
 {
 
+    
 
-
-
+    
 
     // 表名
     protected $name = 'egg_gift';
-
+    
     // 自动写入时间戳字段
-    protected $autoWriteTimestamp = false;
+    protected $autoWriteTimestamp = 'int';
 
     // 定义时间戳字段名
     protected $createTime = false;
-    protected $updateTime = false;
+    protected $updateTime = 'updatetime';
     protected $deleteTime = false;
 
     // 追加属性
     protected $append = [
         'is_use_text'
     ];
+    
 
-
-
+    
     public function getIsUseList()
     {
         return ['1' => __('Is_use 1'), '0' => __('Is_use 0')];
@@ -46,4 +46,8 @@ class Gift extends Model
 
 
 
+    public function eggjackpot()
+    {
+        return $this->belongsTo('app\admin\model\egg\Jackpot', 'Jackpot_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
 }

+ 6 - 89
application/admin/view/egg/gift/add.html

@@ -3,74 +3,24 @@
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Gift_id')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-gift_id" data-rule="required" data-source="gift/Gift/index" class="form-control selectpage" name="row[gift_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-image" class="form-control" size="50" name="row[image]" type="text">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="faupload-image" class="btn btn-danger faupload" data-input-id="c-image" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
-                    <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
-                </div>
-                <span class="msg-box n-right" for="c-image"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="p-image"></ul>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Special')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-special" class="form-control" size="50" name="row[special]" type="text">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="faupload-special" class="btn btn-danger faupload" data-input-id="c-special" data-mimetype="svga" data-multiple="false" data-preview-id="p-special"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
-                    <span><button type="button" id="fachoose-special" class="btn btn-primary fachoose" data-input-id="c-special" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
-                </div>
-                <span class="msg-box n-right" for="c-special"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="p-special"></ul>
-            <div style="padding:2px 33px;margin-top:10px;width:120px;color:#fff3f6;cursor:pointer;background-color: #00A000;border-radius: 2px;" onclick="play()">播放动画</div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Gift_name')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-gift_name" class="form-control" name="row[gift_name]" type="text">
+            <input id="c-gift_id" data-rule="required" data-source="gift/gift/index" data-format-item="{name}-[{id}]" class="form-control selectpage" name="gift_id" type="text" value="">
         </div>
     </div>
+
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Jackpot_id')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-Jackpot_id" data-rule="required" data-source="egg/Jackpot/index" class="form-control selectpage" name="row[Jackpot_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Prize_no')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-prize_no" class="form-control" name="row[prize_no]" type="number">
+            <input id="c-Jackpot_id" data-rule="required" data-source="egg/jackpot/index" class="form-control selectpage" name="jackpot_id" type="text" value="">
         </div>
     </div>
+
     <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>
+        <label class="control-label col-xs-12 col-sm-2">数量:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-price" class="form-control" name="row[price]" type="number" value="0">
+            <input id="c-number" data-rule="required" class="form-control" name="number" type="number" value="1">
         </div>
     </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Is_use')}:</label>
-        <div class="col-xs-12 col-sm-8">
-                        
-            <select  id="c-is_use" class="form-control selectpicker" name="row[is_use]">
-                {foreach name="isUseList" item="vo"}
-                    <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option>
-                {/foreach}
-            </select>
 
-        </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">
@@ -79,36 +29,3 @@
         </div>
     </div>
 </form>
-
-
-<style>
-
-    #demoCanvas{
-        width: 100px;
-        height: 80px;
-    }
-</style>
-
-<script src="/assets/js/svga.min.js" ></script>
-<script>
-    // 播放
-    function play() {
-        $("#p-special li a.thumbnail").html("<div id='demoCanvas'></div>");
-
-        var player = new SVGA.Player('#demoCanvas');
-        player.loops=1;
-        player.clearsAfterStop=false;
-
-        var parser = new SVGA.Parser('#demoCanvas'); // 如果你需要支持 IE6+,那么必须把同样的选择器传给 Parser。
-
-        var svgaUrl = $("#c-special").val();
-
-        if(svgaUrl.indexOf("http://") == -1 && svgaUrl.indexOf("https://") == -1) {
-            svgaUrl = "{$Think.config.cos.url}"+svgaUrl;
-        }
-        parser.load(svgaUrl, function(videoItem) {
-            player.setVideoItem(videoItem);
-            player.startAnimation();
-        })
-    }
-</script>

+ 3 - 44
application/admin/view/egg/gift/edit.html

@@ -3,7 +3,7 @@
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Gift_id')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-gift_id" data-rule="required" data-source="gift/Gift/index" class="form-control selectpage" name="row[gift_id]" type="text" value="{$row.gift_id|htmlentities}">
+            <input id="c-gift_id" data-rule="required" data-source="gift/index" class="form-control selectpage" name="row[gift_id]" type="text" value="{$row.gift_id|htmlentities}">
         </div>
     </div>
     <div class="form-group">
@@ -23,16 +23,7 @@
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Special')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-special" class="form-control" size="50" name="row[special]" type="text" value="{$row.special|htmlentities}">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="faupload-special" class="btn btn-danger faupload" data-input-id="c-special" data-mimetype="svga" data-multiple="false" data-preview-id="p-special"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
-                    <span><button type="button" id="fachoose-special" class="btn btn-primary fachoose" data-input-id="c-special" data-mimetype="file/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
-                </div>
-                <span class="msg-box n-right" for="c-special"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="p-special"></ul>
-            <div style="padding:2px 33px;margin-top:10px;width:120px;color:#fff3f6;cursor:pointer;background-color: #00A000;border-radius: 2px;" onclick="play()">播放动画</div>
+            <input id="c-special" class="form-control" name="row[special]" type="text" value="{$row.special|htmlentities}">
         </div>
     </div>
     <div class="form-group">
@@ -44,7 +35,7 @@
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Jackpot_id')}:</label>
         <div class="col-xs-12 col-sm-8">
-            <input id="c-Jackpot_id" data-rule="required" data-source="egg/Jackpot/index" class="form-control selectpage" name="row[Jackpot_id]" type="text" value="{$row.Jackpot_id|htmlentities}">
+            <input id="c-Jackpot_id" data-rule="required" data-source="Jackpot/index" class="form-control selectpage" name="row[Jackpot_id]" type="text" value="{$row.Jackpot_id|htmlentities}">
         </div>
     </div>
     <div class="form-group">
@@ -79,35 +70,3 @@
         </div>
     </div>
 </form>
-
-
-<style>
-
-    #demoCanvas{
-        width: 100px;
-        height: 80px;
-    }
-</style>
-<script src="/assets/js/svga.min.js" ></script>
-<script>
-    // 播放
-    function play() {
-        $("#p-special li a.thumbnail").html("<div id='demoCanvas'></div>");
-
-        var player = new SVGA.Player('#demoCanvas');
-        player.loops=1;
-        player.clearsAfterStop=false;
-
-        var parser = new SVGA.Parser('#demoCanvas'); // 如果你需要支持 IE6+,那么必须把同样的选择器传给 Parser。
-
-        var svgaUrl = $("#c-special").val();
-
-        if(svgaUrl.indexOf("http://") == -1 && svgaUrl.indexOf("https://") == -1) {
-            svgaUrl = "{$Think.config.cos.url}"+svgaUrl;
-        }
-        parser.load(svgaUrl, function(videoItem) {
-            player.setVideoItem(videoItem);
-            player.startAnimation();
-        })
-    }
-</script>

+ 11 - 9
application/admin/view/egg/gift/index.html

@@ -8,21 +8,23 @@
                     <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('egg/gift/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('egg/gift/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                        <!--<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('egg/gift/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('egg/gift/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
                         <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('egg/gift/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
+                        -->
                         <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
                             <span class="extend">
-                                礼物总价值<span id="total-price">0</span>
+                                礼物总价值:<span id="total-price">0</span>
                             </span>
                         </a>
-<!--                        <div class="dropdown btn-group {:$auth->check('egg/gift/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 class="dropdown btn-group {:$auth->check('egg/gift/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>

+ 8 - 4
public/assets/js/backend/egg/gift.js

@@ -7,7 +7,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 extend: {
                     index_url: 'egg/gift/index' + location.search,
                     add_url: 'egg/gift/add',
-                    edit_url: 'egg/gift/edit',
+//                    edit_url: 'egg/gift/edit',
                     del_url: 'egg/gift/del',
                     multi_url: 'egg/gift/multi',
                     import_url: 'egg/gift/import',
@@ -34,13 +34,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     [
                         {checkbox: true},
                         {field: 'id', title: __('Id')},
+                        {field: 'Jackpot_id', title: __('Jackpot_id')},
+                        {field: 'eggjackpot.name', title: __('Eggjackpot.name'), operate: 'LIKE'},
                         {field: 'gift_id', title: __('Gift_id')},
-                        {field: 'image', title: __('Image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
                         {field: 'gift_name', title: __('Gift_name'), operate: 'LIKE'},
-                        {field: 'Jackpot_id', title: __('Jackpot_id')},
-                        {field: 'prize_no', title: __('Prize_no')},
+                        {field: 'image', title: __('Image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image},
+//                        {field: 'special', title: __('Special'), operate: 'LIKE'},
+
+//                        {field: 'prize_no', title: __('Prize_no')},
                         {field: 'price', title: __('Price')},
                         {field: 'is_use', title: __('Is_use'), searchList: {"1":__('Is_use 1'),"0":__('Is_use 0')}, formatter: Table.api.formatter.normal},
+                        {field: 'updatetime', title: __('Updatetime'), 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}
                     ]
                 ]