商品导入导出
This commit is contained in:
@@ -3,8 +3,10 @@
|
||||
namespace App\Http\Controllers\Product;
|
||||
|
||||
use App\Exceptions\RepositoryException;
|
||||
use App\Exports\ProductExport;
|
||||
use App\Http\Requests\Product\BatchPriceRequest;
|
||||
use App\Http\Requests\Product\ProductFormRequest;
|
||||
use App\Imports\ProductImport;
|
||||
use App\Models\CustomerLevelModel;
|
||||
use App\Models\NoticeModel;
|
||||
use App\Models\ProductModel;
|
||||
@@ -13,6 +15,7 @@ use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
||||
use Modules\AnnoRoute\Attribute\GetRoute;
|
||||
use Modules\AnnoRoute\Attribute\PostRoute;
|
||||
@@ -20,6 +23,7 @@ use Modules\AnnoRoute\Attribute\PutRoute;
|
||||
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
use Modules\Common\Http\Controllers\BaseController;
|
||||
use Modules\SystemTool\Services\SysFileService;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
/**
|
||||
* 商品档案管理(售价 = 成本价 × (100 + 客户等级上浮比例) / 100,不再维护等级价格行)
|
||||
@@ -90,6 +94,53 @@ class ProductController extends BaseController
|
||||
return $this->success(['id' => $product->id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品导出(列格式与导入模板一致,导出文件修改后可直接重新导入);
|
||||
* template=1 时仅输出列头 + 示例行(导入模板)
|
||||
*/
|
||||
#[GetRoute('/export', 'export')]
|
||||
public function export(Request $request): Response
|
||||
{
|
||||
$template = $request->boolean('template');
|
||||
$categoryId = max(0, (int) $request->query('category_id', 0));
|
||||
$filename = $template
|
||||
? '商品导入模板.xlsx'
|
||||
: '商品列表_' . now()->format('Ymd_His') . '.xlsx';
|
||||
return Excel::download(new ProductExport($categoryId, $template), $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* Excel 批量导入商品:整表校验,有错全部不导入;
|
||||
* 分类按名称/路径匹配末级分类,供应商按名称匹配、不存在自动创建;一律新增商品
|
||||
*/
|
||||
#[PostRoute('/import', 'import')]
|
||||
public function import(Request $request): JsonResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'file' => 'required|file|mimes:xlsx,xls|max:10240',
|
||||
], [
|
||||
'file.required' => '请选择要导入的 Excel 文件',
|
||||
'file.mimes' => '仅支持 xlsx/xls 格式的 Excel 文件',
|
||||
'file.max' => '文件大小不能超过 10MB',
|
||||
]);
|
||||
|
||||
$import = new ProductImport();
|
||||
Excel::import($import, $data['file']);
|
||||
|
||||
if ($import->errors !== []) {
|
||||
return $this->error(
|
||||
['errors' => $import->errors],
|
||||
'共发现 ' . count($import->errors) . ' 处数据错误,请修正后重新导入'
|
||||
);
|
||||
}
|
||||
|
||||
$msg = '成功导入 ' . $import->created . ' 件商品';
|
||||
if ($import->suppliersCreated !== []) {
|
||||
$msg .= ',自动创建供应商:' . implode('、', $import->suppliersCreated);
|
||||
}
|
||||
return $this->success(['created' => $import->created], $msg);
|
||||
}
|
||||
|
||||
/** 编辑商品 */
|
||||
#[PutRoute(route: '/{id}', authorize: 'update', where: ['id' => '[0-9]+'])]
|
||||
public function update(int $id, ProductFormRequest $request): JsonResponse
|
||||
|
||||
Reference in New Issue
Block a user