erp/app/Http/Controllers/Business/BusinessOrderController.php

211 lines
7.6 KiB
PHP

<?php
namespace App\Http\Controllers\Business;
use App\Exports\OrderBlankExport;
use App\Http\Controllers\Controller;
use App\Models\BusinessOrder;
use App\Models\BusinessOrderItem;
use App\Models\GoodsSku;
use App\Models\Shop;
use App\Services\Ship\WayBillService;
use App\Utils\DateTimeUtils;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Resources\BusinessOrderResource;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
class BusinessOrderController extends Controller
{
public function index(Request $request)
{
$shopIds = Shop::query()
->where('plat_id', Shop::$PLAT_KTT)
->pluck('id');
$builder = BusinessOrder::query()
->with([
'shop:id,name',
'items:id,business_order_id,goods_name,goods_number,external_sku_id'
])
->whereIn('shop_id', $shopIds)
->filter();
$externalSkuIds = $request->get('external_sku_ids');
if ($externalSkuIds) {
$ids = BusinessOrderItem::query()->whereIn('external_sku_id', $externalSkuIds)->pluck('business_order_id');
$builder->whereIn('id', $ids);
}
$businessOrders = $builder->orderByDesc('confirm_at')
->paginate($request->get('per_page'));
return BusinessOrderResource::collection($businessOrders);
}
private function getOrderIdsWitmGoodsNum($goodsSkuNum, $orders)
{
$map = [
1 => [
'min' => 1,
'max' => 1
],
2 => [
'min' => 2,
'max' => 5
],
6 => [
'min' => 6,
'max' => 999999
],
];
$numMap = $map[$goodsSkuNum];
// 获取订单商品编码
$externalSkuIds = [];
foreach ($orders as $order) {
foreach ($order->items as $item) {
if ($item['external_sku_id']) {
$externalSkuIds [] = $item['external_sku_id'];
}
}
}
$goodsSkus = GoodsSku::query()
->with('combinationGoods')
->whereIn('external_sku_id', $externalSkuIds)
->get('external_sku_id');
$goodsSkuItems = [];
foreach ($goodsSkus as $goodsSku) {
$goodsSkuItems[$goodsSku['external_sku_id']] = $goodsSku->combinationGoods->count() ?: 1;
}
$ids = [];
foreach ($orders as $order) {
$itemNum = 0;
foreach ($order->items as $item) {
if (0 === $item['cancel_status']) {
$itemNum = isset($goodsSkuItems[$item['external_sku_id']]) ? $itemNum + $goodsSkuItems[$item['external_sku_id']] : $itemNum + 1;
}
}
if ($itemNum >= $numMap['min'] && $itemNum <= $numMap['max']) {
$ids[] = $order['id'];
}
}
return $ids;
}
public function exportOrderBlank(Request $request)
{
$shopId = $request->get('shop_id');
$startNo = $request->get('start_no');
$endNo = $request->get('end_no');
$isSupplier = $request->get('is_supplier');
$field = 'participate_no';
if ($isSupplier) {
$field = 'supply_participate_no';
}
$startTime = BusinessOrder::query()
->where('shop_id', $shopId)
->where('is_supplier', $isSupplier)
->where($field, $startNo)
->orderByDesc('id')
->value('confirm_at');
if (empty($startTime)) {
exit('开始跟团号订单未查询到或正在同步中,请稍后再次获取');
}
$startTime = DateTimeUtils::getMicroTime($startTime);
$endTime = BusinessOrder::query()
->where('shop_id', $shopId)
->where('is_supplier', $isSupplier)
->where($field, $endNo)
->orderByDesc('id')
->value('confirm_at');
if (empty($endTime)) {
exit('结束跟团号订单未查询到或正在同步中,请稍后再次获取');
}
$endTime = DateTimeUtils::getMicroTime($endTime);
if ($startTime > $endTime) {
exit('开始跟团号订单 成交时间 大于 结束跟团号订单时间,请查验后再试!');
}
$orders = BusinessOrder::query()
->with([
'items:id,business_order_id,external_sku_id,goods_number,goods_name,already_cancel_number',
'items.goodsSkuLocation:id,external_sku_id,location,goods_name'
])
->where('shop_id', $shopId)
->where('confirm_at', '>=', $startTime)
->where('confirm_at', '<=', $endTime)
->where('after_sales_status', 0)
->where('cancel_status', 0)
->where('is_supplier', $isSupplier)
->orderByDesc('confirm_at')
->get(['id', $field]);
$distribution = [];
$no = [];
foreach ($orders as $key => $order) {
$index = $key + 1;
$no[] = 'P' . $index . '(' . $order->$field . ')';
foreach ($order->items as $item) {
$item = $item->toArray();
$num = $item['goods_number'] - $item['already_cancel_number'];
if (empty($item['external_sku_id']) || empty($num)) {
continue;
}
$local = $item['goods_sku_location'] ? $item['goods_sku_location']['location'] : '无';
$index = $key + 1;
$index = "P{$index}*{$num}";
[$goodsCode, $skuCode] = explode('_', $item['external_sku_id']);
if (isset($distribution[$item['external_sku_id']])) {
$distribution[$item['external_sku_id']]['p'][] = $index;
$distribution[$item['external_sku_id']]['num'] += $num;
} else {
$distribution[$item['external_sku_id']] = [
'p' => [$index],
'local' => $local,
'num' => $num,
'goods_name' => $item['goods_name'],
'goods_code' => $goodsCode,
'sku_code' => $skuCode,
];
}
}
}
$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)
{
$todayTime = Carbon::today()->timestamp;
$todayTime = DateTimeUtils::getMicroTime($todayTime);
return BusinessOrder::query()
->where('shop_id', $shopId)
->where('confirm_at', '>=', $todayTime)
->groupBy(['activity_no', 'activity_title'])
->get(['activity_title', 'activity_no'])
->toArray();
}
public function print(Request $request)
{
$shopIds = Shop::query()
->where('plat_id', Shop::$PLAT_KTT)
->pluck('id');
$builder = BusinessOrder::query()
->with('items')
->whereIn('shop_id', $shopIds)
->filter();
$externalSkuIds = $request->get('external_sku_ids');
if ($externalSkuIds) {
$ids = BusinessOrderItem::query()->whereIn('external_sku_id', $externalSkuIds)->pluck('business_order_id');
$builder->whereIn('id', $ids);
}
$businessOrders = $builder->get();
$waybill = new WayBillService();
$waybill->setOrders($businessOrders);
$waybill->get();
}
}