Procházet zdrojové kódy

Merge branch 'Haozi'

LD před 5 roky
rodič
revize
42ce3d321f
35 změnil soubory, kde provedl 1091 přidání a 71 odebrání
  1. 68 0
      app/Console/Commands/WasSyncWmsAsnInformation.php
  2. 14 0
      app/Http/Controllers/InventoryAccountController.php
  3. 2 0
      app/Http/Controllers/RejectedController.php
  4. 3 0
      app/Http/Controllers/StoreController.php
  5. 10 4
      app/InventoryAccount.php
  6. 14 0
      app/OracleDOCASNDetail.php
  7. 20 0
      app/OracleDOCASNHeader.php
  8. 2 1
      app/Providers/AppServiceProvider.php
  9. 1 1
      app/Services/InventoryAccountService.php
  10. 3 4
      app/Services/OracleDocAsnDetailService.php
  11. 34 0
      app/Services/OracleDocAsnHerderService.php
  12. 1 1
      app/Services/OwnerService.php
  13. 3 0
      app/Services/RejectedBillService.php
  14. 213 4
      app/Services/StoreItemService.php
  15. 156 5
      app/Services/StoreService.php
  16. 47 2
      app/Services/WarehouseService.php
  17. 0 1
      app/StoreItems.php
  18. 4 0
      config/sync.php
  19. 33 0
      database/migrations/2020_11_03_114135_change_store_status_column.php
  20. 33 0
      database/migrations/2020_11_03_114310_change_store_stored_method_column.php
  21. 33 0
      database/migrations/2020_11_03_180029_change_store_items_status_column.php
  22. 32 0
      database/migrations/2020_11_09_133723_add_auditor_to_inventory__accounts.php
  23. 29 0
      database/migrations/2020_11_09_134301_add_inventory_account_authorities.php
  24. 3 2
      package-lock.json
  25. 3 0
      phpunit.xml
  26. 4 8
      public/t.php
  27. 57 34
      resources/views/inventory/stockInventory/mission.blade.php
  28. 2 1
      routes/web.php
  29. 37 0
      tests/Services/OracleDocAsnHeaderService/getWmsAsnOnStartDateCreateOrEditTest.php
  30. 31 0
      tests/Services/StoreService/AsnSyncTest.php
  31. 45 0
      tests/Services/StoreService/CreateStoreTest.php
  32. 59 0
      tests/Services/StoreService/GetParamsByAsnHeaderTest.php
  33. 53 0
      tests/Services/StoreService/InsertStoreTest.php
  34. 42 0
      tests/Services/StoreService/UpdateStoreTest.php
  35. 0 3
      tests/haozi.http

+ 68 - 0
app/Console/Commands/WasSyncWmsAsnInformation.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Services\LogService;
+use App\Services\OrderTrackingService;
+use App\Services\StoreService;
+use Illuminate\Console\Command;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Auth;
+
+class WasSyncWmsAsnInformation extends Command
+{
+
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'WasSyncWmsAsnInformation';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '同步WMS的入库信息';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $this->WasSyncWmsAsn();
+    }
+
+    public function WasSyncWmsAsn(){
+
+        /** @var StoreService $storeService */
+        $storeService  = app('storeService');
+
+        $dataInterval = intval(data_get(config('sync'), 'asn_sync.interval')) * 60 + 5;
+
+        $startDate = Carbon::now()->subSeconds($dataInterval);
+
+        $syncStartDate = data_get(config('sync'), 'asn_sync.start_at');
+
+        if($syncStartDate ?? false){
+            $syncStartDate = Carbon::parse($syncStartDate);
+            if ($startDate->lt($syncStartDate)) {
+                $startDate = $syncStartDate;
+            }
+        }
+        //$storeService->syncWmsAsnData($startDate);
+    }
+}

+ 14 - 0
app/Http/Controllers/InventoryAccountController.php

@@ -45,6 +45,20 @@ class InventoryAccountController extends Controller
         $inventoryAccount=InventoryAccount::where('id',$id)->delete();
         return ['success'=>true,'data'=>$inventoryAccount];
     }
+    public function inventoryChecked(Request $request){
+        if(!Gate::allows('库存管理-盘点-项目审核')){return['success'=>false,'msg'=>'没有权限'];}
+        $id=$request->id;
+        if(is_null($id)){return ['success'=>false,'msg'=>'传入id为空'];}
+        $inventoryAccount=InventoryAccount::query()->where('id',$id)->update([
+            'auditor'=>Auth::user()['id'],
+        ]);
+        if ($inventoryAccount==1) {
+            $inventoryAccount=InventoryAccount::query()->with('userAuditor')->find($id);
+            return ['success'=>true,'data'=>$inventoryAccount];
+        }else{
+            return ['success'=>false,'msg'=>'审核失败!'];
+        }
+    }
 
     //盘点-任务页面
     public function mission(Request $request,OwnerService $ownerService){

+ 2 - 0
app/Http/Controllers/RejectedController.php

@@ -10,9 +10,11 @@ use App\Rejected;
 use App\RejectedAnalyzeOwner;
 use App\RejectedBill;
 use App\Services\LogisticService;
+use App\Services\OracleDocAsnHerderService;
 use App\Services\OwnerService;
 use App\Services\QualityLabelService;
 use App\Services\RejectedService;
+use App\Services\StoreService;
 use Carbon\Carbon;
 use Exception;
 use Illuminate\Contracts\Foundation\Application;

+ 3 - 0
app/Http/Controllers/StoreController.php

@@ -5,6 +5,9 @@ namespace App\Http\Controllers;
 use App\Depository;
 use App\Owner;
 use App\Services\LogService;
+use App\Services\OracleDocAsnDetailService;
+use App\Services\OracleDocAsnHerderService;
+use App\Services\StoreService;
 use App\Store;
 use App\StoreItems;
 use App\Warehouse;

+ 10 - 4
app/InventoryAccount.php

@@ -12,10 +12,10 @@ class InventoryAccount extends Model
     use ModelTimeFormat;
     use SoftDeletes;
     protected $fillable=[
-        'id','owner_id','type', 'start_at', 'end_at','total','processed','difference','returned','deleted_at','created_at','status','remark',
+        'id','owner_id','type', 'start_at', 'end_at','total','processed','difference','returned','deleted_at','created_at','status','remark','auditor'
     ];
     protected $appends = [
-            'surplus','check_surplus'
+            'surplus','check_surplus','ignored'
     ];
     public function creator(){
         return $this->hasOne('App\Sign','signable_id','id')
@@ -24,16 +24,22 @@ class InventoryAccount extends Model
     public function owner(){
         return $this->belongsTo('App\Owner','owner_id','id');
     }
+    public function userAuditor(){
+        return $this->belongsTo('App\User','auditor','id');
+    }
     public function inventoryMissions(){
         return $this->belongsTo('App\InventoryAccountMission','id','inventory_account_id');
     }
 
     public function getSurplusAttribute()
     {
-        return $this['total'] ? $this['total']-$this['processed']:0;
+        return $this['total'] ? $this['total']-$this['processed']-$this['ignored']:0;
     }
     public function getProcessedAmount(){
-        return $this->inventoryMissions()->whereIn('checked',['是','跳过','确认差异','已复核'])->where('inventory_account_id',$this['id'])->count();
+        return $this->inventoryMissions()->whereIn('checked',['是','确认差异','已复核'])->where('inventory_account_id',$this['id'])->count();
+    }
+    public function getIgnoredAttribute(){
+        return $this->inventoryMissions()->where('checked','跳过')->where('inventory_account_id',$this['id'])->count();
     }
     //复盘剩余数
     public function getCheckSurplusAttribute()

+ 14 - 0
app/OracleDOCASNDetail.php

@@ -17,4 +17,18 @@ class OracleDOCASNDetail extends Model
     public function oracleDocAsnHeader(){
         return $this->belongsTo('App\OracleDOCASNHeader','asnno','asnno');
     }
+    public function lineStatus()
+    {
+        return $this->hasOne(OracleBasCode::class,'code','linestatus')
+            ->where('codeid','ASN_STS');
+    }
+    public function qualityStatus()
+    {
+        return $this->hasOne(OracleBasCode::class,'code','lotatt08')
+            ->where('codeid','QLT_STS');
+    }
+    public function basSku()
+    {
+        return $this->hasOne(OracleBasSKU::class,'sku','sku');
+    }
 }

+ 20 - 0
app/OracleDOCASNHeader.php

@@ -10,4 +10,24 @@ class OracleDOCASNHeader extends Model
     use ModelTimeFormat;
     protected $connection="oracle";
     protected $table="Doc_ASN_Header";
+
+    public function asnType()
+    {
+        return $this->hasOne(OracleBasCode::class,'code','asntype')
+            ->where('codeid','ASN_TYP');
+    }
+
+    public function asnStatus()
+    {
+        return $this->hasOne(OracleBasCode::class,'code','asnstatus')
+            ->where('codeid','ASN_STS');
+    }
+
+    public function asnDetails()
+    {
+        return $this->hasMany(OracleDOCASNDetail::class,'asnno','asnno')
+            ->select('asnno','asnlineno','customerid','sku','skudescrc','linestatus','lotatt08','lotatt05','expectedqty','addtime','edittime');
+    }
+
+
 }

+ 2 - 1
app/Providers/AppServiceProvider.php

@@ -19,6 +19,7 @@ use App\Services\OracleBasCustomerService;
 use App\Services\OracleBasSkuService;
 use App\Services\OracleDocAsnDetailService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OracleDocAsnHerderService;
 use App\Services\OrderIssuePerformanceService;
 use App\Services\AllInventoryService;
 use App\Services\InventoryDailyLogService;
@@ -71,7 +72,7 @@ class AppServiceProvider extends ServiceProvider
     {
         //
         app()->singleton('OrderIssuePerformanceService',OrderIssuePerformanceService::class);
-        app()->singleton('InventoryCompareService',InventoryCompareService::class);
+        app()->singleton('inventoryCompareService',InventoryCompareService::class);
     }
 
     /**

+ 1 - 1
app/Services/InventoryAccountService.php

@@ -424,7 +424,7 @@ class InventoryAccountService
         $inventoryAccountMission->difference_amount=$count;//盘点差异
         $inventoryAccountMission->checked='是';
         $inventoryAccountMission->save();
-        Controller::logS(__METHOD__,"".__FUNCTION__,json_encode($inventoryId));
+        Controller::logS(__METHOD__,"增加系统之外的盘点记录".__FUNCTION__,json_encode($inventoryAccountMission));
         if ($inventoryAccountMission){
             $inventoryAccountMission->createSignStockInventoryPersons();
             Controller::logS(__METHOD__,"增加盘点人".__FUNCTION__,json_encode($inventoryId));

+ 3 - 4
app/Services/OracleDocAsnDetailService.php

@@ -1,6 +1,6 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
 use App\OracleDOCASNDetail;
 
@@ -36,5 +36,4 @@ Class OracleDocAsnDetailService
         }
         return $query->get();
     }
-
-}
+}

+ 34 - 0
app/Services/OracleDocAsnHerderService.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleDOCASNHeader;
+
+Class OracleDocAsnHerderService
+{
+    public function getWmsAsnOnStartDateCreate($startDate)
+    {
+        if (!$startDate) return null;
+        return OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
+            ->where('addTime', '>=', $startDate)
+            ->get();
+    }
+
+    public function getWmsAsnOnStartDateEdit($startDate)
+    {
+        if (!$startDate) return null;
+        return OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->select('asnno','asnstatus','asntype','addtime','edittime','customerid','notes','warehouseid','asnreference3')
+            ->where('EditTime', '>=', $startDate)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->get();
+    }
+
+}

+ 1 - 1
app/Services/OwnerService.php

@@ -108,7 +108,7 @@ Class OwnerService
         if($owners->count() < count($customerIds)){
             $customerIds = array_diff($customerIds,data_get($owners,'*.code'));
             $owner_list = $this->createByWmsCustomerIds($customerIds);
-            $owners->concat($owner_list);
+            $owners=$owners->concat($owner_list);
         }
         return $owners;
     }

+ 3 - 0
app/Services/RejectedBillService.php

@@ -57,4 +57,7 @@ Class RejectedBillService
             app('LogService')->log(__METHOD__,__FUNCTION__,'退回单同步问题件'.json_encode($rejectedBill).json_encode($orderIssue));
         }
     }
+    public function syncLoadedStatusByAsnHerder($asnHerders){
+
+    }
 }

+ 213 - 4
app/Services/StoreItemService.php

@@ -1,13 +1,222 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
+use App\Services\common\BatchUpdateService;
+use App\Services\common\DataHandlerService;
+use App\Store;
+use App\StoreItems;
+use Carbon\Carbon;
 use Illuminate\Support\Facades\DB;
 
 Class StoreItemService
-{ 
+{
     public function insert(array $params){
         return DB::table('store_items')->insert($params);
     }
 
-}
+    public function storeItemCreateByWms($asnHerders)
+    {
+        if ($asnHerders->isEmpty())return null;
+        $asnDetails=collect();
+        $asnHerders->each(function ($asnHeader)use($asnDetails){
+            $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
+                $asnDetails->add($asnDetail);
+            });
+        });
+        $this->createStoreItem($asnDetails);
+    }
+
+    public function storeItemUpdateByWms($asnHerders)
+    {
+        if ($asnHerders->isEmpty())return null;
+        $asnDetails=collect();
+        $asnHerders->each(function ($asnHeader)use($asnDetails){
+            $asnHeader->asnDetails->each(function ($asnDetail)use($asnDetails){
+                $asnDetails->add($asnDetail);
+            });
+        });
+        $this->updateStoreItem($asnDetails);
+    }
+
+    public function createStoreItem($asnDetails)
+    {
+        if ($asnDetails->isEmpty())return null;
+        $stores = Store::query()->whereIn('asn_code',array_unique(data_get($asnDetails,'*.asnno')))->get();
+        $store_asn_code_map = [];
+        foreach ($stores as $store) {
+            $store_asn_code_map[$store->asn_code]= $store;
+        }
+        $params=$this->getParamsByAsnDetails($asnDetails,$store_asn_code_map);
+        if(count($params)> 0){
+            $this->insertStore($params);
+        }
+
+    }
+    public function getParamsByAsnDetails($asnDetails,$store_asn_code_map)
+    {
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService =  app(DataHandlerService::class);
+        $storeItems=$this->getByWms($asnDetails);
+        $storeItem_map =  $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
+        $params = [];
+        foreach ($asnDetails as $asnDetail) {
+            $storeItem =$dataHandlerService
+                ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItem_map);
+            if($storeItem ?? false)continue;
+            $params[] = [
+                'store_id'=>$store_asn_code_map[$asnDetail->asnno]['id'],
+                'asn_line_code' => $asnDetail->asnlineno,
+                'name' =>$asnDetail->skudescrc,
+                'sku' =>$asnDetail->sku,
+                'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
+                'amount' =>$asnDetail->expectedqty??0,
+                'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
+                'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
+                'created_at'=>$asnDetail->addtime??null,
+                'updated_at'=>$asnDetail->edittime??null,
+            ];
+        }
+        return $params;
+    }
+    public function insertStore(array $params){
+        if(count($params) === 0) return [];
+        try {
+            $this->insert($params);
+            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store_item success'.count($params).json_encode($params));
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store_item error'.json_encode($params).'||'.$e->getMessage().'||'.$e->getTraceAsString());
+        } finally{
+            return StoreItems::query()->whereIn('id',data_get($params,'*.id'))->get();
+        }
+    }
+//    public function updateStoreItem($asnDetails)
+//    {
+//        if(!$asnDetails || $asnDetails->count() == 0){return null;}
+//        /** @var DataHandlerService $dataHandlerService */
+//        $dataHandlerService =  app(DataHandlerService::class);
+//        $storeItems=$this->getByWms($asnDetails);
+//        $storeItems_map =  $dataHandlerService->dataHeader(['store_asn_code','asn_line_code','sku'],$storeItems);
+//        /** @var StoreService $storeService */
+//        $storeService=app(StoreService::class);
+//        $stores=$storeService->getByWms($asnDetails);
+//        $stores_map =  $dataHandlerService->dataHeader(['asn_code'],$stores);
+//        $updateParams = [[
+//            'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
+//        ]];
+//        $updated_at=Carbon::now()->toDateTimeString();
+//        $delete_storeItems=[];
+//        foreach ($asnDetails as $asnDetail) {
+//            $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnDetail->asnno],$stores_map);
+//            $storeItem =$dataHandlerService
+//                ->getKeyValue(['store_asn_code'=>$asnDetail->asnno,'asn_line_code'=>$asnDetail->asnlineno,'sku'=>$asnDetail->sku],$storeItems_map);
+//            if(!$storeItem){
+//                array_push($delete_storeItems,$asnDetail);
+//                continue;
+//            }
+//            if( $storeItem->store_id != $store->id ||
+//                $storeItem->asn_line_code!=$asnDetail->asnlineno ||
+//                $storeItem->name != $asnDetail->skudescrc ||
+//                $storeItem->sku != $asnDetail->sku||
+//                $storeItem->barcode !=$asnDetail->basSku->alternate_sku1||
+//                $storeItem->amount !=$asnDetail->expectedqty||
+//                $storeItem->quality !=$asnDetail->qualityStatus??$asnDetail->qualityStatus->codename_c||
+//                $storeItem->status !=$asnDetail->lineStatus??$asnDetail->lineStatus->codename_c||
+//                $storeItem->created_at !=$asnDetail->addtime||
+//                $storeItem->updated_at != $asnDetail->edittime){
+//                $updateParams[] = [
+//                    'id'=>$storeItem->id,
+//                    'store_id'=>$store->id,
+//                    'asn_line_code' => $asnDetail->asnlineno,
+//                    'name' =>$asnDetail->skudescrc,
+//                    'sku' =>$asnDetail->sku,
+//                    'barcode' =>$asnDetail->basSku?$asnDetail->basSku->alternate_sku1:'',
+//                    'amount' =>$asnDetail->expectedqty??0,
+//                    'quality' =>$asnDetail->qualityStatus?$asnDetail->qualityStatus->codename_c:'',
+//                    'status' => $asnDetail->lineStatus?$asnDetail->lineStatus->codename_c:'',
+//                    'created_at'=>$asnDetail->addtime??null,
+//                    'updated_at'=>$updated_at,
+//                ];
+//            }
+//        }
+//        if(count($updateParams) > 1){
+//            $this->batchUpdate($updateParams);
+//        }
+//
+//        if (count($asnDetails)<count($storeItems)){
+//                dd($delete_storeItems);
+//        }
+//        unset($updateParams,$asnDetails);
+//    }
+    public function updateStoreItem($asnDetails)
+    {
+        if(!$asnDetails || $asnDetails->count() == 0){return null;}
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService =  app(DataHandlerService::class);
+        $storeItems=$this->getByWms($asnDetails);
+        $asnDetails_map =  $dataHandlerService->dataHeader(['asnno','asnlineno','sku'],$asnDetails);
+        $updateParams = [[
+            'id','store_id','asn_line_code','name','sku','barcode','amount','quality','status','created_at','updated_at'
+        ]];
+        $updated_at=Carbon::now()->toDateTimeString();
+        $delete_storeItems=[];
+        foreach ($storeItems as $storeItem) {
+            $asnDetail =$dataHandlerService
+                ->getKeyValue(['asnno'=>$storeItem->store_asn_code,'asnlineno'=>$storeItem->asn_line_code,'sku'=>$storeItem->sku],$asnDetails_map);
+            if(!$asnDetail){
+                array_push($delete_storeItems,$storeItem);
+                continue;
+            }
+            if($storeItem->asn_line_code!=$asnDetail['asnlineno'] ||
+                $storeItem->name != $asnDetail['skudescrc'] ||
+                $storeItem->sku != $asnDetail['sku']||
+                $storeItem->barcode !=$asnDetail['basSku']['alternate_sku1']||
+                $storeItem->amount !=$asnDetail['expectedqty']||
+                $storeItem->quality !=$asnDetail['qualityStatus']??$asnDetail['qualityStatus']['codename_c']||
+                $storeItem->status !=$asnDetail['lineStatus']??$asnDetail['lineStatus']['codename_c']||
+                $storeItem->created_at !=$asnDetail['addtime']||
+                $storeItem->updated_at != $asnDetail['edittime']){
+                $updateParams[] = [
+                    'id'=>$storeItem->id,
+                    'store_id'=>$storeItem->store->id,
+                    'asn_line_code' => $asnDetail['asnlineno'],
+                    'name' =>$asnDetail['skudescrc'],
+                    'sku' =>$asnDetail['sku'],
+                    'barcode' =>$asnDetail['basSku']?$asnDetail['basSku']['alternate_sku1']:'',
+                    'amount' =>$asnDetail['expectedqty']??0,
+                    'quality' =>$asnDetail['qualityStatus']?$asnDetail['qualityStatus']['codename_c']:'',
+                    'status' => $asnDetail['lineStatus']?$asnDetail['lineStatus']['codename_c']:'',
+                    'created_at'=>$asnDetail['addtime']??null,
+                    'updated_at'=>$updated_at,
+                ];
+            }
+        }
+        if(count($updateParams) > 1){
+            $this->batchUpdate($updateParams);
+        }
+        if (count($delete_storeItems)>0) $this->deleteStoreItem($delete_storeItems);
+        unset($updateParams,$asnDetails,$delete_storeItems);
+    }
+    public function batchUpdate($params){
+        return app(BatchUpdateService::class)->batchUpdate('store_items',$params);
+    }
+
+    public function getByWms($asnDetails){
+        if(!$asnDetails){return null;}
+        return StoreItems::query()->whereHas('store',function($query)use($asnDetails){
+            $query->whereIn('asn_code',array_unique(data_get($asnDetails,'*.asnno')));
+        })->get();
+    }
+    public function deleteStoreItem(array $delete_storeItems){
+        $storeItemIds=[];
+        foreach ($delete_storeItems as $delete_storeItem){
+            array_push($storeItemIds,$delete_storeItem->id);
+        }
+        try {
+            StoreItems::query()->whereIn('id', $storeItemIds)->delete();
+            LogService::log(__METHOD__,__FUNCTION__,'删除多余StoreItems '.count($delete_storeItems).json_encode($delete_storeItems),null);
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'删除多余StoreItems error'.count($delete_storeItems).json_encode($delete_storeItems).$e->getMessage().$e->getTraceAsString(),null);
+        }
+    }
+}

