Prechádzať zdrojové kódy

Merge branch 'master' into yang-logistic-fix

# Conflicts:
#	resources/views/package/menu.blade.php
ANG YU 5 rokov pred
rodič
commit
a1656a8c0f
59 zmenil súbory, kde vykonal 1788 pridanie a 725 odobranie
  1. 0 15
      app/Components/SyncResponse.php
  2. 31 8
      app/Console/Commands/SyncBatchTask.php
  3. 1 1
      app/Console/Kernel.php
  4. 423 0
      app/Filters/OrderIssueFilters.php
  5. 1 0
      app/Http/Controllers/OrderController.php
  6. 21 7
      app/Http/Controllers/OrderFreezeController.php
  7. 5 16
      app/Http/Controllers/OrderIssueController.php
  8. 2 2
      app/Http/Controllers/PriceModelController.php
  9. 27 1
      app/Http/Controllers/RegionController.php
  10. 1 0
      app/Http/Controllers/RejectedBillController.php
  11. 76 59
      app/Http/Controllers/TestController.php
  12. 81 79
      app/Http/Controllers/api/thirdPart/flux/SortingController.php
  13. 1 0
      app/Imports/RejectedImport.php
  14. 7 3
      app/Imports/UpdatePickZone.php
  15. 4 1
      app/Jobs/OrderFreeze.php
  16. 15 2
      app/Order.php
  17. 14 6
      app/OrderFreeze.php
  18. 34 0
      app/OrderIssue.php
  19. 2 0
      app/Providers/AppServiceProvider.php
  20. 2 0
      app/Region.php
  21. 6 2
      app/RejectedBill.php
  22. 16 2
      app/Services/OracleDOCOrderHeaderService.php
  23. 6 2
      app/Services/OracleDocWaveDetailService.php
  24. 22 22
      app/Services/OrderFreezeService.php
  25. 0 315
      app/Services/OrderIssueService.php
  26. 23 14
      app/Services/OrderService.php
  27. 19 8
      app/Services/OwnerPriceOperationService.php
  28. 130 0
      app/Services/RegionService.php
  29. 21 15
      app/Services/RejectedBillService.php
  30. 11 6
      app/Services/WaybillService.php
  31. 6 1
      app/Waybill.php
  32. 60 0
      bashupMysql.sh
  33. 51 0
      database/migrations/2021_01_20_104314_add_column_deleted_at_table_region.php
  34. 36 0
      database/migrations/2021_01_20_150801_add_authority_to_level_3_page.php
  35. 32 0
      database/migrations/2021_01_20_165051_add_orders_unique_to_column_code.php
  36. 32 0
      database/migrations/2021_01_20_165449_add_column_district_id_table_waybills.php
  37. 32 0
      database/migrations/2021_01_22_104216_add_column_frozen_to_orders.php
  38. 36 0
      database/migrations/2021_01_22_112931_change_order_freeze_table.php
  39. 7 19
      public/.htaccess
  40. 19 0
      resources/sass/text.scss
  41. 6 2
      resources/views/customer/menu.blade.php
  42. 7 7
      resources/views/customer/project/create.blade.php
  43. 60 45
      resources/views/customer/project/part/_operation.blade.php
  44. 4 0
      resources/views/maintenance/menu.blade.php
  45. 88 0
      resources/views/maintenance/region/index.blade.php
  46. 45 8
      resources/views/order/index/_freezeModal.blade.php
  47. 118 17
      resources/views/order/index/freeze.blade.php
  48. 1 1
      resources/views/order/index/index.blade.php
  49. 4 4
      resources/views/order/issue/index.blade.php
  50. 3 2
      resources/views/package/menu.blade.php
  51. 2 0
      resources/views/personnel/menu.blade.php
  52. 2 1
      resources/views/process/menu.blade.php
  53. 4 2
      resources/views/store/blindReceive/menu.blade.php
  54. 64 4
      resources/views/test.blade.php
  55. 36 24
      resources/views/waybill/index.blade.php
  56. 2 0
      routes/web.php
  57. 25 0
      syncProject.sh
  58. 1 1
      tests/Services/OwnerPriceOperationService/OwnerPriceOperationServiceTest.php
  59. 3 1
      tests/webApi/thirdPart/haochuang/process.http

+ 0 - 15
app/Components/SyncResponse.php

@@ -1,15 +0,0 @@
-<?php
-namespace App\Components;
-
-use Illuminate\Support\Facades\Gate;
-
-trait SyncResponse{
-
-    protected function gate(string $authorityName)
-    {
-        if(!Gate::allows($authorityName)){
-            echo view('exception.authority');
-            exit();
-        }
-    }
-}

+ 31 - 8
app/Console/Commands/SyncBatchTask.php

@@ -107,10 +107,7 @@ sql
         if (count($update)>1){
             $bool = app(BatchUpdateService::class)->batchUpdate("batches",$update);
             if ($bool)LogService::log(__METHOD__,"SUCCESS-同步更新波次成功",json_encode($update));
-            else{
-                LogService::log(__METHOD__,"ERROR-同步更新波次失败",json_encode($update));
-                return;
-            }
+            else LogService::log(__METHOD__,"ERROR-同步更新波次失败",json_encode($update));
         }
 
         //不存在则录入
@@ -153,6 +150,7 @@ sql;
         $nos = [];
         $orderCodes = [];
         $seqnos = [];
+        $batchMapping = [];
         foreach ($details as $detail){
             if (isset($map[$detail->waveno]))$map[$detail->waveno][] = $detail->orderno;
             else {
@@ -161,9 +159,11 @@ sql;
             }
             $orderCodes[] = $detail->orderno;
             $seqnos[$detail->orderno] = $detail->seqno;
+            $batchMapping[$detail->orderno] = $detail->waveno;
         }
