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

722 lines
27 KiB
PHP
Raw Normal View History

2022-07-28 13:46:08 +08:00
<?php
namespace App\Http\Controllers\Goods;
2023-11-18 14:35:19 +08:00
use App\Events\BatchStockUpdateEvent;
2022-08-16 21:02:31 +08:00
use App\Events\StockUpdateEvent;
2022-08-04 14:25:12 +08:00
use App\Exports\GoodsSkusExport;
2024-02-06 17:04:58 +08:00
use App\Exports\WeekDataExport;
2022-07-28 13:46:08 +08:00
use App\Http\Controllers\Controller;
2022-08-03 16:41:15 +08:00
use App\Http\Requests\GoodsRequest;
use App\Http\Requests\GoodsSkuRequest;
2022-09-08 01:02:07 +08:00
use App\Imports\InventoryImport;
2023-06-01 20:09:59 +08:00
use App\Imports\NewSetImport;
2022-08-23 16:25:31 +08:00
use App\Models\BusinessOrderItem;
2024-03-18 14:12:57 +08:00
use App\Models\DailySalesReport;
2024-01-29 19:23:35 +08:00
use App\Models\DeveloperConfig;
2022-08-03 11:14:08 +08:00
use App\Models\Goods;
use App\Models\Log;
2022-08-01 17:06:43 +08:00
use App\Models\Log as LogModel;
2024-08-13 18:17:03 +08:00
use App\Services\DeveloperConfig\DeveloperConfigService;
2024-07-26 17:48:07 +08:00
use App\Services\GoodSku\GoodSkuService;
use App\Services\Ship\WayBillService;
2022-08-23 16:25:31 +08:00
use App\Utils\ArrayUtils;
2022-08-09 10:34:36 +08:00
use App\Utils\DateTimeUtils;
2024-02-06 17:13:24 +08:00
use Carbon\Carbon;
2022-07-28 13:46:08 +08:00
use Illuminate\Http\Request;
use App\Models\GoodsSku;
use App\Http\Resources\GoodsSkuResource;
use App\Imports\GoodsSkusImport;
2022-08-03 16:41:15 +08:00
use Illuminate\Support\Facades\DB;
2022-08-02 11:43:46 +08:00
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\DailyStockRecord;
2022-10-25 22:08:55 +08:00
use App\Models\Shop;
2022-07-28 13:46:08 +08:00
class GoodsSkusController extends Controller
{
2022-08-01 17:06:43 +08:00
public function __construct(Request $request)
2022-08-01 05:07:38 +08:00
{
2022-08-01 17:06:43 +08:00
$this->log = new LogModel([
'module' => 'goods',
'action' => $request->getMethod(),
'target_type' => 'goods_sku',
]);
2022-08-01 05:07:38 +08:00
}
2022-07-28 13:46:08 +08:00
public function index(Request $request)
{
2024-01-19 17:04:56 +08:00
$fields = implode(',', [
'shop_id',
'external_sku_id',
'SUM(goods_number) - SUM(already_cancel_number) as number',
]);
2024-01-29 19:23:35 +08:00
$orderRestTime = DeveloperConfig::query()
->where('key', DeveloperConfig::$ORDER_RESET_TIME)
->value('value');
if (is_null($orderRestTime)) {
$orderRestTime = date('Y-m-d 07:00:00');
}
2024-01-19 17:04:56 +08:00
$businessOrderItems = BusinessOrderItem::query()
->select(DB::raw($fields))
->with([
'shop:id,name',
'goodsSku:id,external_sku_id'
])
2024-01-29 19:23:35 +08:00
->where('created_at', '>', $orderRestTime)
2024-01-19 17:04:56 +08:00
->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);
2023-04-17 18:56:59 +08:00
$builder = GoodsSku::query();
$this->preparQueryGoodsSkus($request, $builder);
2022-08-09 10:34:36 +08:00
$day = DateTimeUtils::getToday();
2024-01-19 17:04:56 +08:00
$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) {
2022-08-08 17:25:12 +08:00
$query->where('day', $day);
2022-08-03 11:14:08 +08:00
}])
2024-01-19 17:04:56 +08:00
->whereIn('id', $finalIds)
->orderByRaw("FIELD(id, {$idField})")
2023-07-31 14:00:49 +08:00
->paginate($request->get('per_page'));
2024-08-13 18:17:03 +08:00
$user = $request->user()->toArray();
$adminRoleIds = DeveloperConfigService::getSkuAdminRoleIds();
2022-08-23 16:25:31 +08:00
foreach ($goodsSkus as &$sku) {
$lastInventoryTime = !empty($sku['daily']['inventory_time']) ? $sku['daily']['inventory_time'] : date('Y-m-d 07:00:00');
2024-01-19 17:04:56 +08: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;
2022-08-23 17:18:28 +08:00
}
2024-08-13 18:17:03 +08:00
$sku['order_goods_num'] -= $sku['daily']['reissue_num'] ?? 0;
2022-08-23 16:34:27 +08:00
$sku['inventory_time'] = $lastInventoryTime;
2024-08-13 18:17:03 +08:00
if ('销售' === ($user['roles'][0]['name'] ?? "")) {
2023-03-20 15:39:55 +08:00
$sku['cost'] = 0;
}
2024-08-13 18:17:03 +08:00
if (in_array($user['roles'][0]['id'] ?? 0, $adminRoleIds)) {
$sku['is_admin'] = 1;
} else {
$sku['is_admin'] = 0;
}
if (!empty($sku['yesterday_num'])) {
$sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2)*100;
} else {
$sku['sale_ratio'] = 0;
}
2022-08-23 16:25:31 +08:00
}
2022-08-03 11:14:08 +08:00
return GoodsSkuResource::collection($goodsSkus);
2022-07-28 13:46:08 +08:00
}
2023-04-17 18:56:59 +08:00
private function preparQueryGoodsSkus(Request $request, &$builder)
{
if ($request->get('keyword_type') && $request->get('keyword_value')) {
$skuIds = Log::query()->where('target_type', 'goods_sku')
->where('target_field', $request->keyword_type)
->whereBetween('created_at', explode(' - ', $request->keyword_value))
->pluck('target_id')
->toArray();
$builder->whereIn('id', $skuIds);
}
2024-03-14 14:29:23 +08:00
if ($request->get('type_id') || $request->get('brand_id')) {
2023-04-17 18:56:59 +08:00
$goodsIds = Goods::query()->filter()->pluck('id')->toArray();
$builder->whereIn('goods_id', $goodsIds);
}
2024-03-14 14:29:23 +08:00
if ($request->get('goods_title')) {
$builder->where('name', 'like', '%' . $request->goods_title . '%');
}
2023-04-17 18:56:59 +08:00
}
2022-07-28 13:46:08 +08:00
public function show($id)
{
2022-10-25 22:08:55 +08:00
$sku = GoodsSku::query()
->with(['goods' => function ($query) {
$query->with(['type:id,name', 'brand:id,name']);
}])
2022-10-25 22:08:55 +08:00
->find($id)
->toArray();
$shops = Shop::query()->get(['id', 'name'])->toArray();
if (empty($sku['thumb_url'])) {
foreach ($shops as $shop) {
$sku['thumb_url'][] = [
'shop_id' => $shop['id'],
'shop_name' => $shop['name'],
'img_url' => '',
];
}
}
return ['data' => $sku];
2022-07-28 13:46:08 +08:00
}
public function update($id, Request $request)
{
2022-08-03 16:41:15 +08:00
$goodsRules = (new GoodsRequest())->arrayRules('goods.');
$skuRules = (new GoodsSkuRequest())->arrayRules('sku.');
$validator = Validator::make($request->all(), array_merge($goodsRules, $skuRules));
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
}
DB::beginTransaction();
try {
// 商品规格更新
$sku = GoodsSku::query()->find($id);
2023-04-17 18:56:59 +08:00
$this->setBeforeUpdateForLog($sku->toArray());
2023-04-23 12:15:59 +08:00
$skuInfo = $request->sku;
$skuInfo['external_sku_id'] = $request->goods['goods_code'] . '_' . $request->sku['sku_code'];
2024-03-14 14:29:23 +08:00
$skuInfo['name'] = $request->goods['title'] . $request->sku['title'];
2023-04-23 12:15:59 +08:00
$sku->update($skuInfo);
2023-04-17 18:56:59 +08:00
$this->setAfterUpdateForLog($sku->toArray());
2022-08-03 16:41:15 +08:00
$this->addLog($id, 'update');
// 商品更新
$goods = Goods::query()->find($sku->goods_id);
2022-08-09 20:40:39 +08:00
$this->log = new LogModel([
'module' => 'goods',
'action' => $request->getMethod(),
'target_type' => 'goods',
]);
2023-04-17 18:56:59 +08:00
$this->setBeforeUpdateForLog($goods->toArray());
2022-08-03 16:41:15 +08:00
$goods->update($request->goods);
2023-04-17 18:56:59 +08:00
$this->setAfterUpdateForLog($goods->toArray());
2022-08-09 20:40:39 +08:00
$this->addLog($sku->goods_id, 'update');
2022-08-03 16:41:15 +08:00
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400416,
'errorMessage' => $exception->getMessage(),
];
}
2022-07-28 13:46:08 +08:00
2022-08-03 16:41:15 +08:00
return response($this->res, $this->res['httpCode']);
2022-08-02 11:43:46 +08:00
}
public function batchUpdate(Request $request)
{
$appendRules = [
2024-08-13 18:17:03 +08:00
'updateType' => ['required', 'string', Rule::in(['newest', 'inventory', 'stock', "saleStock"])],
2022-08-03 11:14:08 +08:00
'skus' => ['required', 'array'],
'skus.*.id' => [
2022-08-02 11:43:46 +08:00
'required',
Rule::exists('goods_skus', 'id'),
],
];
2022-08-08 16:00:47 +08:00
$skuRules = (new GoodsSkuRequest())->arrayRules('skus.*.');
$validator = Validator::make($request->all(), array_merge($appendRules, $skuRules));
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
}
$function = $request->updateType;
return $this->$function($request);
2022-08-02 11:43:46 +08:00
}
2022-08-20 13:42:22 +08:00
/**
2024-07-26 17:48:07 +08:00
* 新版本运营管理 主要修改在线库存和成本价(修订) 看看是否需要单独提供修改
2022-08-20 13:42:22 +08:00
*
* @param $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
2024-08-13 18:17:03 +08:00
private function saleStock($request)
2022-08-02 11:43:46 +08:00
{
DB::beginTransaction();
try {
$logs = [];
foreach ($request->skus as $sku) {
$costLog = [
'module' => 'goods',
'action' => $request->getMethod(),
'target_type' => 'goods_sku',
'target_id' => $sku['id'],
'user_id' => $request->user()->id
];
// 成本
2024-08-13 18:17:03 +08:00
$goodsSku = GoodsSku::query()->where('id', $sku['id'])->first(['id', 'cost', 'sale_stock']);
$costLog['target_field'] = 'sale_stock';
$costLog['before_update'] = $goodsSku->sale_stock;
2024-07-26 17:48:07 +08:00
$goodsSku->sale_stock = $sku['sale_stock'];
$goodsSku->save();
2024-08-13 18:17:03 +08:00
$costLog['after_update'] = $goodsSku->sale_stock;
$logs[] = $costLog;
}
$log = new LogModel();
$log->batchInsert($logs);
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400500,
'errorMessage' => $exception->getMessage(),
];
2022-08-02 11:43:46 +08:00
}
return response($this->res, $this->res['httpCode']);
2022-08-02 11:43:46 +08:00
}
2022-08-20 13:42:22 +08:00
/**
2024-07-26 17:48:07 +08:00
* 上新
2022-08-20 13:42:22 +08:00
*
* @param $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
2024-07-26 17:48:07 +08:00
private function newest($request)
2022-08-02 11:43:46 +08:00
{
DB::beginTransaction();
try {
$logs = [];
2024-07-26 17:48:07 +08:00
foreach ($request->skus as $sku) {
$costLog = $arrivedLog = [
'module' => 'goods',
'action' => $request->getMethod(),
'target_type' => 'goods_sku',
'target_id' => $sku['id'],
2024-07-26 17:48:07 +08:00
'user_id' => $request->user()->id
];
2024-07-26 17:48:07 +08:00
// 成本
$goodsSku = GoodsSku::query()->where('id', $sku['id'])->first(['id', 'cost', 'stock', 'num']);
$costLog['target_field'] = 'cost';
$costLog['before_update'] = $goodsSku->cost;
$goodsSku->cost = $sku['cost'];
$goodsSku->reference_price = $sku['cost'] * 1.5;
$goodsSku->stock += $sku['arrived_today_num'];
$goodsSku->num += $sku['arrived_today_num'];
$goodsSku->save();
$costLog['after_update'] = $goodsSku->cost;
$logs[] = $costLog;
// 今日到货
$record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', DateTimeUtils::getToday())->first(['id', 'arrived_today_num']);
$arrivedLog['target_field'] = 'arrived_today_num';
$arrivedLog['before_update'] = $record->arrived_today_num;
$record->arrived_today_num += $sku['arrived_today_num'];
2022-08-23 16:25:31 +08:00
$record->save();
2024-07-26 17:48:07 +08:00
$arrivedLog['after_update'] = $record->arrived_today_num;
$logs[] = $arrivedLog;
}
$log = new LogModel();
$log->batchInsert($logs);
DB::commit();
2024-07-26 17:48:07 +08:00
// 批量更新
event(new BatchStockUpdateEvent(array_column($request->skus, 'id')));
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400500,
'errorMessage' => $exception->getMessage(),
];
2022-08-02 11:43:46 +08:00
}
return response($this->res, $this->res['httpCode']);
2022-08-02 11:43:46 +08:00
}
2024-07-26 17:48:07 +08:00
/**
2024-07-30 15:30:32 +08:00
* 库存盘点 准备废弃中
2024-07-26 17:48:07 +08:00
*
* @param $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
private function inventory($request)
{
2024-07-30 15:30:32 +08:00
DB::beginTransaction();
try {
$logs = [];
$requestSkus = ArrayUtils::index($request->skus, 'id');
$skus = GoodsSku::query()
->whereIn('id', array_keys($requestSkus))
->with(['goods:id,goods_code'])
->get(['id', 'goods_id', 'sku_code'])
->toArray();
$today = DateTimeUtils::getToday();
$nextDay = DateTimeUtils::getNextDay();
$dateTime = date('Y-m-d H:i:s');
foreach ($skus as $sku) {
if (!isset($requestSkus[$sku['id']])) {
continue;
}
// 更新今天
$record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', $today)->first();
// 日志记录
$inventoryLog = [
'module' => 'goods',
'action' => $request->getMethod(),
'target_type' => 'goods_sku',
'target_id' => $sku['id'],
'user_id' => $request->user()->id,
'target_field' => 'inventory',
'before_update' => $record->inventory,
'after_update' => $requestSkus[$sku['id']]['inventory']
];
$externalSkuId = $sku['goods']['goods_code'] . '_' . $sku['sku_code'];
// 自上一次盘点过后有订单发生的数量(包含退单)
$lastInventoryTime = $record->inventory_time;
$addOrderGoodsNum = BusinessOrderItem::query()
->where('external_sku_id', $externalSkuId)
->when($lastInventoryTime, function ($query) use ($lastInventoryTime) {
$query->where('updated_at', '>', $lastInventoryTime);
})
->sum('goods_number');
$reduceOrderGoodsNum = BusinessOrderItem::query()
->where('external_sku_id', $externalSkuId)
->when($lastInventoryTime, function ($query) use ($lastInventoryTime) {
$query->where('updated_at', '>', $lastInventoryTime);
})
->sum('already_cancel_number');
$orderGoodsNum = $addOrderGoodsNum - $reduceOrderGoodsNum;
$record->inventory = $requestSkus[$sku['id']]['inventory'];
$record->inventory_time = $dateTime;
$record->order_goods_num += $orderGoodsNum;
$record->save();
$inventoryLog['message'] = '盘点时订单商品数量: ' . $orderGoodsNum;
$logs[] = $inventoryLog;
// 更新明天
DailyStockRecord::updateOrCreate(
['sku_id' => $sku['id'], 'day' => $nextDay],
[
'inventory' => $record->inventory,
'inventory_time' => $dateTime,
]
);
}
$log = new LogModel();
$log->batchInsert($logs);
DB::commit();
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400500,
'errorMessage' => $exception->getMessage(),
];
}
2024-07-26 17:48:07 +08:00
return response($this->res, $this->res['httpCode']);
2024-07-30 15:30:32 +08:00
2024-07-26 17:48:07 +08:00
}
2022-08-20 13:42:22 +08:00
/**
* 库存修改
*
* @param $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
2022-08-08 20:02:08 +08:00
private function stock($request)
{
2022-08-08 20:02:08 +08:00
$skus = $request->skus;
$update = reset($skus);
DB::beginTransaction();
try {
2022-08-20 18:02:23 +08:00
$sku = GoodsSku::query()->where('id', $update['id'])->with(['goods:id,goods_code'])->first();
$record = DailyStockRecord::query()
->where('sku_id', $sku->id)
2022-08-09 10:34:36 +08:00
->where('day', DateTimeUtils::getToday())
->first();
2023-04-17 18:56:59 +08:00
$this->setBeforeUpdateForLog([
'two_days_ago_num' => $sku->two_days_ago_num,
'yesterday_num' => $sku->yesterday_num,
'arrived_today_num' => $record->arrived_today_num,
'num' => $sku->num,
'stock' => $sku->stock,
]);
2022-08-22 19:55:21 +08:00
$num = $update['two_days_ago_num'] + $update['yesterday_num'] + $update['arrived_today_num'];
$sku->num = $num;
$sku->stock += ($num - $record->arrived_today_num - $sku->two_days_ago_num - $sku->yesterday_num);
2022-08-25 12:26:28 +08:00
$sku->two_days_ago_num = $update['two_days_ago_num'];
$sku->yesterday_num = $update['yesterday_num'];
$sku->save();
$record->arrived_today_num = $update['arrived_today_num'];
$record->save();
2023-04-17 18:56:59 +08:00
$this->setAfterUpdateForLog([
'two_days_ago_num' => $sku->two_days_ago_num,
'yesterday_num' => $sku->yesterday_num,
'arrived_today_num' => $record->arrived_today_num,
'num' => $sku->num,
'stock' => $sku->stock,
]);
$this->addLog($sku->id, 'stock');
DB::commit();
2022-08-16 21:02:31 +08:00
event(new StockUpdateEvent($sku));
} catch (\Exception $exception) {
DB::rollBack();
$this->res = [
'httpCode' => 400,
'errorCode' => 400416,
'errorMessage' => $exception->getMessage(),
];
}
return response($this->res, $this->res['httpCode']);
}
public function updateField($id, Request $request)
2022-08-02 11:43:46 +08:00
{
$rules = [
'updateField' => [
'required',
2024-03-15 16:58:25 +08:00
Rule::in(['reference_price', 'reserve', 'loss_num', 'status', 'goal_rate'])
2022-08-02 11:43:46 +08:00
],
'reference_price' => [
2022-08-02 11:43:46 +08:00
'sometimes',
'numeric',
'gt:0'
],
'reserve' => [
2022-08-02 11:43:46 +08:00
'sometimes',
'integer',
],
'loss_num' => [
2022-08-02 11:43:46 +08:00
'sometimes',
'integer',
],
'reason' => [
2022-08-02 11:43:46 +08:00
'sometimes',
'required',
'string'
],
'status' => [
'sometimes',
'required',
'integer',
2024-03-15 16:58:25 +08:00
Rule::in([0, 1, 2])
],
'goal_rate' => [
'sometimes',
'numeric',
],
2022-08-02 11:43:46 +08:00
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
2024-08-07 16:35:51 +08:00
return response($this->res, $this->res['httpCode']);
}
$updateField = \request('updateField');
$sku = GoodsSku::query()->find($id);
if ('loss_num' === $updateField) {
$record = DailyStockRecord::query()
->where('sku_id', $id)
2022-08-09 10:34:36 +08:00
->where('day', DateTimeUtils::getToday())
->first(['id', 'loss_num']);
$this->log->message = $request->get('reason');
2023-04-17 18:56:59 +08:00
$this->setBeforeUpdateForLog($record->loss_num);
$record->loss_num += $request->loss_num;
$record->save();
2023-04-17 18:56:59 +08:00
$this->setAfterUpdateForLog($record->loss_num);
$sku->stock -= $request->loss_num;
2022-08-17 18:34:27 +08:00
$sku->save();
2022-08-12 17:52:28 +08:00
} else {
2023-04-17 18:56:59 +08:00
$this->setBeforeUpdateForLog($sku->$updateField);
2022-08-17 18:34:27 +08:00
if ('reserve' === $updateField) {
$changeNum = $sku->reserve - $request->reserve;
if (0 > $changeNum + $sku->stock) {
$this->setValidatorFailResponse('预留量超过库存数量');
2024-08-07 16:35:51 +08:00
return response($this->res, $this->res['httpCode']);
2022-08-17 18:34:27 +08:00
}
$sku->stock += $changeNum;
}
2024-07-24 15:45:36 +08:00
2022-08-17 18:34:27 +08:00
$sku->$updateField = $request->$updateField;
$sku->save();
2023-04-17 18:56:59 +08:00
$this->setAfterUpdateForLog($sku->$updateField);
}
2022-08-16 21:02:31 +08:00
if (in_array($updateField, ['reserve', 'loss_num'])) {
event(new StockUpdateEvent($sku));
}
2024-03-18 14:12:57 +08:00
// 更新目标去化率
if ('goal_rate' === $updateField) {
DailySalesReport::query()
->where('date', date('Y-m-d'))
->where('goods_sku_id', $sku->id)
->update([
'goal_rate' => $request->$updateField
]);
}
$this->addLog($id, $updateField);
end:
return response($this->res, $this->res['httpCode']);
2022-07-28 13:46:08 +08:00
}
public function store(Request $request)
{
if (!$request->hasFile('goodsSkus')) {
$this->res = [
'httpCode' => 404,
'errorCode' => 404404,
'errorMessage' => 'not found goodsSkus file',
];
}
try {
2022-08-09 10:57:03 +08:00
$import = new GoodsSkusImport();
$path = $request->file('goodsSkus');
Excel::import($import, $path);
2022-08-01 17:06:43 +08:00
$this->addLog(0, 'import');
} catch (ValidationException $exception) {
$this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages());
}
return response($this->res, $this->res['httpCode']);
}
2022-08-04 14:25:12 +08:00
public function export(Request $request)
{
$type = $request->get('exportType');
ob_end_clean();
2024-02-06 17:04:58 +08:00
if ('week_data' === $type) {
2024-02-06 17:13:24 +08:00
$startDate = Carbon::now()->subWeek()->startOfWeek()->toDateString();
$endDate = Carbon::now()->subWeek()->endOfWeek()->toDateString();
return Excel::download(new WeekDataExport($startDate, $endDate), $startDate . '~' . $endDate . '.xlsx');
2024-02-06 17:04:58 +08:00
}
2022-08-23 19:36:39 +08:00
return Excel::download(new GoodsSkusExport($type), $type . '.xlsx');
2022-08-04 14:25:12 +08:00
}
2022-09-08 01:02:07 +08:00
2023-06-01 20:09:59 +08:00
public function newSetImport(Request $request)
{
if (!$request->hasFile('newSetFile')) {
$this->res = [
'httpCode' => 404,
'errorCode' => 404404,
'errorMessage' => 'not found new set file',
];
}
try {
$import = new NewSetImport();
$path = $request->file('newSetFile');
Excel::import($import, $path);
$this->addLog(0, 'import', 'newSetFile');
} catch (ValidationException $exception) {
$this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages());
}
return response($this->res, $this->res['httpCode']);
}
2022-09-08 01:02:07 +08:00
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']);
}
2023-04-17 18:56:59 +08:00
public function stockNum()
{
2023-04-21 17:46:59 +08:00
$skus = GoodsSku::query()
2023-04-18 11:22:16 +08:00
->where('is_combination', 0)
2023-04-17 18:56:59 +08:00
->where('status', '>', 0)
2023-04-21 17:46:59 +08:00
->pluck('stock', 'external_sku_id')
->toArray();
$roseNum = $otherNum = 0;
foreach ($skus as $externalSkuId => $stock) {
// 玫瑰
if (false !== strpos($externalSkuId, 'M')) {
$roseNum += $stock;
continue;
}
2023-10-21 11:13:59 +08:00
// 多头玫瑰
if (false !== strpos($externalSkuId, 'D')) {
$roseNum += $stock;
continue;
}
2023-04-21 17:46:59 +08:00
// 草花剔除A开头
if (false !== strpos($externalSkuId, 'A')) {
continue;
}
// 剔除Z开头组合
if (false !== strpos($externalSkuId, 'Z')) {
continue;
2023-10-21 11:25:10 +08:00
}
// 剔除测试CS
if (false !== strpos($externalSkuId, 'CS')) {
continue;
2023-04-21 17:46:59 +08:00
}
// 剔除N开头年宵花
2023-10-21 11:13:59 +08:00
// if (false !== strpos($externalSkuId, 'N')) {
// continue;
// }
2023-04-21 17:46:59 +08:00
$otherNum += $stock;
}
2023-04-17 18:56:59 +08:00
return response()->json([
'rose_num' => $roseNum,
2023-04-21 17:46:59 +08:00
'other_num' => $otherNum,
2023-04-17 18:56:59 +08:00
]);
}
2023-07-26 13:58:52 +08:00
public function goodsSkusList(Request $request)
{
$title = $request->input('title');
$data = [];
$goodsSkus = GoodsSku::query()
->with('goods:id,title')
->whereHas('goods', function ($query) use ($title) {
$query->where('title', 'like', '%' . $title . '%');
})
->get(['title', 'external_sku_id', 'goods_id']);
foreach ($goodsSkus as $goodsSku) {
$data[] = [
'external_sku_id' => $goodsSku['external_sku_id'],
'title' => $goodsSku['goods']['title'] . ' ' . $goodsSku['title']
];
}
return $data;
}
2022-07-28 13:46:08 +08:00
}