Преглед на файлове

Merge branch 'zengjun' of ssh://was.baoshi56.com:10022/var/git/bswas

LD преди 5 години
родител
ревизия
10ae994ef1

+ 7 - 3
app/Filters/OrderIssueFilters.php

@@ -14,11 +14,9 @@ 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
@@ -65,7 +63,8 @@ class OrderIssueFilters
         'shop_name',
         'finance_confirm',
         'logistic_number_return',
-        'final_status'
+        'final_status',
+        'user_owner_group_id'
     ];
     protected $array_filter;
     protected $params = [];
@@ -424,4 +423,9 @@ class OrderIssueFilters
         $this->queryBuilder->where('order_issues.finance_confirm',$finance_confirm);
     }
 
+    public function user_owner_group_id($user_owner_group_id)
+    {
+        $this->queryBuilder->where('order_issues.user_owner_group_id',$user_owner_group_id);
+    }
+
 }

+ 21 - 20
app/Http/Controllers/OrderIssueController.php

@@ -20,6 +20,7 @@ use App\Services\OrderIssueService;
 use App\Services\OrderService;
 use App\Services\OwnerService;
 use App\Shop;
+use App\UserOwnerGroup;
 use App\UserWorkgroup;
 use Exception;
 use Illuminate\Database\QueryException;
@@ -39,15 +40,14 @@ class OrderIssueController extends Controller
         if (!Gate::allows('订单管理-问题件-查询')) {
             return redirect(url('/'));
         }
-        /** @var OrderIssueService $orderIssueService */
-        $orderIssueService = app('OrderIssueService');
         $owners = app(OwnerService::class)->getAuthorizedOwners();
         $orderIssues = OrderIssue::query()->filter($filter)->defaultWith()->paginate($request['paginate'] ?? 50);
         $orderIssueType = OrderIssueType::all();
         $qualityLabel = QualityLabel::all();
         $logistics = Logistic::all();
         $userWorkgroup = UserWorkgroup::all();
-        return view('order/issue/index', compact('owners', 'orderIssues', 'orderIssueType', 'qualityLabel','userWorkgroup','logistics'));
+        $userOwnerGroups = UserOwnerGroup::all();
+        return view('order/issue/index', compact('owners', 'orderIssues', 'orderIssueType', 'qualityLabel','userWorkgroup','logistics','userOwnerGroups'));
     }
 
     public function create()
@@ -94,11 +94,12 @@ class OrderIssueController extends Controller
         $secondOrder = $orderIssue->secondOrder;
         $rejectedBill = RejectedBill::query()->where('id', $orderIssue->rejected_bill_id)->first();
         $userWorkgroup = UserWorkgroup::all();
+        $userOwnerGroups = UserOwnerGroup::all();
         $orderIssueType = OrderIssueType::all();
         $owners = Owner::all();
         $shops = Shop::all();
         $logistics = Logistic::all();
-        return view('order/issue/edit', compact('orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType', 'order', 'secondOrder', 'rejectedBill'));
+        return view('order/issue/edit', compact('orderIssue', 'owners', 'userWorkgroup', 'shops', 'logistics', 'orderIssueType', 'order', 'secondOrder', 'rejectedBill','userOwnerGroups'));
     }
 
     public function batchImport(Request $request)
@@ -206,7 +207,7 @@ class OrderIssueController extends Controller
         try {
             $data =  $request->only([
                 'order_issue_type_id','owner_id','logistic_id', 'logistic_number_return','result_explain','final_status','second_order_id','second_client_no',
-                'logistic_indemnity_money','logistic_express_remission','baoshi_indemnity_money','baoshi_express_remission','user_workgroup_id'
+                'logistic_indemnity_money','logistic_express_remission','baoshi_indemnity_money','baoshi_express_remission','user_workgroup_id','user_owner_group_id'
             ]);
             $orderIssue = OrderIssue::query()->find($request->id);
             $orderIssue->update($data);
@@ -403,7 +404,7 @@ class OrderIssueController extends Controller
         ]);
     }
 
-    public function endOrderIssuesApi(Request $request)
+    public function endOrderIssuesApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) {
             return ['success'=>false,'fail_info' => '没有对应权限'];
@@ -418,7 +419,7 @@ class OrderIssueController extends Controller
         return ['success'=>true,'logs'=>$logs];
     }
 
