运营段修改
Some checks failed
自动部署测试 / build-and-deploy (push) Has been cancelled

This commit is contained in:
dev 2025-08-11 18:04:35 +08:00
parent eed20a11b2
commit d57670c7d2
27 changed files with 2757 additions and 739 deletions

View File

@ -28,9 +28,9 @@
"@vueup/vue-quill": "1.2.0", "@vueup/vue-quill": "1.2.0",
"@vueuse/core": "11.3.0", "@vueuse/core": "11.3.0",
"animate.css": "4.1.1", "animate.css": "4.1.1",
"countup.js": "^2.8.0",
"await-to-js": "3.0.0", "await-to-js": "3.0.0",
"axios": "1.7.8", "axios": "1.7.8",
"countup.js": "^2.8.0",
"crypto-js": "4.2.0", "crypto-js": "4.2.0",
"diagram-js": "12.3.0", "diagram-js": "12.3.0",
"didi": "9.0.2", "didi": "9.0.2",
@ -54,7 +54,7 @@
"vue-qr": "^4.0.9", "vue-qr": "^4.0.9",
"vue-router": "4.4.5", "vue-router": "4.4.5",
"vue-types": "5.1.3", "vue-types": "5.1.3",
"vxe-table": "4.5.22" "vxe-table": "^4.5.22"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "9.15.0", "@eslint/js": "9.15.0",

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PackingSpecsVO, PackingSpecsForm, PackingSpecsQuery } from '@/api/amz/packingSpecs/types';
/**
*
* @param query
* @returns {*}
*/
export const listPackingSpecs = (query?: PackingSpecsQuery): AxiosPromise<PackingSpecsVO[]> => {
return request({
url: '/amz/packingSpecs/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getPackingSpecs = (id: string | number): AxiosPromise<PackingSpecsVO> => {
return request({
url: '/amz/packingSpecs/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addPackingSpecs = (data: PackingSpecsForm) => {
return request({
url: '/amz/packingSpecs',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updatePackingSpecs = (data: PackingSpecsForm) => {
return request({
url: '/amz/packingSpecs',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delPackingSpecs = (id: string | number | Array<string | number>) => {
return request({
url: '/amz/packingSpecs/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,146 @@
export interface PackingSpecsVO {
/**
* ID
*/
id: string | number;
/**
* ID
*/
sendOrderId: string | number;
/**
* A
*/
specName: string;
/**
*
*/
cartonCount: number;
/**
*
*/
piecesPerCarton: number;
/**
*
*/
length: number;
/**
*
*/
width: string | number;
/**
*
*/
height: number;
/**
*
*/
weight: number;
}
export interface PackingSpecsForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* ID
*/
sendOrderId?: string | number;
/**
* A
*/
specName?: string;
/**
*
*/
cartonCount?: number;
/**
*
*/
piecesPerCarton?: number;
/**
*
*/
length?: number;
/**
*
*/
width?: string | number;
/**
*
*/
height?: number;
/**
*
*/
weight?: number;
}
export interface PackingSpecsQuery extends PageQuery {
/**
* ID
*/
sendOrderId?: string | number;
/**
* A
*/
specName?: string;
/**
*
*/
cartonCount?: number;
/**
*
*/
piecesPerCarton?: number;
/**
*
*/
length?: number;
/**
*
*/
width?: string | number;
/**
*
*/
height?: number;
/**
*
*/
weight?: number;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,76 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PurchaseOutOrderVO, PurchaseOutOrderForm, PurchaseOutOrderQuery } from '@/api/amz/purchaseOutOrder/types';
/**
*
* @param query
* @returns {*}
*/
export const listPurchaseOutOrder = (query?: PurchaseOutOrderQuery): AxiosPromise<PurchaseOutOrderVO[]> => {
return request({
url: '/amz/purchaseOutOrder/list',
method: 'get',
params: query
});
};
/**
*
* @param tenantId
*/
export const getPurchaseOutOrder = (tenantId: string | number): AxiosPromise<PurchaseOutOrderVO> => {
return request({
url: '/amz/purchaseOutOrder/' + tenantId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addPurchaseOutOrder = (data: PurchaseOutOrderForm) => {
return request({
url: '/amz/purchaseOutOrder',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const createSendOrderByBo = (data: PurchaseOutOrderForm) => {
return request({
url: '/amz/purchaseOutOrder/submit',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updatePurchaseOutOrder = (data: PurchaseOutOrderForm) => {
return request({
url: '/amz/purchaseOutOrder',
method: 'put',
data: data
});
};
/**
*
* @param tenantId
*/
export const delPurchaseOutOrder = (tenantId: string | number | Array<string | number>) => {
return request({
url: '/amz/purchaseOutOrder/' + tenantId,
method: 'delete'
});
};

View File

@ -0,0 +1,275 @@
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
import { OrderOutItemVO } from '@/api/amz/purchaseOutOrderItem/types';
export interface PurchaseOutOrderVO {
/**
*
*/
orderSn: string;
/**
*
*/
warehouseName: string;
/**
*
*/
outsourceWarehouseName: string;
/**
*
*/
supplierName: string;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime: string;
/**
*
*/
statusText: string;
/**
*
*/
createRealname: string;
/**
* PTP流水号
*/
ptpSn: string;
/**
*
*/
productName: string;
/**
* SKU编码
*/
sku: string;
/**
* FNSKU编码
*/
fnsku: string;
/**
*
*/
outsourceQuantity: number;
/**
*
*/
receiveQuantity: number;
/**
*
*/
expectArriveTime: string;
/**
* MSKU编码列表 ()
*/
msku: string;
/**
* ()
*/
planSn: string;
items?: OrderOutItemVO[];
/**
*
*/
sellerName: string;
}
export interface PurchaseOutOrderForm extends BaseEntity {
/**
*
*/
orderSn?: string;
/**
*
*/
warehouseName?: string;
/**
*
*/
outsourceWarehouseName?: string;
/**
*
*/
supplierName?: string;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime?: string;
/**
*
*/
statusText?: string;
/**
*
*/
createRealname?: string;
/**
* PTP流水号
*/
ptpSn?: string;
/**
*
*/
productName?: string;
/**
* SKU编码
*/
sku?: string;
/**
* FNSKU编码
*/
fnsku?: string;
/**
*
*/
outsourceQuantity?: number;
/**
*
*/
receiveQuantity?: number;
/**
*
*/
expectArriveTime?: string;
/**
* MSKU编码列表 ()
*/
msku?: string;
/**
* ()
*/
planSn?: string;
/**
*
*/
sellerName?: string;
items?: OrderOutItemVO[];
quantityLeft?: number;
quantityShipped?: number;
}
export interface PurchaseOutOrderQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
*
*/
warehouseName?: string;
/**
*
*/
outsourceWarehouseName?: string;
/**
*
*/
supplierName?: string;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime?: string;
/**
*
*/
statusText?: string;
/**
*
*/
createRealname?: string;
/**
* PTP流水号
*/
ptpSn?: string;
/**
*
*/
productName?: string;
/**
* SKU编码
*/
sku?: string;
/**
* FNSKU编码
*/
fnsku?: string;
/**
*
*/
outsourceQuantity?: number;
/**
*
*/
receiveQuantity?: number;
/**
*
*/
expectArriveTime?: string;
/**
* MSKU编码列表 ()
*/
msku?: string;
/**
* ()
*/
planSn?: string;
/**
*
*/
sellerName?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,196 @@
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
export interface OrderOutItemVO {
/**
*
*/
itemId: string | number;
/**
* ()
*/
outOrderSn: string;
/**
*
*/
productName: string;
/**
* SKU编码
*/
sku: string;
/**
*
*/
quantityRequire: number;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime: string;
/**
*
*/
createRealname: string;
/**
*
*/
expectArriveTime: string;
/**
*
*/
warehouseName: string;
/**
*
*/
supplierName: string;
/**
*
*/
quantityReal: number;
/**
*
*/
quantityEntry: number;
ratio?: number;
order?: PurchaseOrderVO;
}
export interface OrderOutItemForm extends BaseEntity {
/**
*
*/
itemId?: string | number;
/**
* ()
*/
outOrderSn?: string;
/**
*
*/
productName?: string;
/**
* SKU编码
*/
sku?: string;
/**
*
*/
quantityRequire?: number;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime?: string;
/**
*
*/
createRealname?: string;
/**
*
*/
expectArriveTime?: string;
/**
*
*/
warehouseName?: string;
/**
*
*/
supplierName?: string;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityEntry?: number;
}
export interface OrderOutItemQuery extends PageQuery {
/**
*
*/
itemId?: string | number;
/**
* ()
*/
outOrderSn?: string;
/**
*
*/
productName?: string;
/**
* SKU编码
*/
sku?: string;
/**
*
*/
quantityRequire?: number;
/**
* (Jackson格式: yyyy-MM-dd HH:mm:ss)
*/
bizCreateTime?: string;
/**
*
*/
createRealname?: string;
/**
*
*/
expectArriveTime?: string;
/**
*
*/
warehouseName?: string;
/**
*
*/
supplierName?: string;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityEntry?: number;
/**
*
*/
params?: any;
}

View File

@ -16,6 +16,15 @@ export const listSendOrder = (query?: SendOrderQuery): AxiosPromise<SendOrderVO[
}); });
}; };
export const coverSendOrder = (data?: SendOrderQuery) => {
return request({
url: '/amz/sendOrder/cover/list',
method: 'post',
params: { pageNum: data?.pageNum, pageSize: data?.pageSize },
data: data
});
};
/** /**
* *
* @param id * @param id
@ -39,6 +48,14 @@ export const addSendOrder = (data: SendOrderForm) => {
}); });
}; };
export const transferSendOrder = (data: SendOrderVO) => {
return request({
url: '/amz/sendOrder/transfer',
method: 'post',
data: data
});
};
/** /**
* *
* @param data * @param data
@ -51,6 +68,18 @@ export const updateSendOrder = (data: SendOrderForm) => {
}); });
}; };
/**
*
* @param data
*/
export const updateSendOrderData = (data: SendOrderForm) => {
return request({
url: '/amz/sendOrder/data',
method: 'post',
data: data
});
};
/** /**
* *
* @param id * @param id

View File

@ -1,4 +1,6 @@
import { ShipmentPlanVO } from '@/api/amz/shipmentPlan/types'; import { ShipmentPlanVO } from '@/api/amz/shipmentPlan/types';
import { PackingSpecsVO } from '@/api/amz/packingSpecs/types';
import { SendOrderItemVO } from '@/api/amz/sendOrderItem/types';
export interface SendOrderVO { export interface SendOrderVO {
/** /**
@ -64,6 +66,7 @@ export interface SendOrderVO {
createTime: string; createTime: string;
sendName: string; sendName: string;
items?: SendOrderItemVO[];
bizShipmentPlans: ShipmentPlanVO[]; bizShipmentPlans: ShipmentPlanVO[];
} }
@ -131,7 +134,12 @@ export interface SendOrderForm extends BaseEntity {
sendDetail?: string; sendDetail?: string;
sendName?: string;
sku?: string | number;
orderDetailId?: string | number; orderDetailId?: string | number;
packingSpecsList?: PackingSpecsVO[];
} }
export interface SendOrderQuery extends PageQuery { export interface SendOrderQuery extends PageQuery {

View File

@ -0,0 +1,95 @@
export interface SendOrderItemVO {
/**
* ID
*/
id: string | number;
/**
*
*/
orderSn: string;
/**
*
*/
sendDate: string;
/**
*
*/
storeName: string;
/**
*
*/
productName: string;
/**
*
*/
quantitySend: number;
}
export interface SendOrderItemForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
orderSn?: string;
/**
*
*/
sendDate?: string;
/**
*
*/
storeName?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
}
export interface SendOrderItemQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
*
*/
sendDate?: string;
/**
*
*/
storeName?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
/**
*
*/
params?: any;
}

View File

@ -157,11 +157,15 @@ export interface ShipmentPlanVO {
sendOrders?: SendOrderVO[]; sendOrders?: SendOrderVO[];
amountPrice?: number | string;
/** /**
* id * id
*/ */
sendOrderId?: string | number; sendOrderId?: string | number;
sendOrderIds?: string[] | number[]; sendOrderIds?: string[] | number[];
itemVoList?: ShipmentItemVO[];
} }
interface Address { interface Address {

View File

@ -7,48 +7,63 @@
.pt5 { .pt5 {
padding-top: 5px; padding-top: 5px;
} }
.pr5 { .pr5 {
padding-right: 5px; padding-right: 5px;
} }
.pb5 { .pb5 {
padding-bottom: 5px; padding-bottom: 5px;
} }
.mt5 { .mt5 {
margin-top: 5px; margin-top: 5px;
} }
.mr5 { .mr5 {
margin-right: 5px; margin-right: 5px;
} }
.mb5 { .mb5 {
margin-bottom: 5px; margin-bottom: 5px;
} }
.mb8 { .mb8 {
margin-bottom: 8px; margin-bottom: 8px;
} }
.ml5 { .ml5 {
margin-left: 5px; margin-left: 5px;
} }
.mt10 { .mt10 {
margin-top: 10px; margin-top: 10px;
} }
.mr10 { .mr10 {
margin-right: 10px; margin-right: 10px;
} }
.mb10 { .mb10 {
margin-bottom: 10px; margin-bottom: 10px;
} }
.ml10 { .ml10 {
margin-left: 10px; margin-left: 10px;
} }
.mt20 { .mt20 {
margin-top: 20px; margin-top: 20px;
} }
.mr20 { .mr20 {
margin-right: 20px; margin-right: 20px;
} }
.mb20 { .mb20 {
margin-bottom: 20px; margin-bottom: 20px;
} }
.ml20 { .ml20 {
margin-left: 20px; margin-left: 20px;
} }
@ -74,6 +89,7 @@ h6 {
.el-form .el-form-item__label { .el-form .el-form-item__label {
font-weight: 700; font-weight: 700;
} }
.el-dialog:not(.is-fullscreen) { .el-dialog:not(.is-fullscreen) {
margin-top: 6vh !important; margin-top: 6vh !important;
} }
@ -96,6 +112,7 @@ h6 {
font-size: 13px; font-size: 13px;
} }
} }
.el-table__body-wrapper { .el-table__body-wrapper {
.el-button [class*='el-icon-'] + span { .el-button [class*='el-icon-'] + span {
margin-left: 1px; margin-left: 1px;
@ -288,3 +305,72 @@ h6 {
.top-right-btn { .top-right-btn {
margin-left: auto; margin-left: auto;
} }
/* src/assets/styles/index.scss */
/* 拖拽列样式 */
.sortable-ghost {
opacity: 0.8;
color: #fff !important;
background: #42b983 !important;
}
.top-right-btn {
margin-left: auto;
}
/* ================== 修改点:移除:deep() ================== */
@media (prefers-color-scheme: light) {
.el-table__expanded-cell {
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
.el-table__expanded-cell .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important;
--el-table-header-text-color: #2c3e50 !important;
}
.el-table__expanded-cell .el-table__body-wrapper {
background: #ebf3ff !important;
}
.el-table__expanded-cell .el-table__header th {
background-color: #cfe2ff !important;
border-bottom: 2px solid #a6c5ff !important;
}
.el-table__expanded-cell .el-table__header .cell {
color: #1a2b3c !important;
font-weight: 600;
}
.el-table__expanded-cell .el-table__body tr td {
background-color: transparent !important;
}
.el-table__expanded-cell .el-card {
background: transparent !important;
border: none !important;
}
.el-table__expanded-cell .el-table__body tr:hover > td {
background-color: #ffffff !important;
}
.el-table__expanded-cell .el-table__header tr:hover th {
background-color: #b6d4ff !important;
}
.el-table__expanded-cell .el-table__header .sort-caret.ascending {
border-bottom-color: #1a2b3c;
}
.el-table__expanded-cell .el-table__header .sort-caret.descending {
border-top-color: #1a2b3c;
}
}

View File

@ -1,13 +0,0 @@
<template>
<div>
<svg-icon icon-class="question" @click="goto" />
</div>
</template>
<script setup>
const url = ref('https://plus-doc.dromara.org/');
function goto() {
window.open(url.value);
}
</script>

View File

@ -1,13 +0,0 @@
<template>
<div>
<svg-icon icon-class="github" @click="goto" />
</div>
</template>
<script setup>
const url = ref('https://gitee.com/');
function goto() {
window.open(url.value);
}
</script>

View File

@ -81,7 +81,7 @@ export const usePermissionStore = defineStore('permission', () => {
route.children.forEach((child) => { route.children.forEach((child) => {
if (child.path === 'purchaseOrderConfirm') { if (child.path === 'purchaseOrderConfirm') {
if (useUserStore().roles.includes('gengdan')) { if (useUserStore().roles.includes('gengdan')) {
child.meta.title = '创建半成品转发'; child.meta.title = '创建';
} }
} }
}); });

View File

@ -253,6 +253,10 @@ export const formatText = (text) => {
return text.replace(/\n/g, '<br>'); return text.replace(/\n/g, '<br>');
}; };
export const deepClone = <T>(obj: T): T => {
return JSON.parse(JSON.stringify(obj));
};
export default { export default {
handleTree handleTree
}; };

View File

@ -16,9 +16,9 @@
<el-form-item label="店铺名称" prop="storeName"> <el-form-item label="店铺名称" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.storeName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="亚马逊店铺ID" prop="sellerId">--> <el-form-item label="亚马逊店铺ID" prop="sellerId">
<!-- <el-input v-model="queryParams.sellerId" placeholder="请输入亚马逊店铺ID" clearable @keyup.enter="handleQuery" />--> <el-input v-model="queryParams.sellerId" placeholder="请输入亚马逊店铺ID" clearable @keyup.enter="handleQuery" />
<!-- </el-form-item>--> </el-form-item>
<!-- <el-form-item label="店铺账户" prop="accountName">--> <!-- <el-form-item label="店铺账户" prop="accountName">-->
<!-- <el-input v-model="queryParams.accountName" placeholder="请输入店铺账户名称" clearable @keyup.enter="handleQuery" />--> <!-- <el-input v-model="queryParams.accountName" placeholder="请输入店铺账户名称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->

View File

@ -307,7 +307,7 @@
</el-form-item> </el-form-item>
<el-form-item v-if="quoteForm.type === 'general'" label="基础价格" prop="price" required> <el-form-item v-if="quoteForm.type === 'general'" label="基础价格" prop="price" required>
<div class="kgprice"> <div class="kgprice">
<el-input-number v-model="quoteForm.price" :precision="2" :step="0.1" :min="0" :max="100"> <el-input-number controls-position="right" v-model="quoteForm.price" :precision="2" :step="0.1" :min="0" :max="10000">
<template #suffix> <template #suffix>
<span>/kg</span> <span>/kg</span>
</template> </template>
@ -316,7 +316,7 @@
</el-form-item> </el-form-item>
<el-form-item v-else label="货件总价" prop="totalPrice" required> <el-form-item v-else label="货件总价" prop="totalPrice" required>
<div class="kgprice"> <div class="kgprice">
<el-input-number v-model="quoteForm.totalPrice" :precision="2" :step="0.1" :min="0" :max="100"> <el-input-number controls-position="right" v-model="quoteForm.totalPrice" :precision="2" :step="0.1" :min="0" :max="10000000">
<template #suffix> <template #suffix>
<span></span> <span></span>
</template> </template>
@ -331,13 +331,13 @@
</el-row> </el-row>
<el-form-item label="时效" prop="leadTime"> <el-form-item label="时效" prop="leadTime">
<div class="kgprice"> <div class="kgprice">
<el-input-number v-model="quoteForm.minLeadTime" :min="1" :max="100"> <el-input-number controls-position="right" v-model="quoteForm.minLeadTime" :min="1" :max="10000">
<template #suffix> <template #suffix>
<span></span> <span></span>
</template> </template>
</el-input-number> </el-input-number>
<el-input-number v-model="quoteForm.leadTime" :min="1" :max="10000"> <el-input-number controls-position="right" v-model="quoteForm.leadTime" :min="1" :max="10000">
<template #suffix> <template #suffix>
<span></span> <span></span>
</template> </template>
@ -345,7 +345,7 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="附加费" prop="surcharge"> <el-form-item label="附加费" prop="surcharge">
<el-input-number v-model="quoteForm.surcharge" :precision="2" :step="0.1" :min="0" :max="1000000"> <el-input-number controls-position="right" v-model="quoteForm.surcharge" :precision="2" :step="0.1" :min="0" :max="1000000">
<template #suffix> <template #suffix>
<span></span> <span></span>
</template> </template>
@ -651,8 +651,6 @@ const submitQuoteForm = async () => {
console.log('submitQuoteForm', quoteForm.value); console.log('submitQuoteForm', quoteForm.value);
logisticsQuoteFormRef.value?.validate(async (valid: boolean) => { logisticsQuoteFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
console.log('quoteForm', quoteForm.value);
return;
const res = await checkPriceQuoteByBo(quoteForm.value); const res = await checkPriceQuoteByBo(quoteForm.value);
console.log('submitQuoteForm', res); console.log('submitQuoteForm', res);
if (res.code === 200) { if (res.code === 200) {

View File

@ -28,16 +28,16 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button type="primary" plain icon="RefreshRight" @click="handleOrderAdd" v-hasPermi="['amz:purchaseOrder:add']"> <!-- <el-button type="primary" plain icon="RefreshRight" @click="handleOrderAdd" v-hasPermi="['amz:purchaseOrder:add']">-->
同步今天的采购单 <!-- 同步今天的采购单-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button type="success" plain icon="Refresh" @click="handleOrderUpdate()" v-hasPermi="['amz:purchaseOrder:edit']" <!-- <el-button type="success" plain icon="Refresh" @click="handleOrderUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
>更新采购单状态 <!-- >更新采购单状态-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
<!-- <el-col :span="1.5">--> <!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"--> <!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除--> <!-- >删除-->
@ -101,6 +101,11 @@
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />--> <!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />--> <!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="供应商名称" align="center" prop="supplierName" /> <el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" /> <el-table-column label="店铺名称" align="center" prop="storeName" />
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />--> <!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
@ -401,6 +406,8 @@ const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'
const { purchase_order_status } = toRefs<any>(proxy?.useDict('purchase_order_status')); const { purchase_order_status } = toRefs<any>(proxy?.useDict('purchase_order_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const purchaseOrderList = ref<PurchaseOrderVO[]>([]); const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -743,70 +750,21 @@ const handleExport = () => {
); );
}; };
const route = useRoute();
watch(
() => route.query.orderSn,
(newOrderSn) => {
if (typeof newOrderSn === 'string' && newOrderSn) {
queryParams.value.orderSn = newOrderSn;
getList();
}
},
{ immediate: true } //
);
onMounted(() => { onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style scoped> <style scoped></style>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
/* 内嵌表格容器 */
:deep(.el-table__expanded-cell) .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */
}
/* 表格主体容器 */
:deep(.el-table__expanded-cell) .el-table__body-wrapper {
background: #ebf3ff !important;
}
/* 表头单元格精准控制 */
:deep(.el-table__expanded-cell) .el-table__header th {
background-color: #cfe2ff !important; /* 覆盖默认背景 */
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */
}
/* 表头文字样式 */
:deep(.el-table__expanded-cell) .el-table__header .cell {
color: #1a2b3c !important;
font-weight: 600; /* 加粗字体 */
}
/* 单元格背景 */
:deep(.el-table__expanded-cell) .el-table__body tr td {
background-color: transparent !important;
}
/* 消除卡片干扰 */
:deep(.el-card) {
background: transparent !important;
border: none !important;
}
/* 内嵌表格hover效果 */
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {
background-color: #ffffff !important;
}
/* 表头hover状态 */
:deep(.el-table__expanded-cell) .el-table__header tr:hover th {
background-color: #b6d4ff !important;
}
/* 表头排序按钮颜色 */
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {
border-bottom-color: #1a2b3c;
}
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {
border-top-color: #1a2b3c;
}
</style>

View File

@ -79,6 +79,8 @@
<!-- <el-table-column label="计划采购量" align="center" prop="quantityPlan" />--> <!-- <el-table-column label="计划采购量" align="center" prop="quantityPlan" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" width="90px" /> <el-table-column label="实际采购量" align="center" prop="quantityReal" width="90px" />
<el-table-column label="已下单数量" align="center" prop="quantityShipped" />
<el-table-column label="剩余数量" align="center" prop="quantityLeft" />
<el-table-column label="半成品可发货数量" align="center" prop="sfgAvlQty" width="100px" /> <el-table-column label="半成品可发货数量" align="center" prop="sfgAvlQty" width="100px" />
<!-- <el-table-column label="到货入库量" align="center" prop="quantityEntry" />--> <!-- <el-table-column label="到货入库量" align="center" prop="quantityEntry" />-->
@ -136,6 +138,7 @@
@click="handleForward(scope.row, props.row)" @click="handleForward(scope.row, props.row)"
v-hasRoles="['superadmin', 'gengdan']" v-hasRoles="['superadmin', 'gengdan']"
v-hasPermi="['amz:purchaseOrder:remove']" v-hasPermi="['amz:purchaseOrder:remove']"
v-if="props.row.type == 'com'"
> >
半成品转发 半成品转发
</el-button> </el-button>
@ -154,8 +157,9 @@
link link
type="primary" type="primary"
@click="handleShip(scope.row, props.row)" @click="handleShip(scope.row, props.row)"
v-hasRoles="['superadmin', 'gongying']" v-hasRoles="['superadmin', 'gengdan']"
v-hasPermi="['amz:purchaseOrder:remove']" v-hasPermi="['amz:purchaseOrder:remove']"
v-if="props.row.type == 'ord'"
> >
成品发货 成品发货
</el-button> </el-button>
@ -167,6 +171,12 @@
</el-table-column> </el-table-column>
<!-- <el-table-column type="selection" width="55" align="center" />--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />--> <!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />--> <!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" /> <el-table-column label="供应商名称" align="center" prop="supplierName" />
@ -384,7 +394,7 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitDetailForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitDetailForm"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="detaildialog.visible = false"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
@ -525,106 +535,91 @@
<el-dialog :title="shipDialog.title" v-model="shipDialog.visible" width="1000px" append-to-body> <el-dialog :title="shipDialog.title" v-model="shipDialog.visible" width="1000px" append-to-body>
<el-form ref="sendOrderFormRef" :model="shipForm" :rules="rules3" label-width="120px"> <el-form ref="sendOrderFormRef" :model="shipForm" :rules="rules3" label-width="120px">
<!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
<!-- </el-form-item>-->
<el-form-item label="采购单号" prop="orderSn"> <el-form-item label="采购单号" prop="orderSn">
<el-input v-model="shipForm.orderSn" placeholder="请输入采购单号" /> <el-input v-model="shipForm.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item> </el-form-item>
<!-- <el-form-item label="发货日期" prop="sendDate">-->
<!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购店铺" prop="storeName">-->
<!-- <el-input v-model="form.storeName" placeholder="请输入采购店铺" />-->
<!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName"> <el-form-item label="产品名称" prop="productName">
<el-input v-model="shipForm.productName" placeholder="请输入产品名称" /> <el-input v-model="shipForm.productName" placeholder="请输入产品名称" disabled />
</el-form-item> </el-form-item>
<el-form-item label="发货总数" prop="quantitySend"> <el-form-item label="发货总数" prop="quantitySend">
<el-input v-model="shipForm.quantitySend" placeholder="请输入发货数" /> <el-input-number :min="1" :max="quantity" controls-position="right" v-model="shipForm.quantitySend" placeholder="发货总数" />
</el-form-item> </el-form-item>
<el-form-item label="总箱数" prop="boxCount">
<el-input v-model="shipForm.boxCount" placeholder="请输入总箱数" />
</el-form-item>
<el-form-item v-if="shipForm.quantitySend > 0 && shipForm.boxCount > 0" label="箱子明细" prop="quantityPerBox">
<div class="max-w-800px">
<div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center">
<el-input
v-model.number="groups[index].boxCount"
placeholder="箱子数量"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'boxCount')"
/>
X
<el-input
v-model.number="groups[index].itemCount"
placeholder="每箱个数"
type="number"
min="0"
class="flex-1"
@input="validateInput(index, 'itemCount')"
/>
<el-input v-model.number="groups[index].lengthPerBox" placeholder="长(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].widthPerBox" placeholder="宽(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].heightPerBox" placeholder="高(cm)" type="number" min="0" class="flex-1" />
<el-input v-model.number="groups[index].weightPerBox" placeholder="单箱重量(kg)" type="number" min="0" class="flex-1" />
<el-button v-if="index > 0" @click="removeGroup(index)" type="danger" :icon="Close" circle size="small" />
<div v-else class="w-8 h-8"></div>
</div>
<div class="mb-16px text-left">
<span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']">
当前总量{{ totalNum }}/{{ shipForm.quantitySend }}
</span>
<el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= shipForm.quantitySend"> 添加一组 </el-button>
</div>
</div>
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-row>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="plength" placeholder="请输入长" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pwidth" placeholder="请输入宽" />-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-input v-model="pheight" placeholder="请输入高" />-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form-item>-->
<el-form-item label="总重量" prop="weightPerBox">
<!-- <el-input v-model="totalWeight" placeholder="请输入总重量" disabled />-->
<el-input-number v-model="totalWeight" :min="0" :max="100000" disabled>
<template #suffix>
<span>kg</span>
</template>
</el-input-number>
</el-form-item>
<!-- <el-form-item label="实际采购店铺" prop="realStoreName">-->
<!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货状态" prop="sendStatus">-->
<!-- <el-select v-model="form.sendStatus" placeholder="请选择发货状态">-->
<!-- <el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="shipSubmitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="shipSubmitForm"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="shipDialog.visible = false"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<!-- <el-dialog :title="shipDialog.title" v-model="shipDialog.visible" width="1000px" append-to-body>-->
<!-- <el-form ref="sendOrderFormRef" :model="shipForm" :rules="rules3" label-width="120px">-->
<!-- <el-form-item label="采购单号" prop="orderSn">-->
<!-- <el-input v-model="shipForm.orderSn" placeholder="请输入采购单号" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="产品名称" prop="productName">-->
<!-- <el-input v-model="shipForm.productName" placeholder="请输入产品名称" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货总数" prop="quantitySend">-->
<!-- <el-input v-model="shipForm.quantitySend" placeholder="请输入发货数量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="总箱数" prop="boxCount">-->
<!-- <el-input v-model="shipForm.boxCount" placeholder="请输入总箱数" />-->
<!-- </el-form-item>-->
<!-- <el-form-item v-if="shipForm.quantitySend > 0 && shipForm.boxCount > 0" label="箱子明细" prop="quantityPerBox">-->
<!-- <div class="max-w-800px">-->
<!-- <div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center">-->
<!-- <el-input-->
<!-- v-model.number="groups[index].cartonCount"-->
<!-- placeholder="箱子数量"-->
<!-- type="number"-->
<!-- min="0"-->
<!-- class="flex-1"-->
<!-- @input="validateInput(index, 'boxCount')"-->
<!-- />-->
<!-- X-->
<!-- <el-input-->
<!-- v-model.number="groups[index].piecesPerCarton"-->
<!-- placeholder="每箱个数"-->
<!-- type="number"-->
<!-- min="0"-->
<!-- class="flex-1"-->
<!-- @input="validateInput(index, 'itemCount')"-->
<!-- />-->
<!-- <el-input v-model.number="groups[index].length" placeholder="长(cm)" type="number" min="0" class="flex-1" />-->
<!-- <el-input v-model.number="groups[index].width" placeholder="宽(cm)" type="number" min="0" class="flex-1" />-->
<!-- <el-input v-model.number="groups[index].height" placeholder="高(cm)" type="number" min="0" class="flex-1" />-->
<!-- <el-input v-model.number="groups[index].weight" placeholder="单箱重量(kg)" type="number" min="0" class="flex-1" />-->
<!-- <el-button v-if="index > 0" @click="removeGroup(index)" type="danger" :icon="Close" circle size="small" />-->
<!-- <div v-else class="w-8 h-8"></div>-->
<!-- </div>-->
<!-- <div class="mb-16px text-left">-->
<!-- <span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']">-->
<!-- 当前总量{{ totalNum }}/{{ shipForm.quantitySend }}-->
<!-- </span>-->
<!-- <el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= shipForm.quantitySend"> 添加一组 </el-button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="总重量" prop="weightPerBox">-->
<!-- &lt;!&ndash; <el-input v-model="totalWeight" placeholder="请输入总重量" disabled />&ndash;&gt;-->
<!-- <el-input-number v-model="totalWeight" :min="0" :max="100000" disabled>-->
<!-- <template #suffix>-->
<!-- <span>kg</span>-->
<!-- </template>-->
<!-- </el-input-number>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<!-- <template #footer>-->
<!-- <div class="dialog-footer">-->
<!-- <el-button :loading="buttonLoading" type="primary" @click="shipSubmitForm"> </el-button>-->
<!-- <el-button @click="cancel"> </el-button>-->
<!-- </div>-->
<!-- </template>-->
<!-- </el-dialog>-->
</div> </div>
</template> </template>
@ -638,12 +633,17 @@ import { updateOrderItemDetail } from '@/api/amz/purchaseOrderItem';
import { SendOrderForm } from '@/api/amz/sendOrder/types'; import { SendOrderForm } from '@/api/amz/sendOrder/types';
import { Close, Plus } from '@element-plus/icons-vue'; import { Close, Plus } from '@element-plus/icons-vue';
import { addSendOrder, updateSendOrder } from '@/api/amz/sendOrder'; import { addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { PackingSpecsVO } from '@/api/amz/packingSpecs/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status')); const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no')); const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status')); const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const route = useRoute();
const plength = ref<string | number>(); const plength = ref<string | number>();
const pheight = ref<string | number>(); const pheight = ref<string | number>();
const pwidth = ref<string | number>(); const pwidth = ref<string | number>();
@ -904,34 +904,19 @@ const data = reactive<PageData<PurchaseOrderForm, PurchaseOrderQuery>>({
// sendDate: [{ required: true, message: '', trigger: 'blur' }], // sendDate: [{ required: true, message: '', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }], storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }], productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }], quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }]
quantityPerBox: [ // quantityPerBox: [
{
validator: (rule, value, callback) => {
if (totalBoxCount.value != shipForm.value.boxCount) {
console.log('totalBoxCount.value', totalBoxCount.value);
console.log('form.value.boxCount', shipForm.value.boxCount);
callback(new Error('明细箱数和总箱数不匹配,请调整'));
}
//
if (totalNum.value > shipForm.value.quantitySend) {
const exceed = totalNum.value - shipForm.value.quantitySend;
callback(new Error('总量超出 ' + exceed + ',请调整'));
} else {
callback();
}
},
trigger: 'blur'
}
],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
// boxDimensions: [
// { // {
// required: true,
// message: '',
// validator: (rule, value, callback) => { // validator: (rule, value, callback) => {
// if (!plength.value || !pwidth.value || !pheight.value) { // if (totalBoxCount.value != shipForm.value.boxCount) {
// callback(new Error('')); // console.log('totalBoxCount.value', totalBoxCount.value);
// console.log('form.value.boxCount', shipForm.value.boxCount);
// callback(new Error(''));
// }
// //
// if (totalNum.value > shipForm.value.quantitySend) {
// const exceed = totalNum.value - shipForm.value.quantitySend;
// callback(new Error(' ' + exceed + ''));
// } else { // } else {
// callback(); // callback();
// } // }
@ -939,9 +924,24 @@ const data = reactive<PageData<PurchaseOrderForm, PurchaseOrderQuery>>({
// trigger: 'blur' // trigger: 'blur'
// } // }
// ], // ],
weightPerBox: [{ required: true, message: '总重量不能为空', trigger: 'blur' }], // boxCount: [{ required: true, message: '', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }], // // boxDimensions: [
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }] // // {
// // required: true,
// // message: '',
// // validator: (rule, value, callback) => {
// // if (!plength.value || !pwidth.value || !pheight.value) {
// // callback(new Error(''));
// // } else {
// // callback();
// // }
// // },
// // trigger: 'blur'
// // }
// // ],
// weightPerBox: [{ required: true, message: '', trigger: 'blur' }],
// realStoreName: [{ required: true, message: '', trigger: 'blur' }],
// sendStatus: [{ required: true, message: '', trigger: 'change' }]
} }
}); });
@ -1196,6 +1196,9 @@ const handleForward = async (row?, rowM?) => {
// forwardForm.value.trackerId = row?.trackerId; // forwardForm.value.trackerId = row?.trackerId;
// forwardForm.value.fwdStatus = row?.fwdStatus; // forwardForm.value.fwdStatus = row?.fwdStatus;
// forwardForm.value.sendTime = row?.sendTime; // forwardForm.value.sendTime = row?.sendTime;
forwardForm.value.quantitySend = null;
forwardForm.value.inSupplierName = null;
forwardForm.value.inOrderSn = null;
console.log('maxQuality', maxQuality.value); console.log('maxQuality', maxQuality.value);
console.log('row', row); console.log('row', row);
@ -1205,6 +1208,8 @@ const handleForward = async (row?, rowM?) => {
forwardDialog.title = '添加转发数据'; forwardDialog.title = '添加转发数据';
}; };
const quantity = ref(0);
const handleShip = async (row?, rowM?) => { const handleShip = async (row?, rowM?) => {
let isExist = false; let isExist = false;
rowM.forwardList?.forEach((item) => { rowM.forwardList?.forEach((item) => {
@ -1217,12 +1222,14 @@ const handleShip = async (row?, rowM?) => {
proxy?.$modal.msgError('该订单已有转发订单,无法进行成品发货!'); proxy?.$modal.msgError('该订单已有转发订单,无法进行成品发货!');
return; return;
} }
quantity.value = row?.quantityLeft;
shipForm.value.orderSn = row?.orderSn; shipForm.value.orderSn = row?.orderSn;
shipForm.value.productName = row?.productName; shipForm.value.productName = row?.productName;
shipForm.value.quantitySend = row?.quantityReal; shipForm.value.quantitySend = row?.quantityReal;
shipForm.value.storeName = rowM?.storeName; shipForm.value.storeName = rowM?.storeName;
shipForm.value.orderDetailId = row?.id; shipForm.value.orderDetailId = row?.id;
shipForm.value.sendName = rowM?.supplierName;
shipForm.value.sku = row?.sku;
shipDialog.visible = true; shipDialog.visible = true;
}; };
@ -1312,37 +1319,40 @@ const handleExport = () => {
); );
}; };
const groups = ref([ const groups = ref<PackingSpecsVO[]>([
{ {
boxCount: null, id: undefined,
itemCount: null, sendOrderId: undefined,
lengthPerBox: null, specName: undefined,
widthPerBox: null, cartonCount: undefined,
heightPerBox: null, piecesPerCarton: undefined,
weightPerBox: null length: undefined,
width: undefined,
height: undefined,
weight: undefined
} }
]); ]);
// //
const totalNum = computed(() => { const totalNum = computed(() => {
return groups.value.reduce((sum, group) => { return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0; const box = Number(group.cartonCount) || 0;
const item = Number(group.itemCount) || 0; const item = Number(group.piecesPerCarton) || 0;
return sum + box * item; return sum + box * item;
}, 0); }, 0);
}); });
const totalWeight = computed(() => { const totalWeight = computed(() => {
return groups.value.reduce((sum, group) => { return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0; const box = Number(group.cartonCount) || 0;
return sum + box * group.weightPerBox; return sum + box * group.weight;
}, 0); }, 0);
}); });
// //
const totalBoxCount = computed(() => { const totalBoxCount = computed(() => {
return groups.value.reduce((sum, group) => { return groups.value.reduce((sum, group) => {
const box = Number(group.boxCount) || 0; const box = Number(group.cartonCount) || 0;
return sum + box; return sum + box;
}, 0); }, 0);
}); });
@ -1409,24 +1419,26 @@ const shipSubmitForm = () => {
'规格' + '规格' +
numberToLetter(index) + numberToLetter(index) +
': ' + ': ' +
group.boxCount + group.cartonCount +
'箱x' + '箱x' +
group.itemCount + group.piecesPerCarton +
'件,长' + '件,长' +
group.lengthPerBox + group.length +
'cm宽' + 'cm宽' +
group.widthPerBox + group.width +
'cm高' + 'cm高' +
group.heightPerBox + group.height +
'cm' + 'cm' +
'单箱重量' + '单箱重量' +
group.weightPerBox + group.weight +
'kg' + 'kg' +
'\n' '\n'
); );
}, ''); }, '');
console.log('sendText: ', sendText); console.log('sendText: ', sendText);
shipForm.value.sendDetail = sendText; shipForm.value.sendDetail = null;
shipForm.value.packingSpecsList = groups.value;
console.log('shipForm', shipForm.value);
sendOrderFormRef.value?.validate(async (valid: boolean) => { sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
@ -1447,70 +1459,19 @@ function numberToLetter(num: number): string {
return String.fromCharCode(num + 65); return String.fromCharCode(num + 65);
} }
watch(
() => route.query.orderSn,
(newOrderSn) => {
if (typeof newOrderSn === 'string' && newOrderSn) {
queryParams.value.orderSn = newOrderSn;
getList();
}
},
{ immediate: true } //
);
onMounted(() => { onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style scoped> <style scoped></style>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
/* 内嵌表格容器 */
:deep(.el-table__expanded-cell) .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */
}
/* 表格主体容器 */
:deep(.el-table__expanded-cell) .el-table__body-wrapper {
background: #ebf3ff !important;
}
/* 表头单元格精准控制 */
:deep(.el-table__expanded-cell) .el-table__header th {
background-color: #cfe2ff !important; /* 覆盖默认背景 */
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */
}
/* 表头文字样式 */
:deep(.el-table__expanded-cell) .el-table__header .cell {
color: #1a2b3c !important;
font-weight: 600; /* 加粗字体 */
}
/* 单元格背景 */
:deep(.el-table__expanded-cell) .el-table__body tr td {
background-color: transparent !important;
}
/* 消除卡片干扰 */
:deep(.el-card) {
background: transparent !important;
border: none !important;
}
/* 内嵌表格hover效果 */
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {
background-color: #ffffff !important;
}
/* 表头hover状态 */
:deep(.el-table__expanded-cell) .el-table__header tr:hover th {
background-color: #b6d4ff !important;
}
/* 表头排序按钮颜色 */
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {
border-bottom-color: #1a2b3c;
}
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {
border-top-color: #1a2b3c;
}
</style>

View File

@ -141,6 +141,11 @@
</el-table-column> </el-table-column>
<!-- <el-table-column type="selection" width="55" align="center" />--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />--> <!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />--> <!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" /> <el-table-column label="供应商名称" align="center" prop="supplierName" />
@ -374,6 +379,7 @@ import { roleSelectPost } from '@/api/system/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status')); const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status')); const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const purchaseOrderList = ref<PurchaseOrderVO[]>([]); const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const shipForwardList = ref<ShipForwardVO[]>([]); const shipForwardList = ref<ShipForwardVO[]>([]);
@ -885,66 +891,4 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style scoped> <style scoped></style>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #f5fbfd !important;
padding: 0 !important;
border-bottom: none !important;
}
/* 内嵌表格容器 */
:deep(.el-table__expanded-cell) .el-table {
--el-table-bg-color: #ebf3ff !important;
--el-table-tr-bg-color: #f5fbfd !important;
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */
}
/* 表格主体容器 */
:deep(.el-table__expanded-cell) .el-table__body-wrapper {
background: #ebf3ff !important;
}
/* 表头单元格精准控制 */
:deep(.el-table__expanded-cell) .el-table__header th {
background-color: #cfe2ff !important; /* 覆盖默认背景 */
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */
}
/* 表头文字样式 */
:deep(.el-table__expanded-cell) .el-table__header .cell {
color: #1a2b3c !important;
font-weight: 600; /* 加粗字体 */
}
/* 单元格背景 */
:deep(.el-table__expanded-cell) .el-table__body tr td {
background-color: transparent !important;
}
/* 消除卡片干扰 */
:deep(.el-card) {
background: transparent !important;
border: none !important;
}
/* 内嵌表格hover效果 */
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {
background-color: #ffffff !important;
}
/* 表头hover状态 */
:deep(.el-table__expanded-cell) .el-table__header tr:hover th {
background-color: #b6d4ff !important;
}
/* 表头排序按钮颜色 */
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {
border-bottom-color: #1a2b3c;
}
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {
border-top-color: #1a2b3c;
}
</style>

View File

@ -0,0 +1,649 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="110px">
<el-form-item label="组合订单号" prop="orderSn">
<el-input v-model="queryParams.orderSn" placeholder="请输入组合订单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="仓库名称" prop="warehouseName">
<el-input v-model="queryParams.warehouseName" placeholder="请输入仓库名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="外包仓库名称" prop="outsourceWarehouseName">-->
<!-- <el-input v-model="queryParams.outsourceWarehouseName" placeholder="请输入外包仓库名称" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="供应商名称" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="创建时间" prop="bizCreateTime">-->
<!-- <el-date-picker clearable v-model="queryParams.bizCreateTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择业务创建时间" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="状态文本描述" prop="statusText">-->
<!-- <el-input v-model="queryParams.statusText" placeholder="请输入状态文本描述" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="创建人姓名" prop="createRealname">
<el-input v-model="queryParams.createRealname" placeholder="请输入创建人姓名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="PTP流水号" prop="ptpSn">-->
<!-- <el-input v-model="queryParams.ptpSn" placeholder="请输入PTP流水号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName">
<el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入SKU" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="FNSKU编码" prop="fnsku">-->
<!-- <el-input v-model="queryParams.fnsku" placeholder="请输入FNSKU编码" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="外包数量" prop="outsourceQuantity">-->
<!-- <el-input v-model="queryParams.outsourceQuantity" placeholder="请输入外包数量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="实收数量" prop="receiveQuantity">-->
<!-- <el-input v-model="queryParams.receiveQuantity" placeholder="请输入实收数量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="预计到达时间" prop="expectArriveTime">-->
<!-- <el-input v-model="queryParams.expectArriveTime" placeholder="请输入预计到达时间" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="MSKU编码列表 (数组存储)" prop="msku">-->
<!-- <el-input v-model="queryParams.msku" placeholder="请输入MSKU编码列表 (数组存储)" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="关联计划单号列表 (数组存储)" prop="planSn">-->
<!-- <el-input v-model="queryParams.planSn" placeholder="请输入关联计划单号列表 (数组存储)" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="店铺名称" prop="sellerName">
<el-input v-model="queryParams.sellerName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['amz:purchaseOutOrder:add']"> 新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOutOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOutOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOutOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="purchaseOutOrderList" @selection-change="handleSelectionChange">
<el-table-column type="expand">
<template #default="props">
<el-card shadow="never">
<el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">
<el-table-column label="采购单号" align="center" prop="order.orderSn">
<template #default="scope">
<el-link type="primary" plain size="small" @click="goToOrderDetail(scope.row.item?.orderStatus, scope.row.order?.orderSn)">
{{ scope.row.order?.orderSn }}
</el-link>
</template>
</el-table-column>
<el-table-column label="供应商名称" align="center" prop="order.supplierName" />
<el-table-column label="店铺名称" align="center" prop="order.storeName" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column width="150" label="转发详情" align="center">
<template #default="{ row }">
<el-tag v-if="props.row.supplierName === row.order?.supplierName" type="success">收货方</el-tag>
<el-tag v-else-if="!row.forwards || row.forwards.length === 0" type="warning">无转发信息</el-tag>
<el-button v-else type="primary" plain size="small" @click="openDetailDialog(row.forwards)"> 查看详情 </el-button>
</template>
</el-table-column>
<el-table-column label="下单时间" align="center" prop="order.orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.order?.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column v-hasRoles="['superadmin', 'gengdan']" label="采购单状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="purchase_order_status" :value="scope.row.order?.status" />
</template>
</el-table-column>
<el-table-column label="采购数量" align="center" prop="quantityReal" />
<el-table-column label="已下单数量" align="center" prop="quantityShipped" />
<el-table-column label="剩余数量" align="center" prop="quantityLeft" />
<el-table-column label="订单状态" align="center" prop="item.orderStatus">
<template #default="scope">
<dict-tag :options="vendor_order_status" :value="scope.row.item?.orderStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="order.remark" />
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="组合订单号" align="center" prop="orderSn" />
<el-table-column label="仓库" align="center" prop="warehouseName" />
<!-- <el-table-column label="外包仓库名称" align="center" prop="outsourceWarehouseName" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="创建时间" align="center" prop="bizCreateTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.bizCreateTime, '{y}-{m}-{d} {h}:{mm}:{ss}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="状态文本描述" align="center" prop="statusText" />-->
<el-table-column label="创建人姓名" align="center" prop="createRealname" />
<!-- <el-table-column label="PTP流水号" align="center" prop="ptpSn" />-->
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<!-- <el-table-column label="FNSKU" align="center" prop="fnsku" />-->
<el-table-column label="外包数量" align="center" prop="outsourceQuantity" />
<el-table-column label="已下单数量" align="center" prop="quantityShipped" />
<el-table-column label="剩余数量" align="center" prop="quantityLeft" />
<!-- <el-table-column label="实收数量" align="center" prop="receiveQuantity" />-->
<el-table-column label="预计到达时间" align="center" prop="expectArriveTime" />
<!-- <el-table-column label="MSKU编码列表 (数组存储)" align="center" prop="msku" />-->
<!-- <el-table-column label="关联计划单号列表 (数组存储)" align="center" prop="planSn" />-->
<el-table-column label="店铺名称" align="center" prop="sellerName" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="创建发货订单" placement="top">
<el-button
link
type="primary"
icon="CircleCheck"
@click="handleUpdate(scope.row)"
v-hasPermi="['amz:purchaseOutOrder:edit']"
></el-button>
</el-tooltip>
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:purchaseOutOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改组合订单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1500px" append-to-body>
<el-form :inline="true" ref="purchaseOutOrderFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="委外订单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入订单唯一编号" disabled />
</el-form-item>
<el-form-item label="仓库名称" prop="warehouseName">
<el-input v-model="form.warehouseName" placeholder="请输入仓库名称" disabled />
</el-form-item>
<!-- <el-form-item label="外包仓库名称" prop="outsourceWarehouseName">-->
<!-- <el-input v-model="form.outsourceWarehouseName" placeholder="请输入外包仓库名称" />-->
<!-- </el-form-item>-->
<el-form-item label="供应商名称" prop="supplierName">
<el-input v-model="form.supplierName" placeholder="请输入供应商名称" disabled />
</el-form-item>
<el-form-item label="创建时间" prop="bizCreateTime">
<el-date-picker
clearable
v-model="form.bizCreateTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择业务创建时间"
disabled
>
</el-date-picker>
</el-form-item>
<el-form-item label="状态" prop="statusText">
<el-input v-model="form.statusText" placeholder="请输入状态文本描述" disabled />
</el-form-item>
<el-form-item label="创建人姓名" prop="createRealname">
<el-input v-model="form.createRealname" placeholder="请输入创建人姓名" disabled />
</el-form-item>
<!-- <el-form-item label="PTP流水号" prop="ptpSn">-->
<!-- <el-input v-model="form.ptpSn" placeholder="请输入PTP流水号" />-->
<!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="form.sku" placeholder="请输入标准SKU编码" disabled />
</el-form-item>
<!-- <el-form-item label="FNSKU" prop="fnsku">-->
<!-- <el-input v-model="form.fnsku" placeholder="请输入FNSKU编码" disabled />-->
<!-- </el-form-item>-->
<el-form-item label="外包数量" prop="outsourceQuantity">
<el-input-number
:min="1"
:max="quality"
controls-position="right"
v-model="form.outsourceQuantity"
placeholder="请输入外包数量"
@change="quantityAction(form.outsourceQuantity)"
/>
</el-form-item>
<!-- <el-form-item label="实收数量" prop="receiveQuantity">-->
<!-- <el-input v-model="form.receiveQuantity" placeholder="请输入实收数量" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="预计到达时间" prop="expectArriveTime">-->
<!-- <el-input v-model="form.expectArriveTime" placeholder="请输入预计到达时间" />-->
<!-- </el-form-item>-->
<el-form-item label="店铺名称" prop="sellerName">
<el-input v-model="form.sellerName" placeholder="请输入店铺名称" disabled />
</el-form-item>
</el-form>
<el-card shadow="never">
<vxe-table
ref="purchaseTable"
v-loading="loading"
:data="form.items"
border
size="mini"
:header-cell-style="{ fontSize: '10px' }"
:row-config="{ keyField: 'id' }"
:scroll-y="{ enabled: true, gt: 100 }"
>
<!-- 采购单号 -->
<vxe-column field="order.orderSn" title="采购单号" align="center" />
<!-- 供应商名称 -->
<vxe-column field="order.supplierName" title="供应商名称" align="center" />
<!-- 店铺名称 -->
<vxe-column field="order.storeName" title="店铺名称" align="center" />
<vxe-column field="productName" title="产品名称" align="center" />
<!-- 下单时间 (带格式化) -->
<vxe-column field="order.orderTime" title="下单时间" width="180" align="center">
<template #default="{ row }">
<span>{{ parseTime(row.order.orderTime, '{y}-{m}-{d} {h}:{mm}:{ss}') }}</span>
</template>
</vxe-column>
<!-- 采购单状态 (带权限控制) -->
<vxe-column title="采购单状态" align="center">
<template #default="{ row }">
<dict-tag :options="purchase_order_status" :value="row.order.status" />
</template>
</vxe-column>
<!-- 总金额 -->
<!-- <vxe-column field="order.totalPrice" title="总金额" align="center" />-->
<!-- 采购数量 -->
<vxe-column field="order.quantityReal" title="采购数量" :edit-render="{ name: 'input' }" align="center" />
<!-- 订单状态 -->
<vxe-column title="订单状态" align="center">
<template #default="{ row }">
<dict-tag :options="vendor_order_status" :value="row.item.orderStatus" />
</template>
</vxe-column>
<!-- 备注 -->
<vxe-column field="order.remark" title="备注" align="center" />
</vxe-table>
</el-card>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitSendOrderForm">提交订单</el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="forwardTableDialog.title" v-model="forwardTableDialog.visible" width="1800px" append-to-body>
<el-table :data="shipForwardList">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="采购店铺名称" align="center" prop="storeName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="产品全称" align="center" prop="productName" />
<el-table-column label="实际发货数量" align="center" prop="quantitySend" />
<el-table-column label="发货方" align="center" prop="outSupplierName" />
<!-- <el-table-column label="发货供应商系统ID" align="center" prop="outSupplierId" />-->
<el-table-column label="收货方" align="center" prop="inSupplierName" />
<!-- <el-table-column label="收货供应商系统ID" align="center" prop="inSupplierId" />-->
<!-- <el-table-column label="计划发货起始时间" align="center" prop="shipmentStart" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentStart, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划发货截止时间" align="center" prop="shipmentEnd" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.shipmentEnd, '{y}-{m}-{d}') }}</span-->
<!-- >1-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="跟单人" align="center" prop="trackerName" />
<!-- <el-table-column label="跟单id" align="center" prop="trackerId" />-->
<el-table-column label="转发状态" align="center" prop="fwdStatus">
<template #default="scope">
<dict-tag :options="forward_status" :value="scope.row.fwdStatus" />
</template>
</el-table-column>
<el-table-column label="发货时间" align="center" prop="sendTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- <el-tooltip content="修改" placement="top">-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']"></el-button>-->
<!-- </el-tooltip>-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:shipForward:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
<!-- <template #footer>-->
<!-- <div class="dialog-footer">-->
<!-- <el-button :loading="buttonLoading" type="primary" @click="forwardSubmitForm"> </el-button>-->
<!-- <el-button @click="cancel"> </el-button>-->
<!-- </div>-->
<!-- </template>-->
</el-dialog>
</div>
</template>
<script setup name="PurchaseOutOrder" lang="ts">
import {
listPurchaseOutOrder,
getPurchaseOutOrder,
delPurchaseOutOrder,
addPurchaseOutOrder,
updatePurchaseOutOrder,
createSendOrderByBo
} from '@/api/amz/purchaseOutOrder';
import { PurchaseOutOrderVO, PurchaseOutOrderQuery, PurchaseOutOrderForm } from '@/api/amz/purchaseOutOrder/types';
import { VxeTable, VxeColumn } from 'vxe-table';
import type { VxeTablePropTypes } from 'vxe-table';
import 'vxe-table/lib/style.css';
import { ShipForwardVO } from '@/api/amz/shipForward/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { purchase_order_status } = toRefs<any>(proxy?.useDict('purchase_order_status'));
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const purchaseOutOrderList = ref<PurchaseOutOrderVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const router = useRouter();
const queryFormRef = ref<ElFormInstance>();
const purchaseOutOrderFormRef = ref<ElFormInstance>();
const shipForwardList = ref<ShipForwardVO[]>([]);
const forwardTableDialog = reactive<DialogOption>({
visible: false,
title: '转发明细'
});
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const editConfig: VxeTablePropTypes.EditConfig = {
trigger: 'dblclick',
mode: 'cell'
};
const initFormData: PurchaseOutOrderForm = {
orderSn: undefined,
warehouseName: undefined,
outsourceWarehouseName: undefined,
supplierName: undefined,
bizCreateTime: undefined,
statusText: undefined,
createRealname: undefined,
ptpSn: undefined,
productName: undefined,
sku: undefined,
fnsku: undefined,
outsourceQuantity: undefined,
receiveQuantity: undefined,
expectArriveTime: undefined,
msku: undefined,
planSn: undefined,
sellerName: undefined
};
const data = reactive<PageData<PurchaseOutOrderForm, PurchaseOutOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
warehouseName: undefined,
outsourceWarehouseName: undefined,
supplierName: undefined,
bizCreateTime: undefined,
statusText: undefined,
createRealname: undefined,
ptpSn: undefined,
productName: undefined,
sku: undefined,
fnsku: undefined,
outsourceQuantity: undefined,
receiveQuantity: undefined,
expectArriveTime: undefined,
msku: undefined,
planSn: undefined,
sellerName: undefined,
params: {}
},
rules: {
orderSn: [{ required: true, message: '订单唯一编号不能为空', trigger: 'blur' }],
warehouseName: [{ required: true, message: '仓库名称不能为空', trigger: 'blur' }],
outsourceWarehouseName: [{ required: true, message: '外包仓库名称不能为空', trigger: 'blur' }],
supplierName: [{ required: true, message: '供应商名称不能为空', trigger: 'blur' }],
bizCreateTime: [
{
required: true,
message: '业务创建时间 (Jackson格式: yyyy-MM-dd HH:mm:ss)不能为空',
trigger: 'blur'
}
],
statusText: [{ required: true, message: '状态文本描述不能为空', trigger: 'blur' }],
createRealname: [{ required: true, message: '创建人姓名不能为空', trigger: 'blur' }],
ptpSn: [{ required: true, message: 'PTP流水号不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '标准SKU编码不能为空', trigger: 'blur' }],
// fnsku: [{ required: true, message: 'FNSKU', trigger: 'blur' }],
outsourceQuantity: [{ required: true, message: '外包数量不能为空', trigger: 'blur' }],
receiveQuantity: [{ required: true, message: '实收数量不能为空', trigger: 'blur' }],
expectArriveTime: [{ required: true, message: '预计到达时间不能为空', trigger: 'blur' }],
// msku: [{ required: true, message: 'MSKU ()', trigger: 'blur' }],
// planSn: [{ required: true, message: ' ()', trigger: 'blur' }],
sellerName: [{ required: true, message: '销售商名称不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const quality = ref(0);
/** 查询组合订单列表 */
const getList = async () => {
loading.value = true;
const res = await listPurchaseOutOrder(queryParams.value);
purchaseOutOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
const quantityAction = (quantity: number) => {
form.value.items.forEach((item) => {
item.order.quantityReal = quantity * item.ratio;
});
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
purchaseOutOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: PurchaseOutOrderVO[]) => {
ids.value = selection.map((item) => item.orderSn);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加组合订单';
};
const goToOrderDetail = async (orderStatus?: string, orderSn?: string) => {
if (orderStatus === 'ord_unconfirmed') {
router.push({
path: '/demand/purchaseOrder',
query: {
orderSn: orderSn
}
});
} else {
router.push({
path: '/demand/purchaseOrderConfirm',
query: {
orderSn: orderSn
}
});
}
};
/** 修改按钮操作 */
const handleUpdate = async (row?: PurchaseOutOrderVO) => {
reset();
// const orderSn = row?.orderSn || ids.value[0];
// const res = await getPurchaseOutOrder(orderSn);
if (row.quantityLeft <= 0) {
proxy?.$modal.msgError('该订单已全部发货');
return;
}
if (row.items.every((item) => item.order.orderStatus === 'ord_unconfirmed')) {
proxy?.$modal.msgError('有采购订单没有确认');
return;
}
form.value = deepClone(row);
quality.value = form.value.quantityLeft;
form.value.outsourceQuantity = form.value.quantityLeft;
console.log('quantity', quality.value);
console.log('form.value.outsourceQuantity', form.value.outsourceQuantity);
form.value.items.forEach((item) => {
// item.order.quantityReal = item.quantityLeft;
item.order.quantityReal = form.value.quantityLeft * item.ratio;
});
dialog.visible = true;
dialog.title = '提交可发货订单';
};
function deepClone<T>(obj: T): T {
return JSON.parse(JSON.stringify(obj));
}
/** 提交按钮 */
const submitForm = () => {
purchaseOutOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.orderSn) {
await updatePurchaseOutOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addPurchaseOutOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
const submitSendOrderForm = () => {
purchaseOutOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.orderSn) {
await createSendOrderByBo(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
const openDetailDialog = (detail) => {
shipForwardList.value = detail;
forwardTableDialog.visible = true;
};
/** 删除按钮操作 */
const handleDelete = async (row?: PurchaseOutOrderVO) => {
const _tenantIds = row?.orderSn || ids.value;
await proxy?.$modal.confirm('是否确认删除组合订单编号为"' + _tenantIds + '"的数据项?').finally(() => (loading.value = false));
await delPurchaseOutOrder(_tenantIds);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/purchaseOutOrder/export',
{
...queryParams.value
},
`purchaseOutOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -57,10 +57,26 @@
</template> </template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />--> <el-table-column type="expand">
<template #default="props">
<el-card shadow="never">
<el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="采购数量" align="center" prop="quantitySend" />
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建人" align="center" prop="createName" />
<el-table-column label="发货单号" align="center" prop="id" /> <el-table-column label="发货单号" align="center" prop="id" />
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="创建日期" align="center" prop="createTime" width="180"> <el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
@ -73,26 +89,33 @@
</el-table-column> </el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" /> <el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" /> <el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName"> <el-table-column label="FBA列表" align="center" prop="sendName">
<template #default="{ row }"> <template #default="scope">
<el-popover placement="top" title="物流商地址" :width="200" trigger="click"> <el-button link type="primary" @click="handleFbaList(scope.row)" v-hasPermi="['amz:sendOrder:remove']"> 查看详情 </el-button>
<template #reference>
<el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">
{{ row.logisticsProviderName }}
</el-button>
</template>
<div>{{ row.address || '暂无地址' }}</div>
</el-popover>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName">-->
<!-- <template #default="{ row }">-->
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">-->
<!-- <template #reference>-->
<!-- <el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">-->
<!-- {{ row.logisticsProviderName }}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- <div>{{ row.address || '暂无地址' }}</div>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="产品名称" align="center" prop="productName" /> <el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="发货数量" align="center" prop="quantitySend" /> <el-table-column label="发货数量" align="center" prop="quantitySend" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount"> <el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="500" trigger="click"> <el-popover placement="top" title="装箱明细" :width="500" trigger="click">
<template #reference> <template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button> <el-button v-if="row.sendDetail !== null" text size="small" type="primary"> {{ row.boxCount }} </el-button>
<el-tag type="info">暂无装箱数据</el-tag>
</template> </template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div> <div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div> <div v-else>暂无数据</div>
@ -102,18 +125,50 @@
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />--> <!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" /> <el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" /> <el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<el-table-column label="关联的采购单" align="center">
<template #default="scope">
<el-tag v-if="scope.row.bizShipmentPlans != null" type="success">已关联</el-tag>
<el-tag v-else type="info">未关联</el-tag>
</template>
</el-table-column>
<el-table-column label="发货状态" align="center" prop="sendStatus"> <el-table-column label="发货状态" align="center" prop="sendStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :options="send_status" :value="scope.row.sendStatus" /> <dict-tag :options="send_status" :value="scope.row.sendStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<!-- <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">--> <!-- <el-button-->
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>--> <!-- v-if="scope.row.sendStatus === 'confirm' || scope.row.sendStatus === 'set_store'"-->
<!-- </el-tooltip>--> <!-- size="small"-->
<!-- link-->
<!-- type="primary"-->
<!-- @click="handleUpdate(scope.row)"-->
<!-- v-hasRoles="['superadmin', 'gengdan', 'yunying']"-->
<!-- >确认发货-->
<!-- </el-button>-->
<el-tooltip content="接受发货" placement="top">
<el-button
v-if="scope.row.sendStatus === 'unconfirm'"
size="small"
link
type="primary"
@click="handleConfirmSend(scope.row)"
v-hasRoles="['superadmin', 'gongying']"
>接受发货
</el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button> <el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasRoles="['superadmin']"
v-hasPermi="['amz:sendOrder:remove']"
></el-button>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@ -123,12 +178,12 @@
</el-card> </el-card>
<!-- 添加或修改供应商创建的发货单对话框 --> <!-- 添加或修改供应商创建的发货单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="sendOrderFormRef" :model="shipForm" :rules="rules" label-width="120px">
<!-- <el-form-item label="主键ID" prop="id">--> <!-- <el-form-item label="主键ID" prop="id">-->
<!-- <el-input v-model="form.id" placeholder="请输入主键ID" />--> <!-- <el-input v-model="form.id" placeholder="请输入主键ID" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="采购单号" prop="orderSn"> <el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" @blur="blurAction" /> <el-input v-model="shipForm.orderSn" placeholder="请输入采购单号" @blur="blurAction" disabled />
</el-form-item> </el-form-item>
<!-- <el-form-item label="发货日期" prop="sendDate">--> <!-- <el-form-item label="发货日期" prop="sendDate">-->
<!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">--> <!-- <el-date-picker clearable v-model="form.sendDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货日期">-->
@ -138,16 +193,16 @@
<!-- <el-input v-model="form.storeName" placeholder="请输入采购店铺" />--> <!-- <el-input v-model="form.storeName" placeholder="请输入采购店铺" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="产品名称" prop="productName"> <el-form-item label="产品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品名称" /> <el-input v-model="shipForm.productName" placeholder="请输入产品名称" disabled />
</el-form-item> </el-form-item>
<el-form-item label="发货总数" prop="quantitySend"> <el-form-item label="发货总数" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" /> <el-input v-model="shipForm.quantitySend" placeholder="请输入发货数量" disabled />
</el-form-item> </el-form-item>
<el-form-item label="总箱数" prop="boxCount"> <el-form-item label="总箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入总箱数" /> <el-input v-model="shipForm.boxCount" placeholder="请输入总箱数" />
</el-form-item> </el-form-item>
<el-form-item v-if="form.quantitySend > 0 && form.boxCount > 0" label="箱子明细" prop="quantityPerBox"> <el-form-item v-if="shipForm.quantitySend > 0 && shipForm.boxCount > 0" label="箱子明细" prop="quantityPerBox">
<div class="max-w-800px"> <div class="max-w-800px">
<div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center"> <div v-for="(group, index) in groups" :key="index" class="flex gap-12px mb-16px items-center">
<el-input <el-input
@ -177,9 +232,9 @@
<div class="mb-16px text-left"> <div class="mb-16px text-left">
<span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']"> <span :class="['mr-8px', Number(totalNum) === Number(shipForm.quantitySend) ? 'text-green-500' : 'text-red-500']">
当前总量{{ totalNum }}/{{ form.quantitySend }} 当前总量{{ totalNum }}/{{ shipForm.quantitySend }}
</span> </span>
<el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= form.quantitySend"> 添加一组 </el-button> <el-button @click="addGroup" type="primary" :icon="Plus" :disabled="totalNum >= shipForm.quantitySend"> 添加一组 </el-button>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
@ -223,19 +278,98 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="fbaDialog.title" v-model="fbaDialog.visible" width="1200px" append-to-body>
<el-table :data="fbaDataList">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="店铺名称" align="center" prop="sellerName" />-->
<el-table-column label="货件编号" align="center" prop="shipmentId" />
<!-- <el-table-column label="商品详情" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-popover placement="top" :width="750" trigger="hover">-->
<!-- <template #reference>-->
<!-- <el-button size="small" plain style="margin-right: 16px">查看</el-button>-->
<!-- </template>-->
<!-- <el-table :data="scope.row.itemVoList">-->
<!-- <el-table-column width="200" property="productName" label="品名" />-->
<!-- <el-table-column width="150" property="asin" label="asin" />-->
<!-- <el-table-column width="150" property="fnsku" label="fnsku" />-->
<!-- <el-table-column width="200" property="msku" label="msku" />-->
<!-- </el-table>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="箱数" align="center" prop="boxQuantity" />
<el-table-column label="申报量" property="setTotal" width="80">
<template #default="scope">
{{ scope.row.setTotal }}
</template>
</el-table-column>
<el-table-column label="物流商地址" align="center" prop="address" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="关联的采购单" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>-->
<!-- <el-tag v-else type="info">未关联</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">-->
<!-- <template #default="{ row }">-->
<!-- &lt;!&ndash; <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>&ndash;&gt;-->
<!-- <el-popover placement="left" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button plain size="small" type="success"> 点击查看详情</el-button>-->
<!-- </template>-->
<!-- <el-descriptions title="收货地址信息" :column="3" border>-->
<!-- <el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.shipToAddress[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="亚马逊货件状态" align="center" width="180">-->
<!-- <template #default="scope">-->
<!-- <el-tag>{{ scope.row.shipmentStatus }}</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-dialog>
</div> </div>
</template> </template>
<script setup name="SendOrder" lang="ts"> <script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder'; import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder, updateSendOrderData } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types'; import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { getPurchaseOrder } from '@/api/amz/purchaseOrder'; import { getPurchaseOrder } from '@/api/amz/purchaseOrder';
import { Close, Plus } from '@element-plus/icons-vue'; import { Close, Plus } from '@element-plus/icons-vue';
import { formatText } from '@/utils/asinkj'; import { formatText, parseTime } from '@/utils/asinkj';
import { ElTable } from 'element-plus';
import { ShipmentPlanVO } from '@/api/amz/shipmentPlan/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status')); const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const sendOrderList = ref<SendOrderVO[]>([]); const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -250,12 +384,18 @@ const pwidth = ref<string | number>();
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>(); const sendOrderFormRef = ref<ElFormInstance>();
const fbaDataList = ref<ShipmentPlanVO[]>([]);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: ''
}); });
const fbaDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: SendOrderForm = { const initFormData: SendOrderForm = {
id: undefined, id: undefined,
orderSn: undefined, orderSn: undefined,
@ -271,6 +411,22 @@ const initFormData: SendOrderForm = {
sendStatus: undefined, sendStatus: undefined,
sendDetail: undefined sendDetail: undefined
}; };
const shipForm = ref<SendOrderForm>({
id: undefined,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: 0,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
sendDetail: undefined
});
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
@ -298,14 +454,14 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
quantityPerBox: [ quantityPerBox: [
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (totalBoxCount.value != form.value.boxCount) { if (totalBoxCount.value != shipForm.value.boxCount) {
console.log('totalBoxCount.value', totalBoxCount.value); console.log('totalBoxCount.value', totalBoxCount.value);
console.log('form.value.boxCount', form.value.boxCount); console.log('form.value.boxCount', shipForm.value.boxCount);
callback(new Error('明细箱数和总箱数不匹配,请调整')); callback(new Error('明细箱数和总箱数不匹配,请调整'));
} }
// //
if (totalNum.value > form.value.quantitySend) { if (totalNum.value > shipForm.value.quantitySend) {
const exceed = totalNum.value - form.value.quantitySend; const exceed = totalNum.value - shipForm.value.quantitySend;
callback(new Error('总量超出 ' + exceed + ',请调整')); callback(new Error('总量超出 ' + exceed + ',请调整'));
} else { } else {
callback(); callback();
@ -416,6 +572,13 @@ const removeGroup = (index) => {
ElMessage.warning('请调整剩余数值使总量不超过100'); ElMessage.warning('请调整剩余数值使总量不超过100');
} }
}; };
const handleFbaList = async (row?: SendOrderVO) => {
fbaDataList.value = row.bizShipmentPlans;
fbaDialog.visible = true;
fbaDialog.title = 'FBA货件列表';
};
/** 查询供应商创建的发货单列表 */ /** 查询供应商创建的发货单列表 */
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
@ -489,10 +652,39 @@ const handleUpdate = async (row?: SendOrderVO) => {
dialog.title = '修改供应商创建的发货单'; dialog.title = '修改供应商创建的发货单';
}; };
const handleConfirmSend = async (row?: SendOrderVO) => {
reset();
groups.value = [
{
boxCount: null,
itemCount: null,
lengthPerBox: null,
widthPerBox: null,
heightPerBox: null,
weightPerBox: null
}
];
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
console.log('res', res);
Object.assign(form.value, res.data);
shipForm.value.orderSn = row?.orderSn;
shipForm.value.productName = row?.productName;
shipForm.value.quantitySend = row?.quantitySend;
// shipForm.value.storeName = rowM?.storeName;
shipForm.value.id = row?.id;
// form.value.sendStatus = 'confirmed';
// await updateSendOrder(form.value).finally(() => (buttonLoading.value = false));
dialog.visible = true;
dialog.title = '接受发货';
};
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
form.value.weightPerBox = totalWeight.value; shipForm.value.weightPerBox = totalWeight.value;
form.value.boxDimensions = `${pwidth.value} x ${pheight.value} x ${plength.value}`; shipForm.value.boxDimensions = `${pwidth.value} x ${pheight.value} x ${plength.value}`;
const sendText = groups.value.reduce((sum, group, index) => { const sendText = groups.value.reduce((sum, group, index) => {
return ( return (
sum + sum +
@ -516,14 +708,15 @@ const submitForm = () => {
); );
}, ''); }, '');
console.log('sendText: ', sendText); console.log('sendText: ', sendText);
form.value.sendDetail = sendText; shipForm.value.sendDetail = sendText;
shipForm.value.sendStatus = 'confirmed';
sendOrderFormRef.value?.validate(async (valid: boolean) => { sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
if (form.value.id) { if (shipForm.value.id) {
await updateSendOrder(form.value).finally(() => (buttonLoading.value = false)); await updateSendOrderData(shipForm.value).finally(() => (buttonLoading.value = false));
} else { } else {
await addSendOrder(form.value).finally(() => (buttonLoading.value = false)); await addSendOrder(shipForm.value).finally(() => (buttonLoading.value = false));
} }
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false; dialog.visible = false;

View File

@ -62,72 +62,11 @@
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="props"> <template #default="props">
<el-card shadow="never"> <el-card shadow="never">
<el-table :data="props.row.bizShipmentPlans"> <el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">
<!-- <el-table-column type="selection" width="55" align="center" />--> <el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">--> <el-table-column label="产品名称" align="center" prop="productName" />
<!-- <template #default="scope">--> <el-table-column label="SKU" align="center" prop="sku" />
<!-- <span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>--> <el-table-column label="采购数量" align="center" prop="quantitySend" />
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="店铺名称" align="center" prop="sellerName" />-->
<el-table-column label="货件编号" align="center" prop="shipmentId" />
<!-- <el-table-column label="商品详情" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-popover placement="top" :width="750" trigger="hover">-->
<!-- <template #reference>-->
<!-- <el-button size="small" plain style="margin-right: 16px">查看</el-button>-->
<!-- </template>-->
<!-- <el-table :data="scope.row.itemVoList">-->
<!-- <el-table-column width="200" property="productName" label="品名" />-->
<!-- <el-table-column width="150" property="asin" label="asin" />-->
<!-- <el-table-column width="150" property="fnsku" label="fnsku" />-->
<!-- <el-table-column width="200" property="msku" label="msku" />-->
<!-- </el-table>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="物流商地址" align="center" prop="address" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="关联的采购单" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>-->
<!-- <el-tag v-else type="info">未关联</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">-->
<!-- <template #default="{ row }">-->
<!-- &lt;!&ndash; <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>&ndash;&gt;-->
<!-- <el-popover placement="left" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button plain size="small" type="success"> 点击查看详情</el-button>-->
<!-- </template>-->
<!-- <el-descriptions title="收货地址信息" :column="3" border>-->
<!-- <el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.shipToAddress[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="亚马逊货件状态" align="center" width="180">
<template #default="scope">
<el-tag>{{ scope.row.shipmentStatus }}</el-tag>
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table> </el-table>
</el-card> </el-card>
</template> </template>
@ -135,6 +74,11 @@
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="发货单号" align="center" prop="id" /> <el-table-column label="发货单号" align="center" prop="id" />
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="创建日期" align="center" prop="createTime" width="180"> <el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
@ -147,25 +91,20 @@
</el-table-column> </el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" /> <el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" /> <el-table-column label="供应商名称" align="center" prop="sendName" />
<!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName">--> <el-table-column label="FBA列表" align="center" prop="sendName">
<!-- <template #default="{ row }">--> <template #default="scope">
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">--> <el-button link type="primary" @click="handleFbaList(scope.row)" v-hasPermi="['amz:sendOrder:remove']"> 查看详情 </el-button>
<!-- <template #reference>--> </template>
<!-- <el-button v-if="row.logisticsProviderName" text size="small" type="primary">--> </el-table-column>
<!-- {{ row.logisticsProviderName }}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- <div>{{ row.address || '暂无地址' }}</div>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="产品名称" align="center" prop="productName" /> <el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="发货数量" align="center" prop="quantitySend" /> <el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="箱数" align="center" prop="boxCount"> <el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="500" trigger="click"> <el-popover placement="top" title="装箱明细" :width="500" trigger="click">
<template #reference> <template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button> <el-button v-if="row.sendDetail !== null" text size="small" type="primary"> {{ row.boxCount }} </el-button>
<el-tag type="info">暂无装箱数据</el-tag>
</template> </template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div> <div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div> <div v-else>暂无数据</div>
@ -182,9 +121,12 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="推送" placement="top" v-if="scope.row.sendStatus === 'pending'"> <el-tooltip content="推送" placement="top" v-if="scope.row.sendStatus === 'confirmed'">
<el-button circle icon="Top" @click="handleUpdate(scope.row)" v-hasRoles="['superadmin', 'gengdan']"></el-button> <el-button circle icon="Top" @click="handleUpdate(scope.row)" v-hasRoles="['superadmin', 'gengdan']"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="调拨" placement="top" v-if="scope.row.sendStatus === 'confirmed'">
<el-button circle icon="Sort" @click="handleTransfer(scope.row)" v-hasRoles="['superadmin', 'gengdan']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top" v-hasRoles="['superadmin']"> <el-tooltip content="删除" placement="top" v-hasRoles="['superadmin']">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>
</el-tooltip> </el-tooltip>
@ -232,7 +174,7 @@
<!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />--> <!-- <el-input v-model="form.realStoreName" placeholder="请输入实际采购店铺" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item label="发货状态" prop="sendStatus"> <el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="form.sendStatus" placeholder="请选择发货状态"> <el-select v-model="form.sendStatus" placeholder="请选择发货状态" disabled>
<!-- <el-option v-for="dict in confirm_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>--> <!-- <el-option v-for="dict in confirm_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>-->
<template v-for="dict in send_status" :key="dict.value"> <template v-for="dict in send_status" :key="dict.value">
<el-option v-if="dict.value == 'confirm'" :label="dict.label" :key="dict.value" :value="dict.value"></el-option> <el-option v-if="dict.value == 'confirm'" :label="dict.label" :key="dict.value" :value="dict.value"></el-option>
@ -242,22 +184,125 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"></el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm">推送给运营</el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="fbaDialog.title" v-model="fbaDialog.visible" width="1200px" append-to-body>
<el-table :data="fbaDataList">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="店铺名称" align="center" prop="sellerName" />-->
<el-table-column label="货件编号" align="center" prop="shipmentId" />
<!-- <el-table-column label="商品详情" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-popover placement="top" :width="750" trigger="hover">-->
<!-- <template #reference>-->
<!-- <el-button size="small" plain style="margin-right: 16px">查看</el-button>-->
<!-- </template>-->
<!-- <el-table :data="scope.row.itemVoList">-->
<!-- <el-table-column width="200" property="productName" label="品名" />-->
<!-- <el-table-column width="150" property="asin" label="asin" />-->
<!-- <el-table-column width="150" property="fnsku" label="fnsku" />-->
<!-- <el-table-column width="200" property="msku" label="msku" />-->
<!-- </el-table>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="箱数" align="center" prop="boxQuantity" />
<el-table-column label="申报量" property="setTotal" width="80">
<template #default="scope">
{{ scope.row.setTotal }}
</template>
</el-table-column>
<el-table-column label="物流商地址" align="center" prop="address" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="关联的采购单" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>-->
<!-- <el-tag v-else type="info">未关联</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">-->
<!-- <template #default="{ row }">-->
<!-- &lt;!&ndash; <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>&ndash;&gt;-->
<!-- <el-popover placement="left" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button plain size="small" type="success"> 点击查看详情</el-button>-->
<!-- </template>-->
<!-- <el-descriptions title="收货地址信息" :column="3" border>-->
<!-- <el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.shipToAddress[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="亚马逊货件状态" align="center" width="180">-->
<!-- <template #default="scope">-->
<!-- <el-tag>{{ scope.row.shipmentStatus }}</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-dialog>
<el-dialog :title="transferDialog.title" v-model="transferDialog.visible" width="1000px" append-to-body>
<el-form ref="sendOrderFormRef" :model="transferForm" :rules="rules3" label-width="120px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="transferForm.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="产品名称" prop="productName">
<el-input v-model="transferForm.productName" placeholder="请输入产品名称" disabled />
</el-form-item>
<el-form-item label="店铺名称" prop="productName">
<el-input v-model="transferForm.storeName" placeholder="请输入产品名称" disabled />
</el-form-item>
<el-form-item label="发货总数" prop="quantitySend">
<el-input-number :min="1" :max="quantity" controls-position="right" v-model="transferForm.quantitySend" placeholder="发货总数" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="transforSubmitForm"> </el-button>
<el-button @click="transferDialog.visible = false"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup name="SendOrder" lang="ts"> <script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder'; import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder, transferSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types'; import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { formatText, parseTime } from '@/utils/asinkj'; import { deepClone, formatText, parseTime } from '@/utils/asinkj';
import { ElTable } from 'element-plus'; import { ElTable } from 'element-plus';
import { ShipmentPlanVO } from '@/api/amz/shipmentPlan/types';
import router from '@/router';
const route = useRoute();
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status')); const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const sendOrderList = ref<SendOrderVO[]>([]); const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -267,14 +312,28 @@ const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const quantity = ref(10);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>(); const sendOrderFormRef = ref<ElFormInstance>();
const fbaDataList = ref<ShipmentPlanVO[]>([]);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: ''
}); });
const fbaDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const transferDialog = reactive<DialogOption>({
visible: false,
title: '创建调拨'
});
const initFormData: SendOrderForm = { const initFormData: SendOrderForm = {
id: undefined, id: undefined,
orderSn: undefined, orderSn: undefined,
@ -319,10 +378,17 @@ const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }], weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }], realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }],
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }] sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }]
},
rules3: {
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
// sendDate: [{ required: true, message: '', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '发货数量不能为空', trigger: 'blur' }]
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules, rules3 } = toRefs(data);
/** 查询供应商创建的发货单列表 */ /** 查询供应商创建的发货单列表 */
const getList = async () => { const getList = async () => {
@ -358,6 +424,12 @@ const resetQuery = () => {
handleQuery(); handleQuery();
}; };
const handleFbaList = async (row?: SendOrderVO) => {
fbaDataList.value = row.bizShipmentPlans;
fbaDialog.visible = true;
fbaDialog.title = 'FBA货件列表';
};
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: SendOrderVO[]) => { const handleSelectionChange = (selection: SendOrderVO[]) => {
ids.value = selection.map((item) => item.id); ids.value = selection.map((item) => item.id);
@ -383,6 +455,25 @@ const handleUpdate = async (row?: SendOrderVO) => {
dialog.title = '推送发货单'; dialog.title = '推送发货单';
}; };
const transferForm = ref<SendOrderVO>();
const handleTransfer = async (row?: SendOrderVO) => {
//
console.log('row', row);
transferForm.value = deepClone(row);
transferDialog.visible = true;
};
const transforSubmitForm = async () => {
//
transferDialog.visible = false;
console.log('transferForm', transferForm.value);
// return;
const res = await transferSendOrder(transferForm.value);
proxy?.$modal.msgSuccess('操作成功');
await getList();
};
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
sendOrderFormRef.value?.validate(async (valid: boolean) => { sendOrderFormRef.value?.validate(async (valid: boolean) => {

View File

@ -60,78 +60,22 @@
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="props"> <template #default="props">
<el-card shadow="never"> <el-card shadow="never">
<el-table :data="props.row.bizShipmentPlans"> <el-table v-loading="loading" :data="props.row.items" :border="true" size="small" :header-cell-style="{ fontSize: '10px' }">
<!-- <el-table-column type="selection" width="55" align="center" />--> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180"> <el-table-column label="产品名称" align="center" prop="productName" />
<template #default="scope"> <el-table-column label="SKU" align="center" prop="sku" />
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span> <el-table-column label="采购数量" align="center" prop="quantitySend" />
</template>
</el-table-column>
<!-- <el-table-column label="店铺名称" align="center" prop="sellerName" />-->
<el-table-column label="货件编号" align="center" prop="shipmentId" />
<!-- <el-table-column label="商品详情" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-popover placement="top" :width="750" trigger="hover">-->
<!-- <template #reference>-->
<!-- <el-button size="small" plain style="margin-right: 16px">查看</el-button>-->
<!-- </template>-->
<!-- <el-table :data="scope.row.itemVoList">-->
<!-- <el-table-column width="200" property="productName" label="品名" />-->
<!-- <el-table-column width="150" property="asin" label="asin" />-->
<!-- <el-table-column width="150" property="fnsku" label="fnsku" />-->
<!-- <el-table-column width="200" property="msku" label="msku" />-->
<!-- </el-table>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="物流商地址" align="center" prop="address" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="关联的采购单" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>-->
<!-- <el-tag v-else type="info">未关联</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">-->
<!-- <template #default="{ row }">-->
<!-- &lt;!&ndash; <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>&ndash;&gt;-->
<!-- <el-popover placement="left" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button plain size="small" type="success"> 点击查看详情</el-button>-->
<!-- </template>-->
<!-- <el-descriptions title="收货地址信息" :column="3" border>-->
<!-- <el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.shipToAddress[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="亚马逊货件状态" align="center" width="180">-->
<!-- <template #default="scope">-->
<!-- <el-tag>{{ scope.row.shipmentStatus }}</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table> </el-table>
</el-card> </el-card>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="采购单号" align="center" prop="orderSn" /> <el-table-column label="采购单号" align="center" prop="orderSn" />
<el-table-column label="发货单号" align="center" prop="id" /> <el-table-column label="发货单号" align="center" prop="id" />
<el-table-column label="订单类型" align="center" prop="sendStatus">
<template #default="scope">
<dict-tag :options="send_order_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="创建日期" align="center" prop="createTime" width="180"> <el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
@ -144,6 +88,12 @@
</el-table-column> </el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" /> <el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" /> <el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="FBA列表" align="center" prop="sendName">
<template #default="scope">
<el-button link type="primary" @click="handleFbaList(scope.row)" v-hasPermi="['amz:sendOrder:remove']"> 查看详情 </el-button>
</template>
</el-table-column>
<!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName">--> <!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName">-->
<!-- <template #default="{ row }">--> <!-- <template #default="{ row }">-->
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">--> <!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">-->
@ -157,12 +107,14 @@
<!-- </template>--> <!-- </template>-->
<!-- </el-table-column>--> <!-- </el-table-column>-->
<el-table-column label="产品名称" align="center" prop="productName" /> <el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="SKU" align="center" prop="sku" />
<el-table-column label="发货数量" align="center" prop="quantitySend" /> <el-table-column label="发货数量" align="center" prop="quantitySend" />
<el-table-column label="箱数" align="center" prop="boxCount"> <el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }"> <template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="500" trigger="click"> <el-popover placement="top" title="装箱明细" :width="500" trigger="click">
<template #reference> <template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button> <el-button v-if="row.sendDetail !== null" text size="small" type="primary"> {{ row.boxCount }} </el-button>
<el-tag type="info">暂无装箱数据</el-tag>
</template> </template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div> <div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div> <div v-else>暂无数据</div>
@ -255,6 +207,81 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="fbaDialog.title" v-model="fbaDialog.visible" width="1200px" append-to-body>
<el-table :data="fbaDataList">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="店铺名称" align="center" prop="sellerName" />-->
<el-table-column label="货件编号" align="center" prop="shipmentId" />
<!-- <el-table-column label="商品详情" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-popover placement="top" :width="750" trigger="hover">-->
<!-- <template #reference>-->
<!-- <el-button size="small" plain style="margin-right: 16px">查看</el-button>-->
<!-- </template>-->
<!-- <el-table :data="scope.row.itemVoList">-->
<!-- <el-table-column width="200" property="productName" label="品名" />-->
<!-- <el-table-column width="150" property="asin" label="asin" />-->
<!-- <el-table-column width="150" property="fnsku" label="fnsku" />-->
<!-- <el-table-column width="200" property="msku" label="msku" />-->
<!-- </el-table>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="箱数" align="center" prop="boxQuantity" />
<el-table-column label="申报量" property="setTotal" width="80">
<template #default="scope">
{{ scope.row.setTotal }}
</template>
</el-table-column>
<el-table-column label="物流商地址" align="center" prop="address" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="关联的采购单" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>-->
<!-- <el-tag v-else type="info">未关联</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column width="150" label="仓库配送地址" align="center" prop="shipToAddress">-->
<!-- <template #default="{ row }">-->
<!-- &lt;!&ndash; <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>&ndash;&gt;-->
<!-- <el-popover placement="left" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button plain size="small" type="success"> 点击查看详情</el-button>-->
<!-- </template>-->
<!-- <el-descriptions title="收货地址信息" :column="3" border>-->
<!-- <el-descriptions-item v-for="item in descriptItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.shipToAddress[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="亚马逊货件状态" align="center" width="180">-->
<!-- <template #default="scope">-->
<!-- <el-tag>{{ scope.row.shipmentStatus }}</el-tag>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:sendOrder:remove']"></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-dialog>
</div> </div>
</template> </template>
@ -263,10 +290,17 @@ import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrde
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types'; import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { formatText, parseTime } from '@/utils/asinkj'; import { formatText, parseTime } from '@/utils/asinkj';
import { ElTable } from 'element-plus'; import { ElTable } from 'element-plus';
import { ShipmentPlanVO } from '@/api/amz/shipmentPlan/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status')); const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const { send_order_type } = toRefs<any>(proxy?.useDict('send_order_type'));
const { purchase_order_status } = toRefs<any>(proxy?.useDict('purchase_order_status'));
const sendOrderList = ref<SendOrderVO[]>([]); const sendOrderList = ref<SendOrderVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -284,6 +318,13 @@ const dialog = reactive<DialogOption>({
title: '' title: ''
}); });
const fbaDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const fbaDataList = ref<ShipmentPlanVO[]>([]);
const initFormData: SendOrderForm = { const initFormData: SendOrderForm = {
id: undefined, id: undefined,
orderSn: undefined, orderSn: undefined,
@ -418,6 +459,12 @@ const handleDelete = async (row?: SendOrderVO) => {
await getList(); await getList();
}; };
const handleFbaList = async (row?: SendOrderVO) => {
fbaDataList.value = row.bizShipmentPlans;
fbaDialog.visible = true;
fbaDialog.title = 'FBA货件列表';
};
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = () => { const handleExport = () => {
proxy?.download( proxy?.download(
@ -433,66 +480,66 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style scoped> <!--<style scoped>-->
/* 展开行容器 */ <!--/* 展开行容器 */-->
:deep(.el-table__expanded-cell) { <!--:deep(.el-table__expanded-cell) {-->
background: #f5fbfd !important; <!-- background: #f5fbfd !important;-->
padding: 0 !important; <!-- padding: 0 !important;-->
border-bottom: none !important; <!-- border-bottom: none !important;-->
} <!--}-->
/* 内嵌表格容器 */ <!--/* 内嵌表格容器 */-->
:deep(.el-table__expanded-cell) .el-table { <!--:deep(.el-table__expanded-cell) .el-table {-->
--el-table-bg-color: #ebf3ff !important; <!-- &#45;&#45;el-table-bg-color: #ebf3ff !important;-->
--el-table-tr-bg-color: #f5fbfd !important; <!-- &#45;&#45;el-table-tr-bg-color: #f5fbfd !important;-->
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */ <!-- &#45;&#45;el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */-->
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */ <!-- &#45;&#45;el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */-->
} <!--}-->
/* 表格主体容器 */ <!--/* 表格主体容器 */-->
:deep(.el-table__expanded-cell) .el-table__body-wrapper { <!--:deep(.el-table__expanded-cell) .el-table__body-wrapper {-->
background: #ebf3ff !important; <!-- background: #ebf3ff !important;-->
} <!--}-->
/* 表头单元格精准控制 */ <!--/* 表头单元格精准控制 */-->
:deep(.el-table__expanded-cell) .el-table__header th { <!--:deep(.el-table__expanded-cell) .el-table__header th {-->
background-color: #cfe2ff !important; /* 覆盖默认背景 */ <!-- background-color: #cfe2ff !important; /* 覆盖默认背景 */-->
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */ <!-- border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */-->
} <!--}-->
/* 表头文字样式 */ <!--/* 表头文字样式 */-->
:deep(.el-table__expanded-cell) .el-table__header .cell { <!--:deep(.el-table__expanded-cell) .el-table__header .cell {-->
color: #1a2b3c !important; <!-- color: #1a2b3c !important;-->
font-weight: 600; /* 加粗字体 */ <!-- font-weight: 600; /* 加粗字体 */-->
} <!--}-->
/* 单元格背景 */ <!--/* 单元格背景 */-->
:deep(.el-table__expanded-cell) .el-table__body tr td { <!--:deep(.el-table__expanded-cell) .el-table__body tr td {-->
background-color: transparent !important; <!-- background-color: transparent !important;-->
} <!--}-->
/* 消除卡片干扰 */ <!--/* 消除卡片干扰 */-->
:deep(.el-card) { <!--:deep(.el-card) {-->
background: transparent !important; <!-- background: transparent !important;-->
border: none !important; <!-- border: none !important;-->
} <!--}-->
/* 内嵌表格hover效果 */ <!--/* 内嵌表格hover效果 */-->
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td { <!--:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {-->
background-color: #ffffff !important; <!-- background-color: #ffffff !important;-->
} <!--}-->
/* 表头hover状态 */ <!--/* 表头hover状态 */-->
:deep(.el-table__expanded-cell) .el-table__header tr:hover th { <!--:deep(.el-table__expanded-cell) .el-table__header tr:hover th {-->
background-color: #b6d4ff !important; <!-- background-color: #b6d4ff !important;-->
} <!--}-->
/* 表头排序按钮颜色 */ <!--/* 表头排序按钮颜色 */-->
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending { <!--:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {-->
border-bottom-color: #1a2b3c; <!-- border-bottom-color: #1a2b3c;-->
} <!--}-->
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending { <!--:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {-->
border-top-color: #1a2b3c; <!-- border-top-color: #1a2b3c;-->
} <!--}-->
</style> <!--</style>-->

View File

@ -178,21 +178,29 @@
<el-table-column label="货件编号" align="center" prop="shipmentId" /> <el-table-column label="货件编号" align="center" prop="shipmentId" />
<el-table-column label="商品详情" align="center"> <el-table-column label="商品详情" align="center">
<template #default="scope"> <template #default="scope">
<el-popover placement="top" :width="750" trigger="hover" @show="showPop(scope.row)"> <el-popover placement="top" :width="950" trigger="hover" @show="showPop(scope.row)">
<template #reference> <template #reference>
<el-button size="small" plain style="margin-right: 16px">查看</el-button> <el-button size="small" plain style="margin-right: 16px">查看</el-button>
</template> </template>
<el-table :data="scope.row.itemVoList"> <el-table :data="scope.row.itemVoList">
<el-table-column width="200" property="productName" label="品名" /> <el-table-column width="200" property="productName" label="品名" />
<el-table-column width="150" property="sku" label="sku" />
<el-table-column width="150" property="asin" label="asin" /> <el-table-column width="150" property="asin" label="asin" />
<el-table-column width="80" property="quantityShipped" label="申报量" />
<el-table-column width="150" property="fnsku" label="fnsku" /> <el-table-column width="150" property="fnsku" label="fnsku" />
<el-table-column width="200" property="msku" label="msku" /> <el-table-column width="200" property="msku" label="msku" />
</el-table> </el-table>
</el-popover> </el-popover>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="申报量" property="quantityShipped" width="80">
<template #default="scope">
{{ scope.row.quantityShipped }}
</template>
</el-table-column>
<el-table-column label="国家" align="center" prop="shipToAddress.countryCode" /> <el-table-column label="国家" align="center" prop="shipToAddress.countryCode" />
<el-table-column label="物流中心编码" align="center" prop="destination" /> <el-table-column label="物流中心编码" align="center" prop="destination" />
<el-table-column label="箱数" align="center" prop="boxQuantity" />
<el-table-column label="关联的采购单" align="center"> <el-table-column label="关联的采购单" align="center">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag> <el-tag v-if="scope.row.sendOrders != null" type="success">已关联</el-tag>
@ -316,7 +324,7 @@
<el-switch v-model="customsFlag" active-value="1" inactive-value="0" /> <el-switch v-model="customsFlag" active-value="1" inactive-value="0" />
</el-form-item> </el-form-item>
<el-form-item label="物流渠道"> <el-form-item label="物流渠道" required="true">
<el-cascader <el-cascader
ref="channelCascaderRef" ref="channelCascaderRef"
v-model="selectedChannel" v-model="selectedChannel"
@ -561,7 +569,7 @@ import { LogisticsQuoteVO } from '@/api/amz/logisticsQuote/types';
import { createOrderForm } from '@/api/amz/logisticsOrder/types'; import { createOrderForm } from '@/api/amz/logisticsOrder/types';
import { createLogisticsOrder } from '@/api/amz/logisticsOrder'; import { createLogisticsOrder } from '@/api/amz/logisticsOrder';
import { InquiryRequestItemVO } from '@/api/amz/inquiryRequest/types'; import { InquiryRequestItemVO } from '@/api/amz/inquiryRequest/types';
import { listSendOrder } from '@/api/amz/sendOrder'; import { coverSendOrder, listSendOrder } from '@/api/amz/sendOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types'; import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
import { SendOrderVO } from '@/api/amz/sendOrder/types'; import { SendOrderVO } from '@/api/amz/sendOrder/types';
import { formatText } from '@/utils/asinkj'; import { formatText } from '@/utils/asinkj';
@ -749,6 +757,7 @@ const orderQueryParams = ref({
weightPerBox: undefined, weightPerBox: undefined,
realStoreName: undefined, realStoreName: undefined,
sendStatus: 'confirm', sendStatus: 'confirm',
skus: [],
params: {} params: {}
}); });
@ -935,9 +944,16 @@ const batchLinkOrderAction = async () => {
return; return;
} }
console.log('selectionDatas', selectionDatas.value);
orderQueryParams.value.sendStatus = 'confirm,completed,set_store'; orderQueryParams.value.sendStatus = 'confirm,completed,set_store';
// 访 skus skus
const skuCollection: string[] = selectionDatas.value.flatMap(
(sdata) => sdata.itemVoList?.map((s) => s.sku) || [] // skus
);
orderQueryParams.value.skus = skuCollection;
console.log('orderQueryParams', orderQueryParams.value); console.log('orderQueryParams', orderQueryParams.value);
const res = await listSendOrder(orderQueryParams.value); const res = await coverSendOrder(orderQueryParams.value);
sendOrderList.value = res.rows; sendOrderList.value = res.rows;
orderTableVisible.visible = true; orderTableVisible.visible = true;
@ -1407,6 +1423,11 @@ const submitForm = () => {
console.log('selectedChannel', selectedChannel); console.log('selectedChannel', selectedChannel);
console.log('groupedChannels', groupedChannels); console.log('groupedChannels', groupedChannels);
console.log('channelCascaderRef.value.getCheckedNodes()', channelCascaderRef.value.getCheckedNodes());
if (channelCascaderRef.value.getCheckedNodes()[0] == null) {
ElMessage.error('请选择物流渠道');
return;
}
// console.log('channelCascaderRef', channelCascaderRef); // console.log('channelCascaderRef', channelCascaderRef);
console.log('label====', channelCascaderRef.value.getCheckedNodes()[0].label); console.log('label====', channelCascaderRef.value.getCheckedNodes()[0].label);
form.value.channelName = channelCascaderRef.value.getCheckedNodes()[0].label; form.value.channelName = channelCascaderRef.value.getCheckedNodes()[0].label;
@ -1509,66 +1530,66 @@ onMounted(() => {
getAllChannelData(); getAllChannelData();
}); });
</script> </script>
<style scoped> <!--<style scoped>-->
/* 展开行容器 */ <!--/* 展开行容器 */-->
:deep(.el-table__expanded-cell) { <!--:deep(.el-table__expanded-cell) {-->
background: #f5fbfd !important; <!-- background: #f5fbfd !important;-->
padding: 0 !important; <!-- padding: 0 !important;-->
border-bottom: none !important; <!-- border-bottom: none !important;-->
} <!--}-->
/* 内嵌表格容器 */ <!--/* 内嵌表格容器 */-->
:deep(.el-table__expanded-cell) .el-table { <!--:deep(.el-table__expanded-cell) .el-table {-->
--el-table-bg-color: #ebf3ff !important; <!-- &#45;&#45;el-table-bg-color: #ebf3ff !important;-->
--el-table-tr-bg-color: #f5fbfd !important; <!-- &#45;&#45;el-table-tr-bg-color: #f5fbfd !important;-->
--el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */ <!-- &#45;&#45;el-table-header-bg-color: #cfe2ff !important; /* 表头变量 */-->
--el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */ <!-- &#45;&#45;el-table-header-text-color: #2c3e50 !important; /* 新增文字颜色 */-->
} <!--}-->
/* 表格主体容器 */ <!--/* 表格主体容器 */-->
:deep(.el-table__expanded-cell) .el-table__body-wrapper { <!--:deep(.el-table__expanded-cell) .el-table__body-wrapper {-->
background: #ebf3ff !important; <!-- background: #ebf3ff !important;-->
} <!--}-->
/* 表头单元格精准控制 */ <!--/* 表头单元格精准控制 */-->
:deep(.el-table__expanded-cell) .el-table__header th { <!--:deep(.el-table__expanded-cell) .el-table__header th {-->
background-color: #cfe2ff !important; /* 覆盖默认背景 */ <!-- background-color: #cfe2ff !important; /* 覆盖默认背景 */-->
border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */ <!-- border-bottom: 2px solid #a6c5ff !important; /* 表头下边框 */-->
} <!--}-->
/* 表头文字样式 */ <!--/* 表头文字样式 */-->
:deep(.el-table__expanded-cell) .el-table__header .cell { <!--:deep(.el-table__expanded-cell) .el-table__header .cell {-->
color: #1a2b3c !important; <!-- color: #1a2b3c !important;-->
font-weight: 600; /* 加粗字体 */ <!-- font-weight: 600; /* 加粗字体 */-->
} <!--}-->
/* 单元格背景 */ <!--/* 单元格背景 */-->
:deep(.el-table__expanded-cell) .el-table__body tr td { <!--:deep(.el-table__expanded-cell) .el-table__body tr td {-->
background-color: transparent !important; <!-- background-color: transparent !important;-->
} <!--}-->
/* 消除卡片干扰 */ <!--/* 消除卡片干扰 */-->
:deep(.el-card) { <!--:deep(.el-card) {-->
background: transparent !important; <!-- background: transparent !important;-->
border: none !important; <!-- border: none !important;-->
} <!--}-->
/* 内嵌表格hover效果 */ <!--/* 内嵌表格hover效果 */-->
:deep(.el-table__expanded-cell) .el-table__body tr:hover > td { <!--:deep(.el-table__expanded-cell) .el-table__body tr:hover > td {-->
background-color: #ffffff !important; <!-- background-color: #ffffff !important;-->
} <!--}-->
/* 表头hover状态 */ <!--/* 表头hover状态 */-->
:deep(.el-table__expanded-cell) .el-table__header tr:hover th { <!--:deep(.el-table__expanded-cell) .el-table__header tr:hover th {-->
background-color: #b6d4ff !important; <!-- background-color: #b6d4ff !important;-->
} <!--}-->
/* 表头排序按钮颜色 */ <!--/* 表头排序按钮颜色 */-->
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending { <!--:deep(.el-table__expanded-cell) .el-table__header .sort-caret.ascending {-->
border-bottom-color: #1a2b3c; <!-- border-bottom-color: #1a2b3c;-->
} <!--}-->
:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending { <!--:deep(.el-table__expanded-cell) .el-table__header .sort-caret.descending {-->
border-top-color: #1a2b3c; <!-- border-top-color: #1a2b3c;-->
} <!--}-->
</style> <!--</style>-->

View File

@ -57,9 +57,9 @@
>删除 >删除
</el-button> </el-button>
</el-col> </el-col>
<!-- <el-col :span="1.5">--> <el-col :span="1.5">
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipmentPlan:export']">导出 </el-button>--> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipmentPlan:export']">导出 </el-button>
<!-- </el-col>--> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
@ -67,26 +67,78 @@
<el-table v-loading="loading" :data="shipmentPlanList" @current-change="handleCurrentChange" highlight-current-row ref="singleTableRef"> <el-table v-loading="loading" :data="shipmentPlanList" @current-change="handleCurrentChange" highlight-current-row ref="singleTableRef">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="props"> <template #default="props">
<el-descriptions size="small" border title="货件详情"> <el-card shadow="never">
<!-- <el-descriptions-item label="货件名称">{{ props.row.shipmentName }}</el-descriptions-item>--> <el-table :data="props.row.sendOrders">
<!-- <el-descriptions-item label="货件状态">{{ props.row.shipmentStatus }}</el-descriptions-item>--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<!-- <el-descriptions-item label="运输模式">{{ props.row.shippingMode }}</el-descriptions-item>--> <el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-descriptions-item label="运输方案">{{ props.row.shippingSolution }}</el-descriptions-item>--> <el-table-column label="发货单号" align="center" prop="id" />
<!-- <el-descriptions-item label="入库计划ID">{{ props.row.staInboundPlanId }}</el-descriptions-item>--> <el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<el-descriptions-item label="创建时间">{{ props.row.gmtCreate }}</el-descriptions-item> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
<!-- <el-descriptions-item label="计划发货日期">{{ parseTime(props.row.staShipmentDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货开始日">{{ parseTime(props.row.staDeliveryStartDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货截止日">{{ parseTime(props.row.staDeliveryEndDate, '{y}-{m}-{d}') }} </el-descriptions-item>
-->
<!-- <el-descriptions-item label="时效">{{ props.row.quote.leadTime + ' 天' }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="订单创建时间">{{ props.row.order.createTime }}</el-descriptions-item>-->
<el-descriptions-item label="亚马逊接收时间">{{ props.row.receivingTime }}</el-descriptions-item>
<el-descriptions-item label="上架天数">{{ props.row.order.createTime }}</el-descriptions-item>
</el-descriptions>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName">
<!-- <template #default="{ row }">-->
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">-->
<!-- <template #reference>-->
<!-- <el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">-->
<!-- {{ row.logisticsProviderName }}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- <div>{{ row.address || '暂无地址' }}</div>-->
<!-- </el-popover>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="500" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<!-- <el-table-column label="发货状态" align="center" prop="sendStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="send_status" :value="scope.row.sendStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button-->
<!-- link-->
<!-- type="primary"-->
<!-- icon="Delete"-->
<!-- @click="handleDeleteRelation(props.row.id, scope.row.id)"-->
<!-- v-hasRoles="['superadmin', 'yunying']"-->
<!-- ></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column label="发货日期" align="center" prop="gmtCreate" width="180"> <el-table-column label="发货日期" align="center" prop="gmtCreate" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.staShipmentDate, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.staShipmentDate, '{y}-{m}-{d}') }}</span>
@ -96,19 +148,26 @@
<el-table-column label="货件编号" align="center" prop="shipmentId" /> <el-table-column label="货件编号" align="center" prop="shipmentId" />
<el-table-column label="商品详情" align="center"> <el-table-column label="商品详情" align="center">
<template #default="scope"> <template #default="scope">
<el-popover placement="top" :width="750" trigger="hover" @show="showPop(scope.row)"> <el-popover placement="top" :width="950" trigger="hover" @show="showPop(scope.row)">
<template #reference> <template #reference>
<el-button style="margin-right: 16px">查看</el-button> <el-button size="small" plain style="margin-right: 16px">查看</el-button>
</template> </template>
<el-table :data="scope.row.itemVoList"> <el-table :data="scope.row.itemVoList">
<el-table-column width="200" property="productName" label="品名" /> <el-table-column width="200" property="productName" label="品名" />
<el-table-column width="150" property="sku" label="sku" />
<el-table-column width="150" property="asin" label="asin" /> <el-table-column width="150" property="asin" label="asin" />
<el-table-column width="80" property="quantityShipped" label="申报量" />
<el-table-column width="150" property="fnsku" label="fnsku" /> <el-table-column width="150" property="fnsku" label="fnsku" />
<el-table-column width="200" property="msku" label="msku" /> <el-table-column width="200" property="msku" label="msku" />
</el-table> </el-table>
</el-popover> </el-popover>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="申报量" property="quantityShipped" width="80">
<template #default="scope">
{{ scope.row.quantityShipped }}
</template>
</el-table-column>
<el-table-column width="150" label="货件明细" align="center" prop="shipToAddress"> <el-table-column width="150" label="货件明细" align="center" prop="shipToAddress">
<template #default="{ row }"> <template #default="{ row }">
<el-button @click="openDetailDialog(row.detailList)"> 查看详情</el-button> <el-button @click="openDetailDialog(row.detailList)"> 查看详情</el-button>
@ -122,35 +181,86 @@
<el-table-column label="物流称重-总重量" align="center" prop="logisticsWeight" /> <el-table-column label="物流称重-总重量" align="center" prop="logisticsWeight" />
<el-table-column label="称重差异" align="center" prop="weightDiff" /> <el-table-column label="称重差异" align="center" prop="weightDiff" />
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />--> <!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
<el-table-column label="关联采购单" align="center" prop="sendOrderId"> <el-table-column width="150" label="物流信息" align="center" prop="shipToAddress">
<template #default="scope"> <template #default="{ row }">
<el-popover v-if="scope.row.sendOrderId" placement="top" :width="800" trigger="click"> <!-- <el-button @click="openAddressDialog(row.shipToAddress)"> 查看详情</el-button>-->
<el-popover v-if="row.quote != null" placement="left" :width="800" trigger="click">
<template #reference> <template #reference>
<!-- <el-button style="margin-right: 16px">Click to activate</el-button>--> <!-- <el-button style="margin-right: 16px">Click to activate</el-button>-->
<el-button size="small" plain v-if="scope.row.sendOrderId" type="success"> 已关联</el-button> <el-button plain size="small" type="success"> 点击查看详情</el-button>
</template> </template>
<el-descriptions v-if="scope.row.sendOrderId" title="供应商发货单" border :column="2" label-class-name="desc-label"> <el-descriptions title="物流信息" :column="3" border>
<!-- 订单信息 --> <!-- { label: '物流名称', prop: 'logisticsName' },-->
<el-descriptions-item label="订单编号" min-width="120px"> <!-- { label: '目的地', prop: 'destination' },-->
{{ scope.row.sendOrder.orderSn }} <!-- { label: '渠道名称', prop: 'channelName' },-->
<!-- { label: '单价', prop: 'price' },-->
<!-- { label: '附加费', prop: 'surcharge' },-->
<!-- { label: '运输时效', prop: 'leadTime' },-->
<!-- { label: '总价', prop: 'totalPrice' }-->
<el-descriptions-item label="报价类型">
<dict-tag :options="request_type" :value="row.quote.type" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="物流商名称">
<el-descriptions-item label="产品名称"> {{ row.quote.logisticsName }}
{{ scope.row.sendOrder.productName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="目的地">
<el-descriptions-item label="总箱数"> {{ scope.row.sendOrder.boxCount }} </el-descriptions-item> {{ row.quote.destination }}
<el-descriptions-item label="总重量"> {{ scope.row.sendOrder.weightPerBox }} kg</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="箱体规格"> {{ scope.row.sendOrder.sendDetail }}</el-descriptions-item> <el-descriptions-item label="渠道名称">
{{ row.quote.channelName }}
<!-- <el-descriptions-item label="每箱数量"> {{ scope.row.sendOrder.quantityPerBox }} / </el-descriptions-item>--> </el-descriptions-item>
<el-descriptions-item label="单价">
{{ row.quote.price }}
</el-descriptions-item>
<el-descriptions-item label="附加费">
{{ row.quote.surcharge }}
</el-descriptions-item>
<el-descriptions-item label="运输时效">
{{ row.quote.leadTime }}
</el-descriptions-item>
<el-descriptions-item label="总价">
{{ row.quote.totalPrice }}
</el-descriptions-item>
<el-descriptions-item label="结算金额">
{{ row.amountPrice }}
</el-descriptions-item>
<!-- <el-descriptions-item v-for="item in realisticItems" :key="item.prop" :label="item.label">-->
<!-- {{ row.quote[item.prop] || 'N/A' }}-->
<!-- </el-descriptions-item>-->
</el-descriptions> </el-descriptions>
</el-popover> </el-popover>
<!-- <el-tooltip class="box-item" effect="dark" content="点击关联采购单" placement="top">--> <el-tag type="info" v-else>暂无物流信息</el-tag>
<!-- <el-button size="small" plain v-if="!scope.row.sendOrderId" type="info" @click="handleLink(scope.row)"> 未关联 </el-button>-->
<!-- </el-tooltip>-->
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="关联采购单" align="center" prop="sendOrderId">-->
<!-- <template #default="scope">-->
<!-- <el-popover v-if="scope.row.sendOrderId" placement="top" :width="800" trigger="click">-->
<!-- <template #reference>-->
<!-- &lt;!&ndash; <el-button style="margin-right: 16px">Click to activate</el-button>&ndash;&gt;-->
<!-- <el-button size="small" plain v-if="scope.row.sendOrderId" type="success"> 已关联</el-button>-->
<!-- </template>-->
<!-- <el-descriptions v-if="scope.row.sendOrderId" title="供应商发货单" border :column="2" label-class-name="desc-label">-->
<!-- &lt;!&ndash; 订单信息 &ndash;&gt;-->
<!-- <el-descriptions-item label="订单编号" min-width="120px">-->
<!-- {{ scope.row.sendOrder.orderSn }}-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="产品名称">-->
<!-- {{ scope.row.sendOrder.productName }}-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="总箱数"> {{ scope.row.sendOrder.boxCount }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="总重量"> {{ scope.row.sendOrder.weightPerBox }} kg</el-descriptions-item>-->
<!-- <el-descriptions-item label="箱体规格"> {{ scope.row.sendOrder.sendDetail }}</el-descriptions-item>-->
<!-- &lt;!&ndash; <el-descriptions-item label="每箱数量"> {{ scope.row.sendOrder.quantityPerBox }} / </el-descriptions-item>&ndash;&gt;-->
<!-- </el-descriptions>-->
<!-- </el-popover>-->
<!-- &lt;!&ndash; <el-tooltip class="box-item" effect="dark" content="点击关联采购单" placement="top">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button size="small" plain v-if="!scope.row.sendOrderId" type="info" @click="handleLink(scope.row)"> 未关联 </el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="渠道ID" align="center" prop="channelId" />--> <!-- <el-table-column label="渠道ID" align="center" prop="channelId" />-->
@ -417,9 +527,11 @@ import { ElTable } from 'element-plus';
import { LogisticsQuoteVO } from '@/api/amz/logisticsQuote/types'; import { LogisticsQuoteVO } from '@/api/amz/logisticsQuote/types';
import { createOrderForm } from '@/api/amz/logisticsOrder/types'; import { createOrderForm } from '@/api/amz/logisticsOrder/types';
import { createLogisticsOrder } from '@/api/amz/logisticsOrder'; import { createLogisticsOrder } from '@/api/amz/logisticsOrder';
import { formatText } from '@/utils/asinkj';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_logistics_status } = toRefs<any>(proxy?.useDict('biz_logistics_status')); const { biz_logistics_status } = toRefs<any>(proxy?.useDict('biz_logistics_status'));
const { request_type } = toRefs<any>(proxy?.useDict('request_type'));
const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one')); const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one'));
@ -534,6 +646,16 @@ const descriptItems: DescriptItem[] = [
{ label: '门牌号', prop: 'doorplate' } { label: '门牌号', prop: 'doorplate' }
]; ];
const realisticItems = [
{ label: '物流名称', prop: 'logisticsName' },
{ label: '目的地', prop: 'destination' },
{ label: '渠道名称', prop: 'channelName' },
{ label: '单价', prop: 'price' },
{ label: '附加费', prop: 'surcharge' },
{ label: '运输时效', prop: 'leadTime' },
{ label: '总价', prop: 'totalPrice' }
];
const showPop = async (row: any) => { const showPop = async (row: any) => {
console.log('row', row); console.log('row', row);
}; };
@ -640,10 +762,10 @@ const getList = async () => {
loading.value = true; loading.value = true;
const res = await listShipmentPlanOrder(queryParams.value); const res = await listShipmentPlanOrder(queryParams.value);
res.rows.forEach((item) => { res.rows.forEach((item) => {
item.vendorWeight = item.detailList.reduce((acc, cur) => { item.vendorWeight = (item.detailList || []).reduce((acc, cur) => {
return acc + cur.supplierWeight; return acc + cur.supplierWeight;
}, 0); }, 0);
item.logisticsWeight = item.detailList.reduce((acc, cur) => { item.logisticsWeight = (item.detailList || []).reduce((acc, cur) => {
return acc + cur.logisticsWeight; return acc + cur.logisticsWeight;
}, 0); }, 0);
item.weightDiff = item.vendorWeight - item.logisticsWeight; item.weightDiff = item.vendorWeight - item.logisticsWeight;
@ -902,7 +1024,7 @@ const handleDelete = async (row?: ShipmentPlanVO) => {
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = () => { const handleExport = () => {
proxy?.download( proxy?.download(
'amz/shipmentPlan/export', 'amz/shipmentPlan/list/order/export',
{ {
...queryParams.value ...queryParams.value
}, },

View File

@ -67,20 +67,78 @@
<el-table v-loading="loading" :data="shipmentPlanList" @current-change="handleCurrentChange" highlight-current-row ref="singleTableRef"> <el-table v-loading="loading" :data="shipmentPlanList" @current-change="handleCurrentChange" highlight-current-row ref="singleTableRef">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="props"> <template #default="props">
<el-descriptions size="small" border title="货件详情"> <el-card shadow="never">
<el-descriptions-item label="货件名称">{{ props.row.shipmentName }}</el-descriptions-item> <el-table :data="props.row.sendOrders">
<!-- <el-descriptions-item label="货件状态">{{ props.row.shipmentStatus }}</el-descriptions-item>--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<!-- <el-descriptions-item label="运输模式">{{ props.row.shippingMode }}</el-descriptions-item>--> <el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-descriptions-item label="运输方案">{{ props.row.shippingSolution }}</el-descriptions-item>--> <el-table-column label="发货单号" align="center" prop="id" />
<!-- <el-descriptions-item label="入库计划ID">{{ props.row.staInboundPlanId }}</el-descriptions-item>--> <el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
<el-descriptions-item label="创建时间">{{ parseTime(props.row.gmtCreate, '{y}-{m}-{d}') }} </el-descriptions-item> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
<!-- <el-descriptions-item label="计划发货日期">{{ parseTime(props.row.staShipmentDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货开始日">{{ parseTime(props.row.staDeliveryStartDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
<!-- <el-descriptions-item label="预计到货截止日">{{ parseTime(props.row.staDeliveryEndDate, '{y}-{m}-{d}') }} </el-descriptions-item>-->
</el-descriptions>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发货日期" align="center" prop="sendDate" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.sendDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="采购店铺" align="center" prop="storeName" />
<el-table-column label="供应商名称" align="center" prop="sendName" />
<el-table-column label="物流商名称" align="center" prop="logisticsProviderName">
<!-- <template #default="{ row }">-->
<!-- <el-popover placement="top" title="物流商地址" :width="200" trigger="click">-->
<!-- <template #reference>-->
<!-- <el-button v-if="row.logisticsProviderName !== null" text size="small" type="primary">-->
<!-- {{ row.logisticsProviderName }}-->
<!-- </el-button>-->
<!-- </template>-->
<!-- <div>{{ row.address || '暂无地址' }}</div>-->
<!-- </el-popover>-->
<!-- </template>-->
</el-table-column>
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="发货数量" align="center" prop="quantitySend" />
<!-- <el-table-column label="单箱产品数量" align="center" prop="quantityPerBox" />-->
<el-table-column label="箱数" align="center" prop="boxCount">
<template #default="{ row }">
<el-popover placement="top" title="装箱明细" :width="500" trigger="click">
<template #reference>
<el-button text size="small" type="primary"> {{ row.boxCount }}</el-button>
</template>
<div v-if="row.sendDetail !== null" v-html="formatText(row.sendDetail)"></div>
<div v-else>暂无数据</div>
</el-popover>
</template>
</el-table-column>
<!-- <el-table-column label="箱子尺寸" align="center" prop="boxDimensions" />-->
<el-table-column label="总重量" align="center" prop="weightPerBox" />
<el-table-column label="实际发货店铺" align="center" prop="realStoreName" />
<!-- <el-table-column label="发货状态" align="center" prop="sendStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="send_status" :value="scope.row.sendStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
<!-- <template #default="scope">-->
<!-- &lt;!&ndash; <el-tooltip content="修改" placement="top" v-if="scope.row.sendStatus === 'pending'">&ndash;&gt;-->
<!-- &lt;!&ndash; <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>&ndash;&gt;-->
<!-- &lt;!&ndash; </el-tooltip>&ndash;&gt;-->
<!-- <el-tooltip content="删除" placement="top">-->
<!-- <el-button-->
<!-- link-->
<!-- type="primary"-->
<!-- icon="Delete"-->
<!-- @click="handleDeleteRelation(props.row.id, scope.row.id)"-->
<!-- v-hasRoles="['superadmin', 'yunying']"-->
<!-- ></el-button>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-card>
</template>
</el-table-column>
<el-table-column label="创建日期" align="center" prop="gmtCreate" width="180"> <el-table-column label="创建日期" align="center" prop="gmtCreate" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.gmtCreate, '{y}-{m}-{d}') }}</span>
@ -90,13 +148,15 @@
<el-table-column label="货件编号" align="center" prop="shipmentId" /> <el-table-column label="货件编号" align="center" prop="shipmentId" />
<el-table-column label="商品详情" align="center"> <el-table-column label="商品详情" align="center">
<template #default="scope"> <template #default="scope">
<el-popover placement="top" :width="750" trigger="hover" @show="showPop(scope.row)"> <el-popover placement="top" :width="950" trigger="hover" @show="showPop(scope.row)">
<template #reference> <template #reference>
<el-button style="margin-right: 16px">查看</el-button> <el-button size="small" plain style="margin-right: 16px">查看</el-button>
</template> </template>
<el-table :data="scope.row.itemVoList"> <el-table :data="scope.row.itemVoList">
<el-table-column width="200" property="productName" label="品名" /> <el-table-column width="200" property="productName" label="品名" />
<el-table-column width="150" property="sku" label="sku" />
<el-table-column width="150" property="asin" label="asin" /> <el-table-column width="150" property="asin" label="asin" />
<el-table-column width="80" property="quantityShipped" label="申报量" />
<el-table-column width="150" property="fnsku" label="fnsku" /> <el-table-column width="150" property="fnsku" label="fnsku" />
<el-table-column width="200" property="msku" label="msku" /> <el-table-column width="200" property="msku" label="msku" />
</el-table> </el-table>
@ -329,7 +389,23 @@
<el-table-column label="物流商名称" align="center" prop="logisticsName" /> <el-table-column label="物流商名称" align="center" prop="logisticsName" />
<el-table-column label="目的地" align="center" prop="destination" /> <el-table-column label="目的地" align="center" prop="destination" />
<el-table-column label="渠道名称" align="center" prop="channelName" /> <el-table-column label="渠道名称" align="center" prop="channelName" />
<el-table-column label="基础价格" align="center" prop="price" /> <el-table-column label="询价类型" align="center" prop="type">
<template #default="scope">
<dict-tag :options="request_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="基础价格" align="center" prop="price">
<template #default="scope">
<el-tag type="warning" v-if="scope.row.type === 'weight'">重量询价参考总价</el-tag>
<span v-else>{{ scope.row.price }}</span>
</template>
</el-table-column>
<el-table-column label="总价" align="center" prop="totalPrice">
<template #default="scope">
<span v-if="scope.row.type === 'weight'">{{ scope.row.totalPrice }}</span>
<el-tag type="warning" v-else>普通询价参考单价</el-tag>
</template>
</el-table-column>
<el-table-column label="最短时效" align="center" prop="minLeadTime" /> <el-table-column label="最短时效" align="center" prop="minLeadTime" />
<el-table-column label="时效" align="center" prop="leadTime" /> <el-table-column label="时效" align="center" prop="leadTime" />
<el-table-column label="附加费" align="center" prop="surcharge" /> <el-table-column label="附加费" align="center" prop="surcharge" />
@ -367,6 +443,7 @@
</div> </div>
</template> </template>
</el-drawer> </el-drawer>
</div> </div>
</template> </template>
@ -397,6 +474,8 @@ const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one')); const { sys_zero_one } = toRefs<any>(proxy?.useDict('sys_zero_one'));
const { request_type } = toRefs<any>(proxy?.useDict('request_type'));
const shipmentPlanList = ref<ShipmentPlanVO[]>([]); const shipmentPlanList = ref<ShipmentPlanVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -806,10 +885,9 @@ const checkPrice = async () => {
// return; // return;
// } // }
const res = await queryLogisticsQuoteWithDes(currentDes.value, shipDate.value,currentFBAData.value.shipmentId); const res = await queryLogisticsQuoteWithDes(currentDes.value, shipDate.value, currentFBAData.value.shipmentId);
console.log('查询报价单', res); console.log('查询报价单', res);
if (res.total == 0) { if (res.total == 0) {
ElNotification({ ElNotification({
title: '警告', title: '警告',
message: '暂时没有物流商报价', message: '暂时没有物流商报价',