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
0
Merge Requests
0
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
f63df5c5
Commit
f63df5c5
authored
Aug 30, 2025
by
wusiyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: podus添加dtf排版
parent
1775baac
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
433 additions
and
58 deletions
+433
-58
src/views/order/podCN/index.vue
+433
-58
No files found.
src/views/order/podCN/index.vue
View file @
f63df5c5
...
...
@@ -301,9 +301,45 @@
<ElButton
type=
"primary"
@
click=
"search"
>
查询
</ElButton>
</span>
</ElFormItem>
<ElFormItem
v-if=
"
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
status === 'IN_PRODUCTION'
"
>
<ElDropdown>
<el-button
type=
"primary"
>
DTF排版
<el-icon
class=
"el-icon--right"
><ArrowDown
/></el-icon>
</el-button>
<
template
#
dropdown
>
<ElDropdownMenu>
<ElDropdownItem
:loading=
"tifDownloadLoading"
@
click=
"downloadTif('tiff', 40)"
>
TIF(40cm)
</ElDropdownItem
>
<ElDropdownItem
:loading=
"tifDownloadLoading"
@
click=
"downloadTif('tiff', 60)"
>
TIF(60cm)
</ElDropdownItem
>
<ElDropdownItem
:loading=
"pngDownloadLoading"
@
click=
"downloadTif('png', 40)"
>
PNG(40cm)
</ElDropdownItem
>
<ElDropdownItem
:loading=
"pngDownloadLoading"
@
click=
"downloadTif('png', 60)"
>
PNG(60cm)
</ElDropdownItem
>
</ElDropdownMenu></
template
></ElDropdown
>
</ElFormItem>
<ElFormItem>
<span
<
!-- <
span
v-if="
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
...
...
@@ -334,7 +370,7 @@
>
PNG排版
</ElButton>
</span>
</span>
-->
<span
v-if=
"status === 'TO_BE_CONFIRMED'"
class=
"item"
>
<ElButton
type=
"success"
@
click=
"confirmProduct"
>
确认生产
...
...
@@ -504,7 +540,7 @@
<ElButton
type=
"success"
@
click=
"toBePicking"
>
转至生产
</ElButton>
</span>
<span
v-if=
"status === 'TO_BE_ARRANGE'"
class=
"item"
>
<ElButton
type=
"warning"
@
click=
"
arrangeFinish
"
>
排单完成
</ElButton>
<ElButton
type=
"warning"
@
click=
"
showArrange(2)
"
>
排单完成
</ElButton>
</span>
<span
v-if=
"status !== 'BATCH_DOWNLOAD' && status !== 'WAIT_SHIPMENT'"
...
...
@@ -1070,6 +1106,15 @@
>
{{
item
.
weight
}}
g
</span>
<el-button
v-if=
"status === 'WAIT_SHIPMENT'"
link
size=
"small"
type=
"warning"
style=
"height: 23px; margin: 0"
@
click=
"showArrange(3, item)"
>
排版
</el-button>
</div>
</div>
</div>
...
...
@@ -1350,6 +1395,16 @@
{{
row
.
finishTime
?.
replace
(
'T'
,
' '
)
}}
<
/div
>
<
/template
>
<
template
#
automaticComposing
=
"{ row
}
"
>
<
div
style
=
"white-space: pre-line"
>
{{
row
.
automaticComposing
?
'是'
:
'否'
}}
<
/div
>
<
/template
>
<
template
#
composingParam
=
"{ row
}
"
>
<
div
style
=
"white-space: pre-line"
>
{{
row
.
composingParam
?.
split
(
';'
).
join
(
'
\
n'
)
}}
<
/div
>
<
/template
>
<
template
#
failTime
=
"{ row
}
"
>
<
div
style
=
"white-space: pre-line"
>
{{
row
.
failTime
?.
replace
(
'T'
,
' '
)
}}
...
...
@@ -1365,15 +1420,15 @@
>
<
span
class
=
"operate-item"
>
<
ElButton
:
disabled
=
"!row.url"
:
disabled
=
"!row.url
&& !row.tiffUrl
"
link
type
=
"primary"
@
click
=
"handleDownload(row
, 'png'
)"
@
click
=
"handleDownload(row)"
>
PNG
下载
下载
<
/ElButton
>
<
/span
>
<
span
class
=
"operate-item"
>
<
!--
<
span
class
=
"operate-item"
>
<
ElButton
:
disabled
=
"!row.tiffUrl"
link
...
...
@@ -1382,13 +1437,32 @@
>
TIF
下载
<
/ElButton
>
<
/span> --
>
<
span
class
=
"operate-item"
>
<
ElButton
link
type
=
"primary"
@
click
=
"printPickingOrderItem(row, 1)"
>
打印拣货单
<
/ElButton
>
<
/span
>
<
span
class
=
"operate-item"
>
<
ElButton
link
type
=
"primary"
@
click
=
"printPickingOrderItem(row, 2)"
>
打印生产单
<
/ElButton
>
<
/span
>
<
span
class
=
"operate-item"
>
<
ElButton
link
type
=
"warning"
:
loading
=
"reComposingLoadingMap[row.id]"
@
click
=
"
handleReComposingDesign(
row)"
@
click
=
"
showArrange(1,
row)"
>
重新排版
<
/ElButton
>
...
...
@@ -2110,6 +2184,56 @@
<
/span
>
<
/template
>
<
/ElDialog
>
<
ElDialog
v
-
model
=
"typesettingVisible"
title
=
"选择排版类型和宽度"
width
=
"500px"
:
close
-
on
-
click
-
modal
=
"false"
>
<
el
-
form
:
model
=
"typesettingForm"
>
<
el
-
form
-
item
v
-
if
=
"typesettingType == 2"
label
=
"自动排版 (烫画工艺推荐自动排版)"
prop
=
"bool"
>
<
el
-
switch
v
-
model
=
"isAuto"
class
=
"ml-2"
style
=
"--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
inline
-
prompt
active
-
text
=
"是"
inactive
-
text
=
"否"
@
change
=
"changeSwitch"
/>
<
/el-form-item
>
<
div
v
-
if
=
"isAuto"
>
<
el
-
form
-
item
label
=
"排版类型:"
prop
=
"type"
>
<
el
-
radio
-
group
v
-
model
=
"typesettingForm.type"
>
<
el
-
radio
label
=
"tiff"
>
tiff
排版
<
/el-radio
>
<
el
-
radio
label
=
"png"
>
png
排版
<
/el-radio
>
<
/el-radio-group
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"排版宽度:"
prop
=
"type"
>
<
el
-
radio
-
group
v
-
model
=
"typesettingForm.templateWidth"
>
<
el
-
radio
:
value
=
"40"
>
40
cm
<
/el-radio
>
<
el
-
radio
:
value
=
"60"
>
60
cm
<
/el-radio
>
<
/el-radio-group
>
<
/el-form-item
>
<
/div
>
<
/el-form
>
<
template
#
footer
>
<
el
-
button
@
click
=
"
() => {
isAuto = true
typesettingVisible = false
}
"
>
取消
<
/el-butto
n
>
<
el
-
button
type
=
"primary"
@
click
=
"submitTypesetting"
>
确认
<
/el-button
>
<
/template
>
<
/ElDialog
>
<
/template
>
<
script
setup
lang
=
"ts"
>
import
{
getUserMarkList
}
from
'@/api/common'
...
...
@@ -2153,7 +2277,6 @@ import {
batchDownloadApi
,
batchDownloadDownloadApi
,
batchDownloadDeleteApi
,
batchDownloadCnRecomposingApi
,
updateToWaitShipmentApi
,
exportPodCnInfo
,
createLogisticsOrdersApi
,
...
...
@@ -2169,6 +2292,9 @@ import {
completeDeliveryApi
,
updateSelfLogistics
,
uploadExpressSheet
,
printPickPdfByBatchNumberApi
,
printProductionPdfByBatchNumberApi
,
batchDownloadRecomposingApi
,
}
from
'@/api/podCnOrder'
import
{
BaseRespData
}
from
'@/types/api'
...
...
@@ -2230,6 +2356,8 @@ declare global {
}
}
const
tabsNav
=
ref
<
Tab
[]
>
()
const
isAuto
=
ref
(
true
)
const
calculatedPrice
=
(
item
:
ProductList
)
=>
{
const
templatePrice
=
new
BigNumber
(
item
.
templatePrice
||
0
)
const
craftPrice
=
new
BigNumber
(
item
.
craftPrice
||
0
)
...
...
@@ -2744,7 +2872,7 @@ const handleInterceptionCommand = (current: number, command: number) => {
loadTabData
()
}
// 批量下载 下载
const
handleDownload
=
async
(
row
:
PodCnOrderListData
,
type
:
string
)
=>
{
const
handleDownload
=
async
(
row
:
PodCnOrderListData
)
=>
{
try
{
await
showConfirm
(
'确定下载吗?'
,
{
confirmButtonText
:
'确认'
,
...
...
@@ -2759,6 +2887,8 @@ const handleDownload = async (row: PodCnOrderListData, type: string) => {
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
const
type
=
row
.
url
&&
row
.
tiffUrl
?
'tiff'
:
row
.
url
?
'png'
:
'tiff'
try
{
const
url
=
type
===
'png'
...
...
@@ -2876,20 +3006,26 @@ const refreshProductInformation = async () => {
}
}
// 批量下载 重新排版
const
handleReComposingDesign
=
async
(
row
:
PodCnOrderListData
)
=>
{
try
{
await
showConfirm
(
'确定重新排版吗?'
,
{
confirmButtonText
:
'确认'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}
)
}
catch
{
return
}
const
handleReComposingDesign
=
async
()
=>
{
const
row
=
{
...(
typesettingRow
.
value
as
PodCnOrderListData
)
}
reComposingLoadingMap
[
row
.
id
]
=
true
typesettingVisible
.
value
=
false
const
params
:
{
id
:
number
templateWidth
?:
number
type
?:
string
}
=
{
id
:
row
.
id
,
}
const
{
templateWidth
,
type
}
=
typesettingForm
.
value
if
(
templateWidth
&&
type
)
{
params
.
templateWidth
=
templateWidth
params
.
type
=
type
}
try
{
const
res
=
await
batchDownload
CnRecomposingApi
({
id
:
row
.
id
}
)
const
res
=
await
batchDownload
RecomposingApi
(
params
)
if
(
res
.
code
!==
200
)
return
ElMessage
.
success
(
res
.
message
)
search
()
...
...
@@ -2898,6 +3034,8 @@ const handleReComposingDesign = async (row: PodCnOrderListData) => {
console
.
error
(
e
)
}
finally
{
reComposingLoadingMap
[
row
.
id
]
=
false
typesettingRow
.
value
=
undefined
}
}
const
tableColumns
=
computed
(()
=>
{
...
...
@@ -2906,66 +3044,73 @@ const tableColumns = computed(() => {
{
label
:
'批次号'
,
prop
:
'batchArrangeNum'
,
width
:
1
5
0
,
width
:
1
2
0
,
align
:
'center'
,
}
,
{
label
:
'下载状态'
,
slot
:
'downloadStatus'
,
width
:
10
0
,
width
:
9
0
,
prop
:
'downloadStatus'
,
align
:
'center'
,
}
,
{
label
:
'订单数量'
,
prop
:
'productNum'
,
width
:
100
,
width
:
85
,
align
:
'center'
,
}
,
{
label
:
'素材数量'
,
width
:
120
,
width
:
85
,
prop
:
'materialNum'
,
align
:
'center'
,
}
,
{
label
:
'创建人'
,
width
:
100
,
width
:
85
,
prop
:
'employeeAccount'
,
align
:
'center'
,
}
,
{
label
:
'失败原因'
,
minWidth
:
30
0
,
minWidth
:
25
0
,
prop
:
'failReason'
,
slot
:
'failReason'
,
align
:
'left'
,
}
,
{
label
:
'创建时间'
,
width
:
20
0
,
width
:
18
0
,
prop
:
'createTime'
,
slot
:
'createTime'
,
align
:
'center'
,
}
,
{
label
:
'完成时间'
,
width
:
20
0
,
width
:
18
0
,
prop
:
'finishTime'
,
slot
:
'finishTime'
,
align
:
'center'
,
}
,
//
{
// label: '失败时间',
// width: 250,
// prop: 'failTime',
// slot: 'failTime',
// align: 'center',
//
}
,
{
label
:
'自动下载'
,
width
:
85
,
prop
:
'automaticComposing'
,
slot
:
'automaticComposing'
,
align
:
'center'
,
}
,
{
label
:
'排版参数'
,
width
:
140
,
prop
:
'composingParam'
,
slot
:
'composingParam'
,
align
:
'center'
,
}
,
{
label
:
'操作'
,
slot
:
'operate'
,
width
:
3
0
0
,
width
:
3
5
0
,
align
:
'center'
,
fixed
:
'right'
,
prop
:
'operate'
,
...
...
@@ -3368,7 +3513,7 @@ const productionClientVisible = ref(false)
// productionClientVisible.value = true
//
}
const
downloadTif
=
async
(
type
:
string
)
=>
{
const
downloadTif
=
async
(
type
:
string
,
templateWidth
:
number
)
=>
{
if
(
!
cardSelection
.
value
.
length
)
{
return
ElMessage
.
warning
(
'请选择数据'
)
}
...
...
@@ -3377,10 +3522,16 @@ const downloadTif = async (type: string) => {
}
else
{
pngDownloadLoading
.
value
=
true
}
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
try
{
const
res
=
await
composingDesignImages
(
cardSelection
.
value
.
map
((
el
)
=>
el
.
id
),
type
,
templateWidth
,
)
const
url
=
type
===
'tiff'
...
...
@@ -3421,6 +3572,97 @@ const downloadTif = async (type: string) => {
}
else
{
pngDownloadLoading
.
value
=
false
}
}
finally
{
loading
.
close
()
}
}
const
downloadTifItem
=
async
()
=>
{
const
row
=
{
...(
typesettingRow
.
value
as
PodCnOrderListData
)
}
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
try
{
const
{
templateWidth
,
type
}
=
typesettingForm
.
value
typesettingVisible
.
value
=
false
// // 处理下载逻辑
// if ((type as string[]).length > 1)
{
// // 并行处理多个类型
// await Promise.allSettled(
// (type as string[]).map((el) =>
// downloadSingleType(row.id, el, templateWidth),
// ),
// )
//
}
else
{
// 处理单个类型
await
downloadSingleType
(
row
.
id
,
type
as
string
,
templateWidth
)
//
}
}
catch
(
error
)
{
console
.
error
(
'下载过程中出错:'
,
error
)
}
finally
{
typesettingRow
.
value
=
undefined
loading
.
close
()
}
}
// 提取下载单个类型的逻辑为独立函数
const
downloadSingleType
=
async
(
id
:
number
,
type
:
string
,
templateWidth
?:
number
,
)
=>
{
try
{
const
res
=
await
composingDesignImages
([
id
],
type
,
templateWidth
)
const
isTiff
=
type
===
'tiff'
const
url
=
isTiff
?
`https://ps.jomalls.com/tiff/${res.message
}
`
:
`${filePath
}
${res.message
}
`
if
(
isTiff
)
{
// 对于tiff类型,直接在新窗口打开
window
.
open
(
url
,
'_blank'
)
}
else
{
// 对于其他类型,使用下载方式
await
downloadFile
(
url
,
res
.
message
as
string
)
}
}
catch
(
error
)
{
console
.
error
(
`下载类型 ${type
}
时出错:`
,
error
)
throw
error
// 重新抛出错误以便外部捕获
}
}
// 提取文件下载逻辑为独立函数
const
downloadFile
=
async
(
url
:
string
,
message
:
string
)
=>
{
try
{
const
response
=
await
fetch
(
url
)
const
blob
=
await
response
.
blob
()
const
filename
=
message
.
split
(
'/'
).
pop
()
||
'download'
// 创建下载链接
const
a
=
document
.
createElement
(
'a'
)
a
.
href
=
URL
.
createObjectURL
(
blob
)
a
.
download
=
filename
a
.
target
=
'_blank'
// 模拟点击下载
document
.
body
.
appendChild
(
a
)
a
.
click
()
// 清理
setTimeout
(()
=>
{
document
.
body
.
removeChild
(
a
)
URL
.
revokeObjectURL
(
a
.
href
)
}
,
100
)
}
catch
(
error
)
{
console
.
error
(
'下载文件时出错:'
,
error
)
throw
error
// 重新抛出错误
}
finally
{
pngDownloadLoading
.
value
=
false
}
}
...
...
@@ -3469,6 +3711,38 @@ const printProductionOrder = async () => {
loading
.
close
()
}
}
// 打印拣货单
const
printPickingOrderItem
=
async
(
row
:
{
batchArrangeNum
:
string
}
,
type
:
number
,
)
=>
{
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
try
{
let
res
if
(
type
===
1
)
{
res
=
await
printPickPdfByBatchNumberApi
({
batchArrangeNumber
:
row
.
batchArrangeNum
,
}
)
}
else
if
(
type
===
2
)
{
res
=
await
printProductionPdfByBatchNumberApi
({
batchArrangeNumber
:
row
.
batchArrangeNum
,
}
)
}
if
(
res
?.
code
!==
200
)
return
ElMessage
.
success
(
'操作成功'
)
window
.
open
(
filePath
+
res
?.
message
)
}
catch
(
e
)
{
console
.
error
(
e
)
}
finally
{
loading
.
close
()
}
}
const
printPickingOrder
=
async
()
=>
{
if
(
cardSelection
.
value
.
length
===
0
)
{
return
ElMessage
.
warning
(
'请选择数据'
)
...
...
@@ -3699,31 +3973,28 @@ const downloadMaterial = async () => {
// 排单完成
const
arrangeFinish
=
async
()
=>
{
const
selectedIds
=
cardSelection
.
value
.
map
((
item
)
=>
item
.
id
)
if
(
selectedIds
.
length
===
0
)
{
return
ElMessage
({
message
:
'请选择订单'
,
type
:
'warning'
,
offset
:
window
.
innerHeight
/
2
,
}
)
}
try
{
await
ElMessageBox
.
confirm
(
'确定排单完成吗?'
,
'提示'
,
{
cancelButtonText
:
'取消'
,
confirmButtonText
:
'确认'
,
type
:
'warning'
,
}
)
}
catch
{
return
}
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'操作中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
}
)
const
selectedIds
=
cardSelection
.
value
.
map
((
item
)
=>
item
.
id
)
const
params
:
{
productIdList
:
number
[]
templateWidth
?:
number
type
?:
string
}
=
{
productIdList
:
selectedIds
,
}
const
{
templateWidth
,
type
}
=
typesettingForm
.
value
if
(
templateWidth
&&
type
)
{
params
.
templateWidth
=
templateWidth
params
.
type
=
type
}
typesettingVisible
.
value
=
false
try
{
const
res
=
await
arrangeFinishApi
(
selectedId
s
)
const
res
=
await
arrangeFinishApi
(
param
s
)
if
(
res
.
code
!==
200
)
return
ElMessage
.
success
(
'操作成功'
)
search
()
...
...
@@ -3734,6 +4005,110 @@ const arrangeFinish = async () => {
loading
.
close
()
}
}
// 重新排版
const
typesettingForm
=
ref
<
{
typeArr
?:
string
[]
type
?:
string
templateWidth
?:
number
}
>
({
}
)
const
typesettingVisible
=
ref
(
false
)
const
typesettingType
=
ref
<
number
>
()
const
typesettingRow
=
ref
<
PodCnOrderListData
>
()
const
showArrange
=
async
(
type
:
number
,
data
?:
PodCnOrderListData
)
=>
{
typesettingType
.
value
=
type
typesettingForm
.
value
=
{
}
if
(
type
===
1
||
type
===
3
)
{
typesettingRow
.
value
=
data
}
else
if
(
type
===
2
)
{
const
selectedIds
=
cardSelection
.
value
.
map
((
item
)
=>
item
.
id
)
if
(
selectedIds
.
length
===
0
)
{
return
ElMessage
({
message
:
'请选择订单'
,
type
:
'warning'
,
offset
:
window
.
innerHeight
/
2
,
}
)
}
const
bool
=
hasDifferentCraftCodeWithSet
(
cardSelection
.
value
)
if
(
bool
)
{
try
{
await
ElMessageBox
.
confirm
(
'选中排单的生产单存在多个工艺, 是否继续排单?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}
,
)
typesettingVisible
.
value
=
true
}
catch
(
error
)
{
return
(
typesettingVisible
.
value
=
false
)
}
}
}
typesettingVisible
.
value
=
true
}
function
hasDifferentCraftCodeWithSet
(
items
:
ProductList
[])
{
if
(
items
.
length
<=
1
)
return
false
const
seen
=
new
Set
()
for
(
const
item
of
items
)
{
if
(
seen
.
has
(
item
.
craftCode
))
{
if
(
seen
.
size
>
1
)
return
true
}
else
{
seen
.
add
(
item
.
craftCode
)
if
(
seen
.
size
>
1
)
return
true
}
}
return
false
}
const
submitTypesetting
=
()
=>
{
const
{
templateWidth
,
type
}
=
typesettingForm
.
value
// 如果是自动排版且没有填必选项
if
(
isAuto
.
value
&&
(
!
templateWidth
||
!
type
))
{
return
ElMessage
.
warning
(
'排版类型和排版宽度为必选项'
)
}
// 针对排版宽度和类型分别判断
if
(
!
templateWidth
&&
type
)
{
return
ElMessage
.
warning
(
'请选择排版宽度'
)
}
if
(
templateWidth
&&
!
type
)
{
return
ElMessage
.
warning
(
'请选择排版类型'
)
}
// 针对类型 3 的特殊判断
if
(
typesettingType
.
value
===
3
&&
(
!
templateWidth
||
!
type
))
{
return
ElMessage
.
warning
(
'排版类型和排版宽度为必选项'
)
}
// 设置为自动排版
isAuto
.
value
=
true
// 根据排版类型执行相应的操作
switch
(
typesettingType
.
value
)
{
case
1
:
return
handleReComposingDesign
()
case
2
:
return
arrangeFinish
()
default
:
return
downloadTifItem
()
}
}
const
changeSwitch
=
()
=>
{
typesettingForm
.
value
=
{
}
}
const
logList
=
ref
<
LogListData
[]
>
([])
const
logVisible
=
ref
(
false
)
const
operationLog
=
async
(
id
:
number
,
e
:
MouseEvent
|
null
)
=>
{
...
...
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