| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace App\Services;
- use App\Commodity;
- use App\CommodityBarcode;
- use App\OracleDOCOrderHeader;
- use App\Order;
- use App\OrderIssue;
- use App\OrderIssueRejectedBill;
- use App\OrderPackage;
- use App\RejectedBill;
- use App\RejectedBillItem;
- use App\WorkOrder;
- class RejectedBillSyncOrderService
- {
- public function syncRejectingStatusByReturnLogisticNumber($returnLogisticNumber){
- /** @var RejectedBill $rejected_bill */
- $rejected_bill = RejectedBill::query()->where('logistic_number_return',$returnLogisticNumber)->first();
- if(!$rejected_bill) return;
- $this->rejectedBillSyncOrderIssue($rejected_bill);
- $this->syncRejectingStatus($rejected_bill);
- }
- public function syncRejectingStatus(RejectedBill $rejectedBill)
- {
- /** @var Order $order */
- $order = $this->getCorrespondOrder($rejectedBill);
- if(!$order) return;
- $rejecting_status = $this->getOrderRejectingStatus($order);
- $this->syncOrderRejectingStatus($order,$rejecting_status);
- }
- private function syncOrderRejectingStatus(Order $order,$rejecting_status){
- OrderIssue::query()->where('order_id',$order->id)->update(['rejecting_status' => $rejecting_status,'is_new_rejecting' => 1]);
- WorkOrder::query()->where('order_id',$order->id)->update(['rejecting_status' => $rejecting_status,'is_new_rejecting' => 1]);
- }
- public function orderIssueSyncRejectingStatus(OrderIssue $orderIssue){
- $order = $orderIssue->order;
- if (!$order) return;
- $this->orderIssueSyncRejectedBills($orderIssue);
- $rejecting_status = $this->getOrderRejectingStatus($order);
- $this->syncOrderRejectingStatus($order,$rejecting_status);
- }
- public function getOrderRejectingStatus(Order $order): string
- {
- $rejected_bill_items = $this->getRejectedBillItems($order);
- $rejected_bill_item_map = $this->getRejectedBillMaps($rejected_bill_items,$order);
- $order_commodity_map = $this->getOrderCommodityMap($order);
- return $this->computerRejectingStatus($rejected_bill_item_map,$order_commodity_map);
- }
- private function getCorrespondOrder(RejectedBill $rejectedBill)
- {
- return $this->getCorrespondOrderByRejectedBill($rejectedBill) ??
- ($this->getCorrespondOrderByOrderIssueRejectedBill($rejectedBill) ??
- $this->getCorrespondOrderByOracleOrderHeader($rejectedBill));
- }
- private function getCorrespondOrderByRejectedBill(RejectedBill $rejectedBill)
- {
- return Order::query()->with('packages.commodities.commodity')->whereHas('packages', function ($query) use ($rejectedBill) {
- $query->where('logistic_number', $rejectedBill->logistic_number_return);
- })->first();
- }
- private function getCorrespondOrderByOrderIssueRejectedBill(RejectedBill $rejectedBill)
- {
- if (!$rejectedBill) return null;
- $order_issue_rejected_bill_query = OrderIssueRejectedBill::query()
- ->select('order_issue_id')->where('logistic_number_return',$rejectedBill->logistic_number_return);
- $order_issue_query = OrderIssue::query()
- ->select('order_id')->whereIn('order_issue_id',$order_issue_rejected_bill_query);
- return Order::query()->with('packages.commodities.commodity')->whereIn('id', $order_issue_query)->first();
- }
- private function getCorrespondOrderByOracleOrderHeader(RejectedBill $rejectedBill)
- {
- if (!$rejectedBill) return null;
- $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) use ($rejectedBill) {
- $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $rejectedBill->logistic_number_return)->first();
- })->first();
- if (!$orderHeader) return null;
- return Order::query()->with('packages.commodities.commodity')->where('code', $orderHeader->orderno)->first();
- }
- private function getRejectedBillItems(Order $order)
- {
- $query = OrderIssue::query()->select('id')->where('order_id',$order->id);
- $query = OrderIssueRejectedBill::query()->select('logistic_number_return')->whereIn('order_issue_id',$query);
- $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return',$query);
- return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill',$query)->get();
- }
- private function getRejectedBillMaps($rejectedBillItems,$order): array
- {
- $map = [];
- if(!$rejectedBillItems) return $map;
- foreach ($rejectedBillItems 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($rejected_bill_item_map)
- && $portion == 0) return "全部退回"; // 全部退回
- if ($portion > 0) return "部分退回";
- if (count(array_diff_key($rejected_bill_item_map,$order_commodity_map)) > 0)return '部分退回';
- if (count(array_diff_key($order_commodity_map,$rejected_bill_item_map)) > 0)return '差异退回';
- return "无";
- }
- public function orderIssueSyncRejectedBills(OrderIssue $orderIssue)
- {
- $logistic_numbers = OrderPackage::query()->where('order_id',$orderIssue->order_id)->get()->map(function($item){
- return $item->logistic_number;
- })->toArray();
- $rejected_bills = RejectedBill::query()->select('logistic_number_return')
- ->whereIn('logistic_number_return',$logistic_numbers)
- ->get()->map(function($item){
- return $item->logistic_number_return;
- })->toArray();
- if(count($rejected_bills) === 0) return;
- $order_issue_rejected_bills = OrderIssueRejectedBill::query()->where('order_issue_id',$orderIssue->id)->get()->map(function ($item){
- return $item->logistic_number_return;
- })->toArray();
- $insert_param = array_map(function($item)use($orderIssue){
- return ['order_issue_id' => $orderIssue->id,'logistic_number_return' => $item];
- },array_diff($rejected_bills,$order_issue_rejected_bills));
- OrderIssueRejectedBill::query()->insert($insert_param);
- }
- public function rejectedBillSyncOrderIssue(RejectedBill $rejectedBill){
- $reaction_exists = OrderIssueRejectedBill::query()->where('logistic_number_return',$rejectedBill->logistic_number_return)->exists();
- if ($reaction_exists) return;
- $query = Order::query()->select('id')->whereHas('packages',function($query)use($rejectedBill){
- $query->where('logistic_number',$rejectedBill->logistic_number_return);
- });
- $order_issue = OrderIssue::query()->whereIn('order_id',$query)->first();
- OrderIssueRejectedBill::query()->create(['order_issue_id' => $order_issue->id,'logistic_number_return' => $rejectedBill->logistic_number_return]);
- }
- }
|