diff --git a/app/Http/Controllers/Goods/WareHouseSkusController.php b/app/Http/Controllers/Goods/WareHouseSkusController.php deleted file mode 100644 index 5fcbc95..0000000 --- a/app/Http/Controllers/Goods/WareHouseSkusController.php +++ /dev/null @@ -1,288 +0,0 @@ -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 = []; - $expireDay = DeveloperConfigService::getDefaultExpireDay(); - //开始保存数据 - 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->expire_time = Carbon::now()->addDays($expireDay)->toDateTimeString(); - $purchaseRecords->save(); - - $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem,$v); - - } - //如果是組合商品会触发重算逻辑 - 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(); - - $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem,['num'=>0-$v['num'],"cost"=>$v['cost']]); - - } - - 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']); - } - - -} diff --git a/app/Http/Controllers/Supplier/DailyStockRecordController.php b/app/Http/Controllers/Supplier/DailyStockRecordController.php new file mode 100644 index 0000000..4314785 --- /dev/null +++ b/app/Http/Controllers/Supplier/DailyStockRecordController.php @@ -0,0 +1,103 @@ +log = new LogModel([ + 'module' => 'supplier', + 'action' => $request->getMethod(), + 'target_type' => 'dailyStockRecord', + ]); + } + + public function index(Request $request) + { + $build = DailyStockRecord::query()->filter()->with("goodsSku:id,title"); + if (!empty($request->title)) { + $build->whereHas('goodsSku', function ($query) use ($request) { + $query->where('title', 'like', '%' . $request->title . '%'); + }); + } + if (!empty($request->get('external_sku_id'))) { + $build->whereHas('goodsSku', function ($query) use ($request) { + $query->where('external_sku_id', '=', $request->external_sku_id); + }); + } + $dailyStockRecord = $build->paginate($request->get('per_page')); + return JsonResource::collection($dailyStockRecord); + } + + /** + * @param Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + */ + public function store(Request $request) + { + $validator = Validator::make($request->all(), [ + 'external_sku_id' => 'required|string', + 'inventory' => 'required|integer', + ]); + if ($validator->fails()) { + //校验失败返回异常 + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + return response($this->res, $this->res['httpCode']); + } + $goodsSku = GoodsSku::query()->with("combinationGoods")->where('external_sku_id', "=", $request->external_sku_id)->first(); + if (empty($goodsSku)) { + $this->res = [ + 'httpCode' => 200, + 'message' => '查询不到sku信息', + 'errorCode' => "ERP001", + 'errorMessage' => '查询不到sku信息', + ]; + return response($this->res, $this->res['httpCode']); + } + + //同一批量逻辑操作 + $goodSkuService = new GoodSkuService(); + $goodSkuService->inventory([$goodsSku]); + return response($this->res, $this->res['httpCode']); + } + + + public function inventoryImport(Request $request) + { + if (!$request->hasFile('inventoryFile')) { + $this->res = [ + 'httpCode' => 404, + 'errorCode' => 404404, + 'errorMessage' => 'not found inventory file', + ]; + } + try { + $import = new InventoryImport(); + $path = $request->file('inventoryFile'); + Excel::import($import, $path); + $this->addLog(0, 'import', 'inventory'); + } catch (ValidationException $exception) { + $this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages()); + } + + return response($this->res, $this->res['httpCode']); + } + + +} diff --git a/app/Http/Controllers/Supplier/LossRecordController.php b/app/Http/Controllers/Supplier/LossRecordController.php new file mode 100644 index 0000000..2d5b569 --- /dev/null +++ b/app/Http/Controllers/Supplier/LossRecordController.php @@ -0,0 +1,189 @@ +filter()->with("goodsSku:title,external_sku_id"); + if (!empty($request->start_time) && !empty($request->end_time)) { + $builder->whereBetween('created_at', [$request->start_time, $request->end_time]); + } + if (!empty($request->title)) { + $builder->whereHas('goodsSku', function ($query) use ($request) { + $query->where('title', 'like', '%' . $request->title . '%'); + }); + } + $dailyStockRecord = $builder->paginate($request->get('per_page')); + return JsonResource::collection($dailyStockRecord); + } + + public function store(Request $request) + { + //获取所有参数 + $allParams = $request->all(); + //进行校验验证 + $validator = Validator::make($allParams, [ + 'external_sku_id' => 'required|string', + 'num' => 'required|integer', + 'reason' => 'sometimes|string', + 'buyer_name' => 'sometimes|string' + ]); + if ($validator->fails()) { + //校验失败返回异常 + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + return response($this->res, $this->res['httpCode']); + } + $goodsSku = GoodsSku::query()->where('external_sku_id', "=", $request->external_sku_id)->first(); + if (!empty($goodsSku)) { + //保存記錄 + $lossRecords = new LossRecords(); + $lossRecords->sku_id = $goodsSku->id; + $lossRecords->external_sku_id = $allParams['external_sku_id']; + $lossRecords->num = $allParams['num']; + $lossRecords->cost = $allParams['cost']; + $lossRecords->buyer_name = $allParams['buyer_name'] ?? ''; + $lossRecords->reason = $allParams['reason'] ?? ''; + $lossRecords->save(); + $updateIds = GoodSkuService::computeSkuStock($goodsSku->toArray(), ['num' => 0 - $allParams['num'], "cost" => $allParams['cost']]); + event(new BatchStockUpdateEvent($updateIds)); + } else { + $this->res = [ + 'httpCode' => 200, + 'message' => '查询不到sku信息', + 'errorCode' => "ERP001", + 'errorMessage' => '查询不到sku信息', + ]; + } + + return response($this->res, $this->res['httpCode']); + } + + + public function update($id, Request $request) + { + //获取所有参数 + $allParams = $request->all(); + //进行校验验证 + $validator = Validator::make($allParams, [ + 'reason' => 'sometimes|string', + 'buyer_name' => 'sometimes|string' + ]); + if ($validator->fails()) { + //校验失败返回异常 + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + return response($this->res, $this->res['httpCode']); + } + $goodsSku = GoodsSku::query()->where('id', "=", $id)->get(); + if (!empty($goodsSku)) { + //更新記錄 + $lossRecords = new LossRecords(); + $lossRecords->buyer_name = $allParams['buyer_name'] ?? ''; + $lossRecords->reason = $allParams['reason'] ?? ''; + $lossRecords->save(); + + } else { + $this->res = [ + 'httpCode' => 200, + 'message' => '查询不到sku信息', + 'errorCode' => "ERP001", + 'errorMessage' => '查询不到sku信息', + ]; + } + + 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(); + + $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem,['num'=>0-$v['num'],"cost"=>$v['cost']]); + + } + + 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']); + } + + +} diff --git a/app/Http/Controllers/Supplier/PurchaseRecordController.php b/app/Http/Controllers/Supplier/PurchaseRecordController.php new file mode 100644 index 0000000..773f3e6 --- /dev/null +++ b/app/Http/Controllers/Supplier/PurchaseRecordController.php @@ -0,0 +1,206 @@ +filter()->with("goodsSku:id,title,external_sku_id"); + if (!empty($request->start_time) && !empty($request->end_time)) { + $builder->whereBetween('created_at', [$request->start_time, $request->end_time]); + } + if (!empty($request->title)) { + $builder->whereHas('goodsSku', function ($query) use ($request) { + $query->where('title', 'like', '%' . $request->title . '%'); + }); + } + $dailyStockRecord = $builder->paginate($request->get('per_page')); + return JsonResource::collection($dailyStockRecord); + } + + public function store(Request $request) + { + //获取所有参数 + $allParams = $request->all(); + //进行校验验证 + $validator = Validator::make($allParams, [ + 'external_sku_id' => 'required|string', + 'num' => 'required|integer', + ]); + if ($validator->fails()) { + //校验失败返回异常 + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + return response($this->res, $this->res['httpCode']); + } + $goodsSku = GoodsSku::query()->where('external_sku_id', "=", $request->external_sku_id)->first(); + if (!empty($goodsSku)) { + $expireDay = DeveloperConfigService::getDefaultExpireDay(); + //保存記錄 + $purchaseRecords = new PurchaseRecords(); + $purchaseRecords->sku_id = $goodsSku->id ?? 0; + $purchaseRecords->external_sku_id = $allParams['external_sku_id']; + $purchaseRecords->num = $allParams['num']; + $purchaseRecords->cost = $allParams['cost']; + $purchaseRecords->buyer_name = $allParams['buyer_name'] ?? ''; + $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; + $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; + $purchaseRecords->expire_time = $allParams['expire_time'] ?? Carbon::now()->addDays($expireDay)->toDateTimeString(); + $purchaseRecords->save(); + + $updateIds = GoodSkuService::computeSkuStock($goodsSku->toArray(), $allParams); + event(new BatchStockUpdateEvent($updateIds)); + } else { + $this->res = [ + 'httpCode' => 200, + 'message' => '查询不到sku信息', + 'errorCode' => "ERP001", + 'errorMessage' => '查询不到sku信息', + ]; + } + + return response($this->res, $this->res['httpCode']); + } + + + public function update($id, Request $request) + { + //获取所有参数 + $allParams = $request->all(); + //进行校验验证 + $validator = Validator::make($allParams, [ + 'buyer_name' => 'sometimes|string', + 'supplier_name' => 'sometimes|string', + "expire_time" => 'sometimes|string' + ]); + if ($validator->fails()) { + //校验失败返回异常 + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + return response($this->res, $this->res['httpCode']); + } + $goodsSku = GoodsSku::query()->where('id', "=", $id)->get(); + if (!empty($goodsSku)) { + //可以修改的記錄 + $purchaseRecords = new PurchaseRecords(); + $purchaseRecords->buyer_name = $allParams['buyer_name'] ?? ''; + $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; + $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; + if (!empty($allParams['expire_time'])) { + $purchaseRecords->expire_time = $allParams['expire_time']; + } + + $purchaseRecords->save(); + + } else { + $this->res = [ + 'httpCode' => 200, + 'message' => '查询不到sku信息', + 'errorCode' => "ERP001", + 'errorMessage' => '查询不到sku信息', + ]; + } + + 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 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 = []; + $expireDay = DeveloperConfigService::getDefaultExpireDay(); + //开始保存数据 + 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->expire_time = Carbon::now()->addDays($expireDay)->toDateTimeString(); + $purchaseRecords->save(); + + $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem, $v); + + } + //如果是組合商品会触发重算逻辑 + 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']); + } + + +} diff --git a/app/Imports/PurchaseImport.php b/app/Imports/PurchaseImport.php index fe661c5..62745ef 100644 --- a/app/Imports/PurchaseImport.php +++ b/app/Imports/PurchaseImport.php @@ -40,7 +40,7 @@ class PurchaseImport implements ToArray, SkipsEmptyRows ->toArray(); $hasGoodsSkus = ArrayUtils::index($hasGoodsSkus, 'external_sku_id'); $expireDay = DeveloperConfigService::getDefaultExpireDay(); - //excel字段排序 編碼 商品名稱 导购數量 成本价 采购人名称 供应商名称 + //excel字段排序 編碼 商品名稱 导购數量 成本价 采购人名称 供应商名称 保质期 foreach ($collection as $row) { if (!isset($hasGoodsSkus[$row[0]])) { continue; @@ -55,12 +55,12 @@ class PurchaseImport implements ToArray, SkipsEmptyRows $purchaseRecords->cost = $row[3]; $purchaseRecords->buyer_name = $row[4] ?? ''; $purchaseRecords->supplier_name = $row[5] ?? ''; - $purchaseRecords->expire_time = Carbon::now()->addDays($expireDay)->toDateTimeString(); + $purchaseRecords->expire_time = $row[6] ?? Carbon::now()->addDays($expireDay)->toDateTimeString(); $purchaseRecords->save(); - $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem,["num"=>$row[2],'cost'=>$row[3]]); + $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem, ["num" => $row[2], 'cost' => $row[3]]); } - Log::info("采购导入内容:",$collection); + Log::info("采购导入内容:", $collection); // 批量更新 event(new BatchStockUpdateEvent($updateIds)); } diff --git a/app/Models/DailyStockRecord.php b/app/Models/DailyStockRecord.php index 00f6161..cbe301a 100644 --- a/app/Models/DailyStockRecord.php +++ b/app/Models/DailyStockRecord.php @@ -2,9 +2,23 @@ namespace App\Models; +use App\Models\traits\Filter; + class DailyStockRecord extends Model { + use Filter; + protected $hidden = ['created_at', 'updated_at']; protected $guarded = []; + + public $fieldSearchable = [ + 'day', + ]; + + public function goodsSku() + { + return $this->belongsTo(GoodsSku::class, 'sku_id', 'id'); + } + } diff --git a/app/Models/LossRecords.php b/app/Models/LossRecords.php index 0eff37d..4e6d37e 100644 --- a/app/Models/LossRecords.php +++ b/app/Models/LossRecords.php @@ -2,10 +2,22 @@ namespace App\Models; +use App\Models\traits\Filter; use Illuminate\Database\Eloquent\Model; class LossRecords extends Model { - // + + use Filter; + protected $table = 'loss_records'; + protected $guarded = []; + public $fieldSearchable = [ + 'external_sku_id', + ]; + + public function goodsSku() + { + return $this->belongsTo(GoodsSku::class, 'external_sku_id', 'external_sku_id'); + } } diff --git a/app/Models/PurchaseRecords.php b/app/Models/PurchaseRecords.php index 4e9357b..19ccae6 100644 --- a/app/Models/PurchaseRecords.php +++ b/app/Models/PurchaseRecords.php @@ -2,11 +2,22 @@ namespace App\Models; +use App\Models\traits\Filter; use Illuminate\Database\Eloquent\Model; class PurchaseRecords extends Model { - // - protected $table = 'purchase_records'; + use Filter; + + protected $table = 'purchase_records'; + protected $guarded = []; + public $fieldSearchable = [ + 'external_sku_id', + ]; + + public function goodsSku() + { + return $this->belongsTo(GoodsSku::class, 'external_sku_id', 'external_sku_id'); + } } diff --git a/app/Services/GoodSku/GoodSkuService.php b/app/Services/GoodSku/GoodSkuService.php index e3d286c..b58f5b6 100644 --- a/app/Services/GoodSku/GoodSkuService.php +++ b/app/Services/GoodSku/GoodSkuService.php @@ -7,23 +7,29 @@ use App\Models\CombinationGood; use App\Models\DailyStockRecord; use App\Models\GoodsSku; use App\Utils\DateTimeUtils; +use Illuminate\Support\Facades\Log; class GoodSkuService { - public function inventory(array $requestSkus) + public function inventory(array $skusWithCombinationGoods,$skuInventoryMapKeyByExternalSkuId) { - $requestSkusMap = collect($requestSkus)->pluck(null, 'external_sku_id')->toArray(); - $externalSkuIds = collect($requestSkus)->pluck('external_sku_id')->toArray(); - $skus = GoodsSku::query() - ->whereIn('external_sku_id', $externalSkuIds) - ->get(['id', 'external_sku_id']) - ->toArray(); + //传进来的sku可能包含组合商品 所以这里需要事先计算好数据 + $inventoryKeyBySkuIdMap = []; + foreach($skusWithCombinationGoods as $sku){ + if(!empty($sku['is_combination'])){ + foreach ($sku['combination_goods'] as $combinationGoods){ + + } + } + } + $skus=[]; + $today = DateTimeUtils::getToday(); $dateTime = date('Y-m-d H:i:s'); $updateIds = []; foreach ($skus as $sku) { - if (!in_array($sku['external_sku_id'], $externalSkuIds)) { + if (!in_array($sku['external_sku_id'], $sku)) { continue; } // 更新 @@ -31,7 +37,7 @@ class GoodSkuService 'sku_id' => $sku['id'], 'day' => $today, ]); - $record->inventory = $requestSkusMap[$sku['external_sku_id']]['inventory']; + $record->inventory = $skuInventoryMapKeyByExternalSkuId[$sku['external_sku_id']]['inventory']; $record->inventory_time = $dateTime; $record->save(); //查询sku当前未发货的数量 目前数据看着有问题暂不操作 @@ -49,26 +55,34 @@ class GoodSkuService public static function computeSkuStock(array $goodsSkuItem, array $v): array { $updateIds = []; + Log::info("库存更新前完整商品信息", $goodsSkuItem); + Log::info("库存更新前完整请求信息", $v); + $updateParams = []; if (empty($goodsSkuItem['is_combination'])) { - GoodsSku::query()->where('external_sku_id', $goodsSkuItem['external_sku_id'])->update([ + $updateParam = [ '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), - ]); + ]; + GoodsSku::query()->where('external_sku_id', $goodsSkuItem['external_sku_id'])->update($updateParams); $updateIds[] = $goodsSkuItem['id']; + $updateParams[] = $updateParam; } else { - //组合商品 这里需要重新获取 减少更新丢失概率 后续考虑库存管理用redis + //组合商品 这里需要重新获取 减少更新丢失概率 $combinationGood = CombinationGood::query()->with('goodsSkuItem:id,stock,sale_stock') ->where('goods_sku_id', $goodsSkuItem['id'])->get(); foreach ($combinationGood as $item) { - GoodsSku::query()->where('id', $item['goodsSkuItem']['id'])->update([ + $updateParam = [ 'stock' => $item['goodsSkuItem']['stock'] + $v['num'] * $item['item_num'], 'sale_stock' => $item['goodsSkuItem']['sale_stock'] + $v['num'] * $item['item_num'], - ]); + ]; + GoodsSku::query()->where('id', $item['goodsSkuItem']['id'])->update($updateParam); $updateIds[] = $item['goodsSkuItem']['id']; + $updateParams[] = $updateParam; } } + Log::info("本次请求更新参数", $updateParams); return $updateIds; } diff --git a/resources/lang/zh-CN/permission.php b/resources/lang/zh-CN/permission.php index d906125..e247fff 100644 --- a/resources/lang/zh-CN/permission.php +++ b/resources/lang/zh-CN/permission.php @@ -477,13 +477,13 @@ return [ 'name' => '销售数据列表', 'parent_id' => 180, ], - 'SUPPLIER_MANAGE' => [ + 'SUPPLIER' => [ 'id' => 19, 'name' => '供应链管理', 'parent_id' => 0, 'show' => 1, ], - 'SUPPLIER' => [ + 'SUPPLIER_MANAGE' => [ 'id' => 190, 'name' => '供应商管理', 'parent_id' => 19, @@ -525,35 +525,77 @@ return [ 'name' => '更新', 'parent_id' => 191 ], - 'WARE_HOUSE' => [ + 'PURCHASE_RECORD' => [ 'id' => 192, - 'name' => '仓库管理', + 'name' => '采购记录', 'parent_id' => 19, 'show' => 1, ], - 'goods.ware_house.index' => [ + 'purchase_record.index' => [ 'id' => 1921, - 'name' => '仓库管理首页', + 'name' => '采购单首页', 'parent_id' => 192 ], - 'goods.ware_house.purchase_batch_store' => [ + 'purchase_record.update' => [ 'id' => 1922, - 'name' => '导购单批量保存', + 'name' => '采购单更新', 'parent_id' => 192 ], - 'goods.ware_house.loss_batch_store' => [ + 'purchase_record.store' => [ 'id' => 1923, - 'name' => '报损单批量保存', + 'name' => '采购单新增', 'parent_id' => 192 ], - 'goods.ware_house.purchase_import' => [ + 'purchase_record.purchase_import' => [ 'id' => 1924, 'name' => '导购单批量导入', 'parent_id' => 192 ], - 'goods.ware_house.loss_import' => [ - 'id' => 1925, + 'LOSS_RECORD' => [ + 'id' => 193, + 'name' => '报损记录', + 'parent_id' => 19, + 'show' => 1, + ], + 'loss_record.index' => [ + 'id' => 1931, + 'name' => '报损单首页', + 'parent_id' => 193 + ], + 'loss_record.update' => [ + 'id' => 1932, + 'name' => '报损单更新', + 'parent_id' => 193 + ], + 'loss_record.store' => [ + 'id' => 1933, + 'name' => '报损单新增', + 'parent_id' => 193 + ], + 'loss_record.purchase_import' => [ + 'id' => 1934, 'name' => '报损单批量导入', - 'parent_id' => 192 + 'parent_id' => 193 + ], + 'DAILY_STOCK_RECORD' => [ + 'id' => 194, + 'name' => '盘点记录', + 'parent_id' => 19, + 'show' => 1, + ], + 'daily_stock_record.index' => [ + 'id' => 1941, + 'name' => '盘点记录首页', + 'parent_id' => 194 + ], + 'daily_stock_record.store' => [ + 'id' => 1942, + 'name' => '盘点记录新增', + 'parent_id' => 193 + ], + 'daily_stock_record.purchase_import' => [ + 'id' => 1943, + 'name' => '盘点记录批量导入', + 'parent_id' => 193 ], ]; diff --git a/routes/api.php b/routes/api.php index 3d7a0b5..5a0d95d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -12,7 +12,9 @@ use App\Http\Controllers\Group\GroupsController; use App\Http\Controllers\Business\BusinessOrderController; use App\Http\Controllers\Goods\GoodsSkuLocationController; use App\Http\Controllers\Goods\GoodsCombinationController; -use App\Http\Controllers\Goods\WareHouseSkusController; +use App\Http\Controllers\Supplier\DailyStockRecordController; +use App\Http\Controllers\Supplier\LossRecordController; +use App\Http\Controllers\Supplier\PurchaseRecordController; /* |-------------------------------------------------------------------------- @@ -77,11 +79,12 @@ Route::middleware(['auth:api', 'check.permissions'])->group(function () { Route::resource('supplier', 'Supplier\SuppliersController', ['only' => ['index', 'update', 'store','destroy']]); //站内信 Route::resource('website_message', 'Message\WebsiteMessageController', ['only' => ['index', 'update']]); - //仓库管理 采购和报损 - Route::get('goods/ware_house/index', [WareHouseSkusController::class, 'index'])->name('goods.ware_house.index'); - Route::post('goods/ware_house/purchase_batch_store', [WareHouseSkusController::class, 'purchaseBatchStore'])->name('goods.ware_house.purchase_batch_store'); - Route::post('goods/ware_house/loss_batch_store', [WareHouseSkusController::class, 'lossBatchStore'])->name('goods.ware_house.loss_batch_store'); - + //仓库管理-采购单 + Route::resource('supplier/purchase_record', 'Supplier\PurchaseRecordController',['only' => ['index', 'store','update']]); + //报损单 + Route::resource('supplier/loss_record', 'Supplier\LossRecordController',['only' => ['index', 'store','update']]); + //仓库管理-盘点 + Route::resource('supplier/daily_stock_record', 'Supplier\DailyStockRecordController',['only' => ['index', 'store']]); }); Route::get('stock/goods_skus', [GoodsSkusController::class, 'stockNum'])->middleware('auth:api'); Route::get('goods/filter/{title}', [GoodsCombinationController::class, 'goodsSkus'])->middleware('auth:api'); @@ -121,7 +124,10 @@ Route::post('upload', [UploadController::class, 'store'])->name('upload.file'); Route::get('goodsSkusList', [GoodsSkusController::class, 'goodsSkusList'])->name('goods_sku.list_for_goods_sku'); // 采购导入 -Route::post('goods/ware_house/purchase_import', [WareHouseSkusController::class, 'purchaseImport'])->name('goods.ware_house.purchase_import'); +Route::post('supplier/purchase_record/purchase_import', [PurchaseRecordController::class, 'purchaseImport'])->name('supplier.purchase_record.purchase_import'); -// 上新导入 -Route::post('goods/ware_house/loss_import', [WareHouseSkusController::class, 'lossImport'])->name('goods.ware_house.loss_import'); +//报损导入 +Route::post('supplier/loss_record/loss_import', [LossRecordController::class, 'lossImport'])->name('supplier.loss_record.loss_import'); + +//新版盘点导入 +Route::post('supplier/daily_stock_record/inventory_import', [DailyStockRecordController::class, 'inventoryImport'])->name('supplier.daily_stock_record.inventory_import');