diff --git a/app/Console/Commands/DailySalesReport.php b/app/Console/Commands/DailySalesReport.php new file mode 100644 index 0000000..0bdeb42 --- /dev/null +++ b/app/Console/Commands/DailySalesReport.php @@ -0,0 +1,148 @@ +argument('S'); + $map = [ + 'S1' => [ + 'startTime' => date('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 12:00:00'), + ], + 'S2' => [ + 'startTime' => date('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 13:30:00'), + ], + 'S3' => [ + 'startTime' => date('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 15:00:00'), + ], + 'S4' => [ + 'startTime' => date('Y-m-d 15:00:00'), + 'endTime' => date('Y-m-d 16:00:00'), + ], + 'S5' => [ + 'startTime' => date('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 17:30:00'), + ], + 'S6' => [ + 'startTime' => date('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 20:00:00'), + ], + 'S7' => [ + 'startTime' => Carbon::yesterday()->format('Y-m-d 11:00:00'), + 'endTime' => date('Y-m-d 09:30:00'), + ], + ]; + if (!isset($map[$s])) { + return; + } + $startTime = $map[$s]['startTime']; + $endTime = $map[$s]['endTime']; + + $businessOrderIds = BusinessOrder::query() + ->where('confirm_at', '>=', Carbon::parse($startTime)->getPreciseTimestamp(3)) + ->where('confirm_at', '<=', Carbon::parse($endTime)->getPreciseTimestamp(3)) + ->pluck('id'); + $businessOrderIds = $businessOrderIds->chunk(200); + $fields = implode(',', [ + 'external_sku_id', + 'SUM(already_cancel_number) as total_already_cancel_number', + 'SUM(goods_number) as total_goods_number', + ]); + + $data = []; + foreach ($businessOrderIds as $ids) { + $businessOrderItems = BusinessOrderItem::query() + ->select(DB::raw($fields)) + ->whereIn('business_order_id', $ids) + ->where('external_sku_id', '<>', '') + ->groupBy('external_sku_id') + ->get(); + if ($businessOrderItems->isEmpty()) { + continue; + } + foreach ($businessOrderItems as $businessOrderItem) { + $arr = explode('_', $businessOrderItem['external_sku_id']); + if (2 !== count($arr)) { + continue; + } + if (!isset($data[$businessOrderItem['external_sku_id']])) { + $data[$businessOrderItem['external_sku_id']] = [ + 'total_already_cancel_number' => 0, + 'total_goods_number' => 0, + ]; + } + $data[$businessOrderItem['external_sku_id']]['total_already_cancel_number'] += $businessOrderItem['total_already_cancel_number']; + $data[$businessOrderItem['external_sku_id']]['total_goods_number'] += $businessOrderItem['total_goods_number']; + } + } + + $date = Carbon::parse($startTime)->format('Y-m-d'); + $goodsSkus = GoodsSku::query() + ->select(['goods_id', 'external_sku_id', 'name', 'id']) + ->with(['daily' => function ($query) use ($date) { + $query->where('day', $date); + }]) + ->whereIn('external_sku_id', array_keys($data)) + ->get(); + $goodsSkus = ArrayUtils::index($goodsSkus->toArray(), 'external_sku_id'); + foreach ($data as $externalSkuId => $datum) { + if (!isset($goodsSkus[$externalSkuId])) { + continue; + } + \App\Models\DailySalesReport::query() + ->updateOrCreate([ + 'date' => $date, + 'external_sku_id' => $externalSkuId, + ], [ + 'goods_id' => $goodsSkus[$externalSkuId]['goods_id'], + 'goods_sku_id' => $goodsSkus[$externalSkuId]['id'], + 'name' => $goodsSkus[$externalSkuId]['name'], + 'inventory' => $goodsSkus[$externalSkuId]['daily']['inventory'], + 'arrived_today_num' => $goodsSkus[$externalSkuId]['daily']['arrived_today_num'], + 'already_cancel_number' => $datum['total_already_cancel_number'], + 'loss_num' => $goodsSkus[$externalSkuId]['daily']['loss_num'], + $s => $datum['total_goods_number'], + ]); + } + } +} diff --git a/app/Models/DailySalesReport.php b/app/Models/DailySalesReport.php new file mode 100644 index 0000000..ad0698d --- /dev/null +++ b/app/Models/DailySalesReport.php @@ -0,0 +1,10 @@ +bigIncrements('id'); + $table->date('date'); + $table->unsignedInteger('goods_id'); + $table->unsignedInteger('goods_sku_id'); + $table->string('name'); + $table->string('external_sku_id', 64); + $table->integer('inventory')->default(0)->comment('盘点数量'); + $table->integer('arrived_today_num')->default(0)->comment('今日到货'); +// $table->integer('sales_num')->default(0)->comment('销量'); + $table->integer('already_cancel_number')->default(0)->comment('已取消数量'); + $table->unsignedInteger('loss_num')->default(0)->comment('损耗'); + $table->decimal('goal_rate')->default(0)->comment('目标去化率'); + $table->integer('S1')->default(0)->comment('11-12'); + $table->integer('S2')->default(0)->comment('11-13:30'); + $table->integer('S3')->default(0)->comment('11-15'); + $table->integer('S4')->default(0)->comment('15-16'); + $table->integer('S5')->default(0)->comment('11-17:30'); + $table->integer('S6')->default(0)->comment('11-20'); + $table->integer('S7')->default(0)->comment('11-9:30'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('daily_sales_reports'); + } +}