Преглед изворни кода

Merge branch 'zengjun'

# Conflicts:
#	database/migrations/2020_10_19_113042_create_logistic_timings_table.php
LD пре 5 година
родитељ
комит
8b56e1c736

+ 94 - 12
app/Http/Controllers/OrderIssueController.php

@@ -9,6 +9,7 @@ use App\Order;
 use App\OrderIssue;
 use App\OrderIssueProcessLog;
 use App\OrderIssueType;
+use App\OrderPackage;
 use App\Owner;
 use App\QualityLabel;
 use App\RejectedBill;
@@ -163,7 +164,11 @@ class OrderIssueController extends Controller
             return ['success' => false, 'fail_info' => '没有传入的订单编号'];
         }
         /** @var OrderIssueService $orderIssueService */
-        $orderIssueService = app('orderIssueService');
+        $orderIssueService = app(OrderIssueService::class);
+        $exits_orderNos = $orderIssueService->校验问题件是否存在_WMS订单号_返回存在的订单号($request->input('orderNos'));
+        if(count($exits_orderNos)>0){
+            return ['success'=>false,'fail_info'=>'标记问题件存在已有订单号','exitsOrderNos' =>$exits_orderNos];
+        }
         return $orderIssueService->orderIssueTag($request->all());
     }
 
@@ -314,8 +319,7 @@ class OrderIssueController extends Controller
             return ['success'=>false,'fail_info' => '没有对应权限'];
         }
         $orderNos = $request->input('orderNos');
-        $orderIssues =OrderIssue::query()
-            ->with('order')
+        $orderIssues =OrderIssue::query()->with('order')
             ->whereHas('order',function($query) use ($orderNos){
                 $query->whereIn('code',$orderNos);
             })->get();
@@ -462,20 +466,98 @@ class OrderIssueController extends Controller
         }
     }
 
-    public function secondOrderAddOrderPackageApi(Request $request)
+    public function editSecondLogisticNumberApi(Request $request)
     {
-        if(!Gate::allows('订单管理-问题件-编辑')){
+        if(!Gate::allows('订单管理-问题件-编辑'))
+            return ['success'=>false,'fail_info'=>'没有对应权限'];
+        /** @var OrderIssueService $service */
+        $service = app(OrderIssueService::class);
+        try {
+            $message = $service->updateSecondLogisticNumber($request->input('id'), $request->logistic_number);
+            LogService::log(__METHOD__,__FUNCTION__,json_encode($request->getContent()));
+            return $message;
+        } catch (Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,json_encode($request->getContent()).$e->getMessage().$e->getTraceAsString());
+            return ['success'=>false,$e->getMessage()];
+        }
+    }
+    public function importPasteDataApi(Request $request)
+    {
+        if (!Gate::allows('订单管理-订单问题件生成'))
             return ['success'=>false,'fail_info'=>'没有对应权限'];
+        $rows = $request->input('rows');
+        $logistic_numbers = [];
+        $types = [];
+        $maps = [];
+        $errors = [];
+        $orderIssueTypes = OrderIssueType::all();
+        $orderIssueType_map = [];
+        foreach ($orderIssueTypes as $orderIssueType) {
+            $orderIssueType_map[$orderIssueType->name] = $orderIssueType;
+        }
+        $array = explode("\n",$request->input('pasteDataText')); //拆分行
+        /** @var OrderIssueService $service */
+        $service =  app(OrderIssueService::class);
+        foreach ($array as $i => $str) {
+            $items = explode("\t",$str);
+             $head = '第'.($i+1).'行';
+            if(count($items)<count($rows)){
+                $errors[$head] = ['数据不完整'];
+                unset($items);
+                continue;
+            }
+            $map = [];
+
+            foreach ($rows as $index=>$row) {
+                if($row === '原始运单号'){
+                    if(!$items[$index]){
+                        $errors[$head][]='快递单号为空';
+                        $map =[];
+                    }
+                    $exist_logistic =  $service->校验问题件是否存在_快递单号_返回存在的快递单号([$items[$index]]);
+                    if(count($exist_logistic) > 0){
+                        $errors[$head][]='快递单号存在对应的问题件';
+                        $map =[];
+                    }
+                    $logistic_numbers[] = $items[$index];
+                    $map['logistic_number'] = $items[$index];
+                }
+                if($row==='情况说明'){
+                    if(!$items[$index]){
+                        $errors[$head][]='情况说明为空';
+                        $map =[];
+                    }
+                    $map['result_explain'] = $items[$index];
+                }
+                if($row==='问题类别'){
+                    if(!$items[$index]){
+                        $errors[$head][]='问题类别为空';
+                        $map = [];
+                    }else{
+                        $type =  $orderIssueType_map[$items[$index]] ?? null;
+                        if(!$type){
+                            $errors[$head][]='问题类型不存在';
+                            $map = [];
+                        }
+                    }
+                    $types[] =$items[$index];
+                    $map['type'] = $items[$index];
+                }
+            }
+            if(count($map)!==0)$maps[] = $map;
         }
+        if(count($errors)>0) return ['success'=>false,'fail_info'=>$errors];
         try {
-            $array = app(OrderPackageService::class)->createByLogisticNumberAndOrderClientNo( $request->input('client_code'),$request->input('logistic_number'));
-            if(!isset($array['orderPackage']))return ['success'=>false,'fail_info'=>'创建失败'];
-            return ['success'=>true,'orderPackage'=>$array['orderPackage'],'order'=>$array['order']];
+            foreach ($maps as $map) {
+                $logistic_number = $map['logistic_number'];
+                $result_explain = $map['result_explain'];
+                $type = $map['type'];
+                $service->createOrderIssue($logistic_number, $type, $result_explain);
+            }
+            return ['success'=>true];
         } catch (Exception $e) {
-            LogService::log(__METHOD__,__FUNCTION__.'ERROR','问题件 根据二次客户单号和快递单创建OrderPakcage'.json_encode($request->getContent()).$e->getMessage());
-            return ['success'=>false, 'fail_info' => $e->getMessage()];
+            LogService::log(__METHOD__,__FUNCTION__,'文本导入问题件失败'.json_encode($request->getContent().$e->getMessage().$e->getTraceAsString()));
+            return ['success'=>false,'fail_info'=>$e->getMessage()];
         }
-
     }
-
 }

+ 5 - 2
app/Http/Controllers/RejectedBillController.php

@@ -12,6 +12,7 @@ use App\Rejected;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\Services\OrderPackageCommoditiesService;
+use App\Services\RejectedBillService;
 use Illuminate\Contracts\View\Factory;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
@@ -90,7 +91,8 @@ class RejectedBillController extends Controller
         $rejectedBill=new RejectedBill($request->all());
         $rejectedBill['id_operator'] = Auth::user()['id'];
         $rejectedBill->save();
-        $rejectedBill->同步问题件退件状态();
+        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+//        $rejectedBill->同步问题件退件状态();
 
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBill['id']];
@@ -109,7 +111,8 @@ class RejectedBillController extends Controller
         $rejectedBill=RejectedBill::find($request->input('id'));
         $rejectedBill->fill($request->all());
         $rejectedBill->save();
-        $rejectedBill->同步问题件退件状态();
+        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+//        $rejectedBill->同步问题件退件状态();
 
         $this->log(__METHOD__,__FUNCTION__.'_'.$rejectedBill['id'],json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true'];

+ 10 - 6
app/Http/Controllers/RejectedBillItemController.php

@@ -8,6 +8,7 @@ use App\Owner;
 use App\RejectedBill;
 use App\RejectedBillItem;
 use App\Services\CommodityService;
+use App\Services\RejectedBillService;
 use App\WMSReflectReceive;
 use App\WMSReflectReceiveSku;
 use Illuminate\Http\Request;
@@ -93,9 +94,10 @@ class RejectedBillItemController extends Controller
         }
 
 