-        $orders = Order::query()->select("id","code")->whereIn("code",$orderCodes)->get();
-        if (count($orderCodes) != count($orders)){
+        $orders = Order::query()->select("id","batch_id","code")->whereIn("code",$orderCodes)->get();
+        //if (count($orderCodes) != count($orders))LogService::log(__METHOD__,"波次同步-本地订单缺失",json_encode($orderCodes)." | ".count($orderCodes)." | ".count($orders));
+        if ($orders){
             $orderIds = [];
             $orderMap = [];
             foreach ($orders as $order){
@@ -182,10 +182,12 @@ sql;
                 if ($orderBin->number != $orderMap[$orderBin->order_id])$updateBin[]=["id"=>$orderBin->id,"number"=>$orderMap[$orderBin->order_id]];
                 unset($orderMap[$orderBin->order_id]);
             }
+            $d = date('Y-m-d H:i:s');
             foreach ($orderMap as $orderId=>$binNumber){
                 $insertBin[]=[
                     "order_id"=>$orderId,
-                    "number"=>$binNumber
+                    "number"=>$binNumber,
+                    'created_at' => $d
                 ];
             }
             if (count($updateBin)>1){
@@ -202,10 +204,31 @@ sql;
             }
         }
         $batches = $this->batchService->get(["code"=>$nos]);
+        $batchDiff = array_keys(array_flip(array_diff($nos,array_column($batches->toArray(),"code"))));
+        if (count($batchDiff)>0){
+            $sql = <<<sql
+SELECT * FROM DOC_WAVE_HEADER WHERE WAVENO IN (''
+sql;
+            foreach ($batchDiff as $bd)$sql .= ",'".$bd."'";
+            $sql .= ')';
+            $wmsBatches = DB::connection("oracle")->select(DB::raw($sql));
+            $this->headerExe($wmsBatches);
+            $batches = $this->batchService->get(["code"=>$nos]);
+        }
+        $updateOrder = [["code","batch_id"]];
         foreach ($batches as $batch){
-            app("OrderService")->update(["code"=>$map[$batch->code]],["batch_id"=>$batch->id]);
+            foreach ($map[$batch->code] as $on){
+                $updateOrder[] = [
+                    "code"=>$on,
+                    "batch_id"=>$batch->id
+                ];
+            }
             unset($map[$batch->code]);
         }
+        if (count($updateOrder)>1){
+            app("OrderService")->batchUpdate($updateOrder);//反向修改订单
+            LogService::log(__METHOD__,"波次同步-修改订单波次号",json_encode($updateOrder));
+        }
         if ($map){
             $waveCodes = array_keys($map);
             $waves = $this->service->get(["waveno"=>$waveCodes],["waveno"=>"in"]);

+ 1 - 1
app/Console/Kernel.php

@@ -62,7 +62,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('createOwnerAreaReport')->monthlyOn(1);
         $schedule->command('sync:batch')->everyMinute();
         $schedule->command('sync:order')->everyMinute();
-        $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('1:20')();//同步快递信息到orderPackage
+        $schedule->command('syncOrderPackageLogisticRouteTask')->dailyAt('1:20');//同步快递信息到orderPackage
         $schedule->command('SyncWmsCommoditiesInformation')->everyMinute();
         $schedule->command('clear:cancelledOrder')->everyTenMinutes();
         $schedule->command('WasSyncWmsAsnInformation')->everyMinute();

+ 423 - 0
app/Filters/OrderIssueFilters.php

@@ -0,0 +1,423 @@
+<?php
+
+
+namespace App\Filters;
+
+
+use App\Commodity;
+use App\Order;
+use App\OrderIssue;
+use App\OrderIssueProcessLog;
+use App\OrderIssueRejectedBill;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\RejectedBill;
+use App\RejectedBillItem;
+use App\Shop;
+use App\UserWorkgroup;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use PhpMyAdmin\Server\UserGroups;
+
+
+class OrderIssueFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $orderQuery;
+    protected $commodityQuery;
+    protected $orderPackageQuery;
+    protected $orderPackageCommodityQuery;
+    protected $orderIssueRejectedBIllQuery;
+    protected $rejectedBillQuery;
+    protected $rejectedBillItemQuery;
+    protected $orderIssueProcessLogQuery;
+    protected $shopQuery;
+    protected $filters = [
+        'log_content',
+        'is_imported',
+        'is_new_rejecting',
+        'logistic_id',
+        'custom_code',
+        'hiddenTag',
+        'client_code',
+        'consignee_name',
+        'consignee_phone',
+        'logistic_number',
+        'good_barcode',
+        'good_name',
+        'send_client_code',
+        'id_quality_label',
+        'id',
+        'created_at_start',
+        'created_at_end',
+        'order_issue_type_id',
+        'logistic_indemnity_money',
+        'baoshi_indemnity_money',
+        'rejectingStatus',
+        'order_issue_ids',
+        'settlement_at_start',
+        'settlement_at_end',
+        'sendOrderClientCode',
+        'sendOrderLogisticNumber',
+        'user_workgroups',
+        'shop_name',
+        'finance_confirm',
+        'logistic_number_return',
+        'final_status'
+    ];
+    protected $array_filter;
+    protected $params = [];
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+        $this->params = $request->all();
+        $this->array_filter = array_filter($this->request->only($this->filters));
+    }
+
+    private function getOrderQuery()
+    {
+        if(!$this->orderQuery)
+            $this->orderQuery = Order::query()->selectRaw('id');
+        return $this->orderQuery;
+    }
+
+    private function getCommodityQuery()
+    {
+        if(!$this->commodityQuery)
+            $this->commodityQuery = Commodity::query()->selectRaw('id');
+        return  $this->commodityQuery;
+    }
+
+    private function getOrderPackageQuery()
+    {
+        if(is_null($this->orderPackageQuery))
+            $this->orderPackageQuery = OrderPackage::query()->selectRaw('order_packages.order_id');
+        return $this->orderPackageQuery;
+    }
+
+    private function getRejectedBillQuery()
+    {
+        if(!$this->rejectedBillQuery)
+            $this->rejectedBillQuery= RejectedBill::query()->selectRaw('logistic_number_return');
+        return $this->rejectedBillQuery;
+    }
+
+    private function getRejectedBillItemQuery()
+    {
+        if(!$this->rejectedBillItemQuery)
+            $this->rejectedBillItemQuery =  RejectedBillItem::query()->selectRaw('id_rejected_bill');
+        return $this->rejectedBillItemQuery;
+    }
+
+    private function getOrderPackageCommodityQuery()
+    {
+        if(!$this->orderPackageCommodityQuery)
+            $this->orderPackageCommodityQuery = OrderPackageCommodities::query()->selectRaw('order_package_commodities.order_package_id');
+        return $this->orderPackageCommodityQuery;
+    }
+
+    private function getOrderIssueRejectedBillQuery()
+    {
+        if(!$this->orderIssueRejectedBIllQuery)
+            $this->orderIssueRejectedBIllQuery = OrderIssueRejectedBill::query()->selectRaw('order_issue_id');
+        return $this->orderIssueRejectedBIllQuery;
+    }
+
+    private function getOrderIssueProcessLogQuery()
+    {
+        if(!$this->orderIssueProcessLogQuery)
+            $this->orderIssueProcessLogQuery = OrderIssueProcessLog::query()->selectRaw('order_issue_id');
+        return $this->orderIssueProcessLogQuery;
+    }
+
+    private function getShopQuery()
+    {
+        if(!$this->shopQuery)
+            $this->shopQuery = Shop::query()->selectRaw('id');
+        return $this->shopQuery;
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        $this->beforeApply();
+        foreach ($this->array_filter as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        $this->afterApply();
+        return $this->queryBuilder;
+    }
+
+    private function beforeApply()
+    {
+        if(empty($this->params['hidden_tag']))
+            $this->queryBuilder->whereNull('order_issues.hidden_tag');
+
+        if(isset($this->params['data'])){
+            $ids = explode(',',$this->params['data']);
+            $this->id($ids);
+        }elseif(!($this->params['is_handle'] ?? false) && !($this->params['final_status'] ?? false)){
+            if(!(isset($this->params['settlement_at_start']) || isset($this->params['settlement_at_end']))) {
+                $this->queryBuilder->where(function ($query) {
+                    $query->whereNotIn('order_issues.final_status', ['已解决', '已归档'])->orWhereNull('order_issues.final_status');
+                });
+            }
+        }
+
+        $user = Auth::user();
+        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
+        if (isset($this->params['owner_id'])){
+            $this->searchWay($this->getOrderQuery(),$this->params['owner_id'],'orders.owner_id');
+        } else{
+            $this->getOrderQuery()->whereIn('owner_id',$owner_ids);
+        }
+    }
+
+    public function afterApply()
+    {
+        if($this->commodityQuery)
+            $this->getOrderPackageCommodityQuery()->whereIn('commodity_id',$this->commodityQuery);
+
+        if($this->orderPackageCommodityQuery)
+            $this->getOrderPackageQuery()->whereIn('order_packages.id',$this->orderPackageCommodityQuery);
+
+        if($this->orderPackageQuery)
+            $this->getOrderQuery()->whereIn('order_id',$this->orderPackageQuery);
+
+        if($this->shopQuery)
+            $this->getOrderQuery()->whereIn('shop_id',$this->shopQuery);
+
+        if($this->orderQuery)
+            $this->queryBuilder->whereIn('order_issues.order_id',$this->orderQuery);
+
+        if($this->rejectedBillItemQuery)
+            $this->getRejectedBillQuery()->whereIn('id',$this->rejectedBillItemQuery);
+
+        if($this->rejectedBillQuery)
+            $this->getOrderIssueRejectedBIllQuery()->whereIn('logistic_number_return',$this->rejectedBillQuery);
+
+        if($this->orderIssueRejectedBIllQuery)
+            $this->queryBuilder->whereIn('order_issues.id',$this->orderIssueRejectedBIllQuery);
+
+        if($this->orderIssueProcessLogQuery)
+            $this->queryBuilder->whereIn('order_issues.id',$this->orderIssueProcessLogQuery);
+
+    }
+
+    private function isSearchLike($str)
+    {
+        if (substr($str, 0, 1) == "%" || substr($str, strlen($str) - 1, 1) == "%") {
+            return true;
+        }
+        return false;
+    }
+
+    private function searchWay($query, $param, $column)
+    {
+        if ($this->isSearchLike($param)) {
+            $query->where($column, 'like', $param);
+        } else {
+            $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
+        }
+        return $query;
+    }
+
+    public function log_content($log_content)
+    {
+        $order_issue_process_log_query = OrderIssueProcessLog::query()->selectRaw('order_issue_id')->where('content','like',$log_content);
+        if(!$this->params['addtime']){
+            $order_issue_process_log_query->where('created_at', '>=', Carbon::now()->subDays(31));
+        }else{
+            $order_issue_process_log_query->where('created_at', '>=', Carbon::now()->subDays($this->params['addtime']));
+        }
+        $this->queryBuilder->whereIn('order_issues.id',$order_issue_process_log_query);
+    }
+
+    public function is_imported($is_imported)
+    {
+        $this->queryBuilder->where('order_issues.imported_status',$is_imported);
+    }
+
+    public function is_new_rejecting($is_new_rejecting)
+    {
+        $this->queryBuilder->where('order_issues.is_new_rejecting',$is_new_rejecting);
+    }
+
+    public function logistic_id($logistic_id)
+    {
+        $this->getOrderQuery()->where('orders.logistic_id',$logistic_id);
+    }
+
+    public function custom_code($custom_code)
+    {
+        $this->queryBuilder->where('order_issues.custom_code',$custom_code);
+    }
+
+    public function hiddenTag($hiddenTag)
+    {
+        $this->queryBuilder->where('order_issues.hidden_tag',$hiddenTag);
+    }
+
+    public function client_code($client_code)
+    {
+        $this->searchWay($this->getOrderQuery(),$client_code,'orders.client_code');
+    }
+
+    public function consignee_name($consignee_name)
+    {
+        $this->searchWay($this->getOrderQuery(),$consignee_name,'orders.consignee_name');
+    }
+
+    public function consignee_phone($consignee_name)
+    {
+        $this->searchWay($this->getOrderQuery(),$consignee_name,'orders.consignee_phone');
+    }
+
+    public function logistic_number($logistic_number)
+    {
+        $this->searchWay($this->getOrderPackageQuery(),$logistic_number,'logistic_number');
+    }
+
+    public function good_barcode($good_barcode)
+    {
+        $this->searchWay($this->getCommodityQuery(),$good_barcode,'sku');
+    }
+
+    public function good_name($good_name)
+    {
+        $this->searchWay($this->getCommodityQuery(),$good_name,'name');
+    }
+
+    public function send_client_code($send_client_code)
+    {
+        $this->searchWay($this->queryBuilder,$send_client_code,'order_issues.second_client_no');
+    }
+
+    public function logistic_number_return($logistic_number_return)
+    {
+        $this->searchWay($this->getOrderIssueRejectedBillQuery(),$logistic_number_return,'logistic_number_return');
+     }
+
+    public function id_quality_label($id_quality_label)
+    {
+        $this->getRejectedBillItemQuery()->where('id_quality_label',$id_quality_label);
+    }
+
+    public function id($id)
+    {
+        $this->queryBuilder->whereIn('order_issues.id',$id);
+    }
+
+    public function created_at_start($created_at_start)
+    {
+        $this->queryBuilder->where('order_issues.created_at', '>=', $created_at_start . " 00:00:00");
+    }
+
+    public function created_at_end($created_at_end)
+    {
+        $this->queryBuilder->where('order_issues.created_at', '<=', $created_at_end . " 23:59:59");
+    }
+
+    public function order_issue_type_id($order_issue_type_id)
+    {
+        $this->searchWay($this->queryBuilder,$order_issue_type_id,'order_issues.order_issue_type_id');
+    }
+
+    public function logistic_indemnity_money($logistic_indemnity_money)
+    {
+        if($logistic_indemnity_money==='是')
+            $this->queryBuilder->whereNotNull('order_issues.logistic_indemnity_money');
+        elseif($logistic_indemnity_money==='否')
+            $this->queryBuilder->whereNull('order_issues.logistic_indemnity_money');
+    }
+
+    public function baoshi_indemnity_money($baoshi_indemnity_money)
+    {
+        if($baoshi_indemnity_money==='是')
+            $this->queryBuilder->whereNotNull('order_issues.baoshi_indemnity_money');
+        elseif($baoshi_indemnity_money==='否')
+            $this->queryBuilder->whereNull('order_issues..baoshi_indemnity_money');
+    }
+
+    public function rejectingStatus($rejectingStatus)
+    {
+        $this->queryBuilder->where('order_issues.rejecting_status',$rejectingStatus);
+    }
+
+    public function order_issue_ids($order_issue_ids)
+    {
+        $this->searchWay($this->queryBuilder,$order_issue_ids,'order_issues.id');
+    }
+
+    public function settlement_at_start($settlement_at_start)
+    {
+        $this->getOrderIssueProcessLogQuery()->where('created_at','>=',$settlement_at_start.' 00:00:00')->where('type','结束');
+    }
+
+    public function settlement_at_end($settlement_at_end)
+    {
+        $this->getOrderIssueProcessLogQuery()->where('created_at','<=',$settlement_at_end.' 23:59:59')->where('type','结束');
+    }
+
+    public function sendOrderClientCode($sendOrderClientCode)
+    {
+        $this->searchWay($this->queryBuilder,$sendOrderClientCode,'order_issues.second_client_no');
+    }
+
+    public function user_workgroups($user_work_groups)
+    {
+        if(is_string($user_work_groups)){
+            $user_work_groups = explode(',', $user_work_groups);
+        }
+        $this->queryBuilder->whereIn('order_issues.id',function($query)use($user_work_groups){
+            $query->from('order_issue_user_workgroup')->selectRaw('order_issue_id')->whereIn('user_workgroup_id',$user_work_groups);
+        });
+    }
+
+    public function sendOrderLogisticNumber($sendOrderLogisticNumber)
+    {
+        $order_issue_query = OrderIssue::query()->selectRaw('id');
+        $this->searchWay($order_issue_query,$sendOrderLogisticNumber,'second_logistic_number');
+        $order_issues = $order_issue_query->get();
+        if(count($order_issues)>0){
+            $this->queryBuilder->where('order_issues.id',$order_issues->map(function($orderIssue){
+                return $orderIssue->id;
+            }));
+        }
+        $orders = Order::query()->selectRaw('client_code')->whereIn('id',function($query)use($sendOrderLogisticNumber){
+            $query->from('order_packages')->selectRaw('order_id');
+            $this->searchWay($query,$sendOrderLogisticNumber,'logistic_number');
+        })->get();
+         if($orders->count()>0){
+            $this->queryBuilder->where('order_issues.second_client_no',$orders->map(function($order){
+                return $order->client_code;
+            }));
+        }
+    }
+
+    public function shop_name($shop_name)
+    {
+        $this->searchWay($this->getShopQuery(),$shop_name,'name');
+        if (isset($this->params['shop_name_limit_time'])) {
+            $this->queryBuilder->Where('order_issues.created_at','>=', Carbon::now()->subDays($this->params['shop_name_limit_time']));
+        } else {
+            $this->queryBuilder->Where('order_issues.created_at','>=', Carbon::now()->subDays(31));
+        }
+    }
+
+    public function final_status($final_status)
+    {
+        $this->queryBuilder->where('order_issues.final_status',$final_status);
+    }
+
+    public function finance_confirm($finance_confirm)
+    {
+        $this->queryBuilder->where('order_issues.finance_confirm',$finance_confirm);
+    }
+
+}

+ 1 - 0
app/Http/Controllers/OrderController.php

@@ -138,6 +138,7 @@ sql;
         $rejectedBillItemService->insert($rejectedBillItems);
         LogService::log(__METHOD__,"批量生成退货单详情",json_encode($rejectedBillItems),Auth::user()['id']);
         $rejectedBill_collect->each(function($rejectedBill)use($rejectedBillService){
+            $rejectedBillService->joinOrderIssue($rejectedBill);
             $rejectedBillService->syncOrderIssue($rejectedBill);
         });
         return ['success'=>true];

+ 21 - 7
app/Http/Controllers/OrderFreezeController.php

@@ -11,7 +11,7 @@ class OrderFreezeController extends Controller
     public function index()
     {
         $this->gate("订单管理-自动冻结");
-        $freezes = OrderFreeze::query()->with(["logistic:id,name","province:id,name","city:id,name","location:id,name"])
+        $freezes = OrderFreeze::query()->with(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"])
             ->orderByDesc("id")->where("status",0)
             ->paginate(request("paginate") ?? 50);
         return view("order.index.freeze",compact("freezes"));
@@ -20,24 +20,38 @@ class OrderFreezeController extends Controller
     public function store()
     {
         $this->gate("订单管理-自动冻结");
-        $freeze = OrderFreeze::query()->where("logistic_id",request("logistic_id"))
-            ->where("province_id",request("province_id"))
-            ->where("city_id",request("city_id"))->where("status",0)
-            ->where("location_id",request("location_id"))->first();
+        $freeze = OrderFreeze::query()->where("logistic_id",request("logistic_id"))->where("status",0);
+        if (request("province_id"))$freeze->where("province_id",request("province_id"));
+        else $freeze->whereNull("province_id");
 
+        if (request("city_id"))$freeze->where("city_id",request("city_id"));
+        else $freeze->whereNull("city_id");
+
+        if (request("district_id"))$freeze->where("district_id",request("district_id"));
+        else $freeze->whereNull("district_id");
+
+        if (request("town_id"))$freeze->where("town_id",request("town_id"));
+        else $freeze->whereNull("town_id");
+
+        if (request("street_id"))$freeze->where("street_id",request("street_id"));
+        else $freeze->whereNull("street_id");
+
+        $freeze = $freeze->first();
         if ($freeze && $freeze->id!=request("id"))$this->error("已存在冻结选项,无需重复录入");
         $obj = [
             "logistic_id"   => request("logistic_id"),
             "province_id"   => request("province_id"),
             "city_id"       => request("city_id"),
-            "location_id"   => request("location_id"),
+            "district_id"   => request("district_id"),
+            "town_id"       => request("town_id"),
+            "street_id"     => request("street_id"),
         ];
         if (request("id")){
             $freeze = OrderFreeze::query()->find(request("id"));
             $freeze->update($obj);
         }else $freeze = OrderFreeze::query()->create($obj);
         app("OrderFreezeService")->refreshFreezes();
-        $freeze->load(["logistic:id,name","province:id,name","city:id,name","location:id,name"]);
+        $freeze->load(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"]);
         $this->success($freeze);
     }
 

+ 5 - 16
app/Http/Controllers/OrderIssueController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Filters\OrderIssueFilters;
 use App\Imports\OrderIssueImport;
 use App\Logistic;
 use App\OracleDOCOrderHeader;
@@ -22,10 +23,8 @@ use App\UserWorkgroup;
 use Exception;
 use Illuminate\Database\QueryException;
 use Illuminate\Http\Request;
-use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Gate;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Validator;
@@ -34,7 +33,7 @@ use Maatwebsite\Excel\Facades\Excel;
 class OrderIssueController extends Controller
 {
 
-    public function index(Request $request)
+    public function index(Request $request, OrderIssueFilters $filter)
     {
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
@@ -42,7 +41,7 @@ class OrderIssueController extends Controller
         /** @var OrderIssueService $orderIssueService */
         $orderIssueService = app('OrderIssueService');
         $owners = app(OwnerService::class)->getAuthorizedOwners();
-        $orderIssues = $orderIssueService->paginate($request->all());
+        $orderIssues = OrderIssue::query()->filter($filter)->defaultWith()->paginate($request['paginate'] ?? 50);
         $orderIssueType = OrderIssueType::all();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();
@@ -570,22 +569,12 @@ class OrderIssueController extends Controller
         }
     }
 
-    public function exportJsonExcel(Request $request)
+    public function exportJsonExcel(Request $request, OrderIssueFilters $filter)
     {
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
         }
-        $params = $request->input();
-        if ($request->checkAllSign){
-            $params = $request->input();
-            unset($params['checkAllSign']);
-        }else{
-            $params['id'] = $request['data'];
-            $params['is_handle'] = true;
-        }
-        /** @var OrderIssueService $service */
-        $service = app('OrderIssueService');
-        $order_Issues  = $service->getJsonObj($params);
+        $order_Issues = OrderIssue::query()->filter($filter)->jsonWith()->get();
         return $this->getJson($order_Issues);
     }
 

+ 2 - 2
app/Http/Controllers/PriceModelController.php

@@ -1000,10 +1000,10 @@ class PriceModelController extends Controller
             "name"              => request("name"),
             "counting_type"     => request("counting_type"),
             "using_type"        => request("using_type"),
-            "minimum_area"      => request("minimum_area"),
+            "minimum_area"      => request("minimum_area") ?? 0,
             "price"             => request("price"),
             "discount_type"     => request("discount_type"),
-            "discount_value"    => request("discount_value"),
+            "discount_value"    => request("discount_value") ?? 0,
             "unit_id"           => request("unit_id"),
         ];
         if (request("id"))app('OwnerStoragePriceModelService')->update(["id"=>request("id")],$values);

+ 27 - 1
app/Http/Controllers/RegionController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Components\AsyncResponse;
 use App\Region;
+use Illuminate\Support\Facades\Gate;
 
 class RegionController extends Controller
 {
@@ -12,7 +13,32 @@ class RegionController extends Controller
     {
         $type = request("type");
         $regions = Region::query();
-        if (!$type)$regions->where("type",$type);
+        if ($type)$regions->where("type",$type);
         $this->success($regions->get());
     }
+
+    public function index()
+    {
+        if(!Gate::allows("地域"))return view("exception.authority");
+        $regions = Region::withTrashed()->get();
+        return view("maintenance.region.index",compact("regions"));
+    }
+
+    public function store()
+    {
+        $parent = request("parent_id");
+        $type = request("type");
+        if (!$type)$this->error("非法参数");
+
+        $name = app("RegionService")->formatName(request("name"),$type);
+        if (!$name)$this->error("非法参数");
+
+        $region = Region::withTrashed()->where("name",$name)->where("type",$type)->first();
+        if ($region)$this->error("已经存在,无需重复录入");
+        $this->success(Region::query()->create([
+            "name" => $name,
+            "type" => $type,
+            "parent_id" => $parent
+        ]));
+    }
 }

+ 1 - 0
app/Http/Controllers/RejectedBillController.php

@@ -428,6 +428,7 @@ class RejectedBillController extends Controller
                 LogService::log(__METHOD__, "批量生成退货单详情", json_encode($inner_items_params), Auth::user()['id']);
             }
             $rejectedBill_collect->each(function ($rejectedBill)use($service){
+                $service->joinOrderIssue($rejectedBill);
                 $service->syncOrderIssue($rejectedBill);
             });
             return ['success'=>true];

+ 76 - 59
app/Http/Controllers/TestController.php

@@ -12,6 +12,7 @@ use App\CommodityBarcode;
 use App\Console\Commands\CreateOwnerAreaReport;
 use App\Console\Commands\CreateOwnerBillReport;
 use App\Console\Commands\CreateOwnerReport;
+use App\Console\Commands\SyncBatchTask;
 use App\Console\Commands\SyncWmsCommoditiesInformation;
 use App\Console\Commands\SyncWMSOrderTask;
 use App\Console\Commands\WasSyncWmsAsnInformation;
@@ -31,6 +32,7 @@ use App\OracleActAllocationDetails;
 use App\OracleBasCustomer;
 use App\OracleBasSKU;
 use App\OracleDOCASNHeader;
+use App\OracleDOCOrderDetail;
 use App\OracleDOCOrderHeader;
 use App\OracleDocOrderPackingSummary;
 use App\OracleDOCWaveDetails;
@@ -50,6 +52,8 @@ use App\Package;
 use App\Process;
 use App\ProcessDaily;
 use App\ProcessStatistic;
+use App\Province;
+use App\Region;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\Services\CacheService;
@@ -74,6 +78,7 @@ use App\Services\OrderTrackingOwnerService;
 use App\Services\OrderTrackingService;
 use App\Services\OwnerPriceOperationService;
 use App\Services\OwnerService;
+use App\Services\RejectedBillService;
 use App\Services\ShopService;
 use App\Services\StoreService;
 use App\Services\WarehouseService;
@@ -167,11 +172,44 @@ sql;
             }
         });
     }
+    public function test1(){
+        $cities = City::query()->with("province")->where("province_id","!=",0)->get();
+        foreach ($cities as $city){
+            if ($city->name=='汕头/汕尾'){
+                app("RegionService")->getCity("汕头",$city->province->name);
+                app("RegionService")->getCity("汕尾",$city->province->name);
+                continue;
+            }
+            app("RegionService")->getCity($city->name,$city->province->name);
+        }
+    }
 
-    public function zzd()
+    public function sync()
     {
-        dd(storage_path('app\\'."156168818641.jpg"));
-        return view("test");
+        ini_set('max_execution_time',2500);
+        ini_set('memory_limit','1526M');
+        foreach (Batch::query()->with("orders")->where("created_at",">","2021-01-20 15:00:00")->get() as $batch){
+            $order = [];
+            $map = [];
+            foreach ($batch->orders as $o){
+                $order[] = $o->code;
+                $map[$o->code] = $o->id;
+            }
+            $sql = <<<sql
+SELECT ORDERNO,WAVENO,SEQNO,EDITTIME FROM DOC_WAVE_DETAILS WHERE WAVENO = ? AND ORDERNO IN (''
+sql;
+            foreach($order as $o){
+                $sql .= ",'".$o."'";
+            }
+            $sql .= ")";
+            $re = DB::connection("oracle")->select(DB::raw($sql),[$batch->code]);
+            foreach ($re as $r){
+               OrderBin::query()->firstOrCreate([
+                    'order_id' => $map[$r->orderno],
+                    'number' => $r->seqno,
+                ]);
+            }
+        }
     }
 
     public function mergeCarrier()
@@ -541,59 +579,6 @@ sql;
         if (count($error) > 0) app('LogService')->log(__METHOD__, "同步时WMS中未找到这些订单_two", json_encode($error));
     }
 
-    function test1()
-    {
-        $statistics = ProcessStatistic::query()->whereNull('revenue')->get();
-        $id = array_column($statistics->toArray(), 'process_id');
-        $processes = Process::query()->where(function (Builder $query) {
-            $query->where('status', '待交接')->orWhere('status', '交接完成');
-        })->whereIn('id', $id)->get();
-        $sign_end = true;
-        foreach ($processes as $process) {
-            if (count($process->processDailies) > 0) {
-                $completed_amount = 0;
-                foreach ($process->processDailies as $processDaily) {
-                    $completed_amount = $completed_amount + ($processDaily->output);
-                }
-                $process->completed_amount = $completed_amount;
-            }
-            //统计:
-            $revenue = ($process->unit_price) * ($process->completed_amount);   //收入合计
-            $processDailies = ProcessDaily::with('processDailyParticipants')->where('process_id', $process->id)->where('output', '>', 0)->get();
-            $duration_days = count($processDailies);      //完成天数
-            $duration_man_hours = 0;      //总工时
-            $total_cost = 0;              //合计成本
-            foreach ($processDailies as $processDailyOne) {
-                foreach ($processDailyOne->processDailyParticipants as $processDailyParticipant) {
-                    if (!$processDailyParticipant->unit_price && !$processDailyParticipant->hour_price) continue;
-                    $duration_man_hours += $processDailyParticipant->hour_count;
-                    if ($processDailyParticipant->unit_count) {
-                        $total_cost += ($processDailyParticipant->unit_count) * ($processDailyParticipant->unit_price);
-                        continue;
-                    }
-                    $total_cost += ($processDailyParticipant->hour_count) * ($processDailyParticipant->hour_price);
-                }
-            };
-            $processStatistic = ProcessStatistic::query()->find($process->id);
-            $processStatistic->revenue = $revenue;
-            $processStatistic->duration_days = $duration_days;
-            $processStatistic->duration_man_hours = $duration_man_hours;
-            if ($sign_end) $processStatistic->ended_at = date('Y-m-d H:i:s');
-            if (!$revenue || !$total_cost) {
-                $processStatistic->update();
-                continue;
-            }
-            $gross_profit = $revenue - $total_cost; //毛利润
-            if ($gross_profit != 0) $gross_profit_rate = $gross_profit / $revenue;  //毛利率;
-            else $gross_profit_rate = 0;
-            $processStatistic->total_cost = $total_cost;
-            $processStatistic->gross_profit = $gross_profit;
-            $processStatistic->gross_profit_rate = $gross_profit_rate;
-            $processStatistic->update();
-            app('LogService')->log(__METHOD__, "修改二次加工单统计单_" . __FUNCTION__, json_encode($processStatistic), Auth::user()['id']);
-        }
-    }
-
     public function test5()
     {
         ini_set('max_execution_time', 2500);
@@ -1083,7 +1068,7 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 
     public function reNewBatches3()
     {
-        $batches = Batch::query()->where('id', 6384)->get('code');
+        $batches = Batch::query()->where('id','>', 73620)->get('code');
         $batchCodes = $batches->map(function ($batch) {
             return $batch['code'];
         })->toArray();
@@ -1109,8 +1094,8 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
 //        dd($logs);
         foreach ($batchCodes as $code) {
 //            $request=Cache::get('temp'.$code)['description'];
-            $request = Log::query()->select('description')->where('CREATED_AT', '>', '2020-12-16')
-                ->where('type', "issued_newBatch")
+            $request = Log::query()->select('description')->where('CREATED_AT', '>', '2021-01-22')
+                ->where('method', "issued_newBatch")
                 ->where('description', 'like', "%{$code}%")
                 ->first();
             if ($request) {
@@ -1557,4 +1542,36 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
                 }
             });
     }
