Browse Source

优化检测打印

liuhairui 2 years ago
parent
commit
0ec554d8c5
67 changed files with 6284 additions and 0 deletions
  1. 52 0
      application/admin/model/stock/Customer.php
  2. 62 0
      application/admin/model/stock/Datadict.php
  3. 53 0
      application/admin/model/stock/Datadictitem.php
  4. 26 0
      application/admin/model/stock/Goods.php
  5. 20 0
      application/admin/model/stock/Goodscategory.php
  6. 33 0
      application/admin/model/stock/Stockcur.php
  7. 36 0
      application/admin/model/stock/Stockin.php
  8. 30 0
      application/admin/model/stock/Stockinlist.php
  9. 35 0
      application/admin/model/stock/Stockout.php
  10. 32 0
      application/admin/model/stock/Stockoutlist.php
  11. 33 0
      application/admin/model/stock/Supplier.php
  12. 75 0
      application/admin/view/formula/examine_list.html
  13. 55 0
      application/admin/view/formula/examine_status.html
  14. 64 0
      application/admin/view/stock/customer/add.html
  15. 65 0
      application/admin/view/stock/customer/edit.html
  16. 26 0
      application/admin/view/stock/customer/index.html
  17. 63 0
      application/admin/view/stock/datadict/add.html
  18. 60 0
      application/admin/view/stock/datadict/edit.html
  19. 25 0
      application/admin/view/stock/datadict/index.html
  20. 54 0
      application/admin/view/stock/datadictitem/add.html
  21. 54 0
      application/admin/view/stock/datadictitem/edit.html
  22. 36 0
      application/admin/view/stock/datadictitem/index.html
  23. 58 0
      application/admin/view/stock/goods/add.html
  24. 18 0
      application/admin/view/stock/goods/detail.html
  25. 58 0
      application/admin/view/stock/goods/edit.html
  26. 50 0
      application/admin/view/stock/goods/index.html
  27. 29 0
      application/admin/view/stock/goodscategory/add.html
  28. 29 0
      application/admin/view/stock/goodscategory/edit.html
  29. 27 0
      application/admin/view/stock/goodscategory/index.html
  30. 28 0
      application/admin/view/stock/stockcur/add.html
  31. 57 0
      application/admin/view/stock/stockcur/edit.html
  32. 38 0
      application/admin/view/stock/stockcur/index.html
  33. 118 0
      application/admin/view/stock/stockcur/mainpage.html
  34. 193 0
      application/admin/view/stock/stockin/add.html
  35. 187 0
      application/admin/view/stock/stockin/edit.html
  36. 22 0
      application/admin/view/stock/stockin/getlist.html
  37. 28 0
      application/admin/view/stock/stockin/index.html
  38. 72 0
      application/admin/view/stock/stockin/look.html
  39. 3 0
      application/admin/view/stock/stockin/printer.html
  40. 174 0
      application/admin/view/stock/stockout/add.html
  41. 182 0
      application/admin/view/stock/stockout/edit.html
  42. 22 0
      application/admin/view/stock/stockout/getlist.html
  43. 25 0
      application/admin/view/stock/stockout/index.html
  44. 72 0
      application/admin/view/stock/stockout/look.html
  45. 3 0
      application/admin/view/stock/stockout/printer.html
  46. 58 0
      application/admin/view/stock/supplier/add.html
  47. 58 0
      application/admin/view/stock/supplier/edit.html
  48. 24 0
      application/admin/view/stock/supplier/index.html
  49. 143 0
      public/assets/addons/stock/lodop-print/Lodop.js
  50. 5 0
      public/assets/addons/stock/pinyinUtil/dict/pinyin_dict_firstletter.js
  51. 372 0
      public/assets/addons/stock/pinyinUtil/pinyinUtil.js
  52. 28 0
      public/assets/js/addons.js
  53. 132 0
      public/assets/js/backend/stock/customer.js
  54. 67 0
      public/assets/js/backend/stock/datadict.js
  55. 92 0
      public/assets/js/backend/stock/datadictitem.js
  56. 231 0
      public/assets/js/backend/stock/goods.js
  57. 121 0
      public/assets/js/backend/stock/goodscategory.js
  58. 0 0
      public/assets/js/backend/stock/libs/element-ui.css
  59. 0 0
      public/assets/js/backend/stock/libs/element-ui.js
  60. BIN
      public/assets/js/backend/stock/libs/fonts/element-icons.ttf
  61. BIN
      public/assets/js/backend/stock/libs/fonts/element-icons.woff
  62. 5 0
      public/assets/js/backend/stock/libs/vue.js
  63. 242 0
      public/assets/js/backend/stock/stockcur.js
  64. 893 0
      public/assets/js/backend/stock/stockin.js
  65. 900 0
      public/assets/js/backend/stock/stockout.js
  66. 59 0
      public/assets/js/backend/stock/supplier.js
  67. 372 0
      public/assets/js/pingyinUntil.js