-        $rejectedBIll = RejectedBill::where('id',$request->input('id_rejected_bill'))->first();
-        $rejectedBIll->同步问题件();
-        $rejectedBIll->同步问题件退件状态();
+        $rejectedBill = RejectedBill::query()->where('id',$request->input('id_rejected_bill'))->first();
+        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+//        $rejectedBIll->同步问题件();
+//        $rejectedBIll->同步问题件退件状态();
         $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
         return ['success'=>'true','id'=>$rejectedBillItem['id']];
     }
@@ -116,8 +118,9 @@ class RejectedBillItemController extends Controller
             $rejectedBillItem->fill($request->all());
             $rejectedBillItem->update();
             $rejectedBillItem->injectCommodityName();
-            $rejectedBIll = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
-            $rejectedBIll->同步问题件退件状态();
+            $rejectedBill = RejectedBill::query()->where('id',$rejectedBillItem->id_rejected_bill)->with('orderIssue')->first();
+//            $rejectedBill->同步问题件退件状态();
+            app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
             $this->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
             return ['success'=>'true','id'=>$rejectedBillItem['id']];
         }
@@ -176,7 +179,8 @@ class RejectedBillItemController extends Controller
         }
         $item=$rejectedBillItems->first();
         $rejectedBill = RejectedBill::query()->find($item['id_rejected_bill']);
-        $rejectedBill->同步问题件();
+        app(RejectedBillService::class)->syncOrderIssue($rejectedBill);
+//        $rejectedBill->同步问题件();
         if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,'请求处理退单:'.$rejectedBill['logistic_number_return'],Auth::user()['id']);
         $downloadedSkus = WMSReflectReceive::downloadedSkus($rejectedBill['logistic_number_return'],true);
         $isGotMoreThenDownloaded=WMSReflectReceiveSku::isItemsOverDownloadedSkus($rejectedBillItems,$downloadedSkus);

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

@@ -650,16 +650,6 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         Commodity::destroy($deleteCommodities);
     }
 
-//    public function test2()
-//    {
-//        $owner = Owner::where('name', 'B站')->first();
-//        $commodities = Commodity::query()->where('owner_id', $owner->id)->get();
-//        $comID = array_column($commodities->toArray(), 'id');
-//        CommodityBarcode::query()->whereIn('commodity_id', $comID)->delete();
-//        Commodity::destroy($comID);
-//        return $comID;
-//    }
-
     /*1*/
     function socket(Request $request)
     {/**/
@@ -732,6 +722,10 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $orderService->updateByWmsOrders($orderHeaders);
         $orderTrackingService->updateByWmsOrderHeaders($orderHeaders);
     }
+    public function test11(){
+        $orderHeader = OracleDOCOrderHeader::query()->with('actAllocationDetails')->where('orderNo','SO201024001172')->get();
+        dd(app(OrderService::class)->createByWmsOrder($orderHeader));
+    }
 
     public function usage()
     {

+ 17 - 8
app/OrderIssue.php

@@ -12,11 +12,20 @@ class OrderIssue extends Model
 
     protected $fillable = [
         'order_id', 'created_at', 'rejected_bill_id', 'rejecting_status', 'result_explain','logistic_number_return',
-        'situation_explain', 'order_issue_type_id', 'second_order_id', 'is_new_rejecting','second_client_no',
-        'final_status', 'logistic_indemnity_money', 'logistic_express_remission', 'baoshi_indemnity_money', 'baoshi_express_remission', 'user_workgroup_id'];
-
+        'situation_explain', 'order_issue_type_id', 'second_order_id', 'is_new_rejecting','second_client_no','second_logistic_number',
+        'final_status', 'logistic_indemnity_money', 'logistic_express_remission', 'baoshi_indemnity_money', 'baoshi_express_remission', 'user_workgroup_id',
+        'custom_code'];
+    /*
+     * second_client_no 二次客户订单号
+     * second_logistic_number 二次运单号 【二次运单号可以单独存在,当二次客户订单号有对应的订单信息时,显示的是二次客户订单号对应的运单号,没有的话显示二次原单号】
+     * rejecting_status
+     * result_explain 情况说明
+     * final_status
+     * situation_explain
+     * custom_code  自定义订单号 客户客服自定义
+     */
     protected $appends = [
-        'secondLogisticNumber',
+//        'secondLogisticNumber',
         'createLog',
         'endLog',
         'processingTime',
@@ -59,10 +68,10 @@ class OrderIssue extends Model
         return $this->hasOne('App\Order', 'client_code', 'second_client_no');
     }
 
-    public function getSecondLogisticNumberAttribute()
-    {
-        return $this['secondOrder']['code'] ?? '';
-    }
+//    public function getSecondLogisticNumberAttribute()
+//    {
+//        return $this['secondOrder']['code'] ?? '';
+//    }
 
     public function getCreateLogAttribute()
     {

+ 23 - 13
app/RejectedBill.php

@@ -142,26 +142,36 @@ class RejectedBill extends Model
     {
         $orderIssue = $this->orderIssue()->first();
         if ($orderIssue ?? false) {
-            $this->同步退单状态();
+//            $this->同步退单状态();
             $orderIssue->update(['is_new_rejecting' => '有']);
         } else {
             OrderIssue::query()->where('logistic_number_return', $this->logistic_number_return)->update(['is_new_rejecting' => '有']);
         }
     }
 
-    public function 同步问题件(){
-        $order = null;
-        if($this->order_number ?? false){
-            $order = Order::query()->with('issue')->where('client_code',$this->order_number)->first();
-        }else if($this->logistic_number_return ?? false){
-            $asn_header = OracleDOCASNHeader::query()->where('asnreference3',$this->logistic_number_return)->first();
-            if(!$asn_header)return;
-            $order_header = OracleDOCOrderHeader::query()->where('soreference1',$asn_header['asnreference1'])->first();
-            $order = Order::query()->with('issue')->where('code',$order_header['orderno'])->first();
+    public function 同步问题件()
+    {
+        $orderIssue = $this->orderIssue()->first();
+        if(!isset($orderIssue)){
+            if(isset($this->order_number)){
+                $orderNumber = $this->order_number;
+                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderNumber){
+                    $query->where('client_code',$orderNumber);
+                })->first();
+            }
+            if(isset($this->logistic_number_return) && !isset($orderIssue)){
+                $logistic_number_return = $this->logistic_number_return;
+                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($logistic_number_return){
+                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$logistic_number_return)->first();
+                })->first();
+                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
+                    $query->where('code',$orderHeader->orderno);
+                })->first();
+            }
         }
-        if($order['issue'] ?? false){
-            $order_issue =  $order->issue;
-            $order_issue->update(['logistic_number_return'=>$this->logistic_number_return]);
+        if(isset($orderIssue)){
+//            $orderIssue->同步退单状态();
+            $orderIssue->update(['is_new_rejecting' => '有']);
         }
     }
 

+ 108 - 93
app/Services/OrderIssueService.php

@@ -6,6 +6,7 @@ use App\OracleDOCASNHeader;
 use App\OracleDOCOrderHeader;
 use App\OrderIssue;
 use App\OrderIssueProcessLog;
+use App\OrderIssueType;
 use App\OrderPackage;
 use App\Order;
 use App\RejectedBill;
@@ -24,6 +25,11 @@ class OrderIssueService
         app()->bind("orderPackageCommoditiesService", OrderPackageCommoditiesService::class);
     }
 
