From fdaa818c28ec64321ff3dc007a40cb6b35ce0117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=BB=BA=E7=82=8A?= <924182103@qq.com> Date: Mon, 5 Aug 2024 16:54:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=B2=9C=E8=8A=B12.0-gmv=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=AE=8C=E6=88=90+=20=E5=94=AE=E5=90=8E?= =?UTF-8?q?=E5=8D=95=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/CheckPrice.php | 3 +- .../Commands/KttOrderAfterSaleQuery.php | 54 +++++++++++++++++++ app/Console/Kernel.php | 6 ++- .../BusinessAfterSaleOrderController.php | 42 +++++++++++++++ app/Http/Controllers/Controller.php | 2 +- .../Goods/GoodsCombinationController.php | 12 +++-- .../Supplier/DailyStockRecordController.php | 2 +- .../Supplier/PurchaseRecordController.php | 2 +- app/Http/Service/MessageService.php | 16 ++++-- app/Imports/CombinationGoodsImport.php | 12 +++-- app/Listeners/BusinessOrderUpdateListener.php | 2 +- app/Models/BusinessAfterSaleOrder.php | 33 ++++++++++++ app/Services/Business/BusinessClient.php | 6 ++- .../Business/KuaiTuanTuan/KuaiTuanTuan.php | 52 ++++++++++++++++++ app/Services/Business/KuaiTuanTuan/Order.php | 16 ++++++ app/Services/GoodSku/GoodSkuService.php | 3 +- app/Services/Service/SaleDataService.php | 2 +- ...5020_create_business_after_sale_orders.php | 52 ++++++++++++++++++ resources/lang/zh-CN/permission.php | 12 +++++ routes/api.php | 4 ++ tests/Feature/BusinessOrderUpdateTest.php | 14 ++--- 21 files changed, 319 insertions(+), 28 deletions(-) create mode 100644 app/Console/Commands/KttOrderAfterSaleQuery.php create mode 100644 app/Http/Controllers/Business/BusinessAfterSaleOrderController.php create mode 100644 app/Models/BusinessAfterSaleOrder.php create mode 100644 database/migrations/2024_08_02_175020_create_business_after_sale_orders.php diff --git a/app/Console/Commands/CheckPrice.php b/app/Console/Commands/CheckPrice.php index 33b6ad8..726619f 100644 --- a/app/Console/Commands/CheckPrice.php +++ b/app/Console/Commands/CheckPrice.php @@ -47,10 +47,9 @@ class CheckPrice extends Command //查询价格异常订单 $results = DB::table('business_order_items as a') - ->select('c.title as cn_name', 'b.title as title', DB::raw('ROUND(a.goods_price / 100,2) AS goods_price') + ->select('b.name as cn_name', 'b.title as title', DB::raw('ROUND(a.goods_price / 100,2) AS goods_price') , 'b.cost','a.created_at','a.business_order_id') ->leftJoin('goods_skus as b', 'a.external_sku_id', '=', 'b.external_sku_id') - ->leftJoin('goods as c', 'b.goods_id', '=', 'c.id') ->whereBetween('a.created_at', [$startTime,$endTime]) ->havingRaw('goods_price < cost') ->get(); diff --git a/app/Console/Commands/KttOrderAfterSaleQuery.php b/app/Console/Commands/KttOrderAfterSaleQuery.php new file mode 100644 index 0000000..68a4c08 --- /dev/null +++ b/app/Console/Commands/KttOrderAfterSaleQuery.php @@ -0,0 +1,54 @@ +where('plat_id', Shop::$PLAT_KTT)->where('status', Shop::$STATUS_AUTHORIZED)->get(); + $endTime = DateTimeUtils::getMicroTime(); + $beginTime = $endTime - (15 * 60 * 1000)-1000;//售后单每15min查询一次 多查询一次 + foreach ($shops as $shop) { + BusinessFactory::init()->make($shop->plat_id)->setShop($shop)->downloadAfterSaleOrdersAndSave($beginTime, $endTime); + } + + Log::info('任务完成:快团团根据更新时间获取增量售后单'); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d0fe316..e23b0f6 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -7,6 +7,7 @@ use App\Console\Commands\CheckSkuQualityPeriod; use App\Console\Commands\DailySalesReport; use App\Console\Commands\GoodsSkuDailyReport; use App\Console\Commands\Inventory; +use App\Console\Commands\KttOrderAfterSaleQuery; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use App\Console\Commands\KttOrderQuery; @@ -49,7 +50,10 @@ class Kernel extends ConsoleKernel $schedule->command(DeleteKttQuery::class)->daily(); //新增价格校验 $schedule->command(CheckPrice::class)->everyFifteenMinutes(); - $schedule->command(CheckSkuQualityPeriod::class)->dailyAt('05:30');; + //保质期 + $schedule->command(CheckSkuQualityPeriod::class)->dailyAt('05:30'); + //快团团售后单拉取 + $schedule->command(KttOrderAfterSaleQuery::class)->everyFifteenMinutes(); } diff --git a/app/Http/Controllers/Business/BusinessAfterSaleOrderController.php b/app/Http/Controllers/Business/BusinessAfterSaleOrderController.php new file mode 100644 index 0000000..b5916c1 --- /dev/null +++ b/app/Http/Controllers/Business/BusinessAfterSaleOrderController.php @@ -0,0 +1,42 @@ +where('plat_id', Shop::$PLAT_KTT) + ->pluck('id'); + $builder = BusinessAfterSaleOrder::query() + ->whereIn('shop_id', $shopIds) + ->filter(); + if (!empty($request->created_at_start) & !empty($request->created_at_end)) { + $builder = $builder->whereBetween("after_sale_created_at" + , [$request->created_at_start, $request->created_at_end]); + } + + $businessOrders = $builder->orderByDesc('after_sale_created_at') + ->paginate($request->get('per_page')); + + return JsonResource::collection($businessOrders); + } + +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index cb2412a..f735986 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -63,7 +63,7 @@ class Controller extends BaseController "success" => false, "msg" => $msg, "errorCode" => $errorCode, - "data"=>[] + "data" => [] ]; } } diff --git a/app/Http/Controllers/Goods/GoodsCombinationController.php b/app/Http/Controllers/Goods/GoodsCombinationController.php index f81afdb..337fb51 100644 --- a/app/Http/Controllers/Goods/GoodsCombinationController.php +++ b/app/Http/Controllers/Goods/GoodsCombinationController.php @@ -112,14 +112,19 @@ class GoodsCombinationController extends Controller $itemIds = array_column($combinationGoods, 'item_id'); $skus = GoodsSku::query() ->whereIn('id', $itemIds) - ->pluck('stock', 'id') + ->pluck(null, 'id') ->toArray(); $stock = []; + $saleStock = []; foreach ($combinationGoods as $item) { - $stock[] = (int)($skus[$item['item_id']] / $item['item_num']); + $stock[] = (int)($skus[$item['item_id']]['stock'] / $item['item_num']); + $saleStock[] = (int)($skus[$item['item_id']]['sale_stock'] / $item['item_num']); + } $stock = min($stock); - $status = $stock ? (5 < $stock ? 1 : 2) : 0; + $saleStock = min($saleStock); + + $status = $saleStock ? (5 < $saleStock ? 1 : 2) : 0; if ($id = $request->input('id')) { $sku = GoodsSku::query()->findOrFail($id); } else { @@ -132,6 +137,7 @@ class GoodsCombinationController extends Controller $sku->sku_code = $request->input('external_sku_id'); $sku->external_sku_id = $request->input('external_sku_id'); $sku->stock = $stock; + $sku->sale_stock = $saleStock; $sku->save(); CombinationGood::query() ->where('goods_sku_id', $sku->id) diff --git a/app/Http/Controllers/Supplier/DailyStockRecordController.php b/app/Http/Controllers/Supplier/DailyStockRecordController.php index dd3e2af..1077abf 100644 --- a/app/Http/Controllers/Supplier/DailyStockRecordController.php +++ b/app/Http/Controllers/Supplier/DailyStockRecordController.php @@ -30,7 +30,7 @@ class DailyStockRecordController extends Controller public function index(Request $request) { - $build = DailyStockRecord::query()->filter()->with("goodsSku:id,name,title"); + $build = DailyStockRecord::query()->filter()->with("goodsSku:id,name,title,external_sku_id"); if (!empty($request->title)) { $build->whereHas('goodsSku', function ($query) use ($request) { $query->where('name', 'like', '%' . $request->title . '%'); diff --git a/app/Http/Controllers/Supplier/PurchaseRecordController.php b/app/Http/Controllers/Supplier/PurchaseRecordController.php index 2073a32..66c4e46 100644 --- a/app/Http/Controllers/Supplier/PurchaseRecordController.php +++ b/app/Http/Controllers/Supplier/PurchaseRecordController.php @@ -110,7 +110,7 @@ class PurchaseRecordController extends Controller $goodsSku = GoodsSku::query()->where('id', "=", $id)->get(); if (!empty($goodsSku)) { //可以修改的記錄 - $purchaseRecords = new PurchaseRecords(); + $purchaseRecords = PurchaseRecords::query()->find($id); $purchaseRecords->buyer_name = $allParams['buyer_name'] ?? ''; $purchaseRecords->supplier_name = $allParams['supplier_name'] ?? ''; $purchaseRecords->supplier_id = $allParams['supplier_id'] ?? 0; diff --git a/app/Http/Service/MessageService.php b/app/Http/Service/MessageService.php index f858c22..35e1927 100644 --- a/app/Http/Service/MessageService.php +++ b/app/Http/Service/MessageService.php @@ -27,7 +27,7 @@ class MessageService foreach ($roleIds as $v) { $arr['title'] = "订单价格异常告警"; $arr['role_id'] = $v; - $arr['unique_key'] = $date."-".$businessOrderId; + $arr['unique_key'] = $date . "-" . $businessOrderId . "-" . $v; $arr['type'] = MessageTypeEnum::PRICE_EXCEPTION_NOTICE; $arr['content'] = $date . "订单号:{$businessOrderId}-商品{$productName} 规格{$skuName}价格有异常,当前售价{$goodsPrice}/支,当前成本价{$cost}/支"; @@ -42,7 +42,7 @@ class MessageService * @param $goodsSku * @return void */ - public function createLowerStockNoticeMessage($inventory,$goodsSku) + public function createLowerStockNoticeMessage($inventory, $goodsSku) { $roleIds = $this->roleIdsMapKeyByNoticeType[MessageTypeEnum::LOW_STOCK_NOTICE] ?? []; if (empty($roleIds)) { @@ -52,7 +52,7 @@ class MessageService foreach ($roleIds as $v) { $arr['title'] = "订单库存不足告警"; $arr['role_id'] = $v; - $arr['unique_key'] = $date."-".$goodsSku['id']; + $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v; $arr['type'] = MessageTypeEnum::LOW_STOCK_NOTICE; $arr['content'] = $date . "规格{$goodsSku['title']}库存可能需要补货,当前实际库存{$goodsSku['stock']},上次库存盘点数{$inventory}"; $this->saveWebsiteMessages($arr); @@ -74,7 +74,7 @@ class MessageService foreach ($roleIds as $v) { $arr['title'] = "订单库存不足告警"; $arr['role_id'] = $v; - $arr['unique_key'] = $date."-".$goodsSku['id'];//这个场景下实际是采购单的id + $arr['unique_key'] = $date . "-" . $goodsSku['id'] . "-" . $v;//这个场景下实际是采购单的id $arr['type'] = MessageTypeEnum::QUALITY_PERIOD_EXPIRE_NOTICE; $arr['content'] = $date . "规格{$goodsSku['title']},即将过期,实际库存{$goodsSku['stock']} ,当时采购数量为{$goodsSku['num']},录入采购时间为{$goodsSku['created_at']}"; @@ -86,6 +86,12 @@ class MessageService public function saveWebsiteMessages($arr) { + $hasMessage = WebsiteMessages::query()->where("type", "=", $arr['type']) + ->where("unique_key", "=", $arr['unique_key'])->first(); + if (!empty($hasMessage)) { + //已经写入过了 + return true; + } $websiteMessages = new WebsiteMessages(); $websiteMessages->title = $arr['title']; $websiteMessages->type = $arr['type']; @@ -95,7 +101,7 @@ class MessageService if (!empty($arr['uid'])) { $websiteMessages->uid = $arr['uid']; } - Log::info("站内消息保存",(array)$arr); + Log::info("站内消息保存", (array)$arr); return $websiteMessages->save($arr); } diff --git a/app/Imports/CombinationGoodsImport.php b/app/Imports/CombinationGoodsImport.php index f56a137..5d70322 100644 --- a/app/Imports/CombinationGoodsImport.php +++ b/app/Imports/CombinationGoodsImport.php @@ -6,6 +6,7 @@ use App\Models\CombinationGood; use App\Models\GoodsSku; use App\Utils\ArrayUtils; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Maatwebsite\Excel\Concerns\SkipsEmptyRows; use Maatwebsite\Excel\Concerns\ToArray; use Maatwebsite\Excel\Concerns\WithStartRow; @@ -50,18 +51,23 @@ class CombinationGoodsImport implements ToArray, SkipsEmptyRows, WithStartRow $itemCodes = array_column($info['item'], 'item_code'); $skus = GoodsSku::query() ->whereIn('external_sku_id', $itemCodes) - ->get(['id', 'external_sku_id', 'stock']) + ->get(['id', 'external_sku_id', 'stock', "sale_stock"]) ->toArray(); $skus = ArrayUtils::index($skus, 'external_sku_id'); $stock = []; + $saleStock = []; foreach ($info['item'] as $item) { $stock[] = (int)($skus[$item['item_code']]['stock'] / $item['item_num']); + $saleStock[] = (int)($skus[$item['item_code']]['sale_stock'] / $item['item_num']); + } $stock = min($stock); - $status = $stock ? (5 < $stock ? 1 : 2) : 0; + $saleStock = min($saleStock); + $status = $saleStock ? (5 < $saleStock ? 1 : 2) : 0; $sku = GoodsSku::query()->updateOrCreate( ['external_sku_id' => $info['external_sku_id'], 'is_combination' => 1], - ['title' => $info['title'], 'goods_id' => 0, 'sku_code' => $info['external_sku_id'], 'stock' => $stock, 'status' => $status] + ['title' => $info['title'], 'goods_id' => 0, 'sku_code' => $info['external_sku_id'] + , 'stock' => $stock, "sale_stock" => $saleStock, 'status' => $status] ); CombinationGood::query() ->where('goods_sku_id', $sku->id) diff --git a/app/Listeners/BusinessOrderUpdateListener.php b/app/Listeners/BusinessOrderUpdateListener.php index 0df52b6..820c267 100644 --- a/app/Listeners/BusinessOrderUpdateListener.php +++ b/app/Listeners/BusinessOrderUpdateListener.php @@ -47,7 +47,7 @@ class BusinessOrderUpdateListener implements ShouldQueue $nowTime = Carbon::now()->toDateTimeString(); //查找最后一次盘点数据 $dailyStockRecord = DailyStockRecord::query()->where("sku_id", '=', $skuId)-> - where("inventory_time", '<', $nowTime)->orderByDesc('inventory_time')->first(); + where("inventory_time", '<', $nowTime)->orderByDesc('id')->first(); $inventory = $dailyStockRecord['inventory'] ?? 0; $expireTime = Carbon::now()->addMinutes(30)->toDateTimeString(); $proportion = Cache::remember(CacheKeyEnum::STOCK_RULE_PROPORTION, $expireTime, function () { diff --git a/app/Models/BusinessAfterSaleOrder.php b/app/Models/BusinessAfterSaleOrder.php new file mode 100644 index 0000000..4e15368 --- /dev/null +++ b/app/Models/BusinessAfterSaleOrder.php @@ -0,0 +1,33 @@ +getShop()->id; @@ -156,7 +158,7 @@ abstract class BusinessClient if (strlen($paramsJson) > 1024) { $paramsJson = ''; } - if (!in_array($params['type'], ['pdd.ktt.increment.order.query', 'pdd.ktt.order.list'], true)) { + if (!in_array($params['type'], ['pdd.ktt.increment.order.query', 'pdd.ktt.order.list',"pdd.ktt.after.sales.increment.list"], true)) { $log = new Log(); $log->module = 'plat'; $log->action = $method; @@ -171,7 +173,7 @@ abstract class BusinessClient } $log->save(); } - if (in_array($params['type'], ['pdd.ktt.increment.order.query', 'pdd.ktt.order.list'], true)) { + if (in_array($params['type'], ['pdd.ktt.increment.order.query', 'pdd.ktt.order.list',"pdd.ktt.after.sales.increment.list"], true)) { LogFile::info('快团团请求: ' . $paramsJson); LogFile::info('快团团返回: ' . json_encode($res, 256)); } diff --git a/app/Services/Business/KuaiTuanTuan/KuaiTuanTuan.php b/app/Services/Business/KuaiTuanTuan/KuaiTuanTuan.php index c10ee0b..43fafb4 100644 --- a/app/Services/Business/KuaiTuanTuan/KuaiTuanTuan.php +++ b/app/Services/Business/KuaiTuanTuan/KuaiTuanTuan.php @@ -2,6 +2,7 @@ namespace App\Services\Business\KuaiTuanTuan; +use App\Models\BusinessAfterSaleOrder; use App\Models\BusinessGoodsSku; use App\Models\GoodsSku; use App\Models\GroupGoods; @@ -9,6 +10,7 @@ use App\Models\Shop; use App\Models\ShopShip; use App\Services\Business\BusinessClient; use App\Models\Groups as GroupsModel; +use Carbon\Carbon; use Illuminate\Support\Facades\Log; class KuaiTuanTuan extends BusinessClient @@ -123,6 +125,56 @@ class KuaiTuanTuan extends BusinessClient } } + public function downloadAfterSaleOrdersAndSave($beginTime, $endTime, $page = 1) + { + [$type, $appendParams] = Order::downloadIncrementAfterSaleOrders($beginTime, $endTime, $page); + $responseName = 'ktt_after_sales_incermet_list_response'; + $res = $this->doRequest($type, $appendParams); + if (!isset($res[$responseName])) { + return; + } + $this->saveAfterSaleOrdersServer($res[$responseName]['list']); + if ($res[$responseName]['has_next'] == false) { + return; + } + $pageNum = ceil($res[$responseName]['total_count'] / $appendParams['page_size']); + if ($pageNum > $page && 30 >= $page) { + $this->downloadAfterSaleOrdersAndSave($beginTime, $endTime, $page + 1); + } + + + } + + public function saveAfterSaleOrdersServer($orders) + { + $shopId = $this->getShop()->id; + $now = Carbon::now()->toDateTimeString(); + foreach ($orders as $k => $v) { + $model = BusinessAfterSaleOrder::query()->where("shop_id","=",$shopId) + ->where("after_sales_biz_sn", "=", $v['after_sales_biz_sn'])->first(); + if (empty($model)) { + $model = new BusinessAfterSaleOrder(); + }else{ + $model->updated_at = $now; + } + $model->shop_id = $shopId; + $model->refund_amount = $v['apply_extension']['refund_amount']; + $model->refund_shipping_amount = $v['apply_extension']['refund_shipping_amount']; + $model->description = $v['apply_extension']['description'] ?? ''; + $model->reason = $v['apply_extension']['reason'] ?? ''; + $model->sub_extensions = isset($v['apply_extension']['sub_extensions']) ? json_encode($v['apply_extension']['sub_extensions']) : null; + $model->return_goods_extension = isset($v['return_goods_extension']) ? json_encode($v['return_goods_extension']) : null; + $model->image_list = isset($v['apply_extension']['image_list']) ? json_encode($v['apply_extension']['image_list']) : null; + $model->apply_type = $v['apply_type']; + $model->order_sn = $v['order_sn']; + $model->after_sales_biz_sn = $v['after_sales_biz_sn']; + $model->after_sales_status = $v['after_sales_status']; + $model->after_sale_created_at = !empty($v['created_at']) ? Carbon::createFromTimestamp($v['created_at'] / 1000)->toDateTimeString() : ""; + $model->after_sale_updated_at = !empty($v['updated_at']) ? Carbon::createFromTimestamp($v['created_at'] / 1000)->toDateTimeString() : ""; + $model->save(); + } + } + public function getOrderInfo($orderSn) { [$type, $appendParams] = Order::getOrderInfo($orderSn); diff --git a/app/Services/Business/KuaiTuanTuan/Order.php b/app/Services/Business/KuaiTuanTuan/Order.php index 6d12091..23f1ccf 100644 --- a/app/Services/Business/KuaiTuanTuan/Order.php +++ b/app/Services/Business/KuaiTuanTuan/Order.php @@ -92,5 +92,21 @@ class Order return [$type, $appendParams]; } + + /** + * 快团团增量查售后单订单 + */ + public static function downloadIncrementAfterSaleOrders($beginTime, $endTime, $page = 1) + { + $type = 'pdd.ktt.after.sales.increment.list'; + $appendParams = [ + 'start_updated_at' => $beginTime, // 更新起始时间 + 'end_updated_at' => $endTime, // 更新结束时间 + 'page_number' => $page, // 页码 + 'page_size' => 100, // 数量 + ]; + + return [$type, $appendParams]; + } } diff --git a/app/Services/GoodSku/GoodSkuService.php b/app/Services/GoodSku/GoodSkuService.php index 33d61e6..bf7d6d1 100644 --- a/app/Services/GoodSku/GoodSkuService.php +++ b/app/Services/GoodSku/GoodSkuService.php @@ -25,11 +25,12 @@ class GoodSkuService //传进来的sku可能包含组合商品 所以这里需要事先计算好数据 $inventoryKeyBySkuIdMap = collect($skusWithCombinationGoods)->where('is_combination', "=", 0) ->pluck("inventory", "id")->toArray(); + Log::info("库存原始操作map", $inventoryKeyBySkuIdMap); //计算组合商品 foreach ($skusWithCombinationGoods as $sku) { if (!empty($sku['is_combination'])) { foreach ($sku['combination_goods'] as $combinationGoods) { - if (empty($inventoryKeyBySkuIdMap[$combinationGoods["item_id"]])) { + if (!isset($inventoryKeyBySkuIdMap[$combinationGoods["item_id"]])) { //没有盘点到的sku需要在原先的sku库存 $inventoryKeyBySkuIdMap[$combinationGoods["item_id"]] = GoodsSku::query() ->where('id', $combinationGoods["item_id"])->pluck('stock')->first() ?? 0; diff --git a/app/Services/Service/SaleDataService.php b/app/Services/Service/SaleDataService.php index 49c8e76..bc86f50 100644 --- a/app/Services/Service/SaleDataService.php +++ b/app/Services/Service/SaleDataService.php @@ -153,7 +153,7 @@ class SaleDataService , DB::raw("sum(CASE WHEN b.shipping_status=0 THEN goods_number-already_cancel_number ELSE 0 END) as unshipping_num") , DB::raw("sum(goods_number-already_cancel_number) as goods_total") , DB::raw("ROUND(sum(goods_amount) / 100,2) as goods_total_amount")) - ->where("business_order_items.created_at", ">", Carbon::now()->subDays(3)->startOfDay()->toDateTimeString()) + ->where("business_order_items.created_at", ">", Carbon::now()->startOfDay()->toDateTimeString()) ->where("business_order_items.cancel_status", "=", 0) ->groupBy('external_sku_id')->get()->toArray(); $externalSkuIds = collect($orderItems)->pluck("external_sku_id")->toArray(); diff --git a/database/migrations/2024_08_02_175020_create_business_after_sale_orders.php b/database/migrations/2024_08_02_175020_create_business_after_sale_orders.php new file mode 100644 index 0000000..8b9c560 --- /dev/null +++ b/database/migrations/2024_08_02_175020_create_business_after_sale_orders.php @@ -0,0 +1,52 @@ +bigIncrements('id'); + $table->string('after_sales_biz_sn')->comment('售后单编号'); + $table->string('order_sn')->comment('父单编号'); + $table->integer('shop_id')->comment('门店id'); + $table->integer('after_sales_status')->default(0)->comment('售后单状态 + 0-未发起售后 1-退款中 2-退款成功 3-待处理 4-拒绝退款 6-待(顾客)退货 7-待(团长)确认退货 8-(顾客)撤销 9-(系统)关闭'); + $table->bigInteger('refund_amount')->default(0)->comment('退款金额'); + $table->bigInteger('refund_shipping_amount')->default(0)->comment('用户申请退运费金额'); + $table->string('description')->nullable()->comment('描述'); + $table->string('reason')->nullable()->comment('原因'); + $table->json('sub_extensions')->nullable()->comment('子单信息'); + $table->json('image_list')->nullable()->comment('图片列表'); + $table->json('return_goods_extension')->nullable()->comment('退款物流信息'); + $table->integer('apply_type')->default(0)->comment('售后单类型 0-仅退款 1-退货退款'); + $table->string('after_sale_created_at')->nullable()->comment('售后单三方创建时间'); + $table->string('after_sale_updated_at')->nullable()->comment('售后单三方更新时间'); + + $table->unique(["shop_id",'order_sn']); + $table->index('order_sn'); + $table->index('after_sales_biz_sn'); + $table->index(['after_sales_biz_sn',"apply_type"]); + $table->index('after_sale_created_at'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('business_after_sale_orders'); + } +} diff --git a/resources/lang/zh-CN/permission.php b/resources/lang/zh-CN/permission.php index 36b8ac2..367a760 100644 --- a/resources/lang/zh-CN/permission.php +++ b/resources/lang/zh-CN/permission.php @@ -631,4 +631,16 @@ return [ 'name' => 'gmv统计', 'parent_id' => 18, ], + // 订单列表 + 'PLAT_AFTER_SALE_ORDER_LIST' => [ + 'id' => 141, + 'name' => '售后单列表', + 'parent_id' => 12, + 'show' => 1, + ], + 'plat_after_sale_orders.index' => [ + 'id' => 1411, + 'name' => '售后单列表-接口查询', + 'parent_id' => 141, + ], ]; diff --git a/routes/api.php b/routes/api.php index 8bad387..16151a4 100644 --- a/routes/api.php +++ b/routes/api.php @@ -15,6 +15,7 @@ use App\Http\Controllers\Goods\GoodsCombinationController; use App\Http\Controllers\Supplier\DailyStockRecordController; use App\Http\Controllers\Supplier\LossRecordController; use App\Http\Controllers\Supplier\PurchaseRecordController; +use App\Http\Controllers\Business\BusinessAfterSaleOrderController; /* |-------------------------------------------------------------------------- @@ -90,6 +91,9 @@ Route::middleware(['auth:api', 'check.permissions'])->group(function () { Route::get('data_center/sale_statistics', [DataCenterController::class, 'saleStatistics'])->name('data_center.sale_statistics'); Route::get('data_center/spu_sale_statistics', [DataCenterController::class, 'spuSaleStatistics'])->name('data_center.spu_sale_statistics'); Route::get('data_center/gmv_statistics', [DataCenterController::class, 'gmvStatistics'])->name('data_center.gmv_statistics'); + + Route::get('plat_after_sale_orders', [BusinessAfterSaleOrderController::class, 'index'])->name('plat_after_sale_orders.index'); + }); Route::get('stock/goods_skus', [GoodsSkusController::class, 'stockNum'])->middleware('auth:api'); Route::get('goods/filter/{title}', [GoodsCombinationController::class, 'goodsSkus'])->middleware('auth:api'); diff --git a/tests/Feature/BusinessOrderUpdateTest.php b/tests/Feature/BusinessOrderUpdateTest.php index b446dd7..7bb18bb 100644 --- a/tests/Feature/BusinessOrderUpdateTest.php +++ b/tests/Feature/BusinessOrderUpdateTest.php @@ -20,12 +20,14 @@ class BusinessOrderUpdateTest extends TestCase */ public function testBasicTest() { -// $shop = new \App\Models\Shop(); -// $shop->id=19; -// $shop->access_token="7e00e77428cf45348cb1ca190dc769670377bd0c"; -// $endTime = DateTimeUtils::getMicroTime(); -// $beginTime = $endTime - 63000; -// BusinessFactory::init()->make("快团团")->setShop($shop)->downloadOrdersAndSave($beginTime, $endTime, 'increment'); + /* $shop = new \App\Models\Shop(); + $shop->id = 19; + $shop->plat_id = 1; + $shop->name = "test"; + $shop->access_token = "7e00e77428cf45348cb1ca190dc769670377bd0c"; + $endTime = DateTimeUtils::getMicroTime(); + $beginTime = $endTime - 2*60*60*1000; + BusinessFactory::init()->make("快团团")->setShop($shop)->downloadAfterSaleOrdersAndSave($beginTime, $endTime, 1);*/ } }