+ 156 - 5
app/Services/StoreService.php

@@ -1,13 +1,164 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
+use App\Services\common\BatchUpdateService;
+use App\Services\common\DataHandlerService;
 use App\Store;
+use Carbon\Carbon;
 
 Class StoreService
-{ 
-    public function create(array $params){
+{
+    public function create(array $params)
+    {
         return Store::query()->create($params);
     }
 
-}
+    public function syncWmsAsnData($startDate)
+    {
+        $this->storeCreateByWms($startDate);
+        //$this->storeUpdateByWms($startDate);
+    }
+
+    public function storeCreateByWms($startDate)
+    {
+        /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
+        $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
+        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateCreate($startDate);
+        $this->createStore($asnHerders);
+    }
+
+    public function storeUpdateByWms($startDate)
+    {
+        /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
+        $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
+        $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateEdit($startDate);
+        $this->updateStore($asnHerders);
+    }
+
+    public function createStore($asnHerders)
+    {
+        if ($asnHerders->isEmpty())return null;
+        /**
+         * @var OwnerService $ownerService
+         * @var WarehouseService $wareHouseService
+         */
+        $ownerService = app(OwnerService::class);
+        $owners=$ownerService->getByWmsOrders($asnHerders);
+        $wareHouseService=app(WarehouseService::class);
+        $warehouses=$wareHouseService->getByWms($asnHerders);
+        foreach ($owners as $owner) {
+            $owners_code_map[$owner->code] = $owner;
+        }
+        foreach ($warehouses as $warehouse) {
+            $warehouses_code_map[$warehouse->code] = $warehouse;
+        }
+        $params=$this->getParamsByAsnHeader($asnHerders,$owners_code_map,$warehouses_code_map);
+        if(count($params)> 0){
+            $this->insertStore($params);
+        }
+        /** @var StoreItemService $storeItemService */
+        $storeItemService = app(StoreItemService::class);
+        $storeItemService->storeItemCreateByWms($asnHerders);
+        $asn_nos = data_get($asnHerders,'*.asnno');
+        unset($asnHerders,$owners_code_map,$warehouses_code_map);
+        return Store::query()->whereIn('asn_code',$asn_nos)->get();
+    }
+    public function getParamsByAsnHeader($asnHerders,$owners_code_map,$warehouses_code_map)
+    {
+        $params = [];
+        $stores = Store::query()->whereIn('asn_code',data_get($asnHerders,'*.asnno'))->get();
+        $store_asn_code_map = [];
+        foreach ($stores as $store) {
+            $store_asn_code_map[$store->asn_code]= $store;
+        }
+        foreach ($asnHerders as $asnHerder) {
+            if($store_asn_code_map[$asnHerder->asnno] ?? false)continue;
+            $owner = $owners_code_map[$asnHerder->customerid] ?? null;
+            $warehouse=$warehouses_code_map[$asnHerder->warehouseid] ?? null;
+            $params[] = [
+                'asn_code' => $asnHerder->asnno,
+                'warehouse_id' =>$warehouse->id??null,
+                'owner_id' => $owner->id??null,
+                'stored_method' =>$asnHerder->asnType?$asnHerder->asnType->codename_c:'',
+                'status' =>$asnHerder->asnStatus?$asnHerder->asnStatus->codename_c:'',
+                'remark' => $asnHerder->notes??null,
+                'created_at'=>$asnHerder->addtime??null,
+                'updated_at'=>$asnHerder->edittime??null,
+            ];
+        }
+        return $params;
+    }
+    public function insertStore(array $params){
+        if(count($params) === 0) return [];
+        try {
+            $this->insert($params);
+            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store success'.count($params).json_encode($params));
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'批量创建 store error'.json_encode($params).'||'.$e->getMessage().'||'.$e->getTraceAsString());
+        } finally{
+            return Store::query()->whereIn('asn_code',data_get($params,'*.asn_code'))->get();
+        }
+    }
+
+    public function updateStore($asnHerders)
+    {
+        if(!$asnHerders || $asnHerders->count() == 0){return null;}
+        /** @var DataHandlerService $dataHandlerService */
+        $dataHandlerService =  app(DataHandlerService::class);
+        $stores = $this->getByWms($asnHerders);
+        $store_asn_code_map =  $dataHandlerService->dataHeader(['asn_code'],$stores);
+        $owners = app(OwnerService::class)->getByWmsOrders($asnHerders);
+        $owner_code_map = $dataHandlerService->dataHeader(['code'],$owners);
+        $warehouses = app(WarehouseService::class)->getByWms($asnHerders);
+        $warehouses_map = $dataHandlerService->dataHeader(['code'],$warehouses);
+        $updateParams = [[
+            'id','asn_code','warehouse_id','owner_id','stored_method','status','remark','updated_at'
+        ]];
+        $updated_at=Carbon::now()->toDateTimeString();
+        foreach ($asnHerders as $asnHerder) {
+            $store =$dataHandlerService->getKeyValue(['asn_code'=>$asnHerder->asnno],$store_asn_code_map);
+            if(!$store){continue;}
+            $owner = $dataHandlerService->getKeyValue(['code'=>$asnHerder->customerid] ,$owner_code_map);
+            $warehouse=$dataHandlerService->getKeyValue(['code'=>$asnHerder->warehouseid],$warehouses_map);
+            $owner_id = $owner->id ?? null;
+            $warehouse_id=$warehouse->id??null;
+
+            if( $store->asn_code != $asnHerder->asnno ||
+                $store->warehouse_id!=$warehouse_id ||
+                $store->owner_id != $owner_id ||
+                $store->stored_method != $asnHerder->asnType->codename_c||
+                $store->status !=$asnHerder->asnStatus->codename_c||
+                $store->remark != $asnHerder->notes){
+                $updateParams[] = [
+                    'id'=>$store->id,
+                    'asn_code'=>$asnHerder->asnno,
+                    'warehouse_id'=>$warehouse_id,
+                    'owner_id' => $owner_id,
+                    'stored_method' =>$asnHerder->asnType?$asnHerder->asnType->codename_c:'',
+                    'status' =>$asnHerder->asnStatus?$asnHerder->asnStatus->codename_c:'',
+                    'remark' => $asnHerder->notes,
+                    'updated_at' =>$updated_at,
+                    ];
+            }
+        }
+        if(count($updateParams) > 1){
+            $this->batchUpdate($updateParams);
+        }
+        /** @var StoreItemService $storeItemService */
+        $storeItemService = app(StoreItemService::class);
+        $storeItemService->storeItemUpdateByWms($asnHerders);
+        unset($updateParams,$asnHerders);
+    }
+    public function insert($params){
+        return Store::query()->insert($params);
+    }
+    public function batchUpdate($params){
+        return app(BatchUpdateService::class)->batchUpdate('stores',$params);
+    }
+    public function getByWms($asnHerders){
+        if(!$asnHerders){return null;}
+        $asn_nos = array_unique(data_get($asnHerders,'*.asnno'));
+        return Store::query()->whereIn('asn_code',$asn_nos)->get();
+    }
+}