+
+//    public function testNumber()
+//    {
+//        $asnnos=['ASN2101200684','ASN2101220543','ASN2101220542'];
+//        $asnHeaders=OracleDOCASNHeader::query()->whereIn('asnno',$asnnos)->get();
+//        /**
+//         * @var RejectedBillService $rejectedBillService
+//         */
+//        $rejectedBillService=app(RejectedBillService::class);
+//
+//        $updates = $rejectedBillService->getNeedUpdateCheckedStatusByWms($asnHeaders);
+//        app(BatchUpdateService::class)->batchUpdate('rejected_bills', $updates);
+//        dump($updates);
+//        //$logisticNumberReturn = $rejectedBillService->getLogisticNumberReturn($arr);
+//        //$rejectedBills = $rejectedBillService->getRejectedBills($logisticNumberReturn);
+//    }
+
+    public function updateRejectBillCheckedStatus()
+    {
+        $time=Carbon::parse("2021-01-22 00:00:00")->subDays(15)->toDateTimeString();
+        $asnHeaders=OracleDOCASNHeader::query()
+            ->where('addtime','>=',$time)
+            ->select('asnno','addtime','edittime','customerid','notes','asnreference3')
+            ->get();
+        $chunks=$asnHeaders->chunk(1000);
+        foreach ($chunks as $chunk) {
+         /** @var RejectedBillService $rejectedBillService */
+        $rejectedBillService=app(RejectedBillService::class);
+        $updates = $rejectedBillService->getNeedUpdateCheckedStatusByWms($chunk);
+        app(BatchUpdateService::class)->batchUpdate('rejected_bills', $updates);
+        }
+    }
 }

+ 81 - 79
app/Http/Controllers/api/thirdPart/flux/SortingController.php

@@ -24,89 +24,91 @@ class SortingController extends Controller
      * 返回:Response{return{returnFlag(1/0),returnCode(0000/0001),returnDesc,resultInfo}}
      *
      * @param Request $request
-     * @return Response
+     * @return \Illuminate\Http\JsonResponse|Response|\Symfony\Component\HttpFoundation\JsonResponse
+     *
+     * 2021-01-20 zzd 因同步订单,波次等已上线,弃用该通知接口
      */
     public function newBatch(Request $request)
     {
-        $requestArr=$request->all();
+//       $requestArr=$request->all();
         app('LogService')->log(__METHOD__, 'issued_' . __FUNCTION__, json_encode($request->all()));
-        !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
-        $errors=$this->newBatchValidator($requestArr)->errors();
-        if(count($errors)>0){
-            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
-            return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
-                'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
-        }
-        $requestBatches = $requestArr['request']?? '';
-
-        foreach ($requestBatches as $requestBatch){
-            $requestBatch['edittime']&&strpos(trim($requestBatch['edittime']),' ')?$editTimeFormat='Y-m-d H:i:s':$editTimeFormat='YmdHis';
-            $batch=Batch::query()->firstOrCreate(['code' => $requestBatch['waveno']]);
-
-            if(!$batch)$batch=new Batch();
-            $batch->fill([
-                    'code' => $requestBatch['waveno'],
-                    'wms_type' => $requestBatch['batch_type']??'',
-                    'wms_status' => $requestBatch['docstatus']??'',
-                    'status' => '未处理',
-                    'wms_created_at' => $requestBatch['edittime']?Carbon::createFromFormat($editTimeFormat,$requestBatch['edittime']):'',
-            ]);
-            $batch->save();
-            $oracleAlloactions=OracleActAllocationDetails::query()->where('waveno',$requestBatch['waveno'])->get();
-            foreach($requestBatch['order_list'] as $requestOrder){
-                $owner=Owner::query()->where('code',$requestOrder['customerid'])->first();
-                $order=app("OrderService")->first(['code'=>$requestOrder['docno']]);
-                if(!$order){
-                    $order=app("OrderService")->createOrder([
-                        'batch_id' => $batch['id'],
-                        'code' => $requestOrder['docno'],
-                        'owner_id' => $owner['id'],
-                        'wms_status' => $requestOrder['docstatus']??'波次下发',
-                        'status' => '未处理',
-                    ]);
-                    app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
-                }else{
-                    $order['batch_id']= $batch['id'] ;
-                    $order['owner_id']=$order['owner_id']??$owner['owner_id'];
-                    $order['wms_status']=$order['wms_status']??$requestOrder['docstatus']??'波次下发';
-                    $order['status']=$order['status']??'未处理';
-                }
-                $order->save();
-                OrderBin::query()->firstOrCreate([
-                    'order_id' => $order['id'],
-                    'number' => $requestOrder['reservedfield01'],
-                ]);
-                foreach($requestOrder['barcode_list'] as $requestBarcode){
-                    $orderCommodity=OrderCommodity::query()
-                        ->where('order_id',$order['id'])->where('wms_ptltaskid',$requestBarcode['ptltaskid'])->first();
-                    if(!$orderCommodity){
-                        /** @var CommodityService $commodityService */
-                        $commodityService=app('CommodityService');
-                        $commodity=$commodityService->syncBarcodes($requestBarcode['alternate_sku1'],$owner['id'],$requestBarcode['sku']);
-                        $orderCommodity=OrderCommodity::query()->firstOrCreate(['order_id'=>$order['id'],'commodity_id'=>$commodity['id']]);
-                        if(!$orderCommodity){
-                            $orderCommodity = new OrderCommodity([
-                                'order_id' => $order['id'],
-                                'commodity_id' => $commodity['id'],
-                                'amount' => $requestBarcode['fmqty_each']??0,
-                                'wms_ptltaskid' => $requestBarcode['ptltaskid'],
-                            ]);
-                        }else{
-                            $orderCommodity['order_id']=$order['id'];
-                            $orderCommodity['commodity_id']=$commodity['id'];
-                            $orderCommodity['amount']=$requestBarcode['fmqty_each']??0;
-                            $orderCommodity['wms_ptltaskid']=$requestBarcode['ptltaskid']??0;
-                        }
-                        $allocation=$oracleAlloactions->where('orderno',$requestOrder['docno'])->where('sku',$commodity['sku'])->where('qty',$requestBarcode['fmqty_each'])->first();
-                        if($allocation)
-                            $orderCommodity['location'] = $allocation['location'];
-                        $orderCommodity->save();
-                    }
-                }
-            }
-        }
-        return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
-            'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+//        !$requestArr?$requestArr=json_decode($request->getContent(),true):false;
+//        $errors=$this->newBatchValidator($requestArr)->errors();
+//        if(count($errors)>0){
+//            app('LogService')->log(__METHOD__, 'error' . __FUNCTION__, 'fields wrong, see Errors report please.'.'|'.json_encode($request->all()).'|'.json_encode($errors));
+//            return response()->json(['Response'=>['return'=>['returnFlag'=>'0','returnCode'=>'0001',
+//                'returnDesc'=>':Failure','resultInfo'=>'','errors'=>$errors]]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
+//        }
+//        $requestBatches = $requestArr['request']?? '';
+//
+//        foreach ($requestBatches as $requestBatch){
+//            $requestBatch['edittime']&&strpos(trim($requestBatch['edittime']),' ')?$editTimeFormat='Y-m-d H:i:s':$editTimeFormat='YmdHis';
+//            $batch=Batch::query()->firstOrCreate(['code' => $requestBatch['waveno']]);
+//
+//            if(!$batch)$batch=new Batch();
+//            $batch->fill([
+//                    'code' => $requestBatch['waveno'],
+//                    'wms_type' => $requestBatch['batch_type']??'',
+//                    'wms_status' => $requestBatch['docstatus']??'',
+//                    'status' => '未处理',
+//                    'wms_created_at' => $requestBatch['edittime']?Carbon::createFromFormat($editTimeFormat,$requestBatch['edittime']):'',
+//            ]);
+//            $batch->save();
+//            $oracleAlloactions=OracleActAllocationDetails::query()->where('waveno',$requestBatch['waveno'])->get();
+//            foreach($requestBatch['order_list'] as $requestOrder){
+//                $owner=Owner::query()->where('code',$requestOrder['customerid'])->first();
+//                $order=app("OrderService")->first(['code'=>$requestOrder['docno']]);
+//                if(!$order){
+//                    $order=app("OrderService")->createOrder([
+//                        'batch_id' => $batch['id'],
+//                        'code' => $requestOrder['docno'],
+//                        'owner_id' => $owner['id'],
+//                        'wms_status' => $requestOrder['docstatus']??'波次下发',
+//                        'status' => '未处理',
+//                    ]);
+//                    app('LogService')->log(__METHOD__,__FUNCTION__,'创建 Order'.json_encode($order));
+//                }else{
+//                    $order['batch_id']= $batch['id'] ;
+//                    $order['owner_id']=$order['owner_id']??$owner['owner_id'];
+//                    $order['wms_status']=$order['wms_status']??$requestOrder['docstatus']??'波次下发';
+//                    $order['status']=$order['status']??'未处理';
+//                }
+//                $order->save();
+//                OrderBin::query()->firstOrCreate([
+//                    'order_id' => $order['id'],
+//                    'number' => $requestOrder['reservedfield01'],
+//                ]);
+//                foreach($requestOrder['barcode_list'] as $requestBarcode){
+//                    $orderCommodity=OrderCommodity::query()
+//                        ->where('order_id',$order['id'])->where('wms_ptltaskid',$requestBarcode['ptltaskid'])->first();
+//                    if(!$orderCommodity){
+//                        /** @var CommodityService $commodityService */
+//                        $commodityService=app('CommodityService');
+//                        $commodity=$commodityService->syncBarcodes($requestBarcode['alternate_sku1'],$owner['id'],$requestBarcode['sku']);
+//                        $orderCommodity=OrderCommodity::query()->firstOrCreate(['order_id'=>$order['id'],'commodity_id'=>$commodity['id']]);
+//                        if(!$orderCommodity){
+//                            $orderCommodity = new OrderCommodity([
+//                                'order_id' => $order['id'],
+//                                'commodity_id' => $commodity['id'],
+//                                'amount' => $requestBarcode['fmqty_each']??0,
+//                                'wms_ptltaskid' => $requestBarcode['ptltaskid'],
+//                            ]);
+//                        }else{
+//                            $orderCommodity['order_id']=$order['id'];
+//                            $orderCommodity['commodity_id']=$commodity['id'];
+//                            $orderCommodity['amount']=$requestBarcode['fmqty_each']??0;
+//                            $orderCommodity['wms_ptltaskid']=$requestBarcode['ptltaskid']??0;
+//                        }
+//                        $allocation=$oracleAlloactions->where('orderno',$requestOrder['docno'])->where('sku',$commodity['sku'])->where('qty',$requestBarcode['fmqty_each'])->first();
+//                        if($allocation)
+//                            $orderCommodity['location'] = $allocation['location'];
+//                        $orderCommodity->save();
+//                    }
+//                }
+//            }
+//        }
+//        return response()->json(['Response'=>['return'=>['returnFlag'=>'1','returnCode'=>'0000',
+//            'returnDesc'=>'消息处理成功:Success','resultInfo'=>'']]])->setEncodingOptions(JSON_UNESCAPED_UNICODE);
     }
 
     protected function newBatchValidator(array $data)

+ 1 - 0
app/Imports/RejectedImport.php

@@ -90,6 +90,7 @@ class RejectedImport implements ToCollection, WithHeadingRow
                     'is_loaded'=>0,
                 ]);
                 $bill->save();
+                $bill->joinOrderIssue();
                 $bill->syncOrderIssue();
                 $item=RejectedBillItem::where('id_rejected_bill',$bill['id'])
                     ->where('barcode_goods',trim($barcode))->where('id_quality_label',$id_quality_label)->first();

+ 7 - 3
app/Imports/UpdatePickZone.php

@@ -71,16 +71,20 @@ class UpdatePickZone implements ToCollection,WithHeadingRow
                 $errors[] = "第“" . ($index + 2) . "”行不存在日期";
                 continue;
             }
-            $detail = OracleDOCOrderDetail::query()->select("customerid","sku","orderno","orderlineno")
-                ->where("orderno",$item["订单编号"])
+            $detail = OracleDOCOrderDetail::query()->select("DOC_ORDER_DETAILS.customerid","DOC_ORDER_DETAILS.sku","DOC_ORDER_DETAILS.orderno","DOC_ORDER_DETAILS.orderlineno","sostatus")
+                ->where("DOC_ORDER_DETAILS.orderno",$item["订单编号"])
                 ->whereHas("sku",function ($query)use($item){
                     /** @var Builder $query */
                     $query->where("alternate_sku1",$item["商品条码"]);
-                })->first();
+                })->leftJoin("DOC_ORDER_HEADER","DOC_ORDER_DETAILS.ORDERNO","=","DOC_ORDER_HEADER.ORDERNO")->first();
             if (!$detail){
                 $errors[] = "第“" . ($index + 2) . "”行未知订单商品";
                 continue;
             }
+            if ($detail->sostatus != '00'){
+                $errors[] = "第“" . ($index + 2) . "”行订单状态不为创建订单";
+                continue;
+            }
             $sql = "select BAS_ZONE.DESCR,INV_LOT_LOC_ID.LOCATIONID,INV_LOT_LOC_ID.LOTNUM,BAS_LOCATION.PICKZONE,(INV_LOT_LOC_ID.QTY-INV_LOT_LOC_ID.QTYALLOCATED-QTYONHOLD-QTYRPOUT-QTYMVOUT) AS 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
                     LEFT JOIN BAS_ZONE ON BAS_LOCATION.PICKZONE = BAS_ZONE.ZONE 

+ 4 - 1
app/Jobs/OrderFreeze.php

@@ -51,6 +51,7 @@ class OrderFreeze implements ShouldQueue
     {
         $freezeOrders = [];
         foreach ($this->params as $param){
+            if (!$param["frozen"]=='是')continue;
             if (!$param["logistic_id"])continue;
             if ($this->isFreeze($param))$freezeOrders[] = $param["code"];
         }
@@ -66,7 +67,9 @@ class OrderFreeze implements ShouldQueue
             if ($pool["logistic_id"]!=$param["logistic_id"])continue;
             if ($pool["province_name"] && (mb_strpos($param["province"],$pool["province_name"]) === false))continue;
             if ($pool["city_name"] && (mb_strpos($param["city"],$pool["city_name"]) === false))continue;
-            if ($pool["location_name"] && (mb_strpos($param["district"],$pool["location_name"]) === false))continue;
+            if ($pool["district_name"] && (mb_strpos($param["district"],$pool["district_name"]) === false))continue;
+            if ($pool["town_name"] && (mb_strpos($param["address"],$pool["town_name"]) === false))continue;
+            if ($pool["street_name"] && (mb_strpos($param["address"],$pool["street_name"]) === false))continue;
             return true;
         }
         return false;

+ 15 - 2
app/Order.php

@@ -19,7 +19,8 @@ class Order extends Model
         'created_at', 'code', 'shop_id',  'client_code',
         'logistic_id', 'consignee_name', 'consignee_phone', 'province',
         'city', 'district', 'address','warehouse_id',
-        'wms_edittime', 'wms_status','order_type'];
+        'wms_edittime', 'wms_status','order_type','frozen'
+    ];
 
     /*
      * wms订单号             code=>DOC_ORDER_HEADER[orderno]
@@ -139,7 +140,8 @@ class Order extends Model
 
     public function isEquals($order)
     {
-        return $this['wms_edittime'] == $order['wms_edittime'];
+        return $this['wms_edittime'] == $order['wms_edittime']
+            && $this['frozen'] == $order['frozen'];
     }
 
     public function assignValueByOrder($order)
@@ -159,7 +161,18 @@ class Order extends Model
         $this['client_code'] = $order['client_code'] ;
         $this['wms_status'] = $order['wms_status'] ;
         $this['wms_edittime'] = $order['wms_edittime'];
+        $this['frozen'] = $order['frozen'];
         $this['order_type'] = $order['order_type'];
         $this['created_at'] =$order['created_at'];
     }
+
+    public static function getFrozen($string): string
+    {
+        $arr = [
+            'H' => '是',
+            'Y' => '否',
+            'N' => '否'
+        ];
+        return $arr[$string] ?? '否';
+    }
 }

+ 14 - 6
app/OrderFreeze.php

@@ -13,7 +13,7 @@ class OrderFreeze extends Model
     use ModelTimeFormat;
 
     protected $fillable = [
-        "status","logistic_id","province_id","city_id","location_id"
+        "status","logistic_id","province_id","city_id","district_id","town_id","street_id"
     ];
 
     const status=[
@@ -27,14 +27,22 @@ class OrderFreeze extends Model
     }
     public function province()
     {   //省
-        return $this->belongsTo(Province::class);
+        return $this->belongsTo(Region::class)->where("type",1);
     }
     public function city()
     {   //市
-        return $this->belongsTo(City::class);
+        return $this->belongsTo(Region::class)->where("type",2);
     }
-    public function location()
-    {   //区
-        return $this->belongsTo(City::class)->where("type","3");
+    public function district()
+    {   //区县
+        return $this->belongsTo(Region::class)->where("type",3);
+    }
+    public function town()
+    {   //乡镇
+        return $this->belongsTo(Region::class)->where("type",4);
+    }
+    public function street()
+    {   //村街
+        return $this->belongsTo(Region::class)->where("type",5);
     }
 }

+ 34 - 0
app/OrderIssue.php

@@ -3,12 +3,17 @@
 namespace App;
 
 use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
 use App\Traits\LogModelChanging;
 
+/**
+ * @method Builder filter
+ */
+
 class OrderIssue extends Model
 {
     use LogModelChanging;
@@ -290,6 +295,35 @@ class OrderIssue extends Model
         return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]);
     }
 
