Просмотр исходного кода

分支干扰,暂时把客户管理部分工作与快速入库SP调用部分工作提交

Zhouzhendong 5 лет назад
Родитель
Сommit
de2e41b42d

+ 12 - 0
app/Http/Controllers/CustomerController.php

@@ -18,4 +18,16 @@ class CustomerController extends Controller
         if(!Gate::allows('客户管理-项目-报表')){ return redirect('denied');  }
         return response()->view('customer.project.report');
     }
+
+    public function projectIndex()
+    {
+        if(!Gate::allows('客户管理-项目-查询')){ return redirect('denied');  }
+        return response()->view('customer.project.index');
+    }
+
+    public function projectCreate()
+    {
+        if(!Gate::allows('客户管理-项目-录入')){ return redirect('denied');  }
+        return response()->view('customer.project.create');
+    }
 }

+ 4 - 2
app/Http/Controllers/TestController.php

@@ -469,15 +469,16 @@ class TestController extends Controller
         ini_set('max_execution_time',2500);
         ini_set('memory_limit','1526M');
         //清理冗余条码
-        $this->cleanBarcode();
+        //$this->cleanBarcode();
 
         while(true){
             $toDay = Carbon::now();
             $skus = DB::select(DB::raw('select sku from commodities group by sku,owner_id having count(*)>1 limit 500 '));
             $skus = array_column($skus,'sku');
-            // select * from commodities c where (c.sku) in and owner_id is not null order by c.sku
+
             $commodities = Commodity::query()->with('barcodes')->whereNotNull('owner_id')->whereIn('sku',$skus)->get();
 
+
             if (count($commodities) < 1)return "SUCCESS";
             $commodityMap = [];
             $commodityDel = [];
@@ -511,6 +512,7 @@ class TestController extends Controller
                     $commodityBar[$commodity->sku.'_'.$commodity->owner_id] = $commodity->barcodes ? array_column($commodity->barcodes->toArray(),'code') : [];
                 }
             }
+            dd($commodityMap,$commodityDel,$commodityTag);
             LogService::log(__METHOD__,'清理商品',json_encode($logs,JSON_UNESCAPED_UNICODE));
             LogService::log(__METHOD__,'重新分配商品',json_encode($commodityTag,JSON_UNESCAPED_UNICODE));
 

+ 44 - 24
app/Http/Controllers/api/thirdPart/flux/StoreController.php

