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

二次加工管理录入和修改时,成品单据可以外部导入,导入界面加上手工输入事件的空格转制表符方法。(需要提示空格为字段分隔符)
退货管理rejectedbill中username自定义必性添加user的外表关系以及修改实现为直接访问,取消不必要的时间复杂度

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

+ 9 - 4
app/Http/Controllers/OrderController.php

@@ -11,6 +11,7 @@ use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
+use Illuminate\Support\Facades\Http;
 use Maatwebsite\Excel\Facades\Excel;
 
 class OrderController extends Controller
@@ -177,6 +178,10 @@ class OrderController extends Controller
         $orders=DB::connection('oracle')->select(DB::raw($sql));
         $commodities=[];
         $picktotraceids=[];
+        /*
+         * 第二种扁平化方式(节省空间): 使用快慢指针,因拿到数据正常为顺序数据,自下标1开始与上一条对比orderno唯一标识,不同则更新慢指针下标,
+         *  相同则为指定下标map类型数组追加一个键值对属性来记录同类数量,如N条,每次追加属性时先看属性是否存在,存在+1
+         * */
         foreach ($orders as $index=>$order){
             if ($order->picktotraceid){
                 if (array_key_exists($order->orderno,$picktotraceids)){
@@ -200,7 +205,7 @@ class OrderController extends Controller
         $orders = new Collection($orders);
         $commodities=new Collection($commodities);
         if ($checkData || $export)return $this->export($orders,$commodities);
-        $customers=OracleBasCustomer::select('customerid','descr_c')->where('customer_type','OW')->where('active_flag','Y')->get();
+        $customers=OracleBasCustomer::query()->select('customerid','descr_c')->where('customer_type','OW')->where('active_flag','Y')->get();
         $request=$request->input();
         $codes=DB::connection('oracle')->table('BAS_CODES')->select('code','codename_c')->where('codeid','SO_STS')->orderBy('code','asc')->get();
         return view('order/index/delivering',compact('orders','customers','request','codes','commodities','page','picktotraceids'));
@@ -210,15 +215,15 @@ class OrderController extends Controller
         if(!Gate::allows('订单管理-批量备注')){ return redirect(url('/'));  }
         $checkData=$request->input('checkData');
         $content=$request->input('content');
-        $ordersNotNull=OracleDOCOrderHeader::select('OrderNo','Notes')->whereIn('orderno',$checkData)
+        $ordersNotNull=OracleDOCOrderHeader::query()->select('OrderNo','Notes')->whereIn('orderno',$checkData)
             ->whereNotNull('notes')->get();
-        OracleDOCOrderHeader::select('OrderNo','Notes')->whereIn('orderno',$checkData)
+        OracleDOCOrderHeader::query()->select('OrderNo','Notes')->whereIn('orderno',$checkData)
             ->whereNull('notes')->update(['notes'=>$content]);
         $ordersNotNullArr=array_column($ordersNotNull->toArray(),'orderno');
         $ordersNullArr=array_diff($checkData,$ordersNotNullArr);
         $data=[];
         foreach ($ordersNotNull as $order){
-            OracleDOCOrderHeader::where('orderno',$order->orderno)->update(["notes"=>($order->notes).",".$content]);
+            OracleDOCOrderHeader::query()->where('orderno',$order->orderno)->update(["notes"=>($order->notes).",".$content]);
             $this->log(__METHOD__,'批量备注追加修改'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             $order->notes=($order->notes).",".$content;
             array_push($data,$order);

+ 6 - 6
app/Http/Controllers/ProcessController.php

@@ -988,7 +988,7 @@ class ProcessController extends Controller
                     }
                     if (!$commodity[$index])array_push($errors[$head],"货主为空");
                 }
-                if ($row == '单据'){
+                if ($row == '单据'){
                     $wmsCode = $commodity[$index] ?? '';
                 }
                 if ($row == 'SKU'){
@@ -1015,7 +1015,7 @@ class ProcessController extends Controller
                 if (!$str) throw new \Exception('未找到货主!');
                 $owner=Owner::query()->where('code',$str)->orWhere('name',$str)->first();
                 if (!$owner){
-                    $owner = Owner::create([
+                    $owner = Owner::query()->create([
                         'code' => $str,
                         'name' => $str
                     ]);
@@ -1025,8 +1025,8 @@ class ProcessController extends Controller
             $commodity = Commodity::query()->with('barcodes')->whereNull('owner_id')
                 ->where('sku',$commodityData['sku'])->first();
             if (!$commodity){
-                $commodity = Commodity::create($commodityData);
-                $commodityBarCode=CommodityBarcode::create([
+                $commodity = Commodity::query()->create($commodityData);
+                $commodityBarCode=CommodityBarcode::query()->create([
                     'code' => $barcode,
                     'commodity_id' => $commodity->id
                 ]);
@@ -1036,7 +1036,7 @@ class ProcessController extends Controller
                 json_encode($commodity)." || ".json_encode($commodity_barcodes),Auth::user()['id']);
             $processContent=['bill_type'=>'入库单','commodity_id'=>$commodity->id,'wms_code'=>$wmsCode,'amount'=>$amount,
                 'commodity_name'=>$commodity->name,'commodity_barcodes'=>$commodity_barcodes,'commodity_sku'=>$commodity->sku,
-                'lineNo'=>1,'owner_id'=>$owner->id,'owner_name'=>$owner->name,'addBtnShow'=>false,'type'=>false];
+                'lineNo'=>1,'owner_id'=>$owner->id,'owner_name'=>$owner->name,'addBtnShow'=>false,'type'=>$request->type];
             array_push($processContents,$processContent);
         }
         return ['success'=>true,'data'=>$processContents,'errors'=>count($errors)>0?$errors:''];
@@ -1132,7 +1132,7 @@ class ProcessController extends Controller
         $validator=Validator::make($processContent,[
             'commodity_id'=>['required','integer'],
             'bill_type'=>['required'],
-            'amount'=>['required','min:0','max:999999','integer']
+            'amount'=>['required','integer']
         ],[
             'required'=>':attribute 不应为空',
             'min'=>':attribute 不得为0或为负',

+ 10 - 0
app/Providers/AppServiceProvider.php

@@ -40,5 +40,15 @@ class AppServiceProvider extends ServiceProvider
             return preg_match('/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/', $value);
         });
         View::share('pageUuid',Uuid::uuid4());
+
+        \Illuminate\Database\Query\Builder::macro('sql', function () {
+            $bindings = $this->getBindings();
+            $sql = str_replace('?','%s',$this->toSql());
+            return vsprintf($sql, $bindings);
+        });
+
+        \Illuminate\Database\Eloquent\Builder::macro('sql', function(){
+            return ($this->getQuery()->sql());
+        });
     }
 }

+ 4 - 3
app/RejectedBill.php

@@ -36,6 +36,9 @@ class RejectedBill extends Model
     function items(){
         return $this->hasMany('App\RejectedBillItem','id_rejected_bill','id');
     }
+    function user(){
+        return $this->hasOne('App\User','id','id_operator');
+    }
     function rejectedBillItems(){
         return $this->items();
     }
@@ -112,9 +115,7 @@ class RejectedBill extends Model
         return $amount;
     }
     public function getOperatorNameAttribute(){
-        if(!$this['id_operator']){return '';}
-        $user=User::find($this['id_operator']);
-        return $user['name'];
+        return $this['user'] ? $this['user']['name'] : null;
     }
     public function getIsLoadedNullAttribute(){
         if($this['is_loaded']===null) return 'null';

+ 20 - 0
app/Services/WaybillService.php

@@ -46,6 +46,26 @@ Class WaybillService
         return $waybills->get();
     }
 
+    public function getSql(Request $request){
+        $waybills = $this->conditionQuery($request);
+        return $waybills->leftJoin('owners','owners.id','=','waybills.owner_id')->selectRaw('owners.name owner_name')
+            ->leftJoin('units as warehouse_weight_unit','warehouse_weight_unit.id','=','waybills.warehouse_weight_unit_id')
+                ->selectRaw('warehouse_weight_unit.name warehouse_weight_unit_name')
+            ->leftJoin('units as warehouse_weight_unit_other','warehouse_weight_unit_other.id','=','waybills.warehouse_weight_unit_id_other')
+                ->selectRaw('warehouse_weight_unit_other.name warehouse_weight_unit_other_name')
+            ->leftJoin('units as carrier_weight_unit','carrier_weight_unit.id','=','waybills.carrier_weight_unit_id')
+                ->selectRaw('carrier_weight_unit.name carrier_weight_unit_name')
+            ->leftJoin('units as carrier_weight_unit_other','carrier_weight_unit_other.id','=','waybills.carrier_weight_unit_id_other')
+                ->selectRaw('carrier_weight_unit_other.name carrier_weight_unit_other_name')
+            ->leftJoin('car_types','car_types.id','=','waybills.carType_id')
+                ->selectRaw('car_types.name car_type_name')
+            ->leftJoin('units as amount_unit','amount_unit.id','=','waybills.amount_unit_id')
+                ->selectRaw('amount_unit.name amount_unit_name')
+            ->leftJoin('carriers','carriers.id','=','waybills.carrier_id')
+                ->selectRaw('carriers.name carrier_name')
+            ->sql();
+    }
+
     public function some(Request $request){
         return $waybills = Waybill::filterAuthorities()->with(['owner'])->selectRaw('waybills.* ,waybill_on_tops.id top_id ,waybill_on_tops.remark,waybill_on_tops.updated_at top_update')
             ->leftJoin('waybill_on_tops','waybill_on_tops.waybill_id','=','waybills.id')

+ 32 - 0
database/migrations/2020_08_25_094642_change_rejected_bills_add_id_operator_index.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeRejectedBillsAddIdOperatorIndex extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('rejected_bills', function (Blueprint $table) {
+            $table->bigInteger('id_operator')->index("rejected_bills_id_operator_index")->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('rejected_bills', function (Blueprint $table) {
+            $table->dropIndex('rejected_bills_id_operator_index');
+        });
+    }
+}

+ 25 - 7
resources/views/process/create.blade.php

@@ -30,8 +30,8 @@
                                         :data-content="popoverContent" data-html="true">
                                     部分数据导入失败
                                 </button>
-                                <textarea class="w-100" style="height: 400px;" v-model="pasteData"
-                                placeholder="内容必须为EXCEL复制,请注意表头顺序,可拖拽表头字段调整顺序,以该顺序为准"
+                                <textarea class="w-100" style="height: 400px;" id="pasteDataText" v-model="pasteData" @keydown.tab="forbidTab($event)" @keyup.tab="replaceSpacing()"
+                                placeholder="内容可为EXCEL复制,也可手动输入使用“TAB”缩进符区分列,请注意表头顺序,可拖拽表头字段调整顺序,以该顺序为准"
                                 ></textarea>
                             </div>
                             <div class="modal-footer">
@@ -139,8 +139,10 @@
                     <div class="col-6 rounded mb-2 border" style="background: #ccd7dc;">
                         <div class="form-group row mt-2">
                             <label class="col-2 text-right mt-2">成品单据</label>
-                            <input class="form-control col-7" v-model="process.wms_code_full">&nbsp;&nbsp;&nbsp;
+                            <input class="form-control col-6" v-model="process.wms_code_full">&nbsp;&nbsp;&nbsp;
                             <button class="btn btn-info btn-sm col-2"  type="button" @click="addProcessContent(true)"> 新增库单据</button>
+                            <button class="btn btn-sm btn-dark col-1 ml-1"
+                                    @click="showPasteDataModal(true)"><small>外部导入</small></button>
                         </div>
                         <div class="form-group row">
                             <div class="col-10 offset-1 pl-0 pt-2 border rounded bg-light">
@@ -325,6 +327,7 @@
                 is_delBtn:[],
                 sum:0,
                 pasteData:'',
+                pasteDataType:false,
                 rows:['货主','单据号','品名','SKU','条码','数量'],
                 popoverContent:'',
                 is_hide:false,
@@ -574,7 +577,6 @@
                         tempTip.show('请确认您信息输入的完整性!');
                         return;
                     }
-                    _this.processContentError=[];
                     let then = function (response) {
                         if (response.data.error && response.data.data=="process"){
                             _this.error=response.data.error;
@@ -582,7 +584,15 @@
                         }
                         _this.error={wms_code:[],owner_id:[],process_method_id:[],unit_price:[],amount:[]};
                         if (response.data.error){
-                            _this.processContentError=response.data.error;
+                            let err="<small class='text-center text-danger'>部分单据内容错误:<br>";
+                            for (let key in response.data.error){
+                                let obj=response.data.error[key];
+                                for (let k in obj) {
+                                    err += key+':'+obj[k][0]+"<br>";
+                                }
+                            }
+                            err += "</small>";
+                            tempTip.confirm(err);
                             return;
                         }
                         if(response.data.success==false){
@@ -689,17 +699,19 @@
                     if (_this.processContents[(_this.processContents.length)-1].addBtnShow)
                         _this.$delete(_this.processContents,(_this.processContents.length)-1);
                 },
-                showPasteDataModal(){
+                showPasteDataModal(type = false){
+                    this.pasteDataType = type;
                     $("#popover").attr('hidden','hidden');
                     $('#pasteData').modal('show');
                 },
+                //外部导入
                 importPasteData(){
                     let _this=this;
                     if (!this.pasteData){
                         tempTip.setDuration(3000);
                         tempTip.show('文本为空!');
                     }
-                    axios.post('{{url('process/importPasteData')}}',{data:this.pasteData,rows:this.rows})
+                    axios.post('{{url('process/importPasteData')}}',{data:this.pasteData,rows:this.rows,type:this.pasteDataType})
                         .then(res=>{
                             if (res.data.success){
                                 let sum=0;
@@ -748,6 +760,12 @@
                         this.$set(this.rows,index,this.rows[e.dataTransfer.getData('text/html')]);
                         this.$set(this.rows,Number(e.dataTransfer.getData('text/html')),temp);
                     }
+                },
+                replaceSpacing(){
+                    this.pasteData += "\t";
+                },
+                forbidTab(e){
+                    e.preventDefault();
                 }
             },
         });