+    public function scopeFilter($query, $filters)
+    {
+        return $filters->apply($query);
+    }
+
+    public function scopeDefaultWith($query)
+    {
+        $this->scopeJsonWith($query);
+        return $query->with(['top'])
+            ->selectRaw('order_issues.* ,order_issue_on_tops.id top_id ,order_issue_on_tops.remark,order_issue_on_tops.updated_at top_update')
+            ->leftJoin('order_issue_on_tops', 'order_issue_on_tops.order_issue_id', '=', 'order_issues.id')
+            ->whereNull('order_issue_on_tops.deleted_at')
+            ->orderBy('order_issue_on_tops.updated_at', 'desc');
+    }
+
+    public function scopeJsonWith($query)
+    {
+        return $query->with(['issueType', 'logs' => function ($query){
+            $query->with('user')->orderByDesc('created_at');
+        },'order'=>function($query){
+            $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']);
+        },'secondOrder'=>function($query){
+            $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']);
+        },'orderIssueRejectedBills.rejectedBill'=>function($query){
+            $query->with(['owner','logistic','user','items.quality']);
+        },'userWorkgroups'])
+            ->orderBy('order_issues.id', 'desc');
+    }
+
     public function userWorkgroups(): BelongsToMany
     {
         return $this->belongsToMany(UserWorkgroup::class);

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -78,6 +78,7 @@ use App\Services\WarehouseService;
 use App\Services\WaybillFinancialService;
 use App\Services\WeighExceptedService;
 use App\Services\OrderFreezeService;
+use App\Services\RegionService;
 use Illuminate\Queue\Events\JobFailed;
 use Illuminate\Support\Facades\Queue;
 use Illuminate\Support\Facades\Schema;
@@ -185,6 +186,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('ProcessStatisticService',ProcessStatisticService::class);
         app()->singleton('ProcessesContentService',ProcessesContentService::class);
         app()->singleton('RealtimePendingOrdersService',RealtimePendingOrdersService::class);
+        app()->singleton('RegionService',RegionService::class);
         app()->singleton('RejectedBillItemService',RejectedBillItemService::class);
         app()->singleton('RejectedBillService',RejectedBillService::class);
         app()->singleton('RejectedService',RejectedService::class);

+ 2 - 0
app/Region.php

@@ -5,6 +5,7 @@ namespace App;
 use Illuminate\Database\Eloquent\Model;
 
 use App\Traits\LogModelChanging;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
  * 留存:目前仅当作区级使用 后续将省市表并入此表
@@ -12,6 +13,7 @@ use App\Traits\LogModelChanging;
 class Region extends Model
 {
     use LogModelChanging;
+    use SoftDeletes;
 
     public $timestamps=false;
     protected $fillable = ["parent_id","name","type","code"];

+ 6 - 2
app/RejectedBill.php

@@ -198,13 +198,17 @@ class RejectedBill extends Model
         }
         if(!$orderIssue)return;
         $orderIssue->joinRejectedBill($this->logistic_number_return);
+        $orderIssue->syncRejectingStatus();
     }
 
     public function syncOrderIssue()
     {
         if(isset($this->orderIssueRejectedBill)){
-            if(isset($this->orderIssueRejectedBill->orderIssue)) $this->orderIssueRejectedBill->orderIssue->syncRejectingStatus();
-            return;
+            if(isset($this->orderIssueRejectedBill->orderIssue)){
+                /** @var OrderIssue $orderIssue */
+                $orderIssue = $this->orderIssueRejectedBill->orderIssue;
+                $orderIssue->syncRejectingStatus();
+            }
         }
     }
 

+ 16 - 2
app/Services/OracleDOCOrderHeaderService.php

@@ -24,7 +24,8 @@ 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.OrderType','DOC_Order_Header.WaveNo'
+        'DOC_Order_Header.IssuePartyName','DOC_Order_Header.OrderType','DOC_Order_Header.WaveNo',
+        'DOC_Order_Header.ReleaseStatus'
     ];
 
     public function getQuery(){
@@ -106,6 +107,19 @@ Class OracleDOCOrderHeaderService
         return $this->getQuery()->whereIn('DOC_Order_Header.OrderNo',$orderNos)->get();
     }
 
-
+    public function loadMissing($orderHeaders)
+    {
+        return $orderHeaders->loadMissing(['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,doc_order_details.Location,doc_order_details.OrderLineNo,doc_order_details.d_edi_03');
+        }, '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,ACT_Allocation_Details.Location,ACT_Allocation_Details.SkuLineNo,ACT_Allocation_Details.OrderLineno');
+        },'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');
+        }]);
+    }
 
 }

+ 6 - 2
app/Services/OracleDocWaveDetailService.php

@@ -17,7 +17,8 @@ class OracleDocWaveDetailService
     {
         if (!$orderHeaders) return;
         $clearOrderNos = data_get($orderHeaders, '*.orderno');
-        OracleDOCWaveDetails::query()->whereIn('OrderNo', $clearOrderNos)->delete();
+        $ownerNos = data_get($orderHeaders, '*.ownerno');
+        OracleDOCWaveDetails::query()->whereIn('OrderNo', $clearOrderNos)->whereIn('OwnerNo',$ownerNos)->delete();
         app('LogService')->log(__CLASS__, __METHOD__, 'Delete OracleDOCWaveDetails' . '  ' . json_encode($clearOrderNos) );
     }
 
@@ -94,7 +95,10 @@ class OracleDocWaveDetailService
         foreach ($orderHeaderList as $items) {
             $this->clearCancelledOrder($items);
             if ($orderHeaders->count() > 0) {
-                OracleDOCOrderHeader::query()->whereIn('orderNo', data_get($items, '*.orderno'))->update(['waveno' => '*']);
+                OracleDOCOrderHeader::query()
+                    ->whereIn('orderNo', data_get($items, '*.orderno'))
+                    ->whereIn('owerno', data_get($items, '*.owerno'))
+                    ->update(['waveno' => '*']);
                 $json = json_encode($items->map(function ($orderHeader) {
                     return ['orderno' => $orderHeader->orderno, 'waveno' => $orderHeader->waveno];
                 }));

+ 22 - 22
app/Services/OrderFreezeService.php

@@ -16,16 +16,7 @@ class OrderFreezeService
     public function getFreezes()
     {
         return app(CacheService::class)->getOrExecute("order_freeze_condition_pool",function (){
-            return \App\OrderFreeze::query()
-                ->with(["logistic:id,name","province:id,name","city:id,name","location:id,name"])
-                ->where("status",0)
-                ->get(["logistic_id","province_id","city_id","location_id"])->each(function (&$freeze){
-                    $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
-                    $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
-                    $freeze["city_name"]     = $freeze->city ? $freeze->city->name : '';
-                    $freeze["location_name"] = $freeze->location ? $freeze->location->name : '';
-                    unset($freeze->logistic,$freeze->province,$freeze->city,$freeze->location);
-                })->toArray();
+            return $this->get();
         },config("cache.expirations.rarelyChange"));
     }
 
@@ -34,17 +25,26 @@ class OrderFreezeService
      */
     public function refreshFreezes()
     {
-        if (Cache::has("order_freeze_condition_pool")){
-            $val = \App\OrderFreeze::query()
-                ->with(["logistic:id,name", "province:id,name", "city:id,name", "location:id,name"])
-                ->where("status", 0)
-                ->get()->each(function (&$freeze) {
-                    $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
-                    $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
-                    $freeze["city_name"] = $freeze->city ? $freeze->city->name : '';
-                    $freeze["location_name"] = $freeze->location ? $freeze->location->name : '';
-                });
-            Cache::put("order_freeze_condition_pool",$val);
-        }
+        if (Cache::has("order_freeze_condition_pool")) Cache::put("order_freeze_condition_pool",$this->get());
+    }
+
+    /**
+     * 获取所有冻结条件
+     *
+     */
+    public function get()
+    {
+        return \App\OrderFreeze::query()
+            ->with(["logistic:id,name","province:id,name","city:id,name","district:id,name","town:id,name","street:id,name"])
+            ->where("status",0)
+            ->get(["logistic_id","province_id","city_id","district_id","town_id","street_id"])->each(function (&$freeze){
+                $freeze["logistic_name"] = $freeze->logistic ? $freeze->logistic->name : '';
+                $freeze["province_name"] = $freeze->province ? $freeze->province->name : '';
+                $freeze["city_name"]     = $freeze->city ? $freeze->city->name : '';
+                $freeze["district_name"] = $freeze->district ? $freeze->district->name : '';
+                $freeze["town_name"] = $freeze->town ? $freeze->town->name : '';
+                $freeze["street_name"] = $freeze->street ? $freeze->street->name : '';
+                unset($freeze->logistic,$freeze->province,$freeze->city,$freeze->district,$freeze->town,$freeze->street);
+            })->toArray();
     }
 }

+ 0 - 315
app/Services/OrderIssueService.php

@@ -24,320 +24,12 @@ use App\Traits\ServiceAppAop;
 class OrderIssueService
 {
     use ServiceAppAop;
-    public function __construct()
-    {
-        app()->bind("orderService", OrderService::class);
-        app()->bind("rejectedService", RejectedService::class);
-        app()->bind("orderPackageCommoditiesService", OrderPackageCommoditiesService::class);
-    }
 
     public function insert($params)
     {
         OrderIssue::query()->insert($params);
     }
 
-    public function getQuery(array $arr, array $condition = null)
-    {
-        if (!isset($condition)) {
-            $condition = $arr;
-        }
-        $user = Auth::user();
-        $owner_ids = $user ? app('UserService')->getPermittingOwnerIds($user) : [];
-        if ($condition['owner_id'] ?? false) {
-            $owner_ids = explode(',', $condition['owner_id']);
-        }
-        $query = OrderIssue::with(['top', 'userWorkgroups', 'issueType', 'logs' => function ($query) use ($arr) {
-            $query->with('user')->orderByDesc('created_at');
-        }, 'order' => function ($query) {
-            $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
-                $query->with('barcodes');
-            }]);
-        }, 'orderIssueRejectedBills.rejectedBill' => function ($query) {
-            $query->with(['items.quality']);
-        }, 'secondOrder' => function ($query) {
-            $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity' => function ($query) {
-                $query->with('barcodes');
-            }]);
-        }])->whereHas('order.owner', function ($query) use ($owner_ids) {
-            $query->whereIn('id', $owner_ids);
-        });
-        if ($arr['log_content'] ?? false) {
-            $query->whereHas('logs', function ($query) use ($arr) {
-                $query->where('content', 'like', $arr['log_content']);
-                if ($arr['addtime'] ?? false) {
-                    $query->where('created_at', '>=', Carbon::now()->subDays($arr['addtime']));
-                } else {
-                    $query->where('created_at', '>=', Carbon::now()->subDays(31));
-                }
-            });
-        }
-        if (isset($arr['is_imported'])) {
-            $query->where('imported_status', $arr['is_imported']);
-        }
-
-        if (isset($arr['is_new_rejecting'])) {
-            $query->where('is_new_rejecting', '=', $arr['is_new_rejecting']);
-        }
-
-        if (isset($arr['logistic_id'])) {
-            $query->whereHas('order', function ($query) use ($arr) {
-                $query->where('logistic_id', $arr['logistic_id']);
-            });
-        }
-        if (isset($arr['custom_code'])) {
-            $query->where('custom_code', $arr['custom_code']);
-        }
-        if(isset($arr['hiddenTag'])){
-            $query->where('hidden_tag', $arr['hiddenTag']);
-        }else{
-            $query->whereNull('hidden_tag');
-        }
-        $query->selectRaw('order_issues.* ,order_issue_on_tops.id top_id ,order_issue_on_tops.remark,order_issue_on_tops.updated_at top_update')
-            ->leftJoin('order_issue_on_tops', 'order_issue_on_tops.order_issue_id', '=', 'order_issues.id')
-            ->whereNull('order_issue_on_tops.deleted_at')
-            ->orderBy('order_issue_on_tops.updated_at', 'desc');
-        $query->orderBy('order_issues.id', 'desc');
-        return $query;
-    }
-
-    private function getOrderQuery(array $arr, $query)
-    {
-        $query->whereHas('order', function ($query) use ($arr) {
-            if ($arr['client_code'] ?? false) {
-                return $this->searchWay($query, $arr['client_code'], 'client_code');
-            }
-            if ($arr['consignee_name'] ?? false) {
-                return $this->searchWay($query, $arr['consignee_name'], 'consignee_name');
-            }
-            if ($arr['consignee_phone'] ?? false) {
-                return $this->searchWay($query, $arr['consignee_phone'], 'consignee_phone');
-            }
-            if ($arr['logistic_number'] ?? false) {
-                $logistic_number = $arr['logistic_number'];
-                $query->whereHas('packages', function ($query) use ($logistic_number) {
-                    return $this->searchWay($query, $logistic_number, 'logistic_number');
-                });
-            }
-            if (($arr['good_barcode'] ?? false) || ($arr['good_name'] ?? false)) {
-                $query->whereHas('packages.commodities.commodity', function ($query) use ($arr) {
-                    if ($arr['good_barcode'] ?? false) {
-                        return $this->searchWay($query, $arr['good_barcode'], 'sku');
-                    }
-                    if ($arr['good_name'] ?? false) {
-                        $query->where('name', 'like', '%' . $arr['good_name'] . '%');
-                    }
-                });
-            }
-        });
-        if ($arr['send_client_code'] ?? false) {
-            $query->whereHas('secondOrder', function ($query) use ($arr) {
-                return $this->searchWay($query, $arr['send_client_code'], 'client_code');
-            });
-        }
-        return $query;
-    }
-
-    public function getRejectedBillQuery(array $arr, $query)
-    {
-        if (($arr['logistic_number_return'] ?? false) || ($arr['id_quality_label'] ?? false)) {
-            $order_issue_rejected_bill_query = OrderIssueRejectedBill::query()->selectRaw('order_issue_id');
-            if(isset($arr['id_quality_label'])){
-                $rejected_bill_item_query = RejectedBillItem::query()->selectRaw('id_rejected_bill')->where('rejected_bill_items.id_quality_label',$arr['id_quality_label']);
-                $rejected_bill_query = RejectedBill::query()->selectRaw('rejected_bills.logistic_number_return')->whereIn('rejected_bills.id',$rejected_bill_item_query);
-                $order_issue_rejected_bill_query->whereIn('order_issue_rejected_bill.logistic_number_return',$rejected_bill_query);
-            }
-            if(isset($arr['logistic_number_return'])){
-                $this->searchWay($order_issue_rejected_bill_query,$arr['logistic_number_return'],'logistic_number_return');
-            }
-            $query->whereIn('order_issues.id',$order_issue_rejected_bill_query);
-        }
-        return $query;
-    }
-
-    public function getConditionQuery(array $arr, array $condition = null)
-    {
-        /** @var Builder $query */
-        $query = $this->getQuery($arr, $condition);
-        $query = $this->getOrderQuery($condition ?? $arr, $query);
-        $query = $this->getRejectedBillQuery($condition ?? $arr, $query);
-        if (!isset($condition)) {
-            $condition = $arr;
-        }
-        if ($condition['id'] ?? false) {
-            $query->whereIn('order_issues.id', explode(',', $condition['id']));
-        }
-        if (isset($condition['created_at_start'])) {
-            $query->where('order_issues.created_at', '>=', $condition['created_at_start'] . " 00:00:00");
-        }
-        if (isset($condition['created_at_end'])) {
-            $query->where('order_issues.created_at', '<=', $condition['created_at_end'] . " 23:59:59");
-        }
-        if (isset($condition['final_status'])) {
-            if ($condition['final_status'] == 'null') {
-                $query->whereNull('final_status');
-            } else {
-                $query->where('final_status', $condition['final_status']);
-            }
-        }
-        if (isset($condition['order_issue_type_id'])) {
-            $type_ids = explode(',',$condition['order_issue_type_id']);
-            $query->whereIn('order_issue_type_id', $type_ids);
-        }
-        if (!($condition['is_handle'] ?? false) && !($condition['final_status'] ?? false)) {
-            if (!(isset($condition['settlement_at_start']) || isset($condition['settlement_at_end']))) {
-                $query->where(function ($query) {
-                    $query->whereNotIn('final_status',['已解决','已归档'])->orWhereNull('final_status');
-                });
-            }
-        }
-        if (isset($condition['logistic_indemnity_money'])) {
-            if($condition['logistic_indemnity_money']== '是'){
-                $query->whereNotNull('logistic_indemnity_money');
-            }elseif($condition['logistic_indemnity_money']== '否'){
-                $query->whereNull('logistic_indemnity_money');
-            }
-        }
-        if (isset($condition['baoshi_indemnity_money'])) {
-            if($condition['baoshi_indemnity_money']== '是'){
-                $query->whereNotNull('baoshi_indemnity_money');
-            }elseif($condition['baoshi_indemnity_money']== '否'){
-                $query->whereNull('baoshi_indemnity_money');
-            }
-        }
-        if (isset($condition['rejectingStatus'])) {
-            $query->where('rejecting_status',$condition['rejectingStatus']);
-        }
-        if (isset($condition['order_issue_ids'])) {
-            $orderIssuesId = $condition['order_issue_ids'];
-            if (is_string($orderIssuesId)) {
-                $orderIssuesId = explode(',', $orderIssuesId);
-            }
-            $query->whereIn('order_issues.id', $orderIssuesId);
-        }
-        if (isset($condition['settlement_at_start']) || isset($condition['settlement_at_end'])) {
-            $query->whereHas('logs', function ($query) use ($condition) {
-                if (isset($condition['settlement_at_start'])) {
-                    $query->where('created_at', '>=', $condition['settlement_at_start'] . ' 00:00:00')->where('type', '结束');
-                }
-                if (isset($condition['settlement_at_end'])) {
-                    $query->where('created_at', '<=', $condition['settlement_at_end'] . ' 23:59:59')->where('type', '结束');
-                }
-            });
-        }
-        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']);
-        }
-        if (isset($condition['finance_confirm'])) {
-            $query->where('finance_confirm', $condition['finance_confirm']);
-        }
-        if (isset($condition['user_workgroups'])) {
-
-            if (is_string($condition['user_workgroups'])) {
-                $userWorkgroupIds = explode(',', $condition['user_workgroups']);
-            }
-            $query->whereHas('userWorkgroups', function ($query) use ($userWorkgroupIds) {
-                $query->whereIn('id', $userWorkgroupIds);
-            });
-        }
-        //根据店铺名称模糊筛选
-        if (isset($condition['shop_name'])) {
-            $query->whereHas('order.shop', function ($query) use ($condition) {
-                $this->searchWay($query, $condition['shop_name'].'%', 'name');
-            });
-            if (isset($condition['shop_name_limit_time'])) {
-                $query->Where('order_issues.created_at','>=', Carbon::now()->subDays($condition['shop_name_limit_time']));
-            } else {
-                $query->Where('order_issues.created_at','>=', Carbon::now()->subDays(31));
-            }
-        }
-        return $query;
-    }
-
-    private function isSearchLike($str)
-    {
-        if (substr($str, 0, 1) == "%" || substr($str, strlen($str) - 1, 1) == "%") {
-            return true;
-        }
-        return false;
-    }
-
-    private function searchWay($query, $param, $column)
-    {
-        if ($this->isSearchLike($param)) {
-            $query->where($column, 'like', $param);
-        } else {
-            $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
-        }
-        return $query;
-    }
-
-    public function getSqlList(array $params)
-    {
-        $orderPackageSql = OrderPackage::query()->selectRaw('order_packages.logistic_number order_package_logistic_number')
-            ->leftJoin('order_package_commodities','order_packages.id','order_package_commodities.order_package_id')
-            ->selectRaw('order_package_commodities.amount commodity_amount')
-            ->leftJoin('commodities','order_package_commodities.commodity_id','commodities.id')
-            ->selectRaw('commodities.name commodity_name,commodities.sku commodity_sku')
-            ->leftJoin('order_issues','order_packages.order_id','order_issues.order_id')
-            ->selectRaw('order_issues.id order_issue_id')
-            ->sql();
-        $secondOrderPackageSql = Order::query()->from('order_packages','s_o_p')->selectRaw('s_o_p.logistic_number')
-            ->leftJoin("orders as o_d","s_o_p.order_id","o_d.id")
-            ->leftJoin('order_package_commodities as s_o_p_c','s_o_p_c.order_package_id','s_o_p.id')
-            ->selectRaw('s_o_p_c.amount s_o_p_c_amount')
-            ->leftJoin('commodities as s_c','s_o_p_c.commodity_id','s_c.id')
-            ->selectRaw('s_c.sku s_c_sku,s_c.name s_c_name')
-            ->leftJoin('order_issues','o_d.client_code','order_issues.second_client_no')
-            ->selectRaw('order_issues.id order_issue_id')
-            ->sql();
-        $rejectedBillItemSql = RejectedBillItem::query()->selectRaw('rejected_bill_items.remark,rejected_bill_items.amount rejected_bill_amount,rejected_bill_items.name_goods,rejected_bill_items.barcode_goods')
-            ->leftJoin('rejected_bills',"rejected_bill_items.id_rejected_bill","rejected_bills.id")
-            ->leftJoin('order_issues','rejected_bills.logistic_number_return','order_issues.logistic_number_return')
-            ->selectRaw('order_issues.id order_issue_id')
-            ->sql();
-        $logSql = OrderIssueProcessLog::query()->selectRaw('order_issue_process_logs.content log_content,order_issue_process_logs.type log_type')
-            ->leftJoin('users','order_issue_process_logs.user_id','users.id')
-            ->selectRaw('users.name user_name')
-            ->leftJoin('order_issues','order_issue_process_logs.order_issue_id','order_issues.id')
-            ->selectRaw('order_issues.id order_issue_id')
-            ->sql();
-        $column = "order_issues.id,order_issues.rejected_bill_id,order_issues.rejecting_status,order_issues.created_at order_issues_created_at,order_issues.result_explain,order_issues.final_status,";
-        $column .= "order_issues.logistic_indemnity_money,order_issues.logistic_express_remission,order_issues.baoshi_indemnity_money,order_issues.baoshi_express_remission";
-        $orderIssueSql =  $this->getConditionQuery($params)->selectRaw($column)
-            ->leftJoin('order_issue_types','order_issues.order_issue_type_id','order_issue_types.id')
-            ->selectRaw('order_issue_types.`name` order_issue_type_name')
-            ->leftJoin('orders','order_issues.order_id','orders.id')
-            ->selectRaw('orders.id order_id,orders.address,orders.district,orders.city,orders.province,orders.consignee_phone,orders.consignee_name,orders.client_code,orders.created_at order_created_at')
-            ->leftJoin('logistics','logistics.id','orders.logistic_id')
-            ->selectRaw('logistics.name logistic_name')
-            ->leftJoin('owners','owners.id','orders.owner_id')
-            ->selectRaw('owners.name owner_name')
-            ->leftJoin('shops','orders.shop_id','shops.id')
-            ->selectRaw('shops.name shop_name')
-            ->leftJoin('orders as s_o','s_o.client_code','order_issues.second_client_no')
-            ->selectRaw('s_o.id s_o_id,s_o.client_code s_o_client_code')
-            ->leftJoin('logistics as s_logistics','s_o.logistic_id','s_logistics.id')
-            ->selectRaw('s_logistics.name s_logistics_name')
-            ->leftJoin('user_workgroups','user_workgroups.id','order_issues.user_workgroup_id')
-            ->selectRaw('user_workgroups.name user_workgroup_name')
-            ->sql();
-        return compact('orderPackageSql','secondOrderPackageSql','orderIssueSql','rejectedBillItemSql','logSql');
-    }
-
-    public function paginate(array $params)
-    {
-        return $query = $this->getConditionQuery($params)->paginate($params['paginate'] ?? 50);
-    }
-
     public function orderIssueTag(array $params)
     {
         $orderNos = $params['orderNos'];
@@ -567,7 +259,6 @@ class OrderIssueService
         return ['success' => true, 'order' => $order];
     }
 
