Browse Source

Merge branch 'master' into LD

LD 5 years ago
parent
commit
4968eb4706
92 changed files with 2140 additions and 334 deletions
  1. 3 2
      app/Console/Commands/CreateOwnerBillReport.php
  2. 16 8
      app/Console/Commands/SyncWMSOrderTask.php
  3. 8 17
      app/Http/Controllers/LogController.php
  4. 35 0
      app/Http/Controllers/OrderCommodityAssignController.php
  5. 7 1
      app/Http/Controllers/StoreCheckingReceiveController.php
  6. 7 28
      app/Http/Controllers/TestController.php
  7. 153 0
      app/Imports/UpdatePickZone.php
  8. 44 0
      app/Jobs/ProcessCreateInstantBill.php
  9. 45 0
      app/Jobs/StoreCreateInstantBill.php
  10. 7 0
      app/Log.php
  11. 3 0
      app/OracleDOCOrderHeader.php
  12. 4 1
      app/Order.php
  13. 33 0
      app/OrderCommodityAssign.php
  14. 4 2
      app/Providers/AppServiceProvider.php
  15. 1 0
      app/Services/BatchService.php
  16. 124 0
      app/Services/CommodityService.php
  17. 20 0
      app/Services/LogisticService.php
  18. 8 3
      app/Services/OracleDOCOrderHeaderService.php
  19. 31 0
      app/Services/OrderCommodityAssignService.php
  20. 212 0
      app/Services/OrderCommodityService.php
  21. 15 2
      app/Services/OrderIssueService.php
  22. 46 33
      app/Services/OrderPackageCommoditiesService.php
  23. 9 1
      app/Services/OrderPackageService.php
  24. 63 45
      app/Services/OrderService.php
  25. 8 4
      app/Services/OrderTrackingService.php
  26. 15 0
      app/Services/OwnerFeeDetailService.php
  27. 16 1
      app/Services/OwnerService.php
  28. 20 0
      app/Services/ProcessService.php
  29. 33 0
      app/Services/ShopService.php
  30. 4 3
      app/Services/StationTaskBatchService.php
  31. 28 0
      app/Services/StoreService.php
  32. 33 5
      app/Services/WarehouseService.php
  33. 43 0
      app/Services/WaybillService.php
  34. 11 0
      app/Utils/helpers.php
  35. 3 0
      composer.json
  36. 2 0
      config/cache.php
  37. 1 0
      config/sync.php
  38. 18 0
      database/factories/OracleActAllocationDetailsFactory.php
  39. 14 0
      database/factories/OracleBasCodeFactory.php
  40. 14 0
      database/factories/OracleBasCustomerFactory.php
  41. 15 0
      database/factories/OracleBasSKUFactory.php
  42. 16 0
      database/factories/OracleDOCOrderDetailFactory.php
  43. 35 0
      database/factories/OrcaleDOCOrderHeaderFactory.php
  44. 1 1
      database/factories/ShopFactory.php
  45. 13 0
      database/factories/WarehouseFactory.php
  46. 1 1
      database/migrations/2020_01_02_172739_change_waybill_price_model_field.php
  47. 1 1
      database/migrations/2020_03_09_153510_create_stores_table.php
  48. 2 1
      database/migrations/2020_04_09_111540_change_tutorial_table.php
  49. 0 1
      database/migrations/2020_06_02_130804_change_user_duty_check.php
  50. 4 4
      database/migrations/2020_06_11_112028_change_rejected_bills_table.php
  51. 1 1
      database/migrations/2020_06_16_173559_add_authorrities_waybillmanagement_freigt.php
  52. 0 1
      database/migrations/2020_06_30_133655_change_processes_contents_column_type.php
  53. 1 1
      database/migrations/2020_09_10_143926_drop_shop_unique_name_index.php
  54. 1 1
      database/migrations/2020_10_19_113042_create_logistic_timings_table.php
  55. 3 1
      database/migrations/2020_11_19_113955_change_order_issue_type_id_index.php
  56. 2 2
      database/migrations/2020_11_30_140958_create_stations_table.php
  57. 32 0
      database/migrations/2020_12_01_134905_add_order_type_to_orders.php
  58. 52 0
      database/migrations/2020_12_02_150054_create_order_commodity_assigns_table.php
  59. 1 1
      package-lock.json
  60. 19 0
      resources/views/maintenance/log/_taskModal.blade.php
  61. 6 4
      resources/views/maintenance/log/index.blade.php
  62. 18 2
      resources/views/maintenance/log/show.blade.php
  63. 25 0
      resources/views/order/index/_importModal.blade.php
  64. 125 0
      resources/views/order/index/index.blade.php
  65. 4 0
      resources/views/order/index/menu.blade.php
  66. 2 0
      resources/views/order/issue/index.blade.php
  67. 1 1
      resources/views/order/menu.blade.php
  68. 1 0
      resources/views/order/tracking/index.blade.php
  69. 50 30
      resources/views/store/checkingReceive/show.blade.php
  70. 9 0
      routes/web.php
  71. 0 0
      tests/CreatesApplication.php
  72. 57 0
      tests/Services/LogisticService/GetLogisticByCodesTest.php
  73. 65 0
      tests/Services/OrderCommodityService/SyncOrderCommoditiesTest.php
  74. 73 7
      tests/Services/OrderService/CreateOrFindOrderInfoTest.php
  75. 67 13
      tests/Services/OrderService/CreateOrFindOrderTest.php
  76. 0 29
      tests/Services/OrderService/FilterOrderByCacheTeat.php
  77. 40 8
      tests/Services/OrderService/FindOrCreateByClientCodeTest.php
  78. 0 41
      tests/Services/OrderService/GetByWmsOrdersTest.php
  79. 28 1
      tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest.php
  80. 11 8
      tests/Services/OrderService/GetOrderByLogisticNumberTest.php
  81. 7 1
      tests/Services/OrderService/GetOrderSyncAtTest.php
  82. 6 0
      tests/Services/OrderService/LogisticNumberFirstOrCreateOrderTest.php
  83. 1 8
      tests/Services/OrderService/PushOrderCreatedCacheTest.php
  84. 1 8
      tests/Services/OrderService/PushOrderUpdateCacheTest.php
  85. 1 0
      tests/Services/OrderService/SetOrderSyncAtTest.php
  86. 6 0
      tests/Services/OrderService/SyncOrderByWMSOrderHeaderTest.php
  87. 6 0
      tests/Services/OrderService/SyncOrderTest.php
  88. 51 0
      tests/Services/OwnerService/GetOwnerByCodesTest.php
  89. 63 0
      tests/Services/ShopService/GetShopByCodeMapTest.php
  90. 1 0
      tests/Services/WarehouseService/GetByWmsOrderTest.php
  91. 54 0
      tests/Services/WarehouseService/GetWareHouseByCodeTest.php
  92. 0 0
      tests/TestCase.php

+ 3 - 2
app/Console/Commands/CreateOwnerBillReport.php

@@ -46,7 +46,8 @@ class CreateOwnerBillReport extends Command
             $year--;
             $lastMonth = '12';
         }else $lastMonth = ($month-1) < 10 ? "0".($month-1) : ($month-1);
-        $bills = DB::select(DB::raw("select owner_id,SUM(work_fee)+SUM(logistic_fee) as total from owner_fee_details where worked_at like ? GROUP BY owner_id"),[$year."-".$lastMonth."%"]);
+        $sql = "SELECT owner_id,SUM(work_fee)+SUM(logistic_fee) AS total FROM owner_fee_details WHERE worked_at LIKE ? AND (type = '发货' AND logistic_fee IS NOT NULL AND work_fee IS NOT NULL) OR (type <> '发货' AND work_fee IS NOT NULL)  GROUP BY owner_id";
+        $billDetails = DB::select(DB::raw($sql),[$year."-".$lastMonth."%"]);
 
         $areas = OwnerAreaReport::query()->with("ownerStoragePriceModel")->where("counting_month","like",$year."-".$lastMonth."%")->get();
         $map = [];
@@ -62,7 +63,7 @@ class CreateOwnerBillReport extends Command
             }
         }
 
-        $chunks = array_chunk($bills,50);
+        $chunks = array_chunk($billDetails,50);
         foreach ($chunks as $bills){
             $date = date('Y-m-d H:i:s');
             $createOwnerBillReport = [];

+ 16 - 8
app/Console/Commands/SyncWMSOrderTask.php

@@ -38,6 +38,8 @@ class SyncWMSOrderTask extends Command
      */
     public function handle()
     {
+        $is_enabled= config('sync.order_sync.cache_prefix.enabled');
+        if($is_enabled=='false')return;
         $this->syncCreatedOrder();
         $this->syncUpdatedOrder();
     }
@@ -52,24 +54,27 @@ class SyncWMSOrderTask extends Command
         $newest_list    = config('sync.order_sync.cache_prefix.newest_list');
         $hasKey         = config('sync.order_sync.cache_prefix.newest_has');
         $prefixKey      = config('sync.order_sync.cache_prefix.newest');
-
+        ini_set('memory_limit', '512M');
         $orderService = app('OrderService');
         $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
 
-        $last_date = $orderService->getOrderSyncAt($newest,'newest');                              // 获取时间点
-        $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnStartDate($last_date);           // WMS订单
-        if(!$orderHeaders)return;
+        $last_date = $orderService->getOrderSyncAt($newest,'newest');                             // 获取时间点
+
+        $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnStartDate($last_date);               // WMS订单
+        if($orderHeaders->count()==0)return;
         $last_order = $orderHeaders->first();                                                           // 时间点靠后的
-        $renewal_orders = $orderHeaders->where('addtime',$last_order->addtime);
+        $newest_orders = $orderHeaders->where('addtime',$last_order->addtime);
 
         $orderHeaders = $orderService->filterOrderByCache($orderHeaders,$newest_list);                  // 对比缓存
 
-        if(count($orderHeaders)>0 && count($orderHeaders) >0){
+        if(count($newest_orders)>0 && count($orderHeaders) >0){
+
             $orderService->syncOrder($orderHeaders);                                                //  同步订单
             $orderService->cancelOrderCache($newest_list,$prefixKey);                                   //  清除缓存
-            $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$newest_list);             //  添加缓存
+            $orderService->pushOrderCache($newest_orders,$prefixKey,$hasKey,$newest_list);              //  添加缓存
             $orderService->setOrderSyncAt($newest,$last_order->addtime,count($orderHeaders)>0);   //  更新时间
         }
+
     }
 
     public function syncUpdatedOrder()
@@ -82,20 +87,23 @@ class SyncWMSOrderTask extends Command
         $renewal_list   = config('sync.order_sync.cache_prefix.renewal_list');
         $hasKey         = config('sync.order_sync.cache_prefix.renewal_has');
         $prefixKey      = config('sync.order_sync.cache_prefix.renewal');
+        ini_set('memory_limit', '512M');
 
         $orderService = app('OrderService');
         $oracleDOCOrderHeaderService = app('OracleDocOrderHeaderService');
 
         $last_date = $orderService->getOrderSyncAt($renewal,'renewal');                               // 获取时间点
+
         $orderHeaders = $oracleDOCOrderHeaderService->getWMSOrderOnEditDate($last_date);                   // WMS订单
 
-        if(!$orderHeaders)return;
+        if($orderHeaders->count()==0)return;
         $renewal_order = $orderHeaders->first();                                                            // 时间点靠后的
         $renewal_orders =  $orderHeaders->where('edittime',$renewal_order->edittime);
 
         $orderHeaders = $orderService->filterOrderByCache($orderHeaders,$renewal_list);                     // 对比缓存
 
         if(count($renewal_orders)>0 && count($orderHeaders)>0){
+
             $orderService->syncOrder($orderHeaders);                                                    // 同步订单
             $orderService->cancelOrderCache($renewal_list,$prefixKey);                                      // 清除缓存
             $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list);                // 添加缓存

+ 8 - 17
app/Http/Controllers/LogController.php

@@ -7,6 +7,7 @@ use App\Services\LogService;
 use Exception;
 use Illuminate\Contracts\Foundation\Application;
 use Illuminate\Contracts\Pagination\LengthAwarePaginator;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Http\Response;
@@ -34,7 +35,8 @@ class LogController extends Controller
             !$request->has('created_at_end') &&
             !$request->has('operation') &&
             !$request->has('type') &&
-            !$request->has('description')
+            !$request->has('description') &&
+            !$request->has("is_exception")
         ) {
             $logs = Log::query()
                 ->orderBy('id', 'desc')
@@ -65,6 +67,11 @@ class LogController extends Controller
         if ($request->has('created_at_end')) {
             $query->where('created_at', '<=', $request->created_at_end);
         }
+        if ($request->has("is_exception")){
+            $query->where(function(Builder $query){
+                $query->where("type","like","ERROR%")->orWhere("type","like","EXCEPTION%");
+            });
+        }
         $query->orderByDesc('id');
         $logs = $query->paginate($request->paginate??50);
         return view('maintenance.log.index', ['logs' => $logs]);
@@ -81,22 +88,6 @@ class LogController extends Controller
         return view('maintenance.log.show', ['log' => $log]);
     }
 
-
-    /**
-     * Remove the specified resource from storage.
-     *
-     * @param Log $log
-     * @return array|Response
-     * @throws Exception
-     */
-    public function destroy(Log $log)
-    {
-//        if(!Gate::allows('物流公司-删除')){ return redirect(url('/'));  }
-//        app('LogService')->log(__METHOD__,__FUNCTION__,$log->toJson(),Auth::user()['id']);
-//        $re=$log->delete();
-//        return ['success'=>$re];
-    }
-
     public function syncRedisLogs()
     {
         LogService::syncRedisLogs();

+ 35 - 0
app/Http/Controllers/OrderCommodityAssignController.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Imports\UpdatePickZone;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Gate;
+use Maatwebsite\Excel\Facades\Excel;
+
+class OrderCommodityAssignController extends Controller
+{
+    public function index()
+    {
+        if(!Gate::allows('商品配置-查询')){ return redirect(url('denied'));  }
+        $assigns = app("OrderCommodityAssignService")->paginate();
+        return view("order.index.index",compact("assigns"));
+    }
+
+    public function import(Request $request)
+    {
+        if(!Gate::allows('商品配置-编辑')){ return ["success"=>false,"data"=>"无权操作!"];  }
+        $fileSuffix=$request->file('file')->getClientOriginalExtension();
+        if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
+            return ['success'=>false,'data'=>'不支持该文件类型'];
+        ini_set('max_execution_time',2500);
+        ini_set('memory_limit','1526M');
+        $fileSuffix = ucwords($fileSuffix);
+
+        Excel::import(new UpdatePickZone(),$request->file('file')->path(),null,$fileSuffix);
+        if (Cache::has('commodityAssign'))return Cache::pull('commodityAssign');
+
+        return ["success"=>false,"data"=>"导入发生错误,数据无响应"];
+    }
+}

+ 7 - 1
app/Http/Controllers/StoreCheckingReceiveController.php

@@ -390,7 +390,7 @@ class StoreCheckingReceiveController extends Controller
         if(!Gate::allows('入库管理-盘收一体-盘收-编辑')){ return ['success'=>false, 'data'=>'无权操作!'];  }
         $id = $request->id ?? null;
         $counted_amount = $request->counted_amount ?? null;
-        if (!$id || !$counted_amount)return ['success'=>false, 'data'=>'参数传递错误!'];
+        if (!$id)return ['success'=>false, 'data'=>'参数传递错误!'];
         $item = app('StoreCheckingReceiveItemService')->find($id);
         if (!$item)return ['success'=>false, 'data'=>'被盘项不存在'];
         $params = ["counted_amount"=>$counted_amount];
@@ -435,4 +435,10 @@ class StoreCheckingReceiveController extends Controller
             app('LogService')->log(__METHOD__,"修改差异状态",json_encode($scr,JSON_UNESCAPED_UNICODE));
         }
     }
+
+    public function destroyItem(Request $request)
+    {
+        if (app("StoreCheckingReceiveItemService")->destroy($request->input("id")))return ["success"=>true];
+        return ["success"=>false,"data"=>"删除失败"];
+    }
 }

+ 7 - 28
app/Http/Controllers/TestController.php

@@ -12,7 +12,6 @@ use App\Console\Commands\SyncWMSOrderTask;
 use App\Events\CancelOrder;
 use App\Imports\OrderTrackingImport;
 use App\InventoryAccount;
-use App\Jobs\OrderCreateInstantBill;
 use App\LaborReport;
 use App\Log;
 use App\Logistic;
@@ -47,12 +46,11 @@ use App\Services\OrderService;
 use App\Services\OrderTrackingOwnerService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerService;
-use App\Services\ProvinceService;
+use App\Services\ShopService;
 use App\Services\StoreService;
 use App\Services\WarehouseService;
 use App\StoreCheckingReceiveItem;
 use App\User;
-use App\ValueStore;
 use App\Warehouse;
 use App\Waybill;
 use App\WaybillPriceModel;
@@ -144,33 +142,13 @@ class TestController extends Controller
     }
 
     public function test4(){
-        $order = Order::query()->whereHas("packages",function ($query){
-            /** @var Builder $query */
-            $query->whereHas("commodities",function ($query){
-                /** @var Builder $query */
-                $query->whereHas("commodity",function ($query){
-                    /** @var Builder $query */
-                    $query->whereNotNull("name");
-                });
-            });
-        })->first();
-        OrderCreateInstantBill::dispatch($order);
+        $arr=[['id'=>3],['id'=>33],];
+        dd(data_get($arr,'*.id'));
     }
     public function t($a)
     {
-        dd(json_encode(
-            [[
-                "taskMode"      => 8,
-                "bins"=>[[
-                    "taskCode"  =>"TEST-BS2011160004",
-                    "binCode"   => "TESTBINCODE-0",
-                    "fromLocCode" => "BIN-IN1",
-                    //"toLocCode" => "BIN-OUT1",
-                ]],
-                "groupCode"     => 4,
-                "priority"      => 20,
-                "sequenceFlag"  => -1,
-            ]]        ));
+        $r = new \ReflectionClass('App\Http\Controllers\UnitsController');
+        dd($r->getMethods(),$r->getConstants());
     }
 
     public function updateLaborRemark(){
@@ -1194,9 +1172,10 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
     }
 
     public function OrderSync(){
+        dump(Carbon::now());
         $tack = new SyncWMSOrderTask();
         $tack->handle();
-        dump(11);
+        dump(Carbon::now());
     }
 
     public function reNewBatches3()

+ 153 - 0
app/Imports/UpdatePickZone.php