+ 47 - 2
app/Services/WarehouseService.php

@@ -3,13 +3,17 @@
 namespace App\Services;
 
 use App\OracleBasCustomer;
+use App\Owner;
 use App\Warehouse;
 use Illuminate\Support\Collection;
+use Carbon\Carbon;
 
 Class WarehouseService
 {
-    public function firstOrCreate(array $params, array $values = null){
-        if ($values)return Warehouse::query()->firstOrCreate($params,$values);
+
+    public function firstOrCreate(array $params, array $values = null)
+    {
+        if ($values) return Warehouse::query()->firstOrCreate($params, $values);
         return Warehouse::query()->firstOrCreate($params);
     }
 
@@ -49,4 +53,45 @@ Class WarehouseService
         }
         return  $collet;
     }
+    public function getByWms($asnHerders)
+    {
+        $warehouseids = array_unique(data_get($asnHerders, '*.warehouseid'));
+        $warehouseids = array_diff($warehouseids, [null, '', '*']);
+        $warehouses = Warehouse::query()->whereIn('code', $warehouseids)->get();
+        if ($warehouses->count() < count($warehouseids)) {
+            $warehouseids = array_diff($warehouseids, data_get($warehouses, '*.code'));
+            $warehouse_list = $this->createWarehouseByWms($warehouseids);
+            $warehouses=$warehouses->concat($warehouse_list);
+        }
+        return $warehouses;
+    }
+
+    public function createWarehouseByWms($codes)
+    {
+        if(!$codes) {return [];}
+        $insert_params = [];
+        $created_at = Carbon::now()->format('Y-m-d H:i:s');
+        foreach ($codes as $item) {
+            $insert_params[] = [
+                'code' => $item,
+                'name' => $item,
+                'created_at' => $created_at,
+            ];
+        }
+
+        try {
+            if (count($insert_params) > 0) {
+                $this->insert($insert_params);
+                LogService::log(__METHOD__, __FUNCTION__, '批量创建 warehouse success' . count($insert_params) . json_encode($insert_params) );
+            }
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__, __FUNCTION__, '批量创建 warehouse error' . json_encode($insert_params) . '||' . $e->getMessage() . '||' . $e->getTraceAsString());
+        } finally {
+            return Warehouse::query()->whereIn('code', $codes)->get();
+        }
+    }
+    public function insert($fillables){
+        return Warehouse::query()->insert($fillables);
+    }
+
 }

+ 0 - 1
app/StoreItems.php

@@ -33,5 +33,4 @@ class StoreItems extends Model
     {
         return $this['depository']?$this['depository']['name']:null;
     }
-
 }

+ 4 - 0
config/sync.php

@@ -4,4 +4,8 @@ return [
         'interval' => 1,   // 时间以分为单位
         'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
     ],
+    'asn_sync' => [
+        'interval' => 1,   // 时间以分为单位
+        'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
+    ],
 ];

+ 33 - 0
database/migrations/2020_11_03_114135_change_store_status_column.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeStoreStatusColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::statement("ALTER TABLE stores MODIFY COLUMN status enum ('无需入库','已入库','未入库','待推单','完全收货','部分收货','已码盘','订单创建','ASN关闭','等待释放','收货取消') default null");
+        Schema::table('stores', function (Blueprint $table) {
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        DB::statement("ALTER TABLE stores MODIFY COLUMN status enum ('无需入库','已入库','未入库','待推单') default null");
+        Schema::table('stores', function (Blueprint $table) {
+        });
+    }
+}

+ 33 - 0
database/migrations/2020_11_03_114310_change_store_stored_method_column.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeStoreStoredMethodColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::statement("ALTER TABLE stores MODIFY COLUMN stored_method enum ('正常','快速入库','采购入库','笕尚退货入库单','笕尚进仓入库单','笕尚移仓入库单','B2B入库','笕尚调整入库单','换货入库','初始化库存','虚拟入库','其他入库','退货入库','调拨入库') default '正常'");
+        Schema::table('stores', function (Blueprint $table) {
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        DB::statement("ALTER TABLE stores MODIFY COLUMN stored_method enum ('正常','快速入库') default '正常'");
+        Schema::table('stores', function (Blueprint $table) {
+        });
+    }
+}

+ 33 - 0
database/migrations/2020_11_03_180029_change_store_items_status_column.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeStoreItemsStatusColumn extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        DB::statement("ALTER TABLE store_items MODIFY COLUMN status enum ('无需入库','已入库','未入库','待推单','完全收货','部分收货','已码盘','订单创建','ASN关闭','等待释放','收货取消') default null");
+        Schema::table('store_items', function (Blueprint $table) {
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        DB::statement("ALTER TABLE store_items MODIFY COLUMN status enum ('无需入库','已入库','未入库','待推单') default null");
+        Schema::table('store_items', function (Blueprint $table) {
+        });
+    }
+}

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddAuditorToInventoryAccounts extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('inventory_accounts', function (Blueprint $table) {
+            $table->integer('auditor')->index()->nullable()->comment('审核人');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('inventory_accounts', function (Blueprint $table) {
+            $table->dropColumn('auditor');
+        });
+    }
+}

+ 29 - 0
database/migrations/2020_11_09_134301_add_inventory_account_authorities.php

@@ -0,0 +1,29 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddInventoryAccountAuthorities extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Authority::query()->firstOrCreate(['name'=>'库存管理-盘点-项目审核','alias_name'=>'库存管理-盘点-项目审核']);
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Authority::query()->where('name','库存管理-盘点-项目审核')->delete();
+    }
+}

+ 3 - 2
package-lock.json

@@ -6192,7 +6192,8 @@
         },
         "minimist": {
             "version": "1.2.0",
-            "resolved": "",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+            "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
             "dev": true
         },
         "mississippi": {
@@ -8767,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",
+            "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",
             "integrity": "sha1-FNW6LgC5vNFFrkQ6uWs/hsvMG7Q=",
             "requires": {
                 "backo2": "1.0.2",

+ 3 - 0
phpunit.xml

@@ -21,6 +21,9 @@
         <testsuite name="Services">
             <directory suffix="Test.php">./tests/Services</directory>
         </testsuite>
+        <testsuite name="StoreService">
+            <directory suffix="Test.php">./tests/Services/StoreService</directory>
+        </testsuite>
     </testsuites>
     <filter>
         <whitelist processUncoveredFilesFromWhitelist="true">

+ 4 - 8
public/t.php

@@ -1,11 +1,7 @@
 <?php
 
 
-class Ab{
-    static function f(){
-        echo 'f()';
-    }
-}
-
-(new Ab())->f();
-
+$str = '货号:yw2020110877入正品仓';
+$result=[];
+preg_match("/([a-zA-Z]{0,5}\d{6,20})/", $str, $result);
+var_dump($result);

+ 57 - 34
resources/views/inventory/stockInventory/mission.blade.php

@@ -11,11 +11,6 @@
         <form class="form-inline mt-2">
             <span class="form-inline ml-5">
                  <span class="btn btn-sm btn-outline-secondary tooltipTarget" @click="syncOwners">同步货主</span>
-{{--                <select class="form-control form-control-sm tooltipTarget" name="owner_id" id="owner_id" style="width: 150px;position: relative" title="选择指定货主">--}}
-{{--                    <option value="">货主</option>--}}
-{{--                    <option v-for="owner in fakeOwners" :value="owner.id">@{{ owner.name }}</option>--}}
-{{--                </select>--}}
-{{--                <input placeholder="定位货主" id="ownerName" autocomplete="off" class="form-control form-control-sm tooltipTarget" style="width: 100px" @input="定位货主()" title="输入关键字定位货主">--}}
                 <select class="form-control form-control-sm tooltipTarget" name="owner_id" id="owner_id" style="width: 150px;position: relative" title="选择指定货主" v-model="owner_id">
                                         <option value="">货主</option>
                                         <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
@@ -45,7 +40,7 @@
                 <input id="all" type="checkbox" @click="checkAll($event)">全选
             </label>
             <table class="table table-sm text-nowrap table-bordered d-none" id="headerRoll"></table>
-            <table class="table table-sm text-nowrap table-striped table-bordered m-0" id="headerParent">
+            <table class="table table-sm  table-striped table-bordered m-0" id="headerParent">
                 <tr class="p-0" id="header"></tr>
                 <tr v-for="(inventory,i) in inventoryAccounts" @click="selectedColor(inventory.id)" :style="{'font-weight': inventory.id==selectedStyle?'bold':''}">
                     <td>
@@ -59,23 +54,35 @@
                             <a :href="'{{url('inventory/stockInventory/enterStockInventory')}}/'+inventory.id+'?listMode=true'"><button class="btn btn-sm btn-outline-dark">查看</button></a>
                         @endcan
                     </td>
+                    <td>
+                        @can('库存管理-盘点-项目审核')
+                            <span v-if="inventory.auditor">已审核</span>
+                            <span v-else class="btn  btn-sm btn-outline-dark" @click="inventoryChecked(inventory.id)">审核</span>
+                        @else
+                            <span v-if="inventory.auditor">已审核</span>
+                            <span v-else>未审核</span>
+                        @endcan
+                    </td>
                     <td >@{{ i+1 }}</td>
                     <td >@{{ inventory.status }}</td>
                     <td >@{{ inventory.id }}</td>
                     <td >@{{ inventory.created_at }}</td>
                     <td >@{{ inventory.owner_name }}</td>
-                    <td >
-                        @{{ inventory.type }}
-                        <span v-if="inventory.remark">/@{{ inventory.remark }}</span>
+                    <td style="width: 200px;word-wrap: break-word">
+                        <small>@{{ inventory.type }}</small>
+                        <span v-if="inventory.remark" style="word-wrap: break-word;"><small>@{{ inventory.remark }}</small></span>
                     </td>
                     <td >@{{ inventory.start_at }}</td>
                     <td class="text-muted">@{{ inventory.end_at }}</td>
                     <td >@{{ inventory.total }}</td>
                     <td >@{{ inventory.processed }}</td>
                     <td >@{{ inventory.surplus }}</td>
+                    <td >@{{ inventory.ignored }}</td>
                     <td>@{{ inventory.difference }}</td>
                     <td>@{{ inventory.returned }}</td>
-                    <td>@{{ inventory.creator }}</td>
+                    <td v-if="inventory.processed">@{{ inventory.processed }}/@{{ inventory.total }}</td>
+                    <td>@{{ inventory.auditor }}</td>
+                    <td class="text-muted">@{{ inventory.creator }}</td>
                     <td>
                         <span v-if="inventory.status!='已完成'" class="btn  btn-sm btn-outline-danger" @click="deleteStockInventoryMission(inventory.id)">删</span>
                     </td>
@@ -115,7 +122,9 @@
                         returned:'{{$inventory->returned}}', surplus:'{{$inventory->surplus}}',
                         total:'{{$inventory->total}}',end_at:'{{$inventory->end_at}}',
                         start_at:'{{$inventory->start_at}}',type:'{{$inventory->type}}',
-                        difference:'{{$inventory->difference}}', remark:'{{$inventory->remark}}'},
+                        difference:'{{$inventory->difference}}',
+                        remark:'{{$inventory->remark}}',ignored:'{{$inventory->ignored}}',auditor:'{{$inventory->auditor?$inventory->userAuditor->name:''}}',
+                    },
                     @endforeach
                 ],
                 owners:{!! $owners !!},