+ 52 - 0
application/admin/model/stock/Customer.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+use fast\Tree;
+
+class Customer extends Model {
+
+    // 表名
+    protected $name = 'stock_customer';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    // 追加属性
+    protected $append = [
+        'enabledmark_text'
+    ];
+
+    protected static function init() {
+        self::afterInsert(function ($row) {
+            $pk = $row->getPk();
+            $row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
+        });
+    }
+
+    public function getEnabledmarkList() {
+        return ['1' => __('Enabledmark 1'), '0' => __('Enabledmark 0')];
+    }
+
+    public function getEnabledmarkTextAttr($value, $data) {
+        $value = $value ? $value : $data['enabledmark'];
+        $list = $this->getEnabledmarkList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    // public function getCustomerTree()
+    // {
+    //     $customerList = collection(model('StockCustomer')->select())->toArray();
+    //     Tree::instance()->init($customerList);
+    //     $customer = [];
+    //     $this->customerList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');
+    //     $primary = array(array('name'=>'==请选择上级==','id'=>''));
+    //     $result = array_merge_recursive($primary, $this->customerList);
+    //     foreach ($result as $k => $v) {
+    //         $customer[$v['id']] = $v['name'];
+    //     }
+    //     return $customer;
+    // }
+}

+ 62 - 0
application/admin/model/stock/Datadict.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Datadict extends Model {
+
+    // 表名
+    protected $name = 'stock_datadict';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    // 追加属性
+    protected $append = [
+        'istree_text',
+        'enabled_text'
+    ];
+
+    protected static function init() {
+        self::afterInsert(function ($row) {
+            $pk = $row->getPk();
+            $row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
+        });
+    }
+
+    public function getIstreeList() {
+        return ['0' => __('Istree 0'), '1' => __('Istree 1')];
+    }
+
+    public function getEnabledList() {
+        return ['1' => __('Enabled 1'), '0' => __('Enabled 0')];
+    }
+
+    public function getIstreeTextAttr($value, $data) {
+        $value = $value ? $value : $data['istree'];
+        $list = $this->getIstreeList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    public function getEnabledTextAttr($value, $data) {
+        $value = $value ? $value : $data['enabled'];
+        $list = $this->getEnabledList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    public function getDatadic($code = '') {
+        $sqlresult = \think\Db::view('stock_datadict a','code')
+                ->view('stock_datadictitem b','name,value','a.id=b.datadict_id')
+                ->where('a.code',$code)
+                ->order('b.weigh ASC')
+                ->select();
+        $result = [];
+        foreach ($sqlresult as $k => $v) {
+            $result[$v['value']] = $v['name'];
+        }
+        return $result;
+    }
+
+}

+ 53 - 0
application/admin/model/stock/Datadictitem.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Datadictitem extends Model
+{
+    // 表名
+    protected $name = 'stock_datadictitem';
+    
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+    
+    // 追加属性
+    protected $append = [
+        'enabled_text'
+    ];
+    
+
+    protected static function init()
+    {
+        self::afterInsert(function ($row) {
+            $pk = $row->getPk();
+            $row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
+        });
+    }
+
+    
+    public function getEnabledList()
+    {
+        return ['1' => __('Enabled 1'),'0' => __('Enabled 0')];
+    }     
+
+
+    public function getEnabledTextAttr($value, $data)
+    {        
+        $value = $value ? $value : $data['enabled'];
+        $list = $this->getEnabledList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+
+    public function datadict() {
+        return $this->belongsTo('\app\admin\model\stock\Datadict', 'datadict_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+
+}

+ 26 - 0
application/admin/model/stock/Goods.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Goods extends Model {
+
+    // 表名
+    protected $name = 'stock_goods';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    // 追加属性
+    protected $append = ["curstocknum"];
+    public function goodscategory() {
+        return $this->hasone('\app\admin\model\stock\Goodscategory', 'id', 'goodscategoryid')->setEagerlyType(0);
+    }
+    // 当前库存
+    public function getCurstocknumAttr($value,$data) {
+        $curstocknum=\app\admin\model\stock\Stockcur::where("stock_goods_id",$data["id"])->sum("curnums");
+        return $curstocknum;
+    }
+}

+ 20 - 0
application/admin/model/stock/Goodscategory.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Goodscategory extends Model {
+
+    // 表名
+    protected $name = 'stock_goodscategory';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+    // 追加属性
+    protected $append = [
+    ];
+
+}

+ 33 - 0
application/admin/model/stock/Stockcur.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Stockcur extends Model {
+
+    // 表名
+    protected $name = 'stock_stockcur';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+    // 追加属性
+    protected $append = [
+    ];
+
+    public function stockgoods() {
+        return $this->belongsTo('\app\admin\model\stock\Goods', 'stock_goods_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+    public function stockinlist() {
+        return $this->belongsTo('\app\admin\model\stock\Stockinlist', 'stock_stockin_list_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+    public function getGoodsStoknum($goodsid) {
+        $result = model('\app\admin\model\stock\Stockcur')->field('SUM(curnums)')->where('stock_goods_id', $goodsid)->select();
+        $curnum = $result[0]['SUM(curnums)'] == null ? 0 : $result[0]['SUM(curnums)'];
+        return $curnum;
+    }
+}

+ 36 - 0
application/admin/model/stock/Stockin.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Stockin extends Model
+{
+
+    // 表名
+    protected $name = 'stock_stockin';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    // 追加属性
+    protected $append = [];
+    
+    public function supplier()
+    {
+        return $this->hasOne('\app\admin\model\stock\Supplier', 'id', 'stock_supplier_id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+    //生成入库编号
+    public function createdocnum()
+    {
+        $nowdate = date('Ymd', time());
+        do{
+            $randstr=rand(1000,9999);
+            $docnum='GHD' . $nowdate.$randstr;
+            $result = self::where('docnum',$docnum)->count();
+        }while($result>0);
+        return $docnum;
+    }
+}

+ 30 - 0
application/admin/model/stock/Stockinlist.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Stockinlist extends Model {
+
+    // 表名
+    protected $name = 'stock_stockin_list';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    protected $insert = ['charged' => 0];
+    // 追加属性
+    protected $append = [
+    ];
+
+    
+    public function goods()
+    {
+        return $this->hasOne('\app\admin\model\stock\Goods', 'id', 'stock_goods_id', [], 'LEFT')->setEagerlyType(0);
+    }
+    public function stockin() {
+        return $this->belongsTo('\app\admin\model\stock\Stockin', 'stock_stockin_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+}
+

+ 35 - 0
application/admin/model/stock/Stockout.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Stockout extends Model {
+
+    // 表名
+    protected $name = 'stock_stockout';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    // 追加属性
+    protected $append = [
+    ];
+    public function customer() {
+        return $this->hasOne('\app\admin\model\stock\Customer', 'id', 'stock_customer_id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+     //生成出库编号
+     public function createdocnum()
+     {
+         $nowdate = date('Ymd', time());
+         do{
+             $randstr=rand(1000,9999);
+             $docnum='XSD' . $nowdate.$randstr;
+             $result = self::where('docnum',$docnum)->count();
+         }while($result>0);
+         return $docnum;
+     }
+
+}

+ 32 - 0
application/admin/model/stock/Stockoutlist.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Stockoutlist extends Model {
+
+    // 表名
+    protected $name = 'stock_stockout_list';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    protected $insert = ['charged' => 0];
+    // 追加属性
+    protected $append = [
+    ];
+    
+    public function goods() {
+        return $this->belongsTo('\app\admin\model\stock\Goods', 'stock_goods_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+
+    public function stockinlist() {
+        return $this->belongsTo('\app\admin\model\stock\Stockin', 'stock_stockinlist_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+    
+    public function stockout() {
+        return $this->belongsTo('\app\admin\model\stock\Stockout', 'stock_stockout_id', 'id', [], 'LEFT')->setEagerlyType(0);
+    }
+}

+ 33 - 0
application/admin/model/stock/Supplier.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace app\admin\model\stock;
+
+use think\Model;
+
+class Supplier extends Model
+{
+    // 表名
+    protected $name = 'stock_supplier';
+    
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+    
+    // 追加属性
+    protected $append = [
+
+    ];
+    
+
+    
+
+
+
+
+
+
+
+}

+ 75 - 0
application/admin/view/formula/examine_list.html

@@ -0,0 +1,75 @@
+
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="" >
+    <br>
+    <div>
+        <button style="line-height: 25px;width: 57px;">
+            <a href="{:url('Formula/examine_status')}" style="text-decoration: none;color: black;">返回</a>
+            <!--<a href="javascript:history.back(-1)" style="text-decoration: none;color: black;">返回</a>-->
+        </button>
+    </div>
+    <br>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-1">配方名称</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-name" data-rule="required" disabled class="form-control" name="row[name]" type="text" value="{$formula.name}">
+        </div>
+        <label class="control-label col-xs-12 col-sm-1">编号:</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-formula_no" class="form-control" disabled name="row[formula_no]" type="text" value="{$formula.no}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-1">担当人</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-charge_name" data-rule="required" disabled class="form-control" name="row[charge_name]" type="text" value="{$formula.charge_name}">
+        </div>
+        <label class="control-label col-xs-12 col-sm-1">审核人</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-examine_name" data-rule="required" disabled class="form-control" name="row[examine_name]" type="text" value="{$formula.examine_name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-1">备注</label>
+        <div class="col-xs-12 col-sm-7">
+            <input id="c-remark" class="form-control" disabled name="row[remark]" type="text" value="{$formula.remark}">
+        </div>
+    </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-1">版本号</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-version" data-rule="required"  class="form-control" name="row[version]" type="text" value="{$formula.version}" readonly>
+        </div>
+        <label class="control-label col-xs-12 col-sm-1">日期</label>
+        <div class="col-xs-12 col-sm-3">
+            <input id="c-date" class="form-control datetimepicker" disabled name="row[date]" type="text" data-date-format="YYYY-MM-DD" data-use-current="true" value="{$formula.date}">
+        </div>
+    </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-1">可用性:</label>
+        <div class="col-xs-12 col-sm-7">
+            <input id="c-usability"  data-source="formula/getCustomer" disabled
+                   data-params='{"custom[type]":"bm","isTree":1}' data-multiple="true" data-field="customer_name"  class="form-control selectpage" name="usability"
+                   type="text" value="{$formula.usability|htmlentities}" >
+        </div>
+    </div>
+    <div class="form-group">
+        <table class="table table-striped table-bordered table-hover table-nowrap" id="gy" >
+            <tr>
+                <th class="col-sm-2">原材料</th>
+                <th class="col-sm-1">百分比(%)</th>
+                <th class="col-sm-4">操作工艺说明</th>
+            </tr>
+            {foreach name='formula_detail' id='vo'}
+            <tr>
+                <td><textarea name="material"   style="resize:none;" disabled class="form-control material"   cols="15" rows="4">{$vo.material}</textarea></td>
+                <td><textarea name="percentage" style="resize:none;" disabled class="form-control percentage" cols="10"  rows="4">{$vo.percentage}</textarea></td>
+                <td><textarea name="gy_name"    style="resize:none;" disabled class="form-control gy_name"    cols="50" rows="4">{$vo.gy_name}</textarea></td>
+            </tr>
+            {/foreach}
+        </table>
+    </div>
+</form>
+
+

+ 55 - 0
application/admin/view/formula/examine_status.html

@@ -0,0 +1,55 @@
+<div class="panel panel-default panel-intro">
+
+    <div class="panel-heading">
+        {:build_heading(null,FALSE)}
+        <ul class="nav nav-tabs" data-field="status">
+            <li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
+        </ul>
+    </div>
+
+    <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">
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
+                        <thead>
+                            <tr>
+                            <th style="text-align: center" class="col-sm-2" >ID</th>
+                            <th style="text-align: center" class="col-sm-2" >配方名称</th>
+                            <th style="text-align: center" class="col-sm-2" >版本号</th>
+                            <th style="text-align: center" class="col-sm-2" >审核时间</th>
+                            <th style="text-align: center" class="col-sm-2" >操作</th>
+                            </tr>
+                        </thead>
+                        <tbody class="xs">
+                            {volist name="formula" id="v"}
+                                <tr class="tr" style="text-align: center;height: 50px;">
+                                    <td>{$v.id}</td>
+                                    <td>{$v.name}</td>
+                                    <td>{$v.version}</td>
+                                    <td>{$v.update}</td>
+                                    <td>
+                                        <button type="button" class="btn btn-cha">
+                                            <a href="{:url('Formula/examine_list')}?id={$v.id}" style="text-decoration: none;color: black">查看</a>
+                                        </button>
+                                    </td>
+                                </tr>
+                            {/volist}
+                        </tbody>
+                    </table>
+                    <div style="text-align: center">
+                        {$page}
+                    </div>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script type='text/javascript' src='__CDN__/assets/js/jquery2.1.1.min.js'></script>
+<script type="text/javascript" src="__CDN__/assets/js/jquery.qrcode.min.js"></script>
+<script type="text/javascript" src="__CDN__/assets/js/jQuery.print.js"></script>
+<script>
+
+</script>

+ 64 - 0
application/admin/view/stock/customer/add.html

@@ -0,0 +1,64 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('上级')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $customer, null, ['class'=>'form-control selectpicker', 'data-size'=>'13','id'=>'c-pid', 'data-rule'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Encode')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-encode" class="form-control" name="row[encode]" type="text" value = "{$encode}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text" data-rule="required">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Shortname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shortname" class="form-control" name="row[shortname]" type="text" >
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Innerphone')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-innerphone" class="form-control" name="row[innerphone]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Enabledmark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-enabledmark" class="form-control selectpicker" name="row[enabledmark]">
+                {foreach name="enabledmarkList" item="vo"}
+                    <option value="{$key}" {in name="key" value="1"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 65 - 0
application/admin/view/stock/customer/edit.html

@@ -0,0 +1,65 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('父级')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $customer, $row.pid, ['class'=>'form-control selectpicker', 'data-size'=>'13','id'=>'c-pid', 'data-rule'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Encode')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-encode" class="form-control" name="row[encode]" type="text" value="{$row.encode}">
+        </div>
+    </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Shortname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shortname" class="form-control" name="row[shortname]" type="text" value="{$row.shortname}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Innerphone')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-innerphone" class="form-control" name="row[innerphone]" type="text" value="{$row.innerphone}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Enabledmark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-enabledmark" class="form-control selectpicker" name="row[enabledmark]">
+                {foreach name="enabledmarkList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.enabledmark"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text" value="{$row.remark}">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 26 - 0
application/admin/view/stock/customer/index.html

@@ -0,0 +1,26 @@
+<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('stock/customer/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('stock/customer/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('stock/customer/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-toggle-all"><i class="fa fa-plus"></i> {:__('展开全部')}</a>
+
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('stock/customer/edit')}" 
+                           data-operate-del="{:$auth->check('stock/customer/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 63 - 0
application/admin/view/stock/datadict/add.html

@@ -0,0 +1,63 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">父级:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $dataDicdata, null, ['class'=>'form-control', 'required'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Code')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-code" class="form-control" name="row[code]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">树:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-istree" class="form-control selectpicker" name="row[istree]">
+                {foreach name="istreeList" item="vo"}
+                    <option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">有效:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-enabled" class="form-control selectpicker" name="row[enabled]">
+                {foreach name="enabledList" item="vo"}
+                    <option value="{$key}" {in name="key" value="1"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">备注:</label>
+        <div class="col-xs-12 col-sm-8">
+            
+            <input id="c-remark" class="form-control" name="row[remark]" type="text">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 60 - 0
application/admin/view/stock/datadict/edit.html

@@ -0,0 +1,60 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $dataDicdata, $row['pid'], ['class'=>'form-control', 'required'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Code')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-code" class="form-control" name="row[code]" type="text" value="{$row.code}">
+        </div>
+    </div>  
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">树:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-istree" class="form-control selectpicker" name="row[istree]">
+                {foreach name="istreeList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.istree"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">有效:</label>
+        <div class="col-xs-12 col-sm-8">
+            <select  id="c-enabled" class="form-control selectpicker" name="row[enabled]">
+                {foreach name="enabledList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.enabled"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text" value="{$row.remark}">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 25 - 0
application/admin/view/stock/datadict/index.html

@@ -0,0 +1,25 @@
+
+            <div class="panel panel-default panel-intro col-sm-12">
+    {: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('stock/datadictitem/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('stock/datadictitem/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('stock/datadictitem/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('stock/datadictitem/edit')}" 
+                           data-operate-del="{:$auth->check('stock/datadictitem/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 54 - 0
application/admin/view/stock/datadictitem/add.html

@@ -0,0 +1,54 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+     <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Datadict Category')}</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[datadict_id]', $dataDicdata, null, ['class'=>'form-control', 'required'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-value" data-rule="required" class="form-control" name="row[value]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Enabled')}:</label>
+        <div class="col-xs-12 col-sm-8">
+
+            <select id="c-enabled" class="form-control selectpicker" name="row[enabled]">
+                {foreach name="enabledList" item="vo"}
+                    <option value="{$key}" {in name="key" value="1"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group" style="height: 20px;">
+
+    </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 54 - 0
application/admin/view/stock/datadictitem/edit.html

@@ -0,0 +1,54 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+     <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Datadict Category')}</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[datadict_id]', $dataDicdata, $row.datadict_id, ['class'=>'form-control', 'required'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-value" data-rule="required" class="form-control" name="row[value]" type="text" value="{$row.value}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text" value="{$row.remark}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Enabled')}:</label>
+        <div class="col-xs-12 col-sm-8">
+
+            <select id="c-enabled" class="form-control selectpicker" name="row[enabled]">
+                {foreach name="enabledList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.enabled"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group" style="height: 20px;">
+
+    </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 36 - 0
application/admin/view/stock/datadictitem/index.html

@@ -0,0 +1,36 @@
+<div class="row">
+    <div style="width: 180px; float: left;margin-left: 10px">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                字典分类
+            </div>
+            <div class="panel-body">
+                <div id="treeview"></div>
+            </div>
+        </div>
+    </div>
+    <div class="table-content">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                字典数据
+            </div>
+            <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('stock/datadictitem/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('stock/datadictitem/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('stock/datadictitem/del')?'':'hide'}" title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                                <a href="javascript:;" class="btn btn-info btn-dialog  {:$auth->check('stock/datadict/index')?'':'hide'}" data-url="stock/datadict/index" data-title="{:__('Datadict Category')}" title="{:__('Datadict Category')}"><i class="fa fa-pencil"></i> {:__('Datadict Category')}</a>
+                            </div>
+                            <table id="table" class="table table-striped table-bordered table-hover table-nowrap" data-operate-edit="{:$auth->check('stock/datadictitem/edit')}" data-operate-del="{:$auth->check('stock/datadictitem/del')}" width="100%">
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 58 - 0
application/admin/view/stock/goods/add.html

@@ -0,0 +1,58 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Goodscategory')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[goodscategoryid]', $goodscategorylist, null, ['class'=>'form-control selectpicker', 'data-rule'=>'required','id'=>'c-goodscategoryid'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Volnum')}</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-volnum" data-rule="required" class="form-control" name="row[volnum]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Goodsname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-goodsname" data-rule="required" class="form-control" name="row[goodsname]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Spell')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-spell" data-rule="required" class="form-control" name="row[spell]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Productmodel')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-productmodel" class="form-control" name="row[productmodel]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Measureunit')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[measureunit]', $measureunit, null, ['class'=>'form-control selectpicker', 'data-size'=>'8', 'data-rule'=>'required'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">单桶重量(kg):</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-univalence" class="form-control" step="0.01" name="row[univalence]" type="number">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Barcode')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-barcode" class="form-control"  name="row[barcode]" type="text">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 18 - 0
application/admin/view/stock/goods/detail.html

@@ -0,0 +1,18 @@
+<div class="table-content">
+    <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">
+                            <input id="c-ids" class="form-control" name="row[ids]" type="hidden" value="{$ids}">
+                        <table id="table" class="table table-striped table-bordered table-hover table-nowrap" data-operate-edit="{:$auth->check('stock/goods/edit')}"
+                            data-operate-del="{:$auth->check('stock/goods/del')}" width="100%">
+                        </table>
+                    </div>
+                </div>
+
+            </div>
+        </div>
+    </div>
+</div>

+ 58 - 0
application/admin/view/stock/goods/edit.html

@@ -0,0 +1,58 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Goodscategory')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[goodscategoryid]', $goodscategorylist, $row['goodscategoryid'], ['class'=>'form-control selectpicker', 'data-size'=>'10', 'id'=>'c-goodscategoryid', 'data-rule'=>'required'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Volnum')}</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-volnum" class="form-control" name="row[volnum]" type="text" value="{$row.volnum}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Goodsname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-goodsname" class="form-control" name="row[goodsname]" type="text" value="{$row.goodsname}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Spell')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-spell" class="form-control" name="row[spell]" type="text" value="{$row.spell}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Productmodel')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-productmodel" class="form-control" name="row[productmodel]" type="text" value="{$row.productmodel}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Measureunit')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[measureunit]', $measureunit, $row['measureunit'], ['class'=>'form-control selectpicker', 'data-size'=>'8', 'data-rule'=>'required'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">单桶重量(kg):</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-univalence" class="form-control" step="0.01" name="row[univalence]" type="number" value="{$row.univalence}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Barcode')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-barcode" class="form-control"  name="row[barcode]" type="text" value="{$row.barcode}">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 50 - 0
application/admin/view/stock/goods/index.html

@@ -0,0 +1,50 @@
+<div class="row">
+    <div style="width: 180px; float: left;margin-left: 10px">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+               {:__('goodscategory')}
+            </div>
+            <div class="panel-body">
+                <div id="treeview"></div>
+            </div>
+        </div>
+    </div>
+    <div class="table-content">
+        <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('stock/goods/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('stock/goods/edit')?'':'hide'}"
+                                    title="{:__('Edit')}">
+                                    <i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                                <a href="javascript:;" class="btn btn-success btn-detail btn-disabled disabled {:$auth->check('stock/goods/detail')?'':'hide'}"
+                                    title="{:__('Inoutdetail')}">
+                                    <i class="fa fa-sliders"></i> {:__('Inoutdetail')}</a>
+                                    <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('stock/goods/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-danger btn-del btn-disabled disabled {:$auth->check('stock/goods/del')?'':'hide'}"
+                                    title="{:__('Delete')}">
+                                    <i class="fa fa-trash"></i> {:__('Delete')}</a>
+
+                            </div>
+                            <table id="table" class="table table-striped table-bordered table-hover table-nowrap" 
+                                data-query-params="queryParams"
+                                data-operate-detail="{:$auth->check('stock/goods/detail')}"
+                                data-operate-edit="{:$auth->check('stock/goods/edit')}" 
+                                data-operate-del="{:$auth->check('stock/goods/del')}"
+                                width="100%">
+                            </table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 29 - 0
application/admin/view/stock/goodscategory/add.html

@@ -0,0 +1,29 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">父级分类:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $goodsCategory, null, ['class'=>'form-control selectpicker', 'data-size'=>'10', 'id'=>'c-goodscategory', 'data-rule'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">分类代码:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-value" class="form-control" name="row[value]" type="text" value="{$value}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">分类名称:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text">
+        </div>
+    </div>
+	<div style="height: 300px;"></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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 29 - 0
application/admin/view/stock/goodscategory/edit.html

@@ -0,0 +1,29 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">父级分类:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('row[pid]', $goodsCategory, $row['pid'], ['class'=>'form-control selectpicker','data-size'=>'10', 'id'=>'c-goodscategory', 'data-rule'=>''])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">分类代码:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-value" class="form-control" name="row[value]" type="text" value="{$row.value}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">分类名称:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+	<div style="height: 300px;"></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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 27 - 0
application/admin/view/stock/goodscategory/index.html

@@ -0,0 +1,27 @@
+<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('stock/goodscategory/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('stock/goodscategory/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('stock/goodscategory/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('stock/goodscategory/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-danger btn-toggle-all"><i class="fa fa-plus"></i> {:__('Toggle all')}</a>
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('stock/goodscategory/edit')}" 
+                           data-operate-del="{:$auth->check('stock/goodscategory/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 28 - 0
application/admin/view/stock/stockcur/add.html

@@ -0,0 +1,28 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Stock_stockin_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-stock_stockin_id" data-rule="required" data-source="stock/stockin/index" class="form-control selectpage" name="row[stock_stockin_id]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Curnum')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-curnum" class="form-control" name="row[curnum]" type="number">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Stock_goods_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-stock_goods_id" data-rule="required" data-source="stock/goods/index" class="form-control selectpage" name="row[stock_goods_id]" type="text" value="">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 57 - 0
application/admin/view/stock/stockcur/edit.html

@@ -0,0 +1,57 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Stock_stockin_id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-stock_stockin_id" data-rule="required" class="form-control" name="row[stock_stockin_id]" type="text" value="{$row.stock_stockin_id}" readonly="readonly">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('商品代码')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-goods_volnum" class="form-control" name="row[stockgoods.volnum]" type="number" value="{$row.stockgoods.volnum}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('商品名称')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-goods_goodsname" class="form-control" name="row[stockgoods.goodsname]" type="text" value="{$row.stockgoods.goodsname}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('型号')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-goods_productmodel" class="form-control" name="row[stockgoods.productmodel]" type="text" value="{$row.stockgoods.productmodel}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('单位')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-stock_goods_measureunit" data-rule="required" class="form-control" name="row[stockgoods.measureunit]" type="text" value="{$row.stockgoods.measureunit}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('单价')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-stock_goods_univalence" data-rule="required" class="form-control" name="row[stockgoods.univalence]" type="text" value="{$row.stockgoods.univalence}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('当前数量')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-curnum" data-rule="required" class="form-control" name="row[stockgoods.curnum]" type="text" value="{$row.curnum}" disabled>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('货位')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-allocation" data-rule="required" class="form-control" name="row[allocation]" type="text" value="{$row.stockstockin.allocation}">
+        </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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 38 - 0
application/admin/view/stock/stockcur/index.html

@@ -0,0 +1,38 @@
+<div class="row">
+    <div style="width: 180px; float: left;margin-left: 10px">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                商品分类
+            </div>
+            <div class="panel-body">
+                <div id="treeview"></div>
+            </div>
+        </div>
+    </div>
+    <div class="table-content">
+        <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-detail btn-disabled disabled {:$auth->check('stock/goods/detail')?'':'hide'}"
+                                    title="{:__('出入明细')}">
+                                    <i class="fa fa-sliders"></i> {:__('出入明细')}</a>
+                            </div>
+                            <table id="table" class="table table-striped table-bordered table-hover table-nowrap" data-operate-edit="{:$auth->check('stock/stockcur/edit')}"
+                                data-operate-del="{:$auth->check('stock/stockcur/del')}" width="100%">
+                            </table>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 118 - 0
application/admin/view/stock/stockcur/mainpage.html

@@ -0,0 +1,118 @@
+<style type="text/css">
+    .content-detail {
+        display: inline;
+        line-height: 80px;
+    }
+    #stockcur_num,#stockcur_amount{
+        width: 400px;
+        height: 400px;
+    }
+</style>
+<div class="panel panel-default panel-intro">
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="row" style="margin-top:15px;">
+                    <div class="col-xs-6 col-md-3">
+                        <div class="panel bg-blue">
+                            <div class="panel-body">
+                                <div class="panel-title">
+                                    <h3>今日入库</h3>
+                                </div>
+                                <div class="panel-content">
+                                    <div class="row">
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockinsum.totalnums}</h1>
+                                            <small>件</small>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockinsum.totalamount}</h1>
+                                            <small>千克</small>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-xs-6 col-md-3">
+                        <div class="panel bg-aqua-gradient">
+                            <div class="panel-body">
+                                <div class="ibox-title">
+                                    <h3>今日出库</h3>
+                                </div>
+                                <div class="ibox-content">
+                                    <div class="row">
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockoutsum.totalnums}</h1>
+                                            <small>件</small>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockoutsum.totalamount}</h1>
+                                            <small>千克</small>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="col-xs-6 col-md-3">
+                        <div class="panel bg-purple-gradient">
+                            <div class="panel-body">
+                                <div class="ibox-title">
+                                    <h3>库存商品</h3>
+                                </div>
+                                <div class="ibox-content">
+
+                                    <div class="row">
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockcursum.totalnums}</h1>
+                                            <small>件</small>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins content-detail">{$stockcursum.totalamount}</h1>
+                                            <small>千克</small>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-xs-6 col-md-3">
+                        <div class="panel bg-green-gradient">
+                            <div class="panel-body">
+                                <div class="ibox-title">
+                                    <h3>待审核单据</h3>
+                                </div>
+                                <div class="ibox-content">
+
+                                    <div class="row">
+                                        <div class="col-md-6">
+                                            <small>入库单:</small>
+                                            <h1 class="no-margins content-detail">{$stockin_toaudit}</h1>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <small>出库单:</small>
+                                            <h1 class="no-margins content-detail">{$stockout_toaudit}</h1>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="row" style="margin-top:30px;">
+                    <div class="col-lg-6">
+                        <div id="linechart" class="btn-refresh" style="height:500px;width:100%;"></div>
+                    </div>
+                    <div class="col-lg-3">
+                        <div id="stockcur_amount"></div>
+                    </div>
+                    <div class="col-lg-3">
+                        <div id="stockcur_num"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 193 - 0
application/admin/view/stock/stockin/add.html

@@ -0,0 +1,193 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <el-container>
+        <el-aside width="600px">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">选择入库商品</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="well">
+                        <el-form :model="curgood" label-width="92px" :rules="rules" ref="curgood">
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="商品条码:">
+                                        <el-input size="small" v-model="curgood.barcode"
+                                            @keyup.enter.native="barcodeinputenter" placeholder="请输入商品条码"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品代码:">{{curgood.volnum}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品名称:">{{curgood.goodsname}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="规格型号:">{{curgood.productmodel}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+<!--                                <el-col :span="12">-->
+<!--                                    <el-form-item style="margin-bottom: 0;" label="入库单价:" prop="inboundprice">-->
+<!--                                        <el-input type="number" @change="getcurgoodamount" size="small"-->
+<!--                                            v-model="curgood.inboundprice" step="0.01" min="0" precision="2"-->
+<!--                                            placeholder="入库单价"> <template slot="append">元</template></el-input>-->
+<!--                                    </el-form-item>-->
+<!--                                </el-col>-->
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="单桶重量:" prop="inboundprice">
+                                        <el-input type="number" @change="getcurgoodamount" size="small"
+                                                  v-model="curgood.inboundprice" step="0.01" min="0" precision="2"
+                                                  placeholder="单桶重量"> <template slot="append">千克</template></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="入库数量:" prop="stockinnums">
+                                        <el-input size="small" type="number" @change="getcurgoodamount"
+                                            v-model.number="curgood.stockinnums" min="0" placeholder="入库数量">
+                                            <template slot="append">{{curgood.measureunit}}</template>
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;text-align: right;" label-width="92px"
+                                        label="备注:">
+                                        <el-input size="small" v-model="curgood.stockingoodsremark" placeholder="备注">
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" style="text-align:right">
+                                    <el-button icon="el-icon-circle-plus-outline" @click="addtolist" size="medium"
+                                        type="primary">添加</el-button>
+                                    <el-button icon="el-icon-refresh-left" @click="reset" size="medium" type="danger">重置
+                                    </el-button>
+                                </el-col>
+                            </el-row>
+                        </el-form>
+                    </div>
+                    <el-input v-model="searchvalue" @input="onSearchvalueChange" clearable prefix-icon="el-icon-search"
+                        placeholder="请输入商品名称、代码或简拼搜索"></el-input>
+                    <el-table :data="goodsdata.list" :height="goodsdata.table.height" highlight-current-row
+                        @row-click="selectonegood" stripe border style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="univalence" label="重量(kg)">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="curstocknum" label="库存">
+                        </el-table-column>
+                    </el-table>
+                    <div class="block">
+                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                            :current-page="goodsdata.pagenation.currentpage" :page-sizes="[10, 20, 30]"
+                            :page-size="goodsdata.pagenation.pagesize" layout="total, sizes, prev, pager, next, jumper"
+                            :total="goodsdata.pagenation.total">
+                        </el-pagination>
+                    </div>
+                </div>
+            </div>
+        </el-aside>
+        <el-main style="padding:0;margin-left: 10px;">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">入库基本信息</h3>
+                </div>
+                <div class="panel-body">
+                    <el-form :model="row" label-width="120px">
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="供应商:">
+                                    <el-select v-model="row.stock_supplier_id" size="small" filterable
+                                        placeholder="请选择供应商">
+                                        <el-option v-for="item in supplierlist" :key="item.id" :label="item.name"
+                                            :value="item.id">
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="入库日期:">
+                                    <el-date-picker size="small" v-model="row.inboundtime" type="date"
+                                        placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
+                                    </el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="备注:">
+                                    <el-input v-model="row.remark" size="small" placeholder="请输入备注内容"></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label-width="150px" label="入库商品总重量:"><span
+                                        style="font-size:20px;font-weight: 600;color: #ff6666">{{row.totalamount}}千克</span>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+            </div>
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">入库商品详情</h3>
+                </div>
+                <div class="panel-body">
+                    <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                        style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="stockinnums" label="入库数量">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="inboundprice" label="单桶重量">
+                        </el-table-column>
+                        <el-table-column prop="amount" label="总计重量">
+                        </el-table-column>
+                        <el-table-column prop="stockingoodsremark" label="备注">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="100">
+                            <template slot-scope="scope">
+                                <el-button type="danger" icon="el-icon-delete" @click="deleteselected(scope.row)"
+                                    size="small" circle></el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+        </el-main>
+    </el-container>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-main" name="row[main]"  v-model="main" class="form-control" type="hidden">
+        <input id="c-goodslist" name="row[goodslist]"  v-model="goodslist" class="form-control" type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button type="submit"  class="btn btn-success btn-embossed disabled readonly">{:__('OK')}</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 187 - 0
application/admin/view/stock/stockin/edit.html

@@ -0,0 +1,187 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <el-container>
+        <el-aside width="600px">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">选择入库商品</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="well">
+                        <el-form :model="curgood" label-width="92px" :rules="rules" ref="curgood">
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="商品条码:">
+                                        <el-input size="small" v-model="curgood.barcode"
+                                            @keyup.enter.native="barcodeinputenter" placeholder="请输入商品条码"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品代码:">{{curgood.volnum}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品名称:">{{curgood.goodsname}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="规格型号:">{{curgood.productmodel}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="单桶重量:" prop="inboundprice">
+                                        <el-input type="number" @change="getcurgoodamount" size="small"
+                                            v-model="curgood.inboundprice" step="0.01" min="0" precision="2"
+                                            placeholder="单桶重量"> <template slot="append">千克</template></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="入库数量:" prop="stockinnums">
+                                        <el-input size="small" type="number" @change="getcurgoodamount"
+                                            v-model.number="curgood.stockinnums" min="0" placeholder="入库数量">
+                                            <template slot="append">{{curgood.measureunit}}</template>
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;text-align: right;" label-width="92px"
+                                        label="备注:">
+                                        <el-input size="small" v-model="curgood.stockingoodsremark" placeholder="备注">
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" style="text-align:right">
+                                    <el-button icon="el-icon-circle-plus-outline" @click="addtolist" size="medium"
+                                        type="primary">添加</el-button>
+                                    <el-button icon="el-icon-refresh-left" @click="reset" size="medium" type="danger">重置
+                                    </el-button>
+                                </el-col>
+                            </el-row>
+                        </el-form>
+                    </div>
+                    <el-input v-model="searchvalue" @input="onSearchvalueChange" clearable prefix-icon="el-icon-search"
+                        placeholder="请输入商品名称、代码或简拼搜索"></el-input>
+                    <el-table :data="goodsdata.list" :height="goodsdata.table.height" highlight-current-row
+                        @row-click="selectonegood" stripe border style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="univalence" label="重量(kg)">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="curstocknum" label="库存">
+                        </el-table-column>
+                    </el-table>
+                    <div class="block">
+                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                            :current-page="goodsdata.pagenation.currentpage" :page-sizes="[10, 20, 30]"
+                            :page-size="goodsdata.pagenation.pagesize" layout="total, sizes, prev, pager, next, jumper"
+                            :total="goodsdata.pagenation.total">
+                        </el-pagination>
+                    </div>
+                </div>
+            </div>
+        </el-aside>
+        <el-main style="padding:0;margin-left: 10px;">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">入库基本信息</h3>
+                </div>
+                <div class="panel-body">
+                    <el-form :model="row" label-width="120px">
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="供应商:">
+                                    <el-select v-model="row.stock_supplier_id" size="small" filterable
+                                        placeholder="请选择供应商">
+                                        <el-option v-for="item in supplierlist" :key="item.id" :label="item.name"
+                                            :value="item.id">
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="入库日期:">
+                                    <el-date-picker size="small" v-model="row.inboundtime" type="date"
+                                        placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
+                                    </el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="备注:">
+                                    <el-input v-model="row.remark" size="small" placeholder="请输入备注内容"></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label-width="150px" label="入库商品总重量:"><span
+                                        style="font-size:20px;font-weight: 600;color: #ff6666">{{row.totalamount}}千克</span>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+            </div>
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">入库商品详情</h3>
+                </div>
+                <div class="panel-body">
+                    <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                        style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="stockinnums" label="入库数量">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="inboundprice" label="单桶重量">
+                        </el-table-column>
+                        <el-table-column prop="amount" label="总计重量">
+                        </el-table-column>
+                        <el-table-column prop="stockingoodsremark" label="备注">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="100">
+                            <template slot-scope="scope">
+                                <el-button type="danger" icon="el-icon-delete" @click="deleteselected(scope.row)"
+                                    size="small" circle></el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+        </el-main>
+    </el-container>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-main" name="row[main]"  v-model="main" class="form-control" type="hidden">
+        <input id="c-goodslist" name="row[goodslist]"  v-model="goodslist" class="form-control" type="hidden">
+        <input id="c-deletedgoodslist" name="row[deletedgoodslist]"  v-model="deletedgoodslist" class="form-control" type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button type="submit"  class="btn btn-success btn-embossed disabled readonly">{:__('OK')}</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 22 - 0
application/admin/view/stock/stockin/getlist.html

@@ -0,0 +1,22 @@
+<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>
+                    
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                    data-operate-edit="{:$auth->check('stock/stockin/edit')}" 
+                    data-operate-del="{:$auth->check('stock/stockin/del')}" 
+                    width="100%">
+             </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 28 - 0
application/admin/view/stock/stockin/index.html

@@ -0,0 +1,28 @@
+<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('stock/stockin/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('stock/stockin/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('stock/stockin/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <a href="javascript:;" class="btn btn-info btn-print btn-disabled disabled" title="打印" ><i class="fa fa-print"></i> 打印</a>
+                        <a href="javascript:;" class="btn btn-info btn-audit btn-disabled disabled" data-operatetype="audit" title="审核/反审核" ><i class="fa fa-list-alt"></i> 审核/反审核</a>
+<!--                        <a href="javascript:;" class="btn btn-info btn-settle btn-disabled disabled" data-operatetype="settle" title="结算/反结算" ><i class="fa fa-list-alt"></i> 结算/反结算</a>-->
+                        
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('stock/stockin/edit')}" 
+                           data-operate-del="{:$auth->check('stock/stockin/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 72 - 0
application/admin/view/stock/stockin/look.html

@@ -0,0 +1,72 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <h3 class="panel-title">入库基本信息</h3>
+        </div>
+        <div class="panel-body">
+            <el-row :gutter="20">
+                <el-col :span="6">
+                    入库单号:{{row.docnum}}
+                </el-col>
+                <el-col :span="6">
+                    供应商:{{row.supplier.name}}
+                </el-col>
+                <el-col :span="6">
+                    入库日期:{{row.inboundtime}}
+                </el-col>
+                <el-col :span="6">
+                    入库总重量:{{row.totalamount}}
+                </el-col>
+            </el-row>
+            <el-row :gutter="20" style="margin-top:20px;">
+                <el-col :span="24">
+                    备注:{{row.remark}}
+                </el-col>
+            </el-row>
+        </div>
+    </div>
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <h3 class="panel-title">入库商品详情</h3>
+        </div>
+        <div class="panel-body">
+            <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                style="width: 100%;margin-top: 10px;">
+                <el-table-column prop="volnum" label="商品代码">
+                </el-table-column>
+                <el-table-column prop="goodsname" label="商品名称">
+                </el-table-column>
+                <el-table-column prop="productmodel" label="规格">
+                </el-table-column>
+                <el-table-column prop="stockinnums" label="入库数量">
+                </el-table-column>
+                <el-table-column prop="measureunit" label="单位">
+                </el-table-column>
+                <el-table-column prop="inboundprice" label="单桶重量">
+                </el-table-column>
+                <el-table-column prop="amount" label="总计重量">
+                </el-table-column>
+                <el-table-column prop="stockingoodsremark" label="备注">
+                </el-table-column>
+            </el-table>
+        </div>
+    </div>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-docnum" name="row[docnum]" v-model="row.docnum"  type="hidden">
+        <input id="c-id" name="row[id]" v-model="row.id"  type="hidden">
+        <input id="c-commiturl" v-model="commiturl"  type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button  id="audit" class="btn btn-success btn-embossed readonly">审核</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 3 - 0
application/admin/view/stock/stockin/printer.html

@@ -0,0 +1,3 @@
+<a href="javascript:;" class="btn btn-info btn-print" title="打印" ><i class="fa fa-print"></i>打印</a>
+<div id="div1" class="printContent">
+</div>

+ 174 - 0
application/admin/view/stock/stockout/add.html

@@ -0,0 +1,174 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <el-container>
+        <el-aside width="600px">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">选择出库商品</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="well">
+                        <el-form :model="curgood" label-width="92px" :rules="rules" ref="curgood">
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="商品条码:">
+                                        <el-input size="small" v-model="curgood.barcode"
+                                            @keyup.enter.native="barcodeinputenter" placeholder="请输入商品条码"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品代码:">{{curgood.volnum}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品名称:">{{curgood.goodsname}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="规格型号:">{{curgood.productmodel}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="库存数量:">{{curgood.stocknum}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="出库数量:" prop="stockoutnums">
+                                        <el-input size="small" type="number" @change="getcurgoodamount"
+                                            v-model.number="curgood.stockoutnums" min="0" placeholder="入库数量">
+                                            <template slot="append">{{curgood.measureunit}}</template>
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;text-align: right;" label-width="92px"
+                                        label="备注:">
+                                        <el-input size="small" v-model="curgood.stockoutgoodsremark" placeholder="备注">
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" style="text-align:right">
+                                    <el-button icon="el-icon-circle-plus-outline" @click="addtolist" size="medium"
+                                        type="primary">添加</el-button>
+                                    <el-button icon="el-icon-refresh-left" @click="reset" size="medium" type="danger">重置
+                                    </el-button>
+                                </el-col>
+                            </el-row>
+                        </el-form>
+                    </div>
+                    <el-input v-model="searchvalue" @input="onSearchvalueChange" clearable prefix-icon="el-icon-search"
+                        placeholder="请输入商品名称、代码或简拼搜索"></el-input>
+                    <el-table :data="goodsdata.list" :height="goodsdata.table.height" highlight-current-row
+                        @row-click="selectonegood" stripe border style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="univalence" label="单价">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="重量">
+                        </el-table-column>
+                        <el-table-column prop="curstocknum" label="库存">
+                        </el-table-column>
+                    </el-table>
+                    <div class="block">
+                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                            :current-page="goodsdata.pagenation.currentpage" :page-sizes="[10, 20, 30]"
+                            :page-size="goodsdata.pagenation.pagesize" layout="total, sizes, prev, pager, next, jumper"
+                            :total="goodsdata.pagenation.total">
+                        </el-pagination>
+                    </div>
+                </div>
+            </div>
+        </el-aside>
+        <el-main style="padding:0;margin-left: 10px;">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">出库基本信息</h3>
+                </div>
+                <div class="panel-body">
+                    <el-form :model="row" label-width="120px">
+                        <el-row :gutter="20">
+                            <el-col :span="8">
+                                <el-form-item style="margin-bottom: 0;" label="客户:">
+                                    <el-select v-model="row.stock_customer_id" size="small" filterable
+                                        placeholder="请选择客户">
+                                        <el-option v-for="item in customerlist" :key="item.id" :label="item.name"
+                                            :value="item.id">
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item style="margin-bottom: 0;" label="出库日期:">
+                                    <el-date-picker size="small" v-model="row.outboundtime" type="date"
+                                        placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
+                                    </el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item style="margin-bottom: 0;" label="备注:">
+                                    <el-input v-model="row.remark" size="small" placeholder="请输入备注内容"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+            </div>
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">出库商品详情</h3>
+                </div>
+                <div class="panel-body">
+                    <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                        style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="stocknum" label="库存数量">
+                        </el-table-column>
+                        <el-table-column prop="stockoutnums" label="出库数量">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="stockoutgoodsremark" label="备注">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="100">
+                            <template slot-scope="scope">
+                                <el-button type="danger" icon="el-icon-delete" @click="deleteselected(scope.row)"
+                                    size="small" circle></el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+        </el-main>
+    </el-container>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-main" name="row[main]" v-model="main" class="form-control" type="hidden">
+        <input id="c-goodslist" name="row[goodslist]" v-model="goodslist" class="form-control" type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button type="submit" class="btn btn-success btn-embossed disabled readonly">{:__('OK')}</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 182 - 0
application/admin/view/stock/stockout/edit.html

@@ -0,0 +1,182 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <el-container>
+        <el-aside width="600px">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">选择出库商品</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="well">
+                        <el-form :model="curgood" label-width="92px" :rules="rules" ref="curgood">
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="商品条码:">
+                                        <el-input size="small" v-model="curgood.barcode"
+                                            @keyup.enter.native="barcodeinputenter" placeholder="请输入商品条码"></el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品代码:">{{curgood.volnum}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="商品名称:">{{curgood.goodsname}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="规格型号:">{{curgood.productmodel}}
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12" class="label el-form-item__label" style="text-align:left">
+                                    <el-form-item style="margin-bottom: 0;" label="库存数量:">{{curgood.stocknum}}
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;" label="出库数量:" prop="stockoutnums">
+                                        <el-input size="small" type="number" @change="getcurgoodamount"
+                                            v-model.number="curgood.stockoutnums" min="0" placeholder="入库数量">
+                                            <template slot="append">{{curgood.measureunit}}</template>
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                            </el-row>
+                            <el-row :gutter="20">
+                                <el-col :span="12">
+                                    <el-form-item style="margin-bottom: 0;text-align: right;" label-width="92px"
+                                        label="备注:">
+                                        <el-input size="small" v-model="curgood.stockoutgoodsremark" placeholder="备注">
+                                        </el-input>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12" style="text-align:right">
+                                    <el-button icon="el-icon-circle-plus-outline" @click="addtolist" size="medium"
+                                        type="primary">添加</el-button>
+                                    <el-button icon="el-icon-refresh-left" @click="reset" size="medium" type="danger">重置
+                                    </el-button>
+                                </el-col>
+                            </el-row>
+                        </el-form>
+                    </div>
+                    <el-input v-model="searchvalue" @input="onSearchvalueChange" clearable prefix-icon="el-icon-search"
+                        placeholder="请输入商品名称、代码或简拼搜索"></el-input>
+                    <el-table :data="goodsdata.list" :height="goodsdata.table.height" highlight-current-row
+                        @row-click="selectonegood" stripe border style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="univalence" label="重量">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="curstocknum" label="库存">
+                        </el-table-column>
+                    </el-table>
+                    <div class="block">
+                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                            :current-page="goodsdata.pagenation.currentpage" :page-sizes="[10, 20, 30]"
+                            :page-size="goodsdata.pagenation.pagesize" layout="total, sizes, prev, pager, next, jumper"
+                            :total="goodsdata.pagenation.total">
+                        </el-pagination>
+                    </div>
+                </div>
+            </div>
+        </el-aside>
+        <el-main style="padding:0;margin-left: 10px;">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">出库基本信息</h3>
+                </div>
+                <div class="panel-body">
+                    <el-form :model="row" label-width="120px">
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="出库单号:">
+                                    {{row.docnum}}
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="供应商:">
+                                    <el-select v-model="row.stock_customer_id" size="small" filterable
+                                        placeholder="请选择供应商">
+                                        <el-option v-for="item in customerlist" :key="item.id" :label="item.name"
+                                            :value="item.id">
+                                        </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row :gutter="20">
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="出库日期:">
+                                    <el-date-picker size="small" v-model="row.outboundtime" type="date"
+                                        placeholder="选择日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd">
+                                    </el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item style="margin-bottom: 0;" label="备注:">
+                                    <el-input v-model="row.remark" size="small" placeholder="请输入备注内容"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+            </div>
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">出库商品详情</h3>
+                </div>
+                <div class="panel-body">
+                    <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                        style="width: 100%;margin-top: 10px;">
+                        <el-table-column prop="volnum" label="商品代码">
+                        </el-table-column>
+                        <el-table-column prop="goodsname" label="商品名称">
+                        </el-table-column>
+                        <el-table-column prop="productmodel" label="规格">
+                        </el-table-column>
+                        <el-table-column prop="stocknum" label="库存数量">
+                        </el-table-column>
+                        <el-table-column prop="stockoutnums" label="出库数量">
+                        </el-table-column>
+                        <el-table-column prop="measureunit" label="单位">
+                        </el-table-column>
+                        <el-table-column prop="stockoutgoodsremark" label="备注">
+                        </el-table-column>
+                        <el-table-column fixed="right" label="操作" width="100">
+                            <template slot-scope="scope">
+                                <el-button type="danger" icon="el-icon-delete" @click="deleteselected(scope.row)"
+                                    size="small" circle></el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+        </el-main>
+    </el-container>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-main" name="row[main]" v-model="main" class="form-control" type="hidden">
+        <input id="c-goodslist" name="row[goodslist]" v-model="goodslist" class="form-control" type="hidden">
+        <input id="c-deletedgoodslist" name="row[deletedgoodslist]"  v-model="deselectedgoodslist" class="form-control" type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button type="submit" class="btn btn-success btn-embossed disabled readonly">{:__('OK')}</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 22 - 0
application/admin/view/stock/stockout/getlist.html

@@ -0,0 +1,22 @@
+<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>
+                    
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                    data-operate-edit="{:$auth->check('stock/stockin/edit')}" 
+                    data-operate-del="{:$auth->check('stock/stockin/del')}" 
+                    width="100%">
+             </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 25 - 0
application/admin/view/stock/stockout/index.html

@@ -0,0 +1,25 @@
+<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('stock/stockout/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('stock/stockout/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('stock/stockout/del')?'':'hide'}" title="{:__('Delete')}"><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <a href="javascript:;" class="btn btn-info btn-print btn-disabled disabled" title="打印" ><i class="fa fa-print"></i> 打印</a>
+                        <a href="javascript:;" class="btn btn-info btn-audit btn-disabled disabled" data-operatetype="audit" title="审核/反审核" ><i class="fa fa-list-alt"></i> 审核/反审核</a>
+<!--                        <a href="javascript:;" class="btn btn-info btn-settle btn-disabled disabled" data-operatetype="settle" title="结算/反结算" ><i class="fa fa-list-alt"></i> 结算/反结算</a>-->
+                 
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap" data-operate-edit="{:$auth->check('stock/stockout/edit')}" data-operate-del="{:$auth->check('stock/stockout/del')}" width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 72 - 0
application/admin/view/stock/stockout/look.html

@@ -0,0 +1,72 @@
+<link rel="stylesheet" href="/assets/js/backend/stock/libs/element-ui.css">
+<style>
+    .el-form-item__error {
+        padding-top: 0px;
+        margin-top: -8px;
+    }
+</style>
+<div id="app">
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <h3 class="panel-title">出库基本信息</h3>
+        </div>
+        <div class="panel-body">
+            <el-row :gutter="20">
+                <el-col :span="8">
+                    出库单号:{{row.docnum}}
+                </el-col>
+                <el-col :span="8">
+                    客户名称:{{row.customer.name}}
+                </el-col>
+                <el-col :span="8">
+                    出库日期:{{row.outboundtime}}
+                </el-col>
+            </el-row>
+            <el-row :gutter="20" style="margin-top:20px;">
+                <el-col :span="16">
+                    备注:{{row.remark}}
+                </el-col>
+                <el-col :span="8">
+                    总重量:{{row.totaloutamount}}
+                </el-col>
+            </el-row>
+        </div>
+    </div>
+    <div class="panel panel-default">
+        <div class="panel-heading">
+            <h3 class="panel-title">出库商品详情</h3>
+        </div>
+        <div class="panel-body">
+            <el-table :data="selectedgoodsdata.list" :height="selectedgoodsdata.table.height" stripe border
+                style="width: 100%;margin-top: 10px;">
+                <el-table-column prop="volnum" label="商品代码">
+                </el-table-column>
+                <el-table-column prop="goodsname" label="商品名称">
+                </el-table-column>
+                <el-table-column prop="productmodel" label="规格">
+                </el-table-column>
+                <el-table-column prop="stockoutnums" label="出库数量">
+                </el-table-column>
+                <el-table-column prop="measureunit" label="单位">
+                </el-table-column>
+                <el-table-column prop="inboundprice" label="单桶重量">
+                </el-table-column>
+                <el-table-column prop="amount" label="总重量">
+                </el-table-column>
+                <el-table-column prop="stockoutgoodsremark" label="备注">
+                </el-table-column>
+            </el-table>
+        </div>
+    </div>
+    <form id="form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+        <input id="c-docnum" name="row[docnum]" v-model="row.docnum"  type="hidden">
+        <input id="c-id" name="row[id]" v-model="row.id"  type="hidden">
+        <input id="c-commiturl" v-model="commiturl"  type="hidden">
+        <div class="form-group normal-footer">
+            <label class="control-label col-sm-8"></label>
+            <div class="col-sm-4">
+                <button  id="audit" class="btn btn-success btn-embossed readonly">审核</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 3 - 0
application/admin/view/stock/stockout/printer.html

@@ -0,0 +1,3 @@
+<a href="javascript:;" class="btn btn-info btn-print" title="打印" ><i class="fa fa-print"></i>打印</a>
+<div id="div1" class="printContent">
+</div>

+ 58 - 0
application/admin/view/stock/supplier/add.html

@@ -0,0 +1,58 @@
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Shortname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shortname" class="form-control" name="row[shortname]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Code')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-code" class="form-control" name="row[code]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('shipaddress')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shipaddress" class="form-control" name="row[shipaddress]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-address" class="form-control" name="row[address]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Contacts')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-contacts" class="form-control" name="row[contacts]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Telphone')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-telphone" class="form-control" name="row[telphone]" type="text">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">备注</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-remark" class="form-control" name="row[remark]" type="text"></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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 58 - 0
application/admin/view/stock/supplier/edit.html

@@ -0,0 +1,58 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Shortname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shortname" class="form-control" name="row[shortname]" type="text" value="{$row.shortname}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Code')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-code" class="form-control" name="row[code]" type="text" value="{$row.code}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Shipaddress')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-shipaddress" class="form-control" name="row[shipaddress]" type="text" value="{$row.shipaddress}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-address" class="form-control" name="row[address]" type="text" value="{$row.address}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Contacts')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-contacts" class="form-control" name="row[contacts]" type="text" value="{$row.contacts}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Telphone')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-telphone" class="form-control" name="row[telphone]" type="text" value="{$row.telphone}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">备注</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-remark" class="form-control" name="row[remark]" type="text">{$row.remark}</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-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 24 - 0
application/admin/view/stock/supplier/index.html

@@ -0,0 +1,24 @@
+<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('stock/supplier/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('stock/supplier/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('stock/supplier/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('stock/supplier/edit')}" 
+                           data-operate-del="{:$auth->check('stock/supplier/del')}" 
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 143 - 0
public/assets/addons/stock/lodop-print/Lodop.js

@@ -0,0 +1,143 @@
+var CreatedOKLodop7766 = null, CLodopIsLocal;
+
+//====判断是否需要 Web打印服务CLodop:===
+//===(不支持插件的浏览器版本需要用它)===
+function needCLodop() {
+    try {
+        var ua = navigator.userAgent;
+        if (ua.match(/Windows\sPhone/i))
+            return true;
+        if (ua.match(/iPhone|iPod|iPad/i))
+            return true;
+        if (ua.match(/Android/i))
+            return true;
+        if (ua.match(/Edge\D?\d+/i))
+            return true;
+
+        var verTrident = ua.match(/Trident\D?\d+/i);
+        var verIE = ua.match(/MSIE\D?\d+/i);
+        var verOPR = ua.match(/OPR\D?\d+/i);
+        var verFF = ua.match(/Firefox\D?\d+/i);
+        var x64 = ua.match(/x64/i);
+        if ((!verTrident) && (!verIE) && (x64))
+            return true;
+        else if (verFF) {
+            verFF = verFF[0].match(/\d+/);
+            if ((verFF[0] >= 41) || (x64))
+                return true;
+        } else if (verOPR) {
+            verOPR = verOPR[0].match(/\d+/);
+            if (verOPR[0] >= 32)
+                return true;
+        } else if ((!verTrident) && (!verIE)) {
+            var verChrome = ua.match(/Chrome\D?\d+/i);
+            if (verChrome) {
+                verChrome = verChrome[0].match(/\d+/);
+                if (verChrome[0] >= 41)
+                    return true;
+            }
+        }
+        return false;
+    } catch (err) {
+        return true;
+    }
+}
+
+//====页面引用CLodop云打印必须的JS文件,用双端口(8000和18000)避免其中某个被占用:====
+if (needCLodop()) {
+    var src1 = "http://localhost:8000/CLodopfuncs.js?priority=1";
+    var src2 = "http://localhost:18000/CLodopfuncs.js?priority=0";
+
+    var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
+    var oscript = document.createElement("script");
+    oscript.src = src1;
+    head.insertBefore(oscript, head.firstChild);
+    oscript = document.createElement("script");
+    oscript.src = src2;
+    head.insertBefore(oscript, head.firstChild);
+    CLodopIsLocal = !!((src1 + src2).match(/\/\/localho|\/\/127.0.0./i));
+}
+
+//====获取LODOP对象的主过程:====
+function getLodop(oOBJECT, oEMBED) {
+    
+      var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='/assets/addons/stock/lodop-print/install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
+    var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='/assets/addons/stock/lodop-print/install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
+    var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='/assets/addons/stock/lodop-print/install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
+    var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='/assets/addons/stock/lodop-print/install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
+    var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
+    var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
+    var strCLodopInstall_1 = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='/assets/addons/stock/lodop-print/CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
+    var strCLodopInstall_2 = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
+    var strCLodopInstall_3 = ",成功后请刷新本页面。</font>";
+    var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='/assets/addons/stock/lodop-print/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
+    var LODOP;
+    try {
+        var ua = navigator.userAgent;
+        var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
+        if (needCLodop()) {
+            try {
+                LODOP = getCLodop();
+            } catch (err) {}
+            if (!LODOP && document.readyState !== "complete") {
+                alert("网页还没下载完毕,请稍等一下再操作.");
+                return;
+            }
+            if (!LODOP) {
+                document.body.innerHTML = strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : "") + strCLodopInstall_3 + document.body.innerHTML;                
+                return;
+            } else {
+                if (CLODOP.CVERSION < "3.0.7.5") {
+                    document.body.innerHTML = strCLodopUpdate + document.body.innerHTML;
+                }
+                if (oEMBED && oEMBED.parentNode)
+                    oEMBED.parentNode.removeChild(oEMBED);
+                if (oOBJECT && oOBJECT.parentNode)
+                    oOBJECT.parentNode.removeChild(oOBJECT);
+            }
+        } else {
+            var is64IE = isIE && !!(ua.match(/x64/i));
+            //=====如果页面有Lodop就直接使用,没有则新建:==========
+            if (oOBJECT || oEMBED) {
+                if (isIE)
+                    LODOP = oOBJECT;
+                else
+                    LODOP = oEMBED;
+            } else if (!CreatedOKLodop7766) {
+                LODOP = document.createElement("object");
+                LODOP.setAttribute("width", 0);
+                LODOP.setAttribute("height", 0);
+                LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
+                if (isIE)
+                    LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
+                else
+                    LODOP.setAttribute("type", "application/x-print-lodop");
+                document.documentElement.appendChild(LODOP);
+                CreatedOKLodop7766 = LODOP;
+            } else
+                LODOP = CreatedOKLodop7766;
+            //=====Lodop插件未安装时提示下载地址:==========
+            if ((!LODOP) || (!LODOP.VERSION)) {
+                if (ua.indexOf('Chrome') >= 0)
+                    document.body.innerHTML = strHtmChrome + document.body.innerHTML;
+                if (ua.indexOf('Firefox') >= 0)
+                    document.body.innerHTML = strHtmFireFox + document.body.innerHTML;
+                document.body.innerHTML ="请使用chrome或Firefox浏览器!";
+                return LODOP;
+            }
+        }
+        if (LODOP.VERSION < "6.2.2.6") {
+            if (!needCLodop())
+                document.body.innerHTML ="请使用chrome或Firefox浏览器!";
+            return LODOP;
+        }
+        //===如下空白位置适合调用统一功能(如注册语句、语言选择等):==
+
+
+
+        //=======================================================
+        return LODOP;
+    } catch (err) {
+        alert("getLodop出错:" + err);
+    }
+}

File diff suppressed because it is too large
+ 5 - 0
public/assets/addons/stock/pinyinUtil/dict/pinyin_dict_firstletter.js


+ 372 - 0
public/assets/addons/stock/pinyinUtil/pinyinUtil.js

@@ -0,0 +1,372 @@
+
+/**
+ * 汉字与拼音互转工具,根据导入的字典文件的不同支持不同
+ * 对于多音字目前只是将所有可能的组合输出,准确识别多音字需要完善的词库,而词库文件往往比字库还要大,所以不太适合web环境。
+ * @start 2016-09-26
+ * @last 2016-09-29
+ */
+(function(global, factory) {
+	if (typeof module === "object" && typeof module.exports === "object") {
+		module.exports = factory(global);
+	} else {
+		factory(global);
+	}
+})(typeof window !== "undefined" ? window : this, function(window) {
+
+	var toneMap = 
+	{
+		"ā": "a1",
+		"á": "a2",
+		"ǎ": "a3",
+		"à": "a4",
+		"ō": "o1",
+		"ó": "o2",
+		"ǒ": "o3",
+		"ò": "o4",
+		"ē": "e1",
+		"é": "e2",
+		"ě": "e3",
+		"è": "e4",
+		"ī": "i1",
+		"í": "i2",
+		"ǐ": "i3",
+		"ì": "i4",
+		"ū": "u1",
+		"ú": "u2",
+		"ǔ": "u3",
+		"ù": "u4",
+		"ü": "v0",
+		"ǖ": "v1",
+		"ǘ": "v2",
+		"ǚ": "v3",
+		"ǜ": "v4",
+		"ń": "n2",
+		"ň": "n3",
+		"": "m2"
+	};
+
+	var dict = {}; // 存储所有字典数据
+	var pinyinUtil =
+	{
+		/**
+		 * 解析各种字典文件,所需的字典文件必须在本JS之前导入
+		 */
+		parseDict: function()
+		{
+			// 如果导入了 pinyin_dict_firstletter.js
+			if(window.pinyin_dict_firstletter)
+			{
+				dict.firstletter = pinyin_dict_firstletter;
+			}
+			// 如果导入了 pinyin_dict_notone.js
+			if(window.pinyin_dict_notone)
+			{
+				dict.notone = {};
+				dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				for(var i in pinyin_dict_notone)
+				{
+					var temp = pinyin_dict_notone[i];
+					for(var j=0, len=temp.length; j<len; j++)
+					{
+						if(!dict.notone[temp[j]]) dict.notone[temp[j]] = i; // 不考虑多音字
+					}
+				}
+			}
+			// 如果导入了 pinyin_dict_withtone.js
+			if(window.pinyin_dict_withtone)
+			{
+				dict.withtone = {}; // 汉字与拼音映射,多音字用空格分开,类似这种结构:{'大': 'da tai'}
+				var temp = pinyin_dict_withtone.split(',');
+				for(var i=0, len = temp.length; i<len; i++)
+				{
+					// 这段代码耗时28毫秒左右,对性能影响不大,所以一次性处理完毕
+					dict.withtone[String.fromCharCode(i + 19968)] = temp[i]; // 这里先不进行split(' '),因为一次性循环2万次split比较消耗性能
+				}
+
+				// 拼音 -> 汉字
+				if(window.pinyin_dict_notone)
+				{
+					// 对于拼音转汉字,我们优先使用pinyin_dict_notone字典文件
+					// 因为这个字典文件不包含生僻字,且已按照汉字使用频率排序
+					dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				}
+				else
+				{
+					// 将字典文件解析成拼音->汉字的结构
+					// 与先分割后逐个去掉声调相比,先一次性全部去掉声调然后再分割速度至少快了3倍,前者大约需要120毫秒,后者大约只需要30毫秒(Chrome下)
+					var notone = pinyinUtil.removeTone(pinyin_dict_withtone).split(',');
+					var py2hz = {}, py, hz;
+					for(var i=0, len = notone.length; i<len; i++)
+					{
+						hz = String.fromCharCode(i + 19968); // 汉字
+						py = notone[i].split(' '); // 去掉了声调的拼音数组
+						for(var j=0; j<py.length; j++)
+						{
+							py2hz[py[j]] = (py2hz[py[j]] || '') + hz;
+						}
+					}
+					dict.py2hz = py2hz;
+				}
+			}
+		},
+		/**
+		 * 根据汉字获取拼音,如果不是汉字直接返回原字符
+		 * @param chinese 要转换的汉字
+		 * @param splitter 分隔字符,默认用空格分隔
+		 * @param withtone 返回结果是否包含声调,默认是
+		 * @param polyphone 是否支持多音字,默认否
+		 */
+		getPinyin: function(chinese, splitter, withtone, polyphone)
+		{
+			if(!chinese || /^ +$/g.test(chinese)) return '';
+			splitter = splitter == undefined ? ' ' : splitter;
+			withtone = withtone == undefined ? true : withtone;
+			polyphone = polyphone == undefined ? false : polyphone;
+			var result = [];
+			if(dict.withtone) // 优先使用带声调的字典文件
+			{
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var pinyin = dict.withtone[chinese[i]];
+					if(pinyin)
+					{
+						// 如果不需要多音字,默认返回第一个拼音,后面的直接忽略
+						// 所以这对数据字典有一定要求,常见字的拼音必须放在最前面
+						if(!polyphone) pinyin = pinyin.replace(/ .*$/g, '');
+						if(!withtone) pinyin = this.removeTone(pinyin); // 如果不需要声调
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin ); 
+					}
+					else if ( !chinese[i] || /^ +$/g.test(chinese[i]) ){
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else{
+						noChinese += chinese[i];
+					}
+				}
+				if ( noChinese ){
+					result.push( noChinese);
+					noChinese = '';
+				}
+			}
+			else if(dict.notone) // 使用没有声调的字典文件
+			{
+				if(withtone) console.warn('pinyin_dict_notone 字典文件不支持声调!');
+				if(polyphone) console.warn('pinyin_dict_notone 字典文件不支持多音字!');
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var temp = chinese.charAt(i),
+						pinyin = dict.notone[temp];
+					if ( pinyin ){ //插入拼音
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin );
+					}
+					else if ( !temp || /^ +$/g.test(temp) ){
+						//空格,插入之前的非中文字符
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else {
+						//非空格,关联到noChinese中
+						noChinese += temp;
+					}
+				}
+
+				if ( noChinese ){
+					result.push( noChinese );
+					noChinese = '';
+				}
+			}
+			else
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			if(!polyphone) return result.join(splitter);
+			else
+			{
+				if(window.pinyin_dict_polyphone) return parsePolyphone(chinese, result, splitter, withtone);
+				else return handlePolyphone(result, ' ', splitter);
+			}
+		},
+		/**
+		 * 获取汉字的拼音首字母
+		 * @param str 汉字字符串,如果遇到非汉字则原样返回
+		 * @param polyphone 是否支持多音字,默认false,如果为true,会返回所有可能的组合数组
+		 */
+		getFirstLetter: function(str, polyphone)
+		{
+			polyphone = polyphone == undefined ? false : polyphone;
+			if(!str || /^ +$/g.test(str)) return '';
+			if(dict.firstletter) // 使用首字母字典文件
+			{
+				var result = [];
+				for(var i=0; i<str.length; i++)
+				{
+					var unicode = str.charCodeAt(i);
+					var ch = str.charAt(i);
+					if(unicode >= 19968 && unicode <= 40869)
+					{
+						ch = dict.firstletter.all.charAt(unicode-19968);
+						if(polyphone) ch = dict.firstletter.polyphone[unicode] || ch;
+					}
+					result.push(ch);
+				}
+				if(!polyphone) return result.join(''); // 如果不用管多音字,直接将数组拼接成字符串
+				else return handlePolyphone(result, '', ''); // 处理多音字,此时的result类似于:['D', 'ZC', 'F']
+			}
+			else
+			{
+				var py = this.getPinyin(str, ' ', false, polyphone);
+				py = py instanceof Array ? py : [py];
+				var result = [];
+				for(var i=0; i<py.length; i++)
+				{
+					result.push(py[i].replace(/(^| )(\w)\w*/g, function(m,$1,$2){return $2.toUpperCase();}));
+				}
+				if(!polyphone) return result[0];
+				else return simpleUnique(result);
+			}
+		},
+		/**
+		 * 拼音转汉字,只支持单个汉字,返回所有匹配的汉字组合
+		 * @param pinyin 单个汉字的拼音,可以包含声调
+		 */
+		getHanzi: function(pinyin)
+		{
+			if(!dict.py2hz)
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			return dict.py2hz[this.removeTone(pinyin)] || '';
+		},
+		/**
+		 * 获取某个汉字的同音字,本方法暂时有问题,待完善
+		 * @param hz 单个汉字
+		 * @param sameTone 是否获取同音同声调的汉字,必须传进来的拼音带声调才支持,默认false
+		 */
+		getSameVoiceWord: function(hz, sameTone)
+		{
+			sameTone = sameTone || false
+			return this.getHanzi(this.getPinyin(hz, ' ', false))
+		},
+		/**
+		 * 去除拼音中的声调,比如将 xiǎo míng tóng xué 转换成 xiao ming tong xue
+		 * @param pinyin 需要转换的拼音
+		 */
+		removeTone: function(pinyin)
+		{
+			return pinyin.replace(/[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň]/g, function(m){ return toneMap[m][0]; });
+		},
+		/**
+		 * 将数组拼音转换成真正的带标点的拼音
+		 * @param pinyinWithoutTone 类似 xu2e这样的带数字的拼音
+		 */
+		getTone: function(pinyinWithoutTone)
+		{
+			var newToneMap = {};
+			for(var i in toneMap) newToneMap[toneMap[i]] = i;
+			return (pinyinWithoutTone || '').replace(/[a-z]\d/g, function(m) {
+				return newToneMap[m] || m;
+			});
+		}
+	};
+
+
+	/**
+	 * 处理多音字,将类似['D', 'ZC', 'F']转换成['DZF', 'DCF']
+	 * 或者将 ['chang zhang', 'cheng'] 转换成 ['chang cheng', 'zhang cheng']
+	 */
+	function handlePolyphone(array, splitter, joinChar)
+	{
+		splitter = splitter || '';
+		var result = [''], temp = [];
+		for(var i=0; i<array.length; i++)
+		{
+			temp = [];
+			var t = array[i].split(splitter);
+			for(var j=0; j<t.length; j++)
+			{
+				for(var k=0; k<result.length; k++)
+					temp.push(result[k] + (result[k]?joinChar:'') + t[j]);
+			}
+			result = temp;
+		}
+		return simpleUnique(result);
+	}
+
+	/**
+	 * 根据词库找出多音字正确的读音
+	 * 这里只是非常简单的实现,效率和效果都有一些问题
+	 * 推荐使用第三方分词工具先对句子进行分词,然后再匹配多音字
+	 * @param chinese 需要转换的汉字
+	 * @param result 初步匹配出来的包含多个发音的拼音结果
+	 * @param splitter 返回结果拼接字符
+	 */
+	function parsePolyphone(chinese, result, splitter, withtone)
+	{
+		var poly = window.pinyin_dict_polyphone;
+		var max = 7; // 最多只考虑7个汉字的多音字词,虽然词库里面有10个字的,但是数量非常少,为了整体效率暂时忽略之
+		var temp = poly[chinese];
+		if(temp) // 如果直接找到了结果
+		{
+			temp = temp.split(' ');
+			for(var i=0; i<temp.length; i++)
+			{
+				result[i] = temp[i] || result[i];
+				if(!withtone) result[i] = pinyinUtil.removeTone(result[i]);
+			}
+			return result.join(splitter);
+		}
+		for(var i=0; i<chinese.length; i++)
+		{
+			temp = '';
+			for(var j=0; j<max && (i+j)<chinese.length; j++)
+			{
+				if(!/^[\u2E80-\u9FFF]+$/.test(chinese[i+j])) break; // 如果碰到非汉字直接停止本次查找
+				temp += chinese[i+j];
+				var res = poly[temp];
+				if(res) // 如果找到了多音字词语
+				{
+					res = res.split(' ');
+					for(var k=0; k<=j; k++)
+					{
+						if(res[k]) result[i+k] = withtone ? res[k] : pinyinUtil.removeTone(res[k]);
+					}
+					break;
+				}
+			}
+		}
+		// 最后这一步是为了防止出现词库里面也没有包含的多音字词语
+		for(var i=0; i<result.length; i++)
+		{
+			result[i] = result[i].replace(/ .*$/g, '');
+		}
+		return result.join(splitter);
+	}
+
+	// 简单数组去重
+	function simpleUnique(array)
+	{
+		var result = [];
+		var hash = {};
+		for(var i=0; i<array.length; i++)
+		{
+			var key = (typeof array[i]) + array[i];
+			if(!hash[key])
+			{
+				result.push(array[i]);
+				hash[key] = true;
+			}
+		}
+		return result;
+	}
+
+	pinyinUtil.parseDict();
+	pinyinUtil.dict = dict;
+	window.pinyinUtil = pinyinUtil;
+
+});

+ 28 - 0
public/assets/js/addons.js

@@ -0,0 +1,28 @@
+define([], function () {
+    require.config({
+    paths: {
+        'editable': '../libs/bootstrap-table/dist/extensions/editable/bootstrap-table-editable.min',
+        'x-editable': '../addons/editable/js/bootstrap-editable.min',
+    },
+    shim: {
+        'editable': {
+            deps: ['x-editable', 'bootstrap-table']
+        },
+        "x-editable": {
+            deps: ["css!../addons/editable/css/bootstrap-editable.css"],
+        }
+    }
+});
+if ($("table.table").size() > 0) {
+    require(['editable', 'table'], function (Editable, Table) {
+        $.fn.bootstrapTable.defaults.onEditableSave = function (field, row, oldValue, $el) {
+            var data = {};
+            data["row[" + field + "]"] = row[field];
+            Fast.api.ajax({
+                url: this.extend.edit_url + "/ids/" + row[this.pk],
+                data: data
+            });
+        };
+    });
+}
+});

+ 132 - 0
public/assets/js/backend/stock/customer.js

@@ -0,0 +1,132 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/customer/index',
+                    add_url: 'stock/customer/add',
+                    edit_url: 'stock/customer/edit',
+                    del_url: 'stock/customer/del',
+                    multi_url: 'stock/customer/multi',
+                    table: 'stock_customer',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'weigh',
+                escape: false,
+
+                columns: [
+                    [
+                        { checkbox: true },
+                        { field: 'id', title: __('Id'),width:50 },
+                        { field: 'encode', title: __('Encode'),align:'left' },
+                        { field: 'name', title: __('Name'),width:150,align:'left' },
+                        {
+                            field: 'id',
+                            title: '<a href="javascript:;" class="btn btn-success btn-xs btn-toggle"><i class="fa fa-chevron-up"></i></a>',
+                            operate: false,
+                            formatter: Controller.api.formatter.subnode
+                        },
+                        { field: 'shortname', title: __('Shortname') },
+                        { field: 'innerphone', title: __('Innerphone') },
+                        { field: 'weigh', title: __('Weigh') },
+                        { field: 'enabledmark', title: __('Enabledmark'), visible: false, searchList: { "1": __('Enabledmark 1'), "0": __('Enabledmark 0') } },
+                        { field: 'enabledmark_text', title: __('Enabledmark'), operate: false },
+                        { field: 'remark', title: __('Remark') },
+                        { field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate }
+                    ]
+                ],
+                pagination: false,
+                search: false,
+                commonSearch: false,
+            });
+            //当内容渲染完成后
+            table.on('post-body.bs.table', function (e, settings, json, xhr) {
+                //默认隐藏所有子节点
+                // $("a.btn[data-id][data-pid][data-pid!=0]").closest("tr").hide();
+                // $(".btn-node-sub.disabled").closest("tr").hide();
+
+                //显示隐藏子节点
+                $(".btn-node-sub").off("click").on("click", function (e) {
+                    var status = $(this).data("shown") ? true : false;
+                    $("a.btn[data-pid='" + $(this).data("id") + "']").each(function () {
+                        $(this).closest("tr").toggle(!status);
+                    });
+                    $(this).data("shown", !status);
+                    return false;
+                });
+                $(".btn-change[data-id],.btn-delone,.btn-dragsort").data("success", function (data, ret) {
+                    Fast.api.refreshmenu();
+                });
+
+            });
+            //批量删除后的回调
+            $(".toolbar > .btn-del,.toolbar .btn-more~ul>li>a").data("success", function (e) {
+                Fast.api.refreshmenu();
+            });
+            //展开隐藏一级
+            $(document.body).on("click", ".btn-toggle", function (e) {
+                $("a.btn[data-id][data-pid][data-pid!=0].disabled").closest("tr").hide();
+                var that = this;
+                var show = $("i", that).hasClass("fa-chevron-down");
+                $("i", that).toggleClass("fa-chevron-down", !show);
+                $("i", that).toggleClass("fa-chevron-up", show);
+                $("a.btn[data-id][data-pid][data-pid!=0]").not('.disabled').closest("tr").toggle(show);
+                $(".btn-node-sub[data-pid=0]").data("shown", show);
+            });
+            //展开隐藏全部
+            $(document.body).on("click", ".btn-toggle-all", function (e) {
+                var that = this;
+                var show = $("i", that).hasClass("fa-plus");
+                $("i", that).toggleClass("fa-plus", !show);
+                $("i", that).toggleClass("fa-minus", show);
+                $(".btn-node-sub.disabled").closest("tr").toggle(show);
+                $(".btn-node-sub").data("shown", show);
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            formatter: {
+                subnode: function (value, row, index) {
+                    return '<a href="javascript:;" data-toggle="tooltip" title="' + __('Toggle sub menu') + '" data-id="' + row.id + '" data-pid="' + row.pid + '" class="btn btn-xs '
+                        + (row.haschild == 1 || row.ismenu == 1 ? 'btn-success' : 'btn-default disabled') + ' btn-node-sub"><i class="fa fa-sitemap"></i></a>';
+                }
+            },
+            bindevent: function () {
+                //ajax请求根据父级客户产生客户代码
+                function madeEncode() {
+                    $.ajax({
+                        url: 'stock/customer/madeencode',
+                        type: 'POST', //GET
+                        async: true, //或false,是否异步
+                        timeout: 5000, //超时时间
+                        dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text        
+                        data: { id: $('#c-pid option:selected').val() },
+                        success: function (data) {
+                            $('#c-encode').val(data);
+                        }
+                    });
+                }
+                $('#c-pid').change(madeEncode);
+                
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});

+ 67 - 0
public/assets/js/backend/stock/datadict.js

@@ -0,0 +1,67 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/datadict/index',
+                    add_url: 'stock/datadict/add',
+                    edit_url: 'stock/datadict/edit',
+                    del_url: 'stock/datadict/del',
+                    multi_url: 'stock/datadict/multi',
+                    table: 'stock/datadict',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'weigh',
+                escape: false,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'name', title: __('Name'), align: 'left'},
+                        {field: 'code', title: __('Code')},
+                        {field: 'istree', title: __('Istree'), visible: false, searchList: {"1": __('Istree 1'), "0": __('Istree 0')}},
+                        {field: 'istree_text', title: __('Istree'), operate: false},
+                        {field: 'weigh', title: __('Weigh')},
+                        {field: 'remark', title: __('Remark')},
+                        {field: 'enabled', title: __('Enabled'), visible: false, searchList: {"1": __('Enabled 1'), "0": __('Enabled 0')}},
+                        {field: 'enabled_text', title: __('Enabled'), operate: false},
+                        {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: {
+            formatter: {
+                istree: function (value, row, index) {
+                    if (value == 1) {
+                        return "是";
+                    } else if (value == 0) {
+                        return "否";
+                    }
+                }
+            },
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});

+ 92 - 0
public/assets/js/backend/stock/datadictitem.js

@@ -0,0 +1,92 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree'], function ($, undefined, Backend, Table, Form, jstree) {
+
+    var Controller = {
+        index: function () {
+            var datadict_id = 0;
+            var table = $("#table");
+            $(function () {
+                var autoWidth = $(window).width() - 220;
+                $('.table-content').css({'width': autoWidth, "position": "absolute", "left": "210px"});
+                $("#treeview").jstree({
+                    "themes": {"stripes": true},
+                    "core": {
+                        'multiple': false,
+                        'check_callback': true,
+                        "data": {
+                            url: "stock/datadict/getjsTree",
+                        }
+                    }
+                }).on('select_node.jstree', function (node, selected) {
+                    datadict_id = selected.node.data.id;
+                    table.bootstrapTable('refresh', {
+                        query: {
+                            datadict_id: datadict_id
+                        }
+                    });
+                }).on('ready.jstree',function(){
+                    if($("#treeview ul li:first").length>0){
+                        $('#treeview').jstree('select_node',$("#treeview ul li:first"));
+                    }
+                });
+            });
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/datadictitem/index',
+                    add_url: 'stock/datadictitem/add',
+                    edit_url: 'stock/datadictitem/edit',
+                    del_url: 'stock/datadictitem/del',
+                    multi_url: 'stock/datadictitem/multi',
+                    table: 'stock_datadictitem',
+                }
+            });
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'weigh',
+                height: $(window).height() - 137,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'name', title: __('Name')},
+                        {field: 'value', title: __('Value')},
+                        {field: 'weigh', title: __('Weigh')},
+                        {field: 'remark', title: __('Remark')},
+                        {field: 'enabled', title: __('Enabled'), visible: false, searchList: {"1": __('Enabled 1'), "0": __('Enabled 0')}},
+                        {field: 'enabled_text', title: __('Enabled'), operate: false},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ],
+                queryParams: function (params) {
+                    params.datadict_id = datadict_id;
+                    return params;
+                }
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+            // 刷新按钮事件
+            $('.btn-refresh').click(function (event) {
+                event.stopPropagation();
+                table.bootstrapTable('refresh', {
+                    query: {
+                        datadict_id: datadict_id
+                    }
+                });
+            });
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});

+ 231 - 0
public/assets/js/backend/stock/goods.js

@@ -0,0 +1,231 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'pingyinUntil', 'jstree'], function ($, undefined, Backend, Table, Form, pingyinUntil, jstree) {
+    var Controller = {
+        index: function () {
+            $(".btn-detail").data("area", ['90%', '90%']);
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/goods/index',
+                    add_url: 'stock/goods/add',
+                    edit_url: 'stock/goods/edit',
+                    del_url: 'stock/goods/del',
+                    import_url: 'stock/goods/import',
+                    multi_url: 'stock/goods/multi',
+                    detail_url: 'stock/goods/detail',
+                    table: 'stock_goods',
+                }
+            });
+            var table = $("#table");
+			var categoryids="";
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'goods.id',
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id'), },
+                        {field: 'goodscategory.name', title: __('goodscategory'), sortable: true},
+                        {field: 'volnum', title: __('volnum'), sortable: true},
+                        {field: 'goodsname', title: __('Goodsname'), sortable: true},
+                        {field: 'productmodel', title: __('Productmodel')},
+                        {field: 'barcode', title: __('Barcode')},
+                        {field: 'measureunit', title: __('Measureunit')},
+                        {field: 'univalence', title: '单桶重量(kg)', operate: 'BETWEEN'},
+                        {field: 'createtime', title: __('Createtime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
+                        {field: 'updatetime', title: __('Updatetime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ],
+                queryParams: function (params) {
+					params.categoryids=categoryids
+                    return params;
+                },
+                onPostBody: function () {
+                    $(".btn-detailone").data("area", ['90%', '90%']);
+                }
+            });
+            $(function () {
+                var autoWidth = $(window).width() - 220;
+                $('.table-content').css({'width': autoWidth, "position": "absolute", "left": "210px"});
+                $("#treeview").jstree({
+                    "themes": {"stripes": true},
+                    "checkbox": {
+                        "keep_selected_style": true,
+                        "whole_node":false,
+                        three_state:false,
+                    },
+                    "plugins": ["checkbox"],
+                    "core": {
+                        'check_callback': true,
+                        "data": {
+                            url: "stock/goodscategory/getjsTree",
+                        }
+                    }
+                }).on("select_node.jstree deselect_node.jstree", function (e, data) {
+                    var treenode=$("#treeview").jstree(true);
+					categoryids=treenode.get_checked().join(",");
+                    $("#table").bootstrapTable("refresh", {query: {categoryids: treenode.get_checked().join(",")}});
+                });
+            });
+            // 出入明细事件
+            $('.btn-detail').click(function (event) {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1) {
+                    var url = 'stock/goods/detail';
+                    var url = Table.api.replaceurl(url, {ids: selectedrow[0]['id']}, table);
+                    Fast.api.open(url, __('Inoutdetail'), $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? 'Only one record can be selected!' : 'Please select a record!')
+                }
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        detail: function () {
+            Table.api.init({
+                extend: {
+                    detail_url: 'stock/goods/detail',
+                },
+                showFooter: true
+            });
+            var table = $("#table");
+            // 初始化表格
+            var ids = $('#c-ids').val();
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.detail_url,
+                queryParams: function (params) {
+                    params.ids = ids;
+                    return params;
+                },
+                pk: 'id',
+                sortName: 'a.riqi',
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {
+                            field: 'leixing', title: __('InoutType'), sortable: true,
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'volnum', title: __('Volnum'), sortable: true,
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'goodsname', title: __('Goodsname'), sortable: true,
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'productmodel', title: __('Productmodel'),
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'measureunit', title: __('Measureunit'),
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'univalence', title: '单桶重量(kg)', operate: 'BETWEEN',
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                        {
+                            field: 'stockinnums', title: __('stockInNum'),
+                            footerFormatter: function (data) {
+                                if (data.length > 0) {
+                                    return data[0].sum.totalstockinnums;
+                                }
+
+                            }
+                        },
+                        {
+                            field: 'stockinamount', title: '入库总重(kg)',
+                            footerFormatter: function (data) {
+                                if (data.length > 0) {
+                                    return data[0].sum.totalstockinamount;
+                                }
+
+                            }
+                        },
+                        {
+                            field: 'stockoutnums', title: __('stockOutNum'),
+                            footerFormatter: function (data) {
+                                if (data.length > 0) {
+                                    return data[0].sum.totalstockoutnums;
+                                }
+
+                            }
+                        },
+                        {
+                            field: 'stockoutamount', title: '出库总重(kg)',
+                            footerFormatter: function (data) {
+                                if (data.length > 0) {
+                                    return data[0].sum.totalstockoutamount;
+                                }
+
+                            }
+                        },
+                        {
+                            field: 'riqi', title: __('InoutTime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime, datetimeFormat: "YYYY-MM-DD",
+                            footerFormatter: function () {
+                                return '';
+                            }
+                        },
+                    ]
+                ]
+            });
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+                function getPinyin() {
+                    var value = document.getElementById('c-goodsname').value;
+                    var result = '';
+                    result = pinyinUtil.getFirstLetter(value, false);
+                    document.getElementById('c-spell').value = result;
+                }
+                document.getElementById('c-goodsname').addEventListener('input', getPinyin);
+                //ajax请求根据商品类别产生商品商品代码
+                function madevolnum() {
+                    if ($('#c-goodscategoryid').val() != "") {
+                        Fast.api.ajax({
+                            url: 'stock/goods/madevolnum',
+                            type: 'POST', //GET
+                            async: true, //或false,是否异步
+                            timeout: 5000, //超时时间
+                            dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text        
+                            data: {goodscategoryid: $('#c-goodscategoryid').val()}
+                        },
+                                function (data) {
+                                    $('#c-volnum').val(data.volnum);
+                                    $('#c-goodscategoryid').val(data.goodscategory);
+                                }
+                        );
+                    }
+                }
+                $('#c-goodscategoryid').change(madevolnum);
+            }
+        }
+    };
+    return Controller;
+});

+ 121 - 0
public/assets/js/backend/stock/goodscategory.js

@@ -0,0 +1,121 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/goodscategory/index',
+                    add_url: 'stock/goodscategory/add',
+                    edit_url: 'stock/goodscategory/edit',
+                    del_url: 'stock/goodscategory/del',
+                    multi_url: 'stock/goodscategory/multi',
+                    table: 'stock_goodscategory',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                height: $(window).height() - 97,
+                pk: 'id',
+                sortName: 'id',
+                escape: false,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                        },
+                        {field: 'name', title: __('商品分类名称'), align: 'left'},
+                        {
+                            field: 'id',
+                            title: '<a href="javascript:;" class="btn btn-success btn-xs btn-toggle"><i class="fa fa-chevron-up"></i></a>',
+                            operate: false,
+                            formatter: Controller.api.formatter.subnode
+                        },
+                        {field: 'value', title: '分类代码'},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ],
+                pagination: false,
+                search: false,
+                commonSearch: false,
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+            //当内容渲染完成后
+            table.on('post-body.bs.table', function (e, settings, json, xhr) {
+                //默认隐藏所有子节点
+                //$("a.btn[data-id][data-pid][data-pid!=0]").closest("tr").hide();
+                // $(".btn-node-sub.disabled").closest("tr").hide();
+
+                //显示隐藏子节点
+                $(".btn-node-sub").off("click").on("click", function (e) {
+                    var status = $(this).data("shown") ? true : false;
+                    $("a.btn[data-pid='" + $(this).data("id") + "']").each(function () {
+                        $(this).closest("tr").toggle(!status);
+                    });
+                    $(this).data("shown", !status);
+                    return false;
+                });
+            });
+            //展开隐藏一级
+            $(document.body).on("click", ".btn-toggle", function (e) {
+                $("a.btn[data-id][data-pid][data-pid!=0].disabled").closest("tr").hide();
+                var that = this;
+                var show = $("i", that).hasClass("fa-chevron-down");
+                $("i", that).toggleClass("fa-chevron-down", !show);
+                $("i", that).toggleClass("fa-chevron-up", show);
+                $("a.btn[data-id][data-pid][data-pid!=0]").not('.disabled').closest("tr").toggle(show);
+                $(".btn-node-sub[data-pid=0]").data("shown", show);
+            });
+            //展开隐藏全部
+            $(document.body).on("click", ".btn-toggle-all", function (e) {
+                var that = this;
+                var show = $("i", that).hasClass("fa-plus");
+                $("i", that).toggleClass("fa-plus", !show);
+                $("i", that).toggleClass("fa-minus", show);
+                $(".btn-node-sub.disabled").closest("tr").toggle(show);
+                $(".btn-node-sub").data("shown", show);
+            });
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            formatter: {
+                subnode: function (value, row, index) {
+                    return '<a href="javascript:;" data-toggle="tooltip" title="' + __('Toggle sub menu') + '" data-id="' + row.id + '" data-pid="' + row.pid + '" class="btn btn-xs '
+                            + (row.haschild == 1 || row.ismenu == 1 ? 'btn-success' : 'btn-default disabled') + ' btn-node-sub"><i class="fa fa-sitemap"></i></a>';
+                }
+            },
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+                //ajax请求根据商品类别产生商品代码
+                function getvolnum() {
+                    Fast.api.ajax({
+                        url: 'stock/goodscategory/madevalue',
+                        type: 'POST', //GET
+                        async: true, //或false,是否异步
+                        timeout: 5000, //超时时间
+                        dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text        
+                        data: {id: $('#c-goodscategory option:selected').val()}},
+                            function (data) {
+                                $('#c-value').val(data.code);
+                            }
+                    );
+                }
+                $('#c-goodscategory').change(getvolnum);
+            }
+        }
+    };
+    return Controller;
+});

File diff suppressed because it is too large
+ 0 - 0
public/assets/js/backend/stock/libs/element-ui.css


File diff suppressed because it is too large
+ 0 - 0
public/assets/js/backend/stock/libs/element-ui.js


BIN
public/assets/js/backend/stock/libs/fonts/element-icons.ttf


BIN
public/assets/js/backend/stock/libs/fonts/element-icons.woff


File diff suppressed because it is too large
+ 5 - 0
public/assets/js/backend/stock/libs/vue.js


+ 242 - 0
public/assets/js/backend/stock/stockcur.js

@@ -0,0 +1,242 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree', 'echarts', 'echarts-theme'], function ($, undefined, Backend, Table, Form, jstree, Echarts, undefined) {
+
+    var Controller = {
+        index: function () {
+            $(".btn-detail").data("area", ['90%', '90%']);
+
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/stockcur/index',
+                    add_url: 'stock/stockcur/add',
+                    edit_url: 'stock/stockcur/edit',
+                    del_url: 'stock/stockcur/del',
+                    multi_url: 'stock/stockcur/multi',
+                    table: 'stock_stockcur',
+                }
+            });
+            var table = $("#table");
+            $(function () {
+                var autoWidth = $(window).width() - 220;
+                $('.table-content').css({ 'width': autoWidth, "position": "absolute", "left": "210px" });
+                $("#treeview").jstree({
+                    "themes": { "stripes": true },
+                    "checkbox": {
+                        "keep_selected_style": false,
+                    },
+                    "plugins": ["checkbox"],
+                    "core": {
+                        'check_callback': true,
+                        "data": {
+                            url: "stock/goodscategory/getjsTree",
+                        }
+                    }
+                }).on("select_node.jstree deselect_node.jstree", function (e, data) {
+                    $("#table").bootstrapTable("refresh", { query: { categoryids: data.selected.join(",") } });
+                });
+                $.fn.bootstrapTable.locales[Table.defaults.locale]['formatSearch'] = function () {
+                    return '搜索[商品代码、商品名]';
+                };
+            });
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        { checkbox: true },
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                            width: 50,
+                            searchable: false
+                        },
+                        { field: 'stockgoods.volnum', title: __('商品代码'), sortable: true, operate: "LIKE" },
+                        { field: 'stockgoods.goodsname', title: __('stock_goods.goodsname'), sortable: true, operate: "LIKE" },
+                        { field: 'stockgoods.productmodel', title: '型号', searchable: false },
+                        { field: 'stockgoods.measureunit', title: '单位', searchable: false },
+                        { field: 'stockgoods.univalence', title: '单桶重量', searchable: false },
+                        { field: 'totalcurnums', title: __('库存数量'), searchable: false },
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+            // 出入明细事件
+            $('.btn-detail').click(function (event) {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1) {
+                    var url = 'stock/goods/detail';
+                    var url = Table.api.replaceurl(url, { ids: selectedrow[0]['stock_goods_id'] }, table);
+                    Fast.api.open(url, __('出入明细'), $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? '只能选择一条记录' : '请选择一条记录')
+                }
+            });
+        },
+        mainpage: function () {
+            var goodscategory_list = [];
+            var linechartdata = [];
+            //商品分类
+            $.ajax({
+                url: 'stock/goodscategory/category',
+                type: 'GET', //GET
+                async: false, //或false,是否异步
+                timeout: 5000, //超时时间
+                dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text
+                success: function (data) {
+                    goodscategory_list = [];
+                    if (data) {
+                        for (var i = 0; i < data.length; i++) {
+                            var value = data[i]['id'];
+                            goodscategory_list[value] = data[i]['name'];
+                        }
+                    }
+                }
+            });
+
+            //库存饼状图
+            $.ajax({
+                url: 'stock/stockcur/countData',
+                type: 'POST', //GET
+                async: true, //或false,是否异步
+                timeout: 5000, //超时时间
+                dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text
+                success: function (data) {
+                    var datalist = data.rows;
+                    var legendData = [];
+                    for (var i = 0; i < datalist.length; i++) {
+                        legendData.push(goodscategory_list[datalist[i]['stock_goods']['goodscategoryid']]);
+                    }
+                    var totalItemAmount = [];
+                    var totalAmount = 0;
+                    for (var i = 0; i < datalist.length; i++) {
+                        totalItemAmount[i] = { 'value': datalist[i].totalitemamount, 'name': goodscategory_list[datalist[i]['stock_goods']['goodscategoryid']] };
+                        totalAmount += parseFloat(datalist[i].totalitemamount);
+                    }
+                    var totalNum = [];
+                    var totalNumAdd = 0;
+                    for (var i = 0; i < datalist.length; i++) {
+                        totalNum[i] = { 'value': datalist[i].totalnum, 'name': goodscategory_list[datalist[i]['stock_goods']['goodscategoryid']] };
+                        totalNumAdd += parseFloat(datalist[i].totalnum);
+                    }
+                    madePie(legendData, totalItemAmount, 'stockcur_amount', '库存重量', '库存总重量' + totalAmount.toFixed(2) + '千克');
+                    madePie(legendData, totalNum, 'stockcur_num', '库存总件数', '库存共' + totalNumAdd + '件');
+                }
+            });
+            function madePie(legendData, seriesData, elementId, titleText, titleSubText) {
+                var myChart = Echarts.init(document.getElementById(elementId), 'walden');
+                var option = {
+                    title: {
+                        text: titleText,
+                        subtext: titleSubText,
+                        x: 'center'
+                    },
+                    tooltip: {
+                        trigger: 'item',
+                        formatter: "{b} : {c} ({d}%)"
+                    },
+                    legend: {
+                        orient: 'vertical',
+                        x: 'left',
+                        data: legendData,
+                    },
+                    toolbox: {
+                        show: true,
+                        feature: {
+                            mark: { show: true },
+                            dataView: { show: true, readOnly: false },
+                            magicType: {
+                                show: true,
+                                type: ['pie', 'funnel'],
+                                option: {
+                                    funnel: {
+                                        x: '25%',
+                                        width: '50%',
+                                        funnelAlign: 'left',
+                                        max: 1548
+                                    }
+                                }
+                            },
+                            restore: { show: true },
+                            saveAsImage: { show: true }
+                        }
+                    },
+                    calculable: true,
+                    series: [{
+
+                        type: 'pie',
+                        radius: '55%',
+                        center: ['50%', '60%'],
+                        data: seriesData,
+                    }]
+                };
+
+                myChart.setOption(option);
+            };
+
+            //折线图
+            $.ajax({
+                url: 'stock/stockin/countData',
+                type: 'POST', //GET
+                async: true, //或false,是否异步
+                timeout: 5000, //超时时间
+                dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text
+                success: function (data) {
+                    linechartdata=data;
+                    var myChart = Echarts.init(document.getElementById('linechart'), 'walden');
+                    var option = {
+                        title: {
+                            text: '出入库重量折线图',
+                            subtext: ''
+                        },
+                        legend: {
+                            data: ["入库重量", "出库重量"]
+                        },
+                        xAxis: {
+                            type: 'category',
+                            boundaryGap: false,
+                            data: linechartdata.month,
+                            axisLabel:{
+                                interval:0,
+                                rotate:45
+                            }
+                        },
+                        yAxis: {
+                            type: 'value'
+                        },
+                        series: [{
+                            name: "入库重量",
+                            type: 'line',
+                            smooth: true,
+                            data: linechartdata.indata
+                        },
+                        {
+                            name: "出库重量",
+                            type: 'line',
+                            smooth: true,
+                            data: linechartdata.outdata
+                        }]
+                    };
+                    myChart.setOption(option);
+                }
+            });
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});

+ 893 - 0
public/assets/js/backend/stock/stockin.js

@@ -0,0 +1,893 @@
+requirejs.config({
+    paths: {
+        vue: 'backend/stock/libs/vue',
+        ELEMENT: 'backend/stock/libs/element-ui',
+    },
+    shim: {
+        ELEMENT: ['vue']
+    }
+})
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'vue', 'ELEMENT', 'moment'], function ($, undefined, Backend, Table, Form, Vue, ELEMENT, Moment) {
+    var Controller = {
+        index: function () {
+            $(".btn-add, .btn-edit,.btn-audit,.btn-settle,.btn-split").data("area", ['100%', '100%']);
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/stockin/index',
+                    add_url: 'stock/stockin/add',
+                    edit_url: 'stock/stockin/edit',
+                    del_url: 'stock/stockin/del',
+                    multi_url: 'stock/stockin/multi',
+                    look_url: 'stock/stockin/look',
+                    table: 'stock_stockin',
+                }
+            });
+            var table = $("#table");
+            var selfOperate = {
+                'click .btn-editone': function (e, value, row, index) {
+                    e.stopPropagation();
+                    e.preventDefault();
+                    if (!row.audittime) {
+                        var table = $(this).closest('table');
+                        var options = table.bootstrapTable('getOptions');
+                        var ids = row[options.pk];
+                        row = $.extend({}, row ? row : {}, { ids: ids });
+                        var url = options.extend.edit_url;
+                        Fast.api.open(Table.api.replaceurl(url, row, table), __('Edit'), $(this).data() || {});
+                    } else {
+                        Toastr.error('该入库记录已审核,不能修改!')
+                    }
+                },
+                'click .btn-delone': function (e, value, row, index) {
+                    e.stopPropagation();
+                    e.preventDefault();
+                    var that = this;
+                    var top = $(that).offset().top - $(window).scrollTop();
+                    var left = $(that).offset().left - $(window).scrollLeft() - 260;
+                    if (top + 154 > $(window).height()) {
+                        top = top - 154;
+                    }
+                    if ($(window).width() < 480) {
+                        top = left = undefined;
+                    }
+                    if (!row.audittime) {
+                        Layer.confirm(
+                            __('Are you sure you want to delete this item?'), { icon: 3, title: __('Warning'), offset: [top, left], shadeClose: true },
+                            function (index) {
+                                var table = $(that).closest('table');
+                                var options = table.bootstrapTable('getOptions');
+                                Table.api.multi("del", row[options.pk], table, that);
+                                Layer.close(index);
+                            }
+                        );
+                    } else {
+                        Toastr.error('该入库记录已审核,不能删除!')
+                    }
+                }
+            }
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                sortName: 'createtime',
+                singleSelect: true, //是否启用单选
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        { checkbox: true },
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                            operate: false,
+                            width: 50,
+                        },
+                        { field: 'docnum', title: '单据编号', sortable: true },
+                        { field: 'supplier.name', title: '供应商', operate: 'LIKE' },
+                        { field: 'inboundtime', title: '入库时间', operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime },
+                        { field: 'totalamount', title: '总重量(kg)', operate: 'BETWEEN' },
+                        { field: 'remark', title: __('Remark'), searchable: false },
+                        { field: 'charged', visible: false },
+                        { field: 'audittime', title: '审核状态', formatter: Controller.api.formatter.audit },
+                        // { field: 'settletime', title: '结算状态', formatter: Controller.api.formatter.settle },
+                        { field: 'operate', title: 'Operate', table: table, events: selfOperate, formatter: Table.api.formatter.operate }
+                    ]
+                ],
+                onPostBody: function () {
+                    $(".btn-editone").data("area", ['100%', '100%']);
+                }
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+            // 批量编辑按钮事件
+            $('.btn-edit').click(function (event) {
+                event.stopPropagation();
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1 && !selectedrow[0]['audittime']) {
+                    var that = this;
+                    var url = 'stock/stockin/edit';
+                    selectedrow[0] = $.extend({}, selectedrow[0] ? selectedrow[0] : {}, { ids: selectedrow[0]['id'] });
+                    var url = Table.api.replaceurl(url, selectedrow[0], table);
+                    Fast.api.open(url, __('Edit'), $(that).data() || {});
+                } else {
+                    if (selectedrow[0]['audittime']) {
+                        Toastr.error('该入库记录已审核,不能修改!')
+                    } else {
+                        Toastr.error(selectedrow.length > 1 ? '只能选择一条入库记录' : '请选择入库记录')
+                    }
+                }
+            });
+            // 批量删除按钮事件
+            $('.btn-del').click(function (event) {
+                event.stopPropagation();
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1 && !selectedrow[0]['audittime']) {
+                    var that = this;
+                    Layer.confirm(
+                        __('Are you sure you want to delete the %s selected item?', selectedrow.length), { icon: 3, title: __('Warning'), offset: 0, shadeClose: true },
+                        function (index) {
+                            Table.api.multi("del", selectedrow[0]['id'], table, that);
+                            Layer.close(index);
+                        }
+                    );
+                } else {
+                    if (selectedrow[0]['audittime']) {
+                        Toastr.error('该入库记录已审核,不能删除!')
+                    } else {
+                        Toastr.error(selectedrow.length > 1 ? '只能选择一条入库记录' : '请选择入库记录')
+                    }
+                }
+            });
+            // 打印按钮事件
+            $('.toolbar').on('click', '.btn-print', function () {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1) {
+                    Fast.api.open('stock/stockin/printer?id=' + selectedrow[0]['id'], __('打印'), $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? '只能选择一条入库记录' : '请选择入库记录')
+                }
+            });
+            // 审核/反审核按钮事件 结算/反结算按钮事件
+            $('.toolbar').on('click', '.btn-audit,.btn-settle', function () {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                var title = "审核";
+                if (selectedrow.length == 1) {
+                    var operatetype = $(this).data("operatetype");
+                    if (operatetype == "audit") {
+                        console.log(selectedrow[0].settletime);
+                        if (selectedrow[0].settletime !== null) {
+                            Toastr.error("该入库单已结算,请先进行反结算!");
+                            return;
+                        } else {
+                            title = selectedrow[0].audittime == null ? "审核" : "反审核";
+                        }
+                    } else if (operatetype == "settle") {
+                        if (selectedrow[0].audittime == null) {
+                            Toastr.error("该入库单未审核,请先进行审核!");
+                            return;
+                        } else {
+                            title = selectedrow[0].settletime == null ? "结算" : "反结算";
+                        }
+                    }
+                    var url = 'stock/stockin/look?operatetype=' + operatetype;
+                    selectedrow[0] = $.extend({}, selectedrow[0] ? selectedrow[0] : {}, { ids: selectedrow[0]['id'] });
+                    var url = Table.api.replaceurl(url, selectedrow[0], table);
+                    Fast.api.open(url, title, $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? '只能选择一条记录' : '请选择一条记录')
+                }
+            });
+        },
+        getlist: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    list_url: 'stock/stockin/getlist',
+                }
+            });
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.list_url,
+                pk: 'id',
+                sortName: 'stockinlist.id',
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        { checkbox: true },
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                            searchable: false,
+                        },
+                        { field: 'stockin.docnum', operate: "LIKE", title: '单据编号', sortable: true },
+                        { field: 'stockin.supplier.name', operate: "LIKE", title: '供应商' },
+                        { field: 'stockin.inboundtime', title: '入库日期', operate: 'RANGE', formatter: Table.api.formatter.datetime, datetimeFormat: 'YYYY-MM-DD', addclass: 'datetimerange' },
+                        { field: 'goods.volnum', title: '商品代码' },
+                        { field: 'goods.goodsname', operate: "LIKE", title: '商品名称', operate: 'LIKE' },
+                        { field: 'goods.productmodel', title: '商品型号', searchable: false },
+                        { field: 'goods.measureunit', title: '单位', searchable: false },
+                        { field: 'inboundprice', title: '单桶重量(kg)', searchable: false },
+                        { field: 'stockinnums', title: '入库数', searchable: false },
+                        { field: 'amount', title: '总重量(kg)' },
+                    ]
+                ]
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        look: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        row: { stock_supplier_id: "", remark: "", inboundtime: "", totalamount: 0.00 },
+                        supplierlist: [],
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 355) + "px" },
+                            list: [],
+                        },
+                        commiturl: "",
+                    }
+                },
+                computed: {
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) },
+                },
+                created() {
+                    this.loadstockininfo()
+                },
+                methods: {
+                    loadstockininfo() {
+                        let operatetype = Fast.api.query("operatetype")
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/stockin/info',
+                            type: "POST",
+                            data: { id: Fast.api.query("ids") },
+                            async: false,
+                            success: function (res) {
+                                res.row.inboundtime = Moment(parseInt(res.row.inboundtime) * 1000).format("YYYY-MM-DD");
+                                if (operatetype == "audit") {
+                                    if (res.row.audittime) {
+                                        that.commiturl = 'stock/stockin/unaudit';
+                                        $('#audit').html('反审核');
+                                    } else {
+                                        that.commiturl = 'stock/stockin/audit';
+                                        $('#audit').html('审核');
+                                    }
+                                } else if (operatetype == "settle") {
+                                    if (res.row.settletime) {
+                                        that.commiturl = 'stock/stockin/unsettle';
+                                        $('#audit').html('反结算');
+                                    } else {
+                                        that.commiturl = 'stock/stockin/settle';
+                                        $('#audit').html('结算');
+                                    }
+                                }
+                                that.row = res.row;
+                                that.selectedgoodsdata.list = res.goodslist;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                }
+            })
+            // 提交事件
+            $(document).on('click', '#audit', function (e) {
+                e.preventDefault();
+                var url = $("#c-commiturl").val();
+                Layer.confirm(
+                    __('确认提交?'), { icon: 3, title: __('Warning'), offset: 200, shadeClose: true },
+                    function (index) {
+                        $('#form').attr('action', url);
+                        $('#form').submit();
+                        Layer.close(index);
+                    }
+                );
+            });
+            Form.api.bindevent($("form[role=form]"));
+        },
+        add: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        searchvalue: "",
+                        row: { stock_supplier_id: "", remark: "", inboundtime: new Date(), totalamount: 0.00 },
+                        curgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", inboundprice: "", stockinnums: 0, stockingoodsremark: "", amount: "", barcode: "" },
+                        defaultgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", inboundprice: "", stockinnums: 0, stockingoodsremark: "", amount: "" },
+                        supplierlist: [],
+                        goodsdata: {
+                            table: { height: ($(window).height() - 490) + "px" },
+                            list: [],
+                            pagenation: {
+                                currentpage: 1,
+                                pagesize: 10,
+                                total: 0
+                            }
+                        },
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 355) + "px" },
+                            list: [],
+                        },
+                        deselectedgoodslist: [],
+                        rules: {
+                            inboundprice: [
+                                { required: true, type: 'string', trigger: 'blur', message: '金额不能为空' },
+                                { pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/, message: '请输入正确额格式,可保留两位小数' }
+                            ],
+                            stockinnums: [
+                                { required: true, message: '入库数量不能为空' },
+                                { type: 'number', message: '入库数量必须为数字值' }
+                            ],
+                        }
+                    }
+                },
+                computed: {
+                    main: function () { return JSON.stringify(this.row) },
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) }
+                },
+                created() {
+                    this.loadgoodslist()
+                    this.loadsupplierlist()
+                },
+                methods: {
+                    loadsupplierlist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/supplier/index',
+                            data: {},
+                            success: function (res) {
+                                that.supplierlist = res.rows;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadgoodslist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/goods/getlist',
+                            data: { sort: 'goods.id', order: 'desc', offset: this.goodsdata.pagenation.pagesize * (this.goodsdata.pagenation.currentpage - 1), limit: this.goodsdata.pagenation.pagesize, searchvalue: this.searchvalue },
+                            success: function (res) {
+                                that.goodsdata.list = res.rows;
+                                that.goodsdata.pagenation.total = res.total;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    handleSizeChange(val) {
+                        this.goodsdata.pagenation.pagesize = val;
+                        this.loadgoodslist();
+                    },
+                    handleCurrentChange(val) {
+                        this.goodsdata.pagenation.currentpage = val;
+                        this.loadgoodslist();
+                    },
+                    debounce(fn, delay) {
+                        let timeout = null;
+                        delay = delay || 500;
+                        return function (e) {
+                            let args = arguments;
+                            let that = this;
+                            clearTimeout(timeout);
+                            timeout = setTimeout(function () {
+                                fn.apply(that, args);
+                            }, delay);
+                        };
+                    },
+                    barcodeinputenter() {
+                        let that=this;
+                        if (this.curgood.barcode == "") {
+                            Fast.api.msg("请输入商品条码并按回车键!")
+                        } else {
+                            Fast.api.ajax({
+                                url: "stock/goods/getgoodsbybarcodeorid",
+                                data: { barcode: this.curgood.barcode }
+                            }, function (data) {
+                                if (data !== null) {
+                                    that.curgood.stock_goods_id = data.id;
+                                    that.curgood.volnum = data.volnum;
+                                    that.curgood.goodsname = data.goodsname;
+                                    that.curgood.productmodel = data.productmodel;
+                                    that.curgood.measureunit = data.measureunit;
+                                    that.curgood.inboundprice = data.univalence;
+                                    that.curgood.barcode = data.barcode;
+                                    that.curgood.stockinnums = 1;
+                                    that.curgood.stockingoodsremark = "";
+                                    that.curgood.amount = data.univalence;
+                                }
+                            })
+                        }
+                    },
+                    onSearchvalueChange() {
+                        this.debounce(this.loadgoodslist, 1000)();
+                    },
+                    selectonegood(currentrow) {
+                        this.curgood.stock_goods_id = currentrow.id;
+                        this.curgood.volnum = currentrow.volnum;
+                        this.curgood.goodsname = currentrow.goodsname;
+                        this.curgood.productmodel = currentrow.productmodel;
+                        this.curgood.measureunit = currentrow.measureunit;
+                        this.curgood.inboundprice = currentrow.univalence;
+                        this.curgood.barcode = currentrow.barcode;
+                        this.curgood.stockinnums = 1;
+                        this.curgood.stockingoodsremark = "";
+                        this.curgood.amount = currentrow.univalence;
+                    },
+                    addtolist() {
+                        let that = this;
+                        let hasadded = false;
+                        if (this.curgood.stock_goods_id != "") {
+                            this.selectedgoodsdata.list.forEach(item => {
+                                if (item.stock_goods_id == that.curgood.stock_goods_id) {
+                                    Fast.api.msg("该商品已添加,请勿重复添加!")
+                                    hasadded = true;
+                                }
+                            });
+                            if (!hasadded) {
+                                let good = JSON.parse(JSON.stringify(this.curgood));
+                                this.selectedgoodsdata.list.unshift(good);
+                                this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                                this.row.totalamount = this.accAdd(this.row.totalamount, good.amount);
+                            }
+                        } else {
+                            Fast.api.msg("请选择入库商品!")
+                        }
+                    },
+                    reset() {
+                        this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                    },
+                    getcurgoodamount() {
+                        this.curgood.amount = this.accMul(this.curgood.stockinnums, this.curgood.inboundprice);
+                    },
+                    accMul(arg1, arg2) {
+                        var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+                        try {
+                            m += s1.split(".")[1].length
+                        } catch (e) {
+                        }
+                        try {
+                            m += s2.split(".")[1].length
+                        } catch (e) {
+                        }
+                        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+                    },
+                    accAdd(arg1, arg2) {
+                        var r1, r2, m;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length
+                        } catch (e) {
+                            r1 = 0
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length
+                        } catch (e) {
+                            r2 = 0
+                        }
+                        m = Math.pow(10, Math.max(r1, r2))
+                        return (arg1 * m + arg2 * m) / m
+                    },
+                    accSub(arg1, arg2) {
+                        var r1, r2, m, n;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length;
+                        } catch (e) {
+                            r1 = 0;
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length;
+                        } catch (e) {
+                            r2 = 0;
+                        }
+                        m = Math.pow(10, Math.max(r1, r2));
+                        //last modify by deeka
+                        //动态控制精度长度
+                        n = (r1 >= r2) ? r1 : r2;
+                        return ((arg1 * m - arg2 * m) / m).toFixed(n);
+                    },
+                    deleteselected(row) {
+                        this.selectedgoodsdata.list = this.selectedgoodsdata.list.filter(item => {
+                            return item != row;
+                        });
+                        this.row.totalamount = this.accSub(this.row.totalamount, row.amount);
+                    }
+
+                }
+            })
+            Form.api.bindevent($("form[role=form]"), "", "", function () {
+                let main = JSON.parse($("#c-main").val());
+                let goodslist = JSON.parse($("#c-goodslist").val());
+                if (main.stock_supplier_id == "") {
+                    Toastr.error("请选择供应商");
+                    return false;
+                } else if (goodslist.length < 1) {
+                    Toastr.error("请添加入库商品");
+                    return false;
+                }
+            });
+        },
+        edit: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        searchvalue: "",
+                        row: { stock_supplier_id: "", remark: "", inboundtime: "", totalamount: 0.00 },
+                        curgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", inboundprice: "", stockinnums: 0, stockingoodsremark: "", amount: "", barcode: "" },
+                        defaultgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", inboundprice: "", stockinnums: 0, stockingoodsremark: "", amount: "" },
+                        supplierlist: [],
+                        goodsdata: {
+                            table: { height: ($(window).height() - 490) + "px" },
+                            list: [],
+                            pagenation: {
+                                currentpage: 1,
+                                pagesize: 10,
+                                total: 0
+                            }
+                        },
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 355) + "px" },
+                            list: [],
+                        },
+                        deselectedgoodslist: [],
+                        rules: {
+                            inboundprice: [
+                                { required: true, type: 'string', trigger: 'blur', message: '金额不能为空' },
+                                { pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/, message: '请输入正确额格式,可保留两位小数' }
+                            ],
+                            stockinnums: [
+                                { required: true, message: '入库数量不能为空' },
+                                { type: 'number', message: '入库数量必须为数字值' }
+                            ],
+                        }
+                    }
+                },
+                computed: {
+                    main: function () { return JSON.stringify(this.row) },
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) },
+                    deletedgoodslist: function () { return JSON.stringify(this.deselectedgoodslist) }
+                },
+                created() {
+                    this.loadgoodslist()
+                    this.loadsupplierlist()
+                    this.loadstockininfo()
+                },
+                methods: {
+                    loadstockininfo() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/stockin/info',
+                            type: "POST",
+                            data: { id: Fast.api.query("ids") },
+                            success: function (res) {
+                                res.row.inboundtime = Moment(parseInt(res.row.inboundtime) * 1000).format("YYYY-MM-DD");
+                                console.log(res.row);
+                                that.row = res.row;
+                                that.selectedgoodsdata.list = res.goodslist;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadsupplierlist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/supplier/index',
+                            data: {},
+                            success: function (res) {
+                                that.supplierlist = res.rows;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadgoodslist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/goods/getlist',
+                            data: { sort: 'goods.id', order: 'desc', offset: this.goodsdata.pagenation.pagesize * (this.goodsdata.pagenation.currentpage - 1), limit: this.goodsdata.pagenation.pagesize, searchvalue: this.searchvalue },
+                            success: function (res) {
+                                that.goodsdata.list = res.rows;
+                                that.goodsdata.pagenation.total = res.total;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    handleSizeChange(val) {
+                        this.goodsdata.pagenation.pagesize = val;
+                        this.loadgoodslist();
+                    },
+                    handleCurrentChange(val) {
+                        this.goodsdata.pagenation.currentpage = val;
+                        this.loadgoodslist();
+                    },
+                    debounce(fn, delay) {
+                        let timeout = null;
+                        delay = delay || 500;
+                        return function (e) {
+                            let args = arguments;
+                            let that = this;
+                            clearTimeout(timeout);
+                            timeout = setTimeout(function () {
+                                fn.apply(that, args);
+                            }, delay);
+                        };
+                    },
+                    barcodeinputenter() {
+                        let that=this;
+                        if (this.curgood.barcode == "") {
+                            Fast.api.msg("请输入商品条码并按回车键!")
+                        } else {
+                            Fast.api.ajax({
+                                url: "stock/goods/getgoodsbybarcodeorid",
+                                data: { barcode: this.curgood.barcode }
+                            }, function (data) {
+                                if (data !== null) {
+                                    that.curgood.stock_goods_id = data.id;
+                                    that.curgood.volnum = data.volnum;
+                                    that.curgood.goodsname = data.goodsname;
+                                    that.curgood.productmodel = data.productmodel;
+                                    that.curgood.measureunit = data.measureunit;
+                                    that.curgood.inboundprice = data.univalence;
+                                    that.curgood.barcode = data.barcode;
+                                    that.curgood.stockinnums = 1;
+                                    that.curgood.stockingoodsremark = "";
+                                    that.curgood.amount = data.univalence;
+                                }
+                            })
+                        }
+                    },
+                    onSearchvalueChange() {
+                        this.debounce(this.loadgoodslist, 1000)();
+                    },
+                    selectonegood(currentrow) {
+                        this.curgood.stock_goods_id = currentrow.id;
+                        this.curgood.volnum = currentrow.volnum;
+                        this.curgood.goodsname = currentrow.goodsname;
+                        this.curgood.productmodel = currentrow.productmodel;
+                        this.curgood.measureunit = currentrow.measureunit;
+                        this.curgood.inboundprice = currentrow.univalence;
+                        this.curgood.barcode = currentrow.barcode;
+                        this.curgood.stockinnums = 1;
+                        this.curgood.stockingoodsremark = "";
+                        this.curgood.amount = currentrow.univalence;
+                    },
+                    addtolist() {
+                        let that = this;
+                        let hasadded = false;
+                        if (this.curgood.stock_goods_id != "") {
+                            this.selectedgoodsdata.list.forEach(item => {
+                                if (item.stock_goods_id == that.curgood.stock_goods_id) {
+                                    Fast.api.msg("该商品已添加,请勿重复添加!")
+                                    hasadded = true;
+                                }
+                            });
+                            if (!hasadded) {
+                                let good = JSON.parse(JSON.stringify(this.curgood));
+                                this.selectedgoodsdata.list.unshift(good);
+                                this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                                this.row.totalamount = this.accAdd(this.row.totalamount, good.amount);
+                            }
+                        } else {
+                            Fast.api.msg("请选择入库商品!")
+                        }
+                    },
+                    reset() {
+                        this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                    },
+                    getcurgoodamount() {
+                        this.curgood.amount = this.accMul(this.curgood.stockinnums, this.curgood.inboundprice);
+                    },
+                    accMul(arg1, arg2) {
+                        var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+                        try {
+                            m += s1.split(".")[1].length
+                        } catch (e) {
+                        }
+                        try {
+                            m += s2.split(".")[1].length
+                        } catch (e) {
+                        }
+                        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+                    },
+                    accAdd(arg1, arg2) {
+                        var r1, r2, m;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length
+                        } catch (e) {
+                            r1 = 0
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length
+                        } catch (e) {
+                            r2 = 0
+                        }
+                        m = Math.pow(10, Math.max(r1, r2))
+                        return (arg1 * m + arg2 * m) / m
+                    },
+                    accSub(arg1, arg2) {
+                        var r1, r2, m, n;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length;
+                        } catch (e) {
+                            r1 = 0;
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length;
+                        } catch (e) {
+                            r2 = 0;
+                        }
+                        m = Math.pow(10, Math.max(r1, r2));
+                        //last modify by deeka
+                        //动态控制精度长度
+                        n = (r1 >= r2) ? r1 : r2;
+                        return ((arg1 * m - arg2 * m) / m).toFixed(n);
+                    },
+                    deleteselected(row) {
+                        if (row.id) {
+                            this.deselectedgoodslist.unshift(row.id);
+                        }
+                        this.selectedgoodsdata.list = this.selectedgoodsdata.list.filter(item => {
+                            return item != row;
+                        });
+                        this.row.totalamount = this.accSub(this.row.totalamount, row.amount);
+                    }
+
+                }
+            })
+            Form.api.bindevent($("form[role=form]"), "", "", function () {
+                let main = JSON.parse($("#c-main").val());
+                let goodslist = JSON.parse($("#c-goodslist").val());
+                if (main.stock_supplier_id == "") {
+                    Toastr.error("请选择供应商");
+                    return false;
+                } else if (goodslist.length < 1) {
+                    Toastr.error("请添加入库商品");
+                    return false;
+                }
+            });
+        },
+        printer: function () {
+            $.ajax({
+                type: "POST",
+                url: Fast.api.fixurl('stock/stockin/info'),
+                data: { "id": Fast.api.query("id") },
+                async: true, //或false,是否异步
+                timeout: 5000, //超时时间
+                dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text     
+                success: function (data) {
+                    madehtml(data);
+                }
+            });
+            function madehtml(data) {
+                var h = "<div id=\"top\" class=\"page\" ><div style=\"text-align: center;font-size:22px;line-height:38px\" >入库单</div>" +
+                    "<table style=\"width:100%;\">" +
+                    " <tr>" +
+                    " <td  width=\"40%\"></td>" +
+                    "<td  width=\"25%\"></td>" +
+                    "<td  width=\"12%\" tdata=\"pageNO\" format=\"##\" style=\"text-align:right;\">第##页</td>" +
+                    "<td  width=\"13%\" tdata=\"pageCount\" format=\"##\" style=\"text-align:right;\">&nbsp共##页</td>" +
+                    " </tr>" +
+                    "<tr>" +
+                    "<td >供应商:" + data.row.supplier.name + "</td>" +
+                    "<td>日期:" + Moment(Number( data.row.inboundtime) * 1000).format("YYYY-MM-DD") + "</td>" +
+                    "<td colspan=\"2\" style=\"text-align:right;\">编号:" +  data.row.docnum + "</td>" +
+                    "</tr>" +
+                    "</table>" +
+                    "</div>" +
+                    "<div id=\"maintable\"><table border=\"1\" style=\"width:100%;\">" +
+                    "<thead><tr  align=\"center\">" +
+                    "<th width=\"5%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">序号</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">商品</br>代码</th>" +
+                    "<th width=\"20%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">商品</br>名称</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">规格</br>型号</th>" +
+                    "<th width=\"8%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">单位</th>" +
+                    "<th width=\"6%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">数量</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">重量(kg)</th>" +
+                    "<th width=\"12%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">总重量(kg)</th>" +
+                    "<th width=\"20%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">备注</th>" +
+                    "</tr></thead>    ";
+                for (var i = 0; i < data.goodslist.length; i++) {
+                    h += maderow(data.goodslist[i], i)
+                }
+                h += "<tfoot>  <tr><td tindex=\"8\" tdata=\"SubSum\" format=\"UpperMoney\" colspan=\"5\" ><div style=\"line-height:25px;text-align: left;\">本页小计:</td>" +
+                    "<td  align=\"center\" tdata=\"SubSum\" format=\"#,##\">###</td>" +
+                    "<td></td>" +
+                    "<td align=\"center\" tdata=\"SubSum\" format=\"#,##0.00\">###</td>" +
+                    "<td></td>" +
+                    "</tr>" +
+                    "<tr><td colspan=\"5\" tindex=\"8\" tdata=\"AllSum\" format=\"UpperMoney\" ><div style=\"line-height:25px;text-align: left;\">合&nbsp;&nbsp;计: </td>" +
+                    "<td align=\"center\" tdata=\"AllSum\" format=\"#,##\">###</td>" +
+                    "<td></td>" +
+                    "<td align=\"center\" tdata=\"AllSum\" format=\"#,##0.00\">###</td>" +
+                    "<td></td>" +
+                    "</tr>" +
+                    "  </tfoot></table>" +
+                    "</div>" +
+                    "<div id=\"foot\"><table style=\"width:100%;\">" +
+                    "<tr >" +
+                    "<td  width=\"30%\"><div style=\"line-height:30px;\">负责人:</td>" +
+                    "<td width=\"30%\"><div style=\"line-height:30px;\">经办人:</td>" +
+                    "<td width=\"40%\"><div style=\"line-height:30px;\">库管员:</td>" +
+                    "</tr>" +
+                    "<tr>" +
+                    "</tr>" +
+                    "</table></div>";
+                $('.printContent').append(h);
+            }
+            function maderow(row, currow) {
+                var h = " <tr align=\"center\">\n" +
+                    "                <td >" + (currow + 1) + "</td>\n" +
+                    "                <td >" + row.volnum + "</td>\n" +
+                    "                <td >" + row.goodsname + "</td>\n" +
+                    "                <td >" + row.productmodel + "</td>\n" +
+                    "                <td >" + row.measureunit + "</td>\n" +
+                    "                <td >" + row.stockinnums + "</td>\n" +
+                    "                <td >" + row.inboundprice + "</td>\n" +
+                    "                <td >" + row.amount + "</td>\n" +
+                    "                <td >" + row.stockingoodsremark + "</td>\n" +
+                    "            </tr>"
+                return h;
+            }
+            require(['lodop'], function (lodop) {
+                $(".btn-print").click(function () {
+                    var LODOP = getLodop();
+                    if (typeof (LODOP) != "undefined") {
+                        var strStyle = "<style>table{table-layout:fixed;word-break:break-all;} table,td,th {border-width: 1px;font-family:'思源黑体 CN Medium';border-style: solid;border-color:black;border-collapse: collapse}</style>"
+                        var strStyle2 = "<style>div{font-family:'思源黑体 CN Medium'} table{font-family:'思源黑体 CN Medium','times'}</style>";
+                        LODOP.ADD_PRINT_TABLE("30mm", "5%", "90%", "70mm", strStyle + document.getElementById("maintable").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "Vorient", 3);
+                        LODOP.ADD_PRINT_HTM("2mm", "5%", "90%", "25mm",strStyle2+ document.getElementById("top").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
+                        LODOP.ADD_PRINT_HTM("120mm", "5%", "90%", "25mm", strStyle2+document.getElementById("foot").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "LinkedItem", 4);
+                        LODOP.SET_PRINT_STYLEA(0, "FontSize", 12);
+                        LODOP.SET_PRINT_STYLEA(0, "FontColor", "#FF0000");
+                        LODOP.SET_PRINT_STYLEA(0, "Alignment", 2);
+                        LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
+                        LODOP.SET_PRINT_STYLEA(0, "Horient", 3);
+                        LODOP.SET_PRINT_PAGESIZE(2, 0, 0, "A5")
+                        LODOP.PREVIEW();
+                    }
+                });
+            });
+        },
+        api: {
+            formatter: {
+                audit: function (value, row, index) {
+                    var colorArr = { normal: 'success', hidden: 'grey', deleted: 'danger', locked: 'info' };
+                    // 如果字段列有定义custom
+                    var newValue = value == null ? '未审核' : '已审核';
+                    var color = value == null ? 'danger' : 'primary';
+                    var html = '<span class="text-' + color + '"><i class="fa fa-circle"></i> ' + __(newValue) + '</span>';
+                    return html;
+                },
+                settle: function (value, row, index) {
+                    var colorArr = { normal: 'success', hidden: 'grey', deleted: 'danger', locked: 'info' };
+                    // 如果字段列有定义custom
+                    var newValue = value == null ? '未结算' : '已结算';
+                    var color = value == null ? 'danger' : 'primary';
+                    var html = '<span class="text-' + color + '"><i class="fa fa-circle"></i> ' + __(newValue) + '</span>';
+                    return html;
+                },
+            },
+            bindevent: function () {
+            }
+        }
+    };
+    return Controller;
+});