@@ -0,0 +1,153 @@
+<?php
+
+namespace App\Imports;
+
+use App\OracleDOCOrderDetail;
+use App\Services\LogService;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+use Maatwebsite\Excel\Concerns\ToCollection;
+use Maatwebsite\Excel\Concerns\WithHeadingRow;
+use Maatwebsite\Excel\Imports\HeadingRowFormatter;
+
+HeadingRowFormatter::default('none');
+class UpdatePickZone implements ToCollection,WithHeadingRow
+{
+    /**
+    * @param Collection $collection
+    * @return bool
+    * @throws
+    */
+    public function collection(Collection $collection)
+    {
+        $row = $collection->first();
+        $headers = ["订单编号","商品条码","数量","生产日期","失效日期"];
+        foreach ($headers as $header){
+            if (!isset($row[$header])){
+                Cache::put("commodityAssign",["success"=>false, "data"=>"表头不存在“".$header."”"],86400);
+                return false;
+            }
+        }
+
+        $errors = [];
+        $ids = [];
+        foreach ($collection as $index=>$item){
+            if ($item["生产日期"]) $item["生产日期"] = formatExcelDate($item["生产日期"]);
+            if ($item["失效日期"]) $item["失效日期"] = formatExcelDate($item["失效日期"]);
+
+            if (!$item["订单编号"]){
+                $errors[] = "第“" . ($index + 2) . "”行订单编号为空";
+                continue;
+            }
+            if (!$item["商品条码"]){
+                $errors[] = "第“" . ($index + 2) . "”行商品条码为空";
+                continue;
+            }
+            if (!$item["生产日期"] && !$item["失效日期"]){
+                $errors[] = "第“" . ($index + 2) . "”行不存在日期";
+                continue;
+            }
+            $detail = OracleDOCOrderDetail::query()->select("customerid","sku")
+                ->where("orderno",$item["订单编号"])
+                ->whereHas("sku",function ($query)use($item){
+                    /** @var Builder $query */
+                    $query->where("alternate_sku1",$item["商品条码"]);
+                })->first();
+            if (!$detail){
+                $errors[] = "第“" . ($index + 2) . "”行未知订单商品";
+                continue;
+            }
+            $sql = "select INV_LOT_LOC_ID.LOCATIONID,INV_LOT_LOC_ID.LOTNUM,BAS_LOCATION.PICKZONE,INV_LOT_LOC_ID.QTY from INV_LOT_ATT LEFT JOIN
+                        INV_LOT_LOC_ID ON INV_LOT_ATT.LOTNUM = INV_LOT_LOC_ID.LOTNUM LEFT JOIN BAS_LOCATION ON INV_LOT_LOC_ID.LOCATIONID = BAS_LOCATION.LOCATIONID
+                    where INV_LOT_ATT.LOTNUM in (select LOTNUM from INV_LOT_LOC_ID where CUSTOMERID = ? AND SKU = ? GROUP BY LOTNUM)";
+            $bindings = [$detail->customerid,$detail->sku];
+            if ($item["生产日期"]){
+                $sql .= " AND LOTATT01 = ?";
+                $bindings[] = $item["生产日期"];
+            }else $sql .= " AND LOTATT01 IS NULL";
+            if ($item["失效日期"]){
+                $sql .= " AND LOTATT02 = ?";
+                $bindings[] = $item["失效日期"];
+            }else $sql .= " AND LOTATT02 IS NULL";
+
+            $lot = DB::connection("oracle")->select(DB::raw($sql),$bindings);
+            if (!$lot){
+                $errors[] = "第“" . ($index + 2) . "”行未找到库位";
+                continue;
+            }
+            $result = null;
+            if (count($lot)>1){
+                $min = null;
+                $max = null;
+                $map = [];
+                foreach ($lot as $i => $l){
+                    $qty = (int)$l->quty;
+                    $map[$qty] = $i;
+                    if ($qty >= (int)$item["数量"] && $qty<=$max)$max = $qty;
+                    if ($qty < (int)$item["数量"] && $qty>=$min)$min = $qty;
+                }
+                if ($max !== null)$result = $lot[$map[$max]];
+                else $result = $lot[$map[$min]];
+            }
+            if (count($lot) == 1)$result = $lot[0];
+            if ($result){dd($result);
+                try{
+                    $detail->update([
+                        "lotnum" => $result->lotnum,
+                        "pickzone" => $result->pickzone,
+                        "kitreferenceno" => '0',
+                        "d_edi_09" => '0',
+                        "d_edi_10" => '0',
+                    ]);
+                    DB::connection("oracle")->commit();
+                    LogService::log(__METHOD__,"SUCCESS-指定效期分配修改库位",json_encode($detail)." | ".json_encode($result));
+                    $order = app("OrderService")->first(["code"=>$item["订单编号"]]);
+                    if (!$order){
+                        $errors[] = "第“" . ($index + 2) . "”行已成功修改FLUX库位但在本地未找到订单";
+                        continue;
+                    }
+                    $barcode = app("CommodityBarcodeService")->first(["code"=>$item["商品条码"]]);
+                    if (!$barcode){
+                        $errors[] = "第“" . ($index + 2) . "”行已成功修改FLUX库位但在本地未找到条码";
+                        continue;
+                    }
+                    $model = app("OrderCommodityAssignService")->create([
+                        "order_id"      =>  1,//$order->id,
+                        "commodity_id"  =>  1,//$barcode->commodity_id,
+                        "amount"        =>  $item["数量"],
+                        "produced_at"   =>  $item["生产日期"],
+                        "valid_at"      =>  $item["失效日期"],
+                        "batch_number"  =>  $result->lotnum,
+                        "location"      =>  $result->locationid,
+                        "region"        =>  $result->pickzone,
+                        "user_id"       =>  Auth::id(),
+                    ]);
+                    LogService::log(__METHOD__,"SUCCESS-生成配置记录",json_encode($model));
+                    $ids[] = $model->id;
+                }catch (\Exception $e){
+                    LogService::log(__METHOD__,"ERROR-指定效期分配修改库位",json_encode($detail)." | ".json_encode($result));
+                }
+            }else $errors[] = "第“" . ($index + 2) . "”行未找到可分配库位";
+        }
+        $assigns = app("OrderCommodityAssignService")->get(["id"=>$ids]);
+        $models = [];
+        foreach ($assigns as $assign){
+            $models[] = [
+                "orderNumber"   => $assign->order ? $assign->order->code : '',
+                "barcode"       => $assign->commodity ? $assign->commodity->barcode : '',
+                "amount"        => $assign->amount,
+                "producedAt"    => $assign->produced_at,
+                "validAt"       => $assign->valid_at,
+                "batchNumber"   => $assign->batch_number,
+                "location"      => $assign->location,
+                "region"        => $assign->region,
+                "createdAt"     => $assign->created_at,
+                "userName"      => $assign->user ? $assign->user->name : 'system',
+            ];
+        }
+        Cache::put("commodityAssign",["success"=>true,"data"=>$models,"errors"=>$errors]);
+    }
+}

+ 44 - 0
app/Jobs/ProcessCreateInstantBill.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Process;
+use App\Services\LogService;
+use App\Services\ProcessService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcessCreateInstantBill implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $process;
+    /**
+     * Create a new job instance.
+     *
+     * @param Process $process
+     * @return void
+     */
+    public function __construct(Process $process)
+    {
+        $this->process = $process;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @param ProcessService $service
+     * @return void
+     */
+    public function handle(ProcessService $service)
+    {
+        try{
+            $service->createInstantBill($this->process);
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-入库生成即时账单",$this->process->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 45 - 0
app/Jobs/StoreCreateInstantBill.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Services\LogService;
+use App\Services\StoreService;
+use App\Store;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class StoreCreateInstantBill implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+
+    protected $store;
+    /**
+     * Create a new job instance.
+     *
+     * @param Store $store
+     * @return void
+     */
+    public function __construct(Store $store)
+    {
+        $this->store = $store;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @param StoreService $service
+     * @return void
+     */
+    public function handle(StoreService $service)
+    {
+        try{
+            $service->createInstantBill($this->store);
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-入库生成即时账单",$this->store->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 7 - 0
app/Log.php

@@ -4,6 +4,7 @@ namespace App;
 
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;
+use Illuminate\Support\Str;
 
 class Log extends Model
 {
@@ -19,4 +20,10 @@ class Log extends Model
         }
         return '';
     }
+    public function getExceptionMarkAttribute(){
+        if (Str::upper(substr($this->type,0,1)) != 'E')return 'N';
+        if (Str::upper(substr($this->type,0,5)) == 'ERROR' || Str::upper(substr($this->type,0,9)) == 'EXCEPTION')
+            return 'Y';
+        return 'N';
+    }
 }

+ 3 - 0
app/OracleDOCOrderHeader.php

@@ -50,4 +50,7 @@ class OracleDOCOrderHeader extends Model
     public function hasUn(){
         return $this->hasMany('App\OracleDOCOrderDetail','orderno','orderno');
     }
+    public function orderType(){
+        return $this->hasOne('App\OracleBasCode','code','ordertype')->where('codeid','SO_TYP');
+    }
 }

+ 4 - 1
app/Order.php

@@ -14,7 +14,8 @@ class Order extends Model
         'id', 'batch_id',  'owner_id', 'status',
         'created_at', 'code', 'shop_id',  'client_code',
         'logistic_id', 'consignee_name', 'consignee_phone', 'province',
-        'city', 'district', 'address', 'wms_status','warehouse_id','wms_edittime'];
+        'city', 'district', 'address','warehouse_id',
+        'wms_edittime', 'wms_status','order_type'];
 
     /*
      * wms订单号             code=>DOC_ORDER_HEADER[orderno]
@@ -148,6 +149,7 @@ class Order extends Model
             $this['client_code'] = $order['client_code'] &&
             $this['wms_status'] == $order['wms_status'] &&
             $this['wms_edittime'] == $order['wms_edittime'] &&
+            $this['order_type'] == $order['order_type'] &&
             (string)$this['created_at'] == (string)$order['created_at'];
     }
 
@@ -167,6 +169,7 @@ class Order extends Model
         $this['client_code'] = $order['client_code'] ;
         $this['wms_status'] = $order['wms_status'] ;
         $this['wms_edittime'] = $order['wms_edittime'];
+        $this['order_type'] = $order['order_type'];
         $this['created_at'] =$order['created_at'];
     }
 }

+ 33 - 0
app/OrderCommodityAssign.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class OrderCommodityAssign extends Model
+{
+    protected $fillable = [
+        "order_id",         //外键订单
+        "commodity_id",     //外键商品
+        "amount",           //数量  default 0
+        "produced_at",      //生产日期
+        "valid_at",         //失效日期
+        "batch_number",     //批次号
+        "location",         //库位
+        "region",           //库区
+        "user_id",          //操作人
+    ];
+
+    public function order()
+    {   //订单
+        return $this->hasOne(Order::class,"id","order_id");
+    }
+    public function commodity()
+    {   //商品
+        return $this->hasOne(Commodity::class,"id","commodity_id");
+    }
+    public function user()
+    {   //用户
+        return $this->hasOne(User::class,"id","user_id");
+    }
+}

+ 4 - 2
app/Providers/AppServiceProvider.php

@@ -2,7 +2,6 @@
 
 namespace App\Providers;
 
-use App\Customer;
 use App\Http\Controllers\Controller;
 use App\Services\AuthorityService;
 use App\Services\CacheService;
@@ -22,8 +21,9 @@ use App\Services\OracleBasCustomerService;
 use App\Services\OracleBasSkuService;
 use App\Services\OracleDocAsnDetailService;
 use App\Services\OracleDOCOrderHeaderService;
+use App\Services\OrderCommodityService;
+use App\Services\OrderCommodityAssignService;
 use App\Services\OrderCountingRecordService;
-use App\Services\OracleDocAsnHerderService;
 use App\Services\OrderIssuePerformanceService;
 use App\Services\AllInventoryService;
 use App\Services\InventoryDailyLogService;
@@ -172,6 +172,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OwnerPriceExpressService',OwnerPriceExpressService::class);
         app()->singleton('OwnerPriceLogisticService',OwnerPriceLogisticService::class);
         app()->singleton('OwnerPriceDirectLogisticService',OwnerPriceDirectLogisticService::class);
+        app()->singleton('OrderCommodityAssignService',OrderCommodityAssignService::class);
 
         $this->loadingOrderModuleService();
         $this->loadingBasedModuleService();
@@ -193,6 +194,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('OracleDocOrderHeaderService',OracleDOCOrderHeaderService::class);
         app()->singleton('OracleActAllocationDetailService',OracleActAllocationDetailService::class);
         app()->singleton('OrderIssueProcessLogService',OrderIssueProcessLogService::class);
+        app()->singleton('OrderCommodityService',OrderCommodityService::class);
     }
 
     private function loadingBasedModuleService(){

+ 1 - 0
app/Services/BatchService.php

@@ -43,6 +43,7 @@ Class BatchService
     {
         $this->stationTaskBatchService=app('StationTaskBatchService');
         $stationTaskBatches=$this->stationTaskBatchService->createByBatches($batches);
+
     }
 
 }

+ 124 - 0
app/Services/CommodityService.php

@@ -8,12 +8,20 @@ use App\CommodityBarcode;
 use App\OracleBasSKU;
 use App\Owner;
 use App\Services\common\BatchUpdateService;
+use App\Shop;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Cache;
 
 Class CommodityService
 {
+    /** @var CacheService $cacheService */
+    private $cacheService;
+    function __construct(){
+        $this->cacheService=app('CacheService');
+    }
+
     public function firstOrCreate($param,$column = null):Commodity{
         if ($column) return Commodity::query()->firstOrCreate($param,$column);
         return Commodity::query()->firstOrCreate($param);
@@ -332,4 +340,120 @@ Class CommodityService
         if ($query->count() > 0)return true;
         return false;
     }
+
+    public function getCommoditiesByMap($map)
+    {
+        /**
+         * @var OwnerService $ownerService
+         * @var OracleBasSkuService $oracleBasSkuService
+         */
+        $ownerService = app('OwnerService');
+        $oracleBasSkuService = app('OracleBasSkuService');
+
+        $commodities_map = (function()use($map){
+            $commodities_map = [];
+            if(count($map)==0)return $commodities_map;
+            Commodity::query()->with("owner")->whereIn('sku',array_unique(data_get($map,'*.sku')))->whereHas('owner',function($query)use($map){
+                $query->whereIn('code',array_unique(data_get($map,'*.owner_code')));
+            })->get()->each(function($commodity)use(&$commodities_map){
+                $commodities_map[json_encode(['owner_code' => $commodity['owner']['code'], 'sku' => $commodity['sku']])] = $commodity;
+            });
+            return $commodities_map;
+        })();
+
+        $owner_codes = (function()use($map){
+            $owner_codes = [];
+            if(count($map) == 0)return $owner_codes;
+            foreach ($map as $item) {
+                $owner_codes[$item['owner_code']] = $item['owner_code'];
+            }
+            return $owner_codes;
+        })();
+
+        $owner_map = (function()use($ownerService,$owner_codes){
+            $owners = $ownerService->getOwnerByCodes($owner_codes);
+            $map = [];
+            $owners->each(function ($owner)use(&$map){
+                $map[$owner['code']] = $owner['id'];
+            });
+            return $map;
+        })();
+
+        $collect = collect();
+        if(count($map) == 0) return $collect;
+        $unexists = [];$sku = [];$owner_code = [];
+
+        foreach ($map as $item) {
+            $owner = Cache::get("owner_code_{$item['owner_code']}_sku_{$item['sku']}");
+            if($owner){
+                $collect->push($owner);
+                continue;
+            }
+            $key = json_encode( ['owner_code' => $item['owner_code'], 'sku' => $item['sku']]);
+            if(!empty($commodities_map[json_encode($key)])){
+                 $commodities_map[$key];
+                continue;
+            }
+            $unexists[json_encode($key)] = true;
+            $sku[] = $item['sku'];
+            $owner_code[] = $item['owner_code'];
+        }
+
+        if(count($unexists) == 0)return $collect;
+        $BasSKUs = $oracleBasSkuService->get( ['SKU'=>$sku,'CustomerID'=>$owner_code]);
+        $BasSKUs = $BasSKUs->filter(function($bas_sku)use($unexists,$commodities_map){
+            $arr = [
+                'owner_code' => $bas_sku['customerid'],
+                'sku' => $bas_sku['sku']
+            ];
+            $key = json_encode($arr);
+            if(!empty($commodities_map($key)))return false;
+            return $unexists[json_encode($arr)] ?? false;
+        });
+        $inner_params = (function()use($BasSKUs,$owner_map){
+            $map = [];
+            $date = Carbon::now();
+            $BasSKUs->each(function($basSku)use(&$map,$owner_map,$date){
+                $map[] = [
+                    'owner_id' => $owner_map[$basSku['customerid']] ?? '',
+                    'sku' => $basSku->sku,
+                    'name' =>$basSku->descr_c,
+                    'length' =>$basSku->skulength,
+                    'width' => $basSku->skuwidth,
+                    'height' => $basSku->skuhigh,
+                    'volumn' => $basSku->cube,
+                    'created_at' => $date,
+                    'updated_at' => $date,
+                ];
+            });
+            return $map;
+        })();
+        if(count($inner_params)==0)return $collect;
+        foreach (array_chunk($inner_params,4000) as $item) {
+            try {
+                $bool = Commodity::query()->insert($item);
+                if($bool){
+                    app('LogService')->log(__METHOD__,__FUNCTION__,"批量添加 Commodity Success ".count($inner_params).' || '.json_encode($inner_params));
+                    $commodities = Commodity::query()->with('owner')->whereIn('owner_id',data_get($item,'*.owner_id'))->whereIn('sku',data_get($item,'*.sku'))->get();
+                    $this->pushToCache($commodities);
+                    $collect = $collect->concat($commodities);
+                }
+                else app('LogService')->log(__METHOD__,__FUNCTION__,"批量添加 Commodity FAILED ".' || '.json_encode($inner_params));
+            } catch (\Exception $e) {
+                app('LogService')->log(__METHOD__,__FUNCTION__,"批量添加 Commodity ERROR ".' || '.json_encode($inner_params).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
+            }
+        }
+        return $collect;
+    }
+
+    private function pushToCache($commodities)
+    {
+        if (count($commodities) < 1) return null;
+        foreach ($commodities as $commodity) {
+            $commodity_key = "owner_code_{$commodity['owner']['code']}_sku_{$commodity['sku']}";
+            Cache::remember($commodity_key, config('cache.expirations.forever'), function () use ($commodity) {
+                return $commodity;
+            });
+        }
+    }
 }

+ 20 - 0
app/Services/LogisticService.php

@@ -4,9 +4,11 @@ namespace App\Services;
 
 use App\Logistic;
 use App\OracleBasCustomer;
+use App\Shop;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Str;
 
 Class LogisticService
@@ -88,5 +90,23 @@ Class LogisticService
         return Logistic::query()->find($id);
     }
 
+    public function getLogisticByCodes($codes)
+    {
+        $collect = collect();
+        if(count($codes) == 0) return $collect;
+        foreach ($codes as $code) {
+            $collect->push(Cache::remember("getLogisticByCodes_{$code}", config('database.cache.expirations.rand'), function()use($code){
+                $logistic = Logistic::query()->where('code',$code)->first();
+                if($logistic)return $logistic;
+                $baseCustomers = OracleBasCustomer::query()
+                    ->selectRaw('Customer_Type,CustomerID,Descr_C')
+                    ->where('Customer_Type','CA')
+                    ->where('CustomerID',$code)->first();
+                if(!$baseCustomers)return null;
+                return Logistic::query()->create(['name' => $baseCustomers['descr_c'], 'code' => $baseCustomers['customerid']]);
+            }));
+        }
+        return $collect;
+    }
 
 }

+ 8 - 3
app/Services/OracleDOCOrderHeaderService.php

@@ -20,7 +20,7 @@ Class OracleDOCOrderHeaderService
         'DOC_Order_Header.CarrierName', 'DOC_Order_Header.LastShipmentTime','DOC_Order_Header.EDISendFlag',
         'DOC_Order_Header.SOReference5', 'DOC_Order_Header.C_Tel2','DOC_Order_Header.Transportation',
         'DOC_Order_Header.WareHouseId','DOC_Order_Header.SOStatus','DOC_Order_Header.C_Tel1','DOC_Order_Header.C_District',