@@ -131,7 +131,6 @@ class StoreController extends Controller
     }
 
     public function quickStorage($docno){
-        //$docno = ""; //订单号 非ASN号
         $db = DB::connection('oracle');
         //判断单据有效性
         $cus_bs_asnheader = $db->select(DB::raw("SELECT t.addwho FROM CUS_BS_ASNHEADER t WHERE t.ASNREFERENCE1 = '".$docno."'"));
@@ -165,20 +164,32 @@ class StoreController extends Controller
                     ":In_TotalCubic, :In_TotalGrossWeight, :In_TotalNetWeight, :In_TotalPrice, :In_UserDefine1, :In_UserDefine2,:In_UserDefine3, :In_UserDefine4, :In_UserDefine5, :In_FMLocation,".
                     ":In_TOLocation_C,:In_QC_Type_C, :In_PlanToLoc_C,:In_ReceivingTime, :In_LPN, :In_Operator, :IN_RCVModule, :IN_RCVStation, :In_Language, :In_UserID, :OUT_Return_Code); end;";
                 foreach ($doc_asn_details as $doc_asn_detail){
-                    $result = '';
+                    $IN_Warehouse = $doc_asn_detail->warehouseid ?? '';
                     $In_Process_Action = '3';
+                    $In_ASNNo_C = $doc_asn_detail->docno ?? '';
+                    $In_ASNLineNo_C = $doc_asn_detail->asnlineno ?? '';
                     $In_FMTraceID_C = '';
+                    $In_New_TraceID_C = $doc_asn_detail->new_traceid ?? '';
                     $In_ProductStatus = '00';
                     $In_ProductStatus_Descr = '正常';
                     $In_HoldRejectCode_C = 'OK';
                     $In_HoldRejectReason_C = '正常';
                     $In_PONo_C = '';
+                    $In_CustomerID = $doc_asn_detail->customerid ?? '';
+                    $In_SKU = $doc_asn_detail->sku ?? '';
+                    $In_ReceivedQty = $doc_asn_detail->receivedqty_each ?? '';
                     $In_RejectedQty = '';
                     $In_UOM = 'EA';
+                    $In_PackID = $doc_asn_detail->packid ?? '';
                     $In_ContainerID = '';
+                    $In_LotAtt01_C = $doc_asn_detail->lotatt01 ?? '';
+                    $In_LotAtt02_C = $doc_asn_detail->lotatt02 ?? '';
                     $In_LotAtt03_C = '';
+                    $In_LotAtt04_C = $doc_asn_detail->lotatt04 ?? '';
+                    $In_LotAtt05_C = $doc_asn_detail->lotatt05 ?? '';
                     $In_LotAtt06_C = '';
                     $In_LotAtt07_C = '';
+                    $In_LotAtt08_C = $doc_asn_detail->lotatt08 ?? '';
                     $In_LotAtt09_C = '';
                     $In_LotAtt10_C = '';
                     $In_LotAtt11_C = '';
@@ -187,42 +198,50 @@ class StoreController extends Controller
                     $In_TotalGrossWeight = '0.00';
                     $In_TotalNetWeight = '0.00';
                     $In_TotalPrice = '0.00';
+                    $In_UserDefine1 = $doc_asn_detail->userdefine1 ?? '';
+                    $In_UserDefine2 = $doc_asn_detail->userdefine2 ?? '';
+                    $In_UserDefine3 = $doc_asn_detail->userdefine3 ?? '';
+                    $In_UserDefine4 = $doc_asn_detail->userdefine4 ?? '';
+                    $In_UserDefine5 = $doc_asn_detail->userdefine5 ?? '';
                     $In_FMLocation = 'STAGE'.$doc_asn_detail->warehouseid;
                     $In_TOLocation_C = 'STAGE'.$doc_asn_detail->warehouseid;
                     $In_QC_Type_C = 'OK';
                     $In_PlanToLoc_C = '';
                     $In_ReceivingTime = '';
                     $In_LPN = '*';
+                    $In_Operator = $doc_asn_detail->addwho ?? '';
                     $IN_RCVModule = '';
                     $IN_RCVStation = '';
                     $In_Language = 'cn';
+                    $In_UserID = $doc_asn_detail->addwho ?? '';
+                    $result = '';
                     $stmt = oci_parse($conn, $sql_sp);
-                    oci_bind_by_name($stmt,':IN_Warehouse',$doc_asn_detail->warehouseid);
+                    oci_bind_by_name($stmt,':IN_Warehouse',$IN_Warehouse);
                     oci_bind_by_name($stmt,':In_Process_Action',$In_Process_Action);
-                    oci_bind_by_name($stmt,':In_ASNNo_C',$doc_asn_detail->docno);
-                    oci_bind_by_name($stmt,':In_ASNLineNo_C',$doc_asn_detail->asnlineno);
+                    oci_bind_by_name($stmt,':In_ASNNo_C',$In_ASNNo_C);
+                    oci_bind_by_name($stmt,':In_ASNLineNo_C',$In_ASNLineNo_C);
                     oci_bind_by_name($stmt,':In_FMTraceID_C',$In_FMTraceID_C);
-                    oci_bind_by_name($stmt,':In_New_TraceID_C',$doc_asn_detail->new_traceid);
+                    oci_bind_by_name($stmt,':In_New_TraceID_C',$In_New_TraceID_C);
                     oci_bind_by_name($stmt,':In_ProductStatus',$In_ProductStatus);
                     oci_bind_by_name($stmt,':In_ProductStatus_Descr',$In_ProductStatus_Descr);
                     oci_bind_by_name($stmt,':In_HoldRejectCode_C',$In_HoldRejectCode_C);
                     oci_bind_by_name($stmt,':In_HoldRejectReason_C',$In_HoldRejectReason_C);
                     oci_bind_by_name($stmt,':In_PONo_C',$In_PONo_C);
-                    oci_bind_by_name($stmt,':In_CustomerID',$doc_asn_detail->customerid);
-                    oci_bind_by_name($stmt,':In_SKU',$doc_asn_detail->sku);
-                    oci_bind_by_name($stmt,':In_ReceivedQty',$doc_asn_detail->receivedqty_each);
+                    oci_bind_by_name($stmt,':In_CustomerID',$In_CustomerID);
+                    oci_bind_by_name($stmt,':In_SKU',$In_SKU);
+                    oci_bind_by_name($stmt,':In_ReceivedQty',$In_ReceivedQty);
                     oci_bind_by_name($stmt,':In_RejectedQty',$In_RejectedQty);
                     oci_bind_by_name($stmt,':In_UOM',$In_UOM);
-                    oci_bind_by_name($stmt,':In_PackID',$doc_asn_detail->packid);
+                    oci_bind_by_name($stmt,':In_PackID',$In_PackID);
                     oci_bind_by_name($stmt,':In_ContainerID',$In_ContainerID);
-                    oci_bind_by_name($stmt,':In_LotAtt01_C',$doc_asn_detail->lotatt01);
-                    oci_bind_by_name($stmt,':In_LotAtt02_C',$doc_asn_detail->lotatt02);
+                    oci_bind_by_name($stmt,':In_LotAtt01_C',$In_LotAtt01_C);
+                    oci_bind_by_name($stmt,':In_LotAtt02_C',$In_LotAtt02_C);
                     oci_bind_by_name($stmt,':In_LotAtt03_C',$In_LotAtt03_C);
-                    oci_bind_by_name($stmt,':In_LotAtt04_C',$doc_asn_detail->lotatt04);
-                    oci_bind_by_name($stmt,':In_LotAtt05_C',$doc_asn_detail->lotatt05);
+                    oci_bind_by_name($stmt,':In_LotAtt04_C',$In_LotAtt04_C);
+                    oci_bind_by_name($stmt,':In_LotAtt05_C',$In_LotAtt05_C);
                     oci_bind_by_name($stmt,':In_LotAtt06_C',$In_LotAtt06_C);
                     oci_bind_by_name($stmt,':In_LotAtt07_C',$In_LotAtt07_C);
-                    oci_bind_by_name($stmt,':In_LotAtt08_C',$doc_asn_detail->lotatt08);
+                    oci_bind_by_name($stmt,':In_LotAtt08_C',$In_LotAtt08_C);
                     oci_bind_by_name($stmt,':In_LotAtt09_C',$In_LotAtt09_C);
                     oci_bind_by_name($stmt,':In_LotAtt10_C',$In_LotAtt10_C);
                     oci_bind_by_name($stmt,':In_LotAtt11_C',$In_LotAtt11_C);
@@ -231,25 +250,26 @@ class StoreController extends Controller
                     oci_bind_by_name($stmt,':In_TotalGrossWeight',$In_TotalGrossWeight);
                     oci_bind_by_name($stmt,':In_TotalNetWeight',$In_TotalNetWeight);
                     oci_bind_by_name($stmt,':In_TotalPrice',$In_TotalPrice);
-                    oci_bind_by_name($stmt,':In_UserDefine1',$doc_asn_detail->userdefine1);
-                    oci_bind_by_name($stmt,':In_UserDefine2',$doc_asn_detail->userdefine2);
-                    oci_bind_by_name($stmt,':In_UserDefine3',$doc_asn_detail->userdefine3);
-                    oci_bind_by_name($stmt,':In_UserDefine4',$doc_asn_detail->userdefine4);
-                    oci_bind_by_name($stmt,':In_UserDefine5',$doc_asn_detail->userdefine5);
+                    oci_bind_by_name($stmt,':In_UserDefine1',$In_UserDefine1);
+                    oci_bind_by_name($stmt,':In_UserDefine2',$In_UserDefine2);
+                    oci_bind_by_name($stmt,':In_UserDefine3',$In_UserDefine3);
+                    oci_bind_by_name($stmt,':In_UserDefine4',$In_UserDefine4);
+                    oci_bind_by_name($stmt,':In_UserDefine5',$In_UserDefine5);
                     oci_bind_by_name($stmt,':In_FMLocation',$In_FMLocation);
                     oci_bind_by_name($stmt,':In_TOLocation_C',$In_TOLocation_C);
                     oci_bind_by_name($stmt,':In_QC_Type_C',$In_QC_Type_C);
                     oci_bind_by_name($stmt,':In_PlanToLoc_C',$In_PlanToLoc_C);
                     oci_bind_by_name($stmt,':In_ReceivingTime',$In_ReceivingTime);
                     oci_bind_by_name($stmt,':In_LPN',$In_LPN);
-                    oci_bind_by_name($stmt,':In_Operator',$doc_asn_detail->addwho);
+                    oci_bind_by_name($stmt,':In_Operator',$In_Operator);
                     oci_bind_by_name($stmt,':IN_RCVModule',$IN_RCVModule);
                     oci_bind_by_name($stmt,':IN_RCVStation',$IN_RCVStation);
                     oci_bind_by_name($stmt,':In_Language',$In_Language);
-                    oci_bind_by_name($stmt,':In_UserID',$doc_asn_detail->addwho);
-                    oci_bind_by_name($stmt,':OUT_Return_Code',$result);dd($stmt);
+                    oci_bind_by_name($stmt,':In_UserID',$In_UserID);
+                    oci_bind_by_name($stmt,':OUT_Return_Code',$result);
                     oci_execute($stmt);
-                    if (substr($result,1,3) == '000'){
+                    oci_close($conn);
+                    if (substr($result,0,3) == '000'){
                         $query = DB::raw("update cus_bs_asndetails t set t.rcvflag = 'Y' where t.asnno = ? and t.asnlineno = ?");
                         $db->update($query,[$doc_asn_detail->docno,$doc_asn_detail->asnlineno]);
                     }else{

+ 4 - 2
database/migrations/2020_10_20_143953_create_owner_reports_table.php

@@ -16,8 +16,10 @@ class CreateOwnerReportsTable extends Migration
         Schema::create('owner_reports', function (Blueprint $table) {
             $table->id();
             $table->bigInteger('owner_id')->index()->comment('外键货主');
-            $table->decimal('storage_duration')->nullable()->comment('在库时长');
-
+            $table->date('counting_month')->nullable()->comment('结算月');
+            $table->decimal('daily_average_order_amount',11,2)->nullable()->comment('日均单量');
+            $table->decimal('current_month_counting_area',11,2)->nullable()->comment('当月结算面积');
+            $table->bigInteger('owner_bill_report_id')->nullable()->index()->comment('账单');
             $table->timestamp('created_at');
         });
     }

+ 48 - 0
database/migrations/2020_10_23_112022_add_column_table_owners_relating_customer.php

@@ -0,0 +1,48 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnTableOwnersRelatingCustomer extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('owners', function (Blueprint $table) {
+            $table->bigInteger('customer_id')->nullable()->index()->comment('外键客户');
+            $table->decimal('tax_rate',8,2)->nullable()->comment('税率');
+            $table->string('contract_number')->nullable()->comment('合同号');
+            $table->string('salesman')->nullable()->comment('销售名称');
+            $table->string('linkman')->nullable()->comment('联系人');
+            $table->string('phone_number')->nullable()->comment('联系电话');
+            $table->bigInteger('user_owner_group_id')->nullable()->index()->comment('外键工作组');
+            $table->integer('waring_line_on')->nullable()->comment('月单量预警');
+            $table->string('description')->nullable()->comment('描述');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('owners', function (Blueprint $table) {
+            $table->dropColumn('customer_id');
+            $table->dropColumn('tax_rate');
+            $table->dropColumn('contract_number');
+            $table->dropColumn('salesman');
+            $table->dropColumn('linkman');
+            $table->dropColumn('phone_number');
+            $table->dropColumn('user_owner_group_id');
+            $table->dropColumn('waring_line_on');
+            $table->dropColumn('description');
+        });
+    }
+}

+ 6 - 1
package-lock.json

@@ -1967,6 +1967,11 @@
             "integrity": "sha1-l9nby1qJcvhyLJliSDVDuQfZuew=",
             "dev": true
         },
+        "bootstrap-select": {
+            "version": "1.13.18",
+            "resolved": "https://registry.npm.taobao.org/bootstrap-select/download/bootstrap-select-1.13.18.tgz",
+            "integrity": "sha1-RVcRnVjcEVkYmXcWHIA5YiIOTdo="
+        },
         "brace-expansion": {
             "version": "1.1.11",
             "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz",
@@ -8763,7 +8768,7 @@
         },
         "socket.io-client": {
             "version": "2.3.0",
-            "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsocket.io-client%2Fdownload%2Fsocket.io-client-2.3.0.tgz",
+            "resolved": "https://registry.npm.taobao.org/socket.io-client/download/socket.io-client-2.3.0.tgz",
             "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=",
             "requires": {
                 "backo2": "1.0.2",

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
     "vue-template-compiler": "^2.6.11"
   },
   "dependencies": {
+    "bootstrap-select": "^1.13.18",
     "jquery.cookie": "^1.4.1",
     "js-cookie": "^2.2.1",
     "laravel-echo": "^1.8.0",

+ 516 - 0
public/css/app.css

@@ -67,6 +67,26 @@
   opacity: 0.3;
 }
 
+.bg-light-khaki {
+  background-color: #eac3aa;
+}
+
+.bg-khaki {
+  background-color: #af7651;
+}
+
+.bg-light-info {
+  background-color: RGB(170, 199, 230);
+}
+
+.bg-light-cyanogen {
+  background-color: RGB(170, 234, 210);
+}
+
+.bg-cyanogen {
+  background-color: RGB(170, 220, 205);
+}
+
 .del {
   -webkit-text-decoration-line: line-through;
           text-decoration-line: line-through;
@@ -14270,3 +14290,499 @@ a.text-dark:focus {
   clip: auto;
 }
 
+@-webkit-keyframes bs-notify-fadeOut {
+  0% {
+    opacity: 0.9;
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+@keyframes bs-notify-fadeOut {
+  0% {
+    opacity: 0.9;
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
+
+select.bs-select-hidden,
+.bootstrap-select > select.bs-select-hidden,
+select.selectpicker {
+  display: none !important;
+}
+
+.bootstrap-select {
+  width: 220px \0;
+  /*IE9 and below*/
+  vertical-align: middle;
+}
+
+.bootstrap-select > .dropdown-toggle {
+  position: relative;
+  width: 100%;
+  text-align: right;
+  white-space: nowrap;
+  display: inline-flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.bootstrap-select > .dropdown-toggle:after {
+  margin-top: -1px;
+}
+
+.bootstrap-select > .dropdown-toggle.bs-placeholder,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
+  color: #999;
+}
+
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active {
+  color: rgba(255, 255, 255, 0.5);
+}
+
+.bootstrap-select > select {
+  position: absolute !important;
+  bottom: 0;
+  left: 50%;
+  display: block !important;
+  width: 0.5px !important;
+  height: 100% !important;
+  padding: 0 !important;
+  opacity: 0 !important;
+  border: none;
+  z-index: 0 !important;
+}
+
+.bootstrap-select > select.mobile-device {
+  top: 0;
+  left: 0;
+  display: block !important;
+  width: 100% !important;
+  z-index: 2 !important;
+}
+
+.has-error .bootstrap-select .dropdown-toggle,
+.error .bootstrap-select .dropdown-toggle,
+.bootstrap-select.is-invalid .dropdown-toggle,
+.was-validated .bootstrap-select select:invalid + .dropdown-toggle {
+  border-color: #b94a48;
+}
+
+.bootstrap-select.is-valid .dropdown-toggle,
+.was-validated .bootstrap-select select:valid + .dropdown-toggle {
+  border-color: #28a745;
+}
+
+.bootstrap-select.fit-width {
+  width: auto !important;
+}
+
+.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn) {
+  width: 220px;
+}
+
+.bootstrap-select > select.mobile-device:focus + .dropdown-toggle,
+.bootstrap-select .dropdown-toggle:focus {
+  outline: thin dotted #333333 !important;
+  outline: 5px auto -webkit-focus-ring-color !important;
+  outline-offset: -2px;
+}
+
+.bootstrap-select.form-control {
+  margin-bottom: 0;
+  padding: 0;
+  border: none;
+  height: auto;
+}
+
+:not(.input-group) > .bootstrap-select.form-control:not([class*=col-]) {
+  width: 100%;
+}
+
+.bootstrap-select.form-control.input-group-btn {
+  float: none;
+  z-index: auto;
+}
+
+.form-inline .bootstrap-select,
+.form-inline .bootstrap-select.form-control:not([class*=col-]) {
+  width: auto;
+}
+
+.bootstrap-select:not(.input-group-btn),
+.bootstrap-select[class*=col-] {
+  float: none;
+  display: inline-block;
+  margin-left: 0;
+}
+
+.bootstrap-select.dropdown-menu-right,
+.bootstrap-select[class*=col-].dropdown-menu-right,
+.row .bootstrap-select[class*=col-].dropdown-menu-right {
+  float: right;
+}
+
+.form-inline .bootstrap-select,
+.form-horizontal .bootstrap-select,
+.form-group .bootstrap-select {
+  margin-bottom: 0;
+}
+
+.form-group-lg .bootstrap-select.form-control,
+.form-group-sm .bootstrap-select.form-control {
+  padding: 0;
+}
+
+.form-group-lg .bootstrap-select.form-control .dropdown-toggle,
+.form-group-sm .bootstrap-select.form-control .dropdown-toggle {
+  height: 100%;
+  font-size: inherit;
+  line-height: inherit;
+  border-radius: inherit;
+}
+
+.bootstrap-select.form-control-sm .dropdown-toggle,
+.bootstrap-select.form-control-lg .dropdown-toggle {
+  font-size: inherit;
+  line-height: inherit;
+  border-radius: inherit;
+}
+
+.bootstrap-select.form-control-sm .dropdown-toggle {
+  padding: 0.25rem 0.5rem;
+}
+
+.bootstrap-select.form-control-lg .dropdown-toggle {
+  padding: 0.5rem 1rem;
+}
+
+.form-inline .bootstrap-select .form-control {
+  width: 100%;
+}
+
+.bootstrap-select.disabled,
+.bootstrap-select > .disabled {
+  cursor: not-allowed;
+}
+
+.bootstrap-select.disabled:focus,
+.bootstrap-select > .disabled:focus {
+  outline: none !important;
+}
+
+.bootstrap-select.bs-container {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 0 !important;
+  padding: 0 !important;
+}
+
+.bootstrap-select.bs-container .dropdown-menu {
+  z-index: 1060;
+}
+
+.bootstrap-select .dropdown-toggle .filter-option {
+  position: static;
+  top: 0;
+  left: 0;
+  float: left;
+  height: 100%;
+  width: 100%;
+  text-align: left;
+  overflow: hidden;
+  flex: 0 1 auto;
+}
+
+.bs3.bootstrap-select .dropdown-toggle .filter-option {
+  padding-right: inherit;
+}
+
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option {
+  position: absolute;
+  padding-top: inherit;
+  padding-bottom: inherit;
+  padding-left: inherit;
+  float: none;
+}
+
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner {
+  padding-right: inherit;
+}
+
+.bootstrap-select .dropdown-toggle .filter-option-inner-inner {
+  overflow: hidden;
+}
+
+.bootstrap-select .dropdown-toggle .filter-expand {
+  width: 0 !important;
+  float: left;
+  opacity: 0 !important;
+  overflow: hidden;
+}
+
+.bootstrap-select .dropdown-toggle .caret {
+  position: absolute;
+  top: 50%;
+  right: 12px;
+  margin-top: -2px;
+  vertical-align: middle;
+}
+
+.input-group .bootstrap-select.form-control .dropdown-toggle {
+  border-radius: inherit;
+}
+
+.bootstrap-select[class*=col-] .dropdown-toggle {
+  width: 100%;
+}
+
+.bootstrap-select .dropdown-menu {
+  min-width: 100%;
+  box-sizing: border-box;
+}
+
+.bootstrap-select .dropdown-menu > .inner:focus {
+  outline: none !important;
+}
+
+.bootstrap-select .dropdown-menu.inner {
+  position: static;
+  float: none;
+  border: 0;
+  padding: 0;
+  margin: 0;
+  border-radius: 0;
+  box-shadow: none;
+}
+
+.bootstrap-select .dropdown-menu li {
+  position: relative;
+}
+
+.bootstrap-select .dropdown-menu li.active small {
+  color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.bootstrap-select .dropdown-menu li.disabled a {
+  cursor: not-allowed;
+}
+
+.bootstrap-select .dropdown-menu li a {
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+.bootstrap-select .dropdown-menu li a.opt {
+  position: relative;
+  padding-left: 2.25em;
+}
+
+.bootstrap-select .dropdown-menu li a span.check-mark {
+  display: none;
+}
+
+.bootstrap-select .dropdown-menu li a span.text {
+  display: inline-block;
+}
+
+.bootstrap-select .dropdown-menu li small {
+  padding-left: 0.5em;
+}
+
+.bootstrap-select .dropdown-menu .notify {
+  position: absolute;
+  bottom: 5px;
+  width: 96%;
+  margin: 0 2%;
+  min-height: 26px;
+  padding: 3px 5px;
+  background: whitesmoke;
+  border: 1px solid #e3e3e3;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  pointer-events: none;
+  opacity: 0.9;
+  box-sizing: border-box;
+}
+
+.bootstrap-select .dropdown-menu .notify.fadeOut {
+  -webkit-animation: 300ms linear 750ms forwards bs-notify-fadeOut;
+          animation: 300ms linear 750ms forwards bs-notify-fadeOut;
+}
+
+.bootstrap-select .no-results {
+  padding: 3px;
+  background: #f5f5f5;
+  margin: 0 5px;
+  white-space: nowrap;
+}
+
+.bootstrap-select.fit-width .dropdown-toggle .filter-option {
+  position: static;
+  display: inline;
+  padding: 0;
+}
+
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner {
+  display: inline;
+}
+
+.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before {
+  content: "\A0";
+}
+
+.bootstrap-select.fit-width .dropdown-toggle .caret {
+  position: static;
+  top: auto;
+  margin-top: -1px;
+}
+
+.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark {
+  position: absolute;
+  display: inline-block;
+  right: 15px;
+  top: 5px;
+}
+
+.bootstrap-select.show-tick .dropdown-menu li a span.text {
+  margin-right: 34px;
+}
+
+.bootstrap-select .bs-ok-default:after {
+  content: "";
+  display: block;
+  width: 0.5em;
+  height: 1em;
+  border-style: solid;
+  border-width: 0 0.26em 0.26em 0;
+  transform-style: preserve-3d;
+  transform: rotate(45deg);
+}
+
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle {
+  z-index: 1061;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before {
+  content: "";
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid rgba(204, 204, 204, 0.2);
+  position: absolute;
+  bottom: -4px;
+  left: 9px;
+  display: none;
+}
+
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after {
+  content: "";
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid white;
+  position: absolute;
+  bottom: -4px;
+  left: 10px;
+  display: none;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before {
+  bottom: auto;
+  top: -4px;
+  border-top: 7px solid rgba(204, 204, 204, 0.2);
+  border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after {
+  bottom: auto;
+  top: -4px;
+  border-top: 6px solid white;
+  border-bottom: 0;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before {
+  right: 12px;
+  left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after {
+  right: 13px;
+  left: auto;
+}
+
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after {
+  display: block;
+}
+
+.bs-searchbox,
+.bs-actionsbox,
+.bs-donebutton {
+  padding: 4px 8px;
+}
+
+.bs-actionsbox {
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.bs-actionsbox .btn-group button {
+  width: 50%;
+}
+
+.bs-donebutton {
+  float: left;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.bs-donebutton .btn-group button {
+  width: 100%;
+}
+
+.bs-searchbox + .bs-actionsbox {
+  padding: 0 8px 4px;
+}
+
+.bs-searchbox .form-control {
+  margin-bottom: 0;
+  width: 100%;
+  float: none;
+}
+

Разница между файлами не показана из-за своего большого размера
+ 3252 - 0
public/js/app.js


+ 2 - 0
resources/js/app.js

@@ -8,3 +8,5 @@ window.getGetVal=require('./utilities/getGetVal');
 window.scanner=require('./utilities/scanner');
 window.datetimeRelating=require('./utilities/datetimeRelating');
 
+require('bootstrap-select');
+

+ 16 - 4
resources/js/queryForm/queryForm.js

@@ -168,7 +168,7 @@ const query = function getQueryForm(data) {
         _baseData.condition.forEach(function (conditions, xindex, xarrays) {
             let _width = 0;
             conditions.forEach(function (condition, index, array) {
-                if (['input', 'select', 'dateTime', 'input_select'].includes(condition.type)) {
+                if (['input','dateMonth', 'select', 'dateTime', 'input_select'].includes(condition.type)) {
                     _width += 260;
                 } else if (['dateTime_dateTime','dateTimeLocal', 'input_input'].includes(condition.type)) {
                     _width += 330;
@@ -339,6 +339,7 @@ const query = function getQueryForm(data) {
             || (type === "input_select" && getInputSelect(condition))
             || (type === "dateTime" && getdateTime(condition))
             || (type === "dateTimeLocal" && getDateTimeLocal(condition))
+            || (type === "dateMonth" && getDateMonth(condition))
             || (type === "time" && getTime(condition))
             || (type === "input_input" && getInputInput(condition))
             || (type === "dateTime_dateTime" && getdateTimedateTime(condition))
@@ -347,6 +348,17 @@ const query = function getQueryForm(data) {
             || (type === "checkbox" && getCheckBox(condition));
     }
 
+    // dateMonth
+    function getDateMonth(condition) {
+        let dateMonth = $("<input name = '"+ condition.name +"' type='month' class='form-control form-control-sm' style='vertical-align: middle; max-width: 200px;' placeholder='" + condition.placeholder + "' autocomplete='off' data-toggle='tooltip' >");
+        dateMonth.attr('title', condition.tip === undefined ? '' : condition.tip);
+        dateMonth.bind('input propertychange', function () {
+            let dom = {name: condition.name, type: 'dateMonth', value: this.value, mold: 'dateMonth'};
+            modifyData(dom);
+        });
+        return dateMonth;
+    }
+
     // input
     function getInput(condition) {
         let input = $("<input name='" + condition.name + "' class='form-control form-control-sm' style='vertical-align: middle; max-width: 200px;' placeholder='" + condition.placeholder + "' autocomplete='off' data-toggle='tooltip' data-placement='top' >");
@@ -1068,7 +1080,7 @@ const query = function getQueryForm(data) {
     }
 
     function redenerSearchFormOnData(key, value, mold) {
-        if (mold === 'input' ||mold === 'dateTime' || mold === 'dateTimeLocal') {
+        if (mold === 'input' ||mold === 'dateTime' || mold === 'dateTimeLocal' || mold === 'dateMonth') {
             rendererSearchFormOnInput(key, value, mold);
         } else if (mold === 'select') {
             rendererSearchFormOnSelect(key, value, mold);
@@ -1085,7 +1097,7 @@ const query = function getQueryForm(data) {
     function switchData() {
         _this.condition.forEach(function (conditions) {
             conditions.forEach(function (condition) {
-                if (['input', 'select', 'dateTime','dateTimeLocal', 'search_select', 'time', 'select_multiple_select','checkbox'].includes(condition.type)) {
+                if (['input', 'select', 'dateTime','dateTimeLocal', 'dateMonth', 'search_select', 'time', 'select_multiple_select','checkbox'].includes(condition.type)) {
                     if (!condition.select) {
                         condition.select = '';
                     }
@@ -1183,7 +1195,7 @@ const query = function getQueryForm(data) {
             // }
             _data[key].select = value;
 
-            if (['input', 'dateTime', 'dateTimeLocal'].includes(mold)) {
+            if (['input', 'dateTime', 'dateTimeLocal', 'dateMonth'].includes(mold)) {
                 rendererSearchFormOnInput(key, value, mold);
             } else if (['select'].includes(mold)) {
                 rendererSearchFormOnSelect(key, value, mold);

+ 2 - 0
resources/sass/app.scss

@@ -2,6 +2,7 @@
 @import 'variables';
 @import 'fonts';
 @import 'text';
+@import "color";
 @import 'layout';
 @import 'effect';
 @import 'elements';
@@ -9,3 +10,4 @@
 // Bootstrap
 @import '~bootstrap/scss/bootstrap';
 @import '~font-awesome/scss/font-awesome';
+@import "~bootstrap-select/sass/bootstrap-select";

+ 16 - 0
resources/sass/color.scss

@@ -0,0 +1,16 @@
+
+.bg-light-khaki{
+  background-color:#eac3aa;
+}
+.bg-khaki{
+  background-color:#af7651;
+}
+.bg-light-info{
+  background-color:RGB(170,199,230);
+}
+.bg-light-cyanogen{
+  background-color:RGB(170,234,210);
+}
+.bg-cyanogen{
+  background-color:RGB(170,220,205);
+}

+ 78 - 0
resources/views/customer/project/create.blade.php

@@ -0,0 +1,78 @@
+@extends('layouts.app')
+@section('title')客户管理-项目录入@endsection
+
+@section('content')
+    @component('customer.project.menu')@endcomponent
+    <div class="container-fluid card" id="container">
+        <div class="card-body offset-3">
+            <form method="GET" action="{{url('')}}" class="mt-3">
+                <div class="row">
+                    <label for="code" class="col-2 text-info">项目代码</label>
+                    <input type="text" required id="code" class="form-control form-control-sm col-7"  name="code">
+                </div>
+                <div class="row mt-3">
+                    <label for="name" class="col-2 text-info">项目名称</label>
+                    <input type="text" id="name" class="form-control form-control-sm col-7"  name="name">
+                </div>
+                <div class="row mt-3">
+                    <label for="owner_id" class="col-2">客户</label>
+                    <select id="owner_id" class="form-control form-control-sm col-4"  name="owner_id">
+                        <option> </option>
+                        <option v-for="customer in customers" :value="customer.id">@{{ customer.name }}</option>
+                    </select>
+                </div>
+                <div class="row mt-3">
+                    <label for="workgroup_id" class="col-2">项目小组</label>
+                    <select id="workgroup_id" class="form-control form-control-sm col-4"  name="workgroup_id">
+                        <option> </option>
+                        <option v-for="group in groups" :value="group.id">@{{ group.name }}</option>
+                    </select>
+                </div>
+                <div class="row mt-3">
+                    <label class="col-2" for="type">仓储计费类型</label>
+                    <select id="type" name="type" class="selectpicker" multiple data-live-search="true" title="仓储计费类型(多选)">
+                        <option v-for="t in type" :value="t.id">@{{ t.name }}</option>
+                    </select>
+                </div>
+                <div class="row mt-3">
+                    <label for="tax_rate" class="col-2">税率<span class="badge badge-secondary">%</span></label>
+                    <input type="number" id="tax_rate" class="form-control form-control-sm col-3"  name="tax_rate">
+                </div>
+                <div class="row mt-3">
+                    <label for="contract_number" class="col-2">合同号</label>
+                    <input type="text" id="contract_number" class="form-control form-control-sm col-7"  name="contract_number">
+                </div>
+                <div class="row mt-3">
+                    <label for="salesman" class="col-2">销售名称</label>
+                    <input type="text" id="salesman" class="form-control form-control-sm col-7"  name="salesman">
+                </div>
+                <div class="row mt-3">
+                    <label for="linkman" class="col-2">联系人</label>
+                    <input type="text" id="linkman" class="form-control form-control-sm col-7"  name="linkman">
+                </div>
+                <div class="row mt-3">
+                    <label for="phone_number" class="col-2">联系电话</label>
+                    <input type="text" id="phone_number" class="form-control form-control-sm col-7"  name="phone_number">
+                </div>
+                <div class="row mt-3">
+                    <label for="description" class="col-2">项目描述</label>
+                    <textarea id="description" class="form-control form-control-sm col-7"  name="description"></textarea>
+                </div>
+                <button type="submit" class="btn btn-success mt-3 col-8 offset-1">提交</button>
+            </form>
+        </div>
+    </div>
+@stop
+
+@section('lastScript')
+    <script>
+        new Vue({
+            el:"#container",
+            data:{
+                type : [{name:"常温",id:"1"},{name:"恒温",id:"2"},{name:"冷藏",id:"2"},],
+                customers : [{name:"TEST1",id:"1"},],
+                groups : [{name:'TEST1',id:"1"}],
+            },
+        });
+    </script>
+@stop

+ 94 - 1
resources/views/customer/project/index.blade.php

@@ -1 +1,94 @@
-<?php
+@extends('layouts.app')
+@section('title')客户管理-项目查询@endsection
+
+@section('content')
+    @component('customer.project.menu')@endcomponent
+    <div class="container-fluid" id="container">
+        <div class="mt-1">
+            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                    data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
+                导出Excel
+            </button>
+            <div class="dropdown-menu">
+                <a class="dropdown-item" @click="excelExport(false)" href="javascript:">导出勾选内容</a>
+                <a class="dropdown-item" @click="excelExport(true)" href="javascript:">导出所有页</a>
+            </div>
+        </div>
+        <div>
+            <label for="all" id="cloneCheckAll" class="d-none">
+                <input id="all" type="checkbox" @click="checkAll($event)">全选
+            </label>
+            <table class="d-none" id="headerRoll"></table>
+            <table class="table table-sm text-nowrap table-striped table-hover" id="headerParent">
+                <tr id="header"></tr>
+            </table>
+        </div>
+    </div>
+@endsection
+
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script>
+        let vue = new Vue({
+            el:"#container",
+            data:{
+                owners : [],
+                checkData : [],
+            },
+            mounted(){
+                let column = [
+                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
+                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                    {name:'operating',value: '操作', neglect: true},
+                    {name:'customer',value: '客户'},
+                    {name:'tax_rate',value: '税率', neglect: true},
+                    {name:'name',value: '项目'},
+                    {name:'code',value: '货主代码'},
+                    {name:'contract_number',value: '合同号'},
+                    {name:'created_at',value: '创建日期'},
+                    {name:'salesman',value: '销售名称'},
+                    {name:'customer_full_name',value: '公司全称'},
+                    {name:'linkman',value: '联系人'},
+                    {name:'phone_number',value: '联系电话'},
+                    {name:'workgroup',value: '项目小组'},
+                    {name:'relating_price',value: '关联报价', neglect: true},
+                    {name:'type',value: '用仓类型'},
+                    {name:'current_month_counting_area',value: '当月结算面积', neglect: true},
+                    {name:'waring_line_on',value: '月单量预警', neglect: true},
+                    {name:'is_activating',value: '是否激活', neglect: true},
+                    {name:'description',value: '项目描述'},
+                ];
+                let _this=this;
+                setTimeout(function () {
+                    let header = new Header({
+                        el: "#header",
+                        column: column,
+                        data: _this.owners,
+                        restorationColumn: 'id',
+                        fixedTop:($('#form_div').height())+2,
+                        offset:0.5,
+                        vue:vue
+                    });
+                    header.init();
+                },0);
+            },
+            methods:{
+                excelExport(isAll){
+
+                },
+                //全选事件
+                checkAll(e){
+                    if (e.target.checked){
+                        this.owners.forEach((el)=>{
+                            if (this.checkData.indexOf(el.id) === '-1'){
+                                this.checkData.push(el.id);
+                            }
+                        });
+                    }else {
+                        this.checkData = [];
+                    }
+                },
+            },
+        });
+    </script>
+@endsection

+ 8 - 0
resources/views/customer/project/menu.blade.php

@@ -8,6 +8,14 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('customer/project/report')}}" :class="{active:isActive('report',3)}">报表</a>
                 </li> @endcan
+                @can('客户管理-项目-查询')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('customer/project/index')}}" :class="{active:isActive('index',3)}">查询</a>
+                </li> @endcan
+                @can('客户管理-项目-查询')
+                <li class="nav-item">
+                    <a class="nav-link" href="{{url('customer/project/create')}}" :class="{active:isActive('create',3)}">录入</a>
+                </li> @endcan
             </ul>
         </div>
     </div>

+ 115 - 1
resources/views/customer/project/report.blade.php

@@ -1,7 +1,121 @@
 @extends('layouts.app')
 @section('title')
-    称重管理-项目-报表
+    称重管理-项目报表
 @endsection
 @section('content')
     @component('customer.project.menu')@endcomponent
+    <div class="container-fluid card" id="container">
+        <div id="form_div"></div>
+        <div>
+            <button type="button" class="btn btn-outline-dark btn-sm form-control-sm dropdown-toggle tooltipTarget" :class="[checkData.length>0?'btn-dark text-light':'']"
+                    data-toggle="dropdown" title="导出所有页将会以搜索条件得到的筛选结果,将其全部记录(每一页)导出">
+                        导出Excel
+            </button>
+            <div class="dropdown-menu">
+                <a class="dropdown-item" @click="reportExport(false)" href="javascript:">导出勾选内容</a>
+                <a class="dropdown-item" @click="reportExport(true)" href="javascript:">导出所有页</a>
+            </div>
+        </div>
+        <div>
+            <label for="all" id="cloneCheckAll" class="d-none">
+                <input id="all" type="checkbox" @click="checkAll($event)">全选
+            </label>
+            <table class="d-none" id="headerRoll"></table>
+            <table class="table table-sm table-striped table-hover" id="headerParent">
+                <tr class="text-center">
+                    <td colspan="2"></td>
+                    <td colspan="7" class="bg-light-khaki">客户信息</td>
+                    <td colspan="4" class="bg-light-info">盘点信息</td>
+                    <td colspan="3" class="bg-light-cyanogen">账单信息</td>
+                </tr>
+                <tr class="text-nowrap" id="header"></tr>
+            </table>
+        </div>
+    </div>
+@stop
+
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+    <script>
+        let vue = new Vue({
+            el:"#container",
+            data:{
+                reports : [],
+                owners : [],
+                workgroup : [],
+                customers : [],
+                status : [],
+                checkData : [],
+            },
+            mounted(){
+                let data=[
+                    [
+                        {name:'workgroup',type:'select',tip:'项目小组',placeholder: '项目小组',data:this.workgroup},
+                        {name:'counting_month_start',type:'dateMonth',tip:'起始结算月'},
+                        {name:'owner_id',type:'select_multiple_select',tip:['输入关键词快速定位下拉列表,回车确定','选择要显示的项目'],
+                            placeholder:['项目','定位或多选项目'],data:this.owners},
+                    ],[
+                        {name:'customer_id',type:'select',tip:'客户',placeholder: '客户',data:this.customers},
+                        {name:'counting_month_end',type:'dateMonth',tip:'结束结算月'},
+                        {name:'status',type:'select',placeholder:'状态',data:this.status},
+                    ],
+                ];
+                this.form = new query({
+                    el:"#form_div",
+                    condition:data,
+                });
+                this.form.init();
+                let column = [
+                    {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
+                        dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
+                    {name:'operating',value: '操作', neglect: true},
+                    {name:'index',value: '序号', neglect: true ,class:"bg-khaki"},
+                    {name:'workgroup',value: '项目小组',class:"bg-khaki"},
+                    {name:'customer',value: '客户',class:"bg-khaki"},
+                    {name:'owner',value: '子项目',class:"bg-khaki"},
+                    {name:'status',value: '状态',class:"bg-khaki"},
+                    {name:'created_at',value: '创建日期',class:"bg-khaki"},
+                    {name:'storage_duration',value: '在库时长',class:"bg-khaki"},
+                    {name:'counting_month',value: '结算月', class:"bg-info"},
+                    {name:'daily_average_order_amount',value: '日均单量', neglect: true, class:"bg-info"},
+                    {name:'last_month_counting_area',value: '上月盘点面积', neglect: true, class:"bg-info"},
+                    {name:'current_month_counting_area',value: '本月盘点面积', neglect: true, class:"bg-info"},
+                    {name:'init_bill_amount',value: '初始账单金额', neglect: true, class:"bg-cyanogen"},
+                    {name:'confirm_bill_amount',value: '确认账单金额', neglect: true, class:"bg-cyanogen"},
+                    {name:'confirm_created_at',value: '确认日期', class:"bg-cyanogen"},
+                ];
+                let _this=this;
+                setTimeout(function () {
+                    let header = new Header({
+                        el: "#header",
+                        column: column,
+                        data: _this.reports,
+                        restorationColumn: 'id',
+                        fixedTop:($('#form_div').height())+2,
+                        offset:0.5,
+                        vue:vue
+                    });
+                    header.init();
+                },0);
+            },
+            methods : {
+                reportExport(isAll){
+
+                },
+                //全选事件
+                checkAll(e){
+                    if (e.target.checked){
+                        this.reports.forEach((el)=>{
+                            if (this.checkData.indexOf(el.id) === '-1'){
+                                this.checkData.push(el.id);
+                            }
+                        });
+                    }else {
+                        this.checkData = [];
+                    }
+                },
+            }
+        });
+    </script>
 @stop

+ 2 - 0
routes/web.php

@@ -461,6 +461,8 @@ Route::group(['prefix'=>'customer'],function(){
     /** 项目 */
     Route::group(['prefix'=>'project'],function(){
         Route::get('report','CustomerController@projectReport');
+        Route::get('index','CustomerController@projectIndex');
+        Route::get('create','CustomerController@projectCreate');
     });
     Route::get('relating',function (){return view('customer.relating');});
 });

Некоторые файлы не были показаны из-за большого количества измененных файлов