+    public function insert($params)
+    {
+        OrderIssue::query()->insert($params);
+    }
+
     public function getQuery(array $arr, array $condition = null)
     {
         if (!isset($condition)) {
@@ -254,32 +260,52 @@ class OrderIssueService
         return compact('orderPackageSql','secondOrderPackageSql','orderIssueSql','rejectedBillItemSql','logSql');
     }
 
-    public function paginate(array $arr)
+    public function paginate(array $params)
     {
-        return $query = $this->getConditionQuery($arr)->paginate($arr['paginate'] ?? 50);
-
+        return $query = $this->getConditionQuery($params)->paginate($params['paginate'] ?? 50);
     }
 
     public function orderIssueTag(array $params)
     {
         $orderNos = $params['orderNos'];
-        $meg = ['success' => true];
-        foreach ($orderNos as $orderNo) {
-            try {
-                $orderIssue = $this->createOrFindByOrderNo($orderNo);
-                if($orderIssue != null){
-                    OrderIssue::query()->where('id', $orderIssue['id'])->update(['order_issue_type_id' => $params['typeId'], 'result_explain' => $params['result_explain']]);
-                    OrderIssueProcessLog::query()->create(['order_issue_id' => $orderIssue['id'], 'user_id' => Auth::user()['id'], 'content' => '', 'type' => '创建']);
-                    LogService::log(__METHOD__, __FUNCTION__, '标记订单问题件' . json_encode($orderNo).json_encode($orderIssue));
-                }
-            } catch (\Exception $e) {
-                LogService::log(__METHOD__, __FUNCTION__, '标记订单问题件error' . json_encode($orderNo).$e->getMessage(),$e->getTraceAsString());
-                $meg['success'] = false;
-                $meg['fail_info'][]=  $orderNo.$e->getMessage();
-            }
+        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])->whereIn('orderNo',$orderNos)->get();
+        $bool = $this->createOrderIssueByWmsOrder($orderHeaders,$params['typeId'],$params['result_explain']);
+        if($bool){
+            return ['success'=>$bool];
+        }else{
+            return ['success'=>$bool,'fail_info'=>'问题件创建失败'];
+        }
+    }
+
+    public function createOrderIssueByWmsOrder($orderHeaders,$order_issue_type_id,$result_explain)
+    {
+        /** @var OrderService $orderService */
+        $orderService = app(OrderService::class);
+        $orders = $orderService->createByWmsOrder($orderHeaders);
+        $innerParams = [];
+        foreach ($orders as $order) {
+            $innerParams[] = [
+                'order_id'=>$order->id,
+                'order_issue_type_id' => $order_issue_type_id,
+                'result_explain'=>$result_explain
+            ];
+        }
+        try {
+            $this->insert($innerParams);
+            $ordersIssues = OrderIssue::query()->whereIn('order_id',data_get($innerParams,'*.order_id'))->get();
+            $param = [
+                'ids' => data_get($ordersIssues,'*.id'),
+                'content' =>'',
+                'user_id' => Auth::user()['id'],
+                'type' => '创建'
+            ];
+            app(OrderIssueProcessLogService::class)->create($param);
+            LogService::log(__METHOD__,__FUNCTION__,'创建问题件'.count($innerParams).json_encode($innerParams));
+            return true;
+        } catch (\Exception $e) {
+            LogService::log(__METHOD__,__FUNCTION__,'创建问题件 error'.count($innerParams).json_encode($innerParams).$e->getMessage().$e->getTraceAsString());
+            return false;
         }
-        unset($params,$orderIssues,$orderNos);
-        return $meg;
     }
 
     public function createOrFindByOrderNo($orderNo)
@@ -379,85 +405,14 @@ class OrderIssueService
         return $orderIssue;
     }
 
-    public function verifyOrderIssue(array $arr)
-    {
-        $orders = Order::query()->whereIn('code', $arr)->get();
-        if (count($orders) == 0) {
-            return [];
-        }
-        $order_ids = [];
-        foreach ($orders as $order){
-            $order_ids[] = $order['id'];
-        }
-        unset($orders,$arr);
-        return OrderIssue::query()->with('order')->whereIn('order_id', $order_ids)->get();
-    }
-
-    public function exportExcel(Request $request)
-    {
-        $result = null;
-        if ($request->getMethod() == 'GET') {
-            if ($request->has('checkAllSign')) {
-                $result = $this->getConditionQuery($request->all(), null)->get();
-            }
-        } else if ($request->getMethod() == 'POST') {
-            $request['order_issue_ids'] = $request->input('data');
-            $result = $this->getConditionQuery($request->all(), null)->get();
-        }
-        return $result;
-    }
-
-    public function updateOrderIssue(OrderIssue $orderIssue, array $arr)
-    {
-        if ($arr['rejectedBill'] ?? false) {
-            if ($arr['rejectedBill']['id'] ?? false) {
-                $rejectedBill = RejectedBill::query()->where('id', $arr['rejectedBill']['id'])->first();
-                $arr['orderIssues']['rejected_bill_id'] = $rejectedBill['id'];
-                $arr['orderIssues']['is_new_rejecting'] = '有';
-                $rejectedBill->fill($arr['rejectedBill']);
-                $rejectedBill->update();
-                $rejectedBill->同步问题件();
-                $rejectedBill->同步问题件退件状态();
-
-            } else if ($arr['rejectedBill']['id_logistic_return'] ?? false && $arr['rejectedBill']['logistic_number_return'] ?? false) {
-
-                $owner_id = $orderIssue['order']['owner_id'];
-                $rejectedBill = RejectedBill::query()->firstOrCreate([
-                    'id_logistic_return' => $arr['rejectedBill']['id_logistic_return'] ?? '',
-                    'id_owner' => $owner_id ?? '',
-                    'logistic_number_return' => $arr['rejectedBill']['logistic_number_return'],]
-                );
-                $rejectedBill->save();
-                $rejectedBill->同步问题件();
-                $rejectedBill->同步问题件退件状态();
-                $arr['orderIssues']['rejected_bill_id'] = $rejectedBill['id'];
-                $arr['orderIssues']['is_new_rejecting'] = '有';
-            }
-        }
-        if ($arr['order'] ?? false) {
-            $order = Order::query()->where('id', $arr['order']['id'])->first();
-            $order->fill($arr['order']);
-            $order->update();
-        }
-        $orderIssue->fill($arr['orderIssues']);
-        $orderIssue->同步退单状态();
-        $orderIssue->update();
-        unset($orderIssue,$arr);
-    }
-
     public function batchDestroy($ids){
-        $bool = null;
         try {
             $bool = OrderIssue::query()->whereIn('id', $ids)->delete();
             LogService::log(__METHOD__,__FUNCTION__,json_encode($ids));
+            return ['success'=>$bool];
         } catch (\Exception $e) {
             LogService::log(__METHOD__,__FUNCTION__,'error'.json_decode($ids).'||'.$e->getMessage().'||'.$e->getTraceAsString());
-        } finally {
-            if($bool ?? false){
-                return ['success'=>true];
-            }else{
-                return ['success' => false];
-            }
+            return ['success' => false];
         }
     }
 
@@ -474,8 +429,68 @@ class OrderIssueService
     {
         $order = Order::query()->where('client_code',$secondClientNo)->first();
         if(!$order){
-            $order  = app(OrderService::class)->findOrCreateByClientCode($secondClientNo);
+            /** @var OrderService $orderService */
+            $orderService = app(OrderService::class);
+            $orderHeaders = OracleDOCOrderHeader::query()->where('SoReference1',$secondClientNo)->get();
+            $orders =  $orderService->createByWmsOrder($orderHeaders);
+            if($orders->count()>0)$order =$orders->first();
         }
         return OrderIssue::query()->where('id',$id)->update(['second_client_no'=>$secondClientNo]) > 0;
     }
