运营段修改

This commit is contained in:
dev 2025-05-15 11:30:49 +08:00
parent 2cc637b129
commit e4397049ee
49 changed files with 7626 additions and 381 deletions

View File

@ -1,214 +1,235 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link rel="icon" href="/favicon.ico" />
<title>瑷胜科技管理系统</title>
<!--[if lt IE 11
]><script>
window.location.href = '/html/ie.html';
</script><!
[endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link rel="icon" href="/favicon.ico" />
<title>瑷胜科技管理系统</title>
<!--[if lt IE 11
]><script>
window.location.href = '/html/ie.html';
</script><!
[endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
}
#loader:before {
content: '';
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#loader:after {
content: '';
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171c6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #fff;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #fff;
opacity: 0.5;
}
</style>
<script>
window.difyChatbotConfig = {
token: 'ri85V8MYF4Ld0s95',
baseUrl: 'http://localhost:801',
systemVariables: {
// user_id: 'YOU CAN DEFINE USER ID HERE',
// conversation_id: 'YOU CAN DEFINE CONVERSATION ID HERE, IT MUST BE A VALID UUID',
}
};
</script>
<script src="http://localhost:801/embed.min.js" id="ri85V8MYF4Ld0s95" defer></script>
<style>
#dify-chatbot-bubble-button {
background-color: #1c64f2 !important;
}
#loader:before {
content: '';
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#dify-chatbot-bubble-window {
width: 24rem !important;
height: 40rem !important;
}
</style>
</head>
#loader:after {
content: '';
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171c6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #fff;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #fff;
opacity: 0.5;
}
</style>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@ -50,6 +50,7 @@
"vue-cropper": "1.1.1",
"vue-i18n": "10.0.5",
"vue-json-pretty": "2.4.0",
"vue-qr": "^4.0.9",
"vue-router": "4.4.5",
"vue-types": "5.1.3",
"vxe-table": "4.5.22"

View File

@ -18,3 +18,5 @@ onMounted(() => {
});
});
</script>

View File