-        'DOC_Order_Header.IssuePartyName'
+        'DOC_Order_Header.IssuePartyName','DOC_Order_Header.OrderType'
     ];
 
     function first(array $params){
@@ -71,13 +71,16 @@ Class OracleDOCOrderHeaderService
             ->with(['oracleBASCustomer'=>function($query){
                 $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
             },'oracleDOCOrderDetails'=>function($query){
-                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location');
             }, 'actAllocationDetails'=>function($query){
                 $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
             },'oracleBASCode'=>function($query){
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            },'orderType'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
             ->where('DOC_Order_Header.addTime','>=',$startDate)
+            ->whereColumn('DOC_Order_Header.editTime','=','DOC_Order_Header.addTime')
             ->orderByDesc('DOC_Order_Header.addTime')
             ->get();
     }
@@ -87,11 +90,13 @@ Class OracleDOCOrderHeaderService
             ->with(['oracleBASCustomer'=>function($query){
                 $query->selectRaw('BAS_CUSTOMER.CustomerID,BAS_CUSTOMER.Customer_Type,BAS_CUSTOMER.Descr_C,BAS_CUSTOMER.Active_Flag');
             },'oracleDOCOrderDetails'=>function($query){
-                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered');
+                $query->selectRaw('doc_order_details.orderNo,doc_order_details.customerid,doc_order_details.sku,doc_order_details.QtyOrdered,doc_order_details.Location');
             }, 'actAllocationDetails'=>function($query){
                 $query->selectRaw('ACT_Allocation_Details.AllocationDetailsID,ACT_Allocation_Details.OrderNo,ACT_Allocation_Details.Qty_Each,ACT_Allocation_Details.PickToTraceID,ACT_Allocation_Details.CustomerID,ACT_Allocation_Details.Sku');
             },'oracleBASCode'=>function($query){
                 $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
+            },'orderType'=>function($query){
+                $query->selectRaw('BAS_Codes.CodeID,BAS_Codes.CodeName_C,BAS_Codes.Code');
             }])
             ->where('DOC_Order_Header.editTime','>=',$startDate)
             ->whereColumn('DOC_Order_Header.editTime','!=','DOC_Order_Header.addTime')

+ 31 - 0
app/Services/OrderCommodityAssignService.php

@@ -0,0 +1,31 @@
+<?php 
+
+namespace App\Services; 
+
+use App\OrderCommodityAssign;
+
+Class OrderCommodityAssignService
+{ 
+
+    public function paginate(array $params = null)
+    {
+        $query = OrderCommodityAssign::query()->with(["order","commodity.barcodes","user"])->orderByDesc("id");
+        return $query->paginate($params["paginate"] ?? 50);
+    }
+
+    public function create(array $params)
+    {
+        return OrderCommodityAssign::query()->create($params);
+    }
+
+    public function get(array $params)
+    {
+        $query = OrderCommodityAssign::query()->with(["order","commodity.barcodes","user"]);
+        foreach ($params as $column=>$param){
+            if (is_array($param))$query->whereIn($column,$param);
+            else $query->where($column,$param);
+        }
+        return $query->get();
+    }
+
+}

+ 212 - 0
app/Services/OrderCommodityService.php

@@ -0,0 +1,212 @@
+<?php
+
+namespace App\Services;
+
+use App\Order;
+use App\OrderCommodity;
+use Carbon\Carbon;
+
+Class OrderCommodityService
+{
+    public function syncOrderCommodities(&$orderHeaders)
+    {
+        /**
+         * @var CommodityService $commodityService
+         * @var OwnerService $ownerService
+         */
+        $commodityService = app('CommodityService');
+        $ownerService = app('OwnerService');
+        if(count($orderHeaders) == 0)return ;
+        $order_nos = array_unique(data_get($orderHeaders,'*.orderno'));
+        $commodities_map = [];$owners_id_maps = [];
+        $owner_code_maps = (function()use(&$ownerService,&$orderHeaders,&$owners_id_maps){
+            $customer_ids= array_unique(data_get($orderHeaders,'*.customerid'));
+            $owners = $ownerService->getOwnerByCodes($customer_ids);
+            $owner_code_maps = [];
+            if(count($owners) == 0)return $owner_code_maps;
+            foreach ($owners as $owner) {
+                $owner_code_maps[$owner['code']]= $owner['id'];
+                $owners_id_maps[$owner['id']] =  $owner['code'];
+            }
+            return $owner_code_maps;
+        })();
+        // 重组OrderDetails
+        $orderDetails_map = (function()use(&$orderHeaders,&$owner_code_maps,&$commodities_map){
+            $map = [];
+            if(count($orderHeaders)==0)return $map;
+            foreach ($orderHeaders as $orderHeader) {
+                $Order_Details = $orderHeader->oracleDOCOrderDetails;
+                $Order_Details->each(function($item)use(&$map,&$owner_code_maps,&$commodities_map){
+                    if(!empty($item['customerid']) && !empty($item['sku'])){
+                        $key = "owner_code_{$item['customerid']}_sku_{$item['sku']}";
+                        $commodities_map[$key] =  ['owner_code'=>$item['customerid'],'sku'=>$item['sku']];
+                    }
+                    $key = "orderno_{$item['orderno']}_sku{$item['sku']}_each_{$item['qtyordered']}_location_{$item['location']}";
+                    if(empty($map[$key]))$map[$key]=[];
+                    $map[$key][] = [
+                        'code' => $item['orderno'],
+                        'sku' => $item['sku'],
+                        'owner_id'=>$owner_code_maps[$item['customerid']],
+                        'amount' => $item['qtyordered'],
+                        'location' => $item['location']
+                    ];
+                });
+            }
+            return $map;
+        })();
+        $commodities = $commodityService->getCommoditiesByMap($commodities_map);
+        $commodities_maps = (function()use($commodities,$owners_id_maps){
+            $map = [];
+            if(count($commodities) == 0)return $map;
+            foreach ($commodities as $commodity) {
+                $owner_code = $owners_id_maps[$commodity['owner_id']];
+                $key ="owner_code_{$owner_code}_sku_{$commodity['sku']}";
+                $map[$key] = $commodity;
+            }
+            return $map;
+        })();
+        $order_id_map = [];
+        $orders_map = (function()use($order_nos,&$order_id_map){
+            $map = [];
+            if(count($order_nos)==0)return $map;
+            $orders = Order::query()->whereIn('code',$order_nos)->get();
+            $orders->each(function($item)use(&$map,&$order_id_map){
+                $map[$item['code']] = ['id'=>  $item['id'], 'owner_id' =>  $item['owner_id']];
+                $order_id_map[$item['id']] = ['code'=>  $item['code'], 'owner_id' =>  $item['owner_id']];
+            });
+            return $map;
+        })();
+        $orderCommodities = OrderCommodity::query()->with('commodity','order')->whereHas('order',function($query)use($order_nos){
+            $query->whereIn('code',$order_nos);
+        })->get();
+
+        $orderCommodities_map = $this->regroupOrderCommodities($orderCommodities);              // 重组orderCommodities
+        $inner_params = $this->filterInnerParams($orderDetails_map,$orderCommodities_map);
+        $del_ids = $this->filterDeleteParams($orderDetails_map,$orderCommodities_map);
+        if(count($inner_params)>0){
+            $inner_arr = array_chunk($inner_params,4000);
+            foreach ($inner_arr as $item) {
+                $created_params = $this->createByInnerParams($item,$orders_map,$commodities_maps,$owners_id_maps);
+                $this->insert($created_params);
+            }
+        }
+        if(count($del_ids)>0){
+            $orderCommodities = OrderCommodity::query()->whereIn('id',$del_ids)->get();
+            $this->batchDelete($orderCommodities);
+        }
+    }
+
+    private function regroupOrderCommodities(&$orderCommodities)
+    {
+        $map = [];
+        if(count($orderCommodities)==0)return $map;
+        foreach ($orderCommodities as $orderCommodity) {
+            $key = "orderno_{$orderCommodity['order']['code']}_sku{$orderCommodity['commodity']['sku']}_each_{$orderCommodity['amount']}_location_{$orderCommodity['location']}";
+            if(empty($map[$key]))$map[$key] =[];
+            $map[$key][] = [
+                'id' =>$orderCommodity['id'],
+                'code' => $orderCommodity['order']['orderno'],
+                'sku' => $orderCommodity['commodity']['sku'],
+                'owner_id' => $orderCommodity['order']['owner_id'],
+                'amount' => $orderCommodity['amount'],
+                'location' => $orderCommodity['location']
+            ];
+        }
+        return $map;
+    }
+
+    private function filterInnerParams(&$orderDetails_map,&$orderCommodities_map)
+    {
+        $inner_params = [];
+        if(count($orderDetails_map) == 0)return $inner_params;
+        foreach ($orderDetails_map as $key=>&$map) {
+            if(empty($orderCommodities_map[$key])){
+                foreach ($map as &$item) {
+                    $inner_params[] = $item;
+                }
+            }elseif(count($map)>count($orderCommodities_map[$key])){
+                foreach ($map as &$obj) {
+                    if($orderCommodities_map[$key]>0)array_shift($orderCommodities_map[$key]);
+                    elseif($orderCommodities_map[$key]==0)$inner_params[] = $obj;
+                }
+            } elseif(count($map)==count($orderCommodities_map[$key]))continue;
+            unset($orderDetails_map[$key]);
+            $map = null;
+        }
+        return $inner_params;
+    }
+    private function filterDeleteParams(&$orderDetails_map,&$orderCommodities_map)
+    {
+        $del_ids = [];
+        if(count($orderDetails_map) == 0)return $del_ids;
+        foreach ($orderCommodities_map as $key=>$map) {
+            if(empty($orderDetails_map[$key])){
+                foreach ($map as &$item) {
+                    $del_ids[] = $item['id'];
+                }
+            }elseif(count($map)>count($orderDetails_map[$key])){
+                foreach ($map as $key1=>&$obj) {
+                    if(count($orderDetails_map[$key]) == 0){
+                        $del_ids [] = $obj['id'];
+                        unset($map[$key1]);
+                    } else{
+                        array_shift($orderDetails_map[$key]);
+                    }
+                }
+            }
+        }
+        return $del_ids;
+    }
+
+    private function createByInnerParams(&$inner_params,&$orders_map,&$commodities_maps,&$owner_id_maps)
+    {
+        $created_params = [];
+        if(count($inner_params) == 0)return $created_params;
+        $data = Carbon::now();
+        foreach ($inner_params as &$item) {
+            $order = $orders_map[$item['code']] ?? false;
+            if(!$order)continue;
+            $owner_code = $owner_id_maps[$item['owner_id']];
+            $key = "owner_code_{$owner_code}_sku_{$item['sku']}";
+            $commodity = $commodities_maps[$key];
+            $created_params[] = [
+                'order_id' =>$order['id'],
+                'commodity_id' =>$commodity['id'],
+                'amount' =>$item['amount'],
+                'location' =>$item['location'],
+                'created_at' =>$data,
+                'updated_at' => $data
+            ];
+        }
+        return $created_params;
+    }
+
+    public function batchDelete($orderCommodities)
+    {
+        if(count($orderCommodities) == 0)return true;
+        try {
+            $bool =  OrderCommodity::destroy(data_get($orderCommodities, '*.id'));
+            if($bool)app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities));
+            else app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities FAULT'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities).' || ');
+            return $bool;
+        } catch (\Exception $e) {
+            app('LogService')->log(__METHOD__,__FUNCTION__,'批量删除 OrderCommodities ERROR'.' || '.count($orderCommodities).' || '.json_encode($orderCommodities).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
+            return false;
+        }
+    }
+
+    public function insert($innerParams){
+        if(!$innerParams)return false;
+        if(count($innerParams)==0)return false;
+        try {
+            $bool = OrderCommodity::query()->insert($innerParams);
+            if ($bool) app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities SUCCESS' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
+            else app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities FAULT' . ' || ' . count($innerParams) . ' || ' . json_encode($innerParams));
+            return $bool;
+        } catch (\Exception $e) {
+            app('LogService')->log(__METHOD__, __FUNCTION__, '批量添加 OrderCommodities ERROR'. ' || ' . count($innerParams) . ' || ' . json_encode($innerParams).' || '.json_encode($e->getMessage()).' || '.json_encode($e->getTraceAsString()));
+            return false;
+        }
+    }
+}
+

+ 15 - 2
app/Services/OrderIssueService.php

@@ -219,6 +219,18 @@ class OrderIssueService
                 }
             });
         }
+        if(isset($condition['sendOrderClientCode'])){
+            $query->whereHas('secondOrder',function($query)use($condition){
+                $this->searchWay($query,$condition['sendOrderClientCode'],'client_code');
+            });
+            $query->orWhere('second_client_no',$condition['sendOrderClientCode']);
+        }
+        if(isset($condition['sendOrderLogisticNumber'])){
+            $query->whereHas('secondOrder.packages',function($query)use($condition){
+                $this->searchWay($query,$condition['sendOrderLogisticNumber'],'logistic_number');
+            });
+            $query->orWhere('second_logistic_number',$condition['sendOrderLogisticNumber']);
+        }
         return $query;
     }
 
@@ -333,7 +345,8 @@ class OrderIssueService
                 'imported_status' => $imported_status,
                 'custom_code' => $custom_code,
                 'hidden_tag' => $hiddenTag,
-                'updated_at' => $data
+                'updated_at' => $data,
+                'created_at' => $data
             ];
         }
         try {
@@ -517,7 +530,7 @@ class OrderIssueService
 
     public function createOrderIssue($logisticNumber, $type, $result_explain, $importedStatus = '正常', $custom_code = null,$hiddenTag = null)
     {
-        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode'])
+        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode','orderType'])
             ->whereHas('actAllocationDetails', function ($query) use ($logisticNumber) {
                 $query->where('picktotraceid', $logisticNumber);
             })->get();

+ 46 - 33
app/Services/OrderPackageCommoditiesService.php

@@ -606,28 +606,48 @@ class OrderPackageCommoditiesService
          * @var DataHandlerService $dataHandService
          * @var CommodityService $commodityService
          * @var OrderPackageService $orderPackageService
+         * @var OwnerService $ownerService
          */
         $dataHandService = app('DataHandlerService');
         $commodityService = app('CommodityService');
         $orderPackageService  = app( 'OrderPackageService');
+        $ownerService  = app( 'OwnerService');
         if(!$orderHeaders)return ;
 
-        $commodityService->getByWmsOrders($orderHeaders);   // 预先处理     3s
+        $map = [];
+        foreach ($orderHeaders as $orderHeader) {
+            $Order_Details = $orderHeader->oracleDOCOrderDetails;
+            $Order_Details->each(function($item)use(&$map){
+                if(!empty($item['customerid']) && !empty($item['sku'])){
+                    $key = "owner_code_{$item['customerid']}_sku_{$item['sku']}";
+                    $map[$key] =  ['owner_code'=>$item['customerid'],'sku'=>$item['sku']];  // 货主编码 sku编码
+                }
+            });
+        }
+        $commodities = $commodityService->getCommoditiesByMap($map);   // 预先处理     3s
         $orderPackages = $orderPackageService->getByWmsOrders($orderHeaders);
         $orderCommodities = $this->getByWmsOrder($orderHeaders);
+        $owner_code_map = [];
+        $owner_id_map = (function()use(&$orderHeaders,&$ownerService,&$owner_code_map){
+            $owner_id_map = [];
+            $owners = $ownerService->getOwnerByCodes(array_unique(data_get($orderHeaders,'*.customerid')));
+            if(count($owners) == 0) return $owner_id_map;
+            foreach ($owners as $owner) {
+                $owner_id_map[$owner['id']] = $owner;
+                $owner_code_map[$owner['code']]  = $owner;
+            }
+            return $owner_id_map;
+        })();
 
         $package_map = $dataHandService->dataHeader(['logistic_number'],$orderPackages);
         $orderCommodities = $this->regroupOrderCommodities($orderCommodities);
-
         $orderAllocationDetails = $this->regroupWmsOrderAllocationDetails($orderHeaders);
         $del_orderCommodities  =[];
-
         $update_params =$this->filterUpdateParams($orderAllocationDetails,$orderCommodities,$del_orderCommodities);                  // 修改
-        $inner_params = $this->filterInnerParams($orderAllocationDetails,$orderCommodities);                              // 创建
+        $inner_params = $this->filterInnerParams($orderAllocationDetails,$orderCommodities);                                            // 创建
         $delete_params = $this->filterDeleteParams($orderAllocationDetails,$orderCommodities);                                           // 删除
-
         if(count($inner_params)>0)
-            $this->createOrderCommodities($inner_params,$package_map);  // 创建 3s
+            $this->createOrderCommodities($inner_params,$package_map,$commodities,$owner_id_map);  // 创建 3s
 
         if(count($update_params)>0)
             $this->updateOrderCommodities($update_params);              // 更新
@@ -750,26 +770,19 @@ class OrderPackageCommoditiesService
         return $del_params;
     }
     // TODO  根据数据创建
-    public function createOrderCommodities($inner_params,$package_map)
+    public function createOrderCommodities(&$inner_params,&$package_map,&$commodities,&$owner_id_map)
     {
         /** @var DataHandlerService $dataHandlerService */
         $dataHandlerService  = app('DataHandlerService');
-        $sku = [];$owners = [];
-        foreach ($inner_params as $inner_param) {
-            $sku_code = $inner_param['sku'];$owner_code = $inner_param['owner_code'];
-            if(!isset($sku[$sku_code]))
-                $sku[$sku_code] = $sku_code;
-            if(!isset($owner_code[$owner_code]))
-                $owners[$owner_code] = $owner_code;
-        }
-        $commodities = Commodity::query()->with('owner')->whereHas('owner',function ($query)use($owners){
-            $query->whereIn('code',$owners);
-        })->whereIn('sku',$sku)->get();
-        $commodity_map = [];
-        foreach ($commodities as $commodity) {
-            $key = ' owner='.$commodity->owner->code.' sku='.$commodity->sku;
-            $commodity_map[$key] = $commodity;
-        }
+        $commodity_map = (function()use(&$commodities,&$owner_id_map){
+            $map = [];
+            foreach ($commodities as $commodity) {
+                $owner = $owner_id_map[$commodity['owner_id']] ;
+                $key = ' owner='.$owner->code.' sku='.$commodity->sku;
+                $map[$key] = $commodity;
+            }
+            return $map;
+        })();
         $create_params =[];
         $date = Carbon::now();
         foreach ($inner_params as $inner_param) {
@@ -786,19 +799,19 @@ class OrderPackageCommoditiesService
             ];
         }
         if(count($create_params)>0){
-            try {
-                $inner_array = array_chunk($create_params,1000);
-                foreach ($inner_array as $item) {
+            $inner_array = array_chunk($create_params,5000);
+            foreach ($inner_array as $item) {
+                try {
                     $bool = $this->insert($item);
-                    LogService::log(__METHOD__,__FUNCTION__,'批量添加 orderCommodity --'. $bool ." || ".count($create_params).' || '.json_encode($create_params));
+                    LogService::log(__METHOD__, __FUNCTION__, '批量添加 orderCommodity ' . ($bool > 0 ? 'SUCCESS' : 'FAULT') . " || " . count($item) . ' || ' . json_encode($create_params));
+                } catch (\Exception $e) {
+                    LogService::log(__METHOD__,__FUNCTION__.'error','批量添加 orderCommodity ERROR'." || ".count($item).' || '.json_encode($item). ' || '.json_encode($e->getMessage()). ' || '.json_encode($e->getTraceAsString()));
                 }
-            } catch (\Exception $e) {
-                LogService::log(__METHOD__,__FUNCTION__.'error','批量添加 orderCommodity error'." || ".count($create_params).' || '.json_encode($create_params));
             }
         }
     }
     // TODO
-    public function updateOrderCommodities($orderCommodities)
+    public function updateOrderCommodities(&$orderCommodities)
     {
         if(!$orderCommodities)return ;
         $updated_at = Carbon::now();
@@ -816,17 +829,17 @@ class OrderPackageCommoditiesService
             $this->batchUpdate($update_params);
     }
     // TODO 删除
-    public function deleteOrderCommodities($orderCommodities){
+    public function deleteOrderCommodities(&$orderCommodities){
         if(!$orderCommodities)return;
         if(count($orderCommodities)==0)return;
         try {
             $ids = data_get($orderCommodities, '*.id');
             if(count($ids) >0){
                 $bool = OrderPackageCommodities::query()->whereIn('id', data_get($orderCommodities, '*.id'))->delete();
-                LogService::log(__METHOD__, __FUNCTION__, '批量删除 OrderCommodity -- ' . $bool . '||' .count($orderCommodities)  . ' || ' . json_encode($orderCommodities));
+                LogService::log(__METHOD__, __FUNCTION__, '批量删除 OrderCommodity '  . ($bool > 0 ? 'SUCCESS' : 'FAULT') .'||' .count($orderCommodities)  . ' || ' . json_encode($orderCommodities));
             }
         } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__.' error', '批量删除 OrderCommodity Error-- ' . $e->getMessage() . '||' . $e->getTraceAsString() );
+            LogService::log(__METHOD__, __FUNCTION__.' error', '批量删除 OrderCommodity Error' . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
         }
 
     }

+ 9 - 1
app/Services/OrderPackageService.php

@@ -392,7 +392,9 @@ class OrderPackageService
          * @var OrderPackageCommoditiesService $OrderPackageCommoditiesService
          */
         $OrderPackageCommoditiesService = app('OrderPackageCommoditiesService');
+
         $this->syncPackageByOrderHeaders($orderHeaders);
+
         $OrderPackageCommoditiesService->syncOrderPackageCommodities($orderHeaders);
     }
     // TODO
@@ -407,16 +409,22 @@ class OrderPackageService
         $orderPackageCommodityService= app('OrderPackageCommoditiesService');
         $orderTrackingService = app('OrderTrackingService');
         if(!$orderHeaders)return;
+
         $orders = $orderService->getByWmsOrders($orderHeaders);
+
         $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno'));          // 已有
+
         $this->createOrderPackage($orderHeaders,$orders,$packages);                     // 创建package
 
         $del_ids = $this->deleteUnnecessaryPackage($orderHeaders,$packages);     // 删除package
+
         $orderPackageCommodityService->deleteUnnecessaryOrderCommodities($del_ids);     // 删除 orderCommodity
 
         $orderTracking = OrderTracking::query()->whereHas('commodities.package',function($query)use($del_ids){
             $query->whereIn('id',$del_ids);
         })->get();
+        if($orderTracking->count()==0)return;
+
         $orderTrackingService->deleteOrderTracings($orderTracking);                     // 删除追踪件
     }
     // TODO