+
+    public function updateSecondLogisticNumber($id,$logisticNumber)
+    {
+        $orderIssue = OrderIssue::query()->where('id',$id)->first();
+        $order = app(OrderService::class)->getOrderByLogisticNumber($logisticNumber);
+        if(!$order){
+            $orderIssue->update(['second_logistic_number' => $logisticNumber]);
+            return ['success'=>true,'second_logistic_number' => $logisticNumber];
+        }
+        $orderIssue->update(['second_client_no' => $order->client_code]);
+        $order = Order::query()->with(['packages.commodities.commodity','logistic'])
+            ->where('id',$order->id)->first();
+        return ['success' => true,'order' =>$order];
+    }
+
+    /**
+     * @param string $logisticNumber
+     * @param string $type
+     * @param string $result_explain
+     */
+    public function createOrderIssue($logisticNumber,$type,$result_explain)
+    {
+        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
+            ->whereHas('actAllocationDetails',function($query)use($logisticNumber){
+                $query->where('picktotraceid',$logisticNumber);
+            })->get();
+        $orderIssueType = OrderIssueType::query()->where('name',$type)->first();
+        $this->createOrderIssueByWmsOrder($orderHeaders,$orderIssueType->id,$result_explain);
+    }
+
+    /**
+     * @param array $logisticNumbers
+     * @return array
+     */
+    public function 校验问题件是否存在_快递单号_返回存在的快递单号($logisticNumbers)
+    {
+        $orderIssues = OrderIssue::query()->with('order.packages')->whereHas('order.packages',function($query)use($logisticNumbers){
+            $query->whereIn('logistic_number',$logisticNumbers);
+        })->get();
+        $exits_logistic_number = array_diff(array_unique(data_get($orderIssues,'*.order.packages.*.logistic_number')),['',null]);
+        return array_intersect($exits_logistic_number,$logisticNumbers);
+    }
+
+    /**
+     * @param array $orderNos
+     * @return array
+     */
+    public function 校验问题件是否存在_WMS订单号_返回存在的订单号($orderNos)
+    {
+        $orderIssues = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderNos){
+            $query->whereIn('code',$orderNos);
+        })->get();
+        $exits_logistic_number = array_diff(array_unique(data_get($orderIssues,'*.order.code')),['',null]);
+        return array_intersect($exits_logistic_number,$orderNos);
+    }
+
 }

+ 1 - 20
app/Services/OrderPackageCommoditiesService.php

@@ -471,26 +471,6 @@ class OrderPackageCommoditiesService
         return $createParams;
     }
 
-    public function createByOrderHeader($orderHeaders)
-    {
-        $orderPackageCommodities = $this->getByWmsOrder($orderHeaders);
-        $OPCCollects = $this->将orderPackageCommodity抽象成数组($orderPackageCommodities);
-        $creatParams = $this->返回创建数组_WMS订单($orderHeaders);
-        $this->数据重组($OPCCollects,$creatParams);
-        $collect = $this->删选需要修改的OrderPackageCommodities($OPCCollect,$creatParam);
-        $ids = $this->删选出删除的OrderPackageCommodities($OPCCollect,$creatParam);
-        $insertParam = $this->删选出需要添加的OrderPackageCommodities($OPCCollect,$creatParam);
-        $updateParams = [];
-        foreach ($collect as $item) {
-            $updateParams[] = $item;
-        }
-        $this->根据更新数组进行更新($updateParams);
-        $this->删除OPC以及对应的追踪件($ids);
-        $creatParams = $this->生成OrderPackageCommodities_基于创建数组($insertParam);
-        $this->create($creatParams);
-    }
-
-
     /**
      * @param $orderHeaders
      */
@@ -498,6 +478,7 @@ class OrderPackageCommoditiesService
     {
         if(!$orderHeaders){return ;}
         if(count($orderHeaders) == 0){return ;}
+        app(CommodityService::class)->getByWmsOrders($orderHeaders);
         $orderPackageCommodities = $this->getByWmsOrder($orderHeaders);
         $OPCCollects = $this->将orderPackageCommodity抽象成数组($orderPackageCommodities);
         $creatParams = $this->返回创建数组_WMS订单($orderHeaders);

+ 3 - 2
app/Services/OrderPackageService.php

@@ -377,15 +377,16 @@ class OrderPackageService
      * @param string $logisticNumber
      * @return array|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object
      */
-    public function createByLogisticNumberAndOrderClientNo($orderClientNo,$logisticNumber)
+    public function update($orderClientNo,$logisticNumber)
     {
         $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
         if(!$order){
             $order = Order::query()->create(['client_code'=>$orderClientNo]);
         }
         $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
-        if($orderPackage){return $orderPackage;}
+        if($orderPackage){return  compact('orderPackage','order');}
         $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
         return  compact('orderPackage','order');
     }
+
 }

+ 35 - 15
app/Services/OrderService.php

@@ -436,12 +436,9 @@ class OrderService
         } else {
             $orderHeader = app('oracleDocOrderHeaderService')->first(['soreference5' => $logistic_number]);
         }
-
         if ($orderHeader == null) return null;
-
         $order = $this->first(['code'=>$orderHeader->orderno]);
         if ($order) return $order;
-
         /** @var OwnerService */
         $owner = app('ownerService')->first(['code' => $orderHeader->customerid]);
         if (!$owner) {
@@ -476,7 +473,10 @@ class OrderService
         ]);
     }
 