@ -38,10 +38,6 @@ export const getLogisticsOrder = (id: string | number): AxiosPromise<InquiryQuot
// });
// };
/**
*
* @param data
*/
export const addLogisticsOrder = (data: LogisticsOrderForm) => {
return request({
url: '/amz/logisticsOrder',
@ -50,6 +46,17 @@ export const addLogisticsOrder = (data: LogisticsOrderForm) => {
});
};
/**
*
* @param data
*/
export const queryLogisticsOrder = () => {
return request({
url: '/amz/logisticsOrder/query',
method: 'get'
});
};
/**
*
* @param data
@ -84,3 +91,5 @@ export const delLogisticsOrder = (id: string | number | Array<string | number>)
method: 'delete'
});
};

View File

@ -159,6 +159,8 @@ export interface LogisticsOrderQuery extends PageQuery {
*/
logisticsChannel?: string;
channelId?: string | number;
/**
*
*/

View File

@ -120,3 +120,15 @@ export const delLogisticsQuote = (id: string | number | Array<string | number>)
method: 'delete'
});
};
/**
*
* @param data
*/
export const queryLogisticsQuoteReport = (queryData: any) => {
return request({
url: '/amz/logisticsQuote/report',
method: 'post',
data: queryData
});
};

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PurchaseOrderVO, PurchaseOrderForm, PurchaseOrderQuery } from '@/api/amz/purchaseOrder/types';
/**
*
* @param query
* @returns {*}
*/
export const listPurchaseOrder = (query?: PurchaseOrderQuery): AxiosPromise<PurchaseOrderVO[]> => {
return request({
url: '/amz/purchaseOrder/list',
method: 'get',
params: query
});
};
/**
*
* @param orderSn
*/
export const getPurchaseOrder = (orderSn: string | number): AxiosPromise<PurchaseOrderVO> => {
return request({
url: '/amz/purchaseOrder/' + orderSn,
method: 'get'
});
};
/**
*
* @param data
*/
export const addPurchaseOrder = (data: PurchaseOrderForm) => {
return request({
url: '/amz/purchaseOrder',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updatePurchaseOrder = (data: PurchaseOrderForm) => {
return request({
url: '/amz/purchaseOrder',
method: 'put',
data: data
});
};
/**
*
* @param orderSn
*/
export const delPurchaseOrder = (orderSn: string | number | Array<string | number>) => {
return request({
url: '/amz/purchaseOrder/' + orderSn,
method: 'delete'
});
};

View File

@ -0,0 +1,760 @@
export interface PurchaseOrderVO {
/**
*
*/
orderSn: string;
/**
*
*/
customOrderSn: string;
/**
* ID
*/
supplierId: string | number;
/**
*
*/
supplierName: string;
/**
*
*/
storeName: string;
/**
* ID
*/
optUid: string | number;
/**
*
*/
auditorRealname: string;
/**
*
*/
optRealname: string;
/**
*
*/
lastRealname: string;
/**
*
*/
orderTime: string;
/**
*
*/
payment: string;
/**
* ID
*/
auditorUid: string | number;
/**
*
*/
auditorTime: string;
/**
* ID
*/
lastUid: string | number;
/**
*
*/
lastTime: string;
/**
*
*/
reason: string;
/**
* 0 1
*/
isTax: number;
/**
* -1 , 3 , 1 , 2 , 9 , 121 , 122 , 124
*/
status: number;
/**
*
*/
statusText: string;
/**
*
*/
payStatusText: string;
/**
* 1 , 2 , 3
*/
statusShipped: number;
/**
*
*/
statusShippedText: string;
/**
*
*/
amountTotal: number;
/**
*
*/
totalPrice: number;
/**
*
*/
icon: string;
/**
* 0 , 1 , 2 , 3
*/
payStatus: number;
/**
*
*/
remark: string;
/**
*
*/
otherFee: number;
/**
*
*/
otherCurrency: string;
/**
* 0 , 1 , 2
*/
feePartType: number;
/**
*
*/
shippingPrice: number;
/**
*
*/
shippingCurrency: string;
/**
*
*/
purchaseCurrency: string;
/**
*
*/
purchaseRate: number;
/**
*
*/
quantityTotal: number;
/**
* ID
*/
wid: string | number;
/**
*
*/
wareHouseName: string;
/**
* ()
*/
wareHouseBakName: string;
/**
*
*/
quantityEntry: number;
/**
*
*/
quantityReal: number;
/**
*
*/
quantityReceive: number;
/**
* ID
*/
purchaserId: string | number;
/**
*
*/
contactPerson: string;
/**
*
*/
contactNumber: string;
/**
* 7 , 8
*/
settlementMethod: number;
/**
*
*/
settlementDescription: string;
/**
*
*/
paymentMethod: number;
/**
*
*/
estDlvDays: number;
/**
*
*/
orderStatus: string;
/**
*
*/
deliveryTime: string;
/**
*
*/
dlvTimeVar: number;
}
export interface PurchaseOrderForm extends BaseEntity {
/**
*
*/
orderSn?: string;
/**
*
*/
customOrderSn?: string;
/**
* ID
*/
supplierId?: string | number;
/**
*
*/
supplierName?: string;
/**
* ID
*/
optUid?: string | number;
/**
*
*/
auditorRealname?: string;
/**
*
*/
optRealname?: string;
/**
*
*/
lastRealname?: string;
/**
*
*/
orderTime?: string;
/**
*
*/
payment?: string;
/**
* ID
*/
auditorUid?: string | number;
/**
*
*/
auditorTime?: string;
/**
* ID
*/
lastUid?: string | number;
/**
*
*/
lastTime?: string;
/**
*
*/
reason?: string;
/**
* 0 1
*/
isTax?: number;
/**
* -1 , 3 , 1 , 2 , 9 , 121 , 122 , 124
*/
status?: number;
/**
*
*/
statusText?: string;
/**
*
*/
payStatusText?: string;
/**
* 1 , 2 , 3
*/
statusShipped?: number;
/**
*
*/
statusShippedText?: string;
/**
*
*/
amountTotal?: number;
/**
*
*/
totalPrice?: number;
/**
*
*/
icon?: string;
/**
* 0 , 1 , 2 , 3
*/
payStatus?: number;
/**
*
*/
remark?: string;
/**
*
*/
otherFee?: number;
/**
*
*/
otherCurrency?: string;
/**
* 0 , 1 , 2
*/
feePartType?: number;
/**
*
*/
shippingPrice?: number;
/**
*
*/
shippingCurrency?: string;
/**
*
*/
purchaseCurrency?: string;
/**
*
*/
purchaseRate?: number;
/**
*
*/
quantityTotal?: number;
/**
* ID
*/
wid?: string | number;
/**
*
*/
wareHouseName?: string;
/**
* ()
*/
wareHouseBakName?: string;
/**
*
*/
quantityEntry?: number;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityReceive?: number;
/**
* ID
*/
purchaserId?: string | number;
/**
*
*/
contactPerson?: string;
/**
*
*/
contactNumber?: string;
/**
* 7 , 8
*/
settlementMethod?: number;
/**
*
*/
settlementDescription?: string;
/**
*
*/
paymentMethod?: number;
/**
*
*/
estDlvDays?: number;
/**
*
*/
orderStatus?: string;
/**
*
*/
deliveryTime?: string;
/**
*
*/
dlvTimeVar?: number;
}
export interface PurchaseOrderQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
*
*/
customOrderSn?: string;
/**
* ID
*/
supplierId?: string | number;
/**
*
*/
supplierName?: string;
/**
* ID
*/
optUid?: string | number;
/**
*
*/
auditorRealname?: string;
/**
*
*/
optRealname?: string;
/**
*
*/
lastRealname?: string;
/**
*
*/
orderTime?: string;
/**
*
*/
payment?: string;
/**
* ID
*/
auditorUid?: string | number;
/**
*
*/
auditorTime?: string;
/**
* ID
*/
lastUid?: string | number;
/**
*
*/
lastTime?: string;
/**
*
*/
reason?: string;
/**
* 0 1
*/
isTax?: number;
/**
* -1 , 3 , 1 , 2 , 9 , 121 , 122 , 124
*/
status?: number;
/**
*
*/
statusText?: string;
/**
*
*/
payStatusText?: string;
/**
* 1 , 2 , 3
*/
statusShipped?: number;
/**
*
*/
statusShippedText?: string;
/**
*
*/
amountTotal?: number;
/**
*
*/
totalPrice?: number;
/**
*
*/
icon?: string;
/**
* 0 , 1 , 2 , 3
*/
payStatus?: number;
/**
*
*/
otherFee?: number;
/**
*
*/
otherCurrency?: string;
/**
* 0 , 1 , 2
*/
feePartType?: number;
/**
*
*/
shippingPrice?: number;
/**
*
*/
shippingCurrency?: string;
/**
*
*/
purchaseCurrency?: string;
/**
*
*/
purchaseRate?: number;
/**
*
*/
quantityTotal?: number;
/**
* ID
*/
wid?: string | number;
/**
*
*/
wareHouseName?: string;
/**
* ()
*/
wareHouseBakName?: string;
/**
*
*/
quantityEntry?: number;
/**
*
*/
quantityReal?: number;
/**
*
*/
quantityReceive?: number;
/**
* ID
*/
purchaserId?: string | number;
/**
*
*/
contactPerson?: string;
/**
*
*/
contactNumber?: string;
/**
* 7 , 8
*/
settlementMethod?: number;
/**
*
*/
settlementDescription?: string;
/**
*
*/
paymentMethod?: number;
/**
*
*/
estDlvDays?: number;
/**
*
*/
orderStatus?: string;
/**
*
*/
deliveryTime?: string;
/**
*
*/
dlvTimeVar?: number;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { SendOrderVO, SendOrderForm, SendOrderQuery } from '@/api/amz/sendOrder/types';
/**
*
* @param query
* @returns {*}
*/
export const listSendOrder = (query?: SendOrderQuery): AxiosPromise<SendOrderVO[]> => {
return request({
url: '/amz/sendOrder/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getSendOrder = (id: string | number): AxiosPromise<SendOrderVO> => {
return request({
url: '/amz/sendOrder/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addSendOrder = (data: SendOrderForm) => {
return request({
url: '/amz/sendOrder',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateSendOrder = (data: SendOrderForm) => {
return request({
url: '/amz/sendOrder',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delSendOrder = (id: string | number | Array<string | number>) => {
return request({
url: '/amz/sendOrder/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,191 @@
export interface SendOrderVO {
/**
* ID
*/
id: string | number;
/**
*
*/
orderSn: string;
/**
*
*/
sendDate: string;
/**
*
*/
storeName: string;
/**
*
*/
productName: string;
/**
*
*/
quantitySend: number;
/**
*
*/
quantityPerBox: number;
/**
*
*/
boxCount: number;
/**
*
*/
boxDimensions: string;
/**
*
*/
weightPerBox: number;
/**
*
*/
realStoreName: string;
/**
* pending=confirm=, processing=completed=
*/
sendStatus: string;
}
export interface SendOrderForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
*
*/
orderSn?: string;
/**
*
*/
sendDate?: string;
/**
*
*/
storeName?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
/**
*
*/
quantityPerBox?: number;
/**
*
*/
boxCount?: number;
/**
*
*/
boxDimensions?: string;
/**
*
*/
weightPerBox?: number;
/**
*
*/
realStoreName?: string;
/**
* pending=confirm=, processing=completed=
*/
sendStatus?: string;
}
export interface SendOrderQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
*
*/
sendDate?: string;
/**
*
*/
storeName?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
/**
*
*/
quantityPerBox?: number;
/**
*
*/
boxCount?: number;
/**
*
*/
boxDimensions?: string;
/**
*
*/
weightPerBox?: number;
/**
*
*/
realStoreName?: string;
/**
* pending=confirm=, processing=completed=
*/
sendStatus?: string;
/**
*
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { ShipForwardVO, ShipForwardForm, ShipForwardQuery } from '@/api/amz/shipForward/types';
/**
*
* @param query
* @returns {*}
*/
export const listShipForward = (query?: ShipForwardQuery): AxiosPromise<ShipForwardVO[]> => {
return request({
url: '/amz/shipForward/list',
method: 'get',
params: query
});
};
/**
*
* @param id
*/
export const getShipForward = (id: string | number): AxiosPromise<ShipForwardVO> => {
return request({
url: '/amz/shipForward/' + id,
method: 'get'
});
};
/**
*
* @param data
*/
export const addShipForward = (data: ShipForwardForm) => {
return request({
url: '/amz/shipForward',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateShipForward = (data: ShipForwardForm) => {
return request({
url: '/amz/shipForward',
method: 'put',
data: data
});
};
/**
*
* @param id
*/
export const delShipForward = (id: string | number | Array<string | number>) => {
return request({
url: '/amz/shipForward/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,260 @@
export interface ShipForwardVO {
/**
* $column.columnComment
*/
id: string | number;
/**
*
*/
orderSn: string;
/**
*
*/
storeName: string;
/**
*
*/
sku: string;
/**
*
*/
productName: string;
/**
*
*/
quantitySend: number;
/**
*
*/
outSupplierName: string;
/**
* ID
*/
outSupplierId: string | number;
/**
*
*/
inSupplierName: string;
/**
* ID
*/
inSupplierId: string | number;
/**
*
*/
shipmentStart: string;
/**
*
*/
shipmentEnd: string;
/**
*
*/
trackerName: string;
/**
* ID
*/
trackerId: string | number;
/**
* pending=processing=completed=
*/
fwdStatus: string;
/**
*
*/
sendTime: string;
/**
* ID
*/
orderDetailId?: string | number;
}
export interface ShipForwardForm extends BaseEntity {
/**
* $column.columnComment
*/
id?: string | number;
/**
*
*/
orderSn?: string;
/**
*
*/
storeName?: string;
/**
*
*/
sku?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
/**
*
*/
outSupplierName?: string;
/**
* ID
*/
outSupplierId?: string | number;
/**
*
*/
inSupplierName?: string;
/**
* ID
*/
inSupplierId?: string | number;
/**
*
*/
shipmentStart?: string;
/**
*
*/
shipmentEnd?: string;
/**
*
*/
trackerName?: string;
/**
* ID
*/
trackerId?: string | number;
/**
* pending=processing=completed=
*/
fwdStatus?: string;
/**
*
*/
sendTime?: string;
/**
* ID
*/
orderDetailId?: string | number;
/**
*
*/
type?: string;
}
export interface ShipForwardQuery extends PageQuery {
/**
*
*/
orderSn?: string;
/**
*
*/
storeName?: string;
/**
*
*/
sku?: string;
/**
*
*/
productName?: string;
/**
*
*/
quantitySend?: number;
/**
*
*/
outSupplierName?: string;
/**
* ID
*/
outSupplierId?: string | number;
/**
*
*/
inSupplierName?: string;
/**
* ID
*/
inSupplierId?: string | number;
/**
*
*/
shipmentStart?: string;
/**
*
*/
shipmentEnd?: string;
/**
*
*/
trackerName?: string;
/**
* ID
*/
trackerId?: string | number;
/**
* pending=processing=completed=
*/
fwdStatus?: string;
/**
*
*/
sendTime?: string;
/**
*
*/
params?: any;
type: string;
}

View File

@ -12,6 +12,14 @@ export function authBinding(source: string, tenantId: string) {
});
}
export function authBindingWechat() {
return request({
url: '/auth/generate-auth-url',
method: 'get'
});
}
// 解绑账号
export function authUnlock(authId: string) {
return request({

View File

@ -1,9 +1,10 @@
import {DeptTreeVO, DeptVO} from './../dept/types';
import { DeptTreeVO, DeptVO } from './../dept/types';
import { RoleVO } from '@/api/system/role/types';
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { UserForm, UserQuery, UserVO, UserInfoVO } from './types';
import { parseStrEmpty } from '@/utils/asinkj';
import { PostVO } from '@/api/system/post/types';
/**
*
@ -209,6 +210,17 @@ export const deptTreeSelect = (): AxiosPromise<DeptTreeVO[]> => {
});
};
export const roleSelectPost = (roleIds?: (number | string)[]): AxiosPromise<UserVO[]> => {
return request({
url: '/system/user/roleSelect',
method: 'post',
data: {
// POST 请求使用 data 传递参数
roleIds: roleIds
}
});
};
export default {
listUser,
getUser,

View File

@ -0,0 +1,184 @@
<!-- ChannelCascader.vue -->
<template>
<el-cascader
v-model="selectedValue"
:props="cascaderProps"
:placeholder="placeholder"
:options="groupedChannels"
:filterable="filterable"
:disabled="disabled"
:show-all-levels="false"
@change="handleChange"
clearable
>
<template #default="{ node, data }">
<div class="flex items-center">
<span>{{ data.label }}</span>
<span v-if="node.isLeaf" class="ml-2 text-gray-400 text-sm">
{{ data.code }}
<!-- 根据实际字段显示渠道编码 -->
</span>
</div>
</template>
</el-cascader>
</template>
<script setup>
import { ref, watch, onMounted } from 'vue';
import { listAllLogisticsChannel } from '@/api/amz/logisticsChannel';
const props = defineProps({
modelValue: [String, Number, Array],
placeholder: {
type: String,
default: '请选择物流渠道'
},
filterable: {
type: Boolean,
default: true
},
disabled: Boolean
});
const emit = defineEmits(['update:modelValue', 'change']);
const groupedChannels = ref([]);
const selectedValue = ref(props.modelValue);
const cascaderProps = {
emitPath: false
};
//
watch(
() => props.modelValue,
(newVal) => {
selectedValue.value = newVal;
}
);
//
onMounted(async () => {
await loadChannels();
});
const loadChannels = async () => {
try {
const res = await listAllLogisticsChannel();
groupedChannels.value = transformChannels(res.rows); // 使 res.rows
} catch (error) {
console.error('物流渠道加载失败:', error);
ElMessage.error('渠道数据加载失败');
}
};
//
const countryMap = {
us: '美国',
cn: '中国',
jp: '日本',
kr: '韩国',
sg: '新加坡',
de: '德国',
fr: '法国',
gb: '英国',
it: '意大利',
es: '西班牙',
ru: '俄罗斯',
ca: '加拿大',
au: '澳大利亚',
in: '印度',
br: '巴西',
za: '南非',
mx: '墨西哥'
};
const shippingMethodMap = {
air: '空运',
sea: '海运'
//
};
function transformChannels(channels) {
const result = [];
const countryGroups = {}; //
channels.forEach((channel) => {
const { country, shippingMethod, channelName, id } = channel;
//
const countryValue = country;
const countryLabel = countryMap[country] || country;
if (!countryGroups[countryValue]) {
countryGroups[countryValue] = {
value: countryValue,
label: countryLabel,
children: []
};
result.push(countryGroups[countryValue]);
}
//
const methodValue = shippingMethod;
const methodLabel = shippingMethodMap[shippingMethod] || shippingMethod;
let methodNode = countryGroups[countryValue].children.find((m) => m.value === methodValue);
if (!methodNode) {
methodNode = {
value: methodValue,
label: methodLabel,
children: []
};
countryGroups[countryValue].children.push(methodNode);
}
//
methodNode.children.push({
value: id,
label: channelName
});
});
return result;
}
// //
// const transformData = (items) => {
// return items.map((item) => ({
// channelId: item.id, // id
// channelName: item.name, // name
// code: item.code, //
// children: item.children ? transformData(item.children) : undefined
// }));
// };
const handleChange = (value) => {
console.log('handleChange', value);
console.log('groupedChannels.value', groupedChannels.value);
emit('update:modelValue', value);
const node = findNode(value, groupedChannels.value);
if (node != null) {
emit('change', {
value,
node: findNode(value, groupedChannels.value).label
});
} else {
emit('change', {
value,
node: null
});
}
};
//
const findNode = (value, options) => {
for (const item of options) {
if (item.value === value) return item;
if (item.children) {
const found = findNode(value, item.children);
if (found) return found;
}
}
return null;
};
</script>

View File

@ -0,0 +1,259 @@
<template>
<div class="upload-file">
<el-upload
ref="fileUploadRef"
multiple
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:file-list="fileList"
:limit="limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
class="upload-file-uploader"
>
<!-- 上传按钮 -->
<el-button plain icon="Plus" type="danger">导入文件</el-button>
</el-upload>
<!-- 上传提示 -->
<div v-if="showTip" class="el-upload__tip">
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
</template>
的文件
</div>
<!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-button type="danger" link @click="handleDelete(index)">删除</el-button>
</div>
</li>
</transition-group>
</div>
</template>
<script setup lang="ts">
import { propTypes } from '@/utils/propTypes';
import { delOss, listByIds } from '@/api/system/oss';
import { globalHeaders } from '@/utils/request';
const props = defineProps({
modelValue: {
type: [String, Object, Array],
default: () => []
},
//
limit: propTypes.number.def(5),
// (MB)
fileSize: propTypes.number.def(5),
// , ['png', 'jpg', 'jpeg']
fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf']),
//
isShowTip: propTypes.bool.def(true),
onFinished: {
type: Function,
default: () => {}
}
});
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const emit = defineEmits(['update:modelValue']);
const number = ref(0);
const uploadList = ref<any[]>([]);
const baseUrl = import.meta.env.VITE_APP_BASE_API;
const uploadFileUrl = ref(baseUrl + '/amz/shipmentPlan/importData'); //
const headers = ref(globalHeaders());
const fileList = ref<any[]>([]);
const showTip = computed(() => props.isShowTip && (props.fileType || props.fileSize));
const fileUploadRef = ref<ElUploadInstance>();
watch(
() => props.modelValue,
async (val) => {
if (val) {
let temp = 1;
//
let list: any[] = [];
if (Array.isArray(val)) {
list = val;
} else {
const res = await listByIds(val);
list = res.data.map((oss) => {
return {
name: oss.originalName,
url: oss.url,
ossId: oss.ossId
};
});
}
//
fileList.value = list.map((item) => {
item = { name: item.name, url: item.url, ossId: item.ossId };
item.uid = item.uid || new Date().getTime() + temp++;
return item;
});
} else {
fileList.value = [];
return [];
}
},
{ deep: true, immediate: true }
);
//
const handleBeforeUpload = (file: any) => {
//
if (props.fileType.length) {
const fileName = file.name.split('.');
const fileExt = fileName[fileName.length - 1];
const isTypeOk = props.fileType.indexOf(fileExt) >= 0;
if (!isTypeOk) {
proxy?.$modal.msgError(`文件格式不正确, 请上传${props.fileType.join('/')}格式文件!`);
return false;
}
}
//
if (file.name.includes(',')) {
proxy?.$modal.msgError('文件名不正确,不能包含英文逗号!');
return false;
}
//
if (props.fileSize) {
const isLt = file.size / 1024 / 1024 < props.fileSize;
if (!isLt) {
proxy?.$modal.msgError(`上传文件大小不能超过 ${props.fileSize} MB!`);
return false;
}
}
proxy?.$modal.loading('正在上传文件,请稍候...');
number.value++;
return true;
};
//
const handleExceed = () => {
proxy?.$modal.msgError(`上传文件数量不能超过 ${props.limit} 个!`);
};
//
const handleUploadError = () => {
proxy?.$modal.msgError('上传文件失败');
number.value--;
if (number.value === 0) {
props.onFinished({
success: false,
fileList: fileList.value,
response: null
});
}
};
//
const handleUploadSuccess = (res: any, file: UploadFile) => {
if (res.code === 200) {
// uploadList.value.push({
// name: res.data.fileName,
// url: res.data.url,
// ossId: res.data.ossId
// });
// uploadedSuccessfully();
proxy?.$modal.msgSuccess('上传文件成功');
} else {
// number.value--;
// proxy?.$modal.closeLoading();
// proxy?.$modal.msgError(res.msg);
// fileUploadRef.value?.handleRemove(file);
// uploadedSuccessfully();
proxy?.$modal.msgError('上传文件失败');
}
proxy?.$modal.closeLoading();
number.value--;
if (number.value === 0) {
props.onFinished({
success: res.code === 200,
fileList: fileList.value,
response: res
});
}
};
//
const handleDelete = (index: number) => {
let ossId = fileList.value[index].ossId;
delOss(ossId);
fileList.value.splice(index, 1);
emit('update:modelValue', listToString(fileList.value));
};
//
const uploadedSuccessfully = () => {
if (number.value > 0 && uploadList.value.length === number.value) {
fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value);
uploadList.value = [];
number.value = 0;
emit('update:modelValue', listToString(fileList.value));
proxy?.$modal.closeLoading();
}
};
//
const getFileName = (name: string) => {
// url
if (name.lastIndexOf('/') > -1) {
return name.slice(name.lastIndexOf('/') + 1);
} else {
return name;
}
};
//
const listToString = (list: any[], separator?: string) => {
let strs = '';
separator = separator || ',';
list.forEach((item) => {
if (item.ossId) {
strs += item.ossId + separator;
}
});
return strs != '' ? strs.substring(0, strs.length - 1) : '';
};
</script>
<style scoped lang="scss">
.upload-file-uploader {
margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
border: 1px solid #e4e7ed;
line-height: 2;
margin-bottom: 10px;
position: relative;
}
.upload-file-list .ele-upload-list__item-content {
display: flex;
justify-content: space-between;
align-items: center;
color: inherit;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
}
</style>

View File

@ -25,8 +25,8 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
@ -61,8 +61,8 @@
>
<vxe-column type="checkbox" width="50" align="center" />
<vxe-column key="userId" title="用户编号" align="center" field="userId" />
<vxe-column key="userName" title="用户" align="center" field="userName" />
<vxe-column key="nickName" title="用户称" align="center" field="nickName" />
<vxe-column key="userName" title="用户登录名" align="center" field="userName" />
<vxe-column key="nickName" title="用户称" align="center" field="nickName" />
<vxe-column key="deptName" title="部门" align="center" field="deptName" />
<vxe-column key="phonenumber" title="手机号码" align="center" field="phonenumber" width="120" />
<vxe-column key="status" title="状态" align="center">

View File

@ -1,15 +1,17 @@
<template>
<section class="app-main">
<router-view v-slot="{ Component, route }">
<transition v-if="!route.meta.noCache" :enter-active-class="animante" mode="out-in">
<keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews">
<component :is="Component" v-if="!route.meta.link" :key="route.path" />
</keep-alive>
</transition>
<transition v-if="route.meta.noCache" :enter-active-class="animante" mode="out-in">
<component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" />
</transition>
</router-view>
<el-watermark :font="font" :content="userNick">
<router-view v-slot="{ Component, route }">
<transition v-if="!route.meta.noCache" :enter-active-class="animante" mode="out-in">
<keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews">
<component :is="Component" v-if="!route.meta.link" :key="route.path" />
</keep-alive>
</transition>
<transition v-if="route.meta.noCache" :enter-active-class="animante" mode="out-in">
<component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" />
</transition>
</router-view>
</el-watermark>
<iframe-toggle />
</section>
</template>
@ -17,12 +19,35 @@
<script setup name="AppMain" lang="ts">
import useSettingsStore from '@/store/modules/settings';
import useTagsViewStore from '@/store/modules/tagsView';
import useUserStore from '@/store/modules/user';
import IframeToggle from './IframeToggle/index.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute();
const tagsViewStore = useTagsViewStore();
const userStore = useUserStore();
const font = reactive({
color: 'rgba(0, 0, 0, .06)'
});
const currentUser = userStore.currentUser;
const userNick = computed(() => {
// if (roles.includes('superadmin')) {
// return '';
// } else if (roles.includes('wuliu')) {
// return '';
// } else if (roles.includes('yunying')) {
// return '';
// } else if (roles.includes('manager')) {
// return '';
// } else {
// return '';
// }
return currentUser.userName;
});
//
const animante = ref<string>('');
const animationEnable = ref(useSettingsStore().animationEnable);
@ -40,16 +65,16 @@ watch(
);
onMounted(() => {
addIframe()
})
addIframe();
});
watchEffect((route) => {
addIframe()
})
addIframe();
});
function addIframe() {
if (route.meta.link) {
useTagsViewStore().addIframeView(route)
useTagsViewStore().addIframeView(route);
}
}
</script>

View File

@ -24,8 +24,11 @@
</el-select>
<!-- <header-search id="header-search" class="right-menu-item" /> -->
<div class="pull-right mr-5">
<el-tag type="warning" class="role-name">{{ userNick }}</el-tag>
</div>
<div class="pull-right">
<el-tag type="warning" class="role-name">{{ roleNmae }}</el-tag>
<el-tag type="success" class="role-name">{{ roleNmae }}</el-tag>
</div>
<search-menu ref="searchMenuRef" />
<el-tooltip content="搜索" effect="dark" placement="bottom">
@ -111,6 +114,8 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userId = ref(userStore.userId);
const roles = userStore.roles;
const currentUser = userStore.currentUser;
const companyName = ref(undefined);
const tenantList = ref<TenantVO[]>([]);
//
@ -123,17 +128,33 @@ const searchMenuRef = ref<InstanceType<typeof SearchMenu>>();
console.log('roles', roles);
const roleNmae = computed(() => {
if (roles.includes('superadmin')) {
return '超级管理员';
} else if (roles.includes('wuliu')) {
return '物流商';
} else if (roles.includes('yunying')) {
return '运营';
} else if (roles.includes('manager')) {
return '管理员';
} else {
return '普通用户';
}
// if (roles.includes('superadmin')) {
// return '';
// } else if (roles.includes('wuliu')) {
// return '';
// } else if (roles.includes('yunying')) {
// return '';
// } else if (roles.includes('manager')) {
// return '';
// } else {
// return '';
// }
return currentUser.roles[0].roleName;
});
const userNick = computed(() => {
// if (roles.includes('superadmin')) {
// return '';
// } else if (roles.includes('wuliu')) {
// return '';
// } else if (roles.includes('yunying')) {
// return '';
// } else if (roles.includes('manager')) {
// return '';
// } else {
// return '';
// }
return currentUser.nickName;
});
const openSearchMenu = () => {
searchMenuRef.value?.openSearch();

View File

@ -31,15 +31,19 @@ import './permission';
// 国际化
import i18n from '@/lang/index';
// vxeTable
import VXETable from 'vxe-table';
import 'vxe-table/lib/style.css';
VXETable.config({
zIndex: 999999
});
// 修改 el-dialog 默认点击遮照为不关闭
import { ElDialog } from 'element-plus';
ElDialog.props.closeOnClickModal.default = false;
const app = createApp(App);
@ -51,6 +55,7 @@ app.use(store);
app.use(i18n);
app.use(VXETable);
app.use(plugins);
// 自定义指令
directive(app);

View File

@ -4,6 +4,7 @@ import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '
import { LoginData } from '@/api/types';
import defAva from '@/assets/images/profile.jpg';
import store from '@/store';
import { UserVO } from '@/api/system/user/types';
export const useUserStore = defineStore('user', () => {
const token = ref(getToken());
@ -14,6 +15,7 @@ export const useUserStore = defineStore('user', () => {
const avatar = ref('');
const roles = ref<Array<string>>([]); // 用户角色编码集合 → 判断路由权限
const permissions = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
const currentUser = ref<UserVO>(<UserVO>{});
/**
*
@ -41,7 +43,9 @@ export const useUserStore = defineStore('user', () => {
if (data.roles && data.roles.length > 0) {
// 验证返回的roles是否是一个非空数组
roles.value = data.roles;
console.log('非空数组roles', roles.value);
permissions.value = data.permissions;
} else {
roles.value = ['ROLE_DEFAULT'];
@ -51,6 +55,7 @@ export const useUserStore = defineStore('user', () => {
avatar.value = profile;
userId.value = user.userId;
tenantId.value = user.tenantId;
currentUser.value = user;
return Promise.resolve();
}
return Promise.reject(err);
@ -77,6 +82,7 @@ export const useUserStore = defineStore('user', () => {
avatar,
roles,
permissions,
currentUser,
login,
getInfo,
logout,
@ -85,6 +91,7 @@ export const useUserStore = defineStore('user', () => {
});
export default useUserStore;
// 非setup
export function useUserStoreHook() {
return useUserStore(store);

View File

@ -53,6 +53,7 @@ declare global {
/** 其他参数 */
[key: string]: any;
}
/**
*
*/
@ -80,7 +81,9 @@ declare global {
form: T;
queryParams: D;
rules: ElFormRules;
rules2?: ElFormRules;
}
/**
*
*/
@ -88,6 +91,7 @@ declare global {
pageNum: number;
pageSize: number;
}
declare interface LayoutSetting {
/**
*

View File

@ -2,8 +2,8 @@
<el-row>
<el-dialog v-model="visible" title="选择用户" width="800px" top="5vh" append-to-body>
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
@ -26,8 +26,8 @@
:header-cell-class-name="headerCellClassName"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="用户" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="用户登录名" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="status">

View File

@ -4,18 +4,18 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="询价单号" prop="inquiryNo">
<el-input v-model="queryParams.inquiryNo" placeholder="请输入询价单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发起人id" prop="requesterId">
<el-input v-model="queryParams.requesterId" placeholder="请输入发起人id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="询价单号" prop="inquiryNo">-->
<!-- <el-input v-model="queryParams.inquiryNo" placeholder="请输入询价单号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发起人id" prop="requesterId">-->
<!-- <el-input v-model="queryParams.requesterId" placeholder="请输入发起人id" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="目的地" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入目的地" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="运输方式" prop="transportChannel">
<el-input v-model="queryParams.transportChannel" placeholder="请输入运输方式" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="运输方式" prop="transportChannel">-->
<!-- <el-input v-model="queryParams.transportChannel" placeholder="请输入运输方式" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="报价截止时间" prop="deadline">
<el-date-picker
clearable
@ -25,30 +25,31 @@
placeholder="请选择报价截止时间"
/>
</el-form-item>
<el-form-item label="渠道ID" prop="channelId">
<el-input v-model="queryParams.channelId" placeholder="请输入渠道ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="渠道ID" prop="channelId">-->
<!-- <el-input v-model="queryParams.channelId" placeholder="请输入渠道ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="渠道名称" prop="channelName">
<el-input v-model="queryParams.channelName" placeholder="请输入渠道名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="报价有效的开始日期" prop="effectiveStartTime">
<el-date-picker
clearable
v-model="queryParams.effectiveStartTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择报价有效的开始日期"
/>
</el-form-item>
<el-form-item label="报价有效的结束日期" prop="effectiveEndTime">
<el-date-picker
clearable
v-model="queryParams.effectiveEndTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择报价有效的结束日期"
/>
<!-- <el-input v-model="queryParams.channelName" placeholder="请输入渠道名称" clearable @keyup.enter="handleQuery" />-->
<channel-cascader v-model="queryParams.channelId" @change="handleChannelChange" />
</el-form-item>
<!-- <el-form-item label="报价有效的开始日期" prop="effectiveStartTime">-->
<!-- <el-date-picker-->
<!-- clearable-->
<!-- v-model="queryParams.effectiveStartTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择报价有效的开始日期"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="报价有效的结束日期" prop="effectiveEndTime">-->
<!-- <el-date-picker-->
<!-- clearable-->
<!-- v-model="queryParams.effectiveEndTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择报价有效的结束日期"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -286,7 +287,10 @@
</el-select>
</el-form-item>
<el-form-item label="后端物流类型" prop="backLogisticsType">
<el-input v-model="quoteForm.backLogisticsType" placeholder="请输入后端物流类型" />
<!-- <el-input v-model="quoteForm.backLogisticsType" placeholder="请输入后端物流类型" />-->
<el-select v-model="quoteForm.backLogisticsType" clearable placeholder="请输入后端物流类型">
<el-option v-for="dict in back_logistics_type" :key="dict.value" :label="dict.label" :value="dict.label" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
@ -318,6 +322,8 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_shipping_method } = toRefs<any>(proxy?.useDict('biz_shipping_method'));
const { back_logistics_type } = toRefs<any>(proxy?.useDict('back_logistics_type'));
const inquiryRequestList = ref<InquiryRequestVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
@ -431,6 +437,12 @@ const options = ref([
}
]);
const handleChannelChange = ({ value, node }) => {
console.log('选中渠道ID:', value);
console.log('完整渠道信息:', node);
// 访 node.code
};
/** 查询物流询价列表 */
const getList = async () => {
loading.value = true;
@ -546,7 +558,7 @@ const submitQuoteForm = async () => {
quoteDialog.visible = false;
}
} else {
ElMessageBox.confirm('价格没有竞争力,问他是否需要修改价格?', '提示', {
ElMessageBox.confirm('价格没有竞争力,是否需要修改价格?', '提示', {
confirmButtonText: '确认提交',
cancelButtonText: '修改价格',
type: 'warning'

View File

@ -14,7 +14,8 @@
<el-input v-model="queryParams.logisticsProviderName" placeholder="请输入物流商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物流渠道" prop="logisticsChannel">
<el-input v-model="queryParams.logisticsChannel" placeholder="请输入物流渠道" clearable @keyup.enter="handleQuery" />
<!-- <el-input v-model="queryParams.logisticsChannel" placeholder="请输入物流渠道" clearable @keyup.enter="handleQuery" />-->
<channel-cascader v-model="selectedChannelId" @change="handleChannelChange" />
</el-form-item>
<el-form-item label="仓库名称" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入目的地仓库名称或编码" clearable @keyup.enter="handleQuery" />
@ -251,6 +252,14 @@ const orderData = ref({
order: ''
});
const selectedChannelId = ref('');
const handleChannelChange = ({ value, node }) => {
console.log('选中渠道ID:', value);
console.log('完整渠道信息:', node);
// 访 node.code
queryParams.value.channelName = node;
};
// -------
const hotSettings = ref({
licenseKey: 'non-commercial-and-evaluation',
@ -573,9 +582,11 @@ const data = reactive<PageData<LogisticsOrderForm, LogisticsOrderQuery>>({
logisticsChannel: undefined,
destination: undefined,
boxQuantity: undefined,
channelName: undefined,
shipmentQuantity: undefined,
amazonShelfDate: undefined,
shelfTimeliness: undefined,
channelId: undefined,
params: {}
},
queryDetailParams: {

View File

@ -0,0 +1,475 @@
<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="180px">
<el-form-item label="目的地" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入目的地" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="报价生效日期" prop="quoteDate">
<el-date-picker
v-model="queryParams.quoteDate"
type="daterange"
range-separator="到"
start-placeholder="开始日期"
end-placeholder="结束日期"
:size="'default'"
/>
</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-hasRoles="['superadmin']" v-hasPermi="['amz:logisticsQuote:add']"-->
<!-- >新增-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="success"-->
<!-- plain-->
<!-- icon="Edit"-->
<!-- :disabled="single"-->
<!-- @click="handleUpdate()"-->
<!-- v-hasRoles="['superadmin']"-->
<!-- v-hasPermi="['amz:logisticsQuote:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="danger"-->
<!-- plain-->
<!-- icon="Delete"-->
<!-- :disabled="multiple"-->
<!-- @click="handleDelete()"-->
<!-- v-hasRoles="['superadmin']"-->
<!-- v-hasPermi="['amz:logisticsQuote:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button type="primary" icon="Refresh" @click="handleQuery">刷新数据</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table :data="tableData" v-loading="loading">
<template #empty>
<span>没有相关数据</span>
</template>
<!-- 固定列 -->
<el-table-column prop="物流商名称" label="物流商名称" />
<!-- 动态多级表头 -->
<template v-for="col in dynamicColumns" :key="col.label">
<el-table-column v-if="col.children" :label="col.label" align="center">
<el-table-column v-for="child in col.children" :key="child.prop" :prop="child.prop" :label="child.label" sortable align="right">
<template #default="{ row }">
<span v-if="child.prop.endsWith('_报价')">
{{ row[child.prop] && row[child.prop] != 0 ? `${row[child.prop]}` : '-' }}
</span>
<span v-else-if="child.prop.endsWith('_时效')">
{{ row[child.prop] && row[child.prop] != 0 ? `${row[child.prop]}` : '-' }}
</span>
</template>
</el-table-column>
</el-table-column>
</template>
</el-table>
</el-card>
<!-- 添加或修改物流报价对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="logisticsQuoteFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主键ID" prop="id">
<el-input v-model="form.id" placeholder="请输入主键ID" />
</el-form-item>
<el-form-item label="物流商用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入物流商用户ID" />
</el-form-item>
<el-form-item label="目的地" prop="destination">
<el-input v-model="form.destination" placeholder="请输入目的地" />
</el-form-item>
<el-form-item label="渠道名称" prop="channelName">
<el-input v-model="form.channelName" placeholder="请输入渠道名称" />
</el-form-item>
<el-form-item label="基础价格" prop="price">
<el-input v-model="form.price" placeholder="请输入基础价格" />
</el-form-item>
<el-form-item label="时效" prop="leadTime">
<el-input v-model="form.leadTime" placeholder="请输入时效" />
</el-form-item>
<el-form-item label="附加费" prop="surcharge">
<el-input v-model="form.surcharge" placeholder="请输入附加费" />
</el-form-item>
<el-form-item label="报价生效日期" prop="quoteDate">
<el-date-picker clearable v-model="form.quoteDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择报价生效日期">
</el-date-picker>
</el-form-item>
<el-form-item label="报价备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入报价备注" />
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="LogisticsQuote" lang="ts">
import {
listLogisticsQuote,
getLogisticsQuote,
delLogisticsQuote,
addLogisticsQuote,
updateLogisticsQuote,
getTodayQuoteStatus,
queryLogisticsQuoteReport
} from '@/api/amz/logisticsQuote';
import { LogisticsQuoteVO, LogisticsQuoteQuery, LogisticsQuoteForm } from '@/api/amz/logisticsQuote/types';
import type { Column, TabsPaneContext } from 'element-plus';
import { useRoute } from 'vue-router';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { biz_channel_type } = toRefs<any>(proxy?.useDict('biz_channel_type'));
import { getConfigKey } from '@/api/system/config';
const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
const logisticsQuoteList = ref<LogisticsQuoteVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(false);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const logisticsQuoteFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: LogisticsQuoteForm = {
id: undefined,
userId: undefined,
destination: undefined,
channelName: undefined,
price: undefined,
leadTime: undefined,
surcharge: undefined,
quoteDate: undefined,
isSubmitted: undefined,
remark: undefined,
channelType: undefined,
channelId: undefined,
isDdp: undefined,
unit: undefined
};
const data = reactive<PageData<LogisticsQuoteForm, LogisticsQuoteQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
destination: undefined,
channelName: undefined,
price: undefined,
leadTime: undefined,
surcharge: undefined,
quoteDate: [new Date(), new Date()],
isSubmitted: undefined,
channelType: undefined,
channelId: undefined,
isDdp: undefined,
unit: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
userId: [{ required: true, message: '物流商用户ID不能为空', trigger: 'blur' }],
destination: [{ required: true, message: '目的地不能为空', trigger: 'blur' }],
channelName: [{ required: true, message: '渠道名称不能为空', trigger: 'blur' }],
price: [{ required: true, message: '基础价格不能为空', trigger: 'blur' }],
leadTime: [{ required: true, message: '时效不能为空', trigger: 'blur' }],
surcharge: [{ required: true, message: '附加费不能为空', trigger: 'blur' }],
quoteDate: [{ required: true, message: '报价生效日期不能为空', trigger: 'blur' }],
isSubmitted: [{ required: true, message: '提交状态不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '报价备注不能为空', trigger: 'blur' }],
channelType: [{ required: true, message: '渠道类型不能为空', trigger: 'change' }],
channelId: [{ required: true, message: '渠道ID不能为空', trigger: 'blur' }],
isDdp: [{ required: true, message: '是否双清包税不能为空', trigger: 'blur' }],
unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const tableData = ref([]);
const dynamicColumns = ref([]);
const queryData = ref<any>({
quoteStartDate: '',
destination: '',
quoteEndDate: ''
});
/** 查询物流报价列表 */
const getList = async () => {
loading.value = true;
console.log('queryData=' + queryData.value);
const res = await queryLogisticsQuoteReport(queryData.value);
console.log('res', res);
dynamicColumns.value = generateColumns(res.data);
console.log('dynamicColumns=', dynamicColumns.value);
tableData.value = res.data;
setTimeout(() => {
loading.value = false;
}, 500);
};
//
// const generateColumns = (data) => {
// const allKeys = data.reduce((acc, cur) => {
// Object.keys(cur).forEach((key) => {
// if (key !== '') acc.add(key);
// });
// return acc;
// }, new Set());
// return Array.from(allKeys);
// };
// const generateColumns = (data) => {
// //
// const allKeys = [...new Set(data.flatMap((item) => Object.keys(item).filter((k) => k !== '' && item[k] !== '')))];
//
// // _/_
// const baseNames = [...new Set(allKeys.map((key) => (key as string).replace(/_(|)$/, '')))];
//
// //
// const sortedChannels = baseNames
// .map((fullName) => {
// // "--UPS_"
// const parts = fullName.split('-');
// const country = parts[0];
// const method = parts[1];
// const channel = parts.slice(2).join('-').replace(/_$/, ''); // 线
// return { country, method, channel, fullName };
// })
// .sort((a, b) => {
// const countryOrder = ['', '', '']; //
// const methodOrder = ['', '', ''];
//
// const countryCompare = countryOrder.indexOf(a.country) - countryOrder.indexOf(b.country);
// const methodCompare = methodOrder.indexOf(a.method) - methodOrder.indexOf(b.method);
// const channelCompare = a.channel.localeCompare(b.channel);
//
// return countryCompare || methodCompare || channelCompare;
// });
//
// //
// const channelColumns = sortedChannels.flatMap(({ fullName }) => [`${fullName}_`, `${fullName}_`]);
//
// return ['', ...channelColumns, ...allKeys.filter((k) => !(k as string).includes('_') && !(k as string).includes('_'))];
// };
const generateColumns = (data) => {
// _/_
const dynamicFields = [...new Set(data.flatMap((item) => Object.keys(item).filter((k) => k.includes('_报价') || k.includes('_时效'))))];
console.log('dynamicFields=', dynamicFields);
//
const channelMap = dynamicFields.reduce((acc, field) => {
const [baseName, type] = (field as string).split(/(?=_报价|_时效)/);
const [country, method, ...channelParts] = baseName.split('-');
const channel = channelParts.join('-');
if (!acc[baseName]) {
acc[baseName] = {
country,
method,
channel,
children: []
};
}
acc[baseName].children.push({
prop: field,
label: type.replace('_', '') // 线
});
return acc;
}, {});
console.log('channelMap=', channelMap);
//
const sortedChannels = Object.values(channelMap).sort((a, b) => {
const countryOrder = ['美国', '英国', '日本'];
const methodOrder = ['空运', '海运', '陆运'];
const countryCompare = countryOrder.indexOf(a.country) - countryOrder.indexOf(b.country);
const methodCompare = methodOrder.indexOf(a.method) - methodOrder.indexOf(b.method);
return countryCompare || methodCompare || a.channel.localeCompare(b.channel);
});
//
return [
{ label: '物流商名称', prop: '物流商名称' },
...sortedChannels.map((channel) => ({
label: `${channel.country}-${channel.method}-${channel.channel}`,
children: channel.children.sort((a, b) => a.label.localeCompare(b.label)) //
}))
];
};
const checkStatus = async () => {
const res2 = await getTodayQuoteStatus();
console.log(res2);
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
logisticsQuoteFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
console.log('handleQuery', queryParams.value.quoteDate);
if (queryParams.value.quoteDate) {
queryData.value = {
quoteStartDate: queryParams.value.quoteDate[0],
destination: queryParams.value.destination,
quoteEndDate: queryParams.value.quoteDate[1]
};
} else {
queryData.value = {
quoteStartDate: '',
destination: queryParams.value.destination,
quoteEndDate: ''
};
}
queryParams.value.pageNum = 1;
getList();
setTimeout(() => {
loading.value = false;
}, 500);
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: LogisticsQuoteVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加物流报价';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: LogisticsQuoteVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getLogisticsQuote(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改物流报价';
};
/** 提交按钮 */
const submitForm = () => {
logisticsQuoteFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateLogisticsQuote(form.value).finally(() => (buttonLoading.value = false));
} else {
await addLogisticsQuote(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: LogisticsQuoteVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除物流报价编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delLogisticsQuote(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/logisticsQuote/export',
{
...queryParams.value
},
`logisticsQuote_${new Date().getTime()}.xlsx`
);
};
const activeName = ref('first');
const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event);
};
onMounted(() => {
// if (res) {
// queryParams.value.destination = res;
// }
// getList();
});
onUpdated(() => {
const route = useRoute();
console.log('res333=', route.query);
console.log('res333=', route.query.destination);
if (route.query.destination) {
queryParams.value.destination = route.query.destination as string;
}
});
</script>

View File

@ -0,0 +1,898 @@
<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">
<!-- <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="customOrderSn">-->
<!-- <el-input v-model="queryParams.customOrderSn" placeholder="请输入自定义单号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商ID" prop="supplierId">-->
<!-- <el-input v-model="queryParams.supplierId" placeholder="请输入供应商ID" 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="采购员ID" prop="optUid">-->
<!-- <el-input v-model="queryParams.optUid" placeholder="请输入采购员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人姓名" prop="auditorRealname">-->
<!-- <el-input v-model="queryParams.auditorRealname" placeholder="请输入审核人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="操作人姓名" prop="optRealname">-->
<!-- <el-input v-model="queryParams.optRealname" placeholder="请输入操作人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人姓名" prop="lastRealname">-->
<!-- <el-input v-model="queryParams.lastRealname" placeholder="请输入最后操作人姓名" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="下单时间" prop="orderTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.orderTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择下单时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="应付货款" prop="payment">-->
<!-- <el-input v-model="queryParams.payment" placeholder="请输入应付货款" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人员ID" prop="auditorUid">-->
<!-- <el-input v-model="queryParams.auditorUid" placeholder="请输入审核人员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核时间" prop="auditorTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.auditorTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择审核时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人员ID" prop="lastUid">-->
<!-- <el-input v-model="queryParams.lastUid" placeholder="请输入最后操作人员ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作时间" prop="lastTime">-->
<!-- <el-date-picker clearable-->
<!-- v-model="queryParams.lastTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="请选择最后操作时间"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="作废原因" prop="reason">-->
<!-- <el-input v-model="queryParams.reason" placeholder="请输入作废原因" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="是否含税0 否1 是" prop="isTax">-->
<!-- <el-input v-model="queryParams.isTax" placeholder="请输入是否含税0 否1 是" clearable @keyup.enter="handleQuery" />-->
<!-- </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="payStatusText">-->
<!-- <el-input v-model="queryParams.payStatusText" placeholder="请输入支付状态说明" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态1 未到货, 2 部分到货, 3 全部到货" prop="statusShipped">-->
<!-- <el-input v-model="queryParams.statusShipped" placeholder="请输入到货状态1 未到货, 2 部分到货, 3 全部到货" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态说明" prop="statusShippedText">-->
<!-- <el-input v-model="queryParams.statusShippedText" placeholder="请输入到货状态说明" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="货物总价" prop="amountTotal">-->
<!-- <el-input v-model="queryParams.amountTotal" placeholder="请输入货物总价" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="总金额" prop="totalPrice">-->
<!-- <el-input v-model="queryParams.totalPrice" placeholder="请输入总金额" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="币种符号" prop="icon">-->
<!-- <el-input v-model="queryParams.icon" placeholder="请输入币种符号" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用" prop="otherFee">-->
<!-- <el-input v-model="queryParams.otherFee" placeholder="请输入其他费用" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用币种" prop="otherCurrency">-->
<!-- <el-input v-model="queryParams.otherCurrency" placeholder="请输入其他费用币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费" prop="shippingPrice">-->
<!-- <el-input v-model="queryParams.shippingPrice" placeholder="请输入运费" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费币种" prop="shippingCurrency">-->
<!-- <el-input v-model="queryParams.shippingCurrency" placeholder="请输入运费币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购币种" prop="purchaseCurrency">-->
<!-- <el-input v-model="queryParams.purchaseCurrency" placeholder="请输入采购币种" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购汇率" prop="purchaseRate">-->
<!-- <el-input v-model="queryParams.purchaseRate" placeholder="请输入采购汇率" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购总量" prop="quantityTotal">-->
<!-- <el-input v-model="queryParams.quantityTotal" placeholder="请输入采购总量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库ID" prop="wid">-->
<!-- <el-input v-model="queryParams.wid" placeholder="请输入仓库ID" 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="wareHouseBakName">-->
<!-- <el-input v-model="queryParams.wareHouseBakName" placeholder="请输入仓库名(备份)" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="入库量" prop="quantityEntry">-->
<!-- <el-input v-model="queryParams.quantityEntry" placeholder="请输入入库量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="实际采购量" prop="quantityReal">-->
<!-- <el-input v-model="queryParams.quantityReal" placeholder="请输入实际采购量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="待到货量" prop="quantityReceive">-->
<!-- <el-input v-model="queryParams.quantityReceive" placeholder="请输入待到货量" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购方ID" prop="purchaserId">-->
<!-- <el-input v-model="queryParams.purchaserId" placeholder="请输入采购方ID" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系人" prop="contactPerson">-->
<!-- <el-input v-model="queryParams.contactPerson" placeholder="请输入联系人" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系方式" prop="contactNumber">-->
<!-- <el-input v-model="queryParams.contactNumber" placeholder="请输入联系方式" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算方式7 现结, 8 月结" prop="settlementMethod">-->
<!-- <el-input v-model="queryParams.settlementMethod" placeholder="请输入结算方式7 现结, 8 月结" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算描述" prop="settlementDescription">-->
<!-- <el-input v-model="queryParams.settlementDescription" placeholder="请输入结算描述" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="支付方式" prop="paymentMethod">-->
<!-- <el-input v-model="queryParams.paymentMethod" placeholder="请输入支付方式" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="交货天数" prop="estDlvDays">
<el-input v-model="queryParams.estDlvDays" placeholder="请输入交货天数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="订单状态" prop="orderStatus">-->
<!-- <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>-->
<!-- <el-option v-for="dict in vendor_order_status" :key="dict.value" :label="dict.label" :value="dict.value" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker clearable v-model="queryParams.deliveryTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择交货时间" />
</el-form-item>
<el-form-item label="订单交付变动天数" prop="dlvTimeVar">
<el-input v-model="queryParams.dlvTimeVar" 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:purchaseOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="purchaseOrderList" @selection-change="handleSelectionChange">
<el-table-column type="expand">
<template #default="props">
<el-card shadow="never">
<!-- <template #header>-->
<!-- <div class="card-header">-->
<!-- <span>产品明细</span>-->
<!-- </div>-->
<!-- </template>-->
<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="仓库ID" align="center" prop="wid" />-->
<el-table-column label="仓库名称" align="center" prop="wareHouseName" />
<!-- <el-table-column label="采购计划号" align="center" prop="planSn" />-->
<!-- <el-table-column label="本地产品ID" align="center" prop="productId" />-->
<el-table-column label="品名" align="center" prop="productName" />
<!-- <el-table-column label="SKU" align="center" prop="sku" width="200px" />-->
<!-- <el-table-column label="FNSKU" align="center" prop="fnsku" width="90px" />-->
<!-- <el-table-column label="店铺ID" align="center" prop="sid" width="70px" />-->
<!-- <el-table-column label="型号" align="center" prop="model" />-->
<!-- <el-table-column label="含税单价" align="center" prop="price" />-->
<!-- <el-table-column label="价税合计" align="center" prop="amount" />-->
<!-- <el-table-column label="计划采购量" align="center" prop="quantityPlan" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" width="110px" />
<!-- <el-table-column label="到货入库量" align="center" prop="quantityEntry" />-->
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="退货数" align="center" prop="quantityReturn" />-->
<!-- <el-table-column label="换货量" align="center" prop="quantityExchange" />-->
<!-- <el-table-column label="质检量" align="center" prop="quantityQc" />-->
<!-- <el-table-column label="待质检量" align="center" prop="quantityQcPrepare" />-->
<!-- <el-table-column label="期待到货时间" align="center" prop="expectArriveTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.expectArriveTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="备注" align="center" prop="remark" />
<!-- <el-table-column label="箱数" align="center" prop="casesNum" />-->
<!-- <el-table-column label="单箱数量" align="center" prop="quantityPerCase" />-->
<!-- <el-table-column label="是否删除0 否1 是" align="center" prop="isDelete" />-->
<!-- <el-table-column label="税率" align="center" prop="taxRate" />-->
<!-- <el-table-column label="SPU" align="center" prop="spu" />-->
<!-- <el-table-column label="款名" align="center" prop="spuName" />-->
</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="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" />
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="应付货款" align="center" prop="payment" />-->
<!-- <el-table-column label="审核人员ID" align="center" prop="auditorUid" />-->
<!-- <el-table-column label="审核时间" align="center" prop="auditorTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.auditorTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="最后操作人员ID" align="center" prop="lastUid" />-->
<!-- <el-table-column label="最后操作时间" align="center" prop="lastTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="作废原因" align="center" prop="reason" />-->
<!-- <el-table-column label="是否含税" align="center" prop="isTax" />-->
<!-- <el-table-column label="采购单状态" align="center" prop="status" />-->
<!-- <el-table-column label="状态说明" align="center" prop="statusText" />-->
<!-- <el-table-column label="支付状态说明" align="center" prop="payStatusText" />-->
<!-- <el-table-column label="到货状态" align="center" prop="statusShipped" />-->
<!-- <el-table-column label="到货状态说明" align="center" prop="statusShippedText" />-->
<!-- <el-table-column label="货物总价" align="center" prop="amountTotal" />-->
<!-- <el-table-column label="总金额" align="center" prop="totalPrice" />-->
<!-- <el-table-column label="币种符号" align="center" prop="icon" />-->
<!-- <el-table-column label="付款状态" align="center" prop="payStatus" />-->
<!-- <el-table-column label="其他费用" align="center" prop="otherFee" />-->
<!-- <el-table-column label="其他费用币种" align="center" prop="otherCurrency" />-->
<!-- <el-table-column label="费用分摊方式" align="center" prop="feePartType" />-->
<!-- <el-table-column label="运费" align="center" prop="shippingPrice" />-->
<!-- <el-table-column label="运费币种" align="center" prop="shippingCurrency" />-->
<!-- <el-table-column label="采购币种" align="center" prop="purchaseCurrency" />-->
<!-- <el-table-column label="采购汇率" align="center" prop="purchaseRate" />-->
<!-- <el-table-column label="采购总量" align="center" prop="quantityTotal" />-->
<!-- <el-table-column label="仓库ID" align="center" prop="wid" />-->
<!-- <el-table-column label="仓库名称" align="center" prop="wareHouseName" />-->
<!-- <el-table-column label="仓库名(备份)" align="center" prop="wareHouseBakName" />-->
<!-- <el-table-column label="入库量" align="center" prop="quantityEntry" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="采购方ID" align="center" prop="purchaserId" />-->
<!-- <el-table-column label="联系人" align="center" prop="contactPerson" />-->
<!-- <el-table-column label="联系方式" align="center" prop="contactNumber" />-->
<!-- <el-table-column label="结算方式" align="center" prop="settlementMethod" />-->
<!-- <el-table-column label="结算描述" align="center" prop="settlementDescription" />-->
<!-- <el-table-column label="支付方式" align="center" prop="paymentMethod" />-->
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<el-table-column label="订单状态" align="center" prop="orderStatus">
<template #default="scope">
<dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />
</template>
</el-table-column>
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />
<el-table-column label="备注" align="center" prop="remark" />
<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:purchaseOrder:edit']"></el-button>-->
<!-- </el-tooltip>-->
<el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']"> 确认 </el-button>
</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="500px" append-to-body>
<el-form ref="purchaseOrderFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<!-- <el-form-item label="自定义单号" prop="customOrderSn">-->
<!-- <el-input v-model="form.customOrderSn" placeholder="请输入自定义单号" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商ID" prop="supplierId">-->
<!-- <el-input v-model="form.supplierId" placeholder="请输入供应商ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="供应商名称" prop="supplierName">-->
<!-- <el-input v-model="form.supplierName" placeholder="请输入供应商名称" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购员ID" prop="optUid">-->
<!-- <el-input v-model="form.optUid" placeholder="请输入采购员ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人姓名" prop="auditorRealname">-->
<!-- <el-input v-model="form.auditorRealname" placeholder="请输入审核人姓名" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="操作人姓名" prop="optRealname">-->
<!-- <el-input v-model="form.optRealname" placeholder="请输入操作人姓名" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人姓名" prop="lastRealname">-->
<!-- <el-input v-model="form.lastRealname" placeholder="请输入最后操作人姓名" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="下单时间" prop="orderTime">-->
<!-- <el-date-picker clearable v-model="form.orderTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择下单时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="应付货款" prop="payment">-->
<!-- <el-input v-model="form.payment" placeholder="请输入应付货款" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核人员ID" prop="auditorUid">-->
<!-- <el-input v-model="form.auditorUid" placeholder="请输入审核人员ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审核时间" prop="auditorTime">-->
<!-- <el-date-picker clearable v-model="form.auditorTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择审核时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作人员ID" prop="lastUid">-->
<!-- <el-input v-model="form.lastUid" placeholder="请输入最后操作人员ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="最后操作时间" prop="lastTime">-->
<!-- <el-date-picker clearable v-model="form.lastTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择最后操作时间">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="作废原因" prop="reason">-->
<!-- <el-input v-model="form.reason" type="textarea" placeholder="请输入内容" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="是否含税" prop="isTax">-->
<!-- <el-input v-model="form.isTax" placeholder="请输入是否含税0 否1 是" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="状态说明" prop="statusText">-->
<!-- <el-input v-model="form.statusText" placeholder="请输入状态说明" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="支付状态说明" prop="payStatusText">-->
<!-- <el-input v-model="form.payStatusText" placeholder="请输入支付状态说明" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态" prop="statusShipped">-->
<!-- <el-input v-model="form.statusShipped" placeholder="请输入到货状态1 未到货, 2 部分到货, 3 全部到货" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="到货状态说明" prop="statusShippedText">-->
<!-- <el-input v-model="form.statusShippedText" placeholder="请输入到货状态说明" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="货物总价" prop="amountTotal">-->
<!-- <el-input v-model="form.amountTotal" placeholder="请输入货物总价" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="总金额" prop="totalPrice">-->
<!-- <el-input v-model="form.totalPrice" placeholder="请输入总金额" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="币种符号" prop="icon">-->
<!-- <el-input v-model="form.icon" placeholder="请输入币种符号" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用" prop="otherFee">-->
<!-- <el-input v-model="form.otherFee" placeholder="请输入其他费用" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="其他费用币种" prop="otherCurrency">-->
<!-- <el-input v-model="form.otherCurrency" placeholder="请输入其他费用币种" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费" prop="shippingPrice">-->
<!-- <el-input v-model="form.shippingPrice" placeholder="请输入运费" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="运费币种" prop="shippingCurrency">-->
<!-- <el-input v-model="form.shippingCurrency" placeholder="请输入运费币种" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购币种" prop="purchaseCurrency">-->
<!-- <el-input v-model="form.purchaseCurrency" placeholder="请输入采购币种" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购汇率" prop="purchaseRate">-->
<!-- <el-input v-model="form.purchaseRate" placeholder="请输入采购汇率" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购总量" prop="quantityTotal">-->
<!-- <el-input v-model="form.quantityTotal" placeholder="请输入采购总量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库ID" prop="wid">-->
<!-- <el-input v-model="form.wid" placeholder="请输入仓库ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库名称" prop="wareHouseName">-->
<!-- <el-input v-model="form.wareHouseName" placeholder="请输入仓库名称" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="仓库名(备份)" prop="wareHouseBakName">-->
<!-- <el-input v-model="form.wareHouseBakName" placeholder="请输入仓库名(备份)" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="入库量" prop="quantityEntry">-->
<!-- <el-input v-model="form.quantityEntry" placeholder="请输入入库量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="实际采购量" prop="quantityReal">-->
<!-- <el-input v-model="form.quantityReal" placeholder="请输入实际采购量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="待到货量" prop="quantityReceive">-->
<!-- <el-input v-model="form.quantityReceive" placeholder="请输入待到货量" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="采购方ID" prop="purchaserId">-->
<!-- <el-input v-model="form.purchaserId" placeholder="请输入采购方ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系人" prop="contactPerson">-->
<!-- <el-input v-model="form.contactPerson" placeholder="请输入联系人" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="联系方式" prop="contactNumber">-->
<!-- <el-input v-model="form.contactNumber" placeholder="请输入联系方式" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算方式" prop="settlementMethod">-->
<!-- <el-input v-model="form.settlementMethod" placeholder="请输入结算方式7 现结, 8 月结" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="结算描述" prop="settlementDescription">-->
<!-- <el-input v-model="form.settlementDescription" type="textarea" placeholder="请输入内容" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="支付方式" prop="paymentMethod">-->
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入支付方式" />-->
<!-- </el-form-item>-->
<el-form-item label="订单状态" prop="orderStatus">
<el-select v-model="form.orderStatus" placeholder="请选择订单状态" disabled>
<el-option v-for="dict in vendor_order_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="交货时间" prop="deliveryTime">
<el-date-picker
clearable
v-model="form.deliveryTime"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择交货时间"
disabled
>
</el-date-picker>
</el-form-item>
<el-form-item label="交货天数" prop="estDlvDays">
<!-- <el-input v-model="form.estDlvDays" placeholder="请输入交货天数" />-->
<el-input-number v-model="form.estDlvDays" :min="0" :max="100" @change="delevAction()">
<template #suffix>
<span></span>
</template>
</el-input-number>
</el-form-item>
<el-form-item label="订单交付变动天数" prop="dlvTimeVar">
<el-input v-model="form.dlvTimeVar" placeholder="请输入订单交付变动天数" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确认订单</el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="PurchaseOrder" lang="ts">
import { listPurchaseOrder, getPurchaseOrder, delPurchaseOrder, addPurchaseOrder, updatePurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO, PurchaseOrderQuery, PurchaseOrderForm } from '@/api/amz/purchaseOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { vendor_order_status } = toRefs<any>(proxy?.useDict('vendor_order_status'));
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
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 queryFormRef = ref<ElFormInstance>();
const purchaseOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PurchaseOrderForm = {
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
remark: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: undefined,
deliveryTime: undefined,
dlvTimeVar: undefined
};
const data = reactive<PageData<PurchaseOrderForm, PurchaseOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: 'ord_unconfirmed',
deliveryTime: undefined,
dlvTimeVar: undefined,
params: {}
},
rules: {
// orderSn: [{ required: true, message: '', trigger: 'blur' }],
// customOrderSn: [{ required: true, message: '', trigger: 'blur' }],
// supplierId: [{ required: true, message: 'ID', trigger: 'blur' }],
// supplierName: [{ required: true, message: '', trigger: 'blur' }],
// optUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// auditorRealname: [{ required: true, message: '', trigger: 'blur' }],
// optRealname: [{ required: true, message: '', trigger: 'blur' }],
// lastRealname: [{ required: true, message: '', trigger: 'blur' }],
// orderTime: [{ required: true, message: '', trigger: 'blur' }],
// payment: [{ required: true, message: '', trigger: 'blur' }],
// auditorUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// auditorTime: [{ required: true, message: '', trigger: 'blur' }],
// lastUid: [{ required: true, message: 'ID', trigger: 'blur' }],
// lastTime: [{ required: true, message: '', trigger: 'blur' }],
// reason: [{ required: true, message: '', trigger: 'blur' }],
// isTax: [{ required: true, message: '0 1 ', trigger: 'blur' }],
// status: [
// {
// required: true,
// message: '-1 , 3 , 1 , 2 , 9 , 121 , 122 , 124 ',
// trigger: 'change'
// }
// ],
// statusText: [{ required: true, message: '', trigger: 'blur' }],
// payStatusText: [{ required: true, message: '', trigger: 'blur' }],
// statusShipped: [{ required: true, message: '1 , 2 , 3 ', trigger: 'blur' }],
// statusShippedText: [{ required: true, message: '', trigger: 'blur' }],
// amountTotal: [{ required: true, message: '', trigger: 'blur' }],
// totalPrice: [{ required: true, message: '', trigger: 'blur' }],
// icon: [{ required: true, message: '', trigger: 'blur' }],
// payStatus: [
// {
// required: true,
// message: '0 , 1 , 2 , 3 ',
// trigger: 'change'
// }
// ],
// remark: [{ required: true, message: '', trigger: 'blur' }],
// otherFee: [{ required: true, message: '', trigger: 'blur' }],
// otherCurrency: [{ required: true, message: '', trigger: 'blur' }],
// feePartType: [{ required: true, message: '0 , 1 , 2 ', trigger: 'change' }],
// shippingPrice: [{ required: true, message: '', trigger: 'blur' }],
// shippingCurrency: [{ required: true, message: '', trigger: 'blur' }],
// purchaseCurrency: [{ required: true, message: '', trigger: 'blur' }],
// purchaseRate: [{ required: true, message: '', trigger: 'blur' }],
// quantityTotal: [{ required: true, message: '', trigger: 'blur' }],
// wid: [{ required: true, message: 'ID', trigger: 'blur' }],
// wareHouseName: [{ required: true, message: '', trigger: 'blur' }],
// wareHouseBakName: [{ required: true, message: '()', trigger: 'blur' }],
// quantityEntry: [{ required: true, message: '', trigger: 'blur' }],
// quantityReal: [{ required: true, message: '', trigger: 'blur' }],
// quantityReceive: [{ required: true, message: '', trigger: 'blur' }],
// purchaserId: [{ required: true, message: 'ID', trigger: 'blur' }],
// contactPerson: [{ required: true, message: '', trigger: 'blur' }],
// contactNumber: [{ required: true, message: '', trigger: 'blur' }],
// settlementMethod: [{ required: true, message: '7 , 8 ', trigger: 'blur' }],
// settlementDescription: [{ required: true, message: '', trigger: 'blur' }],
// paymentMethod: [{ required: true, message: '', trigger: 'blur' }],
// dlvTimeVar: [{ required: true, message: '', trigger: 'blur' }]
// deliveryTime: [{ required: true, message: '', trigger: 'blur' }],
estDlvDays: [{ required: true, message: '交货天数不能为空', trigger: 'blur' }],
orderStatus: [{ required: true, message: '订单状态不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询采购单主列表 */
const getList = async () => {
loading.value = true;
const res = await listPurchaseOrder(queryParams.value);
purchaseOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
purchaseOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
const delevAction = () => {
form.value.deliveryTime = getDateAfterTwoDays(form.value.estDlvDays);
console.log('form.value', form.value.deliveryTime);
};
const getDateAfterTwoDays = (dayNum: number): string => {
const date = new Date(); //
date.setDate(date.getDate() + dayNum); // 2
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: PurchaseOrderVO[]) => {
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 handleUpdate = async (row?: PurchaseOrderVO) => {
reset();
const _orderSn = row?.orderSn || ids.value[0];
const res = await getPurchaseOrder(_orderSn);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改采购单主';
};
const handleConfirm = async (row?: PurchaseOrderVO) => {
// reset();
// const _orderSn = row?.orderSn || ids.value[0];
// const res = await getPurchaseOrder(_orderSn);
// Object.assign(form.value, res.data);
// dialog.visible = true;
// dialog.title = '';
console.log('row', row);
reset();
const _orderSn = row?.orderSn || ids.value[0];
const res = await getPurchaseOrder(_orderSn);
Object.assign(form.value, res.data);
form.value.orderStatus = 'ord_confirmed';
dialog.visible = true;
dialog.title = '确认订单';
};
/** 提交按钮 */
const submitForm = () => {
form.value.deliveryTime = getDateAfterTwoDays(form.value.estDlvDays);
purchaseOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.orderSn) {
await updatePurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addPurchaseOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: PurchaseOrderVO) => {
const _orderSns = row?.orderSn || ids.value;
await proxy?.$modal.confirm('是否确认删除采购单主编号为"' + _orderSns + '"的数据项?').finally(() => (loading.value = false));
await delPurchaseOrder(_orderSns);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/purchaseOrder/export',
{
...queryParams.value
},
`purchaseOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>
<style scoped>
/* 展开行容器 */
:deep(.el-table__expanded-cell) {
background: #ebf3ff !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: #ebf3ff !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: #d3e3ff !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>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,380 @@
<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="120px">
<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="sendDate">
<el-date-picker clearable v-model="queryParams.sendDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货日期" />
</el-form-item>
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺" 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="发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="queryParams.quantityPerBox" placeholder="请输入单箱产品数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="queryParams.boxCount" placeholder="请输入箱数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="箱子尺寸" prop="boxDimensions">-->
<!-- <el-input v-model="queryParams.boxDimensions" placeholder="请输入箱子尺寸" clearable @keyup.enter="handleQuery" />-->
<!-- </el-form-item>-->
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="queryParams.weightPerBox" placeholder="请输入单箱重量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="queryParams.sendStatus" placeholder="请选择发货状态" clearable>
<el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</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:sendOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<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="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" />
<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">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>
</el-tooltip>
<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>
<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="500px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" 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-input v-model="form.orderSn" placeholder="请输入采购单号" @blur="blurAction" />
</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-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入箱数" />
</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="form.weightPerBox" placeholder="请输入单箱重量" />
</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>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
import { getPurchaseOrder } from '@/api/amz/purchaseOrder';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const sendOrderList = ref<SendOrderVO[]>([]);
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 plength = ref<string | number>();
const pheight = ref<string | number>();
const pwidth = ref<string | number>();
const queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: SendOrderForm = {
id: undefined,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined
};
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
params: {}
},
rules: {
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' }],
quantityPerBox: [{ required: true, message: '单箱产品数量不能为空', trigger: 'blur' }],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
boxDimensions: [
{
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' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询供应商创建的发货单列表 */
const getList = async () => {
loading.value = true;
const res = await listSendOrder(queryParams.value);
sendOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
sendOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
const blurAction = async () => {
if (!isPOFormat(form.value.orderSn)) {
return;
}
// const res = await getPurchaseOrder(form.value.orderSn);
// Object.assign(form.value, res.data);
// form.value.quantitySend = res.data.quantityReal;
// console.log('res', res);
};
const isPOFormat = (input: string): boolean => {
const poRegex = /^PO\d+$/;
return poRegex.test(input);
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: SendOrderVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加供应商创建的发货单';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: SendOrderVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改供应商创建的发货单';
};
/** 提交按钮 */
const submitForm = () => {
form.value.boxDimensions = `${pwidth.value} x ${pheight.value} x ${plength.value}`;
sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateSendOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addSendOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: SendOrderVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商创建的发货单编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delSendOrder(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/sendOrder/export',
{
...queryParams.value
},
`sendOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,333 @@
<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="120px">
<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="sendDate">
<el-date-picker clearable v-model="queryParams.sendDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货日期" />
</el-form-item>
<el-form-item label="采购店铺" prop="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺" 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="发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="queryParams.quantityPerBox" placeholder="请输入单箱产品数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="queryParams.boxCount" placeholder="请输入箱数" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="箱子尺寸" prop="boxDimensions">
<el-input v-model="queryParams.boxDimensions" placeholder="请输入箱子尺寸" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="queryParams.weightPerBox" placeholder="请输入单箱重量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="实际采购店铺" prop="realStoreName">
<el-input v-model="queryParams.realStoreName" placeholder="请输入实际采购店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货状态" prop="sendStatus">
<el-select v-model="queryParams.sendStatus" placeholder="请选择发货状态" clearable>
<el-option v-for="dict in send_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</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:sendOrder:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:sendOrder:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:sendOrder:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:sendOrder:export']"> 导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="sendOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="主键ID" align="center" prop="id" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<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="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" />
<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">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:sendOrder:edit']"></el-button>
</el-tooltip>
<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>
<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="500px" append-to-body>
<el-form ref="sendOrderFormRef" :model="form" :rules="rules" 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-input v-model="form.orderSn" placeholder="请输入采购单号" />
</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-input v-model="form.productName" placeholder="请输入产品名称" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入发货数量" />
</el-form-item>
<el-form-item label="单箱产品数量" prop="quantityPerBox">
<el-input v-model="form.quantityPerBox" placeholder="请输入单箱产品数量" />
</el-form-item>
<el-form-item label="箱数" prop="boxCount">
<el-input v-model="form.boxCount" placeholder="请输入箱数" />
</el-form-item>
<el-form-item label="箱子尺寸" prop="boxDimensions">
<el-input v-model="form.boxDimensions" placeholder="请输入箱子尺寸" />
</el-form-item>
<el-form-item label="单箱重量" prop="weightPerBox">
<el-input v-model="form.weightPerBox" placeholder="请输入单箱重量" />
</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>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="SendOrder" lang="ts">
import { listSendOrder, getSendOrder, delSendOrder, addSendOrder, updateSendOrder } from '@/api/amz/sendOrder';
import { SendOrderVO, SendOrderQuery, SendOrderForm } from '@/api/amz/sendOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { send_status } = toRefs<any>(proxy?.useDict('send_status'));
const sendOrderList = ref<SendOrderVO[]>([]);
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 queryFormRef = ref<ElFormInstance>();
const sendOrderFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: SendOrderForm = {
id: undefined,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined
};
const data = reactive<PageData<SendOrderForm, SendOrderQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
sendDate: undefined,
storeName: undefined,
productName: undefined,
quantitySend: undefined,
quantityPerBox: undefined,
boxCount: undefined,
boxDimensions: undefined,
weightPerBox: undefined,
realStoreName: undefined,
sendStatus: undefined,
params: {}
},
rules: {
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' }],
quantityPerBox: [{ required: true, message: '单箱产品数量不能为空', trigger: 'blur' }],
boxCount: [{ required: true, message: '箱数不能为空', trigger: 'blur' }],
boxDimensions: [{ required: true, message: '箱子尺寸不能为空', trigger: 'blur' }],
weightPerBox: [{ required: true, message: '单箱重量不能为空', trigger: 'blur' }],
realStoreName: [{ required: true, message: '实际采购店铺不能为空', trigger: 'blur' }],
sendStatus: [{ required: true, message: '发货状态不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询供应商创建的发货单列表 */
const getList = async () => {
loading.value = true;
const res = await listSendOrder(queryParams.value);
sendOrderList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
sendOrderFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: SendOrderVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加供应商创建的发货单';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: SendOrderVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getSendOrder(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改供应商创建的发货单';
};
/** 提交按钮 */
const submitForm = () => {
sendOrderFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateSendOrder(form.value).finally(() => (buttonLoading.value = false));
} else {
await addSendOrder(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: SendOrderVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除供应商创建的发货单编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delSendOrder(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/sendOrder/export',
{
...queryParams.value
},
`sendOrder_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,593 @@
<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="100px">
<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="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" 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="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</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:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<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>
</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>
<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="800px" append-to-body>
<el-form ref="shipForwardFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" />
</el-form-item>
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入采购店铺名称" />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="form.sku" placeholder="请输入产品唯一标识码" />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品全称" />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="form.outSupplierName" placeholder="请输入发货供应商名称" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="form.outSupplierId" placeholder="请输入发货供应商系统ID" />
</el-form-item>
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="form.inSupplierName" placeholder="请输入收货供应商名称" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="form.inSupplierId" placeholder="请输入收货供应商系统ID" />
</el-form-item>
<el-form-item label="发货区间" prop="shipmentStart">
<el-date-picker
v-model="intervalDate"
type="daterange"
range-separator="到"
start-placeholder="开始日期"
end-placeholder="结束日期"
:size="'small'"
@change="intervalAction"
/>
</el-form-item>
<el-form-item label="跟单人" prop="trackerName">
<el-input v-model="form.trackerName" placeholder="请输入跟单人" />
</el-form-item>
<el-form-item label="跟单id" prop="trackerId">
<el-input v-model="form.trackerId" placeholder="请输入跟单id" />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间">
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="orderDialog.title" v-model="orderDialog.visible" width="1500px" append-to-body>
<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:purchaseOrder:add']"> 新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getOrderList"></right-toolbar>-->
<!-- </el-row>-->
<!-- </template>-->
<el-table v-loading="orderLoading" :data="purchaseOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" />
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="应付货款" align="center" prop="payment" />-->
<!-- <el-table-column label="审核人员ID" align="center" prop="auditorUid" />-->
<!-- <el-table-column label="审核时间" align="center" prop="auditorTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.auditorTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="最后操作人员ID" align="center" prop="lastUid" />-->
<!-- <el-table-column label="最后操作时间" align="center" prop="lastTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="作废原因" align="center" prop="reason" />-->
<!-- <el-table-column label="是否含税" align="center" prop="isTax" />-->
<!-- <el-table-column label="采购单状态" align="center" prop="status" />-->
<!-- <el-table-column label="状态说明" align="center" prop="statusText" />-->
<!-- <el-table-column label="支付状态说明" align="center" prop="payStatusText" />-->
<!-- <el-table-column label="到货状态" align="center" prop="statusShipped" />-->
<!-- <el-table-column label="到货状态说明" align="center" prop="statusShippedText" />-->
<!-- <el-table-column label="货物总价" align="center" prop="amountTotal" />-->
<!-- <el-table-column label="总金额" align="center" prop="totalPrice" />-->
<!-- <el-table-column label="币种符号" align="center" prop="icon" />-->
<!-- <el-table-column label="付款状态" align="center" prop="payStatus" />-->
<!-- <el-table-column label="其他费用" align="center" prop="otherFee" />-->
<!-- <el-table-column label="其他费用币种" align="center" prop="otherCurrency" />-->
<!-- <el-table-column label="费用分摊方式" align="center" prop="feePartType" />-->
<!-- <el-table-column label="运费" align="center" prop="shippingPrice" />-->
<!-- <el-table-column label="运费币种" align="center" prop="shippingCurrency" />-->
<!-- <el-table-column label="采购币种" align="center" prop="purchaseCurrency" />-->
<!-- <el-table-column label="采购汇率" align="center" prop="purchaseRate" />-->
<!-- <el-table-column label="采购总量" align="center" prop="quantityTotal" />-->
<!-- <el-table-column label="仓库ID" align="center" prop="wid" />-->
<!-- <el-table-column label="仓库名称" align="center" prop="wareHouseName" />-->
<!-- <el-table-column label="仓库名(备份)" align="center" prop="wareHouseBakName" />-->
<!-- <el-table-column label="入库量" align="center" prop="quantityEntry" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="采购方ID" align="center" prop="purchaserId" />-->
<!-- <el-table-column label="联系人" align="center" prop="contactPerson" />-->
<!-- <el-table-column label="联系方式" align="center" prop="contactNumber" />-->
<!-- <el-table-column label="结算方式" align="center" prop="settlementMethod" />-->
<!-- <el-table-column label="结算描述" align="center" prop="settlementDescription" />-->
<!-- <el-table-column label="支付方式" align="center" prop="paymentMethod" />-->
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />
<el-table-column label="备注" align="center" prop="remark" />
<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:purchaseOrder:edit']"></el-button>
</el-tooltip>
<!-- <el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']">-->
<!-- 确认-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<pagination
v-show="orderTotal > 0"
:total="orderTotal"
v-model:page="orderQueryParams.pageNum"
v-model:limit="orderQueryParams.pageSize"
@pagination="getOrderList"
/>
</el-card>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="ShipForward" lang="ts">
import { listShipForward, getShipForward, delShipForward, addShipForward, updateShipForward } from '@/api/amz/shipForward';
import { ShipForwardVO, ShipForwardQuery, ShipForwardForm } from '@/api/amz/shipForward/types';
import { listPurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const shipForwardList = ref<ShipForwardVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const orderLoading = 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 orderTotal = ref(0);
const queryFormRef = ref<ElFormInstance>();
const shipForwardFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const orderDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ShipForwardForm = {
id: undefined,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined
};
const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined,
type: 'shipForward',
params: {}
},
rules: {
id: [{ required: true, message: '$comment不能为空', trigger: 'blur' }],
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
inSupplierId: [{ required: true, message: '收货供应商系统ID不能为空', trigger: 'blur' }],
shipmentStart: [{ required: true, message: '计划发货起始时间不能为空', trigger: 'blur' }],
shipmentEnd: [{ required: true, message: '计划发货截止时间不能为空', trigger: 'blur' }],
trackerName: [{ required: true, message: '跟单人不能为空', trigger: 'blur' }],
trackerId: [{ required: true, message: '跟单id不能为空', trigger: 'blur' }],
fwdStatus: [{ required: true, message: '转发状态不能为空', trigger: 'change' }],
sendTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const orderQueryParams = ref({
pageNum: 1,
pageSize: 10,
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: 'ord_confirmed',
deliveryTime: undefined,
dlvTimeVar: undefined,
params: {}
});
/** 查询货件转发列表 */
const getList = async () => {
loading.value = true;
const res = await listShipForward(queryParams.value);
shipForwardList.value = res.rows;
total.value = res.total;
loading.value = false;
};
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const getOrderList = async () => {
orderLoading.value = true;
const res = await listPurchaseOrder(orderQueryParams.value);
purchaseOrderList.value = res.rows;
orderTotal.value = res.total;
orderLoading.value = false;
};
const intervalDate = ref<any>();
const intervalAction = () => {
console.log('intervalDate', intervalDate);
queryParams.value.shipmentStart = getDateToString(intervalDate.value[0]);
queryParams.value.shipmentEnd = getDateToString(intervalDate.value[1]);
};
const getDateToString = (date: Date): string => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
shipForwardFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: ShipForwardVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '订单列表';
// getOrderList();
// orderDialog.visible = true;
// orderDialog.title = '';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: ShipForwardVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getShipForward(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改货件转发';
};
/** 提交按钮 */
const submitForm = () => {
shipForwardFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateShipForward(form.value).finally(() => (buttonLoading.value = false));
} else {
await addShipForward(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: ShipForwardVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除货件转发编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delShipForward(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/shipForward/export',
{
...queryParams.value
},
`shipForward_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,625 @@
<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="100px">
<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="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" 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="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</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:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<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>
</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-hasRoles="['superadmin']"
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-hasRoles="['superadmin']"
v-hasPermi="['amz:shipForward:remove']"
></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleReceive(scope.row)" v-hasRoles="['superadmin']" v-hasPermi="['amz:shipForward:remove']"
>确认收货
</el-button>
</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="800px" append-to-body>
<el-form ref="shipForwardFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入采购店铺名称" disabled />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="form.sku" placeholder="请输入产品唯一标识码" disabled />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品全称" disabled />
</el-form-item>
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" disabled />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="form.outSupplierName" placeholder="请输入发货供应商名称" disabled />
</el-form-item>
<el-form-item label="转发状态" prop="fwdStatus">
<el-select v-model="form.fwdStatus" placeholder="请选择转发状态" disabled>
<el-option v-for="dict in forward_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="form.outSupplierId" placeholder="请输入发货供应商系统ID" disabled />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="form.inSupplierName" placeholder="请输入收货供应商名称" disabled />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="form.inSupplierId" placeholder="请输入收货供应商系统ID" disabled />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货区间" prop="shipmentStart">-->
<!-- <el-date-picker-->
<!-- v-model="intervalDate"-->
<!-- type="daterange"-->
<!-- range-separator="到"-->
<!-- start-placeholder="开始日期"-->
<!-- end-placeholder="结束日期"-->
<!-- :size="'small'"-->
<!-- @change="intervalAction"-->
<!-- disabled-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="跟单人" prop="trackerName">-->
<!-- <el-input v-model="form.trackerName" placeholder="请输入跟单人" disabled/>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="跟单id" prop="trackerId">-->
<!-- <el-input v-model="form.trackerId" placeholder="请输入跟单id" disabled/>-->
<!-- </el-form-item>-->
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间" disabled>
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确认已收货</el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="orderDialog.title" v-model="orderDialog.visible" width="1500px" append-to-body>
<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:purchaseOrder:add']"> 新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getOrderList"></right-toolbar>-->
<!-- </el-row>-->
<!-- </template>-->
<el-table v-loading="orderLoading" :data="purchaseOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" />
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="应付货款" align="center" prop="payment" />-->
<!-- <el-table-column label="审核人员ID" align="center" prop="auditorUid" />-->
<!-- <el-table-column label="审核时间" align="center" prop="auditorTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.auditorTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="最后操作人员ID" align="center" prop="lastUid" />-->
<!-- <el-table-column label="最后操作时间" align="center" prop="lastTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="作废原因" align="center" prop="reason" />-->
<!-- <el-table-column label="是否含税" align="center" prop="isTax" />-->
<!-- <el-table-column label="采购单状态" align="center" prop="status" />-->
<!-- <el-table-column label="状态说明" align="center" prop="statusText" />-->
<!-- <el-table-column label="支付状态说明" align="center" prop="payStatusText" />-->
<!-- <el-table-column label="到货状态" align="center" prop="statusShipped" />-->
<!-- <el-table-column label="到货状态说明" align="center" prop="statusShippedText" />-->
<!-- <el-table-column label="货物总价" align="center" prop="amountTotal" />-->
<!-- <el-table-column label="总金额" align="center" prop="totalPrice" />-->
<!-- <el-table-column label="币种符号" align="center" prop="icon" />-->
<!-- <el-table-column label="付款状态" align="center" prop="payStatus" />-->
<!-- <el-table-column label="其他费用" align="center" prop="otherFee" />-->
<!-- <el-table-column label="其他费用币种" align="center" prop="otherCurrency" />-->
<!-- <el-table-column label="费用分摊方式" align="center" prop="feePartType" />-->
<!-- <el-table-column label="运费" align="center" prop="shippingPrice" />-->
<!-- <el-table-column label="运费币种" align="center" prop="shippingCurrency" />-->
<!-- <el-table-column label="采购币种" align="center" prop="purchaseCurrency" />-->
<!-- <el-table-column label="采购汇率" align="center" prop="purchaseRate" />-->
<!-- <el-table-column label="采购总量" align="center" prop="quantityTotal" />-->
<!-- <el-table-column label="仓库ID" align="center" prop="wid" />-->
<!-- <el-table-column label="仓库名称" align="center" prop="wareHouseName" />-->
<!-- <el-table-column label="仓库名(备份)" align="center" prop="wareHouseBakName" />-->
<!-- <el-table-column label="入库量" align="center" prop="quantityEntry" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="采购方ID" align="center" prop="purchaserId" />-->
<!-- <el-table-column label="联系人" align="center" prop="contactPerson" />-->
<!-- <el-table-column label="联系方式" align="center" prop="contactNumber" />-->
<!-- <el-table-column label="结算方式" align="center" prop="settlementMethod" />-->
<!-- <el-table-column label="结算描述" align="center" prop="settlementDescription" />-->
<!-- <el-table-column label="支付方式" align="center" prop="paymentMethod" />-->
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />
<el-table-column label="备注" align="center" prop="remark" />
<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:purchaseOrder:edit']"></el-button>
</el-tooltip>
<!-- <el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']">-->
<!-- 确认-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<pagination
v-show="orderTotal > 0"
:total="orderTotal"
v-model:page="orderQueryParams.pageNum"
v-model:limit="orderQueryParams.pageSize"
@pagination="getOrderList"
/>
</el-card>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="ShipForward" lang="ts">
import { listShipForward, getShipForward, delShipForward, addShipForward, updateShipForward } from '@/api/amz/shipForward';
import { ShipForwardVO, ShipForwardQuery, ShipForwardForm } from '@/api/amz/shipForward/types';
import { listPurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const shipForwardList = ref<ShipForwardVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const orderLoading = 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 orderTotal = ref(0);
const queryFormRef = ref<ElFormInstance>();
const shipForwardFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const orderDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ShipForwardForm = {
id: undefined,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined
};
const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined,
type: 'shipForwardIn',
params: {}
},
rules: {
id: [{ required: true, message: '$comment不能为空', trigger: 'blur' }],
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
inSupplierId: [{ required: true, message: '收货供应商系统ID不能为空', trigger: 'blur' }],
shipmentStart: [{ required: true, message: '计划发货起始时间不能为空', trigger: 'blur' }],
shipmentEnd: [{ required: true, message: '计划发货截止时间不能为空', trigger: 'blur' }],
trackerName: [{ required: true, message: '跟单人不能为空', trigger: 'blur' }],
trackerId: [{ required: true, message: '跟单id不能为空', trigger: 'blur' }],
fwdStatus: [{ required: true, message: '转发状态不能为空', trigger: 'change' }],
sendTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const orderQueryParams = ref({
pageNum: 1,
pageSize: 10,
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: 'ord_confirmed',
deliveryTime: undefined,
dlvTimeVar: undefined,
params: {}
});
/** 查询货件转发列表 */
const getList = async () => {
loading.value = true;
const res = await listShipForward(queryParams.value);
shipForwardList.value = res.rows;
total.value = res.total;
loading.value = false;
};
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const getOrderList = async () => {
orderLoading.value = true;
const res = await listPurchaseOrder(orderQueryParams.value);
purchaseOrderList.value = res.rows;
orderTotal.value = res.total;
orderLoading.value = false;
};
const intervalDate = ref<any>();
const intervalAction = () => {
console.log('intervalDate', intervalDate);
queryParams.value.shipmentStart = getDateToString(intervalDate.value[0]);
queryParams.value.shipmentEnd = getDateToString(intervalDate.value[1]);
};
const getDateToString = (date: Date): string => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
shipForwardFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: ShipForwardVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '订单列表';
// getOrderList();
// orderDialog.visible = true;
// orderDialog.title = '';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: ShipForwardVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getShipForward(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改货件转发';
};
/** 提交按钮 */
const submitForm = () => {
shipForwardFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateShipForward(form.value).finally(() => (buttonLoading.value = false));
} else {
await addShipForward(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: ShipForwardVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除货件转发编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delShipForward(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
const handleReceive = async (row?: ShipForwardVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getShipForward(_id);
Object.assign(form.value, res.data);
form.value.fwdStatus = 'completed';
dialog.visible = true;
dialog.title = '确认已收到货';
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/shipForward/export',
{
...queryParams.value
},
`shipForward_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -0,0 +1,605 @@
<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="100px">
<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="storeName">
<el-input v-model="queryParams.storeName" placeholder="请输入采购店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="sku" prop="sku">
<el-input v-model="queryParams.sku" placeholder="请输入产品唯一标识码" 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="实际发货数量" prop="quantitySend">
<el-input v-model="queryParams.quantitySend" placeholder="请输入实际发货数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="queryParams.outSupplierName" placeholder="请输入发货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货方ID" prop="outSupplierId">
<el-input v-model="queryParams.outSupplierId" placeholder="请输入发货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="queryParams.inSupplierName" placeholder="请输入收货供应商名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货方ID" prop="inSupplierId">
<el-input v-model="queryParams.inSupplierId" placeholder="请输入收货供应商系统ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单姓名" prop="trackerName">
<el-input v-model="queryParams.trackerName" placeholder="请输入跟单人" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="跟单ID" prop="trackerId">
<el-input v-model="queryParams.trackerId" placeholder="请输入跟单id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="queryParams.sendTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择发货时间" />
</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:shipForward:add']">新增 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipForward:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipForward:remove']"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipForward:export']">导出 </el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="shipForwardList" @selection-change="handleSelectionChange">
<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>
</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-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:shipForward:edit']">发货 </el-button>
<el-tooltip content="删除" placement="top">
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasRoles="['superadmin']"
v-hasPermi="['amz:shipForward: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="800px" append-to-body>
<el-form ref="shipForwardFormRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="采购单号" prop="orderSn">
<el-input v-model="form.orderSn" placeholder="请输入采购单号" disabled />
</el-form-item>
<el-form-item label="店铺名称" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入采购店铺名称" disabled />
</el-form-item>
<el-form-item label="SKU" prop="sku">
<el-input v-model="form.sku" placeholder="请输入产品唯一标识码" disabled />
</el-form-item>
<el-form-item label="产品全称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入产品全称" disabled />
</el-form-item>
<el-form-item label="发货方" prop="outSupplierName">
<el-input v-model="form.outSupplierName" placeholder="请输入发货供应商名称" disabled />
</el-form-item>
<!-- <el-form-item label="发货方ID" prop="outSupplierId">-->
<!-- <el-input v-model="form.outSupplierId" placeholder="请输入发货供应商系统ID" />-->
<!-- </el-form-item>-->
<el-form-item label="收货方" prop="inSupplierName">
<el-input v-model="form.inSupplierName" placeholder="请输入收货供应商名称" disabled />
</el-form-item>
<!-- <el-form-item label="收货方ID" prop="inSupplierId">-->
<!-- <el-input v-model="form.inSupplierId" placeholder="请输入收货供应商系统ID" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="发货区间" prop="shipmentStart">-->
<!-- <el-date-picker-->
<!-- v-model="intervalDate"-->
<!-- type="daterange"-->
<!-- range-separator="到"-->
<!-- start-placeholder="开始日期"-->
<!-- end-placeholder="结束日期"-->
<!-- :size="'small'"-->
<!-- @change="intervalAction"-->
<!-- disabled-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="跟单人" prop="trackerName">
<el-input v-model="form.trackerName" placeholder="请输入跟单人" disabled />
</el-form-item>
<!-- <el-form-item label="跟单id" prop="trackerId">-->
<!-- <el-input v-model="form.trackerId" placeholder="请输入跟单id" />-->
<!-- </el-form-item>-->
<el-form-item label="发货数量" prop="quantitySend">
<el-input v-model="form.quantitySend" placeholder="请输入实际发货数量" disabled />
</el-form-item>
<el-form-item label="发货时间" prop="sendTime">
<el-date-picker clearable v-model="form.sendTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择发货时间" disabled>
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">开始转发货物</el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog :title="orderDialog.title" v-model="orderDialog.visible" width="1500px" append-to-body>
<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:purchaseOrder:add']"> 新增 </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:purchaseOrder:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:purchaseOrder:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:purchaseOrder:export']">导出 </el-button>-->
<!-- </el-col>-->
<!-- <right-toolbar v-model:showSearch="showSearch" @queryTable="getOrderList"></right-toolbar>-->
<!-- </el-row>-->
<!-- </template>-->
<el-table v-loading="orderLoading" :data="purchaseOrderList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="采购单号" align="center" prop="orderSn" />
<!-- <el-table-column label="自定义单号" align="center" prop="customOrderSn" />-->
<!-- <el-table-column label="供应商ID" align="center" prop="supplierId" />-->
<el-table-column label="供应商名称" align="center" prop="supplierName" />
<el-table-column label="店铺名称" align="center" prop="storeName" />
<!-- <el-table-column label="采购员ID" align="center" prop="optUid" />-->
<!-- <el-table-column label="审核人姓名" align="center" prop="auditorRealname" />-->
<!-- <el-table-column label="操作人姓名" align="center" prop="optRealname" />-->
<!-- <el-table-column label="最后操作人姓名" align="center" prop="lastRealname" />-->
<el-table-column label="下单时间" align="center" prop="orderTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.orderTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="应付货款" align="center" prop="payment" />-->
<!-- <el-table-column label="审核人员ID" align="center" prop="auditorUid" />-->
<!-- <el-table-column label="审核时间" align="center" prop="auditorTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.auditorTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="最后操作人员ID" align="center" prop="lastUid" />-->
<!-- <el-table-column label="最后操作时间" align="center" prop="lastTime" width="180">-->
<!-- <template #default="scope">-->
<!-- <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d}') }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="作废原因" align="center" prop="reason" />-->
<!-- <el-table-column label="是否含税" align="center" prop="isTax" />-->
<!-- <el-table-column label="采购单状态" align="center" prop="status" />-->
<!-- <el-table-column label="状态说明" align="center" prop="statusText" />-->
<!-- <el-table-column label="支付状态说明" align="center" prop="payStatusText" />-->
<!-- <el-table-column label="到货状态" align="center" prop="statusShipped" />-->
<!-- <el-table-column label="到货状态说明" align="center" prop="statusShippedText" />-->
<!-- <el-table-column label="货物总价" align="center" prop="amountTotal" />-->
<!-- <el-table-column label="总金额" align="center" prop="totalPrice" />-->
<!-- <el-table-column label="币种符号" align="center" prop="icon" />-->
<!-- <el-table-column label="付款状态" align="center" prop="payStatus" />-->
<!-- <el-table-column label="其他费用" align="center" prop="otherFee" />-->
<!-- <el-table-column label="其他费用币种" align="center" prop="otherCurrency" />-->
<!-- <el-table-column label="费用分摊方式" align="center" prop="feePartType" />-->
<!-- <el-table-column label="运费" align="center" prop="shippingPrice" />-->
<!-- <el-table-column label="运费币种" align="center" prop="shippingCurrency" />-->
<!-- <el-table-column label="采购币种" align="center" prop="purchaseCurrency" />-->
<!-- <el-table-column label="采购汇率" align="center" prop="purchaseRate" />-->
<!-- <el-table-column label="采购总量" align="center" prop="quantityTotal" />-->
<!-- <el-table-column label="仓库ID" align="center" prop="wid" />-->
<!-- <el-table-column label="仓库名称" align="center" prop="wareHouseName" />-->
<!-- <el-table-column label="仓库名(备份)" align="center" prop="wareHouseBakName" />-->
<!-- <el-table-column label="入库量" align="center" prop="quantityEntry" />-->
<el-table-column label="实际采购量" align="center" prop="quantityReal" />
<!-- <el-table-column label="待到货量" align="center" prop="quantityReceive" />-->
<!-- <el-table-column label="采购方ID" align="center" prop="purchaserId" />-->
<!-- <el-table-column label="联系人" align="center" prop="contactPerson" />-->
<!-- <el-table-column label="联系方式" align="center" prop="contactNumber" />-->
<!-- <el-table-column label="结算方式" align="center" prop="settlementMethod" />-->
<!-- <el-table-column label="结算描述" align="center" prop="settlementDescription" />-->
<!-- <el-table-column label="支付方式" align="center" prop="paymentMethod" />-->
<el-table-column label="交货天数" align="center" prop="estDlvDays" />
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus">-->
<!-- <template #default="scope">-->
<!-- <dict-tag :options="vendor_order_status" :value="scope.row.orderStatus" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="交货时间" align="center" prop="deliveryTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单交付变动天数" align="center" prop="dlvTimeVar" />
<el-table-column label="备注" align="center" prop="remark" />
<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:purchaseOrder:edit']"></el-button>
</el-tooltip>
<!-- <el-button size="small" link type="primary" @click="handleConfirm(scope.row)" v-hasPermi="['amz:purchaseOrder:remove']">-->
<!-- 确认-->
<!-- </el-button>-->
</template>
</el-table-column>
</el-table>
<pagination
v-show="orderTotal > 0"
:total="orderTotal"
v-model:page="orderQueryParams.pageNum"
v-model:limit="orderQueryParams.pageSize"
@pagination="getOrderList"
/>
</el-card>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="ShipForward" lang="ts">
import { listShipForward, getShipForward, delShipForward, addShipForward, updateShipForward } from '@/api/amz/shipForward';
import { ShipForwardVO, ShipForwardQuery, ShipForwardForm } from '@/api/amz/shipForward/types';
import { listPurchaseOrder } from '@/api/amz/purchaseOrder';
import { PurchaseOrderVO } from '@/api/amz/purchaseOrder/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { forward_status } = toRefs<any>(proxy?.useDict('forward_status'));
const shipForwardList = ref<ShipForwardVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const orderLoading = 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 orderTotal = ref(0);
const queryFormRef = ref<ElFormInstance>();
const shipForwardFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const orderDialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ShipForwardForm = {
id: undefined,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined
};
const data = reactive<PageData<ShipForwardForm, ShipForwardQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: undefined,
storeName: undefined,
sku: undefined,
productName: undefined,
quantitySend: undefined,
outSupplierName: undefined,
outSupplierId: undefined,
inSupplierName: undefined,
inSupplierId: undefined,
shipmentStart: undefined,
shipmentEnd: undefined,
trackerName: undefined,
trackerId: undefined,
fwdStatus: undefined,
sendTime: undefined,
type: 'shipForwardOut',
params: {}
},
rules: {
id: [{ required: true, message: '$comment不能为空', trigger: 'blur' }],
orderSn: [{ required: true, message: '采购单号不能为空', trigger: 'blur' }],
storeName: [{ required: true, message: '采购店铺名称不能为空', trigger: 'blur' }],
sku: [{ required: true, message: '产品唯一标识码不能为空', trigger: 'blur' }],
productName: [{ required: true, message: '产品全称不能为空', trigger: 'blur' }],
quantitySend: [{ required: true, message: '实际发货数量不能为空', trigger: 'blur' }],
outSupplierName: [{ required: true, message: '发货供应商名称不能为空', trigger: 'blur' }],
outSupplierId: [{ required: true, message: '发货供应商系统ID不能为空', trigger: 'blur' }],
inSupplierName: [{ required: true, message: '收货供应商名称不能为空', trigger: 'blur' }],
inSupplierId: [{ required: true, message: '收货供应商系统ID不能为空', trigger: 'blur' }],
shipmentStart: [{ required: true, message: '计划发货起始时间不能为空', trigger: 'blur' }],
shipmentEnd: [{ required: true, message: '计划发货截止时间不能为空', trigger: 'blur' }],
trackerName: [{ required: true, message: '跟单人不能为空', trigger: 'blur' }],
trackerId: [{ required: true, message: '跟单id不能为空', trigger: 'blur' }],
fwdStatus: [{ required: true, message: '转发状态不能为空', trigger: 'change' }],
sendTime: [{ required: true, message: '发货时间不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const orderQueryParams = ref({
pageNum: 1,
pageSize: 10,
orderSn: undefined,
customOrderSn: undefined,
supplierId: undefined,
supplierName: undefined,
optUid: undefined,
auditorRealname: undefined,
optRealname: undefined,
lastRealname: undefined,
orderTime: undefined,
payment: undefined,
auditorUid: undefined,
auditorTime: undefined,
lastUid: undefined,
lastTime: undefined,
reason: undefined,
isTax: undefined,
status: undefined,
statusText: undefined,
payStatusText: undefined,
statusShipped: undefined,
statusShippedText: undefined,
amountTotal: undefined,
totalPrice: undefined,
icon: undefined,
payStatus: undefined,
otherFee: undefined,
otherCurrency: undefined,
feePartType: undefined,
shippingPrice: undefined,
shippingCurrency: undefined,
purchaseCurrency: undefined,
purchaseRate: undefined,
quantityTotal: undefined,
wid: undefined,
wareHouseName: undefined,
wareHouseBakName: undefined,
quantityEntry: undefined,
quantityReal: undefined,
quantityReceive: undefined,
purchaserId: undefined,
contactPerson: undefined,
contactNumber: undefined,
settlementMethod: undefined,
settlementDescription: undefined,
paymentMethod: undefined,
estDlvDays: undefined,
orderStatus: 'ord_confirmed',
deliveryTime: undefined,
dlvTimeVar: undefined,
params: {}
});
/** 查询货件转发列表 */
const getList = async () => {
loading.value = true;
const res = await listShipForward(queryParams.value);
shipForwardList.value = res.rows;
total.value = res.total;
loading.value = false;
};
const purchaseOrderList = ref<PurchaseOrderVO[]>([]);
const getOrderList = async () => {
orderLoading.value = true;
const res = await listPurchaseOrder(orderQueryParams.value);
purchaseOrderList.value = res.rows;
orderTotal.value = res.total;
orderLoading.value = false;
};
const intervalDate = ref<any>();
const intervalAction = () => {
console.log('intervalDate', intervalDate);
queryParams.value.shipmentStart = getDateToString(intervalDate.value[0]);
queryParams.value.shipmentEnd = getDateToString(intervalDate.value[1]);
};
const getDateToString = (date: Date): string => {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0 1
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
shipForwardFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: ShipForwardVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '订单列表';
// getOrderList();
// orderDialog.visible = true;
// orderDialog.title = '';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: ShipForwardVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getShipForward(_id);
Object.assign(form.value, res.data);
form.value.sendTime = getDateToString(new Date());
// form.value.shipmentStart = getDateToString(intervalDate.value[0]);
// form.value.shipmentEnd = getDateToString(intervalDate.value[1]);
dialog.visible = true;
dialog.title = '进行货物转发';
};
/** 提交按钮 */
const submitForm = () => {
form.value.fwdStatus = 'processing';
shipForwardFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateShipForward(form.value).finally(() => (buttonLoading.value = false));
} else {
await addShipForward(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: ShipForwardVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除货件转发编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delShipForward(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'amz/shipForward/export',
{
...queryParams.value
},
`shipForward_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@ -873,7 +873,7 @@ const handleExport = () => {
{
...queryParams.value
},
`shipmentPlan_${new Date().getTime()}.xlsx`
`FBA货件_${new Date().getTime()}.xlsx`
);
};

View File

@ -13,6 +13,9 @@
<el-form-item label="物流中心编码" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入物流中心编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="创建日期" prop="deadline">
<el-date-picker clearable v-model="queryParams.gmtCreate" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -25,34 +28,38 @@
<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-hasRoles="['superadmin']" v-hasPermi="['amz:shipmentPlan:add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipmentPlan:edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipmentPlan:remove']"
>删除
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasRoles="['superadmin']" v-hasPermi="['amz:shipmentPlan:add']"-->
<!-- >新增-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['amz:shipmentPlan:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['amz:shipmentPlan:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:shipmentPlan:export']">导出 </el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="snycTodayPlan" v-hasPermi="['amz:shipmentPlan:export']"
<FbaPlanFileUpload :file-type="['xlsx', 'xls']" :on-finished="uploadFinished" :file-size="5" />
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="RefreshRight" @click="snycTodayPlan" v-hasPermi="['amz:shipmentPlan:export']"
>同步今天的货件
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="channelDialogVisibleAction" v-hasPermi="['amz:shipmentPlan:export']"
<el-button type="primary" plain icon="Check" @click="channelDialogVisibleAction" v-hasPermi="['amz:shipmentPlan:export']"
>批量提交询价
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
@ -105,8 +112,17 @@
</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="destination">-->
<!-- <template #default="scope">-->
<!-- <RouterLink-->
<!-- class="text-green-500 hover:text-green-500 hover:underline transition-colors"-->
<!-- :to="'/report/vendorReport?destination=' + scope.row.destination"-->
<!-- >-->
<!-- {{ scope.row.destination }}-->
<!-- </RouterLink>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="总箱子数量" align="center" prop="boxQuantity" />
<el-table-column label="箱子尺寸" align="center" prop="boxSize" />
<el-table-column label="供应商称重-总重量" align="center" prop="vendorWeight" />
@ -123,7 +139,7 @@
<el-tag>{{ scope.row.shipmentStatus }}</el-tag>
</template>
</el-table-column>
<el-table-column label="物流渠道" align="center" prop="channelName" />
<!-- <el-table-column label="物流渠道" align="center" prop="channelName" />-->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
@ -363,6 +379,10 @@ const dialog = reactive<DialogOption>({
title: ''
});
const handleCopy = (text) => {
proxy?.$modal.msgSuccess('复制成功');
};
const initFormData: ShipmentPlanForm = {
id: undefined,
sid: undefined,
@ -545,6 +565,13 @@ const formatTime = (timeString) => {
return timeString.replace(' ', '\n'); //
};
const uploadFinished = (res: any, file: UploadFile) => {
console.log('res=', res);
if (res.success === true) {
getList();
}
};
//
const statusTagType = (status) => {
switch (status) {
@ -647,8 +674,23 @@ const getAllChannelData = async () => {
//
const countryMap = {
us: '美国'
//
us: '美国',
cn: '中国',
jp: '日本',
kr: '韩国',
sg: '新加坡',
de: '德国',
fr: '法国',
gb: '英国',
it: '意大利',
es: '西班牙',
ru: '俄罗斯',
ca: '加拿大',
au: '澳大利亚',
in: '印度',
br: '巴西',
za: '南非',
mx: '墨西哥'
};
const shippingMethodMap = {
@ -755,6 +797,7 @@ const reset = () => {
/** 搜索按钮操作 */
const handleQuery = () => {
console.log('queryParams.value.gmtCreate', queryParams.value.gmtCreate);
queryParams.value.pageNum = 1;
getList();
};
@ -965,10 +1008,31 @@ const handleExport = () => {
{
...queryParams.value
},
`shipmentPlan_${new Date().getTime()}.xlsx`
`FBA货件_${getShanghaiTime()}.xlsx`
);
};
function getShanghaiTime(): string {
const date = new Date();
// 使 Intl
const formatter = new Intl.DateTimeFormat('en-US', {
timeZone: 'Asia/Shanghai',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
});
//
const parts = formatter.formatToParts(date);
const map = new Map(parts.map((part) => [part.type, part.value]));
return `${map.get('year')}-${map.get('month')}-${map.get('day')} ${map.get('hour')}:${map.get('minute')}:${map.get('second')}`;
}
const dialogVisible = ref(false);
const addressTableData = ref([]);

View File

@ -13,6 +13,9 @@
<el-form-item label="物流中心编码" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入物流中心编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="创建日期" prop="deadline">
<el-date-picker clearable v-model="queryParams.gmtCreate" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>

View File

@ -13,6 +13,9 @@
<el-form-item label="物流中心编码" prop="destination">
<el-input v-model="queryParams.destination" placeholder="请输入物流中心编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="创建日期" prop="deadline">
<el-date-picker clearable v-model="queryParams.gmtCreate" type="date" value-format="YYYY-MM-DD" placeholder="请选择创建日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>

View File

@ -14,9 +14,39 @@
</template>
<script setup name="Index" lang="ts">
import { queryLogisticsOrder } from '@/api/amz/logisticsOrder';
import { Action } from 'element-plus';
const goTarget = (url: string) => {
window.open(url, '__blank');
};
onMounted(async () => {
console.log('物流商管理系统');
const res = await queryLogisticsOrder();
console.log('res', res);
if (res.code === 200) {
console.log('res.data', res.data);
if (res.data.length > 0) {
console.log('有快到期的订单');
ElMessage.warning('有快到期的订单');
ElMessageBox.alert('有快到期的订单', '订单提醒', {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: '好的我知道了',
callback: (action: Action) => {
// ElMessage({
// type: 'info',
// message: `action: ${action}`
// });
}
});
} else {
console.log('没有快到期的订单');
// ElMessage.warning('');
}
}
});
</script>
<style scoped lang="scss">
@ -27,12 +57,14 @@ const goTarget = (url: string) => {
font-size: 17.5px;
border-left: 5px solid #eee;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.col-item {
margin-bottom: 20px;
}

View File

@ -5,14 +5,14 @@
<h3 class="title">瑷胜科技管理系统</h3>
<lang-select />
</div>
<el-form-item v-if="tenantEnabled" prop="tenantId">
<el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')" style="width: 100%">
<el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>
<template #prefix>
<svg-icon icon-class="company" class="el-input__icon input-icon" />
</template>
</el-select>
</el-form-item>
<!-- <el-form-item v-if="tenantEnabled" prop="tenantId">-->
<!-- <el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')" style="width: 100%">-->
<!-- <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>-->
<!-- <template #prefix>-->
<!-- <svg-icon icon-class="company" class="el-input__icon input-icon" />-->
<!-- </template>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" :placeholder="proxy.$t('login.username')">
<template #prefix>

View File

@ -7,8 +7,8 @@
<el-form-item label="登录地址" prop="ipaddr">
<el-input v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="登录状态" clearable>
@ -69,7 +69,7 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="访问编号" align="center" prop="infoId" />
<el-table-column
label="用户"
label="用户登录名"
align="center"
prop="userName"
:show-overflow-tooltip="true"

View File

@ -6,8 +6,8 @@
<el-form-item label="登录地址" prop="ipaddr">
<el-input v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>

View File

@ -3,8 +3,8 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="search">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
@ -35,8 +35,8 @@
</template>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="用户登录名" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="status">

View File

@ -2,8 +2,8 @@
<el-row>
<el-dialog v-model="visible" title="选择用户" width="800px" top="5vh" append-to-body>
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
@ -16,8 +16,8 @@
<el-row>
<el-table ref="tableRef" :data="userList" height="260px" @row-click="clickRow" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="用户" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="用户登录名" prop="userName" :show-overflow-tooltip="true" />
<el-table-column label="用户称" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
<el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="status">

View File

@ -217,7 +217,7 @@ const data = reactive<PageData<TenantForm, TenantQuery>>({
companyName: [{ required: true, message: '企业名称不能为空', trigger: 'blur' }],
username: [
{ required: true, message: '用户名不能为空', trigger: 'blur' },
{ min: 2, max: 20, message: '用户长度必须介于 2 和 20 之间', trigger: 'blur' }
{ min: 2, max: 20, message: '用户登录名长度必须介于 2 和 20 之间', trigger: 'blur' }
],
password: [
{ required: true, message: '密码不能为空', trigger: 'blur' },

View File

@ -5,7 +5,7 @@
<el-form :model="form" :inline="true">
<el-row :gutter="10">
<el-col :span="2.5">
<el-form-item label="用户称" prop="nickName">
<el-form-item label="用户称" prop="nickName">
<el-input v-model="form.nickName" disabled />
</el-form-item>
</el-col>

View File

@ -24,8 +24,8 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户" clearable @keyup.enter="handleQuery" />
<el-form-item label="用户登录名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户登录名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
@ -96,8 +96,8 @@
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" />
<el-table-column v-if="columns[1].visible" key="userName" label="用户" align="center" prop="userName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[2].visible" key="nickName" label="用户称" align="center" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[1].visible" key="userName" label="用户登录名" align="center" prop="userName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[2].visible" key="nickName" label="用户称" align="center" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" />
<el-table-column v-if="columns[5].visible" key="status" label="状态" align="center">
@ -148,8 +148,8 @@
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="用户称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户称" maxlength="30" />
<el-form-item label="用户称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户称" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -180,8 +180,8 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户" maxlength="30" />
<el-form-item v-if="form.userId == undefined" label="用户登录名" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户登录名" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -335,8 +335,8 @@ const upload = reactive<ImportOption>({
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `用户编号`, visible: false, children: [] },
{ key: 1, label: `用户`, visible: true, children: [] },
{ key: 2, label: `用户`, visible: true, children: [] },
{ key: 1, label: `用户登录`, visible: true, children: [] },
{ key: 2, label: `用户`, visible: true, children: [] },
{ key: 3, label: `部门`, visible: true, children: [] },
{ key: 4, label: `手机号码`, visible: true, children: [] },
{ key: 5, label: `状态`, visible: true, children: [] },
@ -382,15 +382,15 @@ const initData: PageData<UserForm, UserQuery> = {
},
rules: {
userName: [
{ required: true, message: '用户不能为空', trigger: 'blur' },
{ required: true, message: '用户登录名不能为空', trigger: 'blur' },
{
min: 2,
max: 20,
message: '用户长度必须介于 2 和 20 之间',
message: '用户登录名长度必须介于 2 和 20 之间',
trigger: 'blur'
}
],
nickName: [{ required: true, message: '用户称不能为空', trigger: 'blur' }],
nickName: [{ required: true, message: '用户称不能为空', trigger: 'blur' }],
password: [
{ required: true, message: '用户密码不能为空', trigger: 'blur' },
{

View File

@ -15,12 +15,12 @@
<ul class="list-group list-group-striped">
<li class="list-group-item">
<svg-icon icon-class="user" />
用户
用户登录
<div class="pull-right">{{ state.user.userName }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="user" />
用户昵称
用户登录名
<div class="pull-right">{{ state.user.nickName }}</div>
</li>
<li class="list-group-item">
@ -48,6 +48,16 @@
创建日期
<div class="pull-right">{{ state.user.createTime }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="wechat" />
微信
<div class="pull-right">
<div v-if="state.user.openId == null || state.user.openId == ''">
<el-link type="success" @click="authUrl('wechat')">绑定微信</el-link>
</div>
<div v-else>已经绑定</div>
</div>
</li>
</ul>
</div>
</el-card>
@ -76,6 +86,24 @@
</el-card>
</el-col>
</el-row>
<el-dialog v-model="dialogVisible" title="扫码绑定微信" width="360">
<vue-qr
:text="qrCodeValue"
:size="300"
:logoSrc="wechatLogo"
:logoScale="0.15"
:margin="5"
colorDark="#000000"
colorLight="#ffffff"
:correctLevel="3"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="dialogVisible = false"> 确定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@ -85,13 +113,21 @@ import UserInfo from './userInfo.vue';
import ResetPwd from './resetPwd.vue';
import ThirdParty from './thirdParty.vue';
import OnlineDevice from './onlineDevice.vue';
import { getAuthList } from '@/api/system/social/auth';
import { authBindingWechat, getAuthList } from '@/api/system/social/auth';
import { getUserProfile } from '@/api/system/user';
import { getOnline } from '@/api/monitor/online';
import { UserVO } from '@/api/system/user/types';
import vueQr from 'vue-qr/src/packages/vue-qr.vue';
import wechatLogo from '@/assets/icons/png/wechat.png';
const activeTab = ref('userinfo');
const dialogVisible = ref(false);
const qrCodeValue = ref('https://example.com');
const qrCodeWidth = ref(250);
interface State {
user: Partial<UserVO>;
roleGroup: string;
@ -127,6 +163,15 @@ const getOnlines = async () => {
state.value.devices = res.rows;
};
const authUrl = (source: string) => {
authBindingWechat().then((res: any) => {
if (res.code === 200) {
qrCodeValue.value = res.data;
dialogVisible.value = true;
}
});
};
onMounted(() => {
getUser();
getAuths();

View File

@ -20,43 +20,43 @@
<div id="git-user-binding">
<h4 class="provider-desc">你可以绑定以下第三方帐号</h4>
<div id="authlist" class="user-bind">
<a class="third-app" href="#" title="使用 微信 账号授权登录" @click="authUrl('wechat')">
<div class="git-other-login-icon">
<svg-icon icon-class="wechat" />
</div>
<span class="app-name">WeiXin</span>
</a>
<a class="third-app" href="#" title="使用 MaxKey 账号授权登录" @click="authUrl('maxkey')">
<div class="git-other-login-icon">
<svg-icon icon-class="maxkey" />
</div>
<span class="app-name">MaxKey</span>
</a>
<a class="third-app" href="#" title="使用 TopIam 账号授权登录" @click="authUrl('topiam')">
<div class="git-other-login-icon">
<svg-icon icon-class="topiam" />
</div>
<span class="app-name">TopIam</span>
</a>
<a class="third-app" href="#" title="使用 Gitee 账号授权登录" @click="authUrl('gitee')">
<div class="git-other-login-icon">
<svg-icon icon-class="gitee" />
</div>
<span class="app-name">Gitee</span>
</a>
<a class="third-app" href="#" title="使用 GitHub 账号授权登录" @click="authUrl('github')">
<div class="git-other-login-icon">
<svg-icon icon-class="github" />
</div>
<span class="app-name">Github</span>
</a>
<!-- <a class="third-app" href="#" title="使用 微信 账号授权登录" @click="authUrl('wechat')">-->
<!-- <div class="git-other-login-icon">-->
<!-- <svg-icon icon-class="wechat" />-->
<!-- </div>-->
<!-- <span class="app-name">WeiXin</span>-->
<!-- </a>-->
<!-- <a class="third-app" href="#" title="使用 MaxKey 账号授权登录" @click="authUrl('maxkey')">-->
<!-- <div class="git-other-login-icon">-->
<!-- <svg-icon icon-class="maxkey" />-->
<!-- </div>-->
<!-- <span class="app-name">MaxKey</span>-->
<!-- </a>-->
<!-- <a class="third-app" href="#" title="使用 TopIam 账号授权登录" @click="authUrl('topiam')">-->
<!-- <div class="git-other-login-icon">-->
<!-- <svg-icon icon-class="topiam" />-->
<!-- </div>-->
<!-- <span class="app-name">TopIam</span>-->
<!-- </a>-->
<!-- <a class="third-app" href="#" title="使用 Gitee 账号授权登录" @click="authUrl('gitee')">-->
<!-- <div class="git-other-login-icon">-->
<!-- <svg-icon icon-class="gitee" />-->
<!-- </div>-->
<!-- <span class="app-name">Gitee</span>-->
<!-- </a>-->
<!-- <a class="third-app" href="#" title="使用 GitHub 账号授权登录" @click="authUrl('github')">-->
<!-- <div class="git-other-login-icon">-->
<!-- <svg-icon icon-class="github" />-->
<!-- </div>-->
<!-- <span class="app-name">Github</span>-->
<!-- </a>-->
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { authUnlock, authBinding } from '@/api/system/social/auth';
import { authUnlock, authBinding, authBindingWechat } from '@/api/system/social/auth';
import { propTypes } from '@/utils/propTypes';
import useUserStore from '@/store/modules/user';
@ -82,16 +82,6 @@ const unlockAuth = (row: any) => {
})
.catch(() => {});
};
const authUrl = (source: string) => {
authBinding(source, useUserStore().tenantId).then((res: any) => {
if (res.code === 200) {
window.location.href = res.data;
} else {
proxy?.$modal.msgError(res.msg);
}
});
};
</script>
<style type="text/css">

View File

@ -1,6 +1,6 @@
<template>
<el-form ref="userRef" :model="userForm" :rules="rules" label-width="80px">
<!-- <el-form-item label="用户称" prop="nickName">-->
<!-- <el-form-item label="用户称" prop="nickName">-->
<!-- <el-input v-model="userForm.nickName" maxlength="30" />-->
<!-- </el-form-item>-->
<el-form-item label="手机号码" prop="phonenumber">
@ -33,7 +33,7 @@ const userForm = computed(() => props.user);
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const userRef = ref<ElFormInstance>();
const rule: ElFormRules = {
nickName: [{ required: true, message: '用户称不能为空', trigger: 'blur' }],
nickName: [{ required: true, message: '用户称不能为空', trigger: 'blur' }],
email: [
{ required: true, message: '邮箱地址不能为空', trigger: 'blur' },
{