-    public function editSecondClientNoApi(Request $request)
+    public function editSecondClientNoApi(Request $request): array
     {
         if(!Gate::allows('订单管理-问题件-编辑')){
             return ['success'=>false,'fail_info'=>'没有对应权限'];
@@ -437,7 +438,7 @@ class OrderIssueController extends Controller
         }
     }
 
-    public function editSecondLogisticNumberApi(Request $request)
+    public function editSecondLogisticNumberApi(Request $request): array
     {
         if(!Gate::allows('订单管理-问题件-编辑'))
             return ['success'=>false,'fail_info'=>'没有对应权限'];
@@ -451,14 +452,14 @@ class OrderIssueController extends Controller
         }
     }
 
-    public function disposeImportApi(Request $request)
+    public function disposeImportApi(Request $request): array
     {
         if(!Gate::allows('订单管理-问题件-编辑'))
             return ['success'=>false,'fail_info'=>'没有对应权限'];
         return app(OrderIssueService::class)->disposeImport($request->input('ids'));
     }
 
-    public function importPasteDataApi(Request $request)
+    public function importPasteDataApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-导入-文本导入'))
             return ['success'=>false,'fail_info'=>'没有对应权限'];
@@ -542,7 +543,7 @@ class OrderIssueController extends Controller
             }
             if(count($map)!==0)$maps[] = $map;
         }
-//        if(count($errors)>0)
+
         if(count($errors)>0) return ['success'=>false,'fail_info'=>$errors];
         try {
             foreach ($maps as $map) {
@@ -576,7 +577,7 @@ class OrderIssueController extends Controller
             '退回单号', '退单商品名','退单商品条码','退单商品数量','是否正品','退单状态','退单备注',
             '操作类型','说明','操作者','情况说明','问题类别',
             '二次订单号','二次承运商','二次运单号','二次商品条码','二次商品名','二次商品数量',
-            '最终状态', '承运商赔偿金额', '承运商快递减免', '宝时赔偿金额', '宝时快递减免','事故责任方'
+            '最终状态', '承运商赔偿金额', '承运商快递减免', '宝时赔偿金额', '宝时快递减免','事故责任方','项目责任方'
         ];
         foreach ($order_Issues as $order_issue){
             $order =  $order_issue->order;
@@ -684,10 +685,10 @@ class OrderIssueController extends Controller
                 $order_issue->logistic_express_remission,
                 $order_issue->baoshi_indemnity_money,
                 $order_issue->baoshi_express_remission,
-                rtrim($userWorkgroupsName,",\r\n")
+                rtrim($userWorkgroupsName,",\r\n"),
+                $order_issue->userOwnerGroup->name ?? '',
             ];
         }
-        $mergeColumn = ['A','B','C','D','E','F','G','H','I','J','K','L','P','T','X','Y','Z','AA','AF','AG','AH','AI','AJ','AK'];   // 合并行
         return app(ExportService::class)->json($row,$json,"订单问题件");
     }
 
@@ -705,7 +706,7 @@ class OrderIssueController extends Controller
         return view('order.issue.recycle',compact('orderIssues','paginate'));
     }
 
-    public function recoverOrderIssueApi(Request $request)
+    public function recoverOrderIssueApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-删除')) {
             return ['success'=>false,'error'=>'没有对应权限'];
@@ -717,7 +718,7 @@ class OrderIssueController extends Controller
         return  $service->recoverOrderIssue($request['ids']);
     }
 
-    public function financeConfirmApi(Request $request)
+    public function financeConfirmApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-财务确认')) {
             return ['success'=>false,'error'=>'没有对应权限'];
@@ -733,7 +734,7 @@ class OrderIssueController extends Controller
         }
     }
 
-    public function archiveOrderIssueApi(Request $request)
+    public function archiveOrderIssueApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
         if(!$request->has('ids'))return ['success'=>false,'error'=>'没有勾选问题件'];
@@ -751,7 +752,7 @@ class OrderIssueController extends Controller
         return ['success' =>true];
     }
 
-    public function addUserWorkgroup(Request $request)
+    public function addUserWorkgroup(Request $request): array
     {
         $orderIssueId = $request->orderIssueId;
         $userWorkgroupId = $request->userWorkgroupId;
@@ -762,7 +763,7 @@ class OrderIssueController extends Controller
         }
         return ['success' => true,'data' =>UserWorkgroup::find($userWorkgroupId)];
     }