-
+    /**
+     * @param $orderHeaders
+     * @return \Illuminate\Database\Eloquent\Builder[]|Collection|null
+     */
     public function createByWmsOrder($orderHeaders)
     {
         if($orderHeaders->isEmpty())return null;
@@ -533,12 +533,12 @@ class OrderService
              if($order_code_map[$orderHeader->orderno] ?? false)continue;
             $owner = $owners_code_map[$orderHeader->customerid] ?? null;
             $logistic =  $logistics_code_map[$orderHeader->userdefine1] ?? null;
-            $shop = $shop_name_map[' _owner_code'.$orderHeader->customerid.' name='.$orderHeader->issuepartyname] ?? '';
+            $key = ' owner_code='.$orderHeader->customerid.' name='.$orderHeader->issuepartyname ?? '';
+            $shop = $shop_name_map[$key] ?? '';
             // 自提 转 新杰物流
             if($logistic!= null && $logistic->name == '自提'){
                 $logistic = $logistic_XJWL;
             }
-
             $params[] = [
                 'code' => $orderHeader->orderno,
                 'owner_id' => $owner->id ?? null,
@@ -711,14 +711,15 @@ class OrderService
      */
     public function updateOrderByOrderHeader($order,$orderHeader)
     {
-        $params = $this->getParamByOrderHeader($orderHeader);
-        if($params['client_code']!= $order->client_code){
+        if(!$orderHeader){return ;}
+        if($orderHeader->orderno == $order->code){
             return ;
-        }else{
-            if($params['code'] == $order->code){
-                return ;
-            }
-            $data = [
+        }else if($orderHeader->soreference1 != $order->client_code){
+            return ;
+        }
+        $params = $this->getParamByOrderHeader($orderHeader);
+
+        $data = [
                 'code'=>$order->code ?? $params['code'],
                 'owner_id'=>$order->code ?? $params['owner_id'],
                 'shop_id'=>$order->code ?? $params['shop_id'],
@@ -730,8 +731,27 @@ class OrderService
                 'address'=>$order->code ?? $params['address'],
                 'wms_edittime'=>$order->code ?? $params['wms_edittime'],
                 'wms_status'=>$order->code ?? $params['wms_status'],
-            ];
-            Order::query()->where('id',$order->id)->update($data);
+        ];
+        Order::query()->where('id',$order->id)->update($data);
+    }
+
+    public function getOrderByLogisticNumber($logisticNumber)
+    {
+        $order = Order::query()->with('packages.commodities.commodity')
+            ->whereHas('packages',function($query)use($logisticNumber){
+                $query->where('logistic_number',$logisticNumber);
+            })->first();
+        if($order){
+            $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',$order->client_no)->first();
+            $this->updateOrderByOrderHeader($order,$orderHeader);
+            return $order;
         }
+        $orderHeaders = OracleDOCOrderHeader::query()->with(['oracleDOCOrderDetails', 'actAllocationDetails','oracleBASCode'])
+            ->whereHas('actAllocationDetails',function($query)use($logisticNumber){
+                $query->where('picktotraceid',$logisticNumber);
+            })->get();
+        app(CommodityService::class)->getByWmsOrders($orderHeaders);
+        $orders =$this->createByWmsOrder($orderHeaders);
+        return  $orders ? $orders->first() : null ;
     }
 }

+ 14 - 8
app/Services/OrderTrackingService.php

@@ -37,8 +37,7 @@ class OrderTrackingService
             $query->with(['commodity', 'package.order.logistic']);
         },])->whereHas('owner', function ($query) use ($owner_ids) {
             $query->whereIn('id', $owner_ids); //货主
-        })->orderByDesc('order_trackings.created_at')
-        ->orderBy('order_trackings.order_client_code');
+        });
 
         $queryParam = [
             'start_at' => ['alias' => 'pick_up_at', 'startDate' => ' 00:00:00'],
@@ -101,7 +100,10 @@ class OrderTrackingService
 
     public function paginate($params)
     {
-        return $this->getConditionQuery($params)->paginate($params['paginate'] ?? 50);
+        return $this->getConditionQuery($params)
+            ->orderByDesc('order_trackings.created_at')
+            ->orderBy('order_trackings.order_client_code')
+            ->paginate($params['paginate'] ?? 50);
     }
 
     public function getSql($params)
@@ -112,7 +114,10 @@ class OrderTrackingService
         $order_tracking_colnums = "case order_trackings.order_client_code when  order_trackings.web_order_number then '' when order_trackings.order_client_code then  order_trackings.order_client_code end order_client_code,";
         $order_tracking_colnums .= 'order_trackings.web_order_number,order_trackings.pick_up_at,order_trackings.sale,order_trackings.client,order_trackings.order_remark,order_trackings.gross_weight,order_trackings.bulk,';
         $order_tracking_colnums .= 'order_trackings.pallet_total,order_trackings.planning_sent_at,order_trackings.is_on_duty_shift,order_trackings.is_arrival,order_trackings.signed_at,order_trackings.receive_bill_status,order_trackings.remark';
-        return  $this->getConditionQuery($params)->selectRaw($order_tracking_colnums)
+        return  $this->getConditionQuery($params)
+            ->orderBy('order_trackings.order_client_code')
+            ->orderByDesc('order_trackings.pick_up_at')
+            ->selectRaw($order_tracking_colnums)
             ->leftJoin('order_package_commodities','order_trackings.order_package_commodity_id','order_package_commodities.id')
                 ->selectRaw('order_package_commodities.amount amount')
             ->leftJoin('order_packages','order_package_commodities.order_package_id','order_packages.id')
@@ -257,7 +262,7 @@ class OrderTrackingService
                 LogService::log(__METHOD__, __FUNCTION__, '批量添加 orderTracking' . json_encode($params),null);
             }
         } catch (\Exception $e) {
-            LogService::log(__METHOD__, __FUNCTION__, '批量添加 orderTracking' . json_encode($params).$e->getMessage().$e->getTraceAsString(),null);
+            LogService::log(__METHOD__, __FUNCTION__, '批量添加 orderTracking error' . json_encode($params).$e->getMessage().$e->getTraceAsString(),null);
         }
     }
 
@@ -325,7 +330,7 @@ class OrderTrackingService
                         'web_order_number' => $params['web_order_number'],
                         'gross_weight'  => $gross_weight,
                         'bulk' => $bulk,
-                        'planning_sent_at' => $params['web_order_number']??'planning_sent_at'
+                        'planning_sent_at' => $params['planning_sent_at']
                     ];
                 }
             }
@@ -388,8 +393,9 @@ class OrderTrackingService
         if(preg_match('/^O[\d]/',$orderHeader['soreference1'] ?? '') > 0){
             $web_order_number = $orderHeader['soreference1'];
         }
-        $planning_sent_at = $orderHeader->lastshipmenttime ?? null;
-        if(isset($planning_sent_at)){
+        $pick_up_at = $orderHeader->lastshipmenttime;
+        $planning_sent_at = null;
+        if(isset($pick_up_at)){
              $logisticTiming = app(LogisticTimingService::class)->findByParams($orderHeader['c_city']??'',$orderHeader['c_province']??'',$order->logistic_id);
              if($logisticTiming){
                  $planning_sent_at = Carbon::create($planning_sent_at)->addDays($logisticTiming->days_at_working);

+ 40 - 6
app/Services/RejectedBillService.php

@@ -1,11 +1,13 @@
-<?php 
+<?php
 
-namespace App\Services; 
+namespace App\Services;
 
+use App\OracleDOCOrderHeader;
+use App\OrderIssue;
 use App\RejectedBill;
 
 Class RejectedBillService
-{ 
+{
     private function conditionQuery(array $params){
         $query = RejectedBill::query();
         if ($params['order_number'] ?? false){
@@ -13,13 +15,45 @@ Class RejectedBillService
         }
         return $query;
     }
-    
+
     public function get(array $params){
         return $this->conditionQuery($params)->get();
     }
 
-
     public function create(array $params){
         return RejectedBill::query()->create($params);
     }
-}
+
+    /**
+     * @param RejectedBill $rejectedBill
+     */
+    public function syncOrderIssue($rejectedBill)
+    {
+        $orderIssue = $rejectedBill->orderIssue()->first();
+        if(!isset($orderIssue)){
+            if(isset($rejectedBill->order_number) && trim($rejectedBill->order_number) != ''){
+                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($rejectedBill){
+                    $query->where('client_code',$rejectedBill->order_number);
+                })->first();
+            }
+            if(isset($rejectedBill->logistic_number_return) && !isset($orderIssue)){
+                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
+                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
+                })->first();
+//                $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($rejectedBill){
+//                    $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$rejectedBill->logistic_number_return)->first();
+//                })->first();
+                if(!isset($orderHeader))return;
+                $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
+                    $query->where('code',$orderHeader->orderno);
+                })->first();
+            }
+        }
+        if(isset($orderIssue)){
+            //确认问题件有的时候需要更新状态和提示
+            $orderIssue->同步退单状态();
+            $orderIssue->update(['is_new_rejecting' => '有']);
+            LogService::log(__METHOD__,__FUNCTION__,'退回单同步问题件'.json_encode($rejectedBill).json_encode($orderIssue));
+        }
+    }
+}

+ 34 - 0
database/migrations/2020_10_22_102316_change_order_issues_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOrderIssuesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            // 二次快递单号
+            $table->string('second_logistic_number')->index()->nullable()->comment('二次运单号')->after('second_client_no');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            // 二次快递单号
+            $table->dropColumn('second_logistic_number');
+        });
+    }
+}

+ 34 - 0
database/migrations/2020_10_23_101444_change_order_issues_tabel.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class ChangeOrderIssuesTabel extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            // 用于客户 客服 录入
+            $table->string('custom_code')->nullable()->comment('自定义单号')->after('final_status');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('order_issues', function (Blueprint $table) {
+            //
+            $table->dropColumn('custom_code');
+        });
+    }
+}

+ 31 - 0
database/migrations/2020_10_26_091851_add_order_issue_text_import_authorities.php

@@ -0,0 +1,31 @@
+<?php
+
+use App\Authority;
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOrderIssueTextImportAuthorities extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        //
+        (new Authority(['name'=>'订单管理-订单问题件生成-文本导入','alias_name'=>'订单管理-订单问题件生成-文本导入']))->save();
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+        Authority::query()->where('name','订单管理-订单问题件生成-文本导入')->delete();
+    }
+}

+ 2 - 2
public/js/app.js

@@ -2330,7 +2330,7 @@ function fromByteArray (uint8) {
 var BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :
   typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :
   typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :
-  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : 
+  typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :
   false;
 
 /**
@@ -86489,4 +86489,4 @@ module.exports = __webpack_require__(/*! D:\Reald\desktop\BsWAS\src\resources\sa
 
 /***/ })
 