@@ -439,7 +447,7 @@ class OrderPackageService
         }
         if(count($inner_params)>0){
             try {
-                $inner_array = array_chunk($inner_params,1000);
+                $inner_array = array_chunk($inner_params,5000);
                 foreach ($inner_array as $params) {
                     $bool = $this->insert($params);
                     $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;

+ 63 - 45
app/Services/OrderService.php

@@ -681,7 +681,7 @@ class OrderService
     public function getByWmsOrders($orderHeaders){
         if(!$orderHeaders){return null;}
         $order_nos = data_get($orderHeaders,'*.orderno');
-        return Order::query()->whereIn('code',$order_nos)->get();
+        return Order::query()->with('packages.commodities')->whereIn('code',$order_nos)->get();
     }
 
     public function 返回有问题件的订单号($orders)
@@ -774,20 +774,25 @@ class OrderService
         return  $orders ? $orders->first() : null ;
     }
 
-    // TODO
     public function syncOrder(&$orderHeaders)
     {
         /**
          * @var OrderPackageService $packageService
+         * @var OrderCommodityService $orderCommodityService
          */
         $packageService = app("OrderPackageService");
+        $orderCommodityService = app("OrderCommodityService");
+
         $this->syncOrderByWMSOrderHeaders($orderHeaders);
+
+        $orderCommodityService->syncOrderCommodities($orderHeaders);
+
         $packageService->syncOrderPackage($orderHeaders);
     }
-    // TODO
+
     public function syncOrderByWMSOrderHeaders(&$orderHeaders)
     {
-        if($orderHeaders->isEmpty())return [];
+        if($orderHeaders->isEmpty())return;
         /**
          * @var OwnerService $ownerService
          * @var LogisticService $logisticService
@@ -798,33 +803,51 @@ class OrderService
         $logisticService = app("LogisticService");
         $shopService = app('ShopService');
         $warehouseService = app('WarehouseService');
+        $owner_codes = [];$logistic_codes = [];$warehouse_codes = [];$shop_names = [];
+        foreach ($orderHeaders as $orderHeader) {
+            if(!empty($orderHeader['customerid']))
+                $owner_codes[$orderHeader['customerid']] = $orderHeader['customerid'];
+            if(!empty($orderHeader['warehouseid']))
+                $warehouse_codes[$orderHeader['warehouseid']] = $orderHeader['warehouseid'];
+            if(!empty($orderHeader['userdefine1']))
+                $logistic_codes[$orderHeader['userdefine1']] = $orderHeader['userdefine1'];
+            if(!empty($orderHeader['issuepartyname']) && !empty($orderHeader['customerid'])){
+                $value = ['owner_code'=>$orderHeader['customerid'],'issuepartyname'=>$orderHeader['issuepartyname']];
+                $key = "owner_code_{$orderHeader['customerid']}_issuepartyname_{$orderHeader['issuepartyname']}";
+                $shop_names[$key] = $value;
+            }
+        }
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+        $logistics = $logisticService->getLogisticByCodes($logistic_codes);
+        $shops = $shopService->getShopByCodeMap($shop_names);
+        $warehouses = $warehouseService->getWareHouseByCode($warehouse_codes);
 
-        $owners = $ownerService->getByWmsOrders($orderHeaders);
-        $logistics = $logisticService->getByWmsOrders($orderHeaders);
-        $shops = $shopService->getByWmsOrders($orderHeaders);
-        $warehouses = $warehouseService->getByWmsOrders($orderHeaders);
         $orders = $this->getByWmsOrders($orderHeaders);
+
         $created_params = $this->getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops); //3s
 
         $update_order = $this->getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops);
+
+
         // 转换插入 3s
         if(count($created_params) > 0){
-            collect($created_params)->chunk(4000)->each(function($inner_params){
+            collect($created_params)->chunk(3500)->each(function($inner_params){
                 $this->insert($inner_params->toArray());
             });
         }
         $update_params = [
-            ['id','code','warehouse_id','owner_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime']
+            ['id','code','warehouse_id','owner_id','shop_id','logistic_id','consignee_name','consignee_phone','province','city','district','address','client_code','wms_status','created_at','updated_at','wms_edittime','order_type']
         ];
-        $update_order->map(function ($item){
-            return $item->toArray();
-        })->each(function($item)use(&$update_params){
-            $update_params[] =$item;
+
+        $update_order->each(function($item)use(&$update_params){
+            $update_params[] = $item->toArray();
         });
+        if(count($update_order)==0)return;
+
         $this->batchUpdate($update_params);
     }
-    // TODO
-    public function getCreateOrderModelsByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops)
+
+    public function getCreateOrderModelsByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
     {
         /** @var DataHandlerService $dataHandlerService */
         $dataHandlerService = app('DataHandlerService');
@@ -835,7 +858,6 @@ class OrderService
         $shop_map = $dataHandlerService->dataHeader(['name','owner_id'],$shops);
         $order_map = $dataHandlerService->dataHeader(['code'],$orders);
 
-//        $collect = collect();
         $inner_params  = [];
         $date = (string)Carbon::now();
         foreach ($orderHeaders as $orderHeader) {
@@ -844,12 +866,11 @@ class OrderService
             if(isset($order))continue;
             $order_model = $this->getCreateOrderModels($orderHeader,$warehouse_map,$owner_map,$logistic_map,$shop_map,$date);
             $inner_params[] = $order_model;
-//            $collect->push($order_model);
         }
         return $inner_params;
     }
-    // TODO
-    public function getUpdateOrderModelByWMSOrderHeaders($orderHeaders,$orders,$warehouses,$owners,$logistics,$shops)
+
+    public function getUpdateOrderModelByWMSOrderHeaders(&$orderHeaders,&$orders,&$warehouses,&$owners,&$logistics,&$shops)
     {
         /**
          * @var DataHandlerService $dataHandlerService
@@ -874,7 +895,7 @@ class OrderService
         }
         return $collect;
     }
-    // TODO
+
     public function getCreateOrderModels(&$orderHeader,&$warehouse_map,&$owner_map,&$logistic_map,&$shop_map,$date)
     {
         /** @var DataHandlerService $dataHandlerService */
@@ -901,6 +922,7 @@ class OrderService
             'client_code' => $orderHeader['soreference1'],
             'wms_edittime' => $orderHeader['edittime'],
             'wms_status' => $orderHeader->oracleBASCode->codename_c??'',
+            'order_type' => $orderHeader->orderType->codename_c??'',
             'updated_at' => $date,
             'created_at' => $orderHeader['addtime']
         ];
@@ -917,7 +939,7 @@ class OrderService
      * @param $updateParams
      * @return mixed
      */
-    public function UpdateOrderParamBy($shop, $logistic, $owner, $warehouse, $order, $orderHeader, string $updated_at, &$updateParams)
+    public function UpdateOrderParamBy(&$shop, &$logistic, &$owner, &$warehouse, &$order, &$orderHeader, string &$updated_at, &$updateParams)
     {
         $shop_id = $shop->id ?? null;
         $logistic_id = $logistic->id ?? null;
@@ -952,11 +974,11 @@ class OrderService
                 'updated_at' => $updated_at,
                 'created_at' => $orderHeader->addtime,
                 'wms_edittime' => $orderHeader->edittime,
+                'order_type' => $orderHeader->orderType->codename_c??'',
                 'warehouse_id' => $warehouse_id];
         }
     }
 
-    // TODO
     public function createOrFindOrder($orderHeader)
     {
         $order = Order::query()->where('code',$orderHeader->orderno)->first();
@@ -971,7 +993,7 @@ class OrderService
             return null;
         }
     }
-    // TODO
+
     public function createOrFindOrderInfo($orderHeader)
     {
         /**
@@ -984,7 +1006,7 @@ class OrderService
         $orderHeaders->push($orderHeader);
         try {
             $this->syncOrderByWMSOrderHeaders($orderHeaders);
-            $orderPackageService->syncOrderPackage($orderHeaders);
+            $orderPackageService->syncPackageByOrderHeaders($orderHeaders);
             $orderPackageCommoditiesService->syncOrderPackageCommodities($orderHeaders);
             return  Order::query()->with('packages.commodities')->where('code',$orderHeader->orderno)->first();
         } catch (\Exception $e) {
@@ -993,8 +1015,6 @@ class OrderService
         }
     }
 
-
-    // TODO
     public function setOrderSyncAt($key,$date,$bool=true){
         if($bool){
             ValueStore::query()->where('name',$key)->update(['value'=>Carbon::parse($date)->subSeconds(1)]);
@@ -1002,7 +1022,7 @@ class OrderService
             ValueStore::query()->where('name',$key)->update(['value'=>$date]);
         }
     }
-    // TODO
+
     public function getOrderSyncAt($key,$type='newest'){
         $keyValue = ValueStore::query()->where('name',$key)->first();
         if($keyValue->value)return $keyValue->value;
@@ -1011,7 +1031,7 @@ class OrderService
         if($order)return $order->created_at;
         return Carbon::now()->subSeconds(65);
     }
-    // TODO
+
     public function pushOrderCache($orderHeaders,$prefixKey,$hasKey,$list_key){
         $list = [];
         try {
@@ -1028,7 +1048,7 @@ class OrderService
 
         }
     }
-    // TODO
+
     public function filterOrderByCache($orderHeaders,$key)
     {
         /**
@@ -1046,10 +1066,11 @@ class OrderService
             return $orderHeaders;
         }
     }
-    // TODO
+
     public function cancelOrderCache($key,string $prefix)
     {
         try {
+            Redis::LLEN($key);
             $list = Cache::get($key);
             collect($list)->each(function ($item)use($prefix) {
                 Cache::forget($prefix.$item);
@@ -1058,7 +1079,7 @@ class OrderService
         } catch (\Exception $e) {
         }
     }
-    // TODO
+
     public function syncCreatedOrder(){
         /**
          * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
@@ -1080,12 +1101,12 @@ class OrderService
 
         if(count($orderHeaders)>0 && count($orderHeaders) >0){
             $orderService->syncOrder($orderHeaders);                                                //  同步订单
-            $orderService->cancelOrderCache($newest_list);                                              //  清除缓存
+            $orderService->cancelOrderCache($newest_list,$prefixKey);                                   //  清除缓存
             $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$newest_list);             //  添加缓存
             $orderService->setOrderSyncAt($newest,$last_order->addTime,count($orderHeaders)>0);   //  更新时间
         }
     }
-    // TODO
+
     public function syncUpdatedOrder(){
         /**
          * @var OracleDOCOrderHeaderService $oracleDOCOrderHeaderService
@@ -1107,7 +1128,7 @@ class OrderService
 
         if(count($renewal_orders)>0 && count($orderHeaders)>0){
             $orderService->syncOrder($orderHeaders);                                                    // 同步订单
-            $orderService->cancelOrderCache($renewal_list);                                                 // 清除缓存
+            $orderService->cancelOrderCache($renewal_list,$prefixKey);                                      // 清除缓存
             $orderService->pushOrderCache($renewal_orders,$prefixKey,$hasKey,$renewal_list);                // 添加缓存
             $orderService->setOrderSyncAt($renewal,$renewal_order->addTime,count($orderHeaders)>0);   // 更新时间
         }
@@ -1127,13 +1148,7 @@ class OrderService
     {
         //检查订单对象
         if (!$order || $order->wms_status != "订单完成")return false;
-        if (!$order->packages || !$order->packages[0]->commodities || !$order->packages[0]->commodities[0]->commodity)$order->load(["packages"=>function($query){
-            /** @var Builder $query */
-            $query->with(["commodities"=>function($query){
-                /** @var Builder $query */
-                $query->with("commodity");
-            }]);
-        }]);
+        $order->loadMissing(["logistic","packages.commodities.commodity"]);
 
         /** @var OwnerPriceExpressService $service */
         $service = app("OwnerPriceExpressService");
@@ -1143,6 +1158,9 @@ class OrderService
         $volume = 0;
         $weight = 0;
         $logistic_bill = "";
+
+        if (!$order->logistic || $order->logistic->type != "快递")$logistic_fee = null;
+
         foreach ($order->packages as &$package){
             $logistic_bill .= $package->logistic_number.",";
             $volume += $package->bulk;
@@ -1171,8 +1189,8 @@ class OrderService
         }
         if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
 
-        $object = ["commodities"=>$commodities,"logistic_name"=>($order->logistic ? $order->logistic->name : ''),"shop_name"=>($order->shop ? $order->shop->name : '')];
-        $mapping = ["packages"=>"commodities","商品名称"=>"commodity_name","承运商"=>"logistic_name","店铺类型"=>"shop_name"];
+        $object = ["commodities"=>$commodities,"logistic_name"=>($order->logistic ? $order->logistic->name : ''),"shop_name"=>($order->shop ? $order->shop->name : ''),"order_type"=>$order->order_type];
+        $mapping = ["packages"=>"commodities","商品名称"=>"commodity_name","承运商"=>"logistic_name","店铺类型"=>"shop_name","订单类型"=>"order_type"];
 
         /** @var OwnerPriceOperationService $service */
         $service = app("OwnerPriceOperationService");
@@ -1184,7 +1202,7 @@ class OrderService
             "worked_at"         => $order->wms_edittime,
             "type"              => "发货",
             "shop_id"           => $order->shop_id,
-            "operation_bill"    => $order->client_code,
+            "operation_bill"    => $order->code,
             "consignee_name"    => $order->consignee_name,
             "consignee_phone"   => $order->consignee_phone,
             "commodity_amount"  => $amount,

+ 8 - 4
app/Services/OrderTrackingService.php

@@ -77,6 +77,9 @@ class OrderTrackingService
         if ($params['client'] ?? false)  // 客户
             $query->where('client', 'like', $params['client']);
 
+        if(!empty($params['web_order_number']))
+            $query->where('web_order_number', 'like', $params['web_order_number'].'%');
+
         if ($params['sku'] ?? false) {
             $query->whereHas('commodities.commodity', function ($query) use ($params) {
                 $query->where('sku', $params['sku']);
@@ -210,7 +213,7 @@ class OrderTrackingService
             })->update($update);
             return['success'=> $bool > 0];
         } catch (\Exception $e) {
-            app('LogService')->log(__METHOD__,__FUNCTION__,'修改追踪件'.json_encode($orderId,$param,$value).$e->getMessage().$e->getTraceAsString());
+            app('LogService')->log(__METHOD__,__FUNCTION__,'修改追踪件'.json_encode($orderId,$param,$value).json_encode($e->getMessage()).json_encode($e->getTraceAsString()));
             return['success'=> false,'fail_info'=>$e->getMessage()];
         }
     }
@@ -260,9 +263,10 @@ class OrderTrackingService
             if ($order_header['notes'] ?? false) {
                 $notes = $order_header->notes;
                 if (strpos($notes, '[')) {
-                    $arr= str_split($notes,strpos($notes,'['));
-                    $client = $arr[0] ?? '';
-                    $order_remark = str_replace(['[',']'],'', $arr[1] ?? '');
+                    $strings = [];
+                    preg_match_all('/^(.*?)(\\[)(.*?)(\\])(.*?)$/u',$notes,$strings);
+                    $client = $strings[1][0];
+                    $order_remark = $strings[3][0];
                 }
             }
             $web_order_number = null;

+ 15 - 0
app/Services/OwnerFeeDetailService.php

@@ -60,4 +60,19 @@ Class OwnerFeeDetailService
         return OwnerFeeDetail::query()->create($params);
     }
 
+    public function first(array $params)
+    {
+        $query = OwnerFeeDetail::query();
+        foreach ($params as $column=>$param){
+            if (is_array($param))$query->whereIn($column,$param);
+            else $query->where($column,$param);
+        }
+        return $query->first();
+    }
+
+    public function updateFind(OwnerFeeDetail $detail, array $values)
+    {
+        return $detail->update($values);
+    }
+
 }

+ 16 - 1
app/Services/OwnerService.php

@@ -9,6 +9,7 @@ use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
 
 Class OwnerService
 {
@@ -223,5 +224,19 @@ Class OwnerService
             return Owner::query()->firstOrCreate(["code"=>$code],["code"=>$code,"name"=>$code]);
         });
     }
-
+    public function getOwnerByCodes($codes)
+    {
+        $collect = collect();
+        if(count($codes) == 0)return $collect;
+        foreach ($codes as $code) {
+            $collect->push(Cache::remember("getOwnerByCodes_{$code}", config('database.cache.expirations.rand'), function ()use($code){
+                $owner = Owner::query()->where('code',$code)->first();
+                if($owner) return $owner;
+                $basCustomer = OracleBasCustomer::query()->where('Customer_Type','OW')->where('CustomerID', $code)->first();
+                if(!$basCustomer)return null;
+                return Owner::query()->create(['name'=>$basCustomer['descr_c'],'code'=>$basCustomer['customerid']]);
+            }));
+        }
+        return $collect;
+    }
 }

