Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
factory_front
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
qinjianhui
factory_front
Commits
3f47eaaf
Commit
3f47eaaf
authored
Jan 09, 2026
by
qinjianhui
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'release' into dev
parents
3ec4a519
6bd6dcd6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
920 additions
and
296 deletions
+920
-296
src/api/podCnOrder.ts
+12
-1
src/api/podUsOrder.ts
+15
-1
src/types/api/podCnOrder.ts
+2
-0
src/types/api/podUsOrder.ts
+2
-0
src/views/Dashboard.vue
+556
-199
src/views/order/podCN/index.vue
+147
-36
src/views/order/podUs/index.vue
+186
-59
No files found.
src/api/podCnOrder.ts
View file @
3f47eaaf
...
@@ -770,7 +770,7 @@ export function updateCustomDeclarationInfoApi({
...
@@ -770,7 +770,7 @@ export function updateCustomDeclarationInfoApi({
formData
.
append
(
key
,
String
(
value
))
formData
.
append
(
key
,
String
(
value
))
}
}
})
})
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
'factory/podJomallOrderCn/batchUpdateCustomsClearanceInfo'
,
'factory/podJomallOrderCn/batchUpdateCustomsClearanceInfo'
,
formData
,
formData
,
...
@@ -779,3 +779,14 @@ export function updateCustomDeclarationInfoApi({
...
@@ -779,3 +779,14 @@ export function updateCustomDeclarationInfoApi({
},
},
)
)
}
}
// 标记缺货/移除缺货共用
export
function
updateProductOutOfStockApi
(
params
:
{
productIds
:
(
number
|
string
)[]
orderFrom
:
string
outOfStock
:
boolean
})
{
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
`/factory/podJomallOrderProductCnUs/updateProductOutOfStock`
,
params
,
)
}
src/api/podUsOrder.ts
View file @
3f47eaaf
...
@@ -286,7 +286,10 @@ export function clearBoxApi(
...
@@ -286,7 +286,10 @@ export function clearBoxApi(
},
},
)
)
}
}
export
function
clearAllBoxApi
(
warehouseId
:
string
|
number
,
factoryNo
:
string
|
number
|
undefined
)
{
export
function
clearAllBoxApi
(
warehouseId
:
string
|
number
,
factoryNo
:
string
|
number
|
undefined
,
)
{
return
axios
.
get
<
never
,
BaseRespData
<
never
>>
(
return
axios
.
get
<
never
,
BaseRespData
<
never
>>
(
'factory/podJomallOrderUs/delPodBoxOrderDetails'
,
'factory/podJomallOrderUs/delPodBoxOrderDetails'
,
{
{
...
@@ -685,3 +688,14 @@ export function printNormalPickPdfApi(ids: string) {
...
@@ -685,3 +688,14 @@ export function printNormalPickPdfApi(ids: string) {
{
params
:
{
ids
}
},
{
params
:
{
ids
}
},
)
)
}
}
// 标记缺货/移除缺货共用
export
function
updateProductOutOfStockApi
(
params
:
{
productIds
:
(
number
|
string
)[]
orderFrom
:
string
outOfStock
:
boolean
})
{
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
`/factory/podJomallOrderProductCnUs/updateProductOutOfStock`
,
params
,
)
}
src/types/api/podCnOrder.ts
View file @
3f47eaaf
...
@@ -54,6 +54,7 @@ export interface SearchForm {
...
@@ -54,6 +54,7 @@ export interface SearchForm {
automaticComposing
?:
number
automaticComposing
?:
number
employeeId
?:
number
employeeId
?:
number
blocking
?:
boolean
blocking
?:
boolean
outOfStock
?:
boolean
}
}
export
interface
PodCnOrderListData
{
export
interface
PodCnOrderListData
{
id
:
number
id
:
number
...
@@ -158,6 +159,7 @@ export interface ProductList {
...
@@ -158,6 +159,7 @@ export interface ProductList {
batchArrangeNumber
?:
string
|
null
batchArrangeNumber
?:
string
|
null
sizeType
?:
number
|
null
sizeType
?:
number
|
null
customTagList
?:
{
name
:
string
}[]
customTagList
?:
{
name
:
string
}[]
outOfStock
?:
boolean
}
}
export
interface
cardImages
{
export
interface
cardImages
{
title
:
string
title
:
string
...
...
src/types/api/podUsOrder.ts
View file @
3f47eaaf
...
@@ -50,6 +50,7 @@ export interface SearchForm {
...
@@ -50,6 +50,7 @@ export interface SearchForm {
automaticComposing
?:
number
automaticComposing
?:
number
employeeId
?:
number
employeeId
?:
number
blocking
?:
boolean
blocking
?:
boolean
outOfStock
?:
boolean
}
}
export
interface
PodUsOrderListData
{
export
interface
PodUsOrderListData
{
id
:
number
id
:
number
...
@@ -157,6 +158,7 @@ export interface ProductList {
...
@@ -157,6 +158,7 @@ export interface ProductList {
sizeType
?:
number
|
null
sizeType
?:
number
|
null
productMark
?:
string
|
null
productMark
?:
string
|
null
customTagList
?:
{
name
:
string
}[]
customTagList
?:
{
name
:
string
}[]
outOfStock
?:
boolean
}
}
export
interface
cardImages
{
export
interface
cardImages
{
title
:
string
title
:
string
...
...
src/views/Dashboard.vue
View file @
3f47eaaf
...
@@ -6,11 +6,11 @@
...
@@ -6,11 +6,11 @@
<div
class=
"card-container"
>
<div
class=
"card-container"
>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
今日新单(件/单)
</div>
<div
class=
"card-title"
>
今日新单(件/
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
content=
"今日新增订单的订单数量
"
:content=
"`今日新增订单的订单数量($
{today}北京时间 0-24点数据)`
"
placement="bottom"
placement="bottom"
>
>
<div
class=
"card-icon"
></div>
<div
class=
"card-icon"
></div>
...
@@ -28,11 +28,11 @@
...
@@ -28,11 +28,11 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
今日接单(件/单)
</div>
<div
class=
"card-title"
>
今日接单(件/
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
content=
"今日新增确认生产的订单数量
"
:content=
"`今日新增确认生产的订单数量($
{today}北京时间 0-24点数据)`
"
placement="bottom"
placement="bottom"
>
>
<div
class=
"card-icon"
></div>
<div
class=
"card-icon"
></div>
...
@@ -50,7 +50,7 @@
...
@@ -50,7 +50,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
未发货订单(单)
</div>
<div
class=
"card-title"
>
未发货订单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -68,7 +68,7 @@
...
@@ -68,7 +68,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
超时未发订单(单)
</div>
<div
class=
"card-title"
>
超时未发订单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -86,197 +86,247 @@
...
@@ -86,197 +86,247 @@
</div>
</div>
</div>
</div>
<div
class=
"card-container"
:gutter=
"20"
>
<div
class=
"card-container"
:gutter=
"20"
>
<div
class=
"card-item"
>
<el-tooltip
class=
"item"
effect=
"light"
placement=
"bottom-end"
>
<div
class=
"card-item-header"
>
<template
#
content
>
<div
class=
"card-title"
>
昨日发货数(单)
</div>
<div
style=
"display: flex; align-items: center; gap: 4px"
>
<el-tooltip
<div
class=
"up-icon-green"
></div>
class=
"item"
<div>
为正向趋势,
</div>
effect=
"light"
<div
class=
"down-icon-red"
></div>
content=
"昨日转为已发货状态的总订单数(昨日北京时间0-24点数据)"
<div>
为负向趋势
</div>
placement=
"bottom"
>
<div
class=
"card-icon"
></div>
</el-tooltip>
</div>
<div
class=
"card-item-content-box"
>
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
{{
statisticData
?.
yesterdayShipmentOrderNum
??
'-'
}}
</div>
</div>
<div
class=
"card-item-content-text"
>
</
template
>
较前天
<div
class=
"card-item"
>
<div
<div
class=
"card-item-header"
>
v-if=
"
<div
class=
"card-title"
>
昨日发货数(订单)
</div>
statisticData &&
<el-tooltip
statisticData.compareYesterdayShipmentOrderNum >= 0
class=
"item"
"
effect=
"light"
style=
"display: flex; margin-left: 10px"
:content=
"`昨日转为已发货状态的总订单数(${yesterday}北京时间 0-24点数据)`"
placement=
"bottom"
>
>
<div
class=
"text-red"
>
<div
class=
"card-icon"
></div>
{{
statisticData
?.
compareYesterdayShipmentOrderNum
}}
</el-tooltip>
</div>
</div>
<div
class=
"up-icon"
></div>
<div
class=
"card-item-content-box"
>
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
{{ statisticData?.yesterdayShipmentOrderNum ?? '-' }}
</div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"card-item-content-text"
>
<div
class=
"text-green"
>
较前天
{{
<div
Math
.
abs
(
v-if=
"
statisticData
?.
compareYesterdayShipmentOrderNum
||
0
,
statisticData &&
)
statisticData.compareYesterdayShipmentOrderNum >= 0
}}
"
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-green"
>
{{
statisticData?.compareYesterdayShipmentOrderNum.toFixed(
2,
)
}}
</div>
<div
class=
"up-icon-green"
></div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-red"
>
{{
Math.abs(
statisticData?.compareYesterdayShipmentOrderNum || 0,
).toFixed(2)
}}
</div>
<div
class=
"down-icon-red"
></div>
</div>
</div>
<div
class=
"down-icon"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-tooltip>
<div
class=
"card-item"
>
<el-tooltip
class=
"item"
effect=
"light"
placement=
"bottom-end"
>
<div
class=
"card-item-header"
>
<
template
#
content
>
<div
class=
"card-title"
>
24h发货率
</div>
<div
style=
"display: flex; align-items: center; gap: 4px"
>
<el-tooltip
<div
class=
"up-icon-green"
></div>
class=
"item"
<div>
为正向趋势,
</div>
effect=
"light"
<div
class=
"down-icon-red"
></div>
content=
"昨日已发货订单中从接单转为已发货状态在24小时内的比例(昨日北京时间0-24点数据)"
<div>
为负向趋势
</div>
placement=
"bottom"
>
<div
class=
"card-icon"
></div>
</el-tooltip>
</div>
<div
class=
"card-item-content-box"
>
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
{{
(
statisticData
?.
shipmentRateOf24Hour
??
'-'
)
+
'%'
}}
</div>
</div>
<div
class=
"card-item-content-text"
>
</
template
>
较前天
<div
class=
"card-item"
>
<div
<div
class=
"card-item-header"
>
v-if=
"
<div
class=
"card-title"
>
24h发货率
</div>
statisticData &&
<el-tooltip
statisticData.compareLastDayShipmentRateOf24Hour >= 0
class=
"item"
"
effect=
"light"
style=
"display: flex; margin-left: 10px"
:content=
"`昨日已发货订单中从接单转为已发货状态在24小时内的比例(${yesterday}北京时间 0-24点数据)`"
placement=
"bottom"
>
>
<div
class=
"text-red"
>
<div
class=
"card-icon"
></div>
{{
</el-tooltip>
(
statisticData
?.
compareLastDayShipmentRateOf24Hour
??
</div>
'-'
)
+
'%'
<div
class=
"card-item-content-box"
>
}}
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
</div>
{{ (statisticData?.shipmentRateOf24Hour ?? '-') + '%' }}
<div
class=
"up-icon"
></div>
</div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"card-item-content-text"
>
<div
class=
"text-green"
>
较前天
{{
<div
Math
.
abs
(
v-if=
"
statisticData
?.
compareLastDayShipmentRateOf24Hour
||
0
,
statisticData &&
)
+
'%'
statisticData.compareLastDayShipmentRateOf24Hour >= 0
}}
"
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-green"
>
{{
(statisticData?.compareLastDayShipmentRateOf24Hour.toFixed(
2,
) ?? '-') + '%'
}}
</div>
<div
class=
"up-icon-green"
></div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-red"
>
{{
Math.abs(
statisticData?.compareLastDayShipmentRateOf24Hour ||
0,
).toFixed(2) + '%'
}}
</div>
<div
class=
"down-icon-red"
></div>
</div>
</div>
<div
class=
"down-icon"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-tooltip>
<div
class=
"card-item"
>
<el-tooltip
class=
"item"
effect=
"light"
placement=
"bottom-end"
>
<div
class=
"card-item-header"
>
<
template
#
content
>
<div
class=
"card-title"
>
48h发货率
</div>
<div
style=
"display: flex; align-items: center; gap: 4px"
>
<el-tooltip
<div
class=
"up-icon-green"
></div>
class=
"item"
<div>
为正向趋势,
</div>
effect=
"light"
<div
class=
"down-icon-red"
></div>
content=
"昨日已发货订单中从接单转为已发货状态在48小时内的比例(昨日北京时间0-24点数据)"
<div>
为负向趋势
</div>
placement=
"bottom"
>
<div
class=
"card-icon"
></div>
</el-tooltip>
</div>
<div
class=
"card-item-content-box"
>
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
{{
(
statisticData
?.
shipmentRateOf48Hour
??
'-'
)
+
'%'
}}
</div>
</div>
<div
class=
"card-item-content-text"
>
</
template
>
较前天
<div
class=
"card-item"
>
<div
<div
class=
"card-item-header"
>
v-if=
"
<div
class=
"card-title"
>
48h发货率
</div>
statisticData &&
<el-tooltip
statisticData.compareLastDayShipmentRateOf48Hour >= 0
class=
"item"
"
effect=
"light"
style=
"display: flex; margin-left: 10px"
:content=
"`昨日已发货订单中从接单转为已发货状态在48小时内的比例(${yesterday}北京时间 0-24点数据)`"
placement=
"bottom"
>
>
<div
class=
"text-red"
>
<div
class=
"card-icon"
></div>
{{
</el-tooltip>
(
statisticData
?.
compareLastDayShipmentRateOf48Hour
??
</div>
'-'
)
+
'%'
<div
class=
"card-item-content-box"
>
}}
<div
v-auto-fit-text
class=
"card-item-content text-blue"
>
</div>
{{ (statisticData?.shipmentRateOf48Hour ?? '-') + '%' }}
<div
class=
"up-icon"
></div>
</div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"card-item-content-text"
>
<div
class=
"text-green"
>
较前天
{{
<div
Math
.
abs
(
v-if=
"
statisticData
?.
compareLastDayShipmentRateOf48Hour
||
0
,
statisticData &&
)
+
'%'
statisticData.compareLastDayShipmentRateOf48Hour >= 0
}}
"
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-green"
>
{{
(statisticData?.compareLastDayShipmentRateOf48Hour.toFixed(
2,
) ?? '-') + '%'
}}
</div>
<div
class=
"up-icon-green"
></div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-red"
>
{{
Math.abs(
statisticData?.compareLastDayShipmentRateOf48Hour ||
0,
).toFixed(2) + '%'
}}
</div>
<div
class=
"down-icon-red"
></div>
</div>
</div>
<div
class=
"down-icon"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-tooltip>
<div
class=
"card-item"
>
<el-tooltip
class=
"item"
effect=
"light"
placement=
"bottom-end"
>
<div
class=
"card-item-header"
>
<
template
#
content
>
<div
class=
"card-title"
>
发货超时率
</div>
<div
style=
"display: flex; align-items: center; gap: 4px"
>
<el-tooltip
<div
class=
"down-icon-green"
></div>
class=
"item"
<div>
为正向趋势,
</div>
effect=
"light"
<div
class=
"up-icon-red"
></div>
content=
"昨日已发货订单中从接单转为已发货状态大于48小时的比例(昨日北京时间0-24点数据)"
<div>
为负向趋势
</div>
placement=
"bottom"
>
<div
class=
"card-icon"
></div>
</el-tooltip>
</div>
<div
class=
"card-item-content-box"
>
<div
v-auto-fit-text
class=
"card-item-content text-red"
>
{{
(
statisticData
?.
overTimeShipmentRate
??
'-'
)
+
'%('
+
(
statisticData
?.
yesterdayOverTimeShipmentOrderNum
??
'-'
)
+
')'
}}
</div>
</div>
<div
class=
"card-item-content-text"
>
</
template
>
较前天
<div
class=
"card-item"
>
<div
<div
class=
"card-item-header"
>
v-if=
"
<div
class=
"card-title"
>
发货超时率
</div>
statisticData &&
<el-tooltip
statisticData.compareLastDayOverTimeShipmentRate >= 0
class=
"item"
"
effect=
"light"
style=
"display: flex; margin-left: 10px"
:content=
"`昨日已发货订单中从接单转为已发货状态大于48小时的比例(${yesterday}北京时间 0-24点数据)`"
placement=
"bottom"
>
>
<div
class=
"text-red"
>
<div
class=
"card-icon"
></div>
{{
</el-tooltip>
(
statisticData
?.
compareLastDayOverTimeShipmentRate
??
</div>
'-'
)
+
'%'
<div
class=
"card-item-content-box"
>
}}
<div
v-auto-fit-text
class=
"card-item-content text-red"
>
</div>
{{
<div
class=
"up-icon"
></div>
(statisticData?.overTimeShipmentRate ?? '-') +
'%(' +
(statisticData?.yesterdayOverTimeShipmentOrderNum ?? '-') +
')'
}}
</div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"card-item-content-text"
>
<div
class=
"text-green"
>
较前天
{{
<div
Math
.
abs
(
v-if=
"
statisticData
?.
compareLastDayOverTimeShipmentRate
||
0
,
statisticData &&
)
+
'%'
statisticData.compareLastDayOverTimeShipmentRate >= 0
}}
"
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-red"
>
{{
(statisticData?.compareLastDayOverTimeShipmentRate.toFixed(
2,
) ?? '-') + '%'
}}
</div>
<div
class=
"up-icon-red"
></div>
</div>
<div
v-else
style=
"display: flex; margin-left: 10px"
>
<div
class=
"text-green"
>
{{
Math.abs(
statisticData?.compareLastDayOverTimeShipmentRate ||
0,
).toFixed(2) + '%'
}}
</div>
<div
class=
"down-icon-green"
></div>
</div>
</div>
<div
class=
"down-icon"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</
div
>
</
el-tooltip
>
</div>
</div>
<div
class=
"card-container"
>
<div
class=
"card-container"
>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
待创建物流(单)
</div>
<div
class=
"card-title"
>
待创建物流(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -294,11 +344,11 @@
...
@@ -294,11 +344,11 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
待排单(单)
</div>
<div
class=
"card-title"
>
待排单(
生产
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
content=
"目前订单中待排单的总生产数"
content=
"目前订单中待排单的总生产
单
数"
placement=
"bottom"
placement=
"bottom"
>
>
<div
class=
"card-icon"
></div>
<div
class=
"card-icon"
></div>
...
@@ -312,7 +362,7 @@
...
@@ -312,7 +362,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
生产中(单)
</div>
<div
class=
"card-title"
>
生产中(
生产
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -330,7 +380,7 @@
...
@@ -330,7 +380,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
待发货(单)
</div>
<div
class=
"card-title"
>
待发货(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -348,7 +398,7 @@
...
@@ -348,7 +398,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
拦截申请(单)
</div>
<div
class=
"card-title"
>
拦截申请(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -366,11 +416,11 @@
...
@@ -366,11 +416,11 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
异常单(单)
</div>
<div
class=
"card-title"
>
异常单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
content=
"所有订单中的异常单总单数"
content=
"所有订单中的异常单总
订
单数"
placement=
"bottom"
placement=
"bottom"
>
>
<div
class=
"card-icon"
></div>
<div
class=
"card-icon"
></div>
...
@@ -386,7 +436,7 @@
...
@@ -386,7 +436,7 @@
<div
class=
"card-container"
>
<div
class=
"card-container"
>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
缺货中订单(单)
</div>
<div
class=
"card-title"
>
缺货中订单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -404,7 +454,7 @@
...
@@ -404,7 +454,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
缺货
<
24h单(单)
</div>
<div
class=
"card-title"
>
缺货
<
24h单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -422,7 +472,7 @@
...
@@ -422,7 +472,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
缺货
<
48h单(单)
</div>
<div
class=
"card-title"
>
缺货
<
48h单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -440,7 +490,7 @@
...
@@ -440,7 +490,7 @@
</div>
</div>
<div
class=
"card-item"
>
<div
class=
"card-item"
>
<div
class=
"card-item-header"
>
<div
class=
"card-item-header"
>
<div
class=
"card-title"
>
缺货≥48h单(单)
</div>
<div
class=
"card-title"
>
缺货≥48h单(
订
单)
</div>
<el-tooltip
<el-tooltip
class=
"item"
class=
"item"
effect=
"light"
effect=
"light"
...
@@ -593,6 +643,22 @@ echarts.use([
...
@@ -593,6 +643,22 @@ echarts.use([
UniversalTransition
,
UniversalTransition
,
])
])
const
today
=
new
Date
()
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
const
yesterday
=
new
Date
(
new
Date
().
setDate
(
new
Date
().
getDate
()
-
1
))
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
// 获取统计数据
// 获取统计数据
const
statisticData
=
ref
<
StatisticData
|
null
>
(
null
)
const
statisticData
=
ref
<
StatisticData
|
null
>
(
null
)
...
@@ -755,7 +821,6 @@ const createChartOption = (
...
@@ -755,7 +821,6 @@ const createChartOption = (
left
:
'3%'
,
left
:
'3%'
,
right
:
'4%'
,
right
:
'4%'
,
bottom
:
'3%'
,
bottom
:
'3%'
,
containLabel
:
true
,
},
},
xAxis
:
{
xAxis
:
{
type
:
'category'
,
type
:
'category'
,
...
@@ -918,9 +983,16 @@ const getStatisticDataApi = async () => {
...
@@ -918,9 +983,16 @@ const getStatisticDataApi = async () => {
})
})
.
then
((
res
)
=>
{
.
then
((
res
)
=>
{
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
const
isEmpty
=
checkOrderTrendDataEmpty
(
res
.
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateOrderTrendChart
(
res
.
data
,
0
)
updateOrderTrendChart
(
res
.
data
,
0
)
chartInstances
[
0
]?.
setOption
(
createChartOption
(
chartConfig1
))
updateChart
(
// 无数据时保持 loading,有数据则关闭
chartInstances
[
0
],
chartConfig1
,
isEmpty
,
false
,
chartTimes1
.
value
,
)
orderChart1Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
orderChart1Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
}
}
})
})
...
@@ -935,8 +1007,16 @@ const getStatisticDataApi = async () => {
...
@@ -935,8 +1007,16 @@ const getStatisticDataApi = async () => {
})
})
.
then
((
res
)
=>
{
.
then
((
res
)
=>
{
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
const
isEmpty
=
checkShipmentTrendDataEmpty
(
res
.
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateShipmentTrendChart
(
res
.
data
,
0
)
updateShipmentTrendChart
(
res
.
data
,
0
)
chartInstances
[
1
]?.
setOption
(
createChartOption
(
chartConfig2
,
true
))
updateChart
(
chartInstances
[
1
],
chartConfig2
,
isEmpty
,
true
,
chartTimes2
.
value
,
)
orderChart2Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
orderChart2Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
}
}
})
})
...
@@ -951,9 +1031,17 @@ const getStatisticDataApi = async () => {
...
@@ -951,9 +1031,17 @@ const getStatisticDataApi = async () => {
})
})
.
then
((
res
)
=>
{
.
then
((
res
)
=>
{
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
const
isEmpty
=
checkOvertimeTrendDataEmpty
(
res
.
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateOvertimeTrendChart
(
res
.
data
,
0
)
updateOvertimeTrendChart
(
res
.
data
,
0
)
chartInstances
[
2
]?.
setOption
(
updateChart
(
createChartOption
(
chartConfig3
,
true
,
overtimeTooltipFormatter
),
chartInstances
[
2
],
chartConfig3
,
isEmpty
,
true
,
chartTimes3
.
value
,
overtimeTooltipFormatter
,
)
)
orderChart3Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
orderChart3Loading
.
value
=
!
(
res
.
data
&&
res
.
data
.
length
>
0
)
}
}
...
@@ -1004,17 +1092,40 @@ const getchartTimes = async (v: string, type: string) => {
...
@@ -1004,17 +1092,40 @@ const getchartTimes = async (v: string, type: string) => {
trendType
:
type
,
trendType
:
type
,
})
})
if
(
type
==
'ORDER_TREND'
)
{
if
(
type
==
'ORDER_TREND'
)
{
const
isEmpty
=
checkOrderTrendDataEmpty
(
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateOrderTrendChart
(
data
,
v
)
updateOrderTrendChart
(
data
,
v
)
chartInstances
[
0
]?.
setOption
(
createChartOption
(
chartConfig1
))
updateChart
(
chartInstances
[
0
],
chartConfig1
,
isEmpty
,
false
,
chartTimes1
.
value
,
)
orderChart1Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
orderChart1Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
}
else
if
(
type
==
'SHIPMENT_TREND'
)
{
}
else
if
(
type
==
'SHIPMENT_TREND'
)
{
const
isEmpty
=
checkShipmentTrendDataEmpty
(
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateShipmentTrendChart
(
data
,
v
)
updateShipmentTrendChart
(
data
,
v
)
chartInstances
[
1
]?.
setOption
(
createChartOption
(
chartConfig2
,
true
))
updateChart
(
chartInstances
[
1
],
chartConfig2
,
isEmpty
,
true
,
chartTimes2
.
value
,
)
orderChart2Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
orderChart2Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
}
else
{
}
else
{
const
isEmpty
=
checkOvertimeTrendDataEmpty
(
data
)
// 无论数据是否为空,都要更新 x 轴数据
updateOvertimeTrendChart
(
data
,
v
)
updateOvertimeTrendChart
(
data
,
v
)
chartInstances
[
2
]?.
setOption
(
updateChart
(
createChartOption
(
chartConfig3
,
true
,
overtimeTooltipFormatter
),
chartInstances
[
2
],
chartConfig3
,
isEmpty
,
true
,
chartTimes3
.
value
,
overtimeTooltipFormatter
,
)
)
orderChart3Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
orderChart3Loading
.
value
=
!
(
data
&&
data
.
length
>
0
)
}
}
...
@@ -1023,6 +1134,217 @@ const getchartTimes = async (v: string, type: string) => {
...
@@ -1023,6 +1134,217 @@ const getchartTimes = async (v: string, type: string) => {
}
}
}
}
// 空数据提示文字
const
generatePeriodText
=
(
timeRange
:
string
):
string
=>
{
if
(
timeRange
===
'0'
)
{
const
startTime
=
new
Date
(
new
Date
().
setDate
(
new
Date
().
getDate
()
-
14
))
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
return
`当前周期(
${
startTime
}
至
${
yesterday
}
)暂无订单数据\n\n请在订单流转后等待数据更新查看趋势`
}
else
if
(
timeRange
===
'1'
)
{
// 8周前该周周一的日期
const
now
=
new
Date
()
const
eightWeeksAgo
=
new
Date
(
now
.
getTime
()
-
8
*
7
*
24
*
60
*
60
*
1000
)
const
dayOfWeek
=
eightWeeksAgo
.
getDay
()
// 0=周日, 1=周一, ..., 6=周六
const
daysToMonday
=
dayOfWeek
===
0
?
-
6
:
1
-
dayOfWeek
// 如果是周日,往前6天;否则往前到周一
const
mondayDate
=
new
Date
(
eightWeeksAgo
.
getTime
()
+
daysToMonday
*
24
*
60
*
60
*
1000
,
)
const
startTime
=
mondayDate
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
// 上个周日的日期
const
today
=
new
Date
()
const
todayDayOfWeek
=
today
.
getDay
()
// 0=周日, 1=周一, ..., 6=周六
const
daysToLastSunday
=
todayDayOfWeek
===
0
?
-
7
:
-
todayDayOfWeek
// 如果是周日,往前7天;否则往前到上一个周日
const
lastSunday
=
new
Date
(
today
.
getTime
()
+
daysToLastSunday
*
24
*
60
*
60
*
1000
,
)
const
endTime
=
lastSunday
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
return
`当前周期(
${
startTime
}
至
${
endTime
}
)暂无订单数据\n\n请在订单流转后等待数据更新查看趋势`
}
else
if
(
timeRange
===
'2'
)
{
// 六个月前该月第一天的日期
const
now
=
new
Date
()
const
sixMonthsAgo
=
new
Date
(
now
.
getFullYear
(),
now
.
getMonth
()
-
6
,
1
)
const
startTime
=
sixMonthsAgo
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
// 上一月第一天的日期
const
currentDate
=
new
Date
()
const
lastMonthFirstDay
=
new
Date
(
currentDate
.
getFullYear
(),
currentDate
.
getMonth
()
-
1
,
1
,
)
const
endTime
=
lastMonthFirstDay
.
toLocaleDateString
(
'zh-CN'
,
{
year
:
'numeric'
,
month
:
'2-digit'
,
day
:
'2-digit'
,
})
.
replace
(
/
\/
/g
,
'-'
)
return
`当前周期(
${
startTime
}
至
${
endTime
}
)暂无订单数据\n\n请在订单流转后等待数据更新查看趋势`
}
return
''
}
// 更新图表(统一处理空状态和正常状态)
const
updateChart
=
(
instance
:
echarts
.
ECharts
|
null
,
config
:
Ref
<
ChartConfig
>
,
isEmpty
:
boolean
,
isPercent
=
false
,
timeRange
:
string
,
customFormatter
?:
(
params
:
TooltipParam
[])
=>
string
,
)
=>
{
if
(
!
instance
)
return
if
(
isEmpty
)
{
const
periodText
=
generatePeriodText
(
timeRange
)
setNotopt
(
instance
,
config
,
periodText
,
isPercent
)
}
else
{
// 使用 notMerge: true 完全替换配置,确保从空状态切换回来时配置正确
instance
.
setOption
(
createChartOption
(
config
,
isPercent
,
customFormatter
),
true
,
)
}
}
// 图表空状态
const
setNotopt
=
(
demo
:
echarts
.
ECharts
|
null
,
config
:
Ref
<
ChartConfig
>
,
subtext
=
'暂无数据'
,
isPercent
=
false
,
)
=>
{
if
(
!
demo
)
return
const
chartData
=
config
.
value
const
option
=
{
title
:
[
{
text
:
chartData
.
title
,
left
:
'left'
,
},
{
text
:
' {a|}'
,
x
:
'center'
,
y
:
'center'
,
subtext
,
itemGap
:
-
20
,
textStyle
:
{
rich
:
{
a
:
{
color
:
'#000'
,
fontSize
:
'16'
,
height
:
120
,
width
:
220
,
backgroundColor
:
{
image
:
'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNDEiIHZpZXdCb3g9IjAgMCA2NCA0MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxKSIgZmlsbD0ibm9uZSIgZmlsbFJ1bGU9ImV2ZW5vZGQiPg0KICAgIDxlbGxpcHNlIGZpbGw9IiNkZGQiIGN4PSIzMiIgY3k9IjMzIiByeD0iMzIiIHJ5PSI3IiAvPg0KICAgIDxnIGZpbGxSdWxlPSJub256ZXJvIiBzdHJva2U9IiM5OTkiPg0KICAgICAgPHBhdGgNCiAgICAgICAgZD0iTTU1IDEyLjc2TDQ0Ljg1NCAxLjI1OEM0NC4zNjcuNDc0IDQzLjY1NiAwIDQyLjkwNyAwSDIxLjA5M2MtLjc0OSAwLTEuNDYuNDc0LTEuOTQ3IDEuMjU3TDkgMTIuNzYxVjIyaDQ2di05LjI0eiIgLz4NCiAgICAgIDxwYXRoDQogICAgICAgIGQ9Ik00MS42MTMgMTUuOTMxYzAtMS42MDUuOTk0LTIuOTMgMi4yMjctMi45MzFINTV2MTguMTM3QzU1IDMzLjI2IDUzLjY4IDM1IDUyLjA1IDM1aC00MC4xQzEwLjMyIDM1IDkgMzMuMjU5IDkgMzEuMTM3VjEzaDExLjE2YzEuMjMzIDAgMi4yMjcgMS4zMjMgMi4yMjcgMi45Mjh2LjAyMmMwIDEuNjA1IDEuMDA1IDIuOTAxIDIuMjM3IDIuOTAxaDE0Ljc1MmMxLjIzMiAwIDIuMjM3LTEuMzA4IDIuMjM3LTIuOTEzdi0uMDA3eiINCiAgICAgICAgZmlsbD0iI2UxZTFlMSIgLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPg=='
,
},
},
},
},
subtextStyle
:
{
fontSize
:
16
,
},
},
],
// 图例
legend
:
{
data
:
chartData
.
legend
,
top
:
'top'
,
left
:
'center'
,
},
// 横坐标
xAxis
:
{
type
:
'category'
,
boundaryGap
:
false
,
data
:
chartData
.
xAxisData
,
axisLabel
:
{
overflow
:
'truncate'
,
width
:
120
,
formatter
:
function
(
value
:
string
)
{
if
(
value
.
length
>
10
)
{
return
value
.
substring
(
0
,
10
)
+
'...'
}
return
value
},
},
},
// 网格配置
grid
:
{
left
:
'3%'
,
right
:
'4%'
,
bottom
:
'3%'
,
},
// 纵坐标,默认范围从0到1
yAxis
:
{
type
:
'value'
,
min
:
0
,
max
:
1
,
axisLabel
:
isPercent
?
{
formatter
:
'{value}%'
,
color
:
'#666'
,
}
:
{
color
:
'#666'
,
},
axisLine
:
{
lineStyle
:
{
color
:
'#ccc'
},
},
splitLine
:
{
show
:
false
,
},
},
// 清空 series 数据
series
:
chartData
.
series
.
map
((
item
)
=>
({
name
:
item
.
name
,
type
:
'line'
,
data
:
[],
color
:
item
.
color
,
})),
}
demo
.
setOption
(
option
,
true
)
}
// 检查订单趋势数据是否为空
const
checkOrderTrendDataEmpty
=
(
data
:
trendType
[]):
boolean
=>
{
const
confirmNums
=
data
.
map
((
el
)
=>
el
.
confirmNum
)
const
produceNums
=
data
.
map
((
el
)
=>
el
.
produceNum
)
const
shipmentNums
=
data
.
map
((
el
)
=>
el
.
shipmentNum
)
const
hasData
=
confirmNums
.
some
((
item
)
=>
item
!==
0
)
||
produceNums
.
some
((
item
)
=>
item
!==
0
)
||
shipmentNums
.
some
((
item
)
=>
item
!==
0
)
return
!
hasData
}
// 更新订单趋势图表数据
const
updateOrderTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
updateOrderTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
confirmNums
=
data
.
map
((
el
)
=>
el
.
confirmNum
)
const
confirmNums
=
data
.
map
((
el
)
=>
el
.
confirmNum
)
const
produceNums
=
data
.
map
((
el
)
=>
el
.
produceNum
)
const
produceNums
=
data
.
map
((
el
)
=>
el
.
produceNum
)
...
@@ -1035,11 +1357,23 @@ const updateOrderTrendChart = (data: trendType[], type: number | string) => {
...
@@ -1035,11 +1357,23 @@ const updateOrderTrendChart = (data: trendType[], type: number | string) => {
}
else
{
}
else
{
chartConfig1
.
value
.
xAxisData
=
timerange
chartConfig1
.
value
.
xAxisData
=
timerange
}
}
chartConfig1
.
value
.
series
[
0
].
data
=
confirmNums
chartConfig1
.
value
.
series
[
0
].
data
=
confirmNums
chartConfig1
.
value
.
series
[
1
].
data
=
produceNums
chartConfig1
.
value
.
series
[
1
].
data
=
produceNums
chartConfig1
.
value
.
series
[
2
].
data
=
shipmentNums
chartConfig1
.
value
.
series
[
2
].
data
=
shipmentNums
}
}
// 检查发货效率数据是否为空
const
checkShipmentTrendDataEmpty
=
(
data
:
trendType
[]):
boolean
=>
{
const
shipmentRateOf24Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf24Hour
)
const
shipmentRateOf48Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf48Hour
)
const
hasData
=
shipmentRateOf24Hours
.
some
((
item
)
=>
item
!==
0
)
||
shipmentRateOf48Hours
.
some
((
item
)
=>
item
!==
0
)
return
!
hasData
}
// 更新发货效率图表数据
const
updateShipmentTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
updateShipmentTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
shipmentRateOf24Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf24Hour
)
const
shipmentRateOf24Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf24Hour
)
const
shipmentRateOf48Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf48Hour
)
const
shipmentRateOf48Hours
=
data
.
map
((
el
)
=>
el
.
shipmentRateOf48Hour
)
...
@@ -1056,6 +1390,14 @@ const updateShipmentTrendChart = (data: trendType[], type: number | string) => {
...
@@ -1056,6 +1390,14 @@ const updateShipmentTrendChart = (data: trendType[], type: number | string) => {
chartConfig2
.
value
.
series
[
1
].
data
=
shipmentRateOf48Hours
chartConfig2
.
value
.
series
[
1
].
data
=
shipmentRateOf48Hours
}
}
// 检查超时情况数据是否为空
const
checkOvertimeTrendDataEmpty
=
(
data
:
trendType
[]):
boolean
=>
{
const
overtimeShipmentRates
=
data
.
map
((
el
)
=>
el
.
overtimeShipmentRate
)
const
hasData
=
overtimeShipmentRates
.
some
((
item
)
=>
item
!==
0
)
return
!
hasData
}
// 更新超时情况图表数据
const
updateOvertimeTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
updateOvertimeTrendChart
=
(
data
:
trendType
[],
type
:
number
|
string
)
=>
{
const
overtimeShipmentOrderNums
=
data
.
map
(
const
overtimeShipmentOrderNums
=
data
.
map
(
(
el
)
=>
el
.
overtimeShipmentOrderNum
,
(
el
)
=>
el
.
overtimeShipmentOrderNum
,
...
@@ -1069,6 +1411,7 @@ const updateOvertimeTrendChart = (data: trendType[], type: number | string) => {
...
@@ -1069,6 +1411,7 @@ const updateOvertimeTrendChart = (data: trendType[], type: number | string) => {
}
else
{
}
else
{
chartConfig3
.
value
.
xAxisData
=
timerange
chartConfig3
.
value
.
xAxisData
=
timerange
}
}
chartConfig3
.
value
.
series
[
0
].
data
=
overtimeShipmentRates
.
map
(
chartConfig3
.
value
.
series
[
0
].
data
=
overtimeShipmentRates
.
map
(
(
rate
,
idx
)
=>
({
(
rate
,
idx
)
=>
({
value
:
rate
,
value
:
rate
,
...
@@ -1166,19 +1509,6 @@ onBeforeUnmount(() => {
...
@@ -1166,19 +1509,6 @@ onBeforeUnmount(() => {
white-space
:
nowrap
;
white-space
:
nowrap
;
margin-bottom
:
3px
;
margin-bottom
:
3px
;
}
}
.up-icon
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 24 24'%3E%3Cpath fill='%23f56c6c' d='M12.725 2.451a.75.75 0 0 0-1.007-.013L3.504 9.69A.75.75 0 0 0 4 11.003h4.382c.138 1.255.057 2.576-.252 3.969c-.318 1.434-1.722 3.25-4.515 5.438a.75.75 0 0 0 .535 1.337c3.311-.322 6.112-1.537 8.365-3.662c2.08-1.963 3.228-4.334 3.422-7.082H20a.75.75 0 0 0 .511-1.299z'/%3E%3C/svg%3E")
;
}
.down-icon
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 24 24'%3E%3Cpath fill='%2367C23A' d='M4.15 2.253a.75.75 0 0 0-.535 1.337C6.408 5.778 7.812 7.594 8.13 9.028c.309 1.393.39 2.714.252 3.969H4a.75.75 0 0 0-.496 1.312l8.214 7.253a.75.75 0 0 0 1.007-.013l7.786-7.253a.75.75 0 0 0-.511-1.3h-4.063c-.194-2.747-1.342-5.118-3.422-7.08C10.262 3.79 7.46 2.574 4.15 2.252'/%3E%3C/svg%3E")
;
}
}
}
}
}
}
}
...
@@ -1246,3 +1576,30 @@ onBeforeUnmount(() => {
...
@@ -1246,3 +1576,30 @@ onBeforeUnmount(() => {
}
}
}
}
</
style
>
</
style
>
<
style
lang=
"scss"
>
.up-icon-red
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 24 24'%3E%3Cpath fill='%23f56c6c' d='M12.725 2.451a.75.75 0 0 0-1.007-.013L3.504 9.69A.75.75 0 0 0 4 11.003h4.382c.138 1.255.057 2.576-.252 3.969c-.318 1.434-1.722 3.25-4.515 5.438a.75.75 0 0 0 .535 1.337c3.311-.322 6.112-1.537 8.365-3.662c2.08-1.963 3.228-4.334 3.422-7.082H20a.75.75 0 0 0 .511-1.299z'/%3E%3C/svg%3E")
;
}
.up-icon-green
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%2367C23A' d='M12.725 2.451a.75.75 0 0 0-1.007-.013L3.504 9.69A.75.75 0 0 0 4 11.003h4.382c.138 1.255.057 2.576-.252 3.969c-.318 1.434-1.722 3.25-4.515 5.438a.75.75 0 0 0 .535 1.337c3.311-.322 6.112-1.537 8.365-3.662c2.08-1.963 3.228-4.334 3.422-7.082H20a.75.75 0 0 0 .511-1.299z'/%3E%3C/svg%3E")
;
}
.down-icon-green
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='256' height='256' viewBox='0 0 24 24'%3E%3Cpath fill='%2367C23A' d='M4.15 2.253a.75.75 0 0 0-.535 1.337C6.408 5.778 7.812 7.594 8.13 9.028c.309 1.393.39 2.714.252 3.969H4a.75.75 0 0 0-.496 1.312l8.214 7.253a.75.75 0 0 0 1.007-.013l7.786-7.253a.75.75 0 0 0-.511-1.3h-4.063c-.194-2.747-1.342-5.118-3.422-7.08C10.262 3.79 7.46 2.574 4.15 2.252'/%3E%3C/svg%3E")
;
}
.down-icon-red
{
width
:
18px
;
height
:
18px
;
background-size
:
100%
100%
;
background-image
:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23F56C6C' d='M4.15 2.253a.75.75 0 0 0-.535 1.337C6.408 5.778 7.812 7.594 8.13 9.028c.309 1.393.39 2.714.252 3.969H4a.75.75 0 0 0-.496 1.312l8.214 7.253a.75.75 0 0 0 1.007-.013l7.786-7.253a.75.75 0 0 0-.511-1.3h-4.063c-.194-2.747-1.342-5.118-3.422-7.08C10.262 3.79 7.46 2.574 4.15 2.252'/%3E%3C/svg%3E")
;
}
</
style
>
src/views/order/podCN/index.vue
View file @
3f47eaaf
...
@@ -252,6 +252,25 @@
...
@@ -252,6 +252,25 @@
>
>
</el-radio-group>
</el-radio-group>
</ElFormItem>
</ElFormItem>
<ElFormItem
label=
"标签"
v-if=
"status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
>
<ElSelect
v-model=
"searchForm.outOfStock"
clearable
filterable
placeholder=
"请输入标签"
style=
"width: 150px"
>
<el-option
v-for=
"item in labelList"
:key=
"item.value"
:label=
"item.name"
:value=
"item.value"
></el-option>
</ElSelect>
</ElFormItem>
<ElFormItem
v-if=
"status !== 'BATCH_DOWNLOAD'"
>
<ElFormItem
v-if=
"status !== 'BATCH_DOWNLOAD'"
>
<ElPopover
placement=
"bottom"
width=
"600"
trigger=
"click"
>
<ElPopover
placement=
"bottom"
width=
"600"
trigger=
"click"
>
<ElForm
<ElForm
...
@@ -416,10 +435,10 @@
...
@@ -416,10 +435,10 @@
></ElOption>
></ElOption>
</ElSelect>
</ElSelect>
</ElFormItem>
</ElFormItem>
<ElFormItem
label=
"标签"
>
<ElFormItem
label=
"
ERP
标签"
>
<ElSelect
<ElSelect
v-model=
"searchForm.tagsIdArr"
v-model=
"searchForm.tagsIdArr"
placeholder=
"请选择标签"
placeholder=
"请选择
ERP
标签"
clearable
clearable
filterable
filterable
multiple
multiple
...
@@ -676,9 +695,9 @@
...
@@ -676,9 +695,9 @@
拣胚完成
拣胚完成
</ElButton>
</ElButton>
</span>
</span>
<span
v-if=
"status === 'PICKING'"
class=
"item"
>
<
!-- <
span v-if="status === 'PICKING'" class="item">
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
</span>
</span>
-->
<span
v-if=
"status === 'TO_BE_CONFIRMED'"
class=
"item"
>
<span
v-if=
"status === 'TO_BE_CONFIRMED'"
class=
"item"
>
<ElButton
type=
"warning"
@
click=
"changeExceptionOrder"
>
<ElButton
type=
"warning"
@
click=
"changeExceptionOrder"
>
转为异常单
转为异常单
...
@@ -916,6 +935,35 @@
...
@@ -916,6 +935,35 @@
</ElDropdown>
</ElDropdown>
</span>
</span>
<span
<span
v-if=
"status === 'PICKING' || status === 'TO_BE_REPLENISHMENT'"
class=
"item"
>
<ElDropdown>
<el-button
type=
"warning"
>
标签管理
<el-icon
class=
"el-icon--right"
><ArrowDown
/></el-icon>
</el-button>
<
template
#
dropdown
>
<ElDropdownMenu>
<ElDropdownItem
:disabled=
"
selection.length === 0 && cardSelection.length === 0
"
@
click=
"labelFn(true)"
>
添加缺货标签
</ElDropdownItem
>
<ElDropdownItem
:disabled=
"
selection.length === 0 && cardSelection.length === 0
"
@
click=
"labelFn(false)"
>
移除缺货标签
</ElDropdownItem
>
</ElDropdownMenu>
</
template
>
</ElDropdown>
</span>
<span
v-if=
"['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
v-if=
"['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
class=
"item"
class=
"item"
>
>
...
@@ -1940,6 +1988,26 @@
...
@@ -1940,6 +1988,26 @@
<
template
#
top_left
>
<
template
#
top_left
>
<
el
-
tooltip
<
el
-
tooltip
v
-
if
=
"
v
-
if
=
"
cardItem.outOfStock &&
(status === 'PICKING' || status === 'TO_BE_REPLENISHMENT')
"
effect
=
"light"
content
=
"生产中缺货"
placement
=
"bottom"
>
<
div
style
=
"
background-color: #bd3124;
color: #fff;
padding: 2px 4px;
border-radius: 4px;
"
>
缺
<
/div
>
<
/el-tooltip
>
<
el
-
tooltip
v
-
if
=
"
cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 2
cardItem.interceptStatus == 2
"
"
...
@@ -2786,7 +2854,7 @@ import {
...
@@ -2786,7 +2854,7 @@ import {
confirmProductApi
,
confirmProductApi
,
applyForReplenishmentApi
,
applyForReplenishmentApi
,
replenishmentSuccessApi
,
replenishmentSuccessApi
,
toOutOfStockApi
,
//
toOutOfStockApi,
arrangeFinishApi
,
arrangeFinishApi
,
getListCraftApi
,
getListCraftApi
,
batchDownloadApi
,
batchDownloadApi
,
...
@@ -2815,6 +2883,7 @@ import {
...
@@ -2815,6 +2883,7 @@ import {
changeLogisticsApi
,
changeLogisticsApi
,
getEmployeeListApi
,
getEmployeeListApi
,
allErpCodeListApi
,
allErpCodeListApi
,
updateProductOutOfStockApi
,
}
from
'@/api/podCnOrder'
}
from
'@/api/podCnOrder'
// import
{
logisticsCompanyAllCodelist
}
from
'@/api/logistics.ts'
// import
{
logisticsCompanyAllCodelist
}
from
'@/api/logistics.ts'
...
@@ -3140,6 +3209,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
...
@@ -3140,6 +3209,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
{
name
:
'正常码'
,
value
:
1
}
,
{
name
:
'正常码'
,
value
:
1
}
,
{
name
:
'大码'
,
value
:
2
}
,
{
name
:
'大码'
,
value
:
2
}
,
])
])
// 标签类型表
const
labelList
=
ref
<
{
name
:
string
;
value
:
boolean
}
[]
>
([
{
name
:
'生产中缺货'
,
value
:
true
}
,
{
name
:
'无标签'
,
value
:
false
}
,
])
const
handleRefreshAddress
=
async
(
row
:
PodCnOrderListData
)
=>
{
const
handleRefreshAddress
=
async
(
row
:
PodCnOrderListData
)
=>
{
try
{
try
{
...
@@ -4495,37 +4569,37 @@ const pickingComplete = async () => {
...
@@ -4495,37 +4569,37 @@ const pickingComplete = async () => {
loading
.
close
()
loading
.
close
()
}
}
}
}
const
toOutOfStock
=
async
()
=>
{
//
const toOutOfStock = async () =>
{
if
(
cardSelection
.
value
.
length
===
0
)
{
//
if (cardSelection.value.length === 0)
{
return
ElMessage
.
warning
(
'请选择数据'
)
//
return ElMessage.warning('请选择数据')
}
//
}
const
orderIds
=
cardSelection
.
value
.
map
((
item
)
=>
item
.
podJomallOrderCnId
)
//
const orderIds = cardSelection.value.map((item) => item.podJomallOrderCnId)
try
{
//
try
{
await
ElMessageBox
.
confirm
(
'确定转至缺货吗?'
,
'提示'
,
{
//
await ElMessageBox.confirm('确定转至缺货吗?', '提示',
{
cancelButtonText
:
'取消'
,
//
cancelButtonText: '取消',
confirmButtonText
:
'确认'
,
//
confirmButtonText: '确认',
type
:
'warning'
,
//
type: 'warning',
}
)
//
}
)
}
catch
{
//
}
catch
{
return
//
return
}
//
}
const
loading
=
ElLoading
.
service
({
//
const loading = ElLoading.service(
{
fullscreen
:
true
,
//
fullscreen: true,
text
:
'操作中...'
,
//
text: '操作中...',
background
:
'rgba(0, 0, 0, 0.3)'
,
//
background: 'rgba(0, 0, 0, 0.3)',
}
)
//
}
)
try
{
//
try
{
const
res
=
await
toOutOfStockApi
(
orderIds
)
//
const res = await toOutOfStockApi(orderIds)
if
(
res
.
code
!==
200
)
return
//
if (res.code !== 200) return
search
()
//
search()
loadTabData
()
//
loadTabData()
cardSelection
.
value
=
[]
//
cardSelection.value = []
}
catch
(
e
)
{
//
}
catch
(
e
)
{
console
.
error
(
e
)
//
console.error(e)
}
finally
{
//
}
finally
{
loading
.
close
()
//
loading.close()
}
//
}
}
//
}
const
inputBlur
=
()
=>
{
const
inputBlur
=
()
=>
{
if
(
!
pageSize
.
value
||
Number
(
pageSize
.
value
)
<=
0
)
{
if
(
!
pageSize
.
value
||
Number
(
pageSize
.
value
)
<=
0
)
{
pageSize
.
value
=
initPageSize
.
value
pageSize
.
value
=
initPageSize
.
value
...
@@ -5844,6 +5918,43 @@ const getNewImageFn = (img: string) => {
...
@@ -5844,6 +5918,43 @@ const getNewImageFn = (img: string) => {
}
}
}
}
const
labelFn
=
async
(
type
:
boolean
)
=>
{
try
{
await
ElMessageBox
.
confirm
(
`确定${type ? '添加' : '移除'
}
“生产中缺货”标签?`
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}
,
)
}
catch
{
return
}
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
try
{
const
params
=
{
productIds
:
cardSelection
.
value
.
map
((
item
)
=>
item
.
id
),
orderFrom
:
'CN'
,
outOfStock
:
type
,
}
await
updateProductOutOfStockApi
(
params
)
ElMessage
.
success
(
'操作成功'
)
search
()
loadTabData
()
}
catch
(
error
)
{
console
.
log
(
error
)
}
finally
{
loading
.
close
()
}
}
useRouter
().
beforeEach
((
to
,
from
,
next
)
=>
{
useRouter
().
beforeEach
((
to
,
from
,
next
)
=>
{
handleBeforeRouteLeave
(
to
,
from
,
next
)
handleBeforeRouteLeave
(
to
,
from
,
next
)
}
)
}
)
...
...
src/views/order/podUs/index.vue
View file @
3f47eaaf
...
@@ -242,6 +242,25 @@
...
@@ -242,6 +242,25 @@
>
>
</el-radio-group>
</el-radio-group>
</ElFormItem>
</ElFormItem>
<ElFormItem
label=
"标签"
v-if=
"status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
>
<ElSelect
v-model=
"searchForm.outOfStock"
clearable
filterable
placeholder=
"请输入标签"
style=
"width: 150px"
>
<el-option
v-for=
"item in labelList"
:key=
"item.value"
:label=
"item.name"
:value=
"item.value"
></el-option>
</ElSelect>
</ElFormItem>
<ElFormItem>
<ElFormItem>
<ElPopover
<ElPopover
placement=
"bottom"
placement=
"bottom"
...
@@ -372,10 +391,10 @@
...
@@ -372,10 +391,10 @@
></ElOption>
></ElOption>
</ElSelect>
</ElSelect>
</ElFormItem>
</ElFormItem>
<ElFormItem
label=
"标签"
>
<ElFormItem
label=
"
ERP
标签"
>
<ElSelect
<ElSelect
v-model=
"searchForm.tagsIdArr"
v-model=
"searchForm.tagsIdArr"
placeholder=
"请选择标签"
placeholder=
"请选择
ERP
标签"
clearable
clearable
filterable
filterable
multiple
multiple
...
@@ -664,11 +683,11 @@
...
@@ -664,11 +683,11 @@
</ElButton>
</ElButton>
</span>
</span>
</ElFormItem>
</ElFormItem>
<ElFormItem
v-if=
"status === 'PICKING'"
>
<
!-- <
ElFormItem v-if="status === 'PICKING'">
<span class="item">
<span class="item">
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
</span>
</span>
</ElFormItem>
</ElFormItem>
-->
<ElFormItem
v-if=
"status === 'TO_BE_CONFIRMED'"
>
<ElFormItem
v-if=
"status === 'TO_BE_CONFIRMED'"
>
<span
class=
"item"
>
<span
class=
"item"
>
<ElButton
type=
"warning"
@
click=
"changeExceptionOrder"
>
<ElButton
type=
"warning"
@
click=
"changeExceptionOrder"
>
...
@@ -942,6 +961,34 @@
...
@@ -942,6 +961,34 @@
</ElDropdown>
</ElDropdown>
</span>
</span>
</ElFormItem>
</ElFormItem>
<ElFormItem
v-if=
"['PICKING', 'TO_BE_REPLENISHMENT'].includes(status)"
>
<span
class=
"item"
>
<ElDropdown>
<el-button
type=
"warning"
>
标签管理
<el-icon
class=
"el-icon--right"
><ArrowDown
/></el-icon>
</el-button>
<
template
#
dropdown
>
<ElDropdownMenu>
<ElDropdownItem
:disabled=
"
selection.length === 0 && cardSelection.length === 0
"
@
click=
"labelFn(true)"
>
添加缺货标签
</ElDropdownItem
>
<ElDropdownItem
:disabled=
"
selection.length === 0 && cardSelection.length === 0
"
@
click=
"labelFn(false)"
>
移除缺货标签
</ElDropdownItem
>
</ElDropdownMenu>
</
template
>
</ElDropdown>
</span>
</ElFormItem>
<ElFormItem
<ElFormItem
v-if=
"['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
v-if=
"['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
>
>
...
@@ -1810,7 +1857,16 @@
...
@@ -1810,7 +1857,16 @@
<
/span
>
<
/span
>
<
/div> --
>
<
/div> --
>
<
div
<
div
v
-
if
=
"['TO_BE_CONFIRMED','EXCEPTION_ORDER', 'STOCK_OUT', 'CREATE_LOGISTICS', 'TO_BE_ARRANGE', 'WAIT_SHIPMENT'].includes(status)"
v
-
if
=
"
[
'TO_BE_CONFIRMED',
'EXCEPTION_ORDER',
'STOCK_OUT',
'CREATE_LOGISTICS',
'TO_BE_ARRANGE',
'WAIT_SHIPMENT',
].includes(status)
"
class
=
"order-detail-item"
class
=
"order-detail-item"
>
>
<
span
class
=
"order-detail-item-label"
>
订单延期时间
:
<
/span
>
<
span
class
=
"order-detail-item-label"
>
订单延期时间
:
<
/span
>
...
@@ -2196,6 +2252,26 @@
...
@@ -2196,6 +2252,26 @@
<
template
#
top_left
>
<
template
#
top_left
>
<
el
-
tooltip
<
el
-
tooltip
v
-
if
=
"
v
-
if
=
"
cardItem.outOfStock &&
(status === 'PICKING' || status === 'TO_BE_REPLENISHMENT')
"
effect
=
"light"
content
=
"生产中缺货"
placement
=
"bottom"
>
<
div
style
=
"
background-color: #bd3124;
color: #fff;
padding: 2px;
border-radius: 4px;
"
>
缺
<
/div
>
<
/el-tooltip
>
<
el
-
tooltip
v
-
if
=
"
cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 2
cardItem.interceptStatus == 2
"
"
...
@@ -2372,7 +2448,7 @@
...
@@ -2372,7 +2448,7 @@
:
cardItem
?.
notPassNum
||
0
:
cardItem
?.
notPassNum
||
0
}}
}}
<
span
title
=
"订单延期时间"
class
=
"delayTime red-time"
>
<
span
title
=
"订单延期时间"
class
=
"delayTime red-time"
>
{{
calculateDelayTime
(
cardItem
)
}}
{{
calculateDelayTime
(
cardItem
)
}}
<
/span
>
<
/span
>
<
/span
>
<
/span
>
<
/div
>
<
/div
>
...
@@ -2391,8 +2467,18 @@
...
@@ -2391,8 +2467,18 @@
<
span
class
=
"grid-item-label"
>
补胚数量:
<
/span
>
<
span
class
=
"grid-item-label"
>
补胚数量:
<
/span
>
<
span
class
=
"grid-item-value"
>
<
span
class
=
"grid-item-value"
>
{{
cardItem
?.
replenishmentNum
||
0
}}
{{
cardItem
?.
replenishmentNum
||
0
}}
<
span
v
-
if
=
"!['IN_PRODUCTION','PICKING','TO_BE_ARRANGE'].includes(status)"
title
=
"订单延期时间"
class
=
"delayTime red-time"
>
<
span
{{
calculateDelayTime
(
cardItem
)
}}
v
-
if
=
"
![
'IN_PRODUCTION',
'PICKING',
'TO_BE_ARRANGE',
].includes(status)
"
title
=
"订单延期时间"
class
=
"delayTime red-time"
>
{{
calculateDelayTime
(
cardItem
)
}}
<
/span
>
<
/span
>
<
/span
>
<
/span
>
<
/div
>
<
/div
>
...
@@ -3149,7 +3235,7 @@ import {
...
@@ -3149,7 +3235,7 @@ import {
// handleExceptionOrderApi,
// handleExceptionOrderApi,
applyForReplenishmentApi
,
applyForReplenishmentApi
,
replenishmentSuccessApi
,
replenishmentSuccessApi
,
toOutOfStockApi
,
//
toOutOfStockApi,
arrangeFinishApi
,
arrangeFinishApi
,
getListCraftApi
,
getListCraftApi
,
batchDownloadApi
,
batchDownloadApi
,
...
@@ -3175,6 +3261,7 @@ import {
...
@@ -3175,6 +3261,7 @@ import {
printNormalPickPdfApi
,
printNormalPickPdfApi
,
updatePRNDownloadStatus
,
updatePRNDownloadStatus
,
getEmployeeListApi
,
getEmployeeListApi
,
updateProductOutOfStockApi
,
}
from
'@/api/podUsOrder'
}
from
'@/api/podUsOrder'
import
{
BaseRespData
}
from
'@/types/api'
import
{
BaseRespData
}
from
'@/types/api'
...
@@ -3431,6 +3518,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
...
@@ -3431,6 +3518,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
{
name
:
'正常码'
,
value
:
1
}
,
{
name
:
'正常码'
,
value
:
1
}
,
{
name
:
'大码'
,
value
:
2
}
,
{
name
:
'大码'
,
value
:
2
}
,
])
])
// 标签类型表
const
labelList
=
ref
<
{
name
:
string
;
value
:
boolean
}
[]
>
([
{
name
:
'生产中缺货'
,
value
:
true
}
,
{
name
:
'无标签'
,
value
:
false
}
,
])
const
detailData
=
ref
({
}
)
const
detailData
=
ref
({
}
)
const
[
searchForm
,
resetSearchForm
]
=
useValue
<
SearchForm
>
({
const
[
searchForm
,
resetSearchForm
]
=
useValue
<
SearchForm
>
({
...
@@ -5036,37 +5128,37 @@ const pickingComplete = async () => {
...
@@ -5036,37 +5128,37 @@ const pickingComplete = async () => {
loading
.
close
()
loading
.
close
()
}
}
}
}
const
toOutOfStock
=
async
()
=>
{
//
const toOutOfStock = async () =>
{
if
(
cardSelection
.
value
.
length
===
0
)
{
//
if (cardSelection.value.length === 0)
{
return
ElMessage
.
warning
(
'请选择数据'
)
//
return ElMessage.warning('请选择数据')
}
//
}
const
orderIds
=
cardSelection
.
value
.
map
((
item
)
=>
item
.
podJomallOrderUsId
)
//
const orderIds = cardSelection.value.map((item) => item.podJomallOrderUsId)
try
{
//
try
{
await
ElMessageBox
.
confirm
(
'确定转至缺货吗?'
,
'提示'
,
{
//
await ElMessageBox.confirm('确定转至缺货吗?', '提示',
{
cancelButtonText
:
'取消'
,
//
cancelButtonText: '取消',
confirmButtonText
:
'确认'
,
//
confirmButtonText: '确认',
type
:
'warning'
,
//
type: 'warning',
}
)
//
}
)
}
catch
{
//
}
catch
{
return
//
return
}
//
}
const
loading
=
ElLoading
.
service
({
//
const loading = ElLoading.service(
{
fullscreen
:
true
,
//
fullscreen: true,
text
:
'操作中...'
,
//
text: '操作中...',
background
:
'rgba(0, 0, 0, 0.3)'
,
//
background: 'rgba(0, 0, 0, 0.3)',
}
)
//
}
)
try
{
//
try
{
const
res
=
await
toOutOfStockApi
(
orderIds
)
//
const res = await toOutOfStockApi(orderIds)
if
(
res
.
code
!==
200
)
return
//
if (res.code !== 200) return
search
()
//
search()
loadTabData
()
//
loadTabData()
cardSelection
.
value
=
[]
//
cardSelection.value = []
}
catch
(
e
)
{
//
}
catch
(
e
)
{
console
.
error
(
e
)
//
console.error(e)
}
finally
{
//
}
finally
{
loading
.
close
()
//
loading.close()
}
//
}
}
//
}
const
exceptionTypes
=
[
const
exceptionTypes
=
[
{
value
:
'1'
,
label
:
'客户'
}
,
{
value
:
'1'
,
label
:
'客户'
}
,
{
value
:
'2'
,
label
:
'工厂'
}
,
{
value
:
'2'
,
label
:
'工厂'
}
,
...
@@ -6813,28 +6905,42 @@ const getEmployeeList = async () => {
...
@@ -6813,28 +6905,42 @@ const getEmployeeList = async () => {
employeeList
.
value
=
data
employeeList
.
value
=
data
}
}
getPermission
()
const
labelFn
=
async
(
type
:
boolean
)
=>
{
getLogisticsWay
()
try
{
getEmployeeList
()
await
ElMessageBox
.
confirm
(
`确定${type ? '添加' : '移除'
}
“生产中缺货”标签?`
,
const
globalProperties
=
'提示'
,
getCurrentInstance
()?.
appContext
.
config
.
globalProperties
// 获取全局挂载
{
const
isPermissionBtn
=
globalProperties
?.
$isPermissionBtn
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}
,
)
}
catch
{
return
}
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
const
getNewImageFn
=
(
img
:
string
)
=>
{
try
{
try
{
if
(
img
.
startsWith
(
'http'
))
return
img
const
params
=
{
if
(
img
.
startsWith
(
'/'
))
return
`https://img.jomalls.com/upload/erp${img
}
`
productIds
:
cardSelection
.
value
.
map
((
item
)
=>
item
.
id
),
return
`https://image.jomalls.com/${img
}
`
orderFrom
:
'US'
,
outOfStock
:
type
,
}
await
updateProductOutOfStockApi
(
params
)
ElMessage
.
success
(
'操作成功'
)
search
()
loadTabData
()
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
log
(
error
)
console
.
log
(
error
)
}
finally
{
loading
.
close
()
}
}
}
}
useRouter
().
beforeEach
((
to
,
from
,
next
)
=>
{
handleBeforeRouteLeave
(
to
,
from
,
next
)
}
)
const
printNormal
=
async
()
=>
{
const
printNormal
=
async
()
=>
{
await
showConfirm
(
'确定普货拣货吗?'
,
{
await
showConfirm
(
'确定普货拣货吗?'
,
{
confirmButtonText
:
'确认'
,
confirmButtonText
:
'确认'
,
...
@@ -6865,6 +6971,28 @@ const printNormal = async () => {
...
@@ -6865,6 +6971,28 @@ const printNormal = async () => {
ElMessage
.
success
(
'操作成功'
)
ElMessage
.
success
(
'操作成功'
)
window
.
open
(
filePath
+
res
.
message
)
window
.
open
(
filePath
+
res
.
message
)
}
}
getPermission
()
getLogisticsWay
()
getEmployeeList
()
const
globalProperties
=
getCurrentInstance
()?.
appContext
.
config
.
globalProperties
// 获取全局挂载
const
isPermissionBtn
=
globalProperties
?.
$isPermissionBtn
const
getNewImageFn
=
(
img
:
string
)
=>
{
try
{
if
(
img
.
startsWith
(
'http'
))
return
img
if
(
img
.
startsWith
(
'/'
))
return
`https://img.jomalls.com/upload/erp${img
}
`
return
`https://image.jomalls.com/${img
}
`
}
catch
(
error
)
{
console
.
log
(
error
)
}
}
useRouter
().
beforeEach
((
to
,
from
,
next
)
=>
{
handleBeforeRouteLeave
(
to
,
from
,
next
)
}
)
<
/script
>
<
/script
>
<
style
lang
=
"scss"
scoped
>
<
style
lang
=
"scss"
scoped
>
.
header
-
filter
-
form
{
.
header
-
filter
-
form
{
...
@@ -6955,12 +7083,11 @@ const printNormal = async () => {
...
@@ -6955,12 +7083,11 @@ const printNormal = async () => {
text
-
overflow
:
ellipsis
;
text
-
overflow
:
ellipsis
;
white
-
space
:
nowrap
;
white
-
space
:
nowrap
;
}
}
}
}
.
grid
-
item
-
value
{
.
grid
-
item
-
value
{
position
:
relative
;
position
:
relative
;
}
}
.
delayTime
{
.
delayTime
{
position
:
absolute
;
position
:
absolute
;
right
:
0
;
right
:
0
;
font
-
size
:
14
px
;
font
-
size
:
14
px
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment