|
|
@@ -125,103 +125,65 @@ 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)->exists();
|
|
|
+ if (!$exists) {
|
|
|
+ $commodityBarcode = CommodityBarcode::query()->with(['commodity' => function ($query) use ($owner_id) {
|
|
|
+ $query->where('owner_id', $owner_id);
|
|
|
+ }])->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()
|