+ 20 - 0
app/Services/ProcessService.php

@@ -94,4 +94,24 @@ Class ProcessService
                 ->selectRaw('sign_commodity_barcode.mark sign_commodity_barcode_mark')
             ->sql();
     }
+
+    public function createInstantBill(Process $process)
+    {
+        if (!$process || $process->status!="交接完成")return false;
+        if (!$process->processStatistic)$process->load("processStatistic");
+
+        if (app("OwnerFeeDetailService")->create([
+            "owner_id"          => $process->owner_id,
+            "worked_at"         => $process->processStatistic ? $process->processStatistic->ended_at : '',
+            "type"              => "增值服务",
+            "operation_bill"    => $process->code,
+            "commodity_amount"  => $process->completed_amount,
+            "process_method_id" => $process->process_method_id,
+            "work_fee"          => $process->processStatistic ? $process->processStatistic->revenue : null,
+            "created_at"        => date('Y-m-d H:i:s'),
+            "outer_id"          => $process->id,
+            "outer_table_name"  => "processes",
+        ]))return true;
+        return false;
+    }
 }

+ 33 - 0
app/Services/ShopService.php

@@ -2,13 +2,21 @@
 
 namespace App\Services;
 
+use App\OracleBasCustomer;
 use App\Owner;
 use App\Services\common\BatchUpdateService;
 use App\Shop;
 use Carbon\Carbon;
+use Illuminate\Support\Facades\Cache;
 
 class ShopService
 {
+    /** @var CacheService $cacheService */
+    private $cacheService;
+    function __construct(){
+        $this->cacheService=app('CacheService');
+    }
+
     public function getSelection(array $column = ['id', 'name'])
     {
         return Shop::query()->select($column)->get();
@@ -86,5 +94,30 @@ class ShopService
         }
     }
 
+    public function getShopByCodeMap($map)
+    {
+        /** @var OwnerService $ownerService */
+        $ownerService = app('OwnerService');
+        $owner_codes = [];
+        foreach ($map as $item) {
+            $owner_codes[$item['owner_code']]= $item['owner_code'];
+        }
+        $owners = $ownerService->getOwnerByCodes($owner_codes);
+        $owner_map  = [];
+        $owners->each(function($owner)use(&$owner_map){
+            $owner_map[$owner['code']] = $owner;
+        });
+        $collect = collect();
+        if(count($map)==0)return $collect;
+        foreach ($map as $item) {
+            $collect->push(Cache::remember("getShopByCodeMap_{$item['owner_code']}_{$item['issuepartyname']}", null, function()use($item,$owner_map){
+                $owner = $owner_map[$item['owner_code']] ;
+                $shop = Shop::query()->where('owner_id',$owner['id'])->where('name',$item['issuepartyname'])->first();
+                if($shop)return $shop;
+                return Shop::query()->create(['owner_id'=>$owner['id'],'name'=>$item['issuepartyname']]);
+            }));
+        }
+        return $collect;
+    }
 
 }

+ 4 - 3
app/Services/StationTaskBatchService.php

@@ -38,7 +38,8 @@ class StationTaskBatchService
         $station=$this->stationService->getDefaultStation('料箱出货口');
         $id_stationMissionBatchType=$this->stationTaskBatchTypeService->firstByWhere('name','U型线分捡');
 
-        foreach ($batches as &$batch){
+        $batches_handled=[];
+        foreach ($batches as $batch){
             if ($batch['status']=='未处理'){
                 $stationMissionBatches_toCreate->push([
                     'batch_id'=>$batch['id'],
@@ -46,10 +47,10 @@ class StationTaskBatchService
                     'station_mission_batch_type_id'=> $id_stationMissionBatchType,
                     'status'=>'待处理'
                 ]);
-                $batch = '已处理';
+                $batches_handled[]=$batch;
             }
         }
-        $this->batchService->updateWhereIn('id',data_get($batches,'*.id'),['status'=>'处理中']);
+        $this->batchService->updateWhereIn('id',data_get($batches_handled,'*.id'),['status'=>'处理中']);
         $this->insert($stationMissionBatches_toCreate->toArray());
         return $stationMissionBatches_toCreate;
     }

+ 28 - 0
app/Services/StoreService.php

@@ -183,4 +183,32 @@ Class StoreService
         $asn_nos = array_unique(data_get($asnHerders,'*.asnno'));
         return Store::query()->whereIn('asn_code',$asn_nos)->get();
     }
+
+    public function createInstantBill(Store $store):bool
+    {
+        if (!$store || $store->status!="已入库")return false;
+        if (!$store->storeItems)$store->load("storeItems");
+
+
+        /** @var OwnerPriceOperationService $service */
+        $service = app("OwnerPriceOperationService");
+
+        $mapping = ["packages"=>"storeItems","商品名称"=>"name","订单类型"=>"stored_method"];
+
+        $work_fee = $service->matchRule($store,$mapping,$store->owner_id,"入库");
+        if ($work_fee < 0)$work_fee = null;
+
+        if (app("OwnerFeeDetailService")->create([
+            "owner_id"          => $store->owner_id,
+            "worked_at"         => $store->created_at,
+            "type"              => "收货",
+            "operation_bill"    => $store->asn_code,
+            "commodity_amount"  => array_sum(array_column($store->storeItems->toArray(),"amount")),
+            "work_fee"          => $work_fee,
+            "created_at"        => date('Y-m-d H:i:s'),
+            "outer_id"          => $store->id,
+            "outer_table_name"  => "stores",
+        ]))return true;
+        return false;
+    }
 }

+ 33 - 5
app/Services/WarehouseService.php

@@ -7,9 +7,15 @@ use App\Owner;
 use App\Warehouse;
 use Illuminate\Support\Collection;
 use Carbon\Carbon;
+use Illuminate\Support\Facades\Cache;
 
 Class WarehouseService
 {
+    /** @var CacheService $cacheService */
+    private $cacheService;
+    function __construct(){
+        $this->cacheService=app('CacheService');
+    }
 
     public function firstOrCreate(array $params, array $values = null)
     {
@@ -45,11 +51,17 @@ Class WarehouseService
             return $warehouses->where('code',$oracleBasCustomer->warehouseid)->count()==0;
         });
         foreach ($oracleBasCustomers as $oracleBasCustomer){
-            $wereHouse=Warehouse::query()->create([
-                'code'=>$oracleBasCustomer->customerid,
-                'name'=>$oracleBasCustomer->descr_c
-            ]);
-            $collet->push($wereHouse);
+            $params =[
+                'code' => $oracleBasCustomer->customerid,
+                'name' => $oracleBasCustomer->descr_c
+            ];
+            try {
+                $wereHouse = Warehouse::query()->create($params);
+                $collet->push($wereHouse);
+                app('LogService')->log(__METHOD__,__FUNCTION__,'创建 warehouse success'.json_encode($wereHouse));
+            } catch (\Exception $e) {
+                app('LogService')->log(__METHOD__,__FUNCTION__,'创建 warehouse error'.json_encode($params).json_encode($e->getMessage()));
+            }
         }
         return  $collet;
     }
@@ -93,4 +105,20 @@ Class WarehouseService
         return Warehouse::query()->insert($fillables);
     }
 
+    public function getWareHouseByCode($codes)
+    {
+        $collect = collect();
+        if(count($codes)==0)return $collect;
+        foreach ($codes as $code) {
+            $collect->push(Cache::remember("WareHouse_{$code}",config('database.cache.expirations.rand'),function()use($code){
+                $wareHouse =  Warehouse::query()->where('code',$code)->first();
+                if($wareHouse)return $wareHouse;
+                $bas_customer = OracleBasCustomer::query()->selectRaw('Customer_Type,CustomerId,Descr_C')->where('CustomerId',$code)->where('Customer_Type','WH')->first();
+                if(!$bas_customer) return null;
+                return Warehouse::query()->create(['name'=>$bas_customer['descr_c'],'code'=>$bas_customer['customerid']]);
+            }));
+        }
+        return $collect;
+    }
 }
+

+ 43 - 0
app/Services/WaybillService.php

@@ -143,4 +143,47 @@ Class WaybillService
             ->selectRaw('logistics.name carrier_name')
             ->sql();
     }
+
+    public function createInstantBill(Waybill $waybill) :bool
+    {
+        if (!$waybill || $waybill->status != "已完结" || !$waybill->wms_bill_number || !$waybill->logistic_id)return false;
+        $waybill->loadMissing("destinationCity");
+        if (!$waybill->destinationCity)return false;
+
+        $detail = app("OwnerFeeDetailService")->first([
+            "type" => "发货","owner_id" => $waybill->owner_id,"operation_bill"=>$waybill->wms_bill_number
+        ]);
+        if (!$detail || $detail->logistic_fee !== null)return false;
+
+        if ($waybill->type == "专线"){
+            /** @var OwnerPriceLogisticService $service */
+            $service = app("OwnerPriceLogisticService");
+            $fee = $service->matching($waybill->carrier_weight_other,$waybill->owner_id,$waybill->logistic_id,
+                $waybill->carrier_weight_unit_id_other,$waybill->destinationCity->province_id,
+                $waybill->destination_city_id);
+        }else{
+            /** @var OwnerPriceDirectLogisticService $service */
+            $service = app("OwnerPriceDirectLogisticService");
+            $fee = $service->matching($waybill->mileage,$waybill->owner_id,$waybill->carType_id);
+        }
+
+        if ($fee >= 0){
+            app("OwnerFeeDetailService")->updateFind($detail,[
+                "owner_id" => $waybill->owner_id,
+                "worked_at"=> $waybill->updated_at,
+                "type" => "发货",
+                "operation_bill" => $waybill->waybill_number,
+                "consignee_name" => $waybill->recipient,
+                "consignee_phone" => $waybill->recipient_mobile,
+                "commodity_amount" => $waybill->amount,
+                "logistic_bill" => $waybill->carrier_bill,
+                "volume" =>$waybill->carrier_weight ?? $waybill->warehouse_weight,
+                "weight" => $waybill->carrier_weight_other ?? $waybill->warehouse_weight_other,
+                "logistic_id" => $waybill->logistic_id,
+                "logistic_fee" => $fee,
+                "outer_id" => $waybill->id,
+                "outer_table_name" => "waybills",
+            ]);
+        }
+    }
 }

+ 11 - 0
app/Utils/helpers.php

@@ -0,0 +1,11 @@
+<?php
+
+use Carbon\Carbon;
+
+function formatExcelDate(int $timestamp)
+{
+    $diff = intval($timestamp);
+    $today=new Carbon('1900-01-01');
+    $day = $today->addDays($diff-2);
+    return $day->toDateString();
+}

+ 3 - 0
composer.json

@@ -57,6 +57,9 @@
         "classmap": [
             "database/seeds",
             "database/factories"
+        ],
+        "files": [
+            "app/Utils/helpers.php"
         ]
     },
     "autoload-dev": {

+ 2 - 0
config/cache.php

@@ -9,6 +9,8 @@ return [
         'oftenChange'=>5,       //经常改
         'rarelyChange'=>60,     //几乎不变
         'commonFrequent'=>20,  //一般频率
+        'forever' =>null,       //永久
+
         'owners'=>20,           //模型Owner
     ],
     /*

+ 1 - 0
config/sync.php

@@ -9,6 +9,7 @@ return [
         'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
     ],
     'order_sync' => [
+        'enabled' => true,
         'interval' => 1,   // 时间以分为单位
         'start_at'=> '',    // 开始同步WMS的时间  时间格式: yyyy-MM-dd HH:mm:ss 如 2020-09-05 13:15:16
         'cache_prefix' => [

+ 18 - 0
database/factories/OracleActAllocationDetailsFactory.php

@@ -0,0 +1,18 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleActAllocationDetails;
+use Faker\Generator as Faker;
+
+$factory->define(OracleActAllocationDetails::class, function (Faker $faker) {
+    return [
+        'orderno' => $faker->uuid,
+        'customerid' => $faker->name,
+        'sku'=>$faker->name,
+        'qtyordered' => $faker->numberBetween(1,50),
+        'qty_each' => $faker->numberBetween(1,50),
+        'location' => $faker->md5,
+        'picktotraceid'  => $faker->uuid
+    ];
+});

+ 14 - 0
database/factories/OracleBasCodeFactory.php

@@ -0,0 +1,14 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleBasCode;
+use Faker\Generator as Faker;
+
+$factory->define(OracleBasCode::class, function (Faker $faker) {
+    return [
+        'codeid' => $faker->uuid,
+        'code' => $faker->uuid,
+        'codename_c' => $faker->name,
+    ];
+});

+ 14 - 0
database/factories/OracleBasCustomerFactory.php

@@ -0,0 +1,14 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleBasCustomer;
+use Faker\Generator as Faker;
+
+$factory->define(OracleBasCustomer::class, function (Faker $faker) {
+    return [
+        'customer_type'=> $faker->uuid,
+        'customerid'=> $faker->uuid,
+        'descr_c'=> $faker->name
+    ];
+});

+ 15 - 0
database/factories/OracleBasSKUFactory.php

@@ -0,0 +1,15 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleBasSKU;
+use Faker\Generator as Faker;
+
+$factory->define(OracleBasSKU::class, function (Faker $faker) {
+    return [
+        'customerid'=>$faker->name,
+        'sku' =>$faker->name,
+        'descr_c' =>$faker->title(20),
+        'packid'=>$faker->name,
+    ];
+});

+ 16 - 0
database/factories/OracleDOCOrderDetailFactory.php

@@ -0,0 +1,16 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleDOCOrderDetail;
+use Faker\Generator as Faker;
+
+$factory->define(OracleDOCOrderDetail::class, function (Faker $faker) {
+    return [
+        'orderno' => $faker->uuid,
+        'customerid' => $faker->name,
+        'sku'=>$faker->name,
+        'qtyordered' => $faker->numberBetween(1,50),
+        'location' => $faker->md5
+    ];
+});

+ 35 - 0
database/factories/OrcaleDOCOrderHeaderFactory.php

@@ -0,0 +1,35 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\OracleDOCOrderHeader;
+use Faker\Generator as Faker;
+
+$factory->define(OracleDOCOrderHeader::class, function (Faker $faker) {
+    return [
+        'orderno' => $faker->uuid,
+        'customerid' => '',
+        'ordertime' =>$faker->time(),
+        'soreference1' => $faker->uuid,
+        'consigneeid' => '',
+        'c_contact' =>$faker->title(10),
+        'consigneename' => $faker->title(11),
+        'c_address1' => $faker->address,
+        'c_city' =>$faker->city,
+        'c_province' =>$faker->city,
+        'addtime' => $faker->date(),
+        'edittime' => $faker->date(),
+        'notes' => $faker->text(15),
+        'carriername'  =>'',
+        'lastshipmenttime' => $faker->date(),
+        'edisendflag' => "Y",
+        'soreference5' => $faker->uuid,
+        'c_tel2' => $faker->phoneNumber,
+        'transportation' => $faker->phoneNumber,
+        'warehouseid' => '',
+        'sostatus' => '99',
+        'c_tel1' => $faker->phoneNumber,
+        'c_district' => $faker->city,
+        'issuepartyname'=> $faker->date(),
+    ];
+});

+ 1 - 1
database/factories/ShopFactory.php

@@ -8,6 +8,6 @@ use Faker\Generator as Faker;
 $factory->define(Shop::class, function (Faker $faker) {
     return [
         'name' => $faker->name,
-        'owner_id' => factory(\App\Owner::class),
+        'owner_id' => 1,
     ];
 });

+ 13 - 0
database/factories/WarehouseFactory.php

@@ -0,0 +1,13 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Warehouse;
+use Faker\Generator as Faker;
+
+$factory->define(Warehouse::class, function (Faker $faker) {
+    return [
+        'name' => $faker->name,
+        'code' => $faker->uuid
+    ];
+});

+ 1 - 1
database/migrations/2020_01_02_172739_change_waybill_price_model_field.php

@@ -26,7 +26,7 @@ class ChangeWaybillPriceModelField extends Migration
     public function down()
     {
         Schema::table('waybill_price_models', function (Blueprint $table) {
-            $table->bigInteger('city_id')->index()->comment('外键城市')->change();
+//            $table->bigInteger('city_id')->index()->comment('外键城市')->change();
         });
     }
 }

+ 1 - 1
database/migrations/2020_03_09_153510_create_stores_table.php

@@ -19,7 +19,7 @@ class CreateStoresTable extends Migration
             $table->integer('warehouse_id')->nullable()->comment('仓库ID');
             $table->integer('owner_id')->index()->nullable()->comment('货主ID');
             $table->enum('stored_method',['正常','快速入库','采购入库','笕尚退货入库单','笕尚进仓入库单','笕尚移仓入库单','B2B入库','笕尚调整入库单','换货入库','初始化库存','虚拟入库','其他入库','退货入库','调拨入库'])->default('正常');
-            $table->enum('status',['待盘点','盘点中','复盘中','已完成','已审核'])->default(null)->nullable();
+            $table->enum('status',['无需入库','已入库','未入库','待推单','完全收货','部分收货','已码盘','订单创建','ASN关闭','等待释放','收货取消'])->default(null)->nullable();
             $table->string('remark')->nullable();
             $table->timestamp('deleted_at')->nullable()->index();
             $table->timestamp('updated_at')->nullable();

+ 2 - 1
database/migrations/2020_04_09_111540_change_tutorial_table.php

@@ -32,7 +32,8 @@ class ChangeTutorialTable extends Migration
             $table->longText('content')->after('name')->nullable()->comment('富文本内容');
         });
         Schema::table('users', function (Blueprint $table) {
-            $table->string('email')->unique()->change();
+//            $table->unique('email','users_email_unique');
+//            $table->string('email')->unique()->change();
         });
     }
 }

+ 0 - 1
database/migrations/2020_06_02_130804_change_user_duty_check.php

@@ -26,7 +26,6 @@ class ChangeUserDutyCheck extends Migration
     public function down()
     {
         Schema::table('user_duty_checks', function (Blueprint $table) {
-            $table->dropColumn('workgroup_id');
         });
     }
 }

+ 4 - 4
database/migrations/2020_06_11_112028_change_rejected_bills_table.php

@@ -14,8 +14,8 @@ class ChangeRejectedBillsTable extends Migration
     public function up()
     {
         Schema::table('rejected_bills',function (Blueprint $table){
-            $table->index('is_loaded');
-            $table->index('is_checked');
+            $table->index('is_loaded','rejected_bills_is_loaded_index');
+            $table->index('is_checked','rejected_bills_is_checked_index');
         });
     }
 
@@ -28,8 +28,8 @@ class ChangeRejectedBillsTable extends Migration
     {
         //
         Schema::table('rejected_bills',function (Blueprint $table){
-            $table->dropIndex('is_loaded');
-            $table->dropIndex('is_checked');
+            $table->dropIndex('rejected_bills_is_loaded_index');
+            $table->dropIndex('rejected_bills_is_checked_index');
         });
     }
 }

+ 1 - 1
database/migrations/2020_06_16_173559_add_authorrities_waybillmanagement_freigt.php

@@ -31,7 +31,7 @@ class AddAuthorritiesWaybillmanagementFreigt extends Migration
     public function down()
     {
         foreach ($this->authNames as $name){
-            \App\Authority::where(['name'=>$name,'alias_name'=>$name])->destroy();
+            \App\Authority::where(['name'=>$name,'alias_name'=>$name])->delete();
         }
     }
 }

+ 0 - 1
database/migrations/2020_06_30_133655_change_processes_contents_column_type.php

@@ -26,7 +26,6 @@ class ChangeProcessesContentsColumnType extends Migration
     public function down()
     {
         Schema::table('processes_contents',function (Blueprint $table){
-            $table->dropColumn('type');
             $table->string('is_full',2)->default('N')->comment('是否成品');
         });
     }

+ 1 - 1
database/migrations/2020_09_10_143926_drop_shop_unique_name_index.php

@@ -27,7 +27,7 @@ class DropShopUniqueNameIndex extends Migration
     public function down()
     {
         Schema::table('shops', function (Blueprint $table) {
-            $table->string('name')->unique('shops_name_unique');
+            $table->string('name')->unique('shops_name_unique')->change();
         });
     }
 }

+ 1 - 1
database/migrations/2020_10_19_113042_create_logistic_timings_table.php

@@ -42,7 +42,7 @@ class CreateLogisticTimingsTable extends Migration
     {
         $create_array = [];
         $map = $this->getMap();
-        $logistic=Logistic::firstOrCreate(['name'=>'顺丰特惠']);
+        $logistic=Logistic::firstOrCreate(['name'=>'顺丰特惠','code'=>'SFTH']);
 //        $logistic = Logistic::query()->where('name','顺丰特惠')->first();
         $time = \Carbon\Carbon::now()->format('Y-m-d H:i:s');
         foreach ($map as $item) {

+ 3 - 1
database/migrations/2020_11_19_113955_change_order_issue_type_id_index.php

@@ -25,6 +25,8 @@ class ChangeOrderIssueTypeIdIndex extends Migration
      */
     public function down()
     {
-        Schema::dropIfExists('order_issues');
+        Schema::table('order_issues', function (Blueprint $table) {
+            $table->dropColumn('order_issue_type_id');
+        });
     }
 }