-    public function destroyUserWorkgroup(Request $request)
+    public function destroyUserWorkgroup(Request $request): array
     {
         $orderIssueId = $request->orderIssueId;
         $userWorkgroupId = $request->userWorkgroupId;
@@ -797,7 +798,7 @@ class OrderIssueController extends Controller
         return ['success' => true];
     }
 
-    public function destroySecondLogisticNumberApi(Request $request)
+    public function destroySecondLogisticNumberApi(Request $request): array
     {
         if (!Gate::allows('订单管理-问题件-编辑')) return ['success'=>false,'error'=>'没有对应权限'];
         $count = OrderIssue::query()->where("id",$request->id)->update(["second_logistic_number"=>'']);

+ 73 - 101
app/OrderIssue.php

@@ -7,6 +7,10 @@ use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Database\Eloquent\Relations\HasOne;
+
 
 use App\Traits\ModelLogChanging;
 
@@ -23,7 +27,7 @@ class OrderIssue extends Model
     use SoftDeletes;
 
     protected $fillable = [
-        'order_id', 'created_at', 'rejected_bill_id',
+        'order_id', 'created_at', 'rejected_bill_id','user_owner_group_id',
         'rejecting_status', 'result_explain','logistic_number_return',
         'situation_explain', 'order_issue_type_id', 'second_order_id',
         'is_new_rejecting','second_client_no','second_logistic_number',
@@ -47,42 +51,47 @@ class OrderIssue extends Model
      */
     protected $appends = [];
 
-    public function order()
+    public function order(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(Order::class, 'order_id', 'id');
     }
 
-    public function rejectedBills()
+    public function rejectedBills(): BelongsToMany
     {
         return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return');
     }
 
-    public function orderIssueRejectedBills()
+    public function orderIssueRejectedBills(): HasMany
     {
         return $this->hasMany(OrderIssueRejectedBill::class);
     }
 
-    public function issueType()
+    public function issueType(): BelongsTo
     {
         return $this->belongsTo('App\OrderIssueType', 'order_issue_type_id', 'id');
     }
 
-    public function logs()
+    public function logs(): HasMany
     {
         return $this->hasMany('App\OrderIssueProcessLog', 'order_issue_id', 'id');
     }
 
-    public function top()
+    public function top(): HasOne
     {
         return $this->hasOne('App\OrderIssueOnTop', 'order_issue_id', 'id');
     }
 
-    public function userWorkGroup()
+    public function userWorkGroup(): BelongsTo
     {
         return $this->belongsTo('App\UserWorkgroup', 'user_workgroup_id', 'id');
     }
 
-    public function secondOrder()
+    public function userOwnerGroup(): BelongsTo
+    {
+        return $this->belongsTo(UserOwnerGroup::class);
+    }
+
+    public function secondOrder(): HasOne
     {
         return $this->hasOne('App\Order', 'client_code', 'second_client_no');
     }
@@ -97,7 +106,7 @@ class OrderIssue extends Model
         return $this->logs->where('type', '结束')->last();
     }
 
-    public function getProcessingTimeAttribute()
+    public function getProcessingTimeAttribute(): ?string
     {
         $createLogs = $this->getCreateLogAttribute();
         $endLogs = $this->getEndLogAttribute();
@@ -125,103 +134,66 @@ class OrderIssue extends Model
      */
     public function syncRejectingStatus()
     {
-        if(!$this->order_id)return;
-        $rejectedItems = [];
-        $orderItems = [];
-        $rejectedBills = $this->rejectedBills;
-        if(!$rejectedBills)return;
-        $rejectedBillItems = RejectedBillItem::query()->with('quality')
-            ->whereIn('id_rejected_bill',function($query)use($rejectedBills){
-                $query->from('rejected_bills')->select('id')->whereIn('logistic_number_return',$rejectedBills->map(function($rejectedBil){
-                    return $rejectedBil->logistic_number_return;
-                }));
-        })->get();
-
-        if($rejectedBillItems->count()===0){
-            $this->update(['rejecting_status' => '未退回']);
-            return;
-        }
+        $this->syncRejectedBillStatus($this);
+    }
 
-        if($rejectedBillItems->where('quality.name','残次')->count()>0){
-            $this->update(['rejecting_status' => '差异退回']);
-            return;
-        }
-        $barcodeGoods = data_get($rejectedBillItems,'*.barcode_goods');
-        $commodityBarcodes = CommodityBarcode::query()->with('commodity')->whereIn('code',$barcodeGoods)->get();
-        $commodities = Commodity::query()->whereIn('sku',$barcodeGoods)->get();
-
-        foreach ($rejectedBillItems as $item) {
-            $barcode_goods = (string)$item->barcode_goods;
-            $commodity = $commodities->where('sku',$barcode_goods)->first();
-            if(!$commodity){
-                $commodityBarcode = $commodityBarcodes->where('code',$barcode_goods)->first();
-                $barcode_goods = $commodityBarcode->commodity->sku ?? $barcode_goods;
-            }
-            if (!isset($rejectedItems[$barcode_goods])){
-                $rejectedItems[$barcode_goods] = 0;
-            }
-            $rejectedItems[(string)$barcode_goods] += $item->amount;
+    public function syncRejectedBillStatus($orderIssue)
+    {
+        if (!$orderIssue->order_id) return;
+        $orderIssueMap = [];
+        $rejectedMap = [];
+        $owner_id = $orderIssue->order->owner_id;
+
+        // 获取对应订单的所有商品
+        $orderPackageQuery = OrderPackage::query()->selectRaw("id")->where('order_id', $orderIssue->order_id);
+        $orderPackageCommodities = OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageQuery)->get();
+        foreach ($orderPackageCommodities as $orderPackageCommodity) {
+            $code = $orderPackageCommodity->commodity->sku;
+            if (empty($orderIssueMap[$code])) $orderIssueMap[$code] = $orderPackageCommodity->amount;
+            else $orderIssueMap[$code] += $orderPackageCommodity->amount;
         }
 
-        $items = OrderPackageCommodities::query()->with('commodity')
-            ->whereIn('order_package_id',function($query){
-                $query->from('order_packages')->selectRaw('id')->where('order_id',$this->order_id);
-            })->get();
-
-        if(count($items) == 0){
-            $this->update(['rejecting_status' => '无']);
-            return;
-        }
-        if (count($items) > 0) {
-            foreach ($items as $item) {
-                $sku = $item['commodity']['sku'];
-                if (! isset($orderItems[$sku]) ?? false){
-                    $orderItems[$sku] = 0;
+        // 获取对应退回单的所有商品
+        $orderIssueRejectedBillQuery = OrderIssueRejectedBill::query()->selectRaw("logistic_number_return")->where("order_issue_id", $orderIssue->id);
+        $RejectedBills = RejectedBill::query()->with('items.quality')->whereIn("logistic_number_return", $orderIssueRejectedBillQuery)->get();
+        /** @var RejectedBill $rejectedBill */
+        foreach ($RejectedBills as $rejectedBill) {
+            foreach ($rejectedBill->items as $item) {
+                $code = $item->barcode_goods;
+                $exists = Commodity::query()->where("sku", $code)->where('owner_id',$owner_id)->exists();
+                if (!$exists) {
+                    $commodityBarcode = CommodityBarcode::query()->with(['commodity' => function ($query) use ($owner_id) {
+                        /** @var Builder $query */
+                        $query->where('owner_id', $owner_id)->whereNotNull('sku');
+                    }])->where('code', $code)->first();
+                    if($commodityBarcode && $commodityBarcode->commodity) $code = $commodityBarcode->commodity->sku;
                 }
-                $orderItems[$sku] += $item->amount;
+                $qualityName = $item->quality->name;
+                if (empty($rejectedMap[$code]) || empty($rejectedMap[$code][$qualityName])) $rejectedMap[$code][$qualityName] = $item->amount;
+                else $rejectedMap[$code][$qualityName] += $item->amount;
             }
-        } else {
-            $this->update(['rejecting_status' => '无']);
-            return;
-        }
-        $rejectedExcess = 0;    // 退回差异
-        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
-        foreach ($rejectedItems as $key => $items) {
-            if ($orderItems[$key] ?? false) {
-                if ($rejectedItems[$key] == $orderItems[$key])
-                    $rejectedReview++;
-            } else
-                $rejectedExcess++;
-        }
-        if ($rejectedExcess > 0) {
-            $this->update(['rejecting_status' => '差异退回']);
-            return;
-        }
-        // 全部退回 部分退回 超量退回 差异退回 未退回 无
-        $isExcess = 0; // 超量 $orderItems < $rejectedItems
-        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
-        $isAccord = 0; // 相同 $orderItems == $rejectedItems
-        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
-        foreach ($orderItems as $key => $item) {
-            if ($rejectedItems[$key] ?? false) {
-                if ($orderItems[$key] < $rejectedItems[$key])
-                    $isExcess++;
-                else if ($orderItems[$key] > $rejectedItems[$key])
-                    $isDiff++;
-                else if ($orderItems[$key] == $rejectedItems[$key])
-                    $isAccord++;
-            } else
-                $isLack++;
         }
+        // 比较
+        $status = $this->getRejectingStatus($orderIssueMap, $rejectedMap);
+        $this->update(['rejecting_status' => $status]);
+    }
 
-        if($isAccord == $rejectedReview && $isLack == 0 && $isExcess == 0 && $isDiff==0 && $rejectedExcess == 0 )
-            $this->update(['rejecting_status' => '全部退回']);
-        else if($isExcess > 0 && $isAccord ==  $rejectedReview && $isDiff == 0 && $isLack == 0)
-            $this->update(['rejecting_status' => '超量退回']);
-        else if($isDiff >=0 && $isAccord == $rejectedReview && $isLack >=0 && $rejectedExcess ==0 && $isExcess==0)
-            $this->update(['rejecting_status' => '部分退回']);
-        else if($isLack >= 0 && $rejectedExcess>=0 && $isDiff>=0 && $isLack>=0 && $isExcess>=0 && $rejectedReview>=0)
-            $this->update(['rejecting_status' => '差异退回']);
+    private function getRejectingStatus($orderIssueMap, $rejectedMap): string
+    {
+        //未退回,差异退回,全部退回,超量退回,部分退回
+        if (count($rejectedMap) == 0) return "未退回";
+        $equal = 0;
+        $portion = 0;
+        foreach ($rejectedMap as $key => $map) {
+            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
+            if (empty($orderIssueMap[$key])) return "差异退回";
+            if ($rejectedMap[$key]['正品'] < $orderIssueMap[$key]) $portion += 1;
+            if ($rejectedMap[$key]['正品'] > $orderIssueMap[$key]) return "超量退回";                    // 超量退回
+            if ($rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
+        }
+        if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
+        if ($portion > 0) return "部分退回";                                                            // 部分退回
+        return "无";
     }
 
     public function delete()
@@ -321,7 +293,7 @@ class OrderIssue extends Model
             $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']);
         },'orderIssueRejectedBills.rejectedBill'=>function($query){
             $query->with(['owner','logistic','user','items.quality']);
-        },'userWorkgroups']);
+        },'userWorkgroups','userOwnerGroup']);
 
     }
 

