erp/app/Http/Controllers/Shop/ShopsController.php

258 lines
9.1 KiB
PHP
Raw Normal View History

2022-08-02 11:43:46 +08:00
<?php
namespace App\Http\Controllers\Shop;
use App\Http\Controllers\Controller;
use App\Models\BusinessGoodsSku;
2022-08-18 14:57:38 +08:00
use App\Models\GoodsSku;
2022-08-02 11:43:46 +08:00
use App\Models\Shop;
use App\Http\Resources\ShopsResource;
2023-07-27 18:30:09 +08:00
use App\Models\ShopSender;
use App\Models\ShopShip;
2023-07-15 18:18:22 +08:00
use App\Services\Business\KuaiTuanTuan\FaceSheet;
2022-08-02 11:43:46 +08:00
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
2022-08-02 11:43:46 +08:00
use Illuminate\Support\Facades\Validator;
use App\Services\Business\BusinessFactory;
use Illuminate\Validation\Rule;
use App\Models\BusinessOrderItem;
2022-08-02 11:43:46 +08:00
class ShopsController extends Controller
{
public function index(Request $request)
2022-08-02 11:43:46 +08:00
{
2022-10-21 13:09:30 +08:00
$shops = Shop::query()->filter()->paginate($request->get('per_page'));
$time = time();
foreach ($shops as $shop) {
$shop->authUrl = '';
2023-07-15 18:18:22 +08:00
if ('已授权' === $shop->status && ($shop->expires_at - time()) / 3600 <= 72) {
$shop->status = '重新授权';
}
if ('妙选' !== $shop->plat_id && ('未授权' === $shop->status || '重新授权' === $shop->status)) {
$shop->authUrl = BusinessFactory::init()->make($shop->plat_id)->getAuthUrl($shop->id, $shop->getOriginal('plat_id'));
}
if ($shop->expires_at && $time >= $shop->expires_at) {
Shop::query()->where('id', $shop->id)->update(['status' => Shop::$STATUS_UNAUTHORIZED]);
}
}
2022-08-02 11:43:46 +08:00
return ShopsResource::collection($shops);
}
public function getPlatList()
{
$shop = new Shop();
return new ShopsResource($shop->getPlatList());
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
2022-08-09 16:56:52 +08:00
'name' => 'required|string|max:191|unique:shops,name',
2022-08-02 11:43:46 +08:00
'plat_id' => 'required|integer',
2022-10-25 10:47:36 +08:00
'ratio' => 'required',
2022-08-02 11:43:46 +08:00
]);
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
}
2022-10-25 10:47:36 +08:00
$operator = substr($request->ratio, 0, 1);
if (!in_array($operator, ['+', '-', '*', '/'])) {
$this->res->errorMessage = '运算符号仅允许+,-,*,/';
return response($this->res, $this->res['httpCode']);
}
2022-08-02 11:43:46 +08:00
$shop = new Shop();
$shop->name = $request->name;
$shop->plat_id = $request->plat_id;
2022-10-24 00:23:09 +08:00
$shop->ratio = $request->ratio;
2022-08-11 04:06:38 +08:00
if (0 == $request->plat_id) {
2022-08-10 23:45:03 +08:00
$shop->status = 2;
}
2022-08-02 11:43:46 +08:00
$shop->save();
return response($this->res, $this->res['httpCode']);
}
2022-10-24 00:23:09 +08:00
public function update(Request $request, $id)
{
2022-10-25 10:47:36 +08:00
$operator = substr($request->ratio, 0, 1);
if (!in_array($operator, ['+', '-', '*', '/'])) {
$this->res->errorMessage = '运算符号仅允许+,-,*,/';
return response($this->res, $this->res['httpCode']);
}
2022-10-24 00:23:09 +08:00
$shop = Shop::query()->find($id);
$shop->ratio = $request->ratio;
$shop->save();
return response($this->res, $this->res['httpCode']);
}
public function authBind(Request $request)
{
[$shopId, $platId] = explode('_', $request->get('state'));
$shop = new Shop();
$platList = $shop->getPlatList();
$shop = $shop->find($shopId);
if ($platList[$platId] === $shop->plat_id) {
2022-08-08 13:45:54 +08:00
BusinessFactory::init()->make($shop->plat_id)->authCallback($request->get('code'), $shop);
} else {
$this->res = [
'httpCode' => 403,
'errorCode' => 403400,
'errorMessage' => '信息不匹配',
];
}
return response($this->res, $this->res['httpCode']);
}
public function business(Request $request)
{
$validator = Validator::make($request->all(), [
'type' => ['required', 'string', Rule::in(['goods', 'orders'])],
'erp_shop_id' => ['required', 'integer', 'exists:shops,id'],
]);
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
}
$shop = new Shop();
$shop = $shop->find($request->get('erp_shop_id'));
$business = BusinessFactory::init()->make($shop->plat_id);
$business->setShop($shop);
if ('goods' === $request->get('type')) {
2022-08-08 10:43:59 +08:00
$business->bindGoods($request->get('data'));
}
if ('orders' === $request->get('type')) {
$business->saveOrders($request->get('data'));
}
2022-08-11 04:06:38 +08:00
return response(['Code' => 10000, 'Message' => 'SUCCESS']);
}
public function countOrdersNumWithSkuCode(Request $request)
{
$validator = Validator::make($request->all(), [
'sku_code' => ['required', 'array'],
]);
if ($validator->fails()) {
$this->setValidatorFailResponse($validator->getMessageBag()->getMessages());
return response($this->res, $this->res['httpCode']);
}
$fields = implode(',', [
'shop_id',
'external_sku_id',
2022-08-18 14:57:38 +08:00
'sum(goods_number) as num',
]);
$res = BusinessOrderItem::query()
->select(DB::raw($fields))
->whereIn('external_sku_id', $request->get('sku_code'))
->groupBy(['shop_id', 'external_sku_id'])
->with(['shop:id,name'])
->get();
$data = [];
foreach ($res as $item) {
2023-04-17 18:56:59 +08:00
$sku = GoodsSku::query()
->where('external_sku_id', $item['external_sku_id'])
2022-08-18 14:57:38 +08:00
->first();
if (empty($sku)) {
continue;
}
$sku = $sku->toArray();
if (!isset($data[$sku['id']]['total'])) {
$data[$sku['id']]['total'] = 0;
}
$data[$sku['id']]['total'] += $item->num;
$data[$sku['id']]['items'][] = [
'shop_name' => $item->shop->name,
2022-08-18 14:57:38 +08:00
'num' => $item->num,
];
}
return $data;
}
2022-08-16 21:15:15 +08:00
public function downloadGoods($id, Request $request)
{
$shop = Shop::query()->find($id);
$business = BusinessFactory::init()->make($shop->plat_id);
$business->setShop($shop);
$res = $business->queryGroup();
if (isset($res['ktt_group_query_list_response'])) {
foreach ($res['ktt_group_query_list_response']['activity_list'] as $activity) {
2023-01-29 14:47:59 +08:00
if (0 === $activity['is_help_sell']) {
$business->downloadGoodsListAndBind($activity['activity_no'], $activity['title']);
}
}
}
2022-08-16 21:15:15 +08:00
return response($this->res, $this->res['httpCode']);
}
2023-04-17 18:56:59 +08:00
public function syncStock(Request $request)
{
$shopId = $request->get('shop_id');
$builder = Shop::query()->where('expires_at', '>', time());
if ('all' === $shopId) {
$shops = $builder->get();
} else {
$shops = $builder->where('id', $shopId)->get();
}
2023-04-23 14:04:42 +08:00
$skus = GoodsSku::query()
->where('updated_at', '>', date('Y-m-d 07:01:00'))
->whereNotNull('external_sku_id')
->pluck('stock', 'external_sku_id')
->toArray();
2023-04-17 18:56:59 +08:00
foreach ($shops as $shop) {
$business = BusinessFactory::init()->make($shop->plat_id);
$business->setShop($shop);
foreach ($skus as $externalSkuId => $stock) {
$businessGoodsSkus = BusinessGoodsSku::query()
->select(['goods_id', 'sku_id', 'external_sku_id'])
->where('shop_id', $shop->id)
->where('is_sync', 1)
->where('external_sku_id', $externalSkuId)
->get()
->toArray();
$business->batchIncrQuantity($businessGoodsSkus, $stock, false);
}
}
return response($this->res, $this->res['httpCode']);
}
public function pddPrintAuth(Request $request)
{
2023-07-15 18:18:22 +08:00
[$shopId, $platId] = explode('_', $request->get('state'));
$faceSheet = new FaceSheet();
$faceSheet->setCode($request->get('code'));
$faceSheet->setShopWithId($shopId);
$faceSheet->auth('ship');
2023-07-27 18:30:09 +08:00
$shopShip = ShopShip::query()
->where('shop_id', $shopId)
->first();
if (empty($shopShip)) {
exit();
}
$faceSheet->setShop($shopShip);
$resp = $faceSheet->searchWayBill();
if (!isset($resp['pdd_waybill_search_response']['waybill_apply_subscription_cols'])) {
exit();
}
foreach ($resp['pdd_waybill_search_response']['waybill_apply_subscription_cols'] as $subCols) {
foreach ($subCols['branch_account_cols'] as $accountCols) {
foreach ($accountCols['shipp_address_cols'] as $item) {
ShopSender::query()->updateOrCreate(
['shop_id' => $shopId, 'shop_ship_id' => $shopShip->id, 'detail' => $item['detail']],
$item
);
}
}
}
}
2022-08-02 11:43:46 +08:00
}