-
     public function createOrderIssue($logisticNumber, $type, $result_explain, $importedStatus = '正常', $custom_code = null,$hiddenTag = null)
     {
         $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails', 'oracleBASCode','orderType'])
@@ -630,12 +321,6 @@ class OrderIssueService
         }
     }
 
-    public function getJsonObj(array $params)
-    {
-        return  $this->getConditionQuery($params)->get();
-    }
-
-
     public function getRecycleBinPaginate($params){
         return OrderIssue::query()
             ->with(['order'=>function($query){

+ 23 - 14
app/Services/OrderService.php

@@ -579,11 +579,19 @@ class OrderService
         return $order = Order::query()->with('packages.commodities.commodity')->where('code',$code)->first();
     }
 
-    public function syncOrderInfo($orderHeaders,$sync_order_commodity = true){
+    /**
+     * 同步 Order信息
+     *
+     * @param array $orderHeaders
+     * @param bool $syncOrderCommodity
+     * @param bool $syncOrderPackage
+     * @param bool $syncOrderPackageCommodity
+     */
+    public function syncOrderInfo($orderHeaders,$syncOrderCommodity = true,$syncOrderPackage = true,$syncOrderPackageCommodity = true){
         $this->syncOrderByWMSOrderHeaders($orderHeaders);
-        if($sync_order_commodity)app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
-        app('OrderPackageService')->syncOrderPackage($orderHeaders);
-        app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
+        if($syncOrderCommodity)app("OrderCommodityService")->syncOrderCommodity($orderHeaders);
+        if($syncOrderPackage)app('OrderPackageService')->syncOrderPackage($orderHeaders);
+        if($syncOrderPackageCommodity)app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);
     }
 
     public function syncOrder(&$orderHeaders)
@@ -657,9 +665,8 @@ class OrderService
         }
         unset($created_params);
         $update_params = [
-            ['id','code','warehouse_id','owner_id','batch_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']
+            ['id','code','warehouse_id','owner_id','batch_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','frozen']
         ];
-
         $update_order->each(function($item)use(&$update_params){
             $update_params[] = $item->toArray();
         });
@@ -749,6 +756,7 @@ class OrderService
             'wms_edittime' => $orderHeader['edittime'],
             'wms_status' => $orderHeader->oracleBASCode->codename_c??'',
             'order_type' => $orderHeader->orderType->codename_c??'',
+            'frozen' => Order::getFrozen($orderHeader->releasestatus),
             'updated_at' => $date,
             'created_at' => $orderHeader['addtime']
         ];
@@ -944,14 +952,10 @@ class OrderService
         });
     }
 
-    public function syncOrderByWmsOrderNos($orderNos)
-    {
-        if(empty($orderNos))return ;
-        if(count($orderNos)==0)return;
-        $orderHeaders = $this->oracleDOCOrderHeaderService->getOrderByOrderNos($orderNos);
-        $this->syncOrderByWMSOrderHeaders($orderHeaders);
-    }
-
+    /**
+     * 根据 订单号集合 OrderNo 同步订单
+     * @param array $orderNos
+     */
     public function syncOrderInfoByWmsOrderNos($orderNos)
     {
         if(empty($orderNos))return ;
@@ -960,9 +964,14 @@ class OrderService
         $this->syncOrderInfoByWMSOrderHeaders($orderHeaders);
     }
 
+    /**
+     * 根据表头信息 OrderHeader 集合 同步订单
+     * @param array $orderHeaders
+     */
     public function syncOrderInfoByWMSOrderHeaders($orderHeaders){
         if(empty($orderHeaders))return ;
         if(count($orderHeaders)==0)return;
+        $orderHeaders = app('OracleDocOrderHeaderService')->loadMissing($orderHeaders);
         $this->syncOrderByWMSOrderHeaders($orderHeaders);
         app('OrderPackageService')->syncOrderPackage($orderHeaders);
         app("OrderPackageCommoditiesService")->syncOrderPackageCommodities($orderHeaders);

+ 19 - 8
app/Services/OwnerPriceOperationService.php

@@ -253,16 +253,27 @@ Class OwnerPriceOperationService
                     }
                     break;
                 default:
-                    if ($isIn)break;
-                    if ($unitName && $unitName != $units[$rule->unit_id])return -3; //校验单位是否一致
+                    if ($isIn)break;    //入库不计算起步
 
-                    $money = $rule->amount * $rule->unit_price;
-                    $startNumber = $rule->amount;
-                    $packages = $this->settingCount($packages,$amountColumn,$startNumber);
-                    if ($packages){
-                        foreach ($packages as $package){
-                            $money += $package[$amountColumn] * $package["price"];
+                    if ($rule->amount){ //起步数+起步费
+                        if ($unitName && $unitName != $units[$rule->unit_id])return -3; //校验单位是否一致
+
+                        $money = $rule->unit_price;
+                        $startNumber = $rule->amount;
+                        $packages = $this->settingCount($packages,$amountColumn,$startNumber);
+                        if ($packages){
+                            foreach ($packages as $package){
+                                $money += $package[$amountColumn] * $package["price"];
+                            }
+                        }
+                    }else{//单起步费
+                        $money = 0;
+                        if ($packages){
+                            foreach ($packages as $package){
+                                $money += $package[$amountColumn] * $package["price"];
+                            }
                         }
+                        if ($money<$rule->unit_price)$money = $rule->unit_price;
                     }
                     return $money;
             }

+ 130 - 0
app/Services/RegionService.php

@@ -0,0 +1,130 @@
+<?php 
+
+namespace App\Services;
+
+use App\Region;
+use App\Traits\ServiceAppAop;
+
+class RegionService
+{
+    use ServiceAppAop;
+
+
+    /**
+     * 根据行政级别格式化地域名,提取关键字
+     *
+     * @param string $name
+     * @param int $type
+     *
+     * @return string
+     */
+    public function formatName($name, $type)
+    {
+        switch ($type){
+            case 1:
+                $pool = ["省","自治区","市","特别行政"];
+                break;
+            case 2:
+                $pool = ["市","区","自治州"/*,"州"*/,"盟"];
+                break;
+            case 3:
+                $pool = ["市","区","自治县","县","自治旗","旗","特区","林区"];
+                break;
+            default:
+                $pool = [];
+        }
+        return $this->extractKeyword($name,$pool);
+    }
+
+    /**
+     * 根据省份获取ID
+     *
+     * @param string $province
+     *
+     * @return int
+     */
+    public function getProvince(string $province):int
+    {
+        $province = $this->formatName($province,1);
+        $region = Region::withTrashed()->where("name","like",$province."%")
+            ->where("type",1)->first();
+        if (!$region)$region = Region::query()->create([
+            "name"      => $province,
+            "type"      => 2,
+        ]);
+        return $region->id;
+    }
+
+    /**
+     * 根据城市获取ID
+     *
+     * @param string $city
+     * @param string|int|null $parent
+     *
+     * @return int
+     */
+    public function getCity(string $city, $parent = null):int
+    {
+        $city = $this->formatName($city,2);
+        $region = Region::withTrashed()->where("name","like",$city."%")
+            ->where("type",2)->first();
+        if (!$region){
+            $region = [
+                "name"      => $city,
+                "type"      => 2,
+            ];
+            if ($parent){
+                if (is_int($parent))$region["parent_id"] = $parent;
+                else $region["parent_id"] = $this->getProvince($parent);
+            }
+            $region = Region::query()->create($region);
+        }
+        return $region->id;
+    }
+
+    /**
+     * 根据区县获取ID
+     *
+     * @param string $district
+     * @param string|int|null $parent
+     *
+     * @return int
+     */
+    public function getDistrict(string $district, $parent = null):int
+    {
+        $district = $this->formatName($district,3);
+        $region = Region::withTrashed()->where("name","like",$district."%")
+            ->where("type",3)->first();
+        if (!$region){
+            $region = [
+                "name"      => $district,
+                "type"      => 3,
+            ];
+            if ($parent){
+                if (is_int($parent))$region["parent_id"] = $parent;
+                else $region["parent_id"] = $this->getCity($parent);
+            }
+            $region = Region::query()->create($region);
+        }
+        return $region->id;
+    }
+
+    /**
+     * 根据字典池提取关键字
+     *
+     * @param string $name
+     * @param array $pool
+     *
+     * @return string
+     */
+    private function extractKeyword(string $name,array $pool)
+    {
+        foreach ($pool as $keyword){
+            $result = mb_strpos($name,$keyword);
+            if ($result!==false){
+                return mb_substr($name,0,$result);
+            }
+        }
+        return $name;
+    }
+}

+ 21 - 15
app/Services/RejectedBillService.php

@@ -64,24 +64,25 @@ Class RejectedBillService
 
     public function syncLoadedStatusByAsnHerder($asnHerders)
     {
-        $updateParams=$this->getNeedUpdateLoadedStatusByWms($asnHerders);
-        if (!$updateParams)return;
-        if (count($updateParams) > 1) $this->batchUpdate($updateParams);
+        //是否审核
         $updates=$this->getNeedUpdateCheckedStatusByWms($asnHerders);
-        if (!$updates)return;
         if (count($updates) > 1) $this->batchUpdate($updates);
+        //是否入库
+        $updateParams=$this->getNeedUpdateLoadedStatusByWms($asnHerders);
+        if (count($updateParams) > 1) $this->batchUpdate($updateParams);
     }
 
     public function getNeedUpdateLoadedStatusByWms($asnHerders)
     {
-        if ($asnHerders->isEmpty()) return null;
+
+        if (!$asnHerders) return null;
         $updateCollect = $this->getUpdateCollect($asnHerders);
-        if ($updateCollect->isEmpty()) return null;
+        if (!$updateCollect) return null;
         $logisticNumberReturn = $this->getLogisticNumberReturn($updateCollect);
         $rejectedBills = $this->getRejectedBills($logisticNumberReturn);
         if (!$rejectedBills) return null;
         $updateParams = [[
-            'logistic_number_return', 'is_loaded', 'updated_at'
+            'id','logistic_number_return', 'is_loaded', 'updated_at'
         ]];
         $updated_at = Carbon::now()->toDateTimeString();
         /** @var DataHandlerService $dataHandlerService */
@@ -94,6 +95,7 @@ Class RejectedBillService
             if ($data->asnreference3) {
                 $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $data->asnreference3], $rejectedBills_map);
                 if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
+                    'id'=>$rejectedBill->id,
                     'logistic_number_return' => $data->asnreference3,
                     'is_loaded' => 1,
                     'updated_at' => $updated_at,
@@ -104,6 +106,7 @@ Class RejectedBillService
                 if (count($result)<1) continue;
                 $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $result[0]], $rejectedBills_map);
                 if ($rejectedBill && $rejectedBill->is_loaded != 1) $updateParams[] = [
+                    'id'=>$rejectedBill->id,
                     'logistic_number_return' => $result[0],
                     'is_loaded' => 1,
                     'updated_at' => $updated_at,
@@ -158,12 +161,12 @@ Class RejectedBillService
 
     public function getNeedUpdateCheckedStatusByWms($asnHerders)
     {
-        if ($asnHerders->isEmpty()) return null;
+        if (!$asnHerders) return null;
         $logisticNumberReturn = $this->getLogisticNumberReturn($asnHerders);
         $rejectedBills = $this->getRejectedBills($logisticNumberReturn);
         if (!$rejectedBills) return null;
         $updateParams = [[
-            'logistic_number_return', 'is_checked','checked_numbers','updated_at'
+            'id','logistic_number_return', 'is_checked','checked_numbers','updated_at'
         ]];
         $updated_at = Carbon::now()->toDateTimeString();
         /** @var DataHandlerService $dataHandlerService */
@@ -174,6 +177,7 @@ Class RejectedBillService
             if ($data->asnreference3) {
                 $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $data->asnreference3], $rejectedBills_map);
                 if ($rejectedBill && $rejectedBill->is_checked != 1) $updateParams[] = [
+                    'id'=>$rejectedBill->id,
                     'logistic_number_return' => $data->asnreference3,
                     'is_checked' => 1,
                     'checked_numbers' => $rejectedBill->makeCheckedNumbers(),
@@ -184,12 +188,14 @@ Class RejectedBillService
                 preg_match("/[a-zA-Z]{0,5}\d{6,20}/", $data->notes, $result);
                 if (count($result)<1) continue;
                 $rejectedBill = $dataHandlerService->getKeyValue(['logistic_number_return' => $result[0]], $rejectedBills_map);
-                if ($rejectedBill && $rejectedBill->is_checked != 1) $updateParams[] = [
-                    'logistic_number_return' => $result[0],
-                    'is_checked' => 1,
-                    'checked_numbers' => $rejectedBill->makeCheckedNumbers(),
-                    'updated_at' => $updated_at,
-                ];
+                if ($rejectedBill && $rejectedBill->is_checked != 1)
+                    $updateParams[] = [
+                        'id'=>$rejectedBill->id,
+                        'logistic_number_return' => $result[0],
+                        'is_checked' => 1,
+                        'checked_numbers' => $rejectedBill->makeCheckedNumbers(),
+                        'updated_at' => $updated_at,
+                    ];
                 unset($result);
             }
         }

