belongsTo(Order::class, 'order_id', 'id'); } public function rejectedBills() { return $this->belongsToMany(RejectedBill::class,'order_issue_rejected_bill','order_issue_id','logistic_number_return','id','logistic_number_return'); } public function orderIssueRejectedBills() { return $this->hasMany(OrderIssueRejectedBill::class); } public function issueType() { return $this->belongsTo('App\OrderIssueType', 'order_issue_type_id', 'id'); } public function logs() { return $this->hasMany('App\OrderIssueProcessLog', 'order_issue_id', 'id'); } public function top() { return $this->hasOne('App\OrderIssueOnTop', 'order_issue_id', 'id'); } public function userWorkGroup() { return $this->belongsTo('App\UserWorkgroup', 'user_workgroup_id', 'id'); } public function secondOrder() { return $this->hasOne('App\Order', 'client_code', 'second_client_no'); } public function getCreateLogAttribute() { return $this->logs->where('type', '创建')->first(); } public function getEndLogAttribute() { return $this->logs->where('type', '结束')->last(); } public function getProcessingTimeAttribute() { $createLogs = $this->getCreateLogAttribute(); $endLogs = $this->getEndLogAttribute(); if (($createLogs ?? false) && ($endLogs ?? false)) { $time = date_diff($createLogs->created_at, $endLogs->created_at); return $time->format('%a天, %h小时'); } return null; } public function getCreateUserAttribute() { $createLog = $this->getCreateLogAttribute(); return $createLog->user->name ?? ''; } public function getEndUserAttribute() { $createLog = $this->getEndLogAttribute(); return $createLog->user->name ?? ''; } /** * 同步退货状态 */ 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; } 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; } $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; } $orderItems[$sku] += $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++; } 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' => '差异退回']); } public function delete() { $this->logs()->delete(); $this->top()->delete(); return parent::delete(); } public function deleteSafe() { return parent::delete(); } /** * 同步退货单号 */ public function syncRejectedBills() { $order_packages = $this->order->packages; if($order_packages){ foreach ($order_packages as $order_package) { $logistic_number = $order_package->logistic_number; $rejectedBill = RejectedBill::query()->where('logistic_number_return',$logistic_number)->first(); if($rejectedBill){ if(OrderIssueRejectedBill::isExit($this->id,$logistic_number))continue; $this->joinRejectedBill($logistic_number); if(isset($rejectedBill->items)) $this->is_new_rejecting = '有'; } } $this->save(); } } public function syncRejected($logistic_number) { $query = RejectedBill::query()->selectRaw('id'); if(is_array($logistic_number)){ $query->whereIn('logistic_number_return',$logistic_number); }elseif (is_string($logistic_number)){ $query->where('logistic_number_return',$logistic_number); }else return; $items = RejectedBillItem::query()->whereIn('id_rejected_bill',$query); if($items->count() > 0) $this->update(['is_new_rejecting'=>'有']); elseif($items->count() == 0) $this->update(['is_new_rejecting'=>'无']); } /** * @param array|string $logistic_number * @return array|void */ public function joinRejectedBill($logistic_number) { if(!$logistic_number)return null; $this->syncRejected($logistic_number); if(is_array($logistic_number)){ return $this->rejectedBills()->sync($logistic_number,false); } return $this->rejectedBills()->attach($logistic_number); } public function unJoinRejectedBill($logistic_number) { return $this->rejectedBills()->detach($logistic_number); } public function reviseJoinRejectedBill($logistic_number,$logistic_number_update) { return $this->rejectedBills()->updateExistingPivot($logistic_number,['logistic_number_return'=>$logistic_number_update]); } public function scopeFilter($query, $filters) { return $filters->apply($query); } public function scopeDefaultWith($query) { $this->scopeJsonWith($query); return $query->with(['top']) ->selectRaw('order_issues.* ,order_issue_on_tops.id top_id ,order_issue_on_tops.remark,order_issue_on_tops.updated_at top_update') ->leftJoin('order_issue_on_tops', 'order_issue_on_tops.order_issue_id', '=', 'order_issues.id') ->whereNull('order_issue_on_tops.deleted_at') ->orderBy('order_issue_on_tops.updated_at', 'desc') ->orderBy('order_issues.id', 'desc'); } public function scopeJsonWith($query) { return $query->with(['issueType', 'logs' => function ($query){ $query->with('user')->orderByDesc('created_at'); },'order'=>function($query){ $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']); },'secondOrder'=>function($query){ $query->with(['shop', 'logistic', 'owner', 'packages.commodities.commodity.barcodes']); },'orderIssueRejectedBills.rejectedBill'=>function($query){ $query->with(['owner','logistic','user','items.quality']); },'userWorkgroups']); } public function userWorkgroups(): BelongsToMany { return $this->belongsToMany(UserWorkgroup::class); } }