+ 2 - 2
database/migrations/2020_11_30_140958_create_stations_table.php

@@ -19,13 +19,13 @@ class CreateStationsTable extends Migration
             $table->id();
             $table->integer('parent_id')->index()->nullable();
             $table->string('name')->index()->nullable();
-            $table->string('code')->index()->nullable()->comment('机器编码');
+            $table->string('code')->unique()->nullable()->comment('机器编码');
             $table->integer('station_type_id')->index();
             $table->integer('sequence')->index()->nullable();
             $table->timestamps();
         });
         $stationType= StationType::query()->firstOrCreate(['name'=>'料箱出货口']);
-        $station= Station::query()->firstOrCreate(['code'=>'BIN-OUT01']);
+        $station= Station::query()->firstOrCreate(['code'=>'BIN-OUT01','station_type_id'=>$stationType['id']]);
         $station['sequence']=1;
         $station['station_type_id']=$stationType['id'];
         $station->save();

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

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOrderTypeToOrders extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->string('order_type')->index()->nullable()->comment('订单类型')->after('wms_status');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->dropColumn('order_type');
+        });
+    }
+}

+ 52 - 0
database/migrations/2020_12_02_150054_create_order_commodity_assigns_table.php

@@ -0,0 +1,52 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateOrderCommodityAssignsTable extends Migration
+{
+
+    protected $authorities = [
+        "商品配置",
+        "商品配置-查询",
+        "商品配置-编辑",
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        foreach ($this->authorities as $val) \App\Authority::query()->firstOrCreate(["name"=>$val,"alias_name"=>$val]);
+
+        Schema::create('order_commodity_assigns', function (Blueprint $table) {
+            $table->id();
+            $table->bigInteger("order_id")->index()->comment("外键订单");
+            $table->bigInteger("commodity_id")->comment("外键商品");
+            $table->integer("amount")->default(0)->comment("数量");
+            $table->date("produced_at")->nullable()->comment("生产日期");
+            $table->date("valid_at")->nullable()->comment("失效日期");
+            $table->string("batch_number")->index()->nullable()->comment("批次号");
+            $table->string("location")->index()->nullable()->comment("库位");
+            $table->string("region")->index()->nullable()->comment("库区");
+            $table->bigInteger("user_id")->index()->nullable()->comment("操作人");
+            $table->timestamps();
+            $table->index(["commodity_id","produced_at"]);
+            $table->index(["commodity_id","valid_at"]);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('order_commodity_assigns');
+
+        foreach ($this->authorities as $val) \App\Authority::query()->where("name",$val)->where("alias_name",$val)->delete();
+    }
+}

+ 1 - 1
package-lock.json

@@ -6254,7 +6254,7 @@
         },
         "minimist": {
             "version": "1.2.0",
-            "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
             "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
             "dev": true
         },

+ 19 - 0
resources/views/maintenance/log/_taskModal.blade.php

@@ -0,0 +1,19 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="task">
+    <div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="container-fluid">
+                    <div class="row">
+
+                    </div>
+                </div>
+            </div>
+            <div class="modal-body">
+                <div v-html="detail"></div>
+            </div>
+            <div class="modal-footer">
+
+            </div>
+        </div>
+    </div>
+</div>

+ 6 - 4
resources/views/maintenance/log/index.blade.php

@@ -31,8 +31,8 @@
                         <th>ip</th>
                         <th>时间</th>
                     </tr>
-                    <tr v-for="log in logs" class="hover" @click="logsClick(log)" style="cursor: pointer">
-                        <td class="text-muted">@{{log.id}}</td>
+                    <tr v-for="log in logs" class="hover" @click="logsClick(log)" style="cursor: pointer;">
+                        <td class="text-muted">@{{log.id}}<span class="badge badge-danger small pull-right mr-3" v-if="log.mark == 'Y'">异常</span></td>
                         <td>@{{log.user_name}}</td>
                         <td>@{{log.operation}}</td>
                         <td>@{{log.type}}</td>
@@ -70,7 +70,8 @@
                         operation: '{{$log->operation}}',
                         type: '{{$log->type}}',
                         ip: '{{$log->ip}}',
-                        created_at: '{{$log->created_at}}'
+                        created_at: '{{$log->created_at}}',
+                        mark:'{{$log->exception_mark}}',
                     },
                     @endforeach
                     @endif
@@ -83,7 +84,8 @@
                         {name: 'type', type: 'input', tip: '操作', placeholder: '类型'},
                         {name: 'description', type: 'input', tip: '详情:可在两侧添加百分号(%)进行模糊搜索', placeholder: '详情'},
                         {name:'created_at_start',type:'dateTime',tip:'选择显示指定日期的起始时间'},