-/******/ });
+/******/ });

+ 109 - 12
resources/views/order/index/delivering.blade.php

@@ -182,7 +182,7 @@
 
                 <div class="modal fade " id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
                      aria-hidden="true">
-                    <div class="modal-dialog modal-dialog-centered">
+                    <div class="modal-dialog modal-dialog-centered modal-xl">
                         <div class="modal-content">
                             <div class="modal-header">
                                 <h5 class="modal-title" id="exampleModalLabel">输入问题件信息</h5>
@@ -192,18 +192,35 @@
                                 </button>
                             </div>
                             <div class="modal-body">
-                                <div class="form-group row">
-                                    <label class="col-2 text-right">问题类别</label>
-                                    <select name="order_issues_type_id" v-model="typeId" class="form-control col-8" id="orderIssueType" @focus="focusOnModal($event)" >
+                                <div class="form-group row m-0 p-0">
+                                    <label class="col-md-1 col-sm-2 text-right">问题类别</label>
+                                    <select name="order_issues_type_id" v-model="typeId" class="form-control col-4" id="orderIssueType" @focus="focusOnModal($event)" >
                                         <option value></option>
                                         <option v-for="type in orderIssueType" :value="type.id">@{{ type.name }}</option>
                                     </select>
+                                    <label class="col-md-1 col-sm-2 text-right">
+                                        快递
+                                    </label>
+                                    <div class="col-4">
+                                        <textarea  class="form-control m-0">@{{ tagOrder.logisticInfo }}</textarea>
+                                        <button type="button" class="btn btn-sm btn-outline-primary" @click="copyLogisticInfo">复制</button>
+                                    </div>
                                 </div>
-                                <div class="form-group row">
-                                    <label class="col-2 text-right ">情况说明</label>
-                                    <textarea name="result_explain" v-model="result_explain" class="form-control col-8" id="result_explain"></textarea>
+                                <div class="form-group row m-0">
+                                    <label class="col-md-1 col-sm-2 text-right">情况说明</label>
+                                    <label for="result_explain"></label>
+                                    <textarea name="result_explain" v-model="result_explain" class="form-control col-4" id="result_explain" ></textarea>
+                                    <label class="col-md-1 col-sm-2 text-right">
+                                        商家
+                                    </label>
+                                    <div class="col-4">
+                                        <textarea  class="form-control m-0 row">@{{ tagOrder.merchantInfo }}</textarea>
+                                        <button type="button" class="btn btn-sm btn-outline-primary" @click="copyMerchantInfo">复制</button>
+                                    </div>
                                 </div>
+
                             </div>
+
                             <div class="modal-footer">
                                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal"
                                         @click="changeRemark">关闭
@@ -213,6 +230,7 @@
                         </div>
                     </div>
                 </div>
+                <textarea  id="clipboardDiv" style="opacity:0"></textarea>
             </div>
 
         </div>
@@ -246,7 +264,6 @@
                     {name:'{{$code->code}}',value:'{{$code->codename_c}}'},
                     @endforeach
                 ],
-                orderIssueNos:{!!  $orderIssueNos!!},
                 selectedStyle:'',
                 picktotraceidMap:{!! $picktotraceids !!},
                 pagePlaceholder:"",
@@ -256,7 +273,13 @@
                 is_merge : false,
                 message:{
                     checkOrderIssueMessage:'',
-                }
+                },
+                orderIssueNos:{!!  $orderIssueNos!!},
+                tagOrders:[],
+                tagOrder:{
+                    logisticInfo:'',
+                    merchantInfo:'',
+                },
             },
             mounted:function () {
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -376,6 +399,10 @@
                         }
                     },
                     deep:true
+                },
+                result_explain:function(){
+                    this.setLogisticInfo()
+                    this.setMerchantInfo()
                 }
             },
             methods:{
@@ -643,8 +670,13 @@
                             })
                             _this.checkData = []
                         }else{
-                            tempTip.setDuration(4000);
-                            tempTip.show(res.data.fail_info);
+                            if(res.data.exitsOrderNos){
+                                _this.message.checkOrderIssueMessage = res.data.fail_info+res.data.exitsOrderNos
+                                $("#checkModal").modal('show')
+                            }else{
+                                tempTip.setDuration(3000);
+                                tempTip.show(res.data.fail_info);
+                            }
                         }
                     }).catch(function(err){
                         tempTip.setDuration(3000);
@@ -739,6 +771,7 @@
                     let _this = this;
                     axios.post("{{url('apiLocal/order/issue/isExistByOrderNo')}}",data).then(function(res){
                         if(res.data.success){
+                            _this.getTagOrder(orderNos);
                             $("#exampleModal").modal('show')
                         }else{
                             _this.message.checkOrderIssueMessage = res.data.fail_info
@@ -754,10 +787,74 @@
                     nowrapSpan.hide();
                     nowrapSpan.siblings('.text-truncate').show();
                 },
-                nowrapText(e){
+                nowrapText(e) {
                     let truncateSpan = $(e.target);
                     truncateSpan.hide();
                     truncateSpan.siblings('.text-nowrap').show();
+                },
+                getTagOrder(orderNos){
+                    this.tagOrders = []
+                    if(orderNos.length ===  0 ){this.tagOrders =[];return ;}
+                    if(this.orders.length === 0 ){this.tagOrders =[];return ;}
+                    for (let i = 0; i < this.orders.length; i++) {
+                        let order =  this.orders[i];
+                        let orderno =order.orderno;
+                        if(orderNos.includes(orderno)){
+                            this.tagOrders.push(this.orders[i])
+                        }
+                    }
+                    this.setLogisticInfo();
+                    this.setMerchantInfo();
+                },
+                setLogisticInfo(){
+                    let content = ''
+                    let _this = this
+                    this.tagOrders.forEach(function(order){
+                        let picktotraceids = _this.picktotraceidMap[order.orderno];
+                        if($.type(picktotraceids) ==='array'){
+                            picktotraceids.forEach(function(picktotraceid,index,array){
+                                if(array.length ===index+1)content+=picktotraceid;
+                                else content+=picktotraceid+','
+                            });
+                        }else{content+=order.soreference5}
+                        content+=' '+order.c_contact+order.c_tel2+order.c_province+order.c_city+' '+order.c_district+order.c_address1+'/'+_this.result_explain+"\n"
+                    })
+                    this.tagOrder.logisticInfo = content
+                },
+                setMerchantInfo(){
+                    let content = ''
+                    let _this = this
+                    this.tagOrders.forEach(function(order){
+                        content+=order.customer_descr_c+' '+order.soreference1+' '
+                        let picktotraceids = _this.picktotraceidMap[order.orderno];
+                        if($.type(picktotraceids) ==='array'){
+                            picktotraceids.forEach(function(picktotraceid,index,array){
+                                if(array.length ===index+1)content+=picktotraceid;
+                                else content+=picktotraceid+','
+                            });
+                        }else {content+=order.soreference5}
+                        content += '/'+_this.result_explain+ "\n";
+                    })
+                    this.tagOrder.merchantInfo = content
+                },
+                copyLogisticInfo(){
+                    this.copyText(this.tagOrder.logisticInfo)
+                },
+                copyMerchantInfo(){
+                    this.copyText(this.tagOrder.merchantInfo)
+                },
+                copyText(text){
+                    try {
+                        $('#clipboardDiv').text(text).select().focus();
+                        document.execCommand("Copy");
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制成功')
+                    } catch (e) {
+                        tempTip.setIndex(1052)
+                        tempTip.setDuration(2000)
+                        tempTip.showSuccess('复制失败:'+e)
+                    }
                 }
             },
         });

+ 22 - 4
resources/views/order/issue/create.blade.php

@@ -15,7 +15,7 @@
                         <input type="hidden" name="order_id" :value='order.id'>
                         <input type="hidden" name="second_order_id" :value='second_order_id'>
                         <div class="form-group row">
-                            <label for="logistic_number_return" class="col-2 col-form-label text-right ">退回单号</label>
+                            <label for="logistic_number_return" class="col-2 col-form-label text-right ">退回单号</label>
                             <div class="col-8 ">
                                 <input type="text" name="logistic_number_return" id="logistic_number_return" class="form-control col-lg-5 @error('logistic_number_return') is-invalid @enderror"
                                        v-model="logistic_number_return"
@@ -103,14 +103,17 @@
                                     class="text-danger">*</span>货主</label>
                             <div class="col-8 row">
                                 <div class="form-group col-lg-5">
-                                    <select class="form-control @error('owner_id') is-invalid @enderror" name="owner_id" v-model="order.owner_id">
+                                    <select class="form-control form-inline  @error('owner_id') is-invalid @enderror" name="owner_id" v-model="order.owner_id">
                                         <option value></option>
-                                        <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
-                                    </select>
+                                        <option v-for="owner in filterOwners" :value="owner.id">@{{ owner.name }}</option>
+                                    </select >
                                     @error('owner_id')
                                     <span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                     @enderror
                                 </div>
+                                <div class="form-group col-lg-5">
+                                    <input class="form-control form-inline" @change="ownerFilter($event)" placeholder="输入货主进行筛选">
+                                </div>
                             </div>
                         </div>
                         <div class="form-group row">
@@ -292,6 +295,7 @@
                 secondClientNO: @if(old('secondClientNO'))"{{old('secondClientNO')}}"@else''@endif,
                 order_issue_type_id: @if(old('order_issue_type_id'))"{{old('order_issue_type_id')}}"@else''@endif,
                 owners:{!! $owners !!},
+                filterOwners:{!! $owners !!},
                 logistics:{!! $logistic !!},
                 types:{!! $types !!},
                 userWorkGroup:{!! $userWorkGroup !!},
@@ -436,6 +440,20 @@
                         _this.isSubmit = false;
                     });
                 },