+ 900 - 0
public/assets/js/backend/stock/stockout.js

@@ -0,0 +1,900 @@
+requirejs.config({
+    paths: {
+        vue: 'backend/stock/libs/vue',
+        ELEMENT: 'backend/stock/libs/element-ui',
+    },
+    shim: {
+        ELEMENT: ['vue']
+    }
+})
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'vue', 'ELEMENT', 'moment'], function ($, undefined, Backend, Table, Form, Vue, ELEMENT, Moment) {
+
+    var Controller = {
+        index: function () {
+            $('.btn-add,.btn-edit,.btn-audit,.btn-settle,.btn-split').data("area", ['100%', '100%']);
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/stockout/index',
+                    add_url: 'stock/stockout/add',
+                    edit_url: 'stock/stockout/edit',
+                    del_url: 'stock/stockout/del',
+                    multi_url: 'stock/stockout/multi',
+                    table: 'stock_stockout',
+                }
+            });
+            var table = $("#table");
+            $.fn.bootstrapTable.locales[Table.defaults.locale]['formatSearch'] = function () {
+                return '搜索[单据编号、客户名称]';
+            };
+            var selfOperate = {
+                'click .btn-editone': function (e, value, row, index) {
+                    e.stopPropagation();
+                    e.preventDefault();
+                    if (!row.audittime) {
+                        var table = $(this).closest('table');
+                        var options = table.bootstrapTable('getOptions');
+                        var ids = row[options.pk];
+                        row = $.extend({}, row ? row : {}, { ids: ids });
+                        var url = options.extend.edit_url;
+                        Fast.api.open(Table.api.replaceurl(url, row, table), __('Edit'), $(this).data() || {});
+                    } else {
+                        Toastr.error('该出库记录已通过审核,不能修改!')
+                    }
+                    ;
+                },
+                'click .btn-delone': function (e, value, row, index) {
+                    e.stopPropagation();
+                    e.preventDefault();
+                    var that = this;
+                    var top = $(that).offset().top - $(window).scrollTop();
+                    var left = $(that).offset().left - $(window).scrollLeft() - 260;
+                    if (top + 154 > $(window).height()) {
+                        top = top - 154;
+                    }
+                    if ($(window).width() < 480) {
+                        top = left = undefined;
+                    }
+                    if (!row.auditTime) {
+                        Layer.confirm(
+                            __('Are you sure you want to delete this item?'), { icon: 3, title: __('Warning'), offset: [top, left], shadeClose: true },
+                            function (index) {
+                                var table = $(that).closest('table');
+                                var options = table.bootstrapTable('getOptions');
+                                Table.api.multi("del", row[options.pk], table, that);
+                                Layer.close(index);
+                            }
+                        );
+                    } else {
+                        Toastr.error('该出库记录已通过审核,不能删除!')
+                    }
+                    ;
+                }
+            }
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                sortName: 'createtime',
+                singleSelect: true, //是否启用单选
+                columns: [
+                    [
+                        { checkbox: true },
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                            operate: false,
+                            width: 50,
+                        },
+                        { field: 'docnum', operate: "LIKE", title: __('单据编号'), sortable: true },
+                        { field: 'outboundtime', title: __('Outboundtime'), operate: 'RANGE', formatter: Table.api.formatter.datetime, datetimeFormat: 'YYYY-MM-DD', addclass: 'datetimerange', sortable: true },
+                        { field: 'customer.name', title: __('客户名称'), sortable: true },
+                        { field: 'totaloutamount', title: __('单据总重量(kg)'), sortable: true },
+                        { field: 'remark', title: __('Remark') },
+                        { field: 'audittime', title: __('审核状态'), formatter: Controller.api.formatter.audit },
+                        // { field: 'settletime', title: __('结算状态'), formatter: Controller.api.formatter.settle },
+                        { field: 'operate', title: __('Operate'), table: table, events: selfOperate, formatter: Table.api.formatter.operate }
+                    ]
+                ],
+                onPostBody: function () {
+                    $(".btn-editone ").data("area", ['100%', '100%']);
+                }
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+            // 打印按钮事件
+            $('.toolbar').on('click', '.btn-print', function () {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                if (selectedrow.length == 1) {
+                    Fast.api.open('stock/stockout/printer?id=' + selectedrow[0]['id'], __('打印'), $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? '只能选择一条入库记录' : '请选择入库记录')
+                }
+            });
+            // 批量编辑按钮事件
+            $('.btn-edit').click(function (event) {
+                event.stopPropagation();
+                var selectedrow = table.bootstrapTable('getSelections');
+                console.log(selectedrow);
+                if (selectedrow.length == 1 && !selectedrow[0]['audittime']) {
+                    var that = this;
+                    var url = 'stock/stockout/edit';
+                    selectedrow[0] = $.extend({}, selectedrow[0] ? selectedrow[0] : {}, { ids: selectedrow[0]['id'] });
+                    var url = Table.api.replaceurl(url, selectedrow[0], table);
+                    Fast.api.open(url, __('Edit'), $(that).data() || {});
+                } else {
+                    if (selectedrow[0]['audittime']) {
+                        Toastr.error('该记录已审核,不能修改!')
+                    } else {
+                        Toastr.error(selectedrow.length > 1 ? '只能选择一条记录' : '请选择一条记录')
+                    }
+                }
+            });
+            // 审核/反审核按钮事件 结算/反结算按钮事件
+            $('.toolbar').on('click', '.btn-audit,.btn-settle', function () {
+                var that = this;
+                var selectedrow = table.bootstrapTable('getSelections');
+                var title = "审核";
+                if (selectedrow.length == 1) {
+                    var operatetype = $(this).data("operatetype");
+                    if (operatetype == "audit") {
+                        console.log(selectedrow[0].settletime);
+                        if (selectedrow[0].settletime !== null) {
+                            Toastr.error("该出库单已结算,请先进行反结算!");
+                            return;
+                        } else {
+                            title = selectedrow[0].audittime == null ? "审核" : "反审核";
+                        }
+                    } else if (operatetype == "settle") {
+                        if (selectedrow[0].audittime == null) {
+                            Toastr.error("该出库单未审核,请先进行审核!");
+                            return;
+                        } else {
+                            title = selectedrow[0].settletime == null ? "结算" : "反结算";
+                        }
+                    }
+                    var url = 'stock/stockout/look?operatetype=' + operatetype;
+                    selectedrow[0] = $.extend({}, selectedrow[0] ? selectedrow[0] : {}, { ids: selectedrow[0]['id'] });
+                    var url = Table.api.replaceurl(url, selectedrow[0], table);
+                    Fast.api.open(url, title, $(that).data() || {});
+                } else {
+                    Toastr.error(selectedrow.length > 1 ? '只能选择一条记录' : '请选择一条记录')
+                }
+            });
+        },
+        getlist: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    list_url: 'stock/stockout/getlist',
+                }
+            });
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.list_url,
+                pk: 'id',
+                sortName: 'stockoutlist.id',
+                height: $(window).height() - 97,
+                columns: [
+                    [
+                        { checkbox: true },
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                        },
+                        { field: 'stockout.docnum', operate: "LIKE", title: __('单据编号') },
+                        { field: 'stockout.customer.name', operate: "LIKE", title: __('客户名称'), sortable: true },
+                        { field: 'goods.volnum', title: '商品代码' },
+                        { field: 'goods.goodsname', title: '商品名称' },
+                        { field: 'goods.productmodel', title: '规格型号' },
+                        { field: 'goods.measureunit', title: '单位' },
+                        { field: 'stockoutnums', type: "Number", title: '出库数量' },
+                        { field: 'stockin.inboundprice', title: '单价', operate: 'BETWEEN' },
+                        { field: 'amount', title: '重量(kg)', operate: 'BETWEEN' },
+                        { field: 'stockout.outboundtime', title: '出库日期', operate: 'RANGE', formatter: Table.api.formatter.datetime, datetimeFormat: 'YYYY-MM-DD', addclass: 'datetimerange', sortable: true },
+                        { field: 'remark', title: __('Remark') },
+                    ]
+                ]
+            });
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        look: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        row: { stock_customer_id: "", remark: "", outboundtime: "", docnum:"" },
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 355) + "px" },
+                            list: [],
+                        },
+                        commiturl: "",
+                    }
+                },
+                computed: {
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) },
+                },
+                created() {
+                    this.loadstockoutinfo()
+                },
+                methods: {
+                    loadstockoutinfo() {
+                        let operatetype = Fast.api.query("operatetype")
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/stockout/info',
+                            type: "POST",
+                            data: { id: Fast.api.query("ids") },
+                            async: false,
+                            success: function (res) {
+                                res.row.outboundtime = Moment(parseInt(res.row.outboundtime) * 1000).format("YYYY-MM-DD");
+                                if (operatetype == "audit") {
+                                    if (res.row.audittime) {
+                                        that.commiturl = 'stock/stockout/unaudit';
+                                        $('#audit').html('反审核');
+                                    } else {
+                                        that.commiturl = 'stock/stockout/audit';
+                                        $('#audit').html('审核');
+                                    }
+                                } else if (operatetype == "settle") {
+                                    if (res.row.settletime) {
+                                        that.commiturl = 'stock/stockout/unsettle';
+                                        $('#audit').html('反结算');
+                                    } else {
+                                        that.commiturl = 'stock/stockout/settle';
+                                        $('#audit').html('结算');
+                                    }
+                                }
+                                that.row = res.row;
+                                that.selectedgoodsdata.list = res.goodslist;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    }
+                }
+            })
+            // 提交事件
+            $(document).on('click', '#audit', function (e) {
+                e.preventDefault();
+                var url = $("#c-commiturl").val();
+                Layer.confirm(
+                    __('确认提交?'), { icon: 3, title: __('Warning'), offset: 200, shadeClose: true },
+                    function (index) {
+                        $('#form').attr('action', url);
+                        $('#form').submit();
+                        Layer.close(index);
+                    }
+                );
+            });
+            Form.api.bindevent($("form[role=form]"));
+        },
+        add: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        searchvalue: "",
+                        row: { stock_customer_id: "", remark: "", outboundtime: new Date() },
+                        curgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", stocknum: "", stockoutnums: 0, stockoutgoodsremark: "", barcode: "" },
+                        defaultgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", stocknum: "", stockoutnums: 0, stockoutgoodsremark: "", barcode: "" },
+                        customerlist: [],
+                        goodsdata: {
+                            table: { height: ($(window).height() - 490) + "px" },
+                            list: [],
+                            pagenation: {
+                                currentpage: 1,
+                                pagesize: 10,
+                                total: 0
+                            }
+                        },
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 310) + "px" },
+                            list: [],
+                        },
+                        rules: {
+                            stockinnums: [
+                                { required: true, message: '出库数量不能为空' },
+                                { type: 'number', message: '出库数量必须为数字值' }
+                            ],
+                        }
+                    }
+                },
+                computed: {
+                    main: function () { return JSON.stringify(this.row) },
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) }
+                },
+                created() {
+                    this.loadgoodslist()
+                    this.loadcustomerlist()
+                },
+                methods: {
+                    loadcustomerlist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/customer/index',
+                            data: {},
+                            success: function (res) {
+                                that.customerlist = res.rows;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadgoodslist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/goods/getlist',
+                            data: { sort: 'goods.id', order: 'desc', offset: this.goodsdata.pagenation.pagesize * (this.goodsdata.pagenation.currentpage - 1), limit: this.goodsdata.pagenation.pagesize, searchvalue: this.searchvalue },
+                            success: function (res) {
+                                that.goodsdata.list = res.rows;
+                                that.goodsdata.pagenation.total = res.total;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    handleSizeChange(val) {
+                        this.goodsdata.pagenation.pagesize = val;
+                        this.loadgoodslist();
+                    },
+                    handleCurrentChange(val) {
+                        this.goodsdata.pagenation.currentpage = val;
+                        this.loadgoodslist();
+                    },
+                    debounce(fn, delay) {
+                        let timeout = null;
+                        delay = delay || 500;
+                        return function (e) {
+                            let args = arguments;
+                            let that = this;
+                            clearTimeout(timeout);
+                            timeout = setTimeout(function () {
+                                fn.apply(that, args);
+                            }, delay);
+                        };
+                    },
+                    barcodeinputenter() {
+                        let that = this;
+                        if (this.curgood.barcode == "") {
+                            Fast.api.msg("请输入商品条码并按回车键!")
+                        } else {
+                            Fast.api.ajax({
+                                url: "stock/goods/getgoodsbybarcodeorid",
+                                data: { barcode: this.curgood.barcode }
+                            }, function (data) {
+                                if (data !== null) {
+                                    that.curgood.stock_goods_id = data.id;
+                                    that.curgood.volnum = data.volnum;
+                                    that.curgood.goodsname = data.goodsname;
+                                    that.curgood.productmodel = data.productmodel;
+                                    that.curgood.measureunit = data.measureunit;
+                                    that.curgood.stockoutnums = data.curstocknum >= 1 ? 1 : 0;
+                                    that.curgood.stocknum = data.curstocknum;
+                                    that.curgood.stockoutgoodsremark = "";
+                                }
+                            })
+                        }
+                    },
+                    onSearchvalueChange() {
+                        this.debounce(this.loadgoodslist, 1000)();
+                    },
+                    selectonegood(currentrow) {
+                        let that = this;
+                        Fast.api.ajax({
+                            url: "stock/goods/getgoodsbybarcodeorid",
+                            data: { id: currentrow.id }
+                        }, function (data) {
+                            if (data !== null) {
+                                that.curgood.stock_goods_id = data.id;
+                                that.curgood.volnum = data.volnum;
+                                that.curgood.goodsname = data.goodsname;
+                                that.curgood.productmodel = data.productmodel;
+                                that.curgood.measureunit = data.measureunit;
+                                that.curgood.barcode = data.barcode;
+                                that.curgood.stockoutnums = data.curstocknum >= 1 ? 1 : 0;
+                                that.curgood.stocknum = data.curstocknum;
+                                that.curgood.stockoutgoodsremark = "";
+                            }
+                        })
+                    },
+                    addtolist() {
+                        let that = this;
+                        let hasadded = false;
+                        if (this.curgood.stock_goods_id != "") {
+                            if (this.curgood.stockoutnums == 0) {
+                                Fast.api.msg("出库数量不能为0!");
+                                return;
+                            }
+                            if (this.curgood.stockoutnums > this.curgood.stocknum) {
+                                Fast.api.msg("出库数量不能大于库存数量,请修改!");
+                                return;
+                            }
+                            this.selectedgoodsdata.list.forEach(item => {
+                                if (item.stock_goods_id == that.curgood.stock_goods_id) {
+                                    Fast.api.msg("该商品已添加,请勿重复添加!")
+                                    hasadded = true;
+                                }
+                            });
+                            if (!hasadded) {
+                                let good = JSON.parse(JSON.stringify(this.curgood));
+                                this.selectedgoodsdata.list.unshift(good);
+                                this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                            }
+                        } else {
+                            Fast.api.msg("请选择出库商品!")
+                        }
+                    },
+                    reset() {
+                        this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                    },
+                    getcurgoodamount() {
+                        this.curgood.amount = this.accMul(this.curgood.stockinnums, this.curgood.inboundprice);
+                    },
+                    accMul(arg1, arg2) {
+                        var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+                        try {
+                            m += s1.split(".")[1].length
+                        } catch (e) {
+                        }
+                        try {
+                            m += s2.split(".")[1].length
+                        } catch (e) {
+                        }
+                        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+                    },
+                    accAdd(arg1, arg2) {
+                        var r1, r2, m;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length
+                        } catch (e) {
+                            r1 = 0
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length
+                        } catch (e) {
+                            r2 = 0
+                        }
+                        m = Math.pow(10, Math.max(r1, r2))
+                        return (arg1 * m + arg2 * m) / m
+                    },
+                    accSub(arg1, arg2) {
+                        var r1, r2, m, n;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length;
+                        } catch (e) {
+                            r1 = 0;
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length;
+                        } catch (e) {
+                            r2 = 0;
+                        }
+                        m = Math.pow(10, Math.max(r1, r2));
+                        //last modify by deeka
+                        //动态控制精度长度
+                        n = (r1 >= r2) ? r1 : r2;
+                        return ((arg1 * m - arg2 * m) / m).toFixed(n);
+                    },
+                    deleteselected(row) {
+                        this.selectedgoodsdata.list = this.selectedgoodsdata.list.filter(item => {
+                            return item != row;
+                        });
+                        this.row.totalamount = this.accSub(this.row.totalamount, row.amount);
+                    }
+
+                }
+            })
+            Form.api.bindevent($("form[role=form]"), "", "", function () {
+                let main = JSON.parse($("#c-main").val());
+                let goodslist = JSON.parse($("#c-goodslist").val());
+                if (main.stock_customer_id == "") {
+                    Toastr.error("请选择客户");
+                    return false;
+                } else if (goodslist.length < 1) {
+                    Toastr.error("请添加出库商品");
+                    return false;
+                }
+            });
+        },
+        edit: function () {
+            Vue.use(ELEMENT);
+            var vm = new Vue({
+                el: "#app",
+                data: function () {
+                    return {
+                        searchvalue: "",
+                        row: { stock_customer_id: "", remark: "", outboundtime: new Date() },
+                        curgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", stocknum: "", stockoutnums: 0, stockoutgoodsremark: "", barcode: "" },
+                        defaultgood: { stock_goods_id: "", volnum: "", goodsname: "", productmodel: "", measureunit: "件", stocknum: "", stockoutnums: 0, stockoutgoodsremark: "", barcode: "" },
+                        customerlist: [],
+                        goodsdata: {
+                            table: { height: ($(window).height() - 490) + "px" },
+                            list: [],
+                            pagenation: {
+                                currentpage: 1,
+                                pagesize: 10,
+                                total: 0
+                            }
+                        },
+                        selectedgoodsdata: {
+                            table: { height: ($(window).height() - 350) + "px" },
+                            list: [],
+                        },
+                        deselectedgoodslist: [],
+                        rules: {
+                            stockinnums: [
+                                { required: true, message: '出库数量不能为空' },
+                                { type: 'number', message: '出库数量必须为数字值' }
+                            ],
+                        }
+                    }
+                },
+                computed: {
+                    main: function () { return JSON.stringify(this.row) },
+                    goodslist: function () { return JSON.stringify(this.selectedgoodsdata.list) }
+                },
+                created() {
+                    this.loadstockoutinfo()
+                    this.loadgoodslist()
+                    this.loadcustomerlist()
+                },
+                methods: {
+                    loadstockoutinfo() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/stockout/info',
+                            type: "POST",
+                            data: { id: Fast.api.query("ids") },
+                            success: function (res) {
+                                res.row.outboundtime = Moment(parseInt(res.row.outboundtime) * 1000).format("YYYY-MM-DD");
+                                console.log(res.row);
+                                that.row = res.row;
+                                that.selectedgoodsdata.list = res.goodslist;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadcustomerlist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/customer/index',
+                            data: {},
+                            success: function (res) {
+                                that.customerlist = res.rows;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    loadgoodslist() {
+                        let that = this;
+                        $.ajax({
+                            url: 'stock/goods/getlist',
+                            data: { sort: 'goods.id', order: 'desc', offset: this.goodsdata.pagenation.pagesize * (this.goodsdata.pagenation.currentpage - 1), limit: this.goodsdata.pagenation.pagesize, searchvalue: this.searchvalue },
+                            success: function (res) {
+                                that.goodsdata.list = res.rows;
+                                that.goodsdata.pagenation.total = res.total;
+                            },
+                            error: function (res) {
+                                Toastr.error("加载失败!")
+                            }
+                        })
+                    },
+                    handleSizeChange(val) {
+                        this.goodsdata.pagenation.pagesize = val;
+                        this.loadgoodslist();
+                    },
+                    handleCurrentChange(val) {
+                        this.goodsdata.pagenation.currentpage = val;
+                        this.loadgoodslist();
+                    },
+                    debounce(fn, delay) {
+                        let timeout = null;
+                        delay = delay || 500;
+                        return function (e) {
+                            let args = arguments;
+                            let that = this;
+                            clearTimeout(timeout);
+                            timeout = setTimeout(function () {
+                                fn.apply(that, args);
+                            }, delay);
+                        };
+                    },
+                    barcodeinputenter() {
+                        let that = this;
+                        if (this.curgood.barcode == "") {
+                            Fast.api.msg("请输入商品条码并按回车键!")
+                        } else {
+                            Fast.api.ajax({
+                                url: "stock/goods/getgoodsbybarcodeorid",
+                                data: { barcode: this.curgood.barcode }
+                            }, function (data) {
+                                if (data !== null) {
+                                    that.curgood.stock_goods_id = data.id;
+                                    that.curgood.volnum = data.volnum;
+                                    that.curgood.goodsname = data.goodsname;
+                                    that.curgood.productmodel = data.productmodel;
+                                    that.curgood.measureunit = data.measureunit;
+                                    that.curgood.stockoutnums = data.curstocknum >= 1 ? 1 : 0;
+                                    that.curgood.stocknum = data.curstocknum;
+                                    that.curgood.stockoutgoodsremark = "";
+                                }
+                            })
+                        }
+                    },
+                    onSearchvalueChange() {
+                        this.debounce(this.loadgoodslist, 1000)();
+                    },
+                    selectonegood(currentrow) {
+                        let that = this;
+                        Fast.api.ajax({
+                            url: "stock/goods/getgoodsbybarcodeorid",
+                            data: { id: currentrow.id }
+                        }, function (data) {
+                            if (data !== null) {
+                                that.curgood.stock_goods_id = data.id;
+                                that.curgood.volnum = data.volnum;
+                                that.curgood.goodsname = data.goodsname;
+                                that.curgood.productmodel = data.productmodel;
+                                that.curgood.measureunit = data.measureunit;
+                                that.curgood.barcode = data.barcode;
+                                that.curgood.stockoutnums = data.curstocknum >= 1 ? 1 : 0;
+                                that.curgood.stocknum = data.curstocknum;
+                                that.curgood.stockoutgoodsremark = "";
+                            }
+                        })
+                    },
+                    addtolist() {
+                        let that = this;
+                        let hasadded = false;
+                        if (this.curgood.stock_goods_id != "") {
+                            if (this.curgood.stockoutnums == 0) {
+                                Fast.api.msg("出库数量不能为0!");
+                                return;
+                            }
+                            if (this.curgood.stockoutnums > this.curgood.stocknum) {
+                                Fast.api.msg("出库数量不能大于库存数量,请修改!");
+                                return;
+                            }
+                            this.selectedgoodsdata.list.forEach(item => {
+                                if (item.stock_goods_id == that.curgood.stock_goods_id) {
+                                    Fast.api.msg("该商品已添加,请勿重复添加!")
+                                    hasadded = true;
+                                }
+                            });
+                            if (!hasadded) {
+                                let good = JSON.parse(JSON.stringify(this.curgood));
+                                this.selectedgoodsdata.list.unshift(good);
+                                this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                            }
+                        } else {
+                            Fast.api.msg("请选择出库商品!")
+                        }
+                    },
+                    reset() {
+                        this.curgood = JSON.parse(JSON.stringify(this.defaultgood));
+                    },
+                    getcurgoodamount() {
+                        this.curgood.amount = this.accMul(this.curgood.stockinnums, this.curgood.inboundprice);
+                    },
+                    accMul(arg1, arg2) {
+                        var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+                        try {
+                            m += s1.split(".")[1].length
+                        } catch (e) {
+                        }
+                        try {
+                            m += s2.split(".")[1].length
+                        } catch (e) {
+                        }
+                        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+                    },
+                    accAdd(arg1, arg2) {
+                        var r1, r2, m;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length
+                        } catch (e) {
+                            r1 = 0
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length
+                        } catch (e) {
+                            r2 = 0
+                        }
+                        m = Math.pow(10, Math.max(r1, r2))
+                        return (arg1 * m + arg2 * m) / m
+                    },
+                    accSub(arg1, arg2) {
+                        var r1, r2, m, n;
+                        try {
+                            r1 = arg1.toString().split(".")[1].length;
+                        } catch (e) {
+                            r1 = 0;
+                        }
+                        try {
+                            r2 = arg2.toString().split(".")[1].length;
+                        } catch (e) {
+                            r2 = 0;
+                        }
+                        m = Math.pow(10, Math.max(r1, r2));
+                        //last modify by deeka
+                        //动态控制精度长度
+                        n = (r1 >= r2) ? r1 : r2;
+                        return ((arg1 * m - arg2 * m) / m).toFixed(n);
+                    },
+                    deleteselected(row) {
+                        if (row.id) {
+                            this.deselectedgoodslist.unshift(row.id);
+                        }
+                        this.selectedgoodsdata.list = this.selectedgoodsdata.list.filter(item => {
+                            return item != row;
+                        });
+                        this.row.totalamount = this.accSub(this.row.totalamount, row.amount);
+                    }
+
+                }
+            })
+            Form.api.bindevent($("form[role=form]"), "", "", function () {
+                let main = JSON.parse($("#c-main").val());
+                let goodslist = JSON.parse($("#c-goodslist").val());
+                if (main.stock_customer_id == "") {
+                    Toastr.error("请选择客户");
+                    return false;
+                } else if (goodslist.length < 1) {
+                    Toastr.error("请添加出库商品");
+                    return false;
+                }
+            });
+        },
+        printer: function () {
+            $.ajax({
+                type: "POST",
+                url: Fast.api.fixurl('stock/stockout/info'),
+                data: { "id": Fast.api.query("id") },
+                async: true, //或false,是否异步
+                timeout: 5000, //超时时间
+                dataType: 'json', //返回的数据格式:json/xml/html/script/jsonp/text     
+                success: function (data) {
+                    madehtml(data);
+                }
+            });
+            function madehtml(data) {
+                var h = "<div id=\"top\" class=\"page\"><div style=\"text-align: center;font-size:22px;line-height:38px\" >出库单</div>" +
+                    "<table style=\"width:100%;\">" +
+                    " <tr>" +
+                    " <td  width=\"40%\"></td>" +
+                    "<td  width=\"25%\"></td>" +
+                    "<td  width=\"12%\" tdata=\"pageNO\" format=\"##\" style=\"text-align:right;\">第##页</td>" +
+                    "<td  width=\"13%\" tdata=\"pageCount\" format=\"##\" style=\"text-align:right;\">&nbsp共##页</td>" +
+                    " </tr>" +
+                    "<tr>" +
+                    "<td >单位:" + data.row.customer.name+ "</td>" +
+                    "<td>日期:" + Moment(Number(data.row.outboundtime) * 1000).format("YYYY-MM-DD") + "</td>" +
+                    "<td colspan=\"2\" style=\"text-align:right;\">编号:" + data.row.docnum + "</td>" +
+                    "</tr>" +
+                    "</table>" +
+                    "</div>" +
+                    "<div id=\"maintable\"><table border=\"1\" style=\"width:100%;\">" +
+                    "<thead ><tr >" +
+                    "<th width=\"5%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">序号</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">商品</br>代码</th>" +
+                    "<th width=\"20%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">商品</br>名称</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">规格</br>型号</th>" +
+                    "<th width=\"8%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">单位</th>" +
+                    "<th width=\"6%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">数量</th>" +
+                    "<th width=\"10%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">重量(kg)</th>" +
+                    "<th width=\"12%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">总重量(kg)</th>" +
+                    "<th width=\"20%\"  style=\"text-align:center;\"><div style=\"line-height:20px;\">备注</th>" +
+                    "</tr></thead>    ";
+                for (var i = 0; i < data.goodslist.length; i++) {
+                    h += maderow(data.goodslist[i], i)
+                }
+                h += "<tfoot>  <tr><td tindex=\"8\" tdata=\"SubSum\" format=\"UpperMoney\" colspan=\"5\" ><div style=\"line-height:25px;text-align: left;\">本页小计:</td>" +
+                    "<td  align=\"center\" tdata=\"SubSum\" format=\"#,##\">###</td>" +
+                    "<td></td>" +
+                    "<td align=\"center\" tdata=\"SubSum\" format=\"#,##0.00\">###</td>" +
+                    "<td></td>" +
+                    "</tr>" +
+                    "<tr><td colspan=\"5\" tindex=\"8\" tdata=\"AllSum\" format=\"UpperMoney\" ><div style=\"line-height:25px;text-align: left;\">合&nbsp;&nbsp;计: </td>" +
+                    "<td align=\"center\" tdata=\"AllSum\" format=\"#,##\">###</td>" +
+                    "<td></td>" +
+                    "<td align=\"center\" tdata=\"AllSum\" format=\"#,##0.00\">###</td>" +
+                    "<td></td>" +
+                    "</tr>" +
+                    "  </tfoot></table>" +
+                    "</div>" +
+                    "<div id=\"foot\"><table style=\"width:100%;\">" +
+                    "<tr >" +
+                    "<td  width=\"30%\"><div style=\"line-height:30px;\">负责人:</td>" +
+                    "<td width=\"30%\"><div style=\"line-height:30px;\">经办人:</td>" +
+                    "<td width=\"30%\"><div style=\"line-height:30px;\">库管员:</td>" +
+                    "</tr>" +
+                    "<tr>" +
+                    "</tr>" +
+                    "</table></div>";
+                $('.printContent').append(h);
+
+            }
+            function maderow(row, currow) {
+                var h = " <tr align=\"center\">\n" +
+                    "                <td >" + (currow + 1) + "</td>\n" +
+                    "                <td >" + row.volnum + "</td>\n" +
+                    "                <td >" + row.goodsname + "</td>\n" +
+                    "                <td >" + row.productmodel + "</td>\n" +
+                    "                <td >" + row.measureunit + "</td>\n" +
+                    "                <td >" + row.stockoutnums + "</td>\n" +
+                    // "                <td >  <input type='text'> </td>\n" +
+                    "                <td >" + row.inboundprice + "</td>\n" +
+                    "                <td >" + row.amount + "</td>\n" +
+                    "                <td >" + row.stockoutgoodsremark + "</td>\n" +
+                    "            </tr>"
+                return h;
+            }
+                require(['lodop'], function (locop) {
+                $(".btn-print").click(function () {
+                    var LODOP = getLodop();
+                    if (typeof (LODOP) != "undefined") {
+                        var strStyle = "<style>table{table-layout:fixed;word-break:break-all;} table,td,th {border-width: 1px;border-style: solid;border-color:black;border-collapse: collapse}</style>"
+                        LODOP.ADD_PRINT_TABLE("30mm", "5%", "90%", "70mm", strStyle + document.getElementById("maintable").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "Vorient", 3);
+                        LODOP.ADD_PRINT_HTM("2mm", "5%", "90%", "25mm", document.getElementById("top").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
+                        LODOP.ADD_PRINT_HTM("120mm", "5%", "90%", "25mm", document.getElementById("foot").innerHTML);
+                        LODOP.SET_PRINT_STYLEA(0, "LinkedItem", 4);
+                        LODOP.SET_PRINT_STYLEA(0, "FontSize", 12);
+                        LODOP.SET_PRINT_STYLEA(0, "FontColor", "#FF0000");
+                        LODOP.SET_PRINT_STYLEA(0, "Alignment", 2);
+                        LODOP.SET_PRINT_STYLEA(0, "ItemType", 1);
+                        LODOP.SET_PRINT_STYLEA(0, "Horient", 3);
+                        LODOP.SET_PRINT_PAGESIZE(2, 0, 0, "A5")
+                        LODOP.PREVIEW();
+                    }
+                });
+            });
+        },
+        api: {
+            formatter: {
+                audit: function (value, row, index) {
+                    //颜色状态数组,可使用red/yellow/aqua/blue/navy/teal/olive/lime/fuchsia/purple/maroon
+                    var colorArr = { normal: 'success', hidden: 'grey', deleted: 'danger', locked: 'info' };
+                    // 如果字段列有定义custom
+                    var newValue = value == null ? '未审核' : '已审核';
+                    var color = value == null ? 'danger' : 'primary';
+                    var html = '<span class="text-' + color + '"><i class="fa fa-circle"></i> ' + __(newValue) + '</span>';
+                    return html;
+                },
+                settle: function (value, row, index) {
+                    //颜色状态数组,可使用red/yellow/aqua/blue/navy/teal/olive/lime/fuchsia/purple/maroon
+                    var colorArr = { normal: 'success', hidden: 'grey', deleted: 'danger', locked: 'info' };
+                    // 如果字段列有定义custom
+                    var newValue = value == null ? '未结算' : '已结算';
+                    var color = value == null ? 'danger' : 'primary';
+                    var html = '<span class="text-' + color + '"><i class="fa fa-circle"></i> ' + __(newValue) + '</span>';
+                    return html;
+                },
+            },
+            bindevent: function () {
+                $('form[role=form]').data('validator-options', { msgClass: "n-bottom" });
+                //重置
+                $('#btnreset').click(function () {
+                    $('#paneladdgoods :text').val('');
+                    $('#paneladdgoods [type=number]').val('');
+                });
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+}
+);

+ 59 - 0
public/assets/js/backend/stock/supplier.js

@@ -0,0 +1,59 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'stock/supplier/index',
+                    add_url: 'stock/supplier/add',
+                    edit_url: 'stock/supplier/edit',
+                    del_url: 'stock/supplier/del',
+                    multi_url: 'stock/supplier/multi',
+                    table: 'stock_supplier',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                columns: [
+                    [
+                        {checkbox: true},
+                        {
+                            field: 'id',
+                            title: __('Id'),
+                        },
+                        {field: 'name', title: __('Name')},
+                        {field: 'shortname', title: __('Shortname')},
+                        {field: 'code', title: __('Code')},
+                        {field: 'shipaddress', title: __('Shipaddress')},
+                        {field: 'address', title: __('Address')},
+                        {field: 'contacts', title: __('Contacts')},
+                        {field: 'telphone', title: __('Telphone')},
+                        {field: 'remark', title: '备注'},
+                        {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;
+});

+ 372 - 0
public/assets/js/pingyinUntil.js

@@ -0,0 +1,372 @@
+
+/**
+ * 汉字与拼音互转工具,根据导入的字典文件的不同支持不同
+ * 对于多音字目前只是将所有可能的组合输出,准确识别多音字需要完善的词库,而词库文件往往比字库还要大,所以不太适合web环境。
+ * @start 2016-09-26
+ * @last 2016-09-29
+ */
+(function(global, factory) {
+	if (typeof module === "object" && typeof module.exports === "object") {
+		module.exports = factory(global);
+	} else {
+		factory(global);
+	}
+})(typeof window !== "undefined" ? window : this, function(window) {
+
+	var toneMap = 
+	{
+		"ā": "a1",
+		"á": "a2",
+		"ǎ": "a3",
+		"à": "a4",
+		"ō": "o1",
+		"ó": "o2",
+		"ǒ": "o3",
+		"ò": "o4",
+		"ē": "e1",
+		"é": "e2",
+		"ě": "e3",
+		"è": "e4",
+		"ī": "i1",
+		"í": "i2",
+		"ǐ": "i3",
+		"ì": "i4",
+		"ū": "u1",
+		"ú": "u2",
+		"ǔ": "u3",
+		"ù": "u4",
+		"ü": "v0",
+		"ǖ": "v1",
+		"ǘ": "v2",
+		"ǚ": "v3",
+		"ǜ": "v4",
+		"ń": "n2",
+		"ň": "n3",
+		"": "m2"
+	};
+
+	var dict = {}; // 存储所有字典数据
+	var pinyinUtil =
+	{
+		/**
+		 * 解析各种字典文件,所需的字典文件必须在本JS之前导入
+		 */
+		parseDict: function()
+		{
+			// 如果导入了 pinyin_dict_firstletter.js
+			if(window.pinyin_dict_firstletter)
+			{
+				dict.firstletter = pinyin_dict_firstletter;
+			}
+			// 如果导入了 pinyin_dict_notone.js
+			if(window.pinyin_dict_notone)
+			{
+				dict.notone = {};
+				dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				for(var i in pinyin_dict_notone)
+				{
+					var temp = pinyin_dict_notone[i];
+					for(var j=0, len=temp.length; j<len; j++)
+					{
+						if(!dict.notone[temp[j]]) dict.notone[temp[j]] = i; // 不考虑多音字
+					}
+				}
+			}
+			// 如果导入了 pinyin_dict_withtone.js
+			if(window.pinyin_dict_withtone)
+			{
+				dict.withtone = {}; // 汉字与拼音映射,多音字用空格分开,类似这种结构:{'大': 'da tai'}
+				var temp = pinyin_dict_withtone.split(',');
+				for(var i=0, len = temp.length; i<len; i++)
+				{
+					// 这段代码耗时28毫秒左右,对性能影响不大,所以一次性处理完毕
+					dict.withtone[String.fromCharCode(i + 19968)] = temp[i]; // 这里先不进行split(' '),因为一次性循环2万次split比较消耗性能
+				}
+
+				// 拼音 -> 汉字
+				if(window.pinyin_dict_notone)
+				{
+					// 对于拼音转汉字,我们优先使用pinyin_dict_notone字典文件
+					// 因为这个字典文件不包含生僻字,且已按照汉字使用频率排序
+					dict.py2hz = pinyin_dict_notone; // 拼音转汉字
+				}
+				else
+				{
+					// 将字典文件解析成拼音->汉字的结构
+					// 与先分割后逐个去掉声调相比,先一次性全部去掉声调然后再分割速度至少快了3倍,前者大约需要120毫秒,后者大约只需要30毫秒(Chrome下)
+					var notone = pinyinUtil.removeTone(pinyin_dict_withtone).split(',');
+					var py2hz = {}, py, hz;
+					for(var i=0, len = notone.length; i<len; i++)
+					{
+						hz = String.fromCharCode(i + 19968); // 汉字
+						py = notone[i].split(' '); // 去掉了声调的拼音数组
+						for(var j=0; j<py.length; j++)
+						{
+							py2hz[py[j]] = (py2hz[py[j]] || '') + hz;
+						}
+					}
+					dict.py2hz = py2hz;
+				}
+			}
+		},
+		/**
+		 * 根据汉字获取拼音,如果不是汉字直接返回原字符
+		 * @param chinese 要转换的汉字
+		 * @param splitter 分隔字符,默认用空格分隔
+		 * @param withtone 返回结果是否包含声调,默认是
+		 * @param polyphone 是否支持多音字,默认否
+		 */
+		getPinyin: function(chinese, splitter, withtone, polyphone)
+		{
+			if(!chinese || /^ +$/g.test(chinese)) return '';
+			splitter = splitter == undefined ? ' ' : splitter;
+			withtone = withtone == undefined ? true : withtone;
+			polyphone = polyphone == undefined ? false : polyphone;
+			var result = [];
+			if(dict.withtone) // 优先使用带声调的字典文件
+			{
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var pinyin = dict.withtone[chinese[i]];
+					if(pinyin)
+					{
+						// 如果不需要多音字,默认返回第一个拼音,后面的直接忽略
+						// 所以这对数据字典有一定要求,常见字的拼音必须放在最前面
+						if(!polyphone) pinyin = pinyin.replace(/ .*$/g, '');
+						if(!withtone) pinyin = this.removeTone(pinyin); // 如果不需要声调
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin ); 
+					}
+					else if ( !chinese[i] || /^ +$/g.test(chinese[i]) ){
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else{
+						noChinese += chinese[i];
+					}
+				}
+				if ( noChinese ){
+					result.push( noChinese);
+					noChinese = '';
+				}
+			}
+			else if(dict.notone) // 使用没有声调的字典文件
+			{
+				if(withtone) console.warn('pinyin_dict_notone 字典文件不支持声调!');
+				if(polyphone) console.warn('pinyin_dict_notone 字典文件不支持多音字!');
+				var noChinese = '';
+				for (var i=0, len = chinese.length; i < len; i++)
+				{
+					var temp = chinese.charAt(i),
+						pinyin = dict.notone[temp];
+					if ( pinyin ){ //插入拼音
+						//空格,把noChinese作为一个词插入
+						noChinese && ( result.push( noChinese), noChinese = '' );
+						result.push( pinyin );
+					}
+					else if ( !temp || /^ +$/g.test(temp) ){
+						//空格,插入之前的非中文字符
+						noChinese && ( result.push( noChinese), noChinese = '' );
+					}
+					else {
+						//非空格,关联到noChinese中
+						noChinese += temp;
+					}
+				}
+
+				if ( noChinese ){
+					result.push( noChinese );
+					noChinese = '';
+				}
+			}
+			else
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			if(!polyphone) return result.join(splitter);
+			else
+			{
+				if(window.pinyin_dict_polyphone) return parsePolyphone(chinese, result, splitter, withtone);
+				else return handlePolyphone(result, ' ', splitter);
+			}
+		},
+		/**
+		 * 获取汉字的拼音首字母
+		 * @param str 汉字字符串,如果遇到非汉字则原样返回
+		 * @param polyphone 是否支持多音字,默认false,如果为true,会返回所有可能的组合数组
+		 */
+		getFirstLetter: function(str, polyphone)
+		{
+			polyphone = polyphone == undefined ? false : polyphone;
+			if(!str || /^ +$/g.test(str)) return '';
+			if(dict.firstletter) // 使用首字母字典文件
+			{
+				var result = [];
+				for(var i=0; i<str.length; i++)
+				{
+					var unicode = str.charCodeAt(i);
+					var ch = str.charAt(i);
+					if(unicode >= 19968 && unicode <= 40869)
+					{
+						ch = dict.firstletter.all.charAt(unicode-19968);
+						if(polyphone) ch = dict.firstletter.polyphone[unicode] || ch;
+					}
+					result.push(ch);
+				}
+				if(!polyphone) return result.join(''); // 如果不用管多音字,直接将数组拼接成字符串
+				else return handlePolyphone(result, '', ''); // 处理多音字,此时的result类似于:['D', 'ZC', 'F']
+			}
+			else
+			{
+				var py = this.getPinyin(str, ' ', false, polyphone);
+				py = py instanceof Array ? py : [py];
+				var result = [];
+				for(var i=0; i<py.length; i++)
+				{
+					result.push(py[i].replace(/(^| )(\w)\w*/g, function(m,$1,$2){return $2.toUpperCase();}));
+				}
+				if(!polyphone) return result[0];
+				else return simpleUnique(result);
+			}
+		},
+		/**
+		 * 拼音转汉字,只支持单个汉字,返回所有匹配的汉字组合
+		 * @param pinyin 单个汉字的拼音,可以包含声调
+		 */
+		getHanzi: function(pinyin)
+		{
+			if(!dict.py2hz)
+			{
+				throw '抱歉,未找到合适的拼音字典文件!';
+			}
+			return dict.py2hz[this.removeTone(pinyin)] || '';
+		},
+		/**
+		 * 获取某个汉字的同音字,本方法暂时有问题,待完善
+		 * @param hz 单个汉字
+		 * @param sameTone 是否获取同音同声调的汉字,必须传进来的拼音带声调才支持,默认false
+		 */
+		getSameVoiceWord: function(hz, sameTone)
+		{
+			sameTone = sameTone || false
+			return this.getHanzi(this.getPinyin(hz, ' ', false))
+		},
+		/**
+		 * 去除拼音中的声调,比如将 xiǎo míng tóng xué 转换成 xiao ming tong xue
+		 * @param pinyin 需要转换的拼音
+		 */
+		removeTone: function(pinyin)
+		{
+			return pinyin.replace(/[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜńň]/g, function(m){ return toneMap[m][0]; });
+		},
+		/**
+		 * 将数组拼音转换成真正的带标点的拼音
+		 * @param pinyinWithoutTone 类似 xu2e这样的带数字的拼音
+		 */
+		getTone: function(pinyinWithoutTone)
+		{
+			var newToneMap = {};
+			for(var i in toneMap) newToneMap[toneMap[i]] = i;
+			return (pinyinWithoutTone || '').replace(/[a-z]\d/g, function(m) {
+				return newToneMap[m] || m;
+			});
+		}
+	};
+
+
+	/**
+	 * 处理多音字,将类似['D', 'ZC', 'F']转换成['DZF', 'DCF']
+	 * 或者将 ['chang zhang', 'cheng'] 转换成 ['chang cheng', 'zhang cheng']
+	 */
+	function handlePolyphone(array, splitter, joinChar)
+	{
+		splitter = splitter || '';
+		var result = [''], temp = [];
+		for(var i=0; i<array.length; i++)
+		{
+			temp = [];
+			var t = array[i].split(splitter);
+			for(var j=0; j<t.length; j++)
+			{
+				for(var k=0; k<result.length; k++)
+					temp.push(result[k] + (result[k]?joinChar:'') + t[j]);
+			}
+			result = temp;
+		}
+		return simpleUnique(result);
+	}
+
+	/**
+	 * 根据词库找出多音字正确的读音
+	 * 这里只是非常简单的实现,效率和效果都有一些问题
+	 * 推荐使用第三方分词工具先对句子进行分词,然后再匹配多音字
+	 * @param chinese 需要转换的汉字
+	 * @param result 初步匹配出来的包含多个发音的拼音结果
+	 * @param splitter 返回结果拼接字符
+	 */
+	function parsePolyphone(chinese, result, splitter, withtone)
+	{
+		var poly = window.pinyin_dict_polyphone;
+		var max = 7; // 最多只考虑7个汉字的多音字词,虽然词库里面有10个字的,但是数量非常少,为了整体效率暂时忽略之
+		var temp = poly[chinese];
+		if(temp) // 如果直接找到了结果
+		{
+			temp = temp.split(' ');
+			for(var i=0; i<temp.length; i++)
+			{
+				result[i] = temp[i] || result[i];
+				if(!withtone) result[i] = pinyinUtil.removeTone(result[i]);
+			}
+			return result.join(splitter);
+		}
+		for(var i=0; i<chinese.length; i++)
+		{
+			temp = '';
+			for(var j=0; j<max && (i+j)<chinese.length; j++)
+			{
+				if(!/^[\u2E80-\u9FFF]+$/.test(chinese[i+j])) break; // 如果碰到非汉字直接停止本次查找
+				temp += chinese[i+j];
+				var res = poly[temp];
+				if(res) // 如果找到了多音字词语
+				{
+					res = res.split(' ');
+					for(var k=0; k<=j; k++)
+					{
+						if(res[k]) result[i+k] = withtone ? res[k] : pinyinUtil.removeTone(res[k]);
+					}
+					break;
+				}
+			}
+		}
+		// 最后这一步是为了防止出现词库里面也没有包含的多音字词语
+		for(var i=0; i<result.length; i++)
+		{
+			result[i] = result[i].replace(/ .*$/g, '');
+		}
+		return result.join(splitter);
+	}
+
+	// 简单数组去重
+	function simpleUnique(array)
+	{
+		var result = [];
+		var hash = {};
+		for(var i=0; i<array.length; i++)
+		{
+			var key = (typeof array[i]) + array[i];
+			if(!hash[key])
+			{
+				result.push(array[i]);
+				hash[key] = true;
+			}
+		}
+		return result;
+	}
+
+	pinyinUtil.parseDict();
+	pinyinUtil.dict = dict;
+	window.pinyinUtil = pinyinUtil;
+
+});

Some files were not shown because too many files changed in this diff