+ 11 - 6
app/Services/WaybillService.php

@@ -20,12 +20,10 @@ Class WaybillService
      * @return Builder
      */
     private function conditionQuery(array $param){
-        $waybills = Waybill::filterAuthorities()->with(['owner','logistic','originationCity','destinationCity'=>function($query){
-            $query->with('province');
-        },'uploadFile','amountUnit','priceModel','warehouseWeightUnit','carrierWeightUnit',
-            'warehouseWeightUnitOther','carrierWeightUnitOther','carType','uploadFile','waybillAuditLogs' => function ($query) {
-            $query->with('user');
-        }])->selectRaw('waybills.* ,waybill_on_tops.id top_id ,waybill_on_tops.remark,waybill_on_tops.updated_at top_update')
+        $waybills = Waybill::filterAuthorities()->with(['owner','logistic','originationCity','destinationCity.province',
+            'uploadFile','amountUnit','warehouseWeightUnit','carrierWeightUnit',
+            'warehouseWeightUnitOther','carrierWeightUnitOther','carType','uploadFile','waybillAuditLogs.user'])
+            ->selectRaw('waybills.* ,waybill_on_tops.id top_id ,waybill_on_tops.remark,waybill_on_tops.updated_at top_update')
             ->leftJoin('waybill_on_tops','waybill_on_tops.waybill_id','=','waybills.id')
             ->whereNull('waybill_on_tops.deleted_at')
             ->orderBy('waybill_on_tops.updated_at','desc')
@@ -84,6 +82,13 @@ Class WaybillService
         return DB::transaction(function ()use($request){
             $waybill=new Waybill();
             $inputs = $request->all();
+            if ($inputs["wms_bill_number"]){
+                $order = app("OrderService")->first(["code"=>$inputs["wms_bill_number"]]);
+                if ($order){
+                    $inputs["destination_city_id"] = app("RegionService")->getCity($order->city,$order->province);
+                    $inputs["district_id"] = app("RegionService")->getDistrict($order->district,$order->city);
+                }
+            }
             $inputs['status']='未审核';
             $inputs['waybill_number']=Uuid::uuid1();
             $waybill->fill($inputs);

+ 6 - 1
app/Waybill.php

@@ -21,9 +21,14 @@ class Waybill extends Model
         'status','type','waybill_number','owner_id','wms_bill_number','origination','destination','recipient','recipient_mobile','charge','ordering_remark',
         'logistic_id','carrier_bill','origination_city_id','destination_city_id','warehouse_weight','warehouse_weight_unit_id','carrier_weight','carrier_weight_unit_id','carType_id',
         'car_owner_info','fee','pick_up_fee','other_fee','collect_fee','dispatch_remark','waybill_price_model_id','warehouse_weight_other','warehouse_weight_unit_id_other'
-        ,'carrier_weight_other','carrier_weight_unit_id_other','source_bill','mileage','amount','inquire_tel','amount_unit_id','other_charge','other_charge_remark','deliver_at'
+        ,'carrier_weight_other','carrier_weight_unit_id_other','source_bill','mileage','amount','inquire_tel','amount_unit_id','other_charge','other_charge_remark','deliver_at',
+        "district_id"
     ];
 
+    public function district()
+    {   //区
+        return $this->belongsTo(Region::class,"district_id","id")->where("type",3);
+    }
     public function owner(){
         return $this->hasOne('App\Owner','id','owner_id');
     }

+ 60 - 0
bashupMysql.sh

@@ -0,0 +1,60 @@
+#!/bin/bash
+
+#设置mysql的备份保存目录
+folder=/etc/bashupMysql
+cd $folder
+#当前日期
+time_now=$(date  "+%Y-%m-%d")
+#当前时间的前30天 %H:%M:%S
+time_30day_ago=$(date -d"30 day ago" "+%Y-%m-%d 00:00:00")
+#当前日期的前三天
+time_3day_ago=$(date -d"3 day ago" "+%Y-%m-%d")
+#数据库服务器ip,填写服务器的公网地址即可
+host="was.baoshi56.com"
+test_host="101.133.135.193"
+#用户名
+user="developer"
+test_user="bswas_test"
+#密码
+password="developer"
+test_password="123456"
+#要备份的数据库名
+db="bswas"
+test_db="bswas_test"
+#执行备份语句 --single-transaction 是在导出数据时不锁表
+mysqldump -h$host -u$user -p$password --single-transaction $db --ignore-table=$db.orders --ignore-table=$db.stores --ignore-table=$db.store_items --ignore-table=$db.commodities --ignore-table=$db.commodity_barcodes --ignore-table=$db.logs --ignore-table=$db.order_commodities --ignore-table=$db.order_bins --ignore-table=$db.w_m_s_waybill_orders --ignore-table=$db.rejected_bills --ignore-table=$db.rejected_bill_items --ignore-table=$db.w_m_s_reflect_packages --ignore-table=$db.w_m_s_reflect_receive_skus --ignore-table=$db.w_m_s_reflect_receives --ignore-table=$db.order_counting_records --ignore-table=$db.order_package_commodities --ignore-table=$db.order_packages --ignore-table=$db.packages> $time_nowall.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowall.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db orders --where="created_at>='$time_30day_ago'" > $time_noworders.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworders.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db stores --where="created_at>='$time_30day_ago'" > $time_nowstores.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowstores.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db store_items --where="created_at>='$time_30day_ago'" > $time_nowstore_items.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowstore_items.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db commodities --where="created_at>='$time_30day_ago'" > $time_nowcommodities.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowcommodities.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db commodity_barcodes --where="created_at>='$time_30day_ago'" > $time_nowcommodity_barcodes.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowcommodity_barcodes.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db order_counting_records --where="created_at>='$time_30day_ago'" > $time_noworder_counting_records.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworder_counting_records.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db order_bins --where="created_at>='$time_30day_ago'" > $time_noworder_bins.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworder_bins.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db order_packages --where="created_at>='$time_30day_ago'" > $time_noworder_packages.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworder_packages.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db order_package_commodities --where="created_at>='$time_30day_ago'" > $time_noworder_package_commodities.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworder_package_commodities.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db rejected_bills --where="created_at>='$time_30day_ago'" > $time_nowrejected_bills.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowrejected_bills.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db rejected_bill_items --where="created_at>='$time_30day_ago'" > $time_nowrejected_bill_items.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_nowrejected_bill_items.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db w_m_s_reflect_receive_skus --where="created_at>='$time_30day_ago'" > $time_noww_m_s_reflect_receive_skus.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noww_m_s_reflect_receive_skus.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db w_m_s_reflect_packages --where="created_at>='$time_30day_ago'" > $time_noww_m_s_reflect_packages.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noww_m_s_reflect_packages.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db w_m_s_reflect_receives --where="created_at>='$time_30day_ago'" > $time_noww_m_s_reflect_receives.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noww_m_s_reflect_receives.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db w_m_s_waybill_orders --where="created_at>='$time_30day_ago'" > $time_noww_m_s_waybill_orders.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noww_m_s_waybill_orders.sql
+mysqldump -h$host -u$user -p$password --single-transaction -q -e $db order_commodities --where="created_at>='$time_30day_ago'" > $time_noworder_commodities.sql
+mysql  -u$test_user -p$test_password  $test_db< $time_noworder_commodities.sql
+
+sudo rm -rf $time_3day_ago*

+ 51 - 0
database/migrations/2021_01_20_104314_add_column_deleted_at_table_region.php

@@ -0,0 +1,51 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnDeletedAtTableRegion extends Migration
+{
+    protected $name = [
+        "地域",
+        "地域-查询",
+        "地域-录入",
+        "地域-编辑",
+        "地域-删除",
+    ];
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('regions', function (Blueprint $table) {
+            $table->softDeletes();
+            $table->index("type");
+        });
+
+        foreach ($this->name as $name){
+            \App\Authority::query()->firstOrCreate([
+                "name"=>$name,
+                "alias_name"=>$name
+            ]);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('regions', function (Blueprint $table) {
+            $table->dropSoftDeletes();
+            $table->dropIndex(["type"]);
+        });
+        foreach ($this->name as $name){
+            \App\Authority::query()->where("name",$name)->delete();
+        }
+    }
+}

+ 36 - 0
database/migrations/2021_01_20_150801_add_authority_to_level_3_page.php

@@ -0,0 +1,36 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddAuthorityToLevel3Page extends Migration
+{
+    protected $authorityNames = [
+        '客户管理-财务',
+        '客户管理-客户',
+        '客户管理-相关设置',
+        '称重管理-快递',
+        '人事管理-相关设置',
+        '二次加工管理-相关设置',
+        '入库管理-Excel下载',
+        '入库管理-手持入口',
+    ];
+
+    public function up()
+    {
+        foreach ($this->authorityNames as $authorityName) {
+            if(!Authority::query()->where('name',$authorityName)->exists())
+                Authority::query()->create(['name' => $authorityName,'alias_name' => $authorityName]);
+        }
+
+    }
+    public function down()
+    {
+        foreach ($this->authorityNames as $authorityName) {
+            $authority  = Authority::query()->where('name' ,$authorityName )->first();
+            $authority->delete();
+        }
+    }
+}

+ 32 - 0
database/migrations/2021_01_20_165051_add_orders_unique_to_column_code.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOrdersUniqueToColumnCode extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->unique('code','order_code_unique');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->dropUnique('order_code_unique');
+        });
+    }
+}

+ 32 - 0
database/migrations/2021_01_20_165449_add_column_district_id_table_waybills.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnDistrictIdTableWaybills extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->bigInteger("district_id")->nullable()->index()->comment("外键区");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('waybills', function (Blueprint $table) {
+            $table->dropColumn("district_id");
+        });
+    }
+}

+ 32 - 0
database/migrations/2021_01_22_104216_add_column_frozen_to_orders.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddColumnFrozenToOrders extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->enum('frozen',['是','否'])->index()->default('否');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->dropColumn('frozen');
+        });
+    }
+}

+ 36 - 0
database/migrations/2021_01_22_112931_change_order_freeze_table.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOrderFreezeTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_freezes', function (Blueprint $table) {
+            $table->renameColumn("location_id","district_id");
+            $table->bigInteger("town_id")->nullable()->comment("外键乡镇");
+            $table->bigInteger("street_id")->nullable()->comment("外键村街");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_freezes', function (Blueprint $table) {
+            $table->renameColumn("district_id","location_id");
+            $table->dropColumn("town_id");
+            $table->dropColumn("street_id");
+        });
+    }
+}

+ 7 - 19
public/.htaccess

@@ -1,21 +1,9 @@
-<IfModule mod_rewrite.c>
-    <IfModule mod_negotiation.c>
-        Options -MultiViews -Indexes
-    </IfModule>
+Options +FollowSymLinks -Indexes
+RewriteEngine On
 
-    RewriteEngine On
+RewriteCond %{HTTP:Authorization} .
+RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
 
-    # Handle Authorization Header
-    RewriteCond %{HTTP:Authorization} .
-    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
-
-    # Redirect Trailing Slashes If Not A Folder...
-    RewriteCond %{REQUEST_FILENAME} !-d
-    RewriteCond %{REQUEST_URI} (.+)/$
-    RewriteRule ^ %1 [L,R=301]
-
-    # Handle Front Controller...
-    RewriteCond %{REQUEST_FILENAME} !-d
-    RewriteCond %{REQUEST_FILENAME} !-f
-    RewriteRule ^ index.php [L]
-</IfModule>
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^ index.php [L]

+ 19 - 0
resources/sass/text.scss

@@ -132,4 +132,23 @@
 //文本强调阴影
 .text-shadow-stress{
     text-shadow: 3px 3px 3px yellow
+}
+
+//滚动条美化
+.scrollbar::-webkit-scrollbar {
+    /*滚动条整体样式*/
+    width : 10px;  /*高宽分别对应横竖滚动条的尺寸*/
+    height: 1px;
+}
+.scrollbar::-webkit-scrollbar-thumb {
+    /*滚动条里面小方块*/
+    border-radius: 10px;
+    box-shadow   : inset 0 0 5px rgba(0, 0, 0, 0.2);
+    background   : #535353;
+}
+.scrollbar::-webkit-scrollbar-track {
+    /*滚动条里面轨道*/
+    box-shadow   : inset 0 0 5px rgba(0, 0, 0, 0.2);
+    border-radius: 10px;
+    background   : #ededed;
 }

+ 6 - 2
resources/views/customer/menu.blade.php

@@ -6,15 +6,19 @@
             <li class="nav-item">
                 <a class="nav-link" href="{{url('customer/project/report')}}" :class="{active:isActive('project',2)}">项目</a>
             </li>@endcan
+            @can('客户管理-财务')
             <li class="nav-item">
                 <a class="nav-link" href="{{url('customer/finance/instantBill')}}" :class="{active:isActive('finance',2)}">财务</a>
-            </li>
+            </li>@endcan
+            @can('客户管理-客户')
             <li class="nav-item">
                 <a class="nav-link" href="{{url('customer/customer')}}" :class="{active:isActive('customer',2)}">客户</a>
-            </li>
+            </li>@endcan
+            @can('客户管理-相关设置')
             <li class="nav-item">
                 <a class="nav-link" href="{{url('customer/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
             </li>
+                @endcan
         </ul>
     </div>
 </div>

+ 7 - 7
resources/views/customer/project/create.blade.php

@@ -142,7 +142,7 @@
                         name:"",
                         feature:"",
                         items : [
-                            {strategy:"起步"},
+                            {strategy:"起步",type:"0"},
                             {strategy:"默认"},
                             {strategy:"特征"},
                         ],
@@ -442,7 +442,7 @@
                     });
                 },
                 //加载仓储所需基础信息