+                ownerFilter(e){
+                    let name = $(e.target).val();
+                    if(name===''){
+                        this.filterOwners = this.owners
+                        return
+                    }
+                    let arr = [];
+                    this.owners.forEach(function(owner){
+                        if(owner.name.includes(name)){
+                            arr.push(owner)
+                        }
+                    });
+                    this.filterOwners = arr;
+                }
             }
         })
     </script>

+ 122 - 8
resources/views/order/issue/import.blade.php

@@ -7,19 +7,37 @@
     <div class="container-fluid" id="issue_import_div">
         <div class="card col-md-8 offset-md-2">
             <div class="card-body">
-                <form action="{{url('order/issue/batchImport')}}" method="post" enctype="multipart/form-data" class="form"  target="_blank">
-                    @csrf
+
+                <div class="form-group row text-center">
+                    <div class="col-12 text-danger">
+                        注意:请保证表第一行有以下对应的字段名<br><span class="text-muted">(可不按顺序):</span><br>
+                        原始运单号,情况说明,问题类别<br>
+                        <span class="text-muted" style="opacity:0.7"> 订单问题类别:('拦截', '快递异常', '信息更改', '联系不上', '其他', '错漏发', '仓库问题', '快递丢件', '破损', '撤销丢件', '二次加工', '全检问题', '系统问题', '延迟发货', '仓库丢件', )<br></span>
+                    </div>
+                    <div class="col-12 text-info ">
+                        导入时间随文件大小可能达数十分钟以上,请耐心等候
+                        <hr>
+                    </div>
+                </div>
+                @can('订单管理-订单问题件生成-文本导入')
                     <div class="form-group row text-center">
                         <div class="col-12 text-danger">
-                            注意:请保证表第一行有以下对应的字段名<br><span class="text-muted">(可不按顺序):</span><br>
-                            原始运单号,情况说明,问题类别<br>
-                            <span class="text-muted" style="opacity:0.7"> 订单问题类别:('拦截', '快递异常', '信息更改', '联系不上', '其他', '错漏发', '仓库问题', '快递丢件', '破损', '撤销丢件', '二次加工', '全检问题', '系统问题', '延迟发货', '仓库丢件', )<br></span>
+                            订单问题类别:同Excel文件导入所要求的订单问题类别一致<br/>
+                            注意:文本导入的问题件只有全部符合条件的才能生成问题件<br/>
+                            <span class="text-muted" style="opacity:0.7">
+                                如果在导入后出现部分数据导入失败,修改对应错误的数据继续导入即可
+                            </span>
                         </div>
-                        <div class="col-12 text-info ">
-                            导入时间随文件大小可能达数十分钟以上,请耐心等候
-                            <hr>
+                    </div>
+                    <div class="form-group row">
+                        <div class="col-8 offset-2">
+                            <button type="button" class="btn form-control btn-primary"  @click="showPasteDataModal">文本导入</button>
                         </div>
                     </div>
+                    <hr/>
+                @endcan
+                <form action="{{url('order/issue/batchImport')}}" method="post" enctype="multipart/form-data" class="form"  target="_blank">
+                    @csrf
                     <div class="form-group row">
                         <label for="sku" class="col-2 col-form-label text-right">选择EXCEL</label>
                         <div class="col-8">
@@ -42,10 +60,106 @@
                 </form>
             </div>
         </div>
+        <div class="modal fade" id="pasteData" role="dialog" tabindex="-1" aria-labelledby="pasteDataTetlie" aria-hidden="true">
+            <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <div class="row modal-title font-weight-bold w-100 text-nowrap ml-1 noselect" id="pasteDataTitle">
+                            <span v-for="(row,i) in rows" draggable="true"
+                                  @drop="drop($event,i)" @dragover="dragover($event)" @dragstart="dragstart($event,i)"
+                                  class="col-4 border" style="cursor: move"
+                                  :class="requiredRows.includes(row)?'text-danger':''">@{{ row }}</span>
+                        </div>
+                    </div>
+                    <div class="modal-body text-center">
+                        <button type="button" id="popover" class="btn btn-danger" v-if="popoverContent"
+                                data-container="body" data-toggle="popover" data-placement="bottom"
+                                :data-content="popoverContent" data-html="true">
+                            部分数据导入失败
+                        </button>
+                        <textarea id="pasteDataText" class="w-100" style="height: 400px" v-model="pasteDataText"
+                                  @keydown.tab="forbidTab($event)" @keyup.tab="replaceSpacing()"
+                                  placeholder="内容可为EXCEL复制,也可手动输入使用“TAB”缩进符区分列,请注意表头顺序,可拖拽表头字段调整顺序,以该顺序为准"></textarea>
+                    </div>
+                    <div class="modal-footer">
+                        <button class="btn btn-primary" @click="importPasteData">开始导入</button>
+                    </div>
+                </div>
+            </div>
+        </div>
     </div>
 @endsection
 
 @section('lastScript')
