log = new LogModel([ 'module' => 'goods', 'action' => $request->getMethod(), 'target_type' => 'goods_sku', ]); } public function index(Request $request) { $fields = implode(',', [ 'shop_id', 'external_sku_id', 'SUM(goods_number) - SUM(already_cancel_number) as number', ]); $orderRestTime = DeveloperConfig::query() ->where('key', DeveloperConfig::$ORDER_RESET_TIME) ->value('value'); if (is_null($orderRestTime)) { $orderRestTime = date('Y-m-d 07:00:00'); } $businessOrderItems = BusinessOrderItem::query() ->select(DB::raw($fields)) ->with([ 'shop:id,name', 'goodsSku:id,external_sku_id' ]) ->where('created_at', '>', $orderRestTime) ->where('external_sku_id', '<>', '') ->groupBy(['shop_id', 'external_sku_id']) ->orderByDesc('number') ->get() ->toArray(); $ids = $externals = []; foreach ($businessOrderItems as $businessOrderItem) { if (is_null($businessOrderItem['goods_sku'])) { continue; } $id = $businessOrderItem['goods_sku']['id']; if (isset($ids[$id])) { $ids[$id] += (int)$businessOrderItem['number']; } else { $ids[$id] = (int)$businessOrderItem['number']; } $externals[$businessOrderItem['external_sku_id']][] = $businessOrderItem; } arsort($ids); $builder = GoodsSku::query(); $this->preparQueryGoodsSkus($request, $builder); $day = DateTimeUtils::getToday(); $goodsSkus = (clone $builder)->filter() ->where('is_combination', 0) ->orderByDesc('stock') ->pluck('stock', 'id') ->toArray(); $finalIds = []; foreach ($ids as $id => $number) { if (isset($goodsSkus[$id])) { $finalIds[] = $id; unset($goodsSkus[$id]); } } $finalIds = array_merge($finalIds, array_keys($goodsSkus)); $idField = implode(',', $finalIds); $goodsSkus = (clone $builder)->with(['goods' => function ($query) { $query->with(['type:id,name', 'brand:id,name']); }]) ->with(['daily' => function ($query) use ($day) { $query->where('day', $day); }]) ->whereIn('id', $finalIds) ->orderByRaw("FIELD(id, {$idField})") ->paginate($request->get('per_page')); $rolesName = $request->user()->getRoleNames()->toArray(); foreach ($goodsSkus as &$sku) { $lastInventoryTime = $sku['daily']['inventory_time'] ?: date('Y-m-d 07:00:00'); if (isset($externals[$sku['external_sku_id']])) { $sku['order_detail'] = $externals[$sku['external_sku_id']]; $sku['order_goods_num'] = array_sum(array_column($externals[$sku['external_sku_id']], 'number')); } else { $sku['order_detail'] = []; $sku['order_goods_num'] = 0; } $sku['order_goods_num'] -= $sku['daily']['reissue_num']; $sku['inventory_time'] = $lastInventoryTime; if ('销售' === $rolesName[0]) { $sku['cost'] = 0; } } return GoodsSkuResource::collection($goodsSkus); } /** * 采购单后台批量存储 * @param Request $request * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response|void */ public function purchaseBatchStore(Request $request) { $validator = Validator::make($request->all(), [ 'purchaseOrders' => 'required|array', 'purchaseOrders.*.external_sku_id' => 'required|string', 'purchaseOrders.*.num' => 'required|integer']); //参数校验 if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); return response($this->res, $this->res['httpCode']); } $purchaseOrders = $request->input('purchaseOrders') ?? []; $externalSkuIds = collect($purchaseOrders)->pluck("external_sku_id")->toArray(); $goodsSku = GoodsSku::query()->whereIn('external_sku_id', $externalSkuIds)->get(); if ($goodsSku->pluck("external_sku_id")->diff($externalSkuIds)->isNotEmpty()) { $content = implode(',', $goodsSku->pluck("external_sku_id")->diff($externalSkuIds)->toArray()); $content .= "以上sku编码数据库中不存在"; return response($content, $this->res['httpCode']); } $goodsSkuMap = $goodsSku->pluck(null, 'external_sku_id')->toArray(); $updateIds = []; //开始保存数据 foreach ($purchaseOrders as $v) { $goodsSkuItem = $goodsSkuMap[$v['external_sku_id']]; //保存記錄 $purchaseRecords = new PurchaseRecords(); $purchaseRecords->sku_id = $goodsSkuItem['id'] ?? 0; $purchaseRecords->external_sku_id = $v['external_sku_id']; $purchaseRecords->num = $v['num']; $purchaseRecords->cost = $v['cost']; $purchaseRecords->buyer_name = $v['buyer_name'] ?? ''; $purchaseRecords->supplier_name = $v['supplier_name'] ?? ''; $purchaseRecords->supplier_id = $v['supplier_id'] ?? 0; $purchaseRecords->save(); //更新库存 GoodsSku::query()->where('external_sku_id', $v['external_sku_id'])->update([ 'stock' => $goodsSkuItem['stock'] + $v['num'], 'sale_stock' => $goodsSkuItem['sale_stock'] + $v['num'], 'cost' => number_format(($goodsSkuItem['stock']*$goodsSkuItem['cost']+$v['cost']*$v['num']) /($goodsSkuItem['stock'] + $v['num']),2), 'status' => 1, ]); $updateIds[] = $goodsSkuItem['id']; } //如果是組合商品後續會處理组合商品库存的拆分 event(new BatchStockUpdateEvent($updateIds)); return response($this->res, $this->res['httpCode']); } /** * 报损单后台批量存储 * @param Request $request * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response|void */ public function purchaseImport(Request $request) { if (!$request->hasFile(ExcelKeyEnum::PURCHASE_KEY)) { $this->res = [ 'httpCode' => 404, 'errorCode' => 404404, 'errorMessage' => 'not found purchase file', ]; } try { $import = new PurchaseImport(); $path = $request->file(ExcelKeyEnum::PURCHASE_KEY); Excel::import($import, $path); $this->addLog(0, 'import', ExcelKeyEnum::PURCHASE_KEY); } catch (ValidationException $exception) { $this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages()); } return response($this->res, $this->res['httpCode']); } public function lossBatchStore(Request $request){ $validator = Validator::make($request->all(), [ 'lossOrders' => 'required|array', 'lossOrders.*.external_sku_id' => 'required|string', 'lossOrders.*.num' => 'required|integer', 'lossOrders.*.reason' => 'sometimes|string', 'lossOrders.*.buyer_name' => 'sometimes|string',//采购商 ]); //参数校验 if ($validator->fails()) { $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); return response($this->res, $this->res['httpCode']); } $lossOrders = $request->input('lossOrders') ?? []; $externalSkuIds = collect($lossOrders)->pluck("external_sku_id")->toArray(); $goodsSku = GoodsSku::query()->whereIn('external_sku_id', $externalSkuIds)->get(); if ($goodsSku->pluck("external_sku_id")->diff($externalSkuIds)->isNotEmpty()) { $content = implode(',', $goodsSku->pluck("external_sku_id")->diff($externalSkuIds)->toArray()); $content .= "以上sku编码数据库中不存在"; return response($content, $this->res['httpCode']); } $goodsSkuMap = $goodsSku->pluck(null,'external_sku_id')->toArray(); $updateIds = []; //开始保存数据 foreach ($lossOrders as $v) { $goodsSkuItem = $goodsSkuMap[$v['external_sku_id']]; //保存記錄 $lossRecords = new LossRecords(); $lossRecords->sku_id = $goodsSkuItem['id'] ?? 0; $lossRecords->external_sku_id = $v['external_sku_id']; $lossRecords->num = $v['num']; $lossRecords->cost = $v['cost']; $lossRecords->buyer_name = $v['buyer_name'] ?? ''; $lossRecords->reason = $v['reason'] ?? ''; $lossRecords->save(); //更新库存 GoodsSku::query()->where('external_sku_id', $v['external_sku_id'])->update([ 'stock' => $goodsSkuItem['stock'] - $v['num'], 'sale_stock' => $goodsSkuItem['sale_stock'] - $v['num'], 'cost' => number_format(($goodsSkuItem['stock']*$goodsSkuItem['cost']-$v['cost']*$v['num']) /($goodsSkuItem['stock'] - $v['num']),2), ]); $updateIds[] = $goodsSkuItem['id']; } //如果是組合商品後續會處理组合商品库存的拆分 event(new BatchStockUpdateEvent($updateIds)); return response($this->res, $this->res['httpCode']); } /** * 报损单单后台批量导入 * @param Request $request * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response|void */ public function lossImport(Request $request) { if (!$request->hasFile(ExcelKeyEnum::LOSS_KEY)) { $this->res = [ 'httpCode' => 404, 'errorCode' => 404404, 'errorMessage' => 'not found loss file', ]; } try { $import = new LossImport(); $path = $request->file(ExcelKeyEnum::LOSS_KEY); Excel::import($import, $path); $this->addLog(0, 'import', ExcelKeyEnum::LOSS_KEY); } catch (ValidationException $exception) { $this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages()); } return response($this->res, $this->res['httpCode']); } }