@@ -139,19 +148,23 @@
                     {name:'cloneCheckAll',customization:true,type:'checkAll',column:'id',
                         dom:$('#cloneCheckAll').removeClass('d-none'), neglect: true},
                     {name:'operation',value: '操作', neglect: true},
+                    {name:'',value: '审核', neglect: true},
                     {name:'index',value: '序号', neglect: true},
                     {name:'status',value: '盘点状态', neglect: true},
                     {name:'id',value: '盘点单号', neglect: true},
                     {name: 'created_at', value: '创建日期'},
-                    {name:'owner_name',value: '货主',neglect: true},
-                    {name: 'type', value: '任务类型'},
+                    {name:'owner_name',value: '货主'},
+                    {name: 'type', value: '任务类型',neglect: true},
                     {name:'start_at',value: '起始时间'},
                     {name: 'end_at', value: '结束时间', neglect: true},
-                    {name: 'total', value: '记录数', neglect: true},
-                    {name: 'processed', value: '已盘点数', neglect: true},
-                    {name: 'surplus',value: '剩余数', neglect: true},
-                    {name: 'difference', value: '复盘差异', neglect: true},
+                    {name: 'total', value: '盘点任务数', neglect: true},
+                    {name: 'processed', value: '盘点数量', neglect: true},
+                    {name: 'surplus',value: '未盘数量', neglect: true},
+                    {name: 'surplus',value: '跳过数量', neglect: true},
+                    {name: 'difference', value: '差异数量', neglect: true},
                     {name: 'returned', value: '复盘归位', neglect: true},
+                    {name: 'returned', value: '盘点比例', neglect: true},
+                    {name: 'auditor', value: '审核人', neglect: true},
                     {name: 'creator', value: '创建人', neglect: true},
                     {name:'remove',value: '', neglect: true},
                 ];
@@ -264,10 +277,9 @@
                 enterStockInventory(id){
                     location.href='{{url('inventory/stockInventory/enterStockInventory')}}/'+id;
                 },
-                //删除盘点任务
                 deleteStockInventoryMission(id){
                     let _this=this;
-                    if(!confirm('确定要删除盘点单号为:“'+id+'”的运单吗?')){return};
+                    if(!confirm('确定要删除盘点单号为:“'+id+'”的盘点任务吗?')){return};
                     let url = '{{url('inventory/deleteStockInventoryMission')}}/'+id;
                     axios.delete(url).then(
                         function (response) {
@@ -292,6 +304,32 @@
                         tempTip.show('删除失败,网络链接错误!'+err);
                     });
                 },
+                inventoryChecked(id){
+                    let _this=this;
+                    let url = '{{url('inventory/inventoryChecked')}}';
+                    axios.post(url,{id:id}).then(
+                        function (response) {
+                            if(!response.data.success){
+                                tempTip.setDuration(3000);
+                                tempTip.show('盘点单号:'+id+'审核失败!');
+                            }else {
+                                _this.inventoryAccounts.every(function (inventoryAccount,i) {
+                                    if (inventoryAccount.id===id){
+                                        inventoryAccount.auditor=response.data.data.user_auditor.name;
+                                        return false;
+                                    }else {
+                                        return true
+                                    }
+                                });
+                                tempTip.setDuration(3000);
+                                tempTip.showSuccess('盘点单号:'+id+'审核成功!');
+                            }
+                        }
+                    ).catch(function (err) {
+                        tempTip.setDuration(3000);
+                        tempTip.show('审核失败,网络链接错误!'+err);
+                    });
+                },
                 syncOwners(){
                     let _this=this;
                     let url = '{{url('inventory/syncOwners')}}';
@@ -320,21 +358,6 @@
                         this.owner_id='';
                     }
                 },
-                // 定位货主(){
-                //     let target = $('#ownerName').val();
-                //     if(target === ''){
-                //         this.fakeOwners = this.owners;
-                //         $('#owner_id').attr('size','1');
-                //     }else{
-                //         this.fakeOwners = this.owners.filter(function(map){
-                //             return map.name.includes(target) ;
-                //         })
-                //         if (this.fakeOwners.length>=1){
-                //             //$("#owner_id option[value='"+this.fakeOwners[0].id+"']").attr("selected","selected");
-                //             $('#owner_id').attr('size','2');
-                //         }
-                //     }
-                // },
                 hasDateStart(){
                     this.date_start=document.getElementById('date_start').value;
                 },

+ 2 - 1
routes/web.php

