1557492053 2 年 前
コミット
1480a3ee5c

+ 104 - 2
app/admin/controller/StockReport.php

@@ -4,16 +4,118 @@
 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\common\model\ProductModel;
+use app\Request;
+use think\App;
 use think\facade\View;
 
 class StockReport extends \app\BaseController
 {
 
-    public function index() {
-        View::assign('list', []);
+    private $orderProductModel;
+    private $companyModel;
+    private $channelModel;
+    private $adminModel;
+    private $productModel;
+
+    public function __construct(App $app)
+    {
+        $this->orderProductModel = new OrderProductModel();
+        $this->companyModel = new CompanyModel();
+        $this->channelModel = new PaymentChannelModel();
+        $this->adminModel = new AdminModel();
+        $this->productModel = new ProductModel();
+        parent::__construct($app);
+    }
+
+
+    public function index(Request $request)
+    {
+        $params = $request->param();
+        $fmt_params = [
+            "date_range" => format_string($params['date_range'] ?? null),
+        ];
+        $list = $this->productModel->fetchByStock($fmt_params);
+        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) {
+        }
+    }
 
 
 }

+ 0 - 2
app/admin/view/order/index.html

@@ -77,7 +77,6 @@
                                 <th>{:lang('Receive amount')}(¥)</th>
                                 <th>{:lang('Imposed amount')}(¥)</th>
                                 <th>{:lang('Type')}</th>
-                                <th>{:lang('Creator')}</th>
                                 <th>{:lang('create_time')}</th>
                                 <th>{:lang('operation')}</th>
                             </tr>
@@ -100,7 +99,6 @@
                                 <td>{$item.receive_amount}</td>
                                 <td>{$item.imposed_amount}</td>
                                 <td>{if $item.type == 1}{:lang('History order')}{else /}{:lang('Earnest order')}{/if}</td>
-                                <td>【{$item.admin_id}】{$item.admin_name}</td>
                                 <td>{$item.create_time}</td>
                                 <td>
                                     <div class="btn-group">

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

@@ -243,7 +243,6 @@
             elem: '#date_range',
             type: 'datetime',
             range: '/',
-            format: 'yyyy-M-d'
         });
     });
 </script>

+ 82 - 43
app/admin/view/stock_report/index.html

@@ -1,17 +1,46 @@
 {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("统计时间")}</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-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-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>
+                        <a class="btn btn-primary m-r-5" onclick="">{:lang('生成滞销报表')}</a>
+                        <a class="btn btn-primary m-r-5" onclick="">{:lang('打印')}</a>
+                        <a class="btn btn-primary m-r-5" onclick="caviar_report()">{:lang('Report')}</a>
                     </div>
                 </div>
                 <div class="card-body">
@@ -19,61 +48,71 @@
                         <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>
+                                <th>{:lang('Bar code')}</th>
+                                <th>{:lang('Product')}{:lang('Name')}</th>
+                                <th>{:lang('成本价')}</th>
+                                <th>{:lang('实际售价')}</th>
+                                <th>{:lang("当前库存值")}</th>
+                                <th>{:lang('当前库存总额')}</th>
+                                <th>{:lang('采购量')}</th>
+                                <th>{:lang('采购金额')}</th>
+                                <th>{:lang('销售量')}</th>
+                                <th>{:lang('销售金额')}</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.bar_code}</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>
+                                <td>{$item.real_price}</td>
+                                <td>{$item.real_price}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{:fmtN_A("")}</td>
+                                <td>{:fmtN_A("")}</td>
                             </tr>
                             {/volist}
                             </tbody>
                         </table>
                     </div>
+                    {$list|raw}
                 </div>
             </div>
         </div>
     </div>
 </div>
 
-<style>
+<script type="text/javascript">
+    function caviar_report() {
+        const form_data = {
+            date_range: $("#date_range").val(),
+        };
+        const data_str = Object.keys(form_data).map((key) => `${key}=${form_data[key]}`).join("&");
+        window.location.href = "{:url('admin/stock_report/report')}?" + data_str;
+    }
 
-</style>
+    if (check_params([
+        1,
+    ]))
+        $('#select_card_caviar').css('display', 'block');
 
-<script type="text/javascript">
-    // if(check_params([]))
-    //     $('#select_card_caviar').css('display','block');
-</script>
+    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: true
+        });
+    });
+</script>

+ 10 - 0
app/common/model/ProductModel.php

@@ -43,6 +43,16 @@ class ProductModel extends BaseModel
             ->paginate(['list_rows'=>10, "query" => $params]);
     }
 
+    public function fetchByStock($params) {
+        $where = [
+            ['erp_product.is_delete', '=', 0]
+        ];
+        return $this->with(['category', 'company'])
+            ->where($where)
+            ->order('create_time','desc')
+            ->paginate(['list_rows'=>10, "query" => $params]);
+    }
+
     public function findProducts($text = null) {
         $or_where = [];
         if(strlen($text) > 0) {