diff --git a/app/Exports/OrderBlankExport.php b/app/Exports/OrderBlankExport.php new file mode 100644 index 0000000..6735b0d --- /dev/null +++ b/app/Exports/OrderBlankExport.php @@ -0,0 +1,85 @@ +shopName = $shopName; + $this->no = $no; + $this->count = count($excelDate); + $this->data = $this->createData($excelDate); + } + + /** + * @return \Illuminate\Support\Collection + */ + public function collection() + { + return new Collection($this->data); + } + + private function createData($excelDate) + { + $noStr = implode(',', $this->no); + $data = [ + ['店铺名称', $this->shopName], +// ['跟团号', $noStr], + ['种类', '品牌', '商品规格', '商品名称', '数量', '所在货架编号', '配货'], + ]; + $goodsCodes = array_column($excelDate, 'goods_code'); + $goods = Goods::query() + ->with([ + 'brand:id,name', + 'type:id,name', + ]) + ->whereIn('goods_code', $goodsCodes) + ->get(['goods_code', 'type_id', 'brand_id']) + ->toArray(); + $goods = ArrayUtils::index($goods, 'goods_code'); + foreach ($excelDate as $key => $item) { + $goodsInfo = $goods[$item['goods_code']]; + $arr[0] = $goodsInfo['type']['name']; + $arr[1] = $goodsInfo['brand']['name']; + $arr[2] = $key; + $arr[3] = $item['goods_name']; + $arr[4] = $item['num']; + $arr[5] = $item['local']; + $arr[6] = implode(' ', $item['p']); + $data[] = $arr; + } + + return $data; + } + + public function styles(Worksheet $sheet) + { + $count = $this->count + 2; + $sheet->getStyle('B2')->getAlignment() + ->setVertical('center') + ->setWrapText(true); + $sheet->getStyle('G3:G' . $count)->getAlignment() + ->setVertical('center') + ->setWrapText(true); + $sheet->getColumnDimension('A')->setWidth(10); + $sheet->getColumnDimension('B')->setWidth(10); + $sheet->getColumnDimension('C')->setWidth(10); + $sheet->getColumnDimension('D')->setWidth(60); + $sheet->getColumnDimension('E')->setWidth(5); + $sheet->getColumnDimension('F')->setWidth(11); + $sheet->getColumnDimension('G')->setWidth(14); + } +} diff --git a/app/Http/Controllers/Business/BusinessOrderController.php b/app/Http/Controllers/Business/BusinessOrderController.php index 95ce0d6..18089f4 100644 --- a/app/Http/Controllers/Business/BusinessOrderController.php +++ b/app/Http/Controllers/Business/BusinessOrderController.php @@ -2,12 +2,15 @@ namespace App\Http\Controllers\Business; +use App\Exports\OrderBlankExport; use App\Http\Controllers\Controller; use App\Models\BusinessOrder; +use App\Models\Shop; use App\Utils\DateTimeUtils; use Carbon\Carbon; use Illuminate\Http\Request; use App\Http\Resources\BusinessOrderResource; +use Maatwebsite\Excel\Facades\Excel; class BusinessOrderController extends Controller { @@ -17,7 +20,7 @@ class BusinessOrderController extends Controller ->where('shop_id', '<>', 8) ->with([ 'shop:id,name', - 'items:id,business_order_id,goods_name,goods_number' + 'items:id,business_order_id,goods_name,goods_number,external_sku_id' ]) ->orderByDesc('confirm_at') ->filter() @@ -31,16 +34,16 @@ class BusinessOrderController extends Controller $shopId = $request->get('shop_id'); $startNo = $request->get('start_no'); $endNo = $request->get('end_no'); - $startTime = BusinessOrder::query()->where('participate_no', $startNo)->value('confirm_at'); - $endTime = BusinessOrder::query()->where('participate_no', $endNo)->value('confirm_at'); + $startTime = BusinessOrder::query()->where('shop_id', $shopId)->where('participate_no', $startNo)->value('confirm_at'); + $endTime = BusinessOrder::query()->where('shop_id', $shopId)->where('participate_no', $endNo)->value('confirm_at'); $orders = BusinessOrder::query() ->with([ 'items:id,business_order_id,external_sku_id,goods_number,goods_name', - 'items.goodsSkuLocation:id,external_sku_id,location' + 'items.goodsSkuLocation:id,external_sku_id,location,goods_name' ]) ->where('shop_id', $shopId) - ->where('confirm_at', '>=', $startTime) - ->where('confirm_at', '<=', $endTime) + ->where('confirm_at', '>=', DateTimeUtils::getMicroTime($startTime)) + ->where('confirm_at', '<=', DateTimeUtils::getMicroTime($endTime)) ->where('after_sales_status', 0) ->where('cancel_status', 0) ->where('is_supplier', 1) @@ -51,19 +54,32 @@ class BusinessOrderController extends Controller foreach ($orders as $key => $order) { $no[] = $order->participate_no; foreach ($order->items as $item) { + $item = $item->toArray(); + if (empty($item['external_sku_id'])) { + continue; + } + $local = $item['goods_sku_location'] ? $item['goods_sku_location']['location'] : '货架未找到'; + $index = $key + 1; + $index = 'P' . $index . "({$order->participate_no}) * " . $item['goods_number']; + [$goodsCode, $skuCode] = explode('_', $item['external_sku_id']); if (isset($distribution[$item['external_sku_id']])) { - $distribution[$item['external_sku_id']]['p'][] = $key; + $distribution[$item['external_sku_id']]['p'][] = $index; $distribution[$item['external_sku_id']]['num'] += $item['goods_number']; } else { $distribution[$item['external_sku_id']] = [ - 'p' => [$key], - 'local' => 0, - 'num' => $item['goods_number'] + 'p' => [$index], + 'local' => $local, + 'num' => $item['goods_number'], + 'goods_name' => $item['goods_name'], + 'goods_code' => $goodsCode, ]; } } } - var_dump($distribution, $no); + $shopName = Shop::query()->where('id', $shopId)->value('name'); + ob_end_clean(); + + return Excel::download(new OrderBlankExport($shopName, $no, $distribution), $shopName . date('Y-m-d H:i:s') . '.xlsx'); } public function groupActivity(Request $request, $shopId) @@ -74,8 +90,8 @@ class BusinessOrderController extends Controller return BusinessOrder::query() ->where('shop_id', $shopId) ->where('confirm_at', '>=', $todayTime) - ->groupBy('activity_no') - ->pluck('activity_title', 'activity_no') + ->groupBy(['activity_no', 'activity_title']) + ->get(['activity_title', 'activity_no']) ->toArray(); } } diff --git a/app/Http/Controllers/Goods/GoodsSkuLocationController.php b/app/Http/Controllers/Goods/GoodsSkuLocationController.php index f83d10c..0668242 100644 --- a/app/Http/Controllers/Goods/GoodsSkuLocationController.php +++ b/app/Http/Controllers/Goods/GoodsSkuLocationController.php @@ -67,7 +67,6 @@ class GoodsSkuLocationController extends Controller $import = new GoodsSkuLocationImport(); $path = $request->file('goodsSkuLocation'); Excel::import($import, $path); - $this->addLog(0, 'import'); } catch (ValidationException $exception) { $this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages()); } diff --git a/app/Imports/GoodsSkuLocationImport.php b/app/Imports/GoodsSkuLocationImport.php index 8b06bd7..89019a2 100644 --- a/app/Imports/GoodsSkuLocationImport.php +++ b/app/Imports/GoodsSkuLocationImport.php @@ -28,16 +28,18 @@ class GoodsSkuLocationImport implements ToArray, SkipsEmptyRows, WithStartRow GoodsSkuLocation::query()->whereIn('location', $deleteLocation)->delete(); unset($row); $goods = Goods::query() - ->with(['skus:id,goods_id,sku_code']) ->whereIn('goods_code', $goodsCode) - ->get(['id', 'goods_code']); + ->get(['id', 'goods_code', 'title']); $goodsSkus = []; foreach ($goods as $goodsItem) { - $goodsSkus[$goodsItem['goods_code']][$goodsItem->skus->sku_code] = [ - 'goods_id' => $goodsItem->id, - 'goods_sku_id' => $goodsItem->skus->id, - 'external_sku_id' => $goodsItem['goods_code'] . '_' . $goodsItem->skus->sku_code, - ]; + foreach ($goodsItem->skus as $sku){ + $goodsSkus[$goodsItem['goods_code']][$sku->sku_code] = [ + 'goods_id' => $goodsItem->id, + 'goods_sku_id' => $sku->id, + 'external_sku_id' => $goodsItem['goods_code'] . '_' . $sku->sku_code, + 'goods_name' => $goodsItem['title'] . '_' . $sku->title, + ]; + } } $data = []; foreach ($array as $row) { diff --git a/app/Models/BusinessOrder.php b/app/Models/BusinessOrder.php index 411014d..afd5344 100644 --- a/app/Models/BusinessOrder.php +++ b/app/Models/BusinessOrder.php @@ -83,9 +83,7 @@ class BusinessOrder extends Model public function getAfterSalesStatusAttribute($value) { - $map = ['未售后', '有售后']; - - return $map[$value]; + return empty($value) ? '未售后' : '有售后'; } public function items() diff --git a/app/Utils/DateTimeUtils.php b/app/Utils/DateTimeUtils.php index e23b44d..e80f314 100644 --- a/app/Utils/DateTimeUtils.php +++ b/app/Utils/DateTimeUtils.php @@ -40,6 +40,6 @@ class DateTimeUtils } $time *= 1000; - return ceil($time); + return (int)ceil($time); } } diff --git a/database/migrations/2023_04_03_165820_create_goods_sku_locations_table.php b/database/migrations/2023_04_03_165820_create_goods_sku_locations_table.php index d7b2c17..cb82359 100644 --- a/database/migrations/2023_04_03_165820_create_goods_sku_locations_table.php +++ b/database/migrations/2023_04_03_165820_create_goods_sku_locations_table.php @@ -22,6 +22,7 @@ class CreateGoodsSkuLocationsTable extends Migration $table->string('location'); $table->integer('today_init_num'); $table->string('external_sku_id'); + $table->string('goods_name')->nullable(); $table->tinyInteger('status')->default(1); $table->string('note')->nullable(); $table->timestamps(); diff --git a/resources/frontend/src/api/goods.js b/resources/frontend/src/api/goods.js index 328ed45..0504059 100644 --- a/resources/frontend/src/api/goods.js +++ b/resources/frontend/src/api/goods.js @@ -94,3 +94,36 @@ export function getGoodsList(params) { params, }); } + +// 商品货架 +export function goodsSkuLocation(params) { + return http({ + url: "/api/goods_sku_location", + method: "get", + params, + }); +} + +export function importGoodsSkuLocation(params) { + return http({ + url: "/api/goods_sku_location", + method: "post", + params, + }); +} + +export function updateGoodsSkuLocation(params) { + return http({ + url: "/api/goods_sku_location", + method: "put", + params, + }); +} + +export function deleteGoodsSkuLocation(params) { + return http({ + url: "/api/goods_sku_location", + method: "delete", + params, + }); +} diff --git a/resources/frontend/src/api/plat.js b/resources/frontend/src/api/plat.js index 7313748..5c0492d 100644 --- a/resources/frontend/src/api/plat.js +++ b/resources/frontend/src/api/plat.js @@ -46,3 +46,11 @@ export function platOrderList(params) { params }); } + +export function platOrderExport(params) { + return http({ + url: "/plat_orders/export", + method: "get", + params, + }); +} diff --git a/resources/frontend/src/router/list.js b/resources/frontend/src/router/list.js index 5ab8c01..a02ac0d 100644 --- a/resources/frontend/src/router/list.js +++ b/resources/frontend/src/router/list.js @@ -26,6 +26,11 @@ const list = [ name: "商品品牌", component: () => import("../views/brand/brand.vue"), }, + { + path: "GOODS_SKU_LOCATION", + name: "商品货架", + component: () => import("../views/goods/location.vue"), + }, { path: "SHOP_MANAGE", name: "店铺管理", diff --git a/resources/frontend/src/views/goods/location.vue b/resources/frontend/src/views/goods/location.vue new file mode 100644 index 0000000..1b01acb --- /dev/null +++ b/resources/frontend/src/views/goods/location.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/resources/frontend/src/views/plat/orderList.vue b/resources/frontend/src/views/plat/orderList.vue index 73e53cd..ffe8572 100644 --- a/resources/frontend/src/views/plat/orderList.vue +++ b/resources/frontend/src/views/plat/orderList.vue @@ -3,7 +3,7 @@ - + @@ -51,9 +51,10 @@ - 筛选 - 重置筛选 + 筛选 + 重置筛选 + 配货单导出 @@ -72,7 +73,9 @@ @@ -87,11 +90,33 @@ + + + + + + + + + + + + + + + + + + 导出 + 取消 + + + diff --git a/routes/api.php b/routes/api.php index 14a50a0..2698a17 100644 --- a/routes/api.php +++ b/routes/api.php @@ -49,14 +49,12 @@ Route::middleware(['auth:api', 'check.permissions'])->group(function () { // 平台 Route::resource('plat_goods', 'Business\BusinessGoodsSkusController', ['only' => ['index', 'update', 'destroy']]); Route::get('plat_orders', [BusinessOrderController::class, 'index'])->name('plat.orders.index'); - Route::get('plat_orders/export', [BusinessOrderController::class, 'exportOrderBlank'])->name('plat.orders.export'); Route::get('plat_group_activity/{shopId}', [BusinessOrderController::class, 'groupActivity'])->name('plat.activity.list'); Route::post('plat/sync/{id}/stock', [BusinessGoodsSkusController::class, 'syncStock'])->name('plat.sync.stock'); // 团购 Route::resource('group', 'Group\GroupsController', ['only' => ['index', 'store', 'show', 'update', 'destroy']]); // 商品货架 Route::get('goods_sku_location', [GoodsSkuLocationController::class, 'index'])->name('goods_sku_location.index'); - Route::post('goods_sku_location', [GoodsSkuLocationController::class, 'import'])->name('goods_sku_location.import'); Route::put('goods_sku_location', [GoodsSkuLocationController::class, 'update'])->name('goods_sku_location.update'); Route::delete('goods_sku_location', [GoodsSkuLocationController::class, 'delete'])->name('goods_sku_location.delete'); }); @@ -82,5 +80,7 @@ Route::post('business', [ShopsController::class, 'business'])->name('shop.put.bu // 盘点导入 Route::post('inventory/goods_skus', [GoodsSkusController::class, 'inventoryImport'])->name('goods_sku.inventory'); +// 商品货架导入 +Route::post('goods_sku_location', [GoodsSkuLocationController::class, 'import'])->name('goods_sku_location.import'); Route::post('upload', [UploadController::class, 'store'])->name('upload.file'); diff --git a/routes/web.php b/routes/web.php index 98133c0..9ad8ff0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,6 +3,7 @@ use App\Http\Controllers\Goods\GoodsSkusController; use App\Http\Controllers\Goods\GoodsController; use App\Http\Controllers\Shop\ShopsController; +use App\Http\Controllers\Business\BusinessOrderController; /* |-------------------------------------------------------------------------- @@ -20,6 +21,7 @@ Route::get('/', function () { }); Route::get('goods_skus/export', [GoodsSkusController::class, 'export'])->name('goods_skus.export'); +Route::get('plat_orders/export', [BusinessOrderController::class, 'exportOrderBlank'])->name('plat.orders.export'); Route::get('goods/import/template', [GoodsController::class, 'download'])->name('download.goods_import.template');