-                        {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的截止'}
+                        {name:'created_at_end',type:'dateTime',tip:'选择显示指定日期的截止'},
+                        {name:'is_exception',type:'checkbox',tip:'仅显示异常', data: [{name: 'true', value: '仅显示异常'}]}
                     ]
                 ];
                 this.from = new query({

+ 18 - 2
resources/views/maintenance/log/show.blade.php

@@ -10,7 +10,8 @@
             </li>
         @endcomponent
     </div>
-    <div class="container-fluid">
+    <div class="container-fluid" id="container">
+        {{--@include("maintenance.log._taskModal")--}}
         <div class="card ">
             <div class="card-body">
                 <table class="table table-striped">
@@ -32,7 +33,10 @@
                     </tr>
                     <tr>
                         <td>详细</td>
-                        <td style="word-break: break-all;">{{$log['description']}}</td>
+                        <td style="word-break: break-all;">
+                            {{--<button v-if="mark == 'Y'" class="btn btn-sm btn-success ml-2" data-toggle="modal" data-target="#task">重新分发</button>--}}
+                            <div {{--v-else--}} v-html="detail"></div>
+                        </td>
                     </tr>
                     <tr>
                         <td>用户</td>
@@ -47,3 +51,15 @@
         </div>
     </div>
 @endsection
+
+@section('lastScript')
+<script>
+    new Vue({
+        el:"#container",
+        data:{
+            mark:"{{$log['exception_mark']}}",
+            detail:"{{$log['description']}}".split('|'),
+        },
+    });
+</script>
+@stop

+ 25 - 0
resources/views/order/index/_importModal.blade.php

@@ -0,0 +1,25 @@
+<div class="modal fade" tabindex="-1" role="dialog" id="importModal">
+    <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
+        <div class="modal-content">
+            <div class="modal-body">
+                <div class="w-100 text-center mb-1" v-if="errors.length > 0">
+                    <button class="btn btn-sm btn-danger mb-1" @click="isShowError = true" v-if="!isShowError">@{{ errors.length }}条错误,点击展开</button>
+                    <button class="btn btn-sm btn-dark mb-1" @click="isShowError = false" v-else>收起错误展示</button>
+                    <div v-if="isShowError" class="container-fluid text-danger font-weight-bolder">
+                        <div class="row text-left">
+                            <div class="col-6" v-for="error in errors">@{{ error }}</div>
+                        </div>
+                    </div>
+                </div>
+                <div class="mt-5 mb-5">
+                    <input id="file" type="file" class="d-none" accept=".csv, .xlsx, .xls" @change="importAssign($event)"/>
+                    <label class="w-100 text-center small"><b>表头示例:</b><label class="text-primary">订单编号  商品条码  数量  生产日期  失效日期</label></label>
+                    <label class="w-100 row d-block ml-1"><input type="button" class="btn btn-dark col-6 offset-3" value="导入商品配置" @click="selectFile()"></label>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 125 - 0
resources/views/order/index/index.blade.php

@@ -0,0 +1,125 @@
+@extends('layouts.app')
+@section('title')订单管理-商品配置@endsection
+
+@section('content')
+    @component('order.index.menu')@endcomponent
+<div class="container-fluid d-none" id="container">
+    @include("order.index._importModal")
+    <div class="card">
+        <div class="card-body">
+            <button class="btn  btn-outline-info mb-1" data-toggle="modal" data-target="#importModal">导入</button>
+            <table class="table table-striped table-hover" id="headerParent">
+                <tr id="header"></tr>
+                <tr v-for="(model,i) in models">
+                    <td>@{{ i+1 }}</td>
+                    <td>@{{ model.orderNumber }}</td>
+                    <td>@{{ model.barcode }}</td>
+                    <td>@{{ model.amount }}</td>
+                    <td>@{{ model.producedAt }}</td>
+                    <td>@{{ model.validAt }}</td>
+                    <td>@{{ model.batchNumber }}</td>
+                    <td>@{{ model.location }}</td>
+                    <td>@{{ model.region }}</td>
+                    <td>@{{ model.createdAt }}</td>
+                    <td>@{{ model.userName }}</td>
+                </tr>
+            </table>
+        </div>
+    </div>
+    {{$assigns->links()}}
+</div>
+@endsection
+
+@section('lastScript')
+<script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>
+<script>
+    new Vue({
+        el:"#container",
+        data:{
+            models:[
+                @foreach($assigns as $assign)
+                {
+                    orderNumber:"{{$assign->order ? $assign->order->code : ''}}",
+                    barcode:"{{$assign->commodity ? $assign->commodity->barcode : ''}}",
+                    amount:"{{$assign->amount}}",
+                    producedAt:"{{$assign->produced_at}}",
+                    validAt:"{{$assign->valid_at}}",
+                    batchNumber:"{{$assign->batch_number}}",
+                    location:"{{$assign->location}}",
+                    region:"{{$assign->region}}",
+                    createdAt:"{{$assign->created_at}}",
+                    userName:"{{$assign->user ? $assign->user->name : 'system'}}",
+                },
+                @endforeach
+            ],
+            isShowError : false,
+            errors:[],
+        },
+        mounted(){
+            $("#container").removeClass("d-none");
+            let column = [
+                {name:'index',value: '序号', neglect: true},
+                {name:'orderNumber',value: '订单编号'},
+                {name:'barcode',value: '商品条码'},
+                {name:'amount',value: '数量', neglect: true},
+                {name:'producedAt',value: '生产日期'},
+                {name:'validAt',value: '失效日期'},
+                {name:'batchNumber',value: '批次号'},
+                {name:'location',value: '库位'},
+                {name:'region',value: '库区'},
+                {name:'createdAt',value: '导入日期'},
+                {name:'userName',value: '操作人'},
+            ];
+            let header = new Header({
+                el: "#header",
+                column: column,
+                data: this.models,
+                restorationColumn: 'id',
+            });
+            header.init();
+        },
+        methods:{
+            selectFile(){
+                $("#file").click();
+            },
+            importAssign(e){
+                let file=e.target.files[0];
+                if (!file){
+                    tempTip.setDuration(3000);
+                    tempTip.setIndex(1099);
+                    tempTip.show("未选择文件");
+                    return;
+                }
+                let formData = new FormData();
+                formData.append("file",file);
+                window.tempTip.setIndex(1099);
+                window.tempTip.setDuration(9999);
+                window.tempTip.waitingTip("执行中,请耐心等候......");
+                axios.post('{{url('order/index/commodityAssign/import')}}',formData,{
+                    'Content-Type':'multipart/form-data'
+                })
+                    .then(res=>{
+                        if (res.data.success) {
+                            if (res.data.data.length>0) {
+                                this.models.unshift.apply(this.models,res.data.data);
+                                if (this.models.length>50) this.models.split(50);
+                            }
+                            this.errors = res.data.errors;
+                            tempTip.cancelWaitingTip();
+                            tempTip.setDuration(2000);
+                            tempTip.showSuccess("导入成功!");
+                            return;
+                        }
+                        tempTip.cancelWaitingTip();
+                        tempTip.setDuration(3000);
+                        tempTip.show(res.data.data);
+                    }).catch(err=> {
+                    tempTip.cancelWaitingTip();
+                    tempTip.setDuration(3000);
+                    tempTip.show("网络错误:"+err);
+                })
+            }
+        },
+    });
+</script>
+@endsection

+ 4 - 0
resources/views/order/index/menu.blade.php

@@ -8,6 +8,10 @@
                     <li class="nav-item">
                         <a class="nav-link" href="{{url('order/index/delivering')}}" :class="{active:isActive('delivering',3)}">查询</a>
                     </li> @endcan
+                @can('商品配置')
+                    <li class="nav-item">
+                        <a class="nav-link" href="{{url('order/index/commodityAssign')}}" :class="{active:isActive('commodityAssign',3)}">商品配置</a>
+                    </li> @endcan
             </ul>
         </div>
     </div>

+ 2 - 0
resources/views/order/issue/index.blade.php

@@ -789,6 +789,8 @@
                     {name: 'hiddenTag', type: 'input', tip: '隐藏标识',placeholder: '标识'},
                     {name: 'is_new_rejecting', type: 'select', tip: '退件状态',placeholder: '退件状态',data:[{name:'无',value:'无'},{name:'有',value:'有'},{name:'已处理',value:'已处理'}]},
                     {name: 'rejectingStatus', type: 'select', tip: '退单状态',placeholder: '退单状态',data:this.rejectingStatus},
+                    {name: 'sendOrderClientCode', type: 'input', tip: '二次客户订单号',placeholder: '二次客户订单号'},
+                    {name: 'sendOrderLogisticNumber', type: 'input', tip: '二次运单号',placeholder: '二次运单号'},
                 ]];
                 this.form = new query({
                     el: '#form_div',

+ 1 - 1
resources/views/order/menu.blade.php

@@ -4,7 +4,7 @@
         <ul class="nav nav-pills">
             @can('订单管理-查询')
             <li class="nav-item">
-                <a class="nav-link" href="{{url('order/index/delivering')}}" :class="{active:isActive('delivering',3)}">订单</a>
+                <a class="nav-link" href="{{url('order/index/delivering')}}" :class="{active:isActive('index',2)}">订单</a>
             </li>
             @endcan
             @can('订单管理-波次-查询')

+ 1 - 0
resources/views/order/tracking/index.blade.php

@@ -320,6 +320,7 @@
                         {name:'owner_id',type:'select_multiple_select', tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的客户'], placeholder: ['货主', '定位或多选货主'], data: _this.owners},
                         {name:'start_planning_sent_at',type:'dateTime',tip:'应送达时间开始',placeholder:'应送达时间开始'},
                         {name:'client_code',type:'input',tip:'订单号',placeholder:'订单号'},
+                        {name:'web_order_number',type:'input',tip:'web+订单号',placeholder:'web+订单号'},
                         {name:['client','addtime'],type:'input_select',tip:['右侧选择查询范围,默认为一月内','查询范围,范围越短搜索越快'],placeholder: ['客户',''],
                             data:selectDate1, rules:[{son:{addtime:{default:'31',required_without_all_if:['start_at','end_at']}}},
                                 {date_relevance:{date:['start_at','end_at'],relevance:'addtime',killing:'date',default:[15,31,92,183,366]}}]},

+ 50 - 30
resources/views/store/checkingReceive/show.blade.php

@@ -109,12 +109,12 @@
                     <td>@{{ storeCheckingReceiveItem.imported_amount }}</td>
                     <td @click="showInput(storeCheckingReceiveItem.id)" v-if="is_show">
                         <div class="form-inline">
-                            <input  @blur="delFocus()" :id = "'counted_amount_'+storeCheckingReceiveItem.id" :value="storeCheckingReceiveItem.counted_amount"
-                                    class="form-control form-control-sm" type="text" :disabled="disabledItemId == storeCheckingReceiveItem.id ? false : true">
+                            <input @focus="showInput(storeCheckingReceiveItem.id)"  @blur="delFocus()" :id = "'counted_amount_'+storeCheckingReceiveItem.id" :value="storeCheckingReceiveItem.counted_amount"
+                                    class="form-control form-control-sm" type="number" :disabled="disabledItemId == storeCheckingReceiveItem.id ? false : true">
                             <button v-if="disabledItemId == storeCheckingReceiveItem.id" type="button" class="btn btn-sm btn-success ml-1"
                                 @click="updateCountedAmount(storeCheckingReceiveItem)">确定</button>
                             <button v-if="disabledItemId == storeCheckingReceiveItem.id" type="button" class="btn btn-sm btn-danger"
-                                @click="disabledItemId = ''">取消</button>
+                                @click.stop="disabledItemId = ''">取消</button>
                         </div>
                     </td>
                     <td v-if="!is_show">@{{ storeCheckingReceiveItem.counted_amount }}</td>
@@ -125,19 +125,20 @@
                     <td>@{{ storeCheckingReceiveItem.invalid_at }}</td>
                     <td>@{{ storeCheckingReceiveItem.batch_code }}</td>
                     <td>@{{ storeCheckingReceiveItem.unique_code }}</td>
+                    <td>@can('入库管理-盘收一体-盘收-编辑')<button @click="destroyItem(storeCheckingReceiveItem,i)" class="btn btn-sm btn-outline-danger">删除</button>@endcan</td>
                 </tr>
             </table>
         </div>
         <!-- phone <544 -->
         <div class="d-xl-none">
             <div v-for="(storeCheckingReceiveItem,i) in storeCheckingReceiveItems" class="mt-1 border border-1 rounded"
-                 @click="openAll(storeCheckingReceiveItem.id)">
+                @click="openAll(storeCheckingReceiveItem.id)">
                 <div class="row">
                     <div class="col-6">
                         <label class="text-muted">序号:</label>@{{ i+1 }}
                     </div>
                     <div class="col-6">
-                        <span class="pull-right mr-1 text-muted font-weight-bold">···</span>
+                        <span class="pull-right mr-1 text-primary font-weight-bold small">点击展开</span>
                     </div>
                 </div>
                 <div class="row">
@@ -151,8 +152,8 @@
                     </div>
                 </div>
                 <div class="row">
-                    <div class="col-12">
-                        <label class="text-muted">名称:</label>@{{ storeCheckingReceiveItem.commodity_name }}
+                    <div class="col-12 form-inline">
+                        <label class="text-muted w-25">名称:</label><div class="w-75">@{{ storeCheckingReceiveItem.commodity_name }}</div>
                     </div>
                 </div>
                 <div class="row">
@@ -163,29 +164,21 @@
                         <label class="text-muted">实盘数:</label>@{{ storeCheckingReceiveItem.counted_amount }}
                     </div>
                 </div>
-                <div v-if="signOpenId == storeCheckingReceiveItem.id">
-                    <div class="row">
-                        <div class="col-6">
-                            <label class="text-muted">导入数:</label>@{{ storeCheckingReceiveItem.imported_amount }}
-                        </div>
-                        <div class="col-6">
-                            <label class="text-muted">ASN数:</label>@{{ storeCheckingReceiveItem.asn_amount }}
-                        </div>
+                <div class="row">
+                    <div class="col-6">
+                        <label class="text-muted">导入差异:</label><small class="text-danger font-weight-bold">@{{ storeCheckingReceiveItem.imported_diff_amount }}</small>
                     </div>
-                    <div class="row">
-                        <div class="col-6">
-                            <label class="text-muted">导入差异:</label>@{{ storeCheckingReceiveItem.imported_diff_amount }}
-                        </div>
-                        <div class="col-6">
-                            <label class="text-muted">ASN差异:</label>@{{ storeCheckingReceiveItem.asn_amount }}
-                        </div>
+                    <div class="col-6">
+                        <label class="text-muted">ASN差异:</label><small class="text-danger font-weight-bold">@{{ storeCheckingReceiveItem.asn_amount }}</small>
                     </div>
+                </div>
+                <div :id="'detail_'+storeCheckingReceiveItem.id" class="up">
                     <div class="row">
                         <div class="col-6">
-                            <label class="text-muted">导入差异:</label>@{{ storeCheckingReceiveItem.imported_amount }}
+                            <label class="text-muted">导入:</label>@{{ storeCheckingReceiveItem.imported_amount }}
                         </div>
                         <div class="col-6">
-                            <label class="text-muted">ASN差异:</label>@{{ storeCheckingReceiveItem.asn_diff_amount }}
+                            <label class="text-muted">ASN数:</label>@{{ storeCheckingReceiveItem.asn_amount }}
                         </div>
                     </div>
                     <div class="row">
@@ -204,6 +197,11 @@
                             <label class="text-muted">批次号码:</label>@{{ storeCheckingReceiveItem.batch_code }}
                         </div>
                     </div>
+                    <div class="row">
+                        <div class="col-10 offset-1">
+                            @can('入库管理-盘收一体-盘收-编辑')<button @click.stop="destroyItem(storeCheckingReceiveItem,i)" class="btn btn-sm btn-outline-danger w-100">删除</button>@endcan
+                        </div>
+                    </div>
                 </div>
             </div>
         </div>
@@ -224,7 +222,7 @@
                 @foreach($storeCheckingReceive->storeCheckingReceiveItems as $storeCheckingReceiveItem)
                 {id:'{{$storeCheckingReceiveItem->id}}',bin_number:'{{$storeCheckingReceiveItem->bin_number}}',
                 commodity_name:"{{$storeCheckingReceiveItem->commodity ? $storeCheckingReceiveItem->commodity->name : ''}}",
-                commodity_barcodes:{!! $storeCheckingReceiveItem->commodity ? ($storeCheckingReceiveItem->commodity->barcodes ? $storeCheckingReceiveItem->commodity->barcodes : []) : [] !!},
+                commodity_barcodes:{!! $storeCheckingReceiveItem->commodity ? ($storeCheckingReceiveItem->commodity->barcodes ? $storeCheckingReceiveItem->commodity->barcodes : json_encode([])) : json_encode([]) !!},
                 imported_amount:'{{$storeCheckingReceiveItem->imported_amount}}',counted_amount:'{{$storeCheckingReceiveItem->counted_amount}}',
                 asn_amount:'{{$storeCheckingReceiveItem->asn_amount}}',imported_diff_amount:'{{$storeCheckingReceiveItem->imported_diff_amount}}',
                 asn_diff_amount:'{{$storeCheckingReceiveItem->asn_diff_amount}}',produced_at:'{{$storeCheckingReceiveItem->produced_at}}',
@@ -253,10 +251,11 @@
             lastScannedBarcode : '',
             asn : '',
             is_show : {!! $is_show !!},
-            signOpenId : "",
             disabledItemId : "",
+            upId:"",
         },
         mounted(){
+            $(".up").slideUp();
             $('#container').removeClass('d-none');
             $(".tooltipTarget").tooltip({'trigger':'hover'});
             let column = [
@@ -273,6 +272,7 @@
                 {name:'invalid_at',value: '有效期'},
                 {name:'batch_code',value: '批次号'},
                 {name:'unique_code',value: '唯一码'},
+                {name:'operating',value: '操作', neglect: true},
             ];
             let header = new Header({
                 el: "#header",
@@ -286,8 +286,11 @@
         methods:{
             //显示该条全部信息
             openAll(id){
-                if (this.signOpenId === id ) this.signOpenId = "";
-                else this.signOpenId = id;
+                if (this.upId == id) {$("#detail_"+id).slideUp(); this.upId = ''}
+                else {
+                    this.upId = id;
+                    $("#detail_"+id).slideDown();
+                }
             },
             //获取焦点,取消全局监听
             showInput(id){
@@ -541,9 +544,7 @@
                     _this.inputting.bin_number = item.bin_number;
                     _this.commit(item, signIncreasing);
                 }else{
-                    //_this.status.binDisable=false;
                     _this.lastScannedBarcode = _this.inputting.barcode;
-                    //_this.inputting.bin_number = item.bin_number;
                     _this.focusOutDocument();
                     window.tempTip.setInputType('number');
                     window.tempTip.inputVal('该条码存在但无隔口号,请输入:', function (bin_number) {
@@ -699,6 +700,25 @@
                         window.tempTip.setDuration(3000);
                         window.tempTip.show("网络错误:"+err);
                     });
+            },
+            destroyItem(item,index){
+                let url = "{{url("store/checkingReceive/destroyItem")}}";
+                let param = {id:item.id};
+                window.tempTip.confirm("确定要删除商品“"+item.commodity_name+"”的盘点吗?",()=>{
+                    window.axios.post(url,param).then((res)=>{
+                        if (res.data.success){
+                            this.$delete(this.storeCheckingReceiveItems,index);
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.showSuccess("删除成功");
+                            return;
+                        }
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show(res.data.data);
+                    }).catch(err=>{
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                });
             }
         },
     });

+ 9 - 0
routes/web.php

@@ -159,6 +159,9 @@ Route::group(['prefix'=>'maintenance'],function(){
     Route::group(['prefix'=>'carType'],function (){
         Route::post('get','CarTypesController@get');
     });
+    Route::group(['prefix'=>"log"],function (){
+        Route::get("exception",'LogController@exception');
+    });
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');
     Route::resource('log', 'LogController');
@@ -328,6 +331,7 @@ Route::group(['prefix'=>'store'],function(){
         Route::post('updateCountedAmount','StoreCheckingReceiveController@updateCountedAmount');
         Route::post('insertItem','StoreCheckingReceiveController@insertItem');
         Route::get('mission','StoreCheckingReceiveController@mission');
+        Route::post('destroyItem','StoreCheckingReceiveController@destroyItem');
     });
 });
 
@@ -498,7 +502,12 @@ Route::group(['prefix'=>'order'],function(){
     /** 主页 */
     Route::group(['prefix'=>'index'],function(){
         Route::get('delivering','OrderController@delivering');
+        Route::get('commodityAssign','OrderCommodityAssignController@index');
         Route::match(['get','post'],'export','OrderController@export');
+
+        Route::group(['prefix'=>'commodityAssign'],function(){
+            Route::post('import','OrderCommodityAssignController@import');
+        });
     });
     /** 创建 */
     Route::group(['prefix'=>'create'],function(){

+ 0 - 0
tests/webApi/CreatesApplication.php → tests/CreatesApplication.php


+ 57 - 0
tests/Services/LogisticService/GetLogisticByCodesTest.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace Tests\Services\LogisticService;
+
+use App\OracleBasCustomer;
+use App\Services\LogisticService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Tests\TestCase;
+
+class GetLogisticByCodesTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /** @var LogisticService $service */
+    private $service;
+    private $data;
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service  = app('LogisticService');
+        $baseCustomers = OracleBasCustomer::query()
+            ->selectRaw('Customer_Type,CustomerID,Descr_C')
+            ->where('Customer_Type','CA')
+            ->get();
+
+        $this->data['baseCustomers'] = $baseCustomers;
+        $this->data['codes'] = $baseCustomers->map(function($baseCustomer){
+            return $baseCustomer->customerid;
+        });
+    }
+
+    /**
+     * @test
+     */
+    public function getLogisticByCodes()
+    {
+        $logistics = $this->service->getLogisticByCodes($this->data['codes']);
+        $this->assertNotEmpty($logistics);
+        foreach ($logistics as $logistic) {
+            $baseCustomer = $this->data['baseCustomers']->where('customerid',$logistic->code)->where('descr_c',$logistic->name);
+            $this->assertNotEmpty($baseCustomer);
+            $this->assertEquals(1,$baseCustomer->count());
+        }
+        foreach ($this->data['baseCustomers'] as $baseCustomer) {
+            $logistic = $logistics->where('code',$baseCustomer['customerid'])->where('name',$baseCustomer['descr_c']);
+            $this->assertNotEmpty($logistic);
+            $this->assertEquals(1,$logistic->count());
+        }
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 65 - 0
tests/Services/OrderCommodityService/SyncOrderCommoditiesTest.php

@@ -0,0 +1,65 @@
+<?php
+
+
+namespace Tests\Services\OrderCommodityService;
+
+use Carbon\Carbon;
+use Tests\TestCase;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderCommodity;
+use App\Services\OrderCommodityService;
+use App\Services\OrderService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+
+class SyncOrderCommoditiesTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /**
+     * @var OrderService $orderService
+     * @var OrderCommodityService $service
+     */
+    private $service;
+    private $orderService;
+    private $data = [];
+
+    public function setUp(): void
+    {
+        parent::setUp();
+        $this->service = app('OrderCommodityService');
+        $this->orderService = app('OrderService');
+    }
+
+    /**
+     * @test
+     */
+    public function syncOrderCommodities()
+    {
+        $orderHeader  = OracleDOCOrderHeader::query()->with('oracleDOCOrderDetails')->where('sostatus','99')->orderByDesc('addTime')->first();
+        $orderHeaders = collect();
+        $orderHeaders->push($orderHeader);
+
+        $this->orderService->syncOrderByWMSOrderHeaders($orderHeaders);
+        $this->service->syncOrderCommodities($orderHeaders);
+
+        $order = Order::query()->where('code',$orderHeader->orderno)->first();
+        $orderCommodities = OrderCommodity::query()->with('commodity')->where('order_id',$order['id'])->get();
+        $oracleDOCOrderDetails =  $orderHeader->oracleDOCOrderDetails;
+        $oracleDOCOrderDetails->each(function($detail)use($orderCommodities){
+            $orderCommodity = $orderCommodities->where('commodity.sku',$detail['sku'])->where('amount',$detail['qtyordered'])->first();
+            $this->assertNotNull($orderCommodity);
+        });
+
+        $orderCommodities->each(function($orderCommodity)use($oracleDOCOrderDetails){
+            $detail = $oracleDOCOrderDetails->where('sku',$orderCommodity->commodity->sku)->where('qtyordered',$orderCommodity->amount)->first();
+            $this->assertNotNull($detail);
+        });
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 73 - 7
tests/Services/OrderService/CreateOrFindOrderInfoTest.php

@@ -2,9 +2,21 @@
 
 namespace Tests\Services\OrderService;
 
+use App\Commodity;
+use App\Logistic;
+use App\OracleActAllocationDetails;
+use App\OracleBasCode;
+use App\OracleBasCustomer;
+use App\OracleBasSKU;
+use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\Order;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\Owner;
 use App\Services\OrderService;
+use App\Shop;
+use App\Warehouse;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Tests\TestCase;
 
@@ -16,22 +28,76 @@ class CreateOrFindOrderInfoTest extends TestCase
      * @var OrderService $orderService
      */
     public $orderService;
-    public $data = [];
-    public $order;
+    private $data = [];
 
     public function setUp(): void
     {
         parent::setUp(); // TODO: Change the autogenerated stub
         $this->orderService = app('OrderService');
+
+        $wmsOrderHeader = factory(OracleDOCOrderHeader::class)->make([
+            'customerid'=>'TEST_OW','sostatus'=>99,'userdefine1'=>'TEST_CA','warehouseid'=>'WH_TEST'
+        ]);
+        $this->data['warehouse']    = factory(Warehouse::class)->create(['code'=>'WH_TEST']);
+        $this->data['logistic']     = factory(Logistic::class)->create(['code'=>'TEST_CA','name'=>'测试承运商']);
+        $this->data['owner']        = factory(Owner::class)->create(['code'=>'TEST_OW','name'=>'测试货主']);
+        $this->data['shop']         = factory(Shop::class)->create(['owner_id'=>$this->data['owner']['id']]);
+
+        $code_BasCode  = factory(OracleBasCode::class)->make(['codeid'=>'OW','code'=>'99','descr_c'=>'订单完成']);
+        $orderType = factory(OracleBasCode::class)->make(['code'=>'sysy', 'codeid'=>'SO_TYP', 'codename_c'=>'测试状态']);
+
+        $basSku1 = factory(OracleBasSKU::class)->make(['customerid' => 'TEST_OW']);
+        $basSku2 = factory(OracleBasSKU::class)->make(['customerid' => 'TEST_OW']);
+        $basSku3 = factory(OracleBasSKU::class)->make(['customerid' => 'TEST_OW']);
+
+        $this->data['sku'] = [];
+        $this->data['sku'][] = factory(Commodity::class)->create(['owner_id'=>$this->data['owner']['id'],'sku'=>$basSku1['sku']]);
+        $this->data['sku'][] = factory(Commodity::class)->create(['owner_id'=>$this->data['owner']['id'],'sku'=>$basSku2['sku']]);
+        $this->data['sku'][] = factory(Commodity::class)->create(['owner_id'=>$this->data['owner']['id'],'sku'=>$basSku3['sku']]);
+
+        $oracleDOCOrderDetail1 = factory(OracleDOCOrderDetail::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku1->sku]);
+        $oracleDOCOrderDetail2 = factory(OracleDOCOrderDetail::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku2->sku]);
+        $oracleDOCOrderDetail3 = factory(OracleDOCOrderDetail::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku3->sku]);
+        $oracleDOCOrderDetails = collect([$oracleDOCOrderDetail1,$oracleDOCOrderDetail3,$oracleDOCOrderDetail2]);
+        $wmsOrderHeader->setRelation('oracleDOCOrderDetails',$oracleDOCOrderDetails);
+
+        $OracleActAllocationDetail1 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku1->sku]);
+        $OracleActAllocationDetail2 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku2->sku]);
+        $OracleActAllocationDetail3 = factory(OracleActAllocationDetails::class)->make(['orderno'=>$wmsOrderHeader->orderno,'customerid'=>'TEST_OW','sku'=>$basSku3->sku]);
+        $OracleActAllocationDetails = collect([$OracleActAllocationDetail1,$OracleActAllocationDetail2,$OracleActAllocationDetail3]);
+        $wmsOrderHeader->setRelation('actAllocationDetails',$OracleActAllocationDetails);
+
+        $wmsOrderHeader->setRelation('orderType',$orderType);
+        $wmsOrderHeader->setRelation('oracleBASCode',$code_BasCode);
+        $this->data['orderHeader'] = $wmsOrderHeader;
     }
 
-    public function testCreateOrFindOrderInfo()
+    /**
+     * @test
+     */
+    public function createOrFindOrderInfo()
     {
-        $orderHeader =  OracleDOCOrderHeader::query()->orderByDesc('addTime')->first();
-        $this->orderService->createOrFindOrderInfo($orderHeader);
-        $order = Order::query()->where('code',$orderHeader->orderno)->first();
+        $this->orderService->createOrFindOrderInfo($this->data['orderHeader']);
+        $order = Order::query()->where('code',$this->data['orderHeader']['orderno'])->first();
         $this->assertNotNull($order);
-        $this->assertEquals($order->code,$orderHeader->orderno);
+        $this->assertEquals($order->code,$this->data['orderHeader']['orderno']);
+        $orderPackages  = OrderPackage::query()->where('order_id',$order['id'])->get();
+        $orderPackagesCommodities = OrderPackageCommodities::query()->whereIn('order_package_id',data_get($orderPackages,'*.id'))->get();
+
+        $this->assertNotEmpty($orderPackages);
+        $this->assertNotEmpty($orderPackagesCommodities);
     }
 
+    public function tearDown(): void
+    {
+        cache()->flush();
+        Commodity::query()->whereIn('id',data_get($this->data['sku'],'*.id'))->delete();
+        $order = Order::query()->where('code',$this->data['orderHeader']['orderno'])->first();
+        $order->delete();
+        $this->data['logistic']->delete();
+        $this->data['owner']->delete();
+        $this->data['logistic']->delete();
+        $this->data['shop']->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 67 - 13
tests/Services/OrderService/CreateOrFindOrderTest.php

@@ -3,13 +3,18 @@
 namespace Tests\Services\OrderService;
 
 use App\Logistic;
+use App\OracleBasCode;
+use App\OracleBasCustomer;
 use App\OracleDOCOrderHeader;
 use App\Order;
 use App\Owner;
 use App\Services\OrderService;
 use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Support\Str;
 use Tests\TestCase;
 
 class CreateOrFindOrderTest extends TestCase
@@ -19,29 +24,78 @@ class CreateOrFindOrderTest extends TestCase
      * @var OrderService $orderService
      */
     public $orderService;
+    private $data = [];
     public function setUp(): void
     {
         parent::setUp();
         $this->orderService = app('OrderService');
-    }
+        $this->data['orderno'] = md5('订单编号'.((string)Carbon::now()));
+        $this->data['warehouse_code'] = 'test';
+        $this->data['userdefine1'] ='测试物流';
+        $this->data['customerid'] = '测试货主';
+        $this->data['issuepartyname'] = '测试商铺';
+        $this->data['orderType'] = '测试';
+
+        $orderHeader = new OracleDOCOrderHeader();
+        $orderHeader->fillable([
+            'orderno' ,'c_contact','c_tel2','c_province','c_city','addtime','edittime',
+            'c_district','c_address1','soreference1','userdefine1','sostatus',
+            'warehouseid','customerid','issuepartyname','orderType']);
+        $orderHeader->fill([
+            'orderno' =>$this->data['orderno'],
+            'c_contact' =>'承运商',
+            'c_tel2' =>'承运商',
+            'c_province' =>'shou',
+            'c_city' =>'shou',
+            'c_district' =>'shou',
+            'c_address1' =>md5('客户订单号'),
+            'soreference1' => Str::uuid(),
+            'userdefine1' =>$this->data['userdefine1'],
+            'warehouseid' =>$this->data['warehouse_code'],
+            'customerid' =>$this->data['customerid'],
+            'issuepartyname' =>$this->data['issuepartyname'],
+            'orderType' =>'sysy',
+            'sostatus' =>'99',
+            'addtime' => Carbon::now(),
+            'addtime' =>Carbon::now(),
+        ]);
 
+        $orderType = new OracleBasCode();
+        $orderType->fillable(['code','codeid','codename_c']);
+        $orderType->fill([
+            'code'=>'sysy', 'codeid'=>'SO_TYP', 'codename_c'=>'测试'
+        ]);
+        $orderHeader->setRelation('orderType',$orderType);
+
+        $this->data['orderHeader'] =$orderHeader;
+        $this->data['logistic'] =  Logistic::query()->firstOrCreate(['code'=>$this->data['userdefine1'],'name'=>'测试物流']);
+        $this->data['owner'] = Owner::query()->firstOrCreate(['code'=>$this->data['customerid'],'name'=>'测试货主']);
+        $this->data['shop'] =Shop::query()->firstOrCreate(['name'=>$this->data['issuepartyname'],'owner_id'=>$this->data['owner']->id]);
+        $this->data['warehouse'] = Warehouse::query()->firstOrCreate(["code"=>$this->data['warehouse_code'],"name"=>'测试仓库']);
+    }
     /**
      * @test
      */
     public function createOrFindOrder()
     {
-        $orderHeader = OracleDOCOrderHeader::query()->where('sostatus',99)->orderByDesc('addtime')->first();
-        Logistic::query()->firstOrCreate(['code'=>$orderHeader->userdefine1,'name'=>'']);
-        $owner = Owner::query()->firstOrCreate(['code'=>$orderHeader->customerid,'name'=>'']);
-        Shop::query()->firstOrCreate(['name'=>$orderHeader->issuepartyname,'owner_id'=>$owner->id]);
-        app('WarehouseService')->firstOrCreate(["code"=>$orderHeader->warehouseid],["code"=>$orderHeader->warehouseid,"name"=>$orderHeader->warehouseid]);
-        if(!$orderHeader){
-            $this->assertNull($orderHeader);
-            return;
-        }
-        $this->orderService->createOrFindOrder($orderHeader);
-        $order = Order::query()->where('code',$orderHeader->orderno)->first();
+        $this->orderService->createOrFindOrder($this->data['orderHeader']);
+        /** @var Order $order */
+        $order = Order::query()->where('code',$this->data['orderHeader']['orderno'])->first();
         $this->assertNotNull($order);
-        $this->assertEquals($order->code,$orderHeader->orderno);
+        $this->assertEquals($order->code,$this->data['orderHeader']['orderno']);
+        $this->assertEquals($order->client_code,$this->data['orderHeader']['soreference1']);
+        $this->assertEquals((string)$order->created_at,(string)$this->data['orderHeader']['addtime']);
+        $this->assertEquals((string)$order->wms_edittime,(string)$this->data['orderHeader']['edittime']);
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        $this->data['logistic']->delete();
+        $this->data['owner']->delete();
+        $this->data['shop']->delete();
+        $this->data['warehouse']->delete();
+        Order::query()->where('code',$this->data['orderHeader']['orderno'])->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 0 - 29
tests/Services/OrderService/FilterOrderByCacheTeat.php

@@ -1,29 +0,0 @@
-<?php
-
-namespace Tests\Services\OrderService;
-
-use App\Services\OrderService;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-use Illuminate\Foundation\Testing\WithFaker;
-use Tests\TestCase;
-
-class FilterOrderByCacheTeat extends TestCase
-{
-    /**
-     * @var OrderService $service
-     */
-    private $service;
-    public function setUp(): void
-    {
-        parent::setUp(); // TODO: Change the autogenerated stub
-        $this->service = app('OrderService');
-    }
-
-    /**
-     * @test
-     */
-    public function testFilterOderByCache()
-    {
-
-    }
-}

+ 40 - 8
tests/Services/OrderService/FindOrCreateByClientCodeTest.php

@@ -2,8 +2,13 @@
 
 namespace Tests\Services\OrderService\FindOrCreateByClientCodeTest;
 
+use App\Logistic;
 use App\OracleDOCOrderHeader;
+use App\Order;
+use App\Owner;
 use App\Services\OrderService;
+use App\Shop;
+use App\Warehouse;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use Illuminate\Foundation\Testing\WithFaker;
 use Tests\TestCase;
@@ -14,11 +19,32 @@ class FindOrCreateByClientCodeTest extends TestCase
 
     /** @var OrderService $service */
     public $service;
+    private $data;
 
     public function setUp(): void
     {
         parent::setUp(); // TODO: Change the autogenerated stub
         $this->service=app('OrderService');
+
+        $orderHeader = new OracleDOCOrderHeader();
+        $orderHeader->orderno = md5('订单编号');
+        $orderHeader->c_contact= '京东旗舰店';
+        $orderHeader->c_tel2 = md5('承运商');
+        $orderHeader->c_province = md5('收货人');
+        $orderHeader->c_city = md5('shou');
+        $orderHeader->c_district = md5('shou');
+        $orderHeader->c_address1 = md5('shou');
+        $orderHeader->soreference1 = md5('客户订单号');
+        $orderHeader->userdefine1 = $this->data['userdefine1'];
+        $orderHeader->warehouseid = $this->data['warehouse_code'];
+        $orderHeader->customerid = $this->data['customerid'];
+        $orderHeader->issuepartyname =$this->data['issuepartyname'];
+        $orderHeader->setAppends(['orderType'=>['codename_c'=>$this->data['orderType']]]);
+        $this->data['orderHeader'] = $orderHeader;
+        $this->data['logistic'] =  Logistic::query()->firstOrCreate(['code'=>$this->data['userdefine1'],'name'=>'测试物流']);
+        $this->data['owner'] = Owner::query()->firstOrCreate(['code'=>$this->data['customerid'],'name'=>'测试货主']);
+        $this->data['shop'] =Shop::query()->firstOrCreate(['name'=>$this->data['issuepartyname'],'owner_id'=>$this->data['owner']->id]);
+        $this->data['warehouse'] = Warehouse::query()->firstOrCreate(["code"=>$this->data['warehouse_code'],"name"=>'测试仓库']);
     }
 
     /**
@@ -26,16 +52,22 @@ class FindOrCreateByClientCodeTest extends TestCase
      */
     public function findOrCreateByClientCode()
     {
-        $clientCode = OracleDOCOrderHeader::query()
-            ->orderByDesc('AddTime')
-            ->where('sostatus',99)
-            ->first()
-            ->soreference1;
-
-        $order =  $this->service->findOrCreateByClientCode($clientCode);
-        $this->assertNotEmpty($clientCode);
+
+        $order =  $this->service->findOrCreateByClientCode($this->data['orderHeader']->soreference1);
+        $this->assertNotEmpty($this->data['orderHeader']['soreference1']);
         $this->assertNotEmpty($order);
         $this->assertNotNull($order->client_code);
         $this->assertNotNull($order->warehouse_id);
     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        $this->data['logistic']->delete();
+        $this->data['owner']->delete();
+        $this->data['shop']->delete();
+        $this->data['warehouse']->delete();
+        Order::query()->where('code',$this->data['orderHeader']['orderno'])->delete();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 0 - 41
tests/Services/OrderService/GetByWmsOrdersTest.php

@@ -1,41 +0,0 @@
-<?php
-
-namespace Tests\Services\OrderService\GetByWmsOrdersTest;
-
-use App\OracleDOCOrderHeader;
-use App\Order;
-use App\Services\OrderService;
-use Illuminate\Foundation\Testing\RefreshDatabase;
-use Illuminate\Foundation\Testing\WithFaker;
-use Tests\TestCase;
-
-class GetByWmsOrdersTest extends TestCase
-{
-    use RefreshDatabase;
-
-    /** @var OrderService $service */
-    public $service;
-
-    public function setUp(): void
-    {
-        parent::setUp();
-        $this->service = app('OrderService');
-    }
-
-    public function testGetByWmsOrders()
-    {
-        $orderHeader = OracleDOCOrderHeader::query()->where('sostatus',99)->orderByDesc('addtime')->first();
-        $orderHeaders = OracleDOCOrderHeader::query()
-            ->where('sostatus',99)
-            ->where('addtime','>=',$orderHeader->addtime)
-            ->get();
-
-        $order_nos = data_get($orderHeaders,'*.orderno');
-        $this->service->syncOrder($orderHeaders);
-        $orders = Order::query()->whereIn('code',$order_nos)->get();
-        $this->assertEquals($orders->count(),$orders->count());
-        foreach ($orderHeaders as $orderHeader) {
-            $this->assertNotNull($orders->where('code',$orderHeader->orderno));
-        }
-    }
-}

+ 28 - 1
tests/Services/OrderService/GetCreateOrderModelByWMSOrderHeadersTest.php

@@ -41,6 +41,7 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
     public $logisticService;
     public $shopService;
     public $warehouseService;
+
     public function setUp(): void
     {
         parent::setUp();
@@ -53,7 +54,10 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
         $this->warehouseService=app('WarehouseService');
     }
 
-    public function testGetCreateOrderModelByWMSOrderHeaders()
+    /**
+     * @test
+     */
+    public function getCreateOrderModelByWMSOrderHeaders()
     {
 
         $orderHeader = OracleDOCOrderHeader::query()->where('sostatus',99)->orderByDesc('addtime')->first();
@@ -121,4 +125,27 @@ class GetCreateOrderModelByWMSOrderHeadersTest extends TestCase
     {
         return $this->shopService->getByWmsOrders($orderHeaders);
     }
+
+    public function tearDown(): void
+    {
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+    public function getOrderHeader($userdefine1,$warehouse_code,$customerid,$issuepartyname,$orderType){
+        $orderHeader = new OracleDOCOrderHeader();
+        $orderHeader->orderno = '订单编号';
+        $orderHeader->c_contact= '京东旗舰店';
+        $orderHeader->c_tel2 = '承运商';
+        $orderHeader->c_province = '收货人';
+        $orderHeader->c_city = 'shou';
+        $orderHeader->c_district = 'shou';
+        $orderHeader->c_address1 = 'shou';
+        $orderHeader->soreference1 = '客户订单号';
+        $orderHeader->userdefine1 = $userdefine1;
+        $orderHeader->warehouseid = $warehouse_code;
+        $orderHeader->customerid = $customerid;
+        $orderHeader->issuepartyname = $issuepartyname;
+        $orderHeader->setAppends(['orderType'=>['codename_c'=>$orderType]]);
+        return $orderHeader;
+    }
 }

+ 11 - 8
tests/Services/OrderService/GetOrderByLogisticNumberTest.php

@@ -33,11 +33,9 @@ class GetOrderByLogisticNumberTest extends TestCase
             ->with('actAllocationDetails')
             ->where('sostatus',99)
             ->orderByDesc('AddTime')->first();
-        $orderHeaders = OracleDOCOrderHeader::query()
-            ->where('addtime','>=',$orderHeader->addtime)
-            ->where('sostatus',99)
-            ->get();
 
+        $orderHeaders = collect();
+        $orderHeaders->push($orderHeader);
         $this->service->syncOrder($orderHeaders);
         $order_package = OrderPackage::query()->orderByDesc('id')->first();
 
@@ -48,14 +46,14 @@ class GetOrderByLogisticNumberTest extends TestCase
         $this->assertEquals($orderHeader->orderno,$order->code);
 
         $shop = Shop::query()->where('name',$orderHeader->issuepartyname)->first();
-        $this->assertEquals($shop->id,$order->shop_id);
+        if($shop)$this->assertEquals($shop->id,$order->shop_id);
 
         $owner = Owner::query()->where('code',$orderHeader->customerid)->first();
-        $this->assertEquals($owner->id, $order->owner_id);
+        if($owner)$this->assertEquals($owner->id, $order->owner_id);
         $this->assertEquals($orderHeader->soreference1,$order->client_code);
 
         $logistic = Logistic::query()->where('code',$orderHeader->userdefine1)->first();
-        $this->assertEquals($logistic->id,$order->logistic_id);
+        if($logistic)$this->assertEquals($logistic->id,$order->logistic_id);
         $this->assertEquals($orderHeader->c_contact,$order->consignee_name);
 
         $consignee_phone = empty($orderHeader->c_tel2)?$orderHeader->c_tel1:$orderHeader->c_tel2;
@@ -68,7 +66,12 @@ class GetOrderByLogisticNumberTest extends TestCase
         $this->assertEquals($orderHeader->oracleBASCode_codename_c,$order->wms_status);
 
         $warehouse = Warehouse::query()->where('code',$orderHeader->warehouseid)->first();
-        $this->assertEquals($warehouse->id,$order->warehouse_id);
+        if($warehouse)$this->assertEquals($warehouse->id,$order->warehouse_id);
         $this->assertEquals($orderHeader->edittime,$order->wms_edittime);
     }
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 7 - 1
tests/Services/OrderService/GetOrderSyncAtTest.php

@@ -30,7 +30,7 @@ class GetOrderSyncAtTest extends TestCase
         $this->assertNotEmpty($data);
     }
 
-    /**+
+    /**
      * @test
      */
     public function getUpdatedOrderSyncAt()
@@ -39,4 +39,10 @@ class GetOrderSyncAtTest extends TestCase
         $data = $this->service->getOrderSyncAt($key,'renewal');
         $this->assertNotEmpty($data);
     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 6 - 0
tests/Services/OrderService/LogisticNumberFirstOrCreateOrderTest.php

@@ -30,4 +30,10 @@ class LogisticNumberFirstOrCreateOrderTest extends TestCase
         $order = $this->service->logisticNumberFirstOrCreateOrder($logistic_number);
         $this->assertNotEmpty($order);
     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 1 - 8
tests/Services/OrderService/PushOrderCreatedCacheTest.php

@@ -53,14 +53,7 @@ class PushOrderCreatedCacheTest extends TestCase
 
     public function tearDown(): void
     {
-        try {
-            Cache::forget('order_newest_update_cache_keys');
-            Cache::forget('order_newest_update_has_set');
-            foreach ($this->data['OrderHeader'] as $item) {
-                Cache::forget('order_newest_update_' . $item->orderno);
-            }
-        } catch (\Exception $e) {
-        }
+        cache()->flush();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 1 - 8
tests/Services/OrderService/PushOrderUpdateCacheTest.php

@@ -57,14 +57,7 @@ class PushOrderUpdateCacheTest extends TestCase
 
     public function tearDown(): void
     {
-        try {
-            Cache::forget($this->renewal_list);
-            Cache::forget($this->hasKey);
-            foreach ($this->data['OrderHeader'] as $item) {
-                Cache::forget($this->prefixKey . $item->orderno);
-            }
-        } catch (\Exception $e) {
-        }
+        cache()->flush();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 1 - 0
tests/Services/OrderService/SetOrderSyncAtTest.php

@@ -48,6 +48,7 @@ class SetOrderSyncAtTest extends TestCase
 
     public function tearDown(): void
     {
+        cache()->flush();
         parent::tearDown(); // TODO: Change the autogenerated stub
     }
 }

+ 6 - 0
tests/Services/OrderService/SyncOrderByWMSOrderHeaderTest.php

@@ -87,4 +87,10 @@ class SyncOrderByWMSOrderHeaderTest extends TestCase
             $this->assertEquals((string)$order->created_at ,(string)$orderHeader->addtime);
         }
     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 6 - 0
tests/Services/OrderService/SyncOrderTest.php

@@ -50,4 +50,10 @@ class SyncOrderTest extends TestCase
         $this->assertNotNull($orderHeader);
         $this->assertEquals(count($orderHeaders),count($orders));
     }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
 }

+ 51 - 0
tests/Services/OwnerService/GetOwnerByCodesTest.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace Tests\Services\OwnerService;
+
+use App\OracleBasCustomer;
+use App\Services\OwnerService;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetOwnerByCodesTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /** @var OwnerService $service */
+    private $service;
+    private $data;
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('OwnerService');
+        $basCustomers = OracleBasCustomer::query()->selectRaw('customerid')->where('Customer_Type','OW')->get();
+        $this->data = $basCustomers->map(function($basCustomer){
+            return $basCustomer->customerid;
+        });
+    }
+
+    /**
+     * @test
+     */
+    public function getOwnerByCodesNormal(){
+        $owners = $this->service->getOwnerByCodes($this->data);
+        if(empty($owners)){
+            $this->assertEmpty($owners);
+            $this->assertEmpty($this->data);
+            return;
+        };
+        $this->assertEquals($owners->count(),$this->data->count());
+        foreach ($this->data as $datum) {
+            $owner = $owners->where('code',$datum);
+            $this->assertNotNull($owner);
+        }
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 63 - 0
tests/Services/ShopService/GetShopByCodeMapTest.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace Tests\Services\ShopService;
+
+use App\OracleDOCOrderHeader;
+use App\Owner;
+use App\Services\OwnerService;
+use App\Services\ShopService;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetShopByCodeMapTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /** @var OwnerService $service */
+    private $service;
+    private $data;
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+
+        $this->service = app('ShopService');
+
+        $this->data = [];
+
+        $orderHeader = OracleDOCOrderHeader::query()
+            ->whereNotNull('issuepartyname')
+            ->where('sostatus','99')
+            ->orderByDesc('AddTime')
+            ->first();
+
+        $this->data['orderHeader'] = $orderHeader;
+        $this->data['map'][] = [
+            'owner_code' => $orderHeader['customerid'],
+            'issuepartyname' => $orderHeader['issuepartyname']
+        ];
+    }
+
+
+
+    /**
+     * @test
+     */
+    public function getShopByCodeMap()
+    {
+        $shop =  $this->service->getShopByCodeMap($this->data['map']);
+        $this->assertNotNull($shop);
+        $orderHeader = $this->data['orderHeader'];
+        $owner = Owner::find($shop->first()->owner_id);
+        $this->assertEquals($owner->code,$orderHeader['customerid']);
+        $this->assertEquals($shop->first()->name,$orderHeader['issuepartyname']);
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 1 - 0
tests/Services/WarehouseService/GetByWmsOrderTest.php

@@ -23,6 +23,7 @@ class GetByWmsOrderTest extends TestCase
         parent::setUp();
         $this->service = app(WarehouseService::class);
         $basCustomers = OracleBasCustomer::query()->selectRaw('Customer_Type,CustomerId,Descr_C')->where('Customer_Type','WH')->get();
+        Warehouse::query()->whereNull('id')->delete();
         foreach ($basCustomers as $basCustomer) {
             $this->data['data'][]['warehouseid'] =  $basCustomer->customerid;
         }

+ 54 - 0
tests/Services/WarehouseService/GetWareHouseByCodeTest.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace Tests\Services\WarehouseService;
+
+use App\OracleBasCustomer;
+use App\Services\OwnerService;
+use App\Services\WarehouseService;
+use App\Warehouse;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class GetWareHouseByCodeTest extends TestCase
+{
+    use RefreshDatabase;
+
+    /** @var WarehouseService $service */
+    private $service;
+    private $data;
+
+    public function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        $this->service = app('WarehouseService');
+        $basCustomers = OracleBasCustomer::query()->selectRaw('CustomerId,Descr_C')->where('Customer_Type','WH')->get();
+        $this->data['basCustomers'] = $basCustomers;
+        $this->data['codes'] = $basCustomers->map(function ($basCustomer){
+            return $basCustomer->customerid;
+        });
+    }
+
+    /**
+     * @test
+     */
+    public function getWareHouseByCodeTest()
+    {
+        $wareHouses =  $this->service->getWareHouseByCode($this->data['codes']);
+        $this->assertNotEmpty($wareHouses);
+        foreach ($wareHouses as $wareHouse) {
+            $basCustomer = $this->data['basCustomers']->where('customerid',$wareHouse->code)->where('descr_c',$wareHouse->name);
+            $this->assertNotEmpty($basCustomer);
+        }
+        foreach ($this->data['basCustomers'] as $basCustomer) {
+            $wareHouse = $wareHouses->where('name',$basCustomer['descr_c'])->where('code',$basCustomer['customerid']);
+            $this->assertNotEmpty($wareHouse);
+        }
+    }
+
+    public function tearDown(): void
+    {
+        cache()->flush();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+}

+ 0 - 0
tests/webApi/TestCase.php → tests/TestCase.php