-                async _loadStorage(){
+                _loadStorage(){
                     if (!this.pool.units)this._getUnits();
                     if (!this.isLoad && this.ownerTemp.id)this._loadPriceModel();//计费模型未被加载且项目ID存在时
                     if (!this.isLoad && !this.ownerTemp.id) this.isLoad = true;
@@ -625,7 +625,7 @@
                             name:"",
                             feature:"",
                             items : [
-                                {strategy:"起步"},
+                                {strategy:"起步",type:"0"},
                                 {strategy:"默认"},
                                 {strategy:"特征"},
                             ],
@@ -636,14 +636,14 @@
                 _verifyOperationItem(itemIndex){//验证作业费子项信息完整
                     let obj = this.model.operation.items[itemIndex];
                     let sign = false;
-                    if (!obj.amount){
+                    if (obj.strategy!=='起步' && !obj.amount){
                         this.errors['items.'+itemIndex+'.amount'] = ["数量不得为空"];
                         sign = true;
-                    }
-                    if (!obj.unit_id){
+                    }else if (!obj.amount) obj.amount = 0;
+                    if (obj.strategy!=='起步' && !obj.unit_id){
                         this.errors['items.'+itemIndex+'.unit_id'] = ["必须选择单位"];
                         sign = true;
-                    }
+                    }else if (!obj.unit_id) obj.unit_id = 0;
                     if (!obj.unit_price){
                         this.errors['items.'+itemIndex+'.unit_price'] = ["单价不得为空"];
                     }

+ 60 - 45
resources/views/customer/project/part/_operation.blade.php

@@ -35,53 +35,65 @@
 <div class="row mt-3">
     {{--起步--}}
     <div class="card row text-white offset-1 col-9 bg-dark" v-if="model.operation.operation_type === '出库'">
-        <div class="card-body">
+        <div class="card-header" style="max-height: 50px">
             <div class="row">
-                <label class="col-3">子策略:</label>
-                <label class="col-5"><select disabled v-model="model.operation.items[0].strategy" class="form-control">
-                    <option value="起步">起步</option>
-                </select></label>
-            </div>
-            <div class="row mt-2">
-                <label class="col-3">起步数</label>
-                <label class="col-5 mb-0"><input id="amount" type="number" :class="errors['items.0.amount'] ? 'is-invalid' : ''"
-                       v-model="model.operation.items[0].amount" class="form-control" step="1"></label>
-            </div>
-            <div class="row mt-0" v-if="errors['items.0.amount']">
-                <div class="offset-3"><small class="text-danger font-weight-bold ml-3">起步数为必填项</small></div>
-            </div>
-            <div class="row mt-2">
-                <label class="col-3">单位</label>
-                <label class="col-5 mb-0"><select v-model="model.operation.items[0].unit_id" class="form-control" :class="errors['items.0.unit_id'] ? 'is-invalid' : ''">
-                        <option v-for="unit in pool.units" :value="unit.id">@{{ unit.name }}</option>
-                </select></label>
-            </div>
-            <div class="row mt-0" v-if="errors['items.0.unit_id']">
-                <div class="offset-3"><small class="text-danger font-weight-bold ml-3">单位为必选项</small></div>
+                <div class="col-6 offset-3 text-center">起&nbsp;&nbsp;&nbsp;&nbsp;步</div>
             </div>
+        </div>
+        <div class="card-body">
             <div class="row mt-2">
-                <label class="col-3">单价</label>
-                <label class="col-5 mb-0"><input type="number" min="0" step="0.001" class="form-control" v-model="model.operation.items[0].unit_price"
-                           :class="errors['items.0.unit_price'] ? 'is-invalid' : ''"></label>
-            </div>
-            <div class="row mt-0" v-if="errors['items.0.unit_price']">
-                <div class="offset-3"><small class="text-danger font-weight-bold ml-3">单价为必填项</small></div>
+                <div class="col-3">
+                    <label>
+                        <select class="form-control form-control-sm mt-1" v-model="model.operation.items[0].type">
+                            <option value="0">起步数</option>
+                            <option value="1">起步费</option>
+                        </select>
+                    </label>
+                </div>
+                <div class="col-9">
+                    <div class="row" v-if="model.operation.items[0].type == 0">
+                        <label class="col-3">起步数</label>
+                        <label class="col-5 mb-0"><input id="amount" type="number" :class="errors['items.0.amount'] ? 'is-invalid' : ''"
+                                                         v-model="model.operation.items[0].amount" class="form-control" step="1"></label>
+                    </div>
+                    <div class="row mt-0" v-if="errors['items.0.amount']">
+                        <div class="offset-3"><small class="text-danger font-weight-bold ml-3">起步数为必填项</small></div>
+                    </div>
+                    <div class="row mt-2" v-if="model.operation.items[0].type == 0">
+                        <label class="col-3">单位</label>
+                        <label class="col-5 mb-0"><select v-model="model.operation.items[0].unit_id" class="form-control" :class="errors['items.0.unit_id'] ? 'is-invalid' : ''">
+                                <option v-for="unit in pool.units" :value="unit.id">@{{ unit.name }}</option>
+                            </select></label>
+                    </div>
+                    <div class="row mt-0" v-if="errors['items.0.unit_id']">
+                        <div class="offset-3"><small class="text-danger font-weight-bold ml-3">单位为必选项</small></div>
+                    </div>
+                    <div class="row mt-2">
+                        <label class="col-3">起步费</label>
+                        <label class="col-5 mb-0"><input type="number" min="0" step="0.001" class="form-control" v-model="model.operation.items[0].unit_price"
+                                                         :class="errors['items.0.unit_price'] ? 'is-invalid' : ''"></label>
+                    </div>
+                    <div class="row mt-0" v-if="errors['items.0.unit_price']">
+                        <div class="offset-3"><small class="text-danger font-weight-bold ml-3">起步费为必填项</small></div>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
 
     {{--默认--}}
     <div class="card row text-white offset-1 col-9 bg-info">
-        <div class="card-header">
-            <div class="pull-left cursor-pointer text-white" @click="addOperationItem()"><small>新增</small>&nbsp;<span class="fa fa-plus-square-o"></span></div>
-        </div>
-        <div class="card-body">
+        <div class="card-header" style="max-height: 50px">
             <div class="row">
-                <label class="col-3">子策略:</label>
-                <label class="col-5"><select disabled v-model="model.operation.items[1].strategy" class=" form-control">
-                    <option value="默认">默认</option>
-                </select></label>
+                <div class="col-3">
+                    <div class="pull-left cursor-pointer text-white" @click="addOperationItem()"><small>新增</small>&nbsp;<span class="fa fa-plus-square-o"></span></div>
+                </div>
+                <div class="col-6 text-center">
+                    默&nbsp;&nbsp;&nbsp;&nbsp;认
+                </div>
             </div>
+        </div>
+        <div class="card-body">
             <div class="row mt-2">
                 <label class="col-3">数量</label>
                 <label class="col-5 mb-0"><input id="amount" type="number" :class="errors['items.1.amount'] ? 'is-invalid' : ''"
@@ -114,17 +126,20 @@
 
     {{--特征--}}
     <div v-for="(item,i) in model.operation.items" class="card row text-white offset-1 col-9 bg-secondary" v-if="i>1">
-        <div class="card-header">
-            <div class="pull-left cursor-pointer text-white" @click="addOperationItem()"><small>新增</small>&nbsp;<span class="fa fa-plus-square-o"></span></div>
-            <div class="pull-right cursor-pointer text-white" @click="delOperationItem(i)"><small>删除</small>&nbsp;<span class="fa fa-window-close-o"></span></div>
-        </div>
-        <div class="card-body">
+        <div class="card-header" style="max-height: 50px">
             <div class="row">
-                <label class="col-3">子策略</label>
-                <label class="col-5"><select disabled v-model="item.strategy" class="form-control">
-                    <option value="特征">特征</option>
-                </select></label>
+                <div class="col-3">
+                    <div class="pull-left cursor-pointer text-white" @click="addOperationItem()"><small>新增</small>&nbsp;<span class="fa fa-plus-square-o"></span></div>
+                </div>
+                <div class="col-6 text-center">
+                    特&nbsp;&nbsp;&nbsp;&nbsp;征
+                </div>
+                <div class="col-3">
+                    <div class="pull-right cursor-pointer text-white" @click="delOperationItem(i)"><small>删除</small>&nbsp;<span class="fa fa-window-close-o"></span></div>
+                </div>
             </div>
+        </div>
+        <div class="card-body">
             <div class="row mt-2">
                 <label class="col-3">数量</label>
                 <label class="col-5 mb-0"><input type="number" step="1" min="0" :class="errors['items.'+i+'.amount'] ? 'is-invalid' : ''" v-model="item.amount" class="form-control"></label>

+ 4 - 0
resources/views/maintenance/menu.blade.php

@@ -54,6 +54,10 @@
                 <li class="nav-item">
                     <a class="nav-link text-dark" href="{{url('maintenance/city')}}" :class="{active:isActive('city',2)}">城市</a>
                 </li> @endcan
+            @can('地域')
+                <li class="nav-item">
+                    <a class="nav-link text-dark" href="{{url('maintenance/region')}}" :class="{active:isActive('region',2)}">地域</a>
+                </li> @endcan
             @can('承运商')
                 <li class="nav-item">
                     <a class="nav-link text-dark" href="{{url('maintenance/logistic')}}" :class="{active:isActive('logistic',2)}">承运商</a>

+ 88 - 0
resources/views/maintenance/region/index.blade.php

@@ -0,0 +1,88 @@
+@extends('layouts.app')
+@section('title')设置@endsection
+
+@section('content')
+    @component('maintenance.menu')@endcomponent
+    <div class="container-fluid" id="container">
+        <div class="card">
+            <div class="card-body mt-2">
+                <div class="row">
+                    <div class="col-5 offset-4">
+                        <div class="row m-0 font-weight-bold">
+                            <label class="offset-1 col-4">省份</label>
+                            <label class="col-4">邮编</label>
+                            <label class="col-3">状态</label>
+                        </div>
+                    </div>
+                </div>
+                <div class="row" v-for="region in parentMapping[0]">
+                    <div class="col-5 offset-4">
+                        <div class="row m-0">
+                            <span class="fa fa-angle-double-right col-1 cursor-pointer" @click="showItem()"></span>
+                            <label class="col-4">@{{ region.name }}</label>
+                            <label class="col-4">@{{ region.code }}</label>
+                            <label class="col-3">
+                                <span class="fa fa-circle" :class="region.deleted_at ? 'text-danger' : 'text-success'"></span>
+                                <span v-if="region.deleted_at">冻结</span><span v-else>正常</span>
+                            </label>
+                        </div>
+                    </div>
+                    <div class="col-5 offset-5 border rounded border-2">
+                        <div class="row" v-for="city in parentMapping[region.id]">
+                            <div class="col-12">
+                                <div class="row m-0">
+                                    <span class="fa fa-angle-double-right col-1 cursor-pointer"></span>
+                                    <label class="col-3">@{{ city.name }}</label>
+                                    <label class="col-4">@{{ city.code }}</label>
+                                    <label class="col-3">
+                                        <span class="fa fa-circle" :class="city.deleted_at ? 'text-danger' : 'text-success'"></span>
+                                        <span v-if="city.deleted_at">冻结</span><span v-else>正常</span>
+                                    </label>
+                                </div>
+                                <div class="row m-0">
+                                    <div class="col-10 offset-2">
+                                        <div class="row" v-for="district in parentMapping[city.id]">
+                                            <span class="fa fa-angle-double-right col-1 cursor-pointer"></span>
+                                            <label class="col-3">@{{ city.name }}</label>
+                                            <label class="col-4">@{{ city.code }}</label>
+                                            <label class="col-3">
+                                                <span class="fa fa-circle" :class="city.deleted_at ? 'text-danger' : 'text-success'"></span>
+                                                <span v-if="city.deleted_at">冻结</span><span v-else>正常</span>
+                                            </label>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+
+@section("lastScript")
+    <script>
+        new Vue({
+            el:"#container",
+            data:{
+                regions:[
+                    @foreach($regions as $region)
+                    {!! $region !!},
+                    @endforeach
+                ],
+                parentMapping:{},
+            },
+            mounted(){
+                let parent = {};
+                this.regions.forEach(region=>{
+                    let p = region.parent_id ? region.parent_id : 0;
+                    if (parent[p])parent[p].push(region);
+                    else parent[p] = [region];
+                });
+                this.parentMapping = parent;
+                console.log(parent);
+            },
+        });
+    </script>
+@stop

+ 45 - 8
resources/views/order/index/_freezeModal.blade.php

@@ -2,6 +2,12 @@
     <div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
         <div class="modal-content">
             <div class="modal-header">
+                <label class="ml-5">
+                    <input class="form-control rounded-pill" @keydown.13="search($event)" placeholder="快捷检索">
+                </label>
+                <div class="scrollbar ml-2 border border-2 rounded pl-2 pr-5" style="overflow-y:auto;max-height:80px;overflow-x:hidden;">
+                    <p class="mb-1 cursor-pointer" v-for="obj in result" v-html="obj.text" @click="selectedSearch(obj)"></p>
+                </div>
                 <button type="button" class="close" data-dismiss="modal">&times;</button>
             </div>
             <div class="modal-body">
@@ -21,7 +27,7 @@
                     <select class="col-5 form-control form-control-sm"
                             :class="errors.province_id ? 'is-invalid' : ''" id="province_id" type="text"
                             v-model="freeze.province_id">
-                        <option v-for="province in data.provinces" :value="province.id">@{{ province.name }}</option>
+                        <option v-for="province in mapping['0']" :value="province.id">@{{ province.name }}</option>
                     </select>
                     <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.province_id">
                         <strong>@{{ errors.province_id[0] }}</strong>
@@ -32,21 +38,52 @@
                     <select class="col-5 form-control form-control-sm"
                             :class="errors.city_id ? 'is-invalid' : ''" id="city_id" type="text"
                             v-model="freeze.city_id">
-                        <option v-for="city in data.cities" :value="city.id" v-if="city.province_id == freeze.province_id">@{{ city.name }}</option>
+                        <option v-for="city in mapping[freeze.province_id]" :value="city.id">@{{ city.name }}</option>
                     </select>
                     <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.city_id">
                         <strong>@{{ errors.city_id[0] }}</strong>
                     </span>
                 </div>
                 <div class="row mt-2">
-                    <label class="col-2 offset-1" for="location_id">区</label>
+                    <label class="col-2 offset-1" for="district_id">区/县</label>
+                    <select class="col-5 form-control form-control-sm"
+                            :class="errors.district_id ? 'is-invalid' : ''" id="district_id" type="text"
+                            v-model="freeze.district_id">
+                        <option v-for="district in mapping[freeze.city_id]" :value="district.id">@{{ district.name }}</option>
+                    </select>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,3)" placeholder="此处输入回车添加新区/县">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.district_id">
+                        <strong>@{{ errors.district_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="town_id">乡/镇</label>
+                    <select class="col-5 form-control form-control-sm"
+                            :class="errors.town_id ? 'is-invalid' : ''" id="town_id" type="text"
+                            v-model="freeze.town_id">
+                        <option v-for="town in mapping[freeze.district_id]" :value="town.id">@{{ town.name }}</option>
+                    </select>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,4)" placeholder="此处输入回车添加新乡/镇">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.town_id">
+                        <strong>@{{ errors.town_id[0] }}</strong>
+                    </span>
+                </div>
+                <div class="row mt-2">
+                    <label class="col-2 offset-1" for="street_id">村/街</label>
                     <select class="col-5 form-control form-control-sm"
-                            :class="errors.location_id ? 'is-invalid' : ''" id="location_id" type="text"
-                            v-model="freeze.location_id">
-                        <option v-for="district in data.districts" :value="district.id" v-if="city.parent_id == freeze.city_id">@{{ district.name }}</option>
+                            :class="errors.street_id ? 'is-invalid' : ''" id="street_id" type="text"
+                            v-model="freeze.street_id">
+                        <option v-for="street in mapping[freeze.town_id]" :value="street.id">@{{ street.name }}</option>
                     </select>
-                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.location_id">
-                        <strong>@{{ errors.location_id[0] }}</strong>
+                    <label class="col-4">
+                        <input class="ml-1 form-control form-control-sm rounded-pill" @keydown.13="addRegion($event,5)" placeholder="此处输入回车添加新村/街">
+                    </label>
+                    <span class="invalid-feedback mt-0 offset-3" role="alert" v-if="errors.street_id">
+                        <strong>@{{ errors.street_id[0] }}</strong>
                     </span>
                 </div>
             </div>

+ 118 - 17
resources/views/order/index/freeze.blade.php

@@ -18,7 +18,9 @@
                         <th>承运商</th>
                         <th>省</th>
                         <th>市</th>
-                        <th>区</th>
+                        <th>区/县</th>
+                        <th>乡/镇</th>
+                        <th>村/街</th>
                         <th></th>
                     </tr>
                     <tr v-for="(freeze,i) in freezes">
@@ -26,7 +28,9 @@
                         <td>@{{ freeze.logistic ? freeze.logistic.name : '' }}</td>
                         <td>@{{ freeze.province ? freeze.province.name : '' }}</td>
                         <td>@{{ freeze.city ? freeze.city.name : '' }}</td>
-                        <td>@{{ freeze.location ? freeze.location.name : '' }}</td>
+                        <td>@{{ freeze.district ? freeze.district.name : '' }}</td>
+                        <td>@{{ freeze.town ? freeze.town.name : '' }}</td>
+                        <td>@{{ freeze.street ? freeze.street.name : '' }}</td>
                         <td>
                             <button class="btn btn-sm btn-outline-danger" @click="deleteFreeze(freeze,i)">删除</button>
                             <button class="btn btn-sm btn-outline-info" @click="openModal(freeze,i)">编辑</button>
@@ -52,6 +56,10 @@
                 data:{},
                 freeze:{},
                 errors : {},
+                mapping:{},
+                mappingPool:{},
+                result : [],
+                stop:false,
             },
             methods:{
                 openModal(model = null,index = null){
@@ -70,22 +78,20 @@
                             this.$set(this.data,'logistics',res);
                         });
                     }
-                    if (!this.data.provinces){
-                        let url = "{{url('maintenance/province/get')}}";
-                        window.tempTip.postBasicRequest(url,{},res=>{
-                            this.$set(this.data,'provinces',res);
-                        });
-                    }
-                    if (!this.data.cities){
-                        let url = "{{url('maintenance/city/get')}}";
-                        window.tempTip.postBasicRequest(url,{},res=>{
-                            this.$set(this.data,'cities',res);
-                        });
-                    }
-                    if (!this.data.districts){
+                    if (!this.data.regions){
                         let url = "{{url('maintenance/region/get')}}";
-                        window.tempTip.postBasicRequest(url,{type:3},res=>{
-                            this.$set(this.data,'districts',res);
+                        window.tempTip.postBasicRequest(url,{},res=>{
+                            this.$set(this.data,'regions',res);
+                            let mapping = {};
+                            let mappingPool = {};
+                            res.forEach((region,i)=>{
+                                if (!region["parent_id"])region["parent_id"] = 0;
+                                if (mapping[region["parent_id"]]) mapping[region["parent_id"]].push(region);
+                                else mapping[region["parent_id"]] = [region];
+                                mappingPool[region.id] = i;
+                            });
+                            this.mapping = mapping;
+                            this.mappingPool = mappingPool;
                         });
                     }
                 },
@@ -116,6 +122,101 @@
                         })
                     });
                 },
+                addRegion(e,type){
+                   let val = e.target.value;
+                   if (!val)return;
+                    window.tempTip.setDuration(3000);
+                    window.tempTip.setIndex(1099);
+                    let prent = "";
+                    let msg = "";
+                    let map = {2:"城市",3:"区/县",4:"乡/镇",5:"村/街"};
+                    switch (type) {
+                        case 3:
+                            prent = this.freeze.city_id;
+                            msg = map[2];
+                            break;
+                        case 4:
+                            prent = this.freeze.district_id;
+                            msg = map[3];
+                            break;
+                        case 5:
+                            prent = this.freeze.town_id;
+                            msg = map[4];
+                            break;
+                    }
+                   if (!prent){
+                       window.tempTip.show("尚未选择所属"+msg);
+                       return;
+                   }
+                   let params = {
+                       parent_id:prent,
+                       name:val,
+                       type:type,
+                   };
+                   window.tempTip.postBasicRequest("{{url('maintenance/region/store')}}",params,res=>{
+                       let arr = [];
+                       if (this.mapping[prent])arr=this.mapping[prent];
+                       arr.push(res);
+                       this.$set(this.mapping,prent,arr);
+                       switch (type) {
+                           case 3:
+                               this.freeze.district_id = res.id;
+                               break;
+                           case 4:
+                               this.freeze.town_id = res.id;
+                               break;
+                           case 5:
+                               this.freeze.street_id = res.id;
+                               break;
+                       }
+                       return "新增"+map[type]+"成功";
+                   })
+                },
+                search(e){
+                    this.stop = false;
+                    this.result = [];
+                    let val = e.target.value;
+                    if (!val)return;
+                    this.data.regions.some(region=>{
+                        if (this.stop)return true;
+                        if (region.name.indexOf(val) !== -1)this.result.push(this._traceParent(region));
+                    });
+                },
+                _traceParent(region){
+                    let text = "<b class='text-warning font-weight-bold'>"+region.name+"</b>";
+                    let sign = false;
+                    let obj = {};
+                    let isGo = true;
+                    while (isGo){
+                        if (sign) text = region.name+"&nbsp;<span class='text-dark'>-></span>&nbsp;"+text;
+                        else sign = true;
+                        switch (region.type) {
+                            case 1:
+                                obj.province_id = region.id;
+                                break;
+                            case 2:
+                                obj.city_id = region.id;
+                                break;
+                            case 3:
+                                obj.district_id = region.id;
+                                break;
+                            case 4:
+                                obj.town_id = region.id;
+                                break;
+                            case 5:
+                                obj.street_id = region.id;
+                                break;
+                        }
+                        if (!region.parent_id)isGo = false;
+                        region = this.data.regions[this.mappingPool[region.parent_id]];
+                    }
+                    obj.text = text;
+                    return obj;
+                },
+                selectedSearch(obj){
+                    this.freeze = obj;
+                    this.stop = true;
+                },
             },
         });
     </script>

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

