feat: #10000 下单

This commit is contained in:
赵世界 2023-07-27 21:28:00 +08:00
parent 0cd5af981d
commit 6d8adb0700
9 changed files with 321 additions and 42 deletions

View File

@ -48,9 +48,9 @@ class Test extends Command
{
parent::__construct();
}
public function handle()
{
}
/**
@ -110,6 +110,7 @@ class Test extends Command
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) {
$item['wp_code'] = $subCols['wp_code'];
ShopSender::query()->updateOrCreate(
['shop_id' => $shopId, 'shop_ship_id' => $shopShip->id, 'detail' => $item['detail']],
$item

View File

@ -246,6 +246,7 @@ class ShopsController extends Controller
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) {
$item['wp_code'] = $subCols['wp_code'];
ShopSender::query()->updateOrCreate(
['shop_id' => $shopId, 'shop_ship_id' => $shopShip->id, 'detail' => $item['detail']],
$item

View File

@ -31,4 +31,9 @@ class ShopShip extends Model
{
return $value ? date('Y-m-d H:i:s', $value) : '';
}
public function senders()
{
return $this->hasMany(ShopSender::class, 'shop_ship_id');
}
}

10
app/Models/Waybill.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Waybill extends Model
{
protected $guarded = [];
}

View File

@ -32,48 +32,14 @@ class FaceSheet extends KuaiTuanTuan
return $this->doRequest($type, $appendParams);
}
public function getWayBill()
public function getWayBill($sender, $orderInfo, $wpCode)
{
$type = 'pdd.waybill.get';
$appendParams = [
'param_waybill_cloud_print_apply_new_request' => [
'sender' => [
'address' => [
'city' => '昆明市',
'country' => '中国',
'detail' => '肖家营花卉市场1期-3',
'district' => '官渡区',
'province' => '云南省',
],
'name' => '赵先生',
'mobile' => '13093715108',
],
'trade_order_info_dtos' => [[
'object_id' => 'SF_' . time(),
'order_info' => [
'order_channels_type' => 'PDD',
'trade_order_list' => ['PO-230712-007140873850822']
],
'package_info' => [
'items' => [[
'count' => 1,
'name' => '花落花卉',
]]
],
'recipient' => [
'address' => [
'city' => '成都市',
'detail' => '河之洲3期6栋2单元',
'district' => '崇州市',
'province' => '四川省',
],
'name' => '吕鸶',
'mobile' => '13194975115'
],
'template_url' => 'https://file-link.pinduoduo.com/sf_one',
'user_id' => '2256799818137902',
]],
'wp_code' => 'SF',
'sender' => $sender,
'trade_order_info_dtos' => [$orderInfo],
'wp_code' => $wpCode,
]
];
$appendParams['param_waybill_cloud_print_apply_new_request'] = json_encode($appendParams['param_waybill_cloud_print_apply_new_request'], 256);

View File

@ -0,0 +1,220 @@
<?php
namespace App\Services\Ship;
use App\Models\GoodsSku;
use App\Models\ShopShip;
use App\Services\Business\KuaiTuanTuan\FaceSheet;
class WayBill
{
public $orders;
public $objectId;
public $templateUrl = 'https://file-link.pinduoduo.com/sf_one';
public function get()
{
foreach ($this->orders as $shopId => $order) {
$shop = $this->getShop($shopId);
$faceSheet = new FaceSheet();
$faceSheet->setShop($shop);
foreach ($order as $item) {
[$sender, $orderInfo, $wpCode] = $this->prepareRequest($item, $shop);
$waybill = $this->saveWayBill($item, $shop);
$resp = $faceSheet->getWayBill($sender, $orderInfo, $wpCode);
if (isset($resp['pdd_waybill_get_response'])) {
$data = $resp['pdd_waybill_get_response']['modules'][0];
$data = json_decode($data['print_data'], true);
$waybill->request_id = $resp['pdd_waybill_get_response']['request_id'];
$waybill->encryptedData = $data['encryptedData'];
$waybill->signature = $data['signature'];
$waybill->templateUrl = $data['templateUrl'];
$waybill->ver = $data['ver'];
$waybill->waybill_code = $data['waybill_code'];
$waybill->save();
}
}
}
}
private function saveWayBill($order, $shop)
{
$senderConfig = $shop->senders[0];
$waybill = new Waybill();
$waybill->shop_id = $shop->id;
$waybill->object_id = $this->objectId;
$waybill->sender_country = $senderConfig['country'];
$waybill->sender_province = $senderConfig['province'];
$waybill->sender_city = $senderConfig['city'];
$waybill->sender_district = $senderConfig['district'];
$waybill->sender_detail = $senderConfig['detail'];
$waybill->sender_name = $senderConfig['name'];
$waybill->sender_mobile = $senderConfig['mobile'];
$waybill->recipient_province = $order['recipient_province'];
$waybill->recipient_city = $order['recipient_city'];
$waybill->recipient_district = $order['recipient_district'];
$waybill->recipient_detail = $order['recipient_detail'];
$waybill->recipient_name = $order['recipient_name'];
$waybill->recipient_mobile = $order['recipient_mobile'];
$waybill->user_id = $shop->owner_id;
$waybill->wp_code = $senderConfig['wp_code'];
$waybill->order_sn = $order['order_sn'];
$waybill->items = json_encode($order['items'], 256);
return $waybill;
}
private function prepareRequest($order, $shop)
{
$senderConfig = $shop->senders[0];
$sender = [
'address' => [
'city' => $senderConfig['city'],
'country' => $senderConfig['country'],
'detail' => $senderConfig['detail'],
'district' => $senderConfig['district'],
'province' => $senderConfig['province'],
],
'name' => $senderConfig['name'],
'mobile' => $senderConfig['mobile'],
];
$this->setObjectId();
$items = [];
foreach ($order['items'] as $item) {
if ($item['should_print']) {
$items[] = [
'name' => $item['name'],
'count' => $item['count'],
];
}
}
$orderInfo = [
'object_id' => $this->objectId,
'order_info' => [
'order_channels_type' => 'PDD',
'trade_order_list' => [$order['order_sn']],
],
'package_info' => [
'items' => $items,
],
'recipient' => [
'address' => [
'city' => $order['recipient_city'],
'detail' => $order['recipient_detail'],
'district' => $order['recipient_district'],
'province' => $order['recipient_province'],
],
'name' => $order['recipient_name'],
'mobile' => $order['recipient_mobile'],
],
'template_url' => $this->templateUrl,
'user_id' => $shop->owner_id,
];
return [$sender, $orderInfo, $senderConfig['wp_code']];
}
public function setObjectId()
{
$this->objectId = date('YmdHis') . str_pad(mt_rand(1, 9999999), 7, '0', STR_PAD_LEFT);
return $this;
}
public function setOrders($orders)
{
$orders = $orders->toArray();
// 取出所有组合商品编码
$combinationExternalIds = [];
foreach ($orders as $order) {
foreach ($order['items'] as $item) {
if (false !== strpos($item['external_sku_id'], 'Z')) {
$combinationExternalIds[] = $item['external_sku_id'];
}
}
}
// 获取组合商品详情
$combinations = [];
if ($combinationExternalIds) {
$goodsSkus = GoodsSku::query()
->select(['id', 'external_sku_id'])
->with([
'combinationGoods:id,goods_sku_id,item_id,item_num',
'combinationGoods.goodsSkuItem:id,external_sku_id',
])
->whereIn('external_sku_id', $combinationExternalIds)
->get();
foreach ($goodsSkus as $goodsSku) {
foreach ($goodsSku['combination_goods'] as $item) {
$combinations[$goodsSku['external_sku_id']][] = [
'count' => $item['item_num'],
'external_sku_id' => $item['goods_sku_item']['external_sku_id'],
];
}
}
}
// 订单拆分组合
foreach ($orders as $order) {
$info = [
'order_sn' => $order['order_sn'],
'recipient_province' => $order['receiver_address_province'],
'recipient_city' => $order['receiver_address_city'],
'recipient_district' => $order['receiver_address_district'],
'recipient_detail' => $order['receiver_address_detail'],
'recipient_name' => $order['receiver_name'],
'recipient_mobile' => $order['receiver_mobile'],
'items' => []
];
foreach ($order['items'] as $item) {
$count = $item['goods_number'] - $item['already_cancel_number'];
if (isset($combinations[$item['external_sku_id']])) {
$info['items'][] = [
'is_single' => false,
'should_print' => true,
'name' => $item['goods_name'],
'count' => $count,
'external_sku_id' => $item['external_sku_id'],
];
foreach ($combinations[$item['external_sku_id']] as $combinationItem) {
$info['items'][] = [
'is_single' => true,
'should_print' => false,
'count' => $count * $combinationItem['count'],
'external_sku_id' => $combinationItem['external_sku_id'],
];
}
} else {
$info['items'][] = [
'is_single' => true,
'should_print' => true,
'name' => $item['goods_name'],
'count' => $count,
'external_sku_id' => $item['external_sku_id'],
];
}
}
$this->orders[$order['shop_id']][] = $info;
}
return $this;
}
private function getShop($shopId)
{
return ShopShip::query()
->select(['id', 'shop_id', 'access_token', 'owner_id'])
->where('shop_id', $shopId)
->with([
'senders' => function ($query) {
$query->orderBy('sort')->first();
}
])
->get();
}
}

View File

@ -29,6 +29,7 @@ class CreateShopSendersTable extends Migration
$table->integer('mobile')->nullable();
$table->integer('sort')->default(1);
$table->integer('status')->default(1);
$table->string('wp_code')->default('');
$table->timestamps();
});
}

View File

@ -0,0 +1,69 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateWaybillsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (Schema::hasTable('waybills')) {
return;
}
Schema::create('waybills', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('shop_id');
$table->string('request_id')->default('');
$table->text('encryptedData')->nullable();
$table->string('signature')->default('');
$table->string('templateUrl');
$table->string('ver')->default('');
$table->string('waybill_code')->default('');
$table->string('object_id', 32);
$table->integer('key')->default(0);
$table->string('sender_country');
$table->string('sender_province');
$table->string('sender_city');
$table->string('sender_district');
$table->string('sender_detail');
$table->string('sender_name');
$table->integer('sender_mobile');
$table->string('recipient_country')->default('');
$table->string('recipient_province');
$table->string('recipient_city');
$table->string('recipient_district');
$table->string('recipient_detail');
$table->string('recipient_name');
$table->integer('recipient_mobile');
$table->bigInteger('user_id');
$table->string('wp_code');
$table->string('order_channels_type')->default('PDD');
$table->string('order_sn');
$table->text('items');
$table->timestamps();
$table->index('object_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('waybills');
}
}

View File

@ -98,7 +98,10 @@
</el-card>
<el-card style="margin-top: 10px">
<el-table v-loading="loading" ref="multipleTable" :data="tableData" style="width: 100%">
<el-table v-loading="loading" ref="multipleTable" :data="tableData" style="width: 100%"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55">
</el-table-column>
<el-table-column label="店铺名称">
<template slot-scope="scope">
{{ scope.row.shop.name }}
@ -128,7 +131,7 @@
</template>
</el-table-column>
<el-table-column prop="confirm_at" label="下单时间" width="100"></el-table-column>
<el-table-column prop="print_status" label="打印状态"></el-table-column>
<el-table-column prop="print_status" label="打印次数"></el-table-column>
</el-table>
<!-- 分页功能 -->
@ -223,11 +226,14 @@ export default {
},
mounted() {
//
this.getPlatOrderList();
this.getShopsList();
},
created() {
this.initConfirmAt();
this.getPlatOrderList({
confirm_at_start: this.form.confirm_at[0],
confirm_at_end: this.form.confirm_at[1]
});
},
methods: {
initConfirmAt() {