+    <script>
+        let listVue = new Vue({
+            el:'#issue_import_div',
+            data:{
+                rows:['原始运单号','情况说明','问题类别'],
+                requiredRows:['原始运单号','情况说明','问题类别'],
+                popoverContent:'',
+                pasteDataText: '',
+            },
+            mounted:function(){
+                $('[data-toggle="popover"]').popover();
+            },
+            methods:{
+                showPasteDataModal(){
+                    $('#popover').attr('hidden','hidden')
+                    $('#pasteData').modal('show')
+                },
+                drop(e,index){
+                    e.preventDefault();
+                    if (this.dom !== e.target.innerHTML){
+                        this.dom.innerHTML = e.target.innerHTML;
+                        let temp=JSON.parse(JSON.stringify(this.rows[index]));
+                        this.$set(this.rows,index,this.rows[e.dataTransfer.getData('text/html')]);
+                        this.$set(this.rows,Number(e.dataTransfer.getData('text/html')),temp);
+                    }
+                },
+                dragover(e){
+                    e.preventDefault();
+                },
+                dragstart(e,index){
+                    this.dom = e.target.innerHTML;
+                    e.dataTransfer.setData("text/html",index);
+                },
+                importPasteData(){
+                    if(!this.pasteDataText){
+                        tempTip.setDuration(2000)
+                        tempTip.show('导入文本不能为空')
+                    }
+                    let _this = this
+                    let data = {rows:this.rows,pasteDataText:this.pasteDataText}
+                    axios.post('{{url('apiLocal/order/issue/importPasteData')}}',data).then(function (response) {
+                        if(response.data.success){
+                            $('#pasteData').modal('hide')
+                            tempTip.setDuration(2000)
+                            tempTip.showSuccess('导入完毕')
+                        }else{
+                            let content = '';
+                            for (const key in response.data.fail_info) {
+                                content+=key+':'+response.data.fail_info[key] + "</br>"
+                            }
+                            _this.popoverContent = content
+                            setTimeout(function () {
+                                $("#popover").removeAttr('hidden').popover('show')
+                            },1);
+                        }
+                    }).catch(function(error){
+                        tempTip.setDuration(2000)
+                        tempTip.show('导入失败'+error)
+                    })
+                },
+                forbidTab(e){
+                    e.preventDefault();
+                },
+                replaceSpacing(){
+                    this.pasteDataText += "\t";
+                },
 
+            }
+        });
+    </script>
 @endsection
 

+ 23 - 10
resources/views/order/issue/index.blade.php

@@ -118,6 +118,7 @@
                             <th class="three-layer  align-middle" rowspan="2" v-if="isShowSecondOrderInfo" style=" min-width: 200px;">二次运单号</th>
                             <th class="three-layer" colspan="3" style="min-width: 300px" v-if="isShowSecondOrderInfo" style=" min-width: 350px;">二次商品明细</th>
                         @endcannot
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">自定义订单号</th>
                         @cannot('订单管理-问题件-客户不可见')
                             <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">承运商赔偿金额</th>
                             <th class="three-layer  align-middle" rowspan="2" style="min-width: 120px">承运商快递减免</th>
@@ -283,7 +284,7 @@
                         </td>
 
                         <td class="p-0 m-0 child-layer-3" v-if="!isShowRejectedBill && index === 0 " style="width:50px;" :rowspan="orderIssues.length" >
-                            <span class="btn  btn-outline-secondary "  @click="showRejectedBill"  :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''" >展开退单列</span>
+                            <span class="btn btn-outline-secondary"  @click="showRejectedBill"  :style="orderIssues.length>4 ?'{height: 200px;line-height: 100px':''" >展开退单列</span>
                         </td>
 
                         <td class="p-0 child-layer-3-hide" :id="orderIssue.id+'rejectedBill'" valign="middle" align="center" colspan="5" v-if="isShowRejectedBill">
@@ -309,7 +310,13 @@
                             </div>
                         </td>
 
-                        <td class="child-layer-3">@{{ orderIssue.result_explain}}</td>
+                        <td class="child-layer-3">
+                            @can('订单管理-问题件-编辑')
+                            <textarea class="form-control form-control-sm"  @change="updateOrderIssue(orderIssue,'result_explain',$event)" data-toggle="tooltip" data-placement="bottom" :title="orderIssue.result_explain">@{{ orderIssue.result_explain }}</textarea>
+                            @else
+                            @{{ orderIssue.result_explain}}
+                            @endcan
+                        </td>
                         <td class="child-layer-3">
                             @can('订单管理-问题件-编辑')
                                 <select class="form-control form-control-sm" :value="orderIssue.order_issue_type_id" @change="updateOrderIssue(orderIssue,'order_issue_type_id',$event)">
@@ -396,7 +403,7 @@
                                     </div>
                                 </div>
 
-                                <template v-if="orderIssue.second_order !== null">
+                                <div v-if="orderIssue.second_order !== null">
                                     <div class="text-center m-0" :id="'secondOrderNumbers'+orderIssue.id"
                                          :class="orderIssue.seconderCount > 1 ? 'collapse':''"
                                          :data-value="orderIssue.seconderCount = 0">
@@ -411,7 +418,10 @@
                                             @click="toggleseCondOrderNumbers(orderIssue.id,orderIssue.second_order.logisticNumbers.length)">
                                         分箱@{{ orderIssue.second_order.logisticNumbers.length }}件,点击展开
                                     </button>
-                                </template>
+                                </div>
+                                <div v-else-if="orderIssue.second_order === null">
+                                    @{{orderIssue.second_logistic_number}}
+                                </div>
                             </td>
                             <td class="child-layer-3-hide p-0" colspan="3" v-if="isShowSecondOrderInfo">
                                 <template v-if="orderIssue.second_order!==null" class=" p-0">
@@ -442,6 +452,9 @@
                                 </template>
                             </td>
                         @endcannot
+                        <td class="child-layer-3">
+                            <input type="text" class="form-control form-control-sm" :value="orderIssue.custom_code" @change="updateOrderIssue(orderIssue,'custom_code',$event)">
+                        </td>
                         @cannot('订单管理-问题件-客户不可见')
                             <td class="child-layer-3">
                                 @can('订单管理-问题件-编辑')
@@ -695,7 +708,7 @@
                 let tr = $('.tr-yellow')[1];
                 let countShow = $(tr).children('.one-layer').length;
                 $('.header-1').attr('colspan',countShow);
-
+                $('[data-toggle="tooltip"]').tooltip({'trigger': 'hover'})
                 $('#list').removeClass("d-none");
                 let _this = this;
                 let log_content_range = [{name:'15',value:'15天内'},{name:'31',value:'近一月'},{name:'92',value:'近三月'},{name:'183',value:'近半年'},{name:'366',value:'近一年'},{name:'0',value:'不限'},];
@@ -1360,17 +1373,17 @@
                     let logisticNumber = $('#secondLogisticNumber-'+orderIssue.id).val()
                     let data = {id:orderIssue.id,logistic_number:logisticNumber,client_code:orderIssue.second_client_no}
                     let _this = this;
-                    axios.post('{{url('apiLocal/order/issue/secondOrderAddOrderPackage')}}',data).then(function(response){
+                    axios.post('{{url('apiLocal/order/issue/editSecondLogisticNumber')}}',data).then(function(response){
                         if(response.data.success){
                             tempTip.setDuration(2000)
                             tempTip.showSuccess('添加成功')
-                            if(orderIssue.second_order == null){
+                            if(response.data.order != null){
                                 orderIssue.second_order = response.data.order
+                                orderIssue.second_client_no = response.data.order.client_code
                             }
-                            if(orderIssue.second_order.packages==null){
-                                orderIssue.second_order.packages = []
+                            if(response.data.second_logistic_number != null){
+                                orderIssue.second_logistic_number = response.data.second_logistic_number
                             }
-                            orderIssue.second_order.packages.push(response.data.orderPackage);
                             _this.edit.orderIssue.id = ''
                             _this.edit.orderIssue.showId = ''
                         }else{

+ 2 - 1
routes/apiLocal.php

@@ -49,7 +49,8 @@ Route::group(['prefix' => 'order'], function () {
         Route::post('updateLogisticNumberReturn','OrderIssueController@updateLogisticNumberReturnApi');
         Route::post('editSecondClientNo','OrderIssueController@editSecondClientNoApi');
         Route::post('endOrderIssues','OrderIssueController@endOrderIssuesApi');
-        Route::post('secondOrderAddOrderPackage','OrderIssueController@secondOrderAddOrderPackageApi');
+        Route::post('editSecondLogisticNumber','OrderIssueController@editSecondLogisticNumberApi');
+        Route::post('importPasteData','OrderIssueController@importPasteDataApi');
 
          Route::group(['prefix'=>'onTop'],function(){
             Route::post('/store', 'OrderIssueOnTopController@apiStore');