| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <?php
- namespace App\Services;
- use App\Commodity;
- use App\CommodityBarcode;
- use App\Order;
- use App\OrderDetail;
- use App\OrderIssueRejectedBill;
- use App\OrderIssueType;
- use App\RejectedBill;
- use App\RejectedBillItem;
- use App\WorkOrder;
- use App\WorkOrderDetail;
- class OrderRejectingStatusService
- {
- //计算退回件问题
- public function rejectedBillSyncRejectingStatus(RejectedBill $rejectedBill)
- {
- $query = OrderIssueRejectedBill::query()->select('order_id')->where('logistic_number_return', $rejectedBill->logistic_number_return);
- $order = Order::query()->whereIn('id', $query)->first();
- $this->syncRejectingStatus($order);
- }
- /**
- * 订单同步退回状态
- */
- public function syncRejectingStatus($order)
- {
- if (!$order) return;
- $rejecting_status = $this->getOrderRejectingStatus($order);
- $query = OrderDetail::query()->where('order_id', $order->id);
- $order_detail = $query->first();
- $is_new_rejecting = in_array($rejecting_status, ['无', '未退回']) ? '无' : '有';
- if (!$order_detail) {
- try {
- OrderDetail::query()->create(
- ['order_id' => $order->id, 'is_new_rejecting' => $is_new_rejecting, 'rejecting_status' => $rejecting_status]
- );
- } catch (\Exception $e) {
- LogService::log(__CLASS__, __METHOD__, $e->getMessage());
- }
- return;
- }
- if (in_array($order_detail->is_new_rejecting, ['有', '已处理']) && $rejecting_status != '无') {
- $query->update(['rejecting_status' => $rejecting_status]);
- } else {
- $query->update(['rejecting_status' => $rejecting_status, 'is_new_rejecting' => $is_new_rejecting]);
- }
- if ($rejecting_status == '全部退回') {
- $orderIssueTypeQuery = OrderIssueType::query()->select('id')->where('name','拦截');
- $workOrder = WorkOrder::query()->where('order_id',$order->id)
- ->whereIn('order_issue_type_id',$orderIssueTypeQuery)->where('status','!=',6)->first();
- if($workOrder){
- app(WorkOrderInterceptService::class)->autoReviewIntercept($workOrder);
- }
- }
- }
- public function getOrderRejectingStatus(Order $order): string
- {
- $rejected_bill_item_map = $this->getRejectedBillMaps($order);
- $order_commodity_map = $this->getOrderCommodityMap($order);
- return $this->computerRejectingStatus($rejected_bill_item_map, $order_commodity_map);
- }
- private function getRejectedBillItems(Order $order)
- {
- $orderIssueRejectedBills = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id)->where('logistic_number_return', '!=', '')->get();
- $logistic_number_return = $orderIssueRejectedBills->map(function ($item) {
- return $item->logistic_number_return;
- })->toArray();
- $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $logistic_number_return);
- return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill', $query)->get();
- }
- private function getRejectedBillMaps($order): array
- {
- $rejected_bill_items = $this->getRejectedBillItems($order);
- $map = [];
- if (count($rejected_bill_items) == 0) return $map;
- foreach ($rejected_bill_items as $item) {
- $code = $item->barcode_goods;
- $amount = $item->amount;
- if (!Commodity::query()->where("sku", $code)->where('owner_id', $order->owner_id)->exists()) {
- $query = CommodityBarcode::query()->select('commodity_id')->where('code', $code);
- $commodity = Commodity::query()->where('owner_id', $order->owner_id)->whereIn('id', $query)->first();
- if ($commodity) $code = $commodity->sku;
- }
- $quality_name = $item->quality->name;
- if ($map[$code][$quality_name] ?? false) $map[$code][$quality_name] += $amount;
- else $map[$code][$quality_name] = $amount;
- }
- return $map;
- }
- private function getOrderCommodityMap(Order $order): array
- {
- $map = [];
- $order->packages->each(function ($package) use ($order, &$map) {
- $package->commodities->map(function ($item) use ($order, &$map) {
- $sku = $item->commodity->sku ?? null;
- if ($sku) {
- $amount = $item->amount;
- empty($map[$sku]) ? $map[$sku] = $amount : $map[$sku] += $amount;
- }
- });
- });
- return $map;
- }
- private function computerRejectingStatus(array $rejected_bill_item_map, array $order_commodity_map): string
- {
- //未退回,差异退回,全部退回,超量退回,部分退回
- if (count($rejected_bill_item_map) == 0) return "未退回";
- $equal = 0; // 相等sku
- $portion = 0; // 相等的sku
- foreach ($rejected_bill_item_map as $key => $map) {
- if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
- if (empty($order_commodity_map[$key])) return "差异退回";
- if (isset($map['正品']) && isset($order_commodity_map[$key])) {
- if ($map['正品'] < $order_commodity_map[$key]) $portion += 1;
- if ($map['正品'] > $order_commodity_map[$key]) return "超量退回";
- if ($map['正品'] == $order_commodity_map[$key]) $equal += 1;
- }
- }
- if ($equal == count($rejected_bill_item_map)
- && $equal == count($order_commodity_map)
- && $portion == 0) return "全部退回"; // 全部退回
- if ($portion > 0) return "部分退回";
- if (count(array_diff_key($order_commodity_map, $rejected_bill_item_map)) > 0) return '部分退回';
- if (count(array_diff_key($rejected_bill_item_map, $order_commodity_map)) > 0) return '差异退回';
- return "无";
- }
- }
|