erp/app/Http/Controllers/Goods/GoodsCombinationController.php

225 lines
8.7 KiB
PHP
Raw Normal View History

2023-04-18 11:22:16 +08:00
<?php
namespace App\Http\Controllers\Goods;
use App\Http\Controllers\Controller;
use App\Http\Resources\GoodsSkuResource;
2023-04-21 20:11:24 +08:00
use App\Imports\CombinationGoodsImport;
2023-05-19 21:19:49 +08:00
use App\Models\BusinessOrderItem;
2023-04-20 20:43:49 +08:00
use App\Models\CombinationGood;
use App\Models\Goods;
2023-04-18 11:22:16 +08:00
use App\Models\GoodsSku;
use Illuminate\Http\Request;
2023-04-20 20:43:49 +08:00
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
2023-04-21 20:11:24 +08:00
use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel;
2023-04-18 11:22:16 +08:00
class GoodsCombinationController extends Controller
{
public function index(Request $request)
{
2023-04-22 15:56:53 +08:00
// ToDo
2023-05-19 21:19:49 +08:00
// 可通过子商品查找主商品
2023-04-18 11:22:16 +08:00
$skus = GoodsSku::query()
->with([
2023-04-20 20:43:49 +08:00
'combinationGoods:id,goods_sku_id,item_id,item_num',
'combinationGoods.goodsSkuItem:id,goods_id,title,stock,external_sku_id,updated_at,yesterday_num,reference_price,status',
'combinationGoods.goodsSkuItem.goods:id,title,img_url',
2023-04-18 11:22:16 +08:00
])
2023-04-22 15:56:53 +08:00
->where('is_combination', 1)
->filter()
2023-05-19 21:19:49 +08:00
->orderBy('stock', 'desc')
2023-04-18 11:22:16 +08:00
->paginate($request->get('per_page'));
2023-05-19 21:19:49 +08:00
$fields = implode(',', [
'shop_id',
'external_sku_id',
'sum(goods_number) as number',
'sum(already_cancel_number) as cancel_number',
]);
2023-04-20 20:43:49 +08:00
foreach ($skus as &$item) {
$items = [];
2023-05-19 21:19:49 +08:00
$lastInventoryTime = date('Y-m-d 07:00:00');
$orderDetail = BusinessOrderItem::query()
->select(DB::raw($fields))
->with(['shop:id,name'])
->where('external_sku_id', $item['external_sku_id'])
->when($lastInventoryTime, function ($query) use ($lastInventoryTime) {
$query->where('created_at', '>', $lastInventoryTime);
})
->groupBy(['shop_id', 'external_sku_id'])
->get()
->toArray();
$addOrderGoodsNum = $reduceOrderGoodsNum = 0;
if ($orderDetail) {
$addOrderGoodsNum = array_sum(array_column($orderDetail, 'number'));
$reduceOrderGoodsNum = array_sum(array_column($orderDetail, 'cancel_number'));
}
$item['order_goods_num'] = $addOrderGoodsNum - $reduceOrderGoodsNum;
$item['order_detail'] = $orderDetail;
$number = BusinessOrderItem::query()
->where('external_sku_id', $item['external_sku_id'])
->sum('goods_number');
$cancelNumber = BusinessOrderItem::query()
->where('external_sku_id', $item['external_sku_id'])
->sum('already_cancel_number');
$item['total_orders_num'] = $number - $cancelNumber;
2023-04-20 20:43:49 +08:00
foreach ($item['combinationGoods'] as $combinationItem) {
$items[] = [
'cost' => 0,
'external_sku_id' => $combinationItem['goodsSkuItem']['external_sku_id'],
'goods_id' => $combinationItem['goodsSkuItem']['goods_id'],
2023-04-25 18:11:55 +08:00
'id' => $combinationItem['id'],
2023-04-20 20:43:49 +08:00
'is_combination' => 0,
'num' => $combinationItem['item_num'],
'reference_price' => $combinationItem['goodsSkuItem']['reference_price'],
'status' => $combinationItem['goodsSkuItem']['status'],
'stock' => $combinationItem['goodsSkuItem']['stock'],
'thumb_url' => $combinationItem['goodsSkuItem']['goods']['img_url'],
'img_url' => $combinationItem['goodsSkuItem']['goods']['img_url'],
'title' => $combinationItem['goodsSkuItem']['goods']['title'] . $combinationItem['goodsSkuItem']['title'],
'updated_at' => $combinationItem['goodsSkuItem']['updated_at'],
'yesterday_num' => $combinationItem['goodsSkuItem']['yesterday_num'],
2023-05-19 21:19:49 +08:00
'order_goods_num' => '请在商品列表查看',
'order_detail' => [],
'total_orders_num' => '不显示',
2023-04-20 20:43:49 +08:00
];
}
$item['children'] = $items;
unset($item['combinationGoods']);
}
2023-04-18 11:22:16 +08:00
return GoodsSkuResource::collection($skus);
}
public function store(Request $request)
{
2023-04-20 20:43:49 +08:00
$validator = Validator::make($request->all(), [
'title' => 'required',
'external_sku_id' => 'required',
'combination_goods.*' => 'required',
'combination_goods.*.item_id' => 'required',
'combination_goods.*.item_num' => 'required|gt:0',
]);
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
2023-04-18 11:22:16 +08:00
2023-04-20 20:43:49 +08:00
return response($this->res, $this->res['httpCode']);
}
DB::beginTransaction();
try {
2023-04-21 17:46:59 +08:00
$combinationGoods = $request->input('combination_goods');
$itemIds = array_column($combinationGoods, 'item_id');
$skus = GoodsSku::query()
->whereIn('id', $itemIds)
2024-08-07 17:28:14 +08:00
->get()
->pluck(null, 'id')
2023-04-21 17:46:59 +08:00
->toArray();
$stock = [];
$saleStock = [];
2023-04-21 17:46:59 +08:00
foreach ($combinationGoods as $item) {
$stock[] = (int)($skus[$item['item_id']]['stock'] / $item['item_num']);
$saleStock[] = (int)($skus[$item['item_id']]['sale_stock'] / $item['item_num']);
2023-04-21 17:46:59 +08:00
}
$stock = min($stock);
$saleStock = min($saleStock);
$status = $saleStock ? (5 < $saleStock ? 1 : 2) : 0;
2023-04-20 20:43:49 +08:00
if ($id = $request->input('id')) {
$sku = GoodsSku::query()->findOrFail($id);
} else {
$sku = new GoodsSku();
$sku->goods_id = 0;
$sku->is_combination = 1;
}
2023-04-25 18:27:07 +08:00
$sku->status = $status;
2023-04-21 17:46:59 +08:00
$sku->title = $request->input('title');
$sku->sku_code = $request->input('external_sku_id');
$sku->external_sku_id = $request->input('external_sku_id');
$sku->stock = $stock;
$sku->sale_stock = $saleStock;
2023-04-21 17:46:59 +08:00
$sku->save();
2023-04-20 20:43:49 +08:00
CombinationGood::query()
->where('goods_sku_id', $sku->id)
->delete();
2023-04-21 17:46:59 +08:00
foreach ($combinationGoods as $item) {
CombinationGood::query()->create(['goods_sku_id' => $sku->id, 'item_id' => $item['item_id'], 'item_num' => $item['item_num']]);
2023-04-20 20:43:49 +08:00
}
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400500,
'errorMessage' => $exception->getMessage(),
];
}
return response($this->res, $this->res['httpCode']);
2023-04-18 11:22:16 +08:00
}
public function show(Request $request, $id)
{
2023-04-20 20:43:49 +08:00
$sku = GoodsSku::query()
->with([
'combinationGoods:id,goods_sku_id,item_id,item_num',
'combinationGoods.goodsSkuItem:id,title,goods_id',
'combinationGoods.goodsSkuItem.goods:id,title',
])
->findOrFail($id);
$items = [];
foreach ($sku['combinationGoods'] as $item) {
$items[] = [
'id' => $item['goodsSkuItem']['id'],
'title' => $item['goodsSkuItem']['goods']['title'] . $item['goodsSkuItem']['title'],
];
}
$sku['skus'] = $items;
2023-04-18 11:22:16 +08:00
2023-04-20 20:43:49 +08:00
return new GoodsSkuResource($sku);
2023-04-18 11:22:16 +08:00
}
2023-04-20 20:43:49 +08:00
public function destroy(Request $request, $id)
2023-04-18 11:22:16 +08:00
{
}
2023-04-20 20:43:49 +08:00
public function goodsSkus(Request $request, $title)
{
$goodsIds = Goods::query()
->where('title', 'like', '%' . $title . '%')
->pluck('id');
$skus = GoodsSku::query()
->whereIn('goods_id', $goodsIds)
->where('is_combination', 0)
->with('goods:id,title')
->get(['id', 'title', 'goods_id']);
foreach ($skus as &$sku) {
$sku['title'] = $sku['goods']['title'] . $sku['title'];
}
return GoodsSkuResource::collection($skus);
}
2023-04-21 20:11:24 +08:00
public function import(Request $request)
{
if (!$request->hasFile('combinationGoods')) {
$this->res = [
'httpCode' => 404,
'errorCode' => 404404,
'errorMessage' => 'not found file',
];
}
try {
$import = new CombinationGoodsImport();
$path = $request->file('combinationGoods');
Excel::import($import, $path);
} catch (ValidationException $exception) {
$this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages());
}
return response($this->res, $this->res['httpCode']);
}
2023-04-18 11:22:16 +08:00
}