@@ -102,7 +102,7 @@
                         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);
+                                if (this.models.length>50) this.models = this.models.split(50);
                             }
                             this.errors = res.data.errors;
                             tempTip.cancelWaitingTip();

+ 4 - 4
resources/views/order/issue/index.blade.php

@@ -80,13 +80,13 @@
                 <table class="table table-sm table-striped table-bordered table-hover card-body p-0 m-0" style="background: #fff;@cannot('订单管理-问题件-客户不可见')min-width: 3000px;@else min-width: 1990px; @endcannot">
                     <tr class="tr-yellow align-center">
                         <th class=" font-weight-bolder header-1" ></th>
-                        <th class="td-yellow  font-weight-bolder original-class table-head-warning  header-2">
+                        <th class="td-yellow  font-weight-bolder original-class table-head-warning  header-2 text-center">
                             <span>原始运单</span>
                             <button class="btn btn-sm btn-outline-secondary float-right" v-if="isShowOrderInfo" @click="hideOrderInfo">
                                 隐藏运单列
                             </button>
                         </th>
-                        <th class="font-weight-bolder header-3">
+                        <th class="font-weight-bolder header-3 text-center">
                             <button class="btn btn-sm btn-outline-secondary float-left" v-if="isShowRejectedBill" @click="hideRejectedBill">
                                 隐藏退单列
                             </button>
@@ -862,10 +862,9 @@
                     },
                     {name: 'logistic_number_return', type: 'input', tip: '退回单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '退回单号'},
                     {name: 'send_client_code', type: 'input', tip: '二次订单号:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '二次订单号'},
-                    {name: ['shop_name','shop_name_limit_time'], type: 'input_select', tip: ['处理结果:前或后加 百分号为单个模糊搜索,默认添加后%,否则为多条件精确搜索','查询范围越短,搜索速度越快'], placeholder: ['店铺',''],
+                    {name: ['shop_name','shop_name_limit_time'], type: 'input_select', tip: ['商铺:前或后加 百分号为单个模糊搜索,默认添加后%,否则为多条件精确搜索','查询范围越短,搜索速度越快'], placeholder: ['店铺',''],
                         data:log_content_range,
                         rules:[{son:{shop_name_limit_time:{default:'15',required_without_all_if:['created_at_start','created_at_end']}}}]},
-                    {name: 'finance_confirm', type: 'select', tip: '财务却认', placeholder: '财务却认是/否', data:[{name: '是',value:'是'},{name: '否',value:'否'}]},
                 ], [
                     {name: 'created_at_end', type: 'dateTime', tip: '登记结束日期'},
                     {name: 'consignee_name', type: 'input', tip: '收货人名称:前或后加百分号为单个模糊搜索,否则为多条件精确搜索', placeholder: '收货人名称'},
@@ -890,6 +889,7 @@
                     // {date_relevance:{date:['orderdate_start','orderdate_end'],relevance:'addtime',killing:'date',default:[31,92,183,366]}}]},
                     {name: 'custom_code', type: 'input', tip: '自定义订单号:自定义订单号', placeholder: '自定义订单号'},
                     {name: 'is_handle', type: 'checkbox', tip: '是否已处理', data: [{name: 'ture', value: '已解决'}]},
+                    {name: 'finance_confirm', type: 'select', tip: '财务确认', placeholder: '财务确认是/否', data:[{name: '是',value:'是'},{name: '否',value:'否'}]},
                 ],[
                     {name: 'settlement_at_start', type: 'dateTime', tip: '完结起始日期'},
                     {name: 'settlement_at_end', type: 'dateTime', tip: '完结结束日期' },

+ 3 - 2
resources/views/package/menu.blade.php

@@ -6,9 +6,10 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('package/weigh/index')}}" :class="{active:isActive('weigh',2)}">称重管理</a>
                 </li>@endcan
-                @can('称重管理-查询')
+                {{--TODO 权限修改--}}
+            @can('称重管理-快递')
                 <li class="nav-item">
-                    <a class="nav-link" href="{{url('package/logistic?default_date=ture&logistic_id=&owner_id=')}}" :class="{active:isActive('logistic',2)}">快递</a>
+                    <a class="nav-link" href="{{url('package/logistic')}}" :class="{active:isActive('logistic',2)}">快递</a>
                 </li>@endcan
             @can('称重管理-查看异常')
             <li class="nav-item">

+ 2 - 0
resources/views/personnel/menu.blade.php

@@ -10,9 +10,11 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{{url('personnel/checking-in/createReplenishClock')}}" :class="{active:isActive('checking-in',2)}">打卡相关</a>
                 </li> @endcan
+{{--            @can('人事管理-相关设置')--}}
             <li class="nav-item">
                 <a class="nav-link text-dark" href="{{url('personnel/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
             </li>
+{{--                @endcan--}}
         </ul>
     </div>
 </div>

+ 2 - 1
resources/views/process/menu.blade.php

@@ -19,9 +19,10 @@
             <li class="nav-item">
                 <a class="nav-link" href="{{url('process/recycle')}}" :class="{active:isActive('recycle',2)}">回收站</a>
             </li>@endcan
+            @can('二次加工管理-相关设置')
             <li class="nav-item">
                 <a class="nav-link text-dark" href="{{url('process/relating')}}" :class="{active:isActive('relating',2)}">相关设置</a>
-            </li>
+            </li>@endcan
         </ul>
     </div>
 </div>

+ 4 - 2
resources/views/store/blindReceive/menu.blade.php

@@ -3,12 +3,14 @@
     <div class="container-fluid nav3">
         <div class="card menu-third" >
             <ul class="nav nav-pills">
+                @can('入库管理-Excel下载')
                     <li class="nav-item">
                         <a class="nav-link" href="{{url('store/blindReceive/excels')}}" :class="{active:isActive('excels',3)}">Excel下载</a>
-                    </li>
+                    </li>@endcan
+                @can('入库管理-手持入口')
                     <li class="nav-item">
                         <a class="nav-link" href="{{url('store/blindReceive')}}" :class="{active:isActive('',3)}">手持入口</a>
-                    </li>
+                    </li>@endcan
             </ul>
         </div>
     </div>

+ 64 - 4
resources/views/test.blade.php

@@ -10,8 +10,8 @@
         </div>
         <div class="row mt-2">
             <div class="col-10">
-                <div class="row m-0" id="row" onclick="  (this)">
-                    <div class="col-6" id="vi1">
+                <div class="row m-0" id="row" >
+                    <div class="col-6" id="vi1" onclick="selected(this)">
                         <div id="asd">
                             <video src="#"></video>
                         </div>
@@ -22,10 +22,56 @@
             <div class="col-2 border-left border-3 border-primary text-center">
                 <button class="btn btn-danger" type="button" id="imgPool">离 开 云 诊 室</button>
             </div>
+            <img style="width: 50px;height: 100px" src="{{asset('images/demoBin.png')}}" class="image" onclick="imgShow(this)">
+            <div id="outer" style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;">
+            <div id="inner" style="position:absolute;">
+                <img alt="" id="bm" style="border:5px solid #fff;" src="" />
+            </div>
         </div>
     </div>
 
-    <script>
+    <script type="text/javascript">
+        /*$(function(){
+            $(".image").click(function(){
+                var _this = $(this);//将当前的pimg元素作为_this传入函数
+                imgShow("#outer", "#inner", "#bm", _this);
+            });
+        });*/
+        function imgShow(e,outer="#outer", inner="#inner", bm="#bm"){
+            let src = e.src;
+            $(bm).attr("src", src);
+            let img = $("<img alt='' src='"+src+"'/>");
+            img.on('load',function(){
+                let windowW = $(window).width();
+                let windowH = $(window).height();
+                let realWidth = this.width;
+                let realHeight = this.height;
+                let imgWidth, imgHeight;
+                let scale = 0.8;
+                if(realHeight>windowH*scale) {
+                    imgHeight = windowH*scale;
+                    imgWidth = imgHeight/realHeight*realWidth;
+                    if(imgWidth>windowW*scale) {
+                        imgWidth = windowW*scale;
+                    }
+                } else if(realWidth>windowW*scale) {
+                    imgWidth = windowW*scale;
+                    imgHeight = imgWidth/realWidth*realHeight;
+                } else {
+                    imgWidth = realWidth;
+                    imgHeight = realHeight;
+                }
+                $(bm).css("width",imgWidth);
+                let w = (windowW-imgWidth)/2;
+                let h = (windowH-imgHeight)/2;
+                $(inner).css({"top":h, "left":w});
+                $(outer).fadeIn("fast");
+            });
+            $(outer).click(function(){
+                $(this).fadeOut("fast");
+            });
+        }
+
 
         let currentDom = "";
         let hidden = false;
@@ -39,7 +85,7 @@
             if(ev.keyCode === 32 && currentDom) {
                 ev.preventDefault();
                 $("#row").append('<canvas class="col-6" id="video2" onclick="selected(this)"></canvas>');
-                let base64 = $("#"+currentDom)[0].toDataURL('images/png');
+                let base64 = getBase64Img();
                 let imgPool = $("#imgPool");
                 if (!hidden){
                     imgPool.after("<button class='btn btn-success mt-2 mb-0' type='button' onclick='uploadImg()'>上 传 截 图</button>");
@@ -48,6 +94,20 @@
                 imgPool.after("<div class='w-100 mt-2 h-auto' ondblclick='removeImg(this)'><img class='img-fluid images' alt='截图' src='"+base64+"'></div>");
             }
         };
+        //获取base64截图
+        function getBase64Img(){
+            let canvas = $('<canvas></canvas>');
+            let video = $("#"+currentDom).children().children()[0];
+            let ctx = canvas[0].getContext('2d');
+            let w = video.videoWidth;
+            let h = video.videoHeight;
+            canvas.attr({
+                width: w,
+                height: h,
+            });
+            ctx.drawImage(video, 0, 0, w, h);
+            return canvas[0].toDataURL('images/png');
+        }
         function removeImg(e) {
             e.remove();
         }

+ 36 - 24
resources/views/waybill/index.blade.php

@@ -290,17 +290,20 @@
                         source_bill:'{{$waybill->source_bill}}',
                         wms_bill_number:'{{$waybill->wms_bill_number}}',
                         origination:'{{$waybill->origination}}',
-                        destination:'{{$waybill->destination}}',
+                        destination:'{{$waybill->destination_city_id}}'?
+                            (('{{$waybill->destination}}'.indexOf('{{$waybill->destinationCity ? $waybill->destinationCity->name : ''}}')===-1 &&
+                                '{{$waybill->destination}}'.indexOf('{{$waybill->destinationCity ? ($waybill->destinationCity->province ? $waybill->destinationCity->province->name : '') : ''}}')===-1)?
+                                '{{($waybill->destinationCity ? ($waybill->destinationCity->province ? $waybill->destinationCity->province->name : '') : '').($waybill->destinationCity ? $waybill->destinationCity->name : '').($waybill->destination)}}'
+                                :'{{$waybill->destination}}')
+                            :'{{$waybill->destination}}',
                         recipient:'{{$waybill->recipient}}',
                         recipient_mobile:'{{$waybill->recipient_mobile}}',
                         charge:'{{$waybill->charge}}',
                         ordering_remark:'{{preg_replace("/[\n\s]/",' ',($waybill->ordering_remark??""))}}',
                         carrier:'{{$waybill->logistic ? $waybill->logistic->name : ''}}',
                         carrier_bill:'{{$waybill->carrier_bill}}',
-                        origination_city:'{{$waybill->origination_city ? $waybill->origination_city->name : ''}}',
-                        destination_city:'{{$waybill->destination_city ? $waybill->destination_city->name : ''}}',
+                        destination_city:'{{$waybill->destinationCity ? $waybill->destinationCity->name : ''}}',
                         warehouse_weight:'{{$waybill->warehouse_weight}}',
-                        destination_province_name:'{{$waybill->destination_city ? ($waybill->destination_city->province ? $waybill->destination_city->province->name : '') : ''}}',
                         warehouse_weight_unit:'{{$waybill->warehouse_weight_unit ? $waybill->warehouse_weight_unit->name : ''}}',
                         carrier_weight:'{{$waybill->carrier_weight}}',
                         carrier_weight_unit:'{{$waybill->carrier_weight_unit ? $waybill->carrier_weight_unit->name : ''}}',
@@ -473,22 +476,31 @@
                     waybill.btn_refresh_weight='zoomOut'
                 },
                 lazy(){
-                    //可视区域高度
-                    let height=window.innerHeight;
-                    //滚动区域高度
-                    let scrollHeight = document.documentElement.scrollTop || document.body.scrollTop;
-                    let _this=this;
-                    this.imgs.forEach(function (img,i) {
-                        if ((height+scrollHeight)>$('#'+img.getAttribute('id')).offset().top && img.getAttribute('data-src')){
-                            let temp=new Image();
-                            temp.src=img.getAttribute('data-src');
-                            temp.onload=function () {
-                                img.src=img.getAttribute('data-src');
-                                _this.$delete(_this.imgs,i);
+                    //高度
+                    let h=(window.innerWidth)+(document.documentElement.scrollTop || document.body.scrollTop);
+                    this.imgs.forEach((img,i)=>{
+                        let src = img.getAttribute('data-src');
+                        if ((h>this.getElementToPageTop(img)) && src){
+                            let t = new Image();
+                            t.src = src;
+                            if (t.complete) {
+                                img.src = src;
+                                this.$delete(this.imgs,i);
+                                return;
                             }
+                            t.onload = ()=>{
+                                img.src = src;
+                                this.$delete(this.imgs,i);
+                            };
                         }
                     });
                 },
+                getElementToPageTop(el) {
+                    if(el.parentElement) {
+                        return this.getElementToPageTop(el.parentElement) + el.offsetTop
+                    }
+                    return el.offsetTop
+                },
                 waybillAudit(id,waybill_number){
                     if(!confirm('确定要通过“'+waybill_number+'”的审核吗?')){return};
                     let _this=this;
@@ -953,7 +965,7 @@
                 refreshWaveHouseWeight(wms_bill_number) {
                     let _this=this;
                     let url='{{url('waybill/refreshWaveHouseWeight')}}';
-                    axios.post(url,{'wms_bill_number':wms_bill_number}).then(function (response) {
+                    window.axios.post(url,{'wms_bill_number':wms_bill_number}).then(function (response) {
                         if(response.data.success){
                             _this.waybills.every(function (waybill) {
                                 if (waybill.wms_bill_number==wms_bill_number){
@@ -962,15 +974,15 @@
                                 }
                                 return true;
                             });
-                            tempTip.setDuration(3000);
-                            tempTip.showSuccess('刷新计重成功');
+                            window.tempTip.setDuration(3000);
+                            window.tempTip.showSuccess('刷新计重成功');
                         }else{
-                            tempTip.setDuration(3000);
-                            tempTip.show('刷新计重失败!'+response.data.fail_info);
+                            window.tempTip.setDuration(3000);
+                            window.tempTip.show('刷新计重失败!'+response.data.fail_info);
                         }
                     }).catch(function (err) {
-                        tempTip.setDuration(3000);
-                        tempTip.show('刷新计重失败,网络连接错误!'+err);
+                        window.tempTip.setDuration(3000);
+                        window.tempTip.show('刷新计重失败,网络连接错误!'+err);
                     });
                 },
                 //选择文件
@@ -1062,7 +1074,7 @@
                         return  parseInt(val/1024)+"MB";
                     }
                     return val+"KB";
-                }
+                },
             }
         });
         // modal 隐藏时修改 input 为空

+ 2 - 0
routes/web.php

@@ -195,9 +195,11 @@ Route::group(['prefix'=>'maintenance'],function(){
     });
     Route::group(['prefix'=>"region"],function (){
         Route::post("get",'RegionController@get');
+        Route::post("store",'RegionController@store');
     });
 
     Route::get('syncRedisLogs','LogController@syncRedisLogs');
+    Route::get('region', 'RegionController@index');
     Route::resource('log', 'LogController');
     Route::resource('user', 'UserController');
     Route::resource('role', 'RoleController');

+ 25 - 0
syncProject.sh

@@ -0,0 +1,25 @@
+#!/bin/bash
+
+cd $src
+Ip="was.baoshi56.com"
+username="haozi"
+password="haozi"
+files=("app" "config" "database" "public" "resources" "routes" "webpack.mix.js" "composer.json" "tests")
+src=/var/www/bswas_test
+dsc=/var/www/was
+
+for i in ${files[*]}
+do
+expect -c "
+spawn scp -P 10022 -r $username@$Ip:$dsc/$i $src/$i
+expect {
+\"*assword\" {set timeout 120; send \"$password\r\";}
+\"yes/no\" {send \"yes\r\"; exp_continue;}
+}
+expect eof"
+done
+
+sudo php artisan migrate
+sudo composer update
+sudo npm run dev
+

+ 1 - 1
tests/Services/OwnerPriceOperationService/OwnerPriceOperationServiceTest.php

@@ -167,7 +167,7 @@ class OwnerPriceOperationServiceTest extends  TestCase
         $result = $this->service->matching(["packages"=>[["commodity"=>"测试","amount"=>55,"sku"=>$this->data["commodities"][0]["sku"]]]],[],$this->data["owners"][0]["id"],"入库");
         $this->assertEquals(96.9,$result);
         $result = $this->service->matching(["packages"=>[["commodity"=>"测试","amount"=>57,"sku"=>$this->data["commodities"][0]["sku"]]]],[],$this->data["owners"][0]["id"],"出库");
-        $this->assertEquals(107.1,$result);
+        $this->assertEquals(79.60000000000001,$result);
     }
 
     public function tearDown(): void

+ 3 - 1
tests/webApi/thirdPart/haochuang/process.http

@@ -1,4 +1,6 @@
 POST http://bswas/api/thirdPart/haochuang/sorting/process
 Content-Type: application/json
 
-{"batch_id":"W201023000096k","station_id":"ffffffff-c7f2-adf0-c7f2-adf000000000","token":"bf803b6eeffcfc61396f1accb8487e27"}
+{"batch_id":"W210120000183","station_id":"ffffffff-c7f2-adf0-c7f2-adf000000000","token":"bf803b6eeffcfc61396f1accb8487e27"}
+
+###