@@ -250,7 +250,7 @@ Route::group(['prefix'=>'store'],function(){
     Route::group(['prefix'=>'fast'],function() {
         Route::resource('storeItem','StoreItemsController');
     });
-    Route::resource('fast','StoreController');
+    Route::resource('fast',"StoreController");
 
     /** 盲收 */
     Route::group(['prefix'=>'blindReceive'],function(){
@@ -419,6 +419,7 @@ Route::group(['prefix'=>'inventory'],function(){
     });
 
     Route::get('syncOwners','InventoryAccountController@syncOwners');
+    Route::post('inventoryChecked','InventoryAccountController@inventoryChecked');
     Route::any('删除盘点记录','InventoryAccountController@删除盘点记录');
     Route::post('跳过盘点记录','InventoryAccountController@跳过盘点记录');
     Route::post('确认盘点差异','InventoryAccountController@确认盘点差异');

+ 37 - 0
tests/Services/OracleDocAsnHeaderService/getWmsAsnOnStartDateCreateOrEditTest.php

@@ -0,0 +1,37 @@
+<?php
+
+
+namespace Tests\Services\OracleDocAsnHeaderService;
+
+
+use App\Services\OracleDocAsnHerderService;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class getWmsAsnOnStartDateCreateOrEditTest extends TestCase
+{
+    /** @var OracleDocAsnHerderService $service */
+    public $service;
+    public $startDate;
+    public  function setUp(): void
+    {
+        $this->service  = app(OracleDocAsnHerderService::class);
+        $this->startDate=Carbon::parse('2020-10-22 00:00:00')->subDays(1)->format('Y-m-d H:i:s');
+        parent::setUp(); // TODO: Change the autogenerated stub
+    }
+
+    public function testGetWmsAsnOnStartDateCreate(){
+        $asnHerders=$this->service->getWmsAsnOnStartDateCreate($this->startDate);
+        $this->assertNotEmpty($asnHerders);
+        $this->startDate=null;
+        $asnHerders=$this->service->getWmsAsnOnStartDateCreate($this->startDate);
+        $this->assertNull($asnHerders);
+    }
+    public function testGetWmsAsnOnStartDateEdit(){
+        $asnHerders=$this->service->getWmsAsnOnStartDateEdit($this->startDate);
+        $this->assertNotEmpty($asnHerders);
+        $this->startDate=null;
+        $asnHerders=$this->service->getWmsAsnOnStartDateEdit($this->startDate);
+        $this->assertNull($asnHerders);
+    }
+}

+ 31 - 0
tests/Services/StoreService/AsnSyncTest.php

@@ -0,0 +1,31 @@
+<?php
+
+
+namespace Tests\AsnSync\Services;
+
+
+use App\Services\OracleDocAsnDetailService;
+use App\Services\OracleDocAsnHerderService;
+use App\Services\StoreService;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class AsnSyncTest extends TestCase
+{
+    /** @var OracleDocAsnDetailService $service */
+    public $service;
+    public function setUp(): void
+    {
+        $this->service  = app(OracleDocAsnDetailService::class);
+        parent::setUp(); // TODO: Change the autogenerated stub
+    }
+
+
+    public function testAsnSync(){
+        $startDate=Carbon::parse('2020-10-22 00:00:00')->subDays(1)->format('Y-m-d H:i:s');
+        //app(StoreService::class)->syncWmsAsnData($startDate);
+        //$asnHeaders=app(OracleDocAsnHerderService::class)->getWmsAsnOnStartDateCreate($startDate);
+        //dd($asnHeaders);
+
+    }
+}

+ 45 - 0
tests/Services/StoreService/CreateStoreTest.php

@@ -0,0 +1,45 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\OracleDOCASNHeader;
+use App\Services\StoreService;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class CreateStoreTest extends TestCase
+{
+    /** @var StoreService $service */
+    public $service;
+    public $asnHeaders;
+    public $stores;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app(StoreService::class);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->where('addTime', '>=', Carbon::parse('2020-10-21 00:00:00')->format('Y-m-d H:i:s'))
+            ->get();
+    }
+    public function testCreateStore(){
+        if (!$this->asnHeaders) return null;
+        $this->stores=$this->service->createStore($this->asnHeaders);
+        $this->assertNotEmpty($this->stores);
+    }
+    public function tearDown(): void
+    {
+        $storeIds=[];
+        foreach ($this->stores as $store){
+            array_push($storeIds,$store->id);
+        }
+        DB::table('stores')->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->delete();
+        DB::table('store_items')->whereIn('store_id',$storeIds)->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 59 - 0
tests/Services/StoreService/GetParamsByAsnHeaderTest.php

@@ -0,0 +1,59 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\OracleDOCASNHeader;
+use App\Services\OwnerService;
+use App\Services\StoreService;
+use App\Services\WarehouseService;
+use App\Store;
+use Carbon\Carbon;
+use Tests\TestCase;
+
+class GetParamsByAsnHeaderTest extends TestCase
+{
+    /**
+     * @var StoreService $service
+     * @var OwnerService $ownerService
+     * @var WarehouseService $warehouseService
+     *
+     */
+    public $service;
+    public $asnHeaders;
+    public $ownerService;
+    public $warehouseService;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app(StoreService::class);
+        $this->ownerService=app(OwnerService::class);
+        $this->warehouseService=app(WarehouseService::class);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->where('addTime', '>=', Carbon::parse('2020-10-21 00:00:00')->format('Y-m-d H:i:s'))
+            ->get();
+    }
+    public function testGetParamsByAsnHeader(){
+        if (empty($this->asnHeaders))return null;
+        $stores = Store::query()->whereIn('asn_code',data_get($this->asnHeaders,'*.asnno'))->get();
+        $owners=$this->ownerService->getByWmsOrders($this->asnHeaders);
+        $warehouses=$this->warehouseService->getByWms($this->asnHeaders);
+        $this->assertNotEmpty($this->asnHeaders);
+        $this->assertNotEmpty($owners);
+        $this->assertNotEmpty($warehouses);
+        foreach ($owners as $owner) {
+            $owners_code_map[$owner->code] = $owner;
+        }
+        foreach ($warehouses as $warehouse) {
+            $warehouses_code_map[$warehouse->code] = $warehouse;
+        }
+        if (count($this->asnHeaders)>count($stores)){
+            $params=$this->service->getParamsByAsnHeader($this->asnHeaders,$owners_code_map,$warehouses_code_map);
+            $this->assertNotEmpty($params);
+        }
+    }
+}

+ 53 - 0
tests/Services/StoreService/InsertStoreTest.php

@@ -0,0 +1,53 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\Services\StoreService;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class InsertStoreTest extends TestCase
+{
+    /** @var StoreService $service */
+    public $service;
+    public $params=[];
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service=app(StoreService::class);
+        $data1=[
+            'asn_code' => 'ASN2010210111',
+            'warehouse_id' =>2,
+            'owner_id' => 2,
+            'stored_method' =>'退货入库',
+            'status' =>'完全收货',
+            'remark' => 'test',
+            'created_at'=>'2020-11-06 14:32:00',
+            'updated_at'=>'2020-11-06 14:32:00',
+        ];
+        array_push($this->params,$data1);
+        $data2=[
+            'asn_code' => 'ASN2010210222',
+            'warehouse_id' =>2,
+            'owner_id' => 2,
+            'stored_method' =>'退货入库',
+            'status' =>'完全收货',
+            'remark' => 'test',
+            'created_at'=>'2020-11-06 14:32:00',
+            'updated_at'=>'2020-11-06 14:32:00',
+        ];
+        array_push($this->params,$data2);
+    }
+    public  function testInsertStore(){
+        $stores=$this->service->insertStore($this->params);
+        $this->assertNotEmpty($stores);
+        $this->assertDatabaseHas('stores',$this->params[0]);
+    }
+     public function tearDown(): void
+     {
+         DB::table('stores')->whereIn('asn_code',data_get($this->params,'*.asn_code'))->delete();
+         parent::tearDown(); // TODO: Change the autogenerated stub
+     }
+}

+ 42 - 0
tests/Services/StoreService/UpdateStoreTest.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace Tests\Services\StoreService;
+
+
+use App\OracleDOCASNHeader;
+use App\Services\StoreService;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+
+class UpdateStoreTest extends TestCase
+{
+    /** @var StoreService $service */
+    public $service;
+    public $asnHeaders;
+    public $stores;
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $startDate=Carbon::parse('2020-10-21 00:00:00')->format('Y-m-d H:i:s');
+        $this->service=app(StoreService::class);
+        $this->asnHeaders=OracleDOCASNHeader::query()
+            ->with(['asnType', 'asnStatus', 'asnDetails' => function ($query) {
+                $query->with(['lineStatus', 'qualityStatus','basSku']);
+            }])
+            ->where('EditTime', '>=', $startDate)
+            ->whereColumn('EditTime', '<>', 'addTime')
+            ->get();
+    }
+    public function testUpdateStore(){
+        if (!$this->asnHeaders) return null;
+        $this->assertTrue($this->service->updateStore($this->asnHeaders));
+
+
+    }
+    public function tearDown(): void
+    {
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 3
tests/haozi.http


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů