mirror of
https://gitee.com/hzchunfen/erp.git
synced 2025-12-01 14:40:44 +00:00
289 lines
11 KiB
PHP
289 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Goods;
|
|
|
|
use App\Events\BatchStockUpdateEvent;
|
|
use App\Events\StockUpdateEvent;
|
|
use App\Exports\GoodsSkusExport;
|
|
use App\Exports\WeekDataExport;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Enum\ExcelKeyEnum;
|
|
use App\Http\Requests\GoodsRequest;
|
|
use App\Http\Requests\GoodsSkuRequest;
|
|
use App\Imports\InventoryImport;
|
|
use App\Imports\LossImport;
|
|
use App\Imports\NewSetImport;
|
|
use App\Imports\PurchaseImport;
|
|
use App\Models\BusinessOrderItem;
|
|
use App\Models\CombinationGood;
|
|
use App\Models\DailySalesReport;
|
|
use App\Models\DeveloperConfig;
|
|
use App\Models\Goods;
|
|
use App\Models\Log;
|
|
use App\Models\Log as LogModel;
|
|
use App\Models\LossRecords;
|
|
use App\Models\PurchaseRecords;
|
|
use App\Services\DeveloperConfig\DeveloperConfigService;
|
|
use App\Services\GoodSku\GoodSkuService;
|
|
use App\Utils\ArrayUtils;
|
|
use App\Utils\DateTimeUtils;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\GoodsSku;
|
|
use App\Http\Resources\GoodsSkuResource;
|
|
use App\Imports\GoodsSkusImport;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
use App\Models\DailyStockRecord;
|
|
use App\Models\Shop;
|
|
|
|
class WareHouseSkusController extends Controller
|
|
{
|
|
public function __construct(Request $request)
|
|
{
|
|
$this->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']);
|
|
}
|
|
|
|
|
|
}
|