1557492053 преди 2 години
родител
ревизия
9bda915484

+ 163 - 0
app/admin/controller/OrderReport.php

@@ -0,0 +1,163 @@
+<?php
+
+
+namespace app\admin\controller;
+
+
+use app\common\model\AdminModel;
+use app\common\model\CompanyModel;
+use app\common\model\OrderProductModel;
+use app\common\model\PaymentChannelModel;
+use app\Request;
+use think\App;
+use think\facade\View;
+
+class OrderReport extends \app\BaseController
+{
+
+    private $orderProductModel;
+    private $companyModel;
+    private $channelModel;
+    private $adminModel;
+
+    public function __construct(App $app)
+    {
+        $this->orderProductModel = new OrderProductModel();
+        $this->companyModel = new CompanyModel();
+        $this->channelModel = new PaymentChannelModel();
+        $this->adminModel = new AdminModel();
+        parent::__construct($app);
+    }
+
+
+    public function index(Request $request)
+    {
+        $params = $request->param();
+        $fmt_params = [
+            'order_no' => format_string($params['order_no'] ?? null),
+            'bar_code' => format_string($params['bar_code'] ?? null),
+            'product_name' => format_string($params['product_name'] ?? null),
+            "company_id" => format_string($params['company_id'] ?? null),
+            "adviser_id" => format_string($params['adviser_id'] ?? null),
+            "teacher_id" => format_string($params['teacher_id'] ?? null),
+            "date_range" => format_string($params['date_range'] ?? null),
+            "channel_id" => format_string($params['channel_id'] ?? null),
+        ];
+        $list = $this->orderProductModel->findByPaginate($fmt_params);
+        foreach ($list as &$item) {
+            $payments = $item->getRelation('payments');
+            $payment_names = join(' ', array_unique(array_map(function ($data) {
+                return "[{$data['channel_name']}]";
+            }, $payments->toArray())));
+            $item['payment_names'] = $payment_names;
+        }
+        View::assign([
+            'params' => $fmt_params,
+            'list' => $list,
+            'companys' => $this->companyModel->findAll(),
+            'admins' => $this->adminModel->findAll(),
+            'channels' => $this->channelModel->findAll(),
+        ]);
+        return view();
+    }
+
+    public function report(Request $request)
+    {
+        $params = $request->param();
+        $list = $this->orderProductModel->report([
+            'order_no' => format_string($params['order_no'] ?? null),
+            'bar_code' => format_string($params['bar_code'] ?? null),
+            'product_name' => format_string($params['product_name'] ?? null),
+            "company_id" => format_string($params['company_id'] ?? null),
+            "adviser_id" => format_string($params['adviser_id'] ?? null),
+            "teacher_id" => format_string($params['teacher_id'] ?? null),
+            "date_range" => format_string($params['date_range'] ?? null),
+            "channel_id" => format_string($params['channel_id'] ?? null),
+        ])->toArray();
+        $objPHPExcel = new \PHPExcel();
+        try {
+            $objSheet = $objPHPExcel->getActiveSheet();
+            //工作表标题
+            $objSheet->setTitle("main");
+            //第一行内容,放列标题
+            $objSheet->setCellValue("A1", lang('Invoice No'));
+            $objSheet->setCellValue("B1", lang('Store') . lang('Abbr'));
+            $objSheet->setCellValue("C1", lang("Date"));
+            $objSheet->setCellValue("D1", lang("Bar code"));
+            $objSheet->setCellValue("E1", lang('Product') . lang('Name'));
+            $objSheet->setCellValue("F1", lang("Belong Company"));
+            $objSheet->setCellValue("G1", lang("Sale price"));
+            $objSheet->setCellValue("H1", lang("Consumption tax"));
+            $objSheet->setCellValue("I1", lang("Quantity"));
+            $objSheet->setCellValue("J1", lang("Real Price"));
+            $objSheet->setCellValue("K1", lang("Adviser") . '1');
+            $objSheet->setCellValue("L1", lang("Adviser") . '2');
+            $objSheet->setCellValue("M1", lang("Teacher") . '1');
+            $objSheet->setCellValue("N1", lang("Teacher") . '2');
+            //设置第一行的背景颜色
+            $objPHPExcel->getActiveSheet()
+                ->getStyle('A1:N1')
+                ->getFill()
+                ->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)
+                ->getStartColor()
+                ->setRGB('FFFF00');
+            //后面行循环放内容
+            for ($i = 0; $i < count($list); $i++) {
+                $item = $list[$i];
+                $objSheet->setCellValue("A" . ($i + 2), fmtN_A($item['order_no']));
+                $objSheet->setCellValue("B" . ($i + 2), fmtN_A(preg_replace("/\\d+/", '', $item['order_no'])));
+                $objSheet->setCellValue("C" . ($i + 2), fmtN_A($item['create_time']));
+                $objSheet->setCellValue("D" . ($i + 2), fmtN_A($item['product']['bar_code']));
+                $objSheet->setCellValue("E" . ($i + 2), fmtN_A($item['product_name']));
+                $objSheet->setCellValue("F" . ($i + 2), fmtN_A($item['product']['company']['name']));
+                $objSheet->setCellValue("G" . ($i + 2), fmtN_A($item['product']['real_price']));
+                $objSheet->setCellValue("H" . ($i + 2), fmtN_A($item['sales_tax']));
+                $objSheet->setCellValue("I" . ($i + 2), 1);
+                $objSheet->setCellValue("J" . ($i + 2), fmtN_A($item['transaction_price']));
+                $objSheet->setCellValue("K" . ($i + 2), fmtN_A($item['adviser_1_name']));
+                $objSheet->setCellValue("L" . ($i + 2), fmtN_A($item['adviser_2_name']));
+                $objSheet->setCellValue("M" . ($i + 2), fmtN_A($item["teacher_1_name"]));
+                $objSheet->setCellValue("N" . ($i + 2), fmtN_A($item["teacher_2_name"]));
+            }
+            $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
+            $fileName = time();
+            header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"'); //设置excel文件名称
+            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            return json($objWriter->save("php://output"));
+        } catch (\PHPExcel_Exception $e) {
+        }
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 53 - 0
app/admin/controller/StockReport.php

@@ -0,0 +1,53 @@
+<?php
+
+
+namespace app\admin\controller;
+
+
+use think\facade\View;
+
+class StockReport extends \app\BaseController
+{
+
+    public function index() {
+        View::assign('list', []);
+        return view();
+    }
+
+
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 3 - 0
app/admin/lang/en-us.php

@@ -25,6 +25,9 @@ return [
     'system_settings'    => 'System Settings',
     'collection_channel_management'    => 'Collection channel Manage',
     'yu_long_bi_management'    => 'YULONGBI Manage',
+    "order_report" => "OrderReport",
+    "stock_report" => "StockReport",
+
 
     'unfold_search' => 'Unfold Search',
     'condition' => 'Condition',

+ 9 - 0
app/admin/lang/zh-cn.php

@@ -28,6 +28,8 @@ return [
     "activity_management" => "活动管理",
     'customer_list' =>  '客户列表',
     "role_management" => "角色管理",
+    "order_report" => "订单报表",
+    "stock_report" => "库存报表",
 
     'Yes'   => '是',
     'No'    => '否',
@@ -159,6 +161,7 @@ return [
     "Relevance department"  => "关联部门",
     "Data rules"    =>  "数据权限",
     "Tax rate"      =>  "消费税比例",
+    "Consumption tax"      =>  "消费税",
     'Is upload code'    =>  '是否需要上传记录付款编号',
     'Zue Coin Exchange Rate' =>  '御龙币兑换比例',
     'Zue Coin Consume Rate' =>  '御龙币消费比例',
@@ -197,6 +200,12 @@ return [
     "Is pay" => "是否已经支付",
     "Annual Fee" => "年费",
     "Stores do not exist" => "门店不存在!",
+    "Invoice No" => "发票编号",
+    "Belong Company" => "所属公司",
+    "Date"  =>  "时间",
+    "Sale price" => "销售价格",
+    "Quantity"  =>  "数量",
+    "Royalties" =>  "提成",
 ];
 
 

+ 205 - 179
app/admin/view/customer/add.html

@@ -1,195 +1,221 @@
 {include file='common/_js_css'}
 
 <div class="lyear-layout-web">
-  <div class="lyear-layout-container">
-    <!--页面主要内容-->
-    <main>
-      <div class="container-fluid">
-        <div class="row">
-          <div class="col-lg-12">
-            <div class="card">
-              <div class="card-body">
-                <form class="layui-form" action="">
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("name_zh")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="name_zh" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form" action="">
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("name_zh")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name_zh" lay-verify="required"
+                                                   lay-reqtext="{:lang('Please fill in')}" autocomplete="off"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("name_en")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name_en" lay-verify="required"
+                                                   lay-reqtext="{:lang('Please fill in')}" autocomplete="off"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("mobile")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="tel" name="mobile" lay-verify="required|phone"
+                                                   autocomplete="off" class="layui-input demo-phone layui-form-danger">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('sex')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="sex" lay-filter="required">
+                                                <option value="1">{:lang('Man')}</option>
+                                                <option value="2">{:lang('Woman')}</option>
+                                                <option value="3">{:lang('Unknown')}</option>
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">{:lang("sun_calendar")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="sun_calendar" id="sun_calendar"
+                                                   lay-verify="required" placeholder="yyyy-MM-dd H:i:s"
+                                                   autocomplete="off" class="layui-input" lay-key="1">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">{:lang("lunar_calendar")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="lunar_calendar" id="lunar_calendar"
+                                                   lay-verify="required" placeholder="yyyy-MM-dd H:i:s"
+                                                   autocomplete="off" class="layui-input" lay-key="1">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item unfold_ajax">
+                                        <label class="layui-form-label">{:lang('Counselor')}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" id="ajax_search_id" name="follow_user_id"
+                                                   class="layui-input"
+                                                   placeholder="{:lang('Please enter employee nickname or ID and press Enter to search')}"
+                                                   style="position:absolute;z-index:2;width:88%;" value=""
+                                                   autocomplete="off">
+                                            <select id="ajax_search" name="follow_user_id" lay-verify="required"
+                                                    lay-filter="ajax_search">
+                                                <option value="">{:lang('Please enter employee nickname or ID and press
+                                                    Enter to search')}
+                                                </option>
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("linkman")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="linkman" lay-verify="required"
+                                                   lay-reqtext="{:lang('Please fill in')}" autocomplete="off"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("relation")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="relation" lay-verify="required"
+                                                   lay-reqtext="{:lang('Please fill in')}" autocomplete="off"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("address")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="address" lay-verify="required"
+                                                   lay-reqtext="{:lang('Please fill in')}" autocomplete="off"
+                                                   class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <div class="layui-inline">
+                                            <label class="layui-form-label">{:lang("email")}</label>
+                                            <div class="layui-input-block">
+                                                <input type="text" name="email" lay-verify="email" autocomplete="off"
+                                                       class="layui-input">
+                                            </div>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" class="layui-btn" lay-submit=""
+                                                    lay-filter="caviar_submit_btn">{:lang('Submit')}
+                                            </button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}
+                                            </button>
+                                        </div>
+                                    </div>
+                                </form>
+
+                            </div>
+                        </div>
                     </div>
-                  </div>
 
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("name_en")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="name_en" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                      <label class="layui-form-label">{:lang("mobile")}</label>
-                      <div class="layui-input-block">
-                        <input type="tel" name="mobile" lay-verify="required|phone" autocomplete="off" class="layui-input demo-phone layui-form-danger">
-                      </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang('sex')}</label>
-                    <div class="layui-input-block">
-                      <select name="sex" lay-filter="required">
-                        <option value="1">{:lang('Man')}</option>
-                        <option value="2">{:lang('Woman')}</option>
-                        <option value="3">{:lang('Unknown')}</option>
-                      </select>
-                    </div>
-                  </div>
-
-                  <div class="layui-inline">
-                    <label class="layui-form-label">{:lang("sun_calendar")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="sun_calendar" id="sun_calendar" lay-verify="required" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
-                    </div>
-                  </div>
-
-                  <div class="layui-inline">
-                    <label class="layui-form-label">{:lang("lunar_calendar")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="lunar_calendar" id="lunar_calendar" lay-verify="required" placeholder="yyyy-MM-dd H:i:s" autocomplete="off" class="layui-input" lay-key="1">
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item unfold_ajax">
-                    <label class="layui-form-label">{:lang('Counselor')}</label>
-                    <div class="layui-input-block">
-                      <input type="text" id="ajax_search_id" name="follow_user_id" class="layui-input"
-                             placeholder="{:lang('Please enter employee nickname or ID and press Enter to search')}" style="position:absolute;z-index:2;width:88%;" value="" autocomplete="off">
-                      <select id="ajax_search" name="follow_user_id" lay-verify="required" lay-filter="ajax_search" >
-                        <option value="">{:lang('Please enter employee nickname or ID and press Enter to search')}</option>
-                      </select>
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("linkman")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="linkman" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("relation")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="relation" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                    <label class="layui-form-label">{:lang("address")}</label>
-                    <div class="layui-input-block">
-                      <input type="text" name="address" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
-                    </div>
-                  </div>
-
-                  <div class="layui-form-item">
-                    <div class="layui-inline">
-                      <label class="layui-form-label">{:lang("email")}</label>
-                      <div class="layui-input-block">
-                        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
-                      </div>
-                    </div>
-                  </div>
+                </div>
 
-                  <div class="layui-form-item">
-                    <div class="layui-input-block">
-                      <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
-                      <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
-                    </div>
-                  </div>
-                </form>
-
-              </div>
             </div>
-          </div>
-
-        </div>
-
-      </div>
-    </main>
-    <!--End 页面主要内容-->
-  </div>
+        </main>
+        <!--End 页面主要内容-->
+    </div>
 </div>
 <script>
 
-  // 用于缓存下拉获取的数据
-  let dropData
-
-  // 请求返回数据
-  function getData(str){
-    return new Promise(resolve=>{
-      request("{:url('admin/admin/findAdmins')}", {"text": str}).then((data) => {
-        if (data.code === 200) {
-          resolve(data.data.map(v => {
-            return {
-              value: v.id,
-              text: `【${v.id}】 ${v.nickname}`
-            }
-          }))
-        }
-      })
-    })
-  }
-
-  $("#ajax_search_id").on("keyup", async function(e){
-    if(e.which=='13'){
-      dropData=await getData($(this).val())
-      innitSelect("#ajax_search", dropData)
-      let form = layui.form;
-      form.render()
-      $(".unfold_ajax .layui-form-select").addClass("layui-form-selected")
-    }
-  })
-
-  // 渲染下拉框的数据
-  function innitSelect(name,data){
-    let html=''
-    if(data && data instanceof Array){
-      data.forEach(item=>{
-        html+="<option value="+item.value+">"+item.text+"</option>"
-      })
+    // 用于缓存下拉获取的数据
+    let dropData
+
+    // 请求返回数据
+    function getData(str) {
+        return new Promise(resolve => {
+            request("{:url('admin/admin/findAdmins')}", {"text": str}).then((data) => {
+                if (data.code === 200) {
+                    resolve(data.data.map(v => {
+                        return {
+                            value: v.id,
+                            text: `【${v.id}】 ${v.nickname}`
+                        }
+                    }))
+                }
+            })
+        })
     }
-    $(name).html(html)
-  }
-  var index = parent.layer.getFrameIndex(window.name);
-
-  layui.use(['laydate','form'], () => {
-    const laydate = layui.laydate;
-    const form = layui.form;
-
-    form.on("select(ajax_search)",function(data){
-      let value = data.value
-      let selectObj = dropData.filter(item=> {
-        return item.value == value
-      })
-      $("#ajax_search_id").val(selectObj[0].text);
-    })
 
-    form.on('submit(caviar_submit_btn)', (data) =>{
-      const response = request('/admin/customer/add',data.field)
-      response.then((res) => {
-          res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
-            location.reload();
-          }) : layer.msg(res.message,{icon: 5})
-      })
-      return false;
-    });
+    $("#ajax_search_id").on("keyup", async function (e) {
+        if (e.which == '13') {
+            dropData = await getData($(this).val())
+            innitSelect("#ajax_search", dropData)
+            let form = layui.form;
+            form.render()
+            $(".unfold_ajax .layui-form-select").addClass("layui-form-selected")
+        }
+    })
 
+    // 渲染下拉框的数据
+    function innitSelect(name, data) {
+        let html = ''
+        if (data && data instanceof Array) {
+            data.forEach(item => {
+                html += "<option value=" + item.value + ">" + item.text + "</option>"
+            })
+        }
+        $(name).html(html)
+    }
 
-    laydate.render({
-      elem: '#sun_calendar',
-      type: 'datetime'
-    });
-    laydate.render({
-      elem: '#lunar_calendar',
-      type: 'datetime'
+    var index = parent.layer.getFrameIndex(window.name);
+
+    layui.use(['laydate', 'form'], () => {
+        const laydate = layui.laydate;
+        const form = layui.form;
+
+        form.on("select(ajax_search)", function (data) {
+            let value = data.value
+            let selectObj = dropData.filter(item => {
+                return item.value == value
+            })
+            $("#ajax_search_id").val(selectObj[0].text);
+        })
+
+        form.on('submit(caviar_submit_btn)', (data) => {
+            const response = request('/admin/customer/add', data.field)
+            response.then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1, time: 500}, () => {
+                    location.reload();
+                }) : layer.msg(res.message, {icon: 5})
+            })
+            return false;
+        });
+
+
+        laydate.render({
+            elem: '#sun_calendar',
+            type: 'datetime'
+        });
+        laydate.render({
+            elem: '#lunar_calendar',
+            type: 'datetime'
+        });
     });
-  });
 </script>

+ 249 - 0
app/admin/view/order_report/index.html

@@ -0,0 +1,249 @@
+{include file='common/_js_css'}
+<link href="__CSS__/common.css" rel="stylesheet">
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card" id="select_card_caviar" style="display: none">
+                <div class="card-header">{$Think.lang.condition}</div>
+                <div class="card-body">
+                    <form action="{:url('admin/order_report/index')}" method="post" class="form-horizontal form-search">
+                        <div class="row">
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Invoice No")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="order_no" id="order_no"
+                                               value="{$params.order_no}" placeholder='{:lang("Invoice No")}'/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Bar code")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="bar_code" id="bar_code"
+                                               value="{$params.bar_code}" placeholder="{:lang('Bar code')}"/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Product")}{:lang("Name")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="form-control pull-left" name="product_name"
+                                               id="product_name"
+                                               value="{$params.product_name}"
+                                               placeholder='{:lang("Product")}{:lang("Name")}'/>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Belong Company")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <div class="layui-form-item"
+                                             style="">
+                                            <div class="layui-inline layui-form">
+                                                <select name="company_id" lay-search="" id="company_id">
+                                                    <option value="" selected>{:lang("Unknown")}</option>
+                                                    {volist name="companys" id="item"}
+                                                    <option value="{$item.id}" {if $item.id== $params.company_id}
+                                                            selected {/if}>{$item.name}</option>
+                                                    {/volist}
+                                                </select>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Adviser")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <div class="layui-form-item"
+                                             style="">
+                                            <div class="layui-inline layui-form">
+                                                <select name="adviser_id" lay-search="" id="adviser_id">
+                                                    <option value="" selected>{:lang("Unknown")}</option>
+                                                    {volist name="admins" id="item"}
+                                                    <option value="{$item.id}" {if $item.id== $params.adviser_id}
+                                                            selected {/if}>{$item.nickname}</option>
+                                                    {/volist}
+                                                </select>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Teacher")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <div class="layui-form-item"
+                                             style="">
+                                            <div class="layui-inline layui-form">
+                                                <select name="teacher_id" lay-search="" id="teacher_id">
+                                                    <option value="" selected>{:lang("Unknown")}</option>
+                                                    {volist name="admins" id="item"}
+                                                    <option value="{$item.id}" {if $item.id== $params.teacher_id}
+                                                            selected {/if}>{$item.nickname}</option>
+                                                    {/volist}
+                                                </select>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("统计时间")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <input type="text" class="layui-input" name="date_range" id="date_range"
+                                               placeholder="{if $params.date_range == ''}{:lang('Start Time')} / {:lang('End Time')}{else /}{$params.date_range}{/if}"
+                                               value="{$params.date_range}">
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("支付方式")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <div class="layui-form-item"
+                                             style="">
+                                            <div class="layui-inline layui-form">
+                                                <select name="channel_id" lay-search="" id="channel_id">
+                                                    <option value="" selected>{:lang("Unknown")}</option>
+                                                    {volist name="channels" id="item"}
+                                                    <option value="{$item.id}" {if $item.id== $params.channel_id}
+                                                            selected {/if}>{$item.name}</option>
+                                                    {/volist}
+                                                </select>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
+                                    <label class="w-120 pull-left control-label"></label>
+                                    <div class="pull-left w-120-calc">
+                                        <button class="btn btn-success m-r-5" id="caviar_send_btn" type="submit"
+                                                href="#">{:lang('search')}
+                                        </button>
+                                        <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </form>
+                </div>
+            </div>
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-success m-r-5" id="caviar_search_btn" href="#!"
+                           onclick="select_card_switch()">{$Think.lang.unfold_search}</a>
+                        <a class="btn btn-primary m-r-5" onclick="caviar_report()">{:lang('Report')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive">
+                        <table class="table table-bordered">
+                            <thead>
+                            <tr>
+                                <th>{:lang('Invoice No')}</th>
+                                <th>{:lang('Store')}{:lang('Abbr')}</th>
+                                <th>{:lang('Date')}</th>
+                                <th>{:lang('Bar code')}</th>
+                                <th>{:lang('Product')}{:lang("Name")}</th>
+                                <th>{:lang("Belong Company")}</th>
+                                <th>{:lang('Sale price')}</th>
+                                <th>{:lang('Consumption tax')}</th>
+                                <th>{:lang('Quantity')}</th>
+                                <th>{:lang('Real Price')}</th>
+                                <th>{:lang('Royalties')}</th>
+                                <th>{:lang('Payment Channel')}</th>
+                                <th>{:lang('Adviser')}1</th>
+                                <th>{:lang('Adviser')}2</th>
+                                <th>{:lang('Teacher')}1</th>
+                                <th>{:lang('Teacher')}2</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            {volist name="list" id="item"}
+                            <tr>
+                                <td>{$item.order_no}</td>
+                                <td>{:preg_replace("/\\d+/",'', $item.order_no)}</td>
+                                <td>{$item.create_time}</td>
+                                <td>{$item.product.bar_code}</td>
+                                <td>{$item.product_name}</td>
+                                <td>{:fmtN_A($item.product.company.name)}</td>
+                                <td>{$item.product.real_price}</td>
+                                <td>{$item.sales_tax}</td>
+                                <td>1</td>
+                                <td>{$item.transaction_price}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{$item.payment_names}</td>
+                                <td>{:fmtN_A($item.adviser_1_name)}</td>
+                                <td>{:fmtN_A($item.adviser_2_name)}</td>
+                                <td>{:fmtN_A($item.teacher_1_name)}</td>
+                                <td>{:fmtN_A($item.teacher_2_name)}</td>
+                            </tr>
+                            {/volist}
+                            </tbody>
+                        </table>
+                    </div>
+                    {$list|raw}
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    function caviar_report() {
+        const form_data = {
+            order_no: $("#order_no").val(),
+            bar_code: $("#bar_code").val(),
+            product_name: $("#product_name").val(),
+            company_id: $("#company_id").val(),
+            adviser_id: $("#adviser_id").val(),
+            teacher_id: $("#teacher_id").val(),
+            date_range: $("#date_range").val(),
+            channel_id: $("#channel_id").val(),
+        };
+        const data_str = Object.keys(form_data).map((key) => `${key}=${form_data[key]}`).join("&");
+        window.location.href = "{:url('admin/order_report/report')}?" + data_str;
+    }
+
+    if (check_params([
+        '{$params.order_no}',
+        '{$params.bar_code}',
+        '{$params.product_name}',
+        "{$params.company_id}",
+        "{$params.adviser_id}",
+        "{$params.teacher_id}",
+        "{$params.date_range}",
+        "{$params.channel_id}"
+    ]))
+        $('#select_card_caviar').css('display', 'block');
+
+    layui.use(['laydate', 'form'], () => {
+        const laydate = layui.laydate;
+        const form = layui.form;
+
+        //监听提交
+        form.on('submit(caviar_send_btn)', function (data) {
+            layer.msg(JSON.stringify(data.field));
+            return false;
+        });
+        laydate.render({
+            elem: '#date_range',
+            type: 'datetime',
+            range: '/',
+            format: 'yyyy-M-d'
+        });
+    });
+</script>

+ 1 - 1
app/admin/view/payment_channel/index.html

@@ -40,7 +40,7 @@
                                 <td>{$item.name}</td>
                                 <td>{$item.type_str}</td>
                                 <td>{if $item.is_upload_code == 1}是{else /}否{/if}</td>
-                                <td><img class="small-img" src="{$item.icon}" onclick="image_magnify()" ></td>
+                                <td><img class="small-img" style="background-color: dodgerblue;" src="{$item.icon}" onclick="image_magnify()" ></td>
                                 <td>{$item.update_time}</td>
                                 <td>
                                     <div class="btn-group">

+ 79 - 0
app/admin/view/stock_report/index.html

@@ -0,0 +1,79 @@
+{include file='common/_js_css'}
+
+<link href="__CSS__/common.css" rel="stylesheet">
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/company/add\')}')"><i
+                                class="mdi mdi-plus"></i> {:lang('add')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="
+                            caviar_checkbox_delete('{:url(\'admin/company/delete\')}', ['{:lang(\'Check at least one box\')}','{:lang(\'Succeed\')}'],'{:lang(\'Warn\')}','{:lang(\'Are you sure you want to delete the selected data\')}',['{:lang(\'Confirm\')}'])"
+                        ><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive">
+                        <table class="table table-bordered">
+                            <thead>
+                            <tr>
+                                <th>
+                                    <label class="lyear-checkbox checkbox-primary">
+                                        <input type="checkbox" id="check-all" onclick="checkbox()"><span></span>
+                                    </label>
+                                </th>
+                                <th>{:lang("ID")}</th>
+                                <th>{:lang('Name')}</th>
+                                <th>{:lang('Introduce')}</th>
+                                <th>{:lang('update_time')}</th>
+                                <th>{:lang('operation')}</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            {volist name="list" id="item"}
+                            <tr>
+                                <td>
+                                    <label class="lyear-checkbox checkbox-primary">
+                                        <input class="checkbox_caviar" type="checkbox" name="ids[]"
+                                               value="{$item.id}"><span></span>
+                                    </label>
+                                </td>
+                                <td>{$item.id}</td>
+                                <td>{$item.name}</td>
+                                <td>{$item.introduce}</td>
+                                <td>{$item.update_time}</td>
+                                <td>
+                                    <div class="btn-group">
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('select')}"
+                                           data-toggle="tooltip"
+                                           onclick='view("/admin/company/edit?id={$item.id}","{:lang(\"Info\")}")'><i
+                                                class="mdi mdi-eye"></i></a>
+                                        <a class="btn btn-xs btn-default" href="#!" title="{:lang('delete')}"
+                                           data-toggle="tooltip" onclick='
+                                           deletingASingle("{:url(\"admin/company/delete\")}","{$item.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                        ><i class="mdi mdi-window-close"></i></a>
+                                    </div>
+                                </td>
+                            </tr>
+                            {/volist}
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<style>
+
+</style>
+
+<script type="text/javascript">
+    // if(check_params([]))
+    //     $('#select_card_caviar').css('display','block');
+</script>
+
+

+ 2 - 0
app/api/service/LoginService.php

@@ -37,6 +37,8 @@ class LoginService extends BaseService
         if (!$group)
             return $this->fail(lang('The role group does not exist'));
         $stores = $this->storeModel->findByIds($admin->store_ids ? explode(',', $admin->store_ids) : []);
+        if(count($stores) == 0) return $this->fail("该员工未绑定门店信息");
+        unset($admin['password']);
         $admin['group'] = $group;
         $admin['stores'] = $stores;
         $token = \Jwt::getToken([

+ 3 - 1
app/common.php

@@ -108,7 +108,9 @@ function compare($num, $array) {
     return ['min_num' => $min_num, 'item' => $index == null ? null : $array[$index]];
 }
 
-
+function fmtN_A($value = null, $def = "#N/A") {
+    return $value != null && strlen(strval($value)) > 0 ? $value : $def;
+}
 
 
 

+ 7 - 0
app/common/model/AdminModel.php

@@ -99,6 +99,13 @@ class AdminModel extends BaseModel
             ->select();
     }
 
+
+    public function findAll() {
+        return $this->where('is_delete', 0)
+            ->where('store_ids',"NOT NULL")
+            ->select();
+    }
+
 }
 
 

+ 93 - 17
app/common/model/OrderProductModel.php

@@ -4,15 +4,28 @@
 namespace app\common\model;
 
 
+use think\Db;
+
 class OrderProductModel extends BaseModel
 {
     protected $table = 'erp_order_product';
 
+
     protected function genSchema(array $schema)
     {
         // TODO: Implement genSchema() method.
     }
 
+    public function product()
+    {
+        return self::hasOne(ProductModel::class, 'id', 'product_id')->where('is_delete', 0);
+    }
+
+    public function payments()
+    {
+        return self::hasMany(OrderPaymentModel::class, 'order_id', 'order_id')->where('is_delete', 0);
+    }
+
     /**
      * @param $o_id
      * @param int $is_pay
@@ -21,9 +34,10 @@ class OrderProductModel extends BaseModel
      * @throws \think\db\exception\DbException
      * @throws \think\db\exception\ModelNotFoundException
      */
-    public function findByOrderId($o_id, $is_pay = 1) {
+    public function findByOrderId($o_id, $is_pay = 1)
+    {
         return $this->where('is_delete', 0)
-            ->where('order_id',$o_id)
+            ->where('order_id', $o_id)
             ->where('is_pay', $is_pay)
             ->select();
     }
@@ -35,9 +49,10 @@ class OrderProductModel extends BaseModel
      * @return \think\Paginator
      * @throws \think\db\exception\DbException
      */
-    public function fetchByOrderId($o_id, $page = 1, $size = 10) {
+    public function fetchByOrderId($o_id, $page = 1, $size = 10)
+    {
         return $this->where('is_delete', 0)
-            ->where('order_id',$o_id)
+            ->where('order_id', $o_id)
             ->page($page)
             ->paginate($size);
     }
@@ -49,53 +64,114 @@ class OrderProductModel extends BaseModel
      * @return int
      * @throws \think\db\exception\DbException
      */
-    public function countByCustomerId($c_id, $is_upload_numerology = 1, $is_upload = null) {
+    public function countByCustomerId($c_id, $is_upload_numerology = 1, $is_upload = null)
+    {
         $where = [
             ['is_delete', '=', 0],
             ['customer_id', '=', $c_id],
             ['is_upload_numerology', '=', $is_upload_numerology]
         ];
         if ($is_upload) {
-            array_push($where,['is_upload', '=', $is_upload]);
+            array_push($where, ['is_upload', '=', $is_upload]);
         }
         return $this->where($where)
             ->count();
     }
 
-    public function countByAdviser($adviser_1_id, $start_time = null, $end_time = null) {
+    public function countByAdviser($adviser_1_id, $start_time = null, $end_time = null)
+    {
         $where = [
             ['is_delete', '=', 0],
             ['adviser_1_id', '=', $adviser_1_id],
-            ['is_pay' , '=', 1]
+            ['is_pay', '=', 1]
         ];
-        if($start_time) array_push($where, ['create_time', '>=', $start_time]);
-        if($end_time) array_push($where, ['create_time', '<=', $end_time]);
+        if ($start_time) array_push($where, ['create_time', '>=', $start_time]);
+        if ($end_time) array_push($where, ['create_time', '<=', $end_time]);
         return [
             $this->where($where)->sum('real_price'),
-            $this->where(array_merge($where,[
+            $this->where(array_merge($where, [
                 ['is_upload_numerology', '=', 1],
                 ['is_upload', '=', 1]
             ]))->count(),
-            $this->where(array_merge($where,[['is_upload_numerology', '=', 1]]))->count(),
+            $this->where(array_merge($where, [['is_upload_numerology', '=', 1]]))->count(),
             $this->where(array_merge($where, [['is_serve', '=', 0]]))->sum('real_price'),
             $this->where(array_merge($where, [['teacher_1_id', '>', 0]]))->sum('real_price'),
             $this->where(array_merge($where, [['is_serve', '=', 1]]))->sum('real_price'),
         ];
     }
 
-    public function countByAdviserProductCategoryIds($adviser_1_id, $category_ids = [], $start_time = null, $end_time = null) {
-        if (count($category_ids) == 0) return [0 , 0];
+    public function countByAdviserProductCategoryIds($adviser_1_id, $category_ids = [], $start_time = null, $end_time = null)
+    {
+        if (count($category_ids) == 0) return [0, 0];
         $where = [
             ['is_delete', '=', 0],
             ['adviser_1_id', '=', $adviser_1_id],
-            ['is_pay' , '=', 1],
+            ['is_pay', '=', 1],
             ['product_category_id', 'in', $category_ids]
         ];
-        if($start_time) array_push($where, ['create_time', '>=', $start_time]);
-        if($end_time) array_push($where, ['create_time', '<=', $end_time]);
+        if ($start_time) array_push($where, ['create_time', '>=', $start_time]);
+        if ($end_time) array_push($where, ['create_time', '<=', $end_time]);
         return [$this->where($where)->sum('real_price'), $this->where($where)->count()];
     }
 
+    public function findByPaginate(array $params)
+    {
+        return $this->genWhere($params)
+            ->paginate([
+                'list_rows' => 10,
+                "query" => $params
+            ]);
+    }
+    public function report($params)
+    {
+        return $this->genWhere($params)
+            ->select();
+    }
+
+    public function genWhere($params)
+    {
+        $self_where = [
+            ['erp_order_product.is_delete', '=', 0],
+            ['erp_order_product.is_pay', '=', 1],
+        ];
+        $product_where = [];
+        if ($params['order_no']) {
+            array_push($self_where, ["{$this->table}.order_no", "like", "%{$params['order_no']}%"]);
+        }
+        if ($params['product_name']) {
+            array_push($self_where, ["{$this->table}.product_name", "like", "%{$params['product_name']}%"]);
+        }
+        if ($params['adviser_id'] > 0) {
+            array_push($self_where, ["{$this->table}.adviser_1_id|{$this->table}.adviser_2_id", "=", $params['adviser_id']]);
+        }
+        if ($params['teacher_id'] > 0) {
+            array_push($self_where, ["{$this->table}.teacher_1_id|{$this->table}.teacher_2_id", "=", $params['teacher_id']]);
+        }
+        if ($params['date_range']) {
+            $date_range = explode('/', preg_replace("/\s| /", "", $params['date_range']));
+            $start_time = strtotime($date_range[0]);
+            $end_time = strtotime($date_range[1]);
+            if ($start_time > 0) {
+                array_push($self_where, ["{$this->table}.create_time", ">=", $start_time]);
+            }
+            if ($end_time > 0) {
+                array_push($self_where, ["{$this->table}.create_time", "<", $end_time]);
+            }
+        }
+        if ($params['bar_code']) {
+            array_push($product_where, ['bar_code', "like", "%{$params['bar_code']}%"]);
+        }
+        if ($params['company_id'] && $params['company_id'] > 0) {
+            array_push($product_where, ['company_id', "=", $params['company_id']]);
+        }
 
+        $query = $this->where($self_where)
+            ->with(['product', 'product.company', 'payments'])
+            ->hasWhere('product', $product_where);
+        if ($params['channel_id'] > 0) {
+            $query->where("FIND_IN_SET('{$params['channel_id']}', OrderProductModel.channel_ids)");
+        }
+        return $query;
+    }
 
 }

+ 41 - 62
public/static/js/common.js

@@ -20,17 +20,16 @@ async function request($url, $data, $method = 'POST') {
 // 搜索开关
 function select_card_switch() {
     const element = $('#select_card_caviar')
-    if(element.css('display') === 'none') {
-        element.css('display','block');
+    if (element.css('display') === 'none') {
+        element.css('display', 'block');
         $("#caviar_search_btn").val("关闭搜索")
     } else {
-        element.css('display','none');
+        element.css('display', 'none');
         $("#caviar_search_btn").val("展开搜索")
     }
 }
 
 
-
 function check_params(p = []) {
     const index = p.findIndex(v => v !== undefined && v.toString().length > 0);
     return index >= 0;
@@ -38,25 +37,25 @@ function check_params(p = []) {
 
 function checkbox() {
     const isSelect = $("#check-all").is(":checked")
-    isSelect ? $("input[class='checkbox_caviar']").each(function(i,n){
+    isSelect ? $("input[class='checkbox_caviar']").each(function (i, n) {
         n.checked = true;
-    }) : $("input[class='checkbox_caviar']").each(function(i,n){
+    }) : $("input[class='checkbox_caviar']").each(function (i, n) {
         n.checked = false;
     })
 }
 
 async function caviar_checkbox_delete(url,
                                       hints = ['Check at least one box', 'Succeed'],
-                                      title= 'Warn',
-                                      content= 'Are you sure you want to delete the selected data?',
+                                      title = 'Warn',
+                                      content = 'Are you sure you want to delete the selected data?',
                                       btn = ['Confirm'],
                                       ids_data = undefined
-                                      ) {
-    const ids = $('.checkbox_caviar:checkbox:checked').map((index,el) => {
+) {
+    const ids = $('.checkbox_caviar:checkbox:checked').map((index, el) => {
         return $(el).val();
     }).get();
-    if(ids.length === 0 && ids_data === undefined) {
-        layer.msg(hints[0],{icon: 5})
+    if (ids.length === 0 && ids_data === undefined) {
+        layer.msg(hints[0], {icon: 5})
         return false;
     }
 
@@ -66,9 +65,9 @@ async function caviar_checkbox_delete(url,
         btn,
         yes: async (index, layero) => {
             const response = await request(url, {ids: ids_data ? ids_data.join(',') : ids.join(',')});
-            response.code === 200 ? layer.msg(hints[1], {icon: 1,time:500},() => {
+            response.code === 200 ? layer.msg(hints[1], {icon: 1, time: 500}, () => {
                 location.reload();
-            }) : layer.msg(res.message,{icon: 5})
+            }) : layer.msg(res.message, {icon: 5})
             layer.close(index);
         }
 
@@ -79,18 +78,18 @@ async function caviar_checkbox_delete(url,
 function deletingASingle(url,
                          id,
                          hints = ['Succeed'],
-                         title= 'Warn',
-                         content= 'Are you sure you want to delete the selected data?',
+                         title = 'Warn',
+                         content = 'Are you sure you want to delete the selected data?',
                          btn = ['Confirm']) {
     layer.open({
         title: title,
         content: content,
         btn: btn,
         yes: async (index, layero) => {
-            const response = await request(url, { ids: id.toString()} );
-            response.code === 200 ? layer.msg(hints[0], {icon: 1,time:500},() => {
+            const response = await request(url, {ids: id.toString()});
+            response.code === 200 ? layer.msg(hints[0], {icon: 1, time: 500}, () => {
                 location.reload();
-            }) : layer.msg(res.message,{icon: 5})
+            }) : layer.msg(res.message, {icon: 5})
             layer.close(index);
         }
 
@@ -98,53 +97,52 @@ function deletingASingle(url,
 }
 
 function add(url = '', title = "Info", area = ['60%', '80%']) {
-    layui.use('layer', function(){
+    layui.use('layer', function () {
         var layer = layui.layer;
         layer.open({
             title: title,
-
             type: 2,
-            content:url,
+            content: url,
             area: area,
         });
     });
 }
 
 function view(url = '', title = "Info", area = ['80%', '80%']) {
-    layui.use('layer', function(){
+    layui.use('layer', function () {
         var layer = layui.layer;
         layer.open({
             title: title,
             type: 2,
-            content:url,
+            content: url,
             area: area,
         });
     });
 }
 
 function image_magnify() {
-    let jishu=0;
-    $(document).on('click', '.small-img', function(data){
-        var ImgUrl=$(this).attr('src');
-        if(jishu===0) {
-            jishu=1;
+    let jishu = 0;
+    $(document).on('click', '.small-img', function (data) {
+        var ImgUrl = $(this).attr('src');
+        if (jishu === 0) {
+            jishu = 1;
             layer.open({
-                type:1
-                ,title:false
-                ,closeBtn:0
-                ,skin:'layui-layer-nobg'
-                ,shadeClose:true
-                ,content:'<img style="width:100%;height:100%;" class="layui-upload-img" src="'+ ImgUrl+'"/>'
-                ,scrollbar:false
+                type: 1
+                , title: false
+                , closeBtn: 0
+                , skin: 'layui-layer-nobg'
+                , shadeClose: true
+                , content: '<img style="width:100%;height:100%;" class="layui-upload-img" src="' + ImgUrl + '"/>'
+                , scrollbar: false
             })
-        }else{
-            jishu=0;
+        } else {
+            jishu = 0;
             layer.closeAll();
         }
     })
 }
 
-function deepTraversal(tree = []){
+function deepTraversal(tree = []) {
     let nodes = [];
     const queues = tree.map(v => v);
     while (queues.length > 0) {
@@ -165,23 +163,10 @@ function deepTraversal(tree = []){
 }
 
 
-function f() {
-    const channels = [
-        {
-            "channel_id": "1",
-            "fee": 100,
-            "code": "编号",
-            "credit_card": [
-                {
-                    "credit_card_id": 1,
-                    "fee": 0,
-                    "code": "编号",
-                    "stage_num": 6,
-                }
-            ]
-        }
-    ]
-
+function urlencode (str) {
+    str = (str + '').toString();
+    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
+    replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
 }
 
 
@@ -196,9 +181,3 @@ function f() {
 
 
 
-
-
-
-
-
-