+ 23 - 4
app/Services/WaybillService.php

@@ -4,6 +4,7 @@ namespace App\Services;
 
 use App\OwnerFeeDetail;
 use App\Services\common\QueryService;
+use App\Traits\ModelSearchWay;
 use App\Waybill;
 use App\WaybillAuditLog;
 use Illuminate\Database\Eloquent\Builder;
@@ -17,6 +18,7 @@ use App\Traits\ServiceAppAop;
 class WaybillService
 {
     use ServiceAppAop;
+    use ModelSearchWay;
     protected $modelClass=Waybill::class;
     /**
      * @param array $param
@@ -75,12 +77,29 @@ class WaybillService
             });
             unset($param["recipient_mobile"]);
         }
+
+        if($param['carrier_bill'] ?? false){    // 承运商单号
+            $this->searchWay($waybills,$param['carrier_bill'],'waybills.carrier_bill');
+            unset($param['carrier_bill']);
+        }
+        if($param['waybill_number'] ?? false) { // 运单号
+            $this->searchWay($waybills,$param['waybill_number'],'waybills.waybill_number');
+            unset($param['waybill_number']);
+        }
+        if($param['source_bill'] ?? false) {// 上游单号
+            $this->searchWay($waybills,$param['source_bill'],'waybills.source_bill');
+            unset($param['source_bill']);
+        }
+        if($param['wms_bill_number']?? false){ // wms单号
+            $this->searchWay($waybills,$param['wms_bill_number'],'waybills.wms_bill_number');
+            unset($param['wms_bill_number']);
+        }
         $columnQueryRules=[
-            'waybill_number' => ['like' => ''],
-            'carrier_bill' => ['like' => ''],
-            'wms_bill_number' => ['like' => ''],
+//            'waybill_number' => ['like' => ''],
+//            'carrier_bill' => ['like' => ''],
+//            'wms_bill_number' => ['like' => ''],
             'origination' => ['like' => ''],
-            'source_bill' => ['like' => ''],
+//            'source_bill' => ['like' => ''],
             'car_owner_info' => ['like' => ''],
             'created_at_start' => ['alias' => 'created_at' , 'startDate' => ':00'],
             'created_at_end' => ['alias' => 'created_at' , 'endDate' => ':59'],

+ 26 - 0
app/Traits/ModelSearchWay.php

@@ -0,0 +1,26 @@
+<?php
+
+
+namespace App\Traits;
+
+
+trait ModelSearchWay
+{
+    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;
+    }
+}

+ 15 - 0
database/factories/CommodityBarcodeFactory.php

@@ -0,0 +1,15 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\CommodityBarcode;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(CommodityBarcode::class, function (Faker $faker) {
+    return [
+        'code'=> $faker->title(10).$faker->uuid,
+        'commodity_id'=>$faker->numberBetween(10,150000),
+        'created_at'=> now(),
+    ];
+});

+ 2 - 1
database/factories/OrderFactory.php

@@ -22,6 +22,7 @@ $factory->define(Order::class, function (Faker $faker) {
         'district'=>$faker->secondaryAddress,
         'address' => $faker->address,
         'wms_status' => $wms_status[rand(0,2)],
-        'wms_edittime' => $faker->dateTimeBetween( '-30 hour', 'now',  null)
+        'wms_edittime' => $faker->dateTimeBetween( '-30 hour', 'now',  null),
+        'owner_id' => $faker->numberBetween(0,10)
     ];
 });

+ 1 - 1
database/factories/OrderIssueFactory.php

@@ -17,7 +17,7 @@ $factory->define(OrderIssue::class, function (Faker $faker) {
         'order_id' =>function(){
             return factory(\App\Order::class)->create()->id;
         },
-        'created_at' => $faker->date('y-m-d'),
+        'created_at' => now(),
         'rejected_bill_id' => 0,
         'rejecting_status' => $rejecting_status[rand(0,count($rejecting_status)-1)],
         'result_explain' => $faker->text(20),

+ 27 - 0
database/factories/RejectedBillFactory.php

@@ -0,0 +1,27 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\RejectedBill;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(RejectedBill::class, function (Faker $faker) {
+    return [
+        'id_owner' => $faker->numberBetween(0),
+        'order_number' =>$faker->title(10),
+        'sender' => $faker->name,
+        'mobile_sender' => $faker->phoneNumber,
+        'logistic_number' => $faker->name,
+        'logistic_number_return' => $faker->name(2).$faker->numberBetween(100000000,999999999),
+        'id_logistic_return' => $faker->numberBetween(),
+//        'is_loaded' => null,
+        'fee_collected' => null,
+        'remark' => null,
+        'id_operator' => null,
+        'is_checked' => false,
+        'is_finished' => null,
+        'checked_numbers' => null,
+        'common_01' => null
+    ];
+});

+ 23 - 0
database/factories/RejectedBillItemFactory.php

@@ -0,0 +1,23 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\RejectedBillItem;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(RejectedBillItem::class, function (Faker $faker) {
+    return [
+        'id_rejected_bill' => $faker->numberBetween(0),
+        'barcode_goods' => $faker->colorName,
+        'name_goods' => $faker->name,
+        'amount' => $faker->numberBetween(0, 10),
+        'id_quality_label' => 1,
+        'batch_number' => null,
+        'validity_at' => null,
+        'made_at' => null,
+//        'is_checked' => null,
+        'remark' => null,
+        'is_loaded' => null
+    ];
+});

+ 33 - 0
database/migrations/2021_03_23_091700_add_order_issue_user_owner_group.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOrderIssueUserOwnerGroup extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_issues',function(Blueprint $table){
+            $table->integer('user_owner_group_id')->comment('项目组');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+        Schema::table('order_issues',function(Blueprint $table) {
+            $table->dropColumn('user_owner_group_id');
+        });
+    }
+}

+ 10 - 0
resources/views/order/issue/edit.blade.php

@@ -133,6 +133,15 @@
                         </select>
                     </div>
                 </div>
+                <div class="form-group row">
+                    <label class="col-2 col-form-label text-right">事故责任方</label>
+                    <div class="col-8">
+                        <select name="user_owner_group_id" class="form-control" id="user_owner_group_id" v-model="orderIssues.user_owner_group_id">
+                            <option value></option>
+                            <option v-for="userOwnerGroup in userOwnerGroups" :value="userOwnerGroup.id">@{{ userOwnerGroup.name }}</option>
+                        </select>
+                    </div>
+                </div>
                 <div class="form-group row">
                     <label class="col-2 col-form-label text-right"></label>
                     <div class="col-8">
@@ -158,6 +167,7 @@
                 owners:{!! $owners  !!},
                 logistics:{!! $logistics !!},
                 userWorkgroup: {!! $userWorkgroup !!},
+                userOwnerGroups:{!! $userOwnerGroups !!},
                 shops:{!! $shops !!},
                 orderIssueType:{!! $orderIssueType !!},
                 rejectingStatus: ['无', '未退回', '全部退回', '部分退回', '差异退回', '超量退回'],

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

@@ -160,7 +160,8 @@
                         <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>
                         @cannot('订单管理-问题件-客户不可见')
-                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 200px">事故责任方</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 200px">仓库组责任方</th>
+                        <th class="three-layer  align-middle" rowspan="2" style="min-width: 200px">项目组责任方</th>
                         <th class="align-middle" rowspan="2" style="min-width: 120px">操作</th>
                         @endcannot
                     </tr>
@@ -580,6 +581,16 @@
                                 </table>
 
                             </td>
+                        <td>
+                            @can('订单管理-问题件-编辑')
+                                <select v-model="orderIssue.user_owner_group_id" class="form-control form-control-sm" @change="updateOrderIssue(orderIssue,'user_owner_group_id',$event)">
+                                    <option ></option>
+                                    <option v-for="(userOwnerGroup,index) in userOwnerGroups" :value="userOwnerGroup.name">@{{ userOwnerGroup.value }}</option>
+                                </select>
+                            @else
+                                @{{ orderIssue.user_owner_group ?? orderIssue.user_owner_group.name : '' }}
+                            @endcan
+                        </td>
                             <td>
                                 @can('订单管理-问题件-编辑')
                                     <a :href="'edit/'+orderIssue.id"  class="btn btn-sm btn-outline-primary" target="_blank">改</a>
@@ -778,6 +789,7 @@
                         @foreach($userWorkgroup as $item)
                     {name:{{$item->id}},value:'{{$item->name}}'},
                     @endforeach],
+                userOwnerGroups:{!! $userOwnerGroups !!},
                 rejectingStatus: [
                     {name:'无',value:'无'},
                     {name:'未退回',value:'未退回'},
@@ -826,6 +838,9 @@
                     _this.regroupLogs(orderIssue);
                     _this.regroupUserGroup(orderIssue);
                 });
+                this.userOwnerGroups.forEach(function(item,index,array){
+                    array[index] = {name:item.id,value:item.name};
+                });
             },
             mounted: function () {
                 $(".tooltipTarget").tooltip({'trigger':'hover'});
@@ -903,6 +918,7 @@
                     {name: 'rejectingStatus', type: 'select', tip: '退单状态',placeholder: '退单状态',data:this.rejectingStatus},
                     {name: 'sendOrderClientCode', type: 'input', tip: '二次客户订单号',placeholder: '二次客户订单号'},
                     {name: 'sendOrderLogisticNumber', type: 'input', tip: '二次运单号',placeholder: '二次运单号'},
+                    {name: 'user_owner_group_id', type: 'select', tip: '项目责任方',placeholder: '项目责任方',data:this.userOwnerGroups},
                 ]];
                 this.form = new query({
                     el: '#form_div',

+ 92 - 0
tests/old/OrderIssueTest.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace Tests\Unit;
+
+use App\Authority;
+use App\Commodity;
+use App\CommodityBarcode;
+use App\MeasuringMachine;
+use App\Order;
+use App\OrderIssue;
+use App\OrderIssueRejectedBill;
+use App\OrderPackage;
+use App\OrderPackageCommodities;
+use App\RejectedBill;
+use App\RejectedBillItem;
+use App\Role;
+use App\User;
+use Illuminate\Support\Facades\DB;
+use Tests\TestCase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use function Matrix\add;
+
+class OrderIssueTest extends TestCase
+{
+
+    public function getTestResult()
+    {
+        $orderIssue = factory(OrderIssue::class)->create(['rejecting_status' => '未退回']);
+        $orderPackage = factory(OrderPackage::class)->create(['order_id' => $orderIssue->order->id]);
+        $commodities = factory(Commodity::class)->times(3)->create(['owner_id' => $orderIssue->order->owner_id]);
+        $orderPackageCommodities = collect();
+        $commodities_barcodes = collect();
+        foreach ($commodities as $commodity) {
+            $commodities_barcode = factory(CommodityBarcode::class)->create(['commodity_id' => $commodity->id]);
+            $commodities_barcodes->push($commodities_barcode);
+            $orderPackageCommodity = factory(OrderPackageCommodities::class)->create(['order_package_id' => $orderPackage->id, 'amount' => 1, 'commodity_id' => $commodity->id]);
+            $orderPackageCommodities->push($orderPackageCommodity);
+        }
+        $rejectedBill = factory(RejectedBill::class)->create(['logistic_number_return' => $orderIssue->logistic_number_return]);
+        $rejectedBill_items = collect();
+        foreach ($commodities_barcodes as $commodities_barcode) {
+            $item = factory(RejectedBillItem::class)->create(['id_rejected_bill' => $rejectedBill->id, 'barcode_goods' => $commodities_barcode->code, 'amount' => 1]);
+            $rejectedBill_items->push($item);
+        }
+        $orderIssueRejectedBill = factory(OrderIssueRejectedBill::class)->create(['order_issue_id' => $orderIssue->id, 'logistic_number_return' => $rejectedBill->logistic_number_return]);
+        return [
+            'orderIssue' => $orderIssue,
+            'orderPackage' => $orderPackage,
+            'commodities' => $commodities,
+            'orderPackageCommodities' => $orderPackageCommodities,
+            'rejectedBill' => $rejectedBill,
+            'rejectedBill_items' => $rejectedBill_items,
+        ];
+    }
+
+    public function destroyResult(array $arr)
+    {
+        if($arr['orderIssue']){
+            $arr['orderIssue']->order->delete();
+            $arr['orderIssue']->delete();
+        }
+        if($arr['orderPackage'])$arr['orderPackage']->delete();
+        if($arr['commodities']){
+            foreach ($arr['commodities'] as $commodity) {
+                CommodityBarcode::query()->where('commodity_id',$commodity->id)->delete();
+                $commodity->delete();
+            }
+        }
+        if($arr['rejectedBill'])$arr['rejectedBill']->delete();
+        if($arr['rejectedBill_items']){
+            foreach ($arr['rejectedBill_items'] as $rejectedBill_item) {
+                $rejectedBill_item->delete();
+            }
+        }
+        OrderIssueRejectedBill::query()->where('Order_Issue_Id',$arr['orderIssue']->id)->delete();
+    }
+
+
+    public function testSyncRejectingStatusComparisonIsEqual()
+    {
+        $arr = $this->getTestResult();
+        $orderIssue = $arr['orderIssue'];
+        $orderIssue->syncRejectingStatus();
+        $orderIssue->refresh();
+        $this->assertEquals($orderIssue->rejecting_status, "全部退回");
+        $this->destroyResult($arr);
+    }
+
+
+
+}

+ 19 - 0
yarn.lock

@@ -1376,6 +1376,11 @@ base64-arraybuffer@0.1.5:
   resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
   integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
 
+base64-arraybuffer@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45"
+  integrity sha1-S5RPrAGRqlkHr+LYyZnMxXzoD0U=
+
 base64-js@^1.0.2:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
@@ -2275,6 +2280,13 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
+css-line-break@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/css-line-break/download/css-line-break-1.1.1.tgz#d5e9bdd297840099eb0503c7310fd34927a026ef"
+  integrity sha1-1em90peEAJnrBQPHMQ/TSSegJu8=
+  dependencies:
+    base64-arraybuffer "^0.2.0"
+
 css-loader@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
@@ -3686,6 +3698,13 @@ html-minifier@^3.5.8:
     relateurl "0.2.x"
     uglify-js "3.4.x"
 
+html2canvas@^1.0.0-rc.7:
+  version "1.0.0-rc.7"
+  resolved "https://registry.npm.taobao.org/html2canvas/download/html2canvas-1.0.0-rc.7.tgz#70c159ce0e63954a91169531894d08ad5627ac98"
+  integrity sha1-cMFZzg5jlUqRFpUxiU0IrVYnrJg=
+  dependencies:
+    css-line-break "1.1.1"
+
 http-deceiver@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"