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
99f0e989
Commit
99f0e989
authored
Oct 24, 2025
by
linjinhong
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into feature_overseas-supply
parents
480e6007
f7da650f
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
640 additions
and
149 deletions
+640
-149
src/api/logistics.ts
+1
-1
src/api/podUsOrder.ts
+4
-0
src/types/api/podCnOrder.ts
+7
-7
src/types/api/podUsOrder.ts
+2
-0
src/views/logistics/components/LogisticsWaySelect.tsx
+220
-53
src/views/logistics/logisticsMethod.vue
+94
-21
src/views/order/index.vue
+8
-2
src/views/order/orderTracking/index.vue
+23
-2
src/views/order/orderTracking/indexcn.vue
+23
-2
src/views/order/pod/index.vue
+47
-41
src/views/order/podCN/SuperPodMakeOrder.vue
+60
-8
src/views/order/podCN/index.vue
+69
-5
src/views/order/podUs/index.vue
+81
-6
tsconfig.json
+1
-1
No files found.
src/api/logistics.ts
View file @
99f0e989
...
...
@@ -148,7 +148,7 @@ export function getUniuniList() {
}
// 获取tictok物流承运商
export
function
getTiktokCarrier
()
{
return
axios
.
get
<
never
,
BaseRespData
<
{
name
:
string
;
id
:
number
}[]
>>
(
return
axios
.
get
<
never
,
BaseRespData
<
{
name
:
string
;
id
:
string
,
typeCode
:
string
,
label
:
string
}[]
>>
(
'logisticsWay/getTiktokShippingProvider'
,
)
}
...
...
src/api/podUsOrder.ts
View file @
99f0e989
...
...
@@ -586,6 +586,10 @@ export function getAccountCodeByFactoryIdApi(params: { token: string }) {
params
,
})
}
export
function
getLogisticsWayApi
()
{
return
axios
.
get
(
`logisticsWay/usableAllList`
)
}
// 打印拣货单item
export
function
printPickPdfByBatchNumberApi
(
params
:
{
batchArrangeNumber
:
string
...
...
src/types/api/podCnOrder.ts
View file @
99f0e989
...
...
@@ -44,6 +44,7 @@ export interface SearchForm {
interceptStatus
?:
number
|
string
sizeType
?:
number
|
null
tagsId
?:
string
source
?:
string
tagsIdArr
?:
(
number
|
null
)[]
}
export
interface
PodCnOrderListData
{
...
...
@@ -222,9 +223,9 @@ export interface CraftListData {
craftCode
:
string
}
export
interface
PackingData
{
podProductionNo
?:
string
;
// 生产单号(PSCD 开头)
jomallCustomNo
?:
string
;
// 一件定制号(16 位数字 或 S- 开头)
jomallPsdCustomNo
?:
string
;
// 满印定制号(JMSC/GCSC 开头)
podJomallNo
?:
string
;
// POD 平台号(JMPSC/GCPS 经过正则提取)
sku
?:
string
;
// 普通 SKU(兜底)
}
\ No newline at end of file
podProductionNo
?:
string
// 生产单号(PSCD 开头)
jomallCustomNo
?:
string
// 一件定制号(16 位数字 或 S- 开头)
jomallPsdCustomNo
?:
string
// 满印定制号(JMSC/GCSC 开头)
podJomallNo
?:
string
// POD 平台号(JMPSC/GCPS 经过正则提取)
sku
?:
string
// 普通 SKU(兜底)
}
src/types/api/podUsOrder.ts
View file @
99f0e989
...
...
@@ -12,6 +12,8 @@ export interface ExportParams extends SearchForm {
export
interface
SearchForm
{
timeType
?:
number
|
null
shopNumber
?:
string
source
?:
string
logisticsWayId
?:
number
|
null
shipmentType
?:
string
|
number
|
null
userMark
?:
string
processNumber
?:
string
...
...
src/views/logistics/components/LogisticsWaySelect.tsx
View file @
99f0e989
...
...
@@ -4,6 +4,8 @@ import {
ElScrollbar
,
ElCheckbox
,
ElCheckboxGroup
,
ElRadioGroup
,
ElRadio
,
ElInput
,
}
from
'element-plus'
...
...
@@ -24,6 +26,11 @@ const styles = {
flexWrap
:
'wrap'
,
backgroundColor
:
'#efefef'
,
},
checkbox
:
{
width
:
'33.3333%'
,
'margin-right'
:
'0px !important'
,
},
}
as
const
interface
ICompanyList
{
...
...
@@ -35,41 +42,64 @@ interface IwayList {
id
:
string
}
interface
IAllList
{
factoryId
:
number
factoryId
?
:
number
id
:
number
name
:
string
serviceCode
:
string
siteUrl
:
string
status
:
number
uinuinWarehouseId
:
number
|
null
updateTime
:
string
warehouseId
:
number
warehouseName
:
string
serviceCode
?:
string
siteUrl
?:
string
status
?:
number
uinuinWarehouseId
?:
number
|
null
updateTime
?:
string
warehouseId
?:
number
warehouseName
?:
string
wayList
?:
IwayList
[]
}
export
default
defineComponent
({
name
:
'CustomizeForm'
,
props
:
{
modelValue
:
{
type
:
Array
as
PropType
<
(
string
|
number
)[]
>
,
type
:
[
Array
,
String
,
Number
]
as
PropType
<
(
string
|
number
)[]
|
string
|
number
>
,
default
:
()
=>
[],
// 可选:添加自定义验证器确保类型安全
validator
:
(
value
:
unknown
)
=>
{
return
(
Array
.
isArray
(
value
)
||
typeof
value
===
'string'
||
typeof
value
===
'number'
)
},
},
companyList
:
{
type
:
Array
as
PropType
<
IAllList
[]
>
,
type
:
Array
as
PropType
<
IAllList
[]
|
ICompanyList
[]
>
,
default
:
()
=>
[],
},
isRadio
:
{
type
:
Boolean
,
default
:
false
,
},
},
emits
:
[
'update:modelValue'
],
setup
(
props
,
{
emit
})
{
const
companyList
=
ref
<
ICompanyList
[]
>
([])
const
templeCompanyList
=
ref
<
ICompanyList
[]
|
IwayList
[]
|
IAllList
[]
>
([])
const
allList
=
ref
<
IAllList
[]
>
([])
const
allWayLists
=
ref
<
IwayList
[]
>
([])
const
selectedList
=
ref
<
(
string
|
number
)[]
>
([])
const
selectedRadioList
=
ref
<
string
|
number
>
()
const
waysName
=
ref
(
''
)
const
searchName
=
ref
(
''
)
watch
(
()
=>
props
.
modelValue
,
(
newVal
)
=>
{
selectedList
.
value
=
newVal
if
(
props
.
isRadio
)
{
selectedRadioList
.
value
=
newVal
as
string
|
number
console
.
log
(
'waysName'
,
waysName
.
value
)
}
else
{
selectedList
.
value
=
newVal
as
(
string
|
number
)[]
}
},
{
immediate
:
true
,
...
...
@@ -78,23 +108,40 @@ export default defineComponent({
)
watch
(
[()
=>
selectedList
.
value
,
()
=>
props
.
companyList
],
[
()
=>
selectedList
.
value
,
()
=>
props
.
companyList
,
()
=>
selectedRadioList
.
value
,
],
(
newVal
)
=>
{
emit
(
'update:modelValue'
,
newVal
[
0
])
allList
.
value
=
newVal
[
1
]
companyList
.
value
=
transformData
(
newVal
[
1
])
if
(
newVal
[
1
]?.
length
)
{
waysName
.
value
=
newVal
[
1
]
.
filter
((
item
)
=>
{
if
(
newVal
[
0
].
includes
(
item
.
id
))
{
return
item
.
name
}
})
.
map
((
item
)
=>
item
.
name
)
.
join
(
','
)
// emit('waysName', res)
console
.
log
(
87
,
waysName
.
value
)
// console.log(90, newVal)
if
(
props
.
isRadio
)
{
emit
(
'update:modelValue'
,
newVal
[
2
])
companyList
.
value
=
newVal
[
1
]
as
ICompanyList
[]
allWayLists
.
value
=
props
.
companyList
.
flatMap
(
(
company
)
=>
company
.
wayList
,
)
as
IwayList
[]
waysName
.
value
=
allWayLists
.
value
.
find
((
el
:
IwayList
)
=>
newVal
[
2
]
===
el
.
id
)
?.
name
||
''
}
else
{
emit
(
'update:modelValue'
,
newVal
[
0
])
allList
.
value
=
newVal
[
1
]
as
IAllList
[]
companyList
.
value
=
transformData
(
newVal
[
1
]
as
IAllList
[])
if
(
newVal
[
1
]?.
length
)
{
waysName
.
value
=
(
newVal
[
1
]
as
IAllList
[])
.
filter
((
item
)
=>
{
if
(
newVal
[
0
].
includes
(
item
.
id
))
{
return
item
.
name
}
})
.
map
((
item
)
=>
item
.
name
)
.
join
(
','
)
// emit('waysName', res)
// console.log(87, waysName.value)
}
}
},
{
deep
:
true
,
immediate
:
true
},
...
...
@@ -127,6 +174,31 @@ export default defineComponent({
return
(
company
:
ICompanyList
)
=>
statusMap
.
get
(
company
.
warehouseName
)
})
function
fuzzySearch
<
T
>
(
items
:
T
[],
searchTerm
:
string
,
key
:
keyof
T
=
'name'
as
keyof
T
,
):
T
[]
{
// 空搜索返回所有元素
if
(
!
searchTerm
.
trim
())
{
return
[...
items
]
}
// 将搜索词转为小写(不区分大小写)
const
searchLower
=
searchTerm
.
toLowerCase
()
return
items
.
filter
((
item
)
=>
{
// 获取属性值
const
value
=
item
[
key
]
// 确保属性值存在且为字符串
if
(
typeof
value
!==
'string'
)
return
false
// 将属性值转为小写并检查是否包含搜索词
return
value
.
toLowerCase
().
includes
(
searchLower
)
})
}
function
transformData
(
data
:
IAllList
[])
{
const
warehouseMap
=
new
Map
()
for
(
const
item
of
data
)
{
...
...
@@ -154,10 +226,13 @@ export default defineComponent({
return
()
=>
(
<
ElPopover
width=
"
6
50px"
width=
"
7
50px"
placement=
"bottom-start"
trigger=
"click"
popper
-
style=
{
{
padding
:
0
}
}
onUpdate
:
visible=
{
(
value
)
=>
{
if
(
value
)
searchName
.
value
=
''
}
}
v
-
slots=
{
{
reference
:
()
=>
(
<
ElInput
...
...
@@ -168,36 +243,128 @@ export default defineComponent({
),
}
}
>
<
ElScrollbar
class=
"scroll-container"
maxHeight=
"450px"
>
{
companyList
.
value
.
map
((
company
,
index
)
=>
(
<
div
class=
"companyBox"
key=
{
index
}
>
<
div
style=
{
styles
.
titleBox
}
>
<
div
class=
"title"
>
{
company
.
warehouseName
}
</
div
>
<
ElCheckbox
modelValue=
{
getCompanySelectedStatus
.
value
(
company
)
}
onChange=
{
(
v
)
=>
setCheckAll
(
company
,
v
as
boolean
)
}
class=
"selectAll"
>
全选
</
ElCheckbox
>
</
div
>
<
ElInput
modelValue=
{
searchName
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
{
if
(
props
.
isRadio
)
{
templeCompanyList
.
value
=
fuzzySearch
(
allWayLists
.
value
,
value
)
}
else
{
templeCompanyList
.
value
=
fuzzySearch
(
allList
.
value
,
value
)
}
console
.
log
(
'templeCompanyList'
,
templeCompanyList
.
value
)
searchName
.
value
=
value
}
}
clearable
style=
{
{
width
:
'200px'
,
padding
:
'10px'
}
}
placeholder=
"请搜索承运商"
/>
<
ElScrollbar
class=
"scroll-container"
maxHeight=
"450px"
style=
{
{
'border-top'
:
'1px solid #eee'
}
}
>
{
!
searchName
.
value
?
(
companyList
.
value
.
map
((
company
,
index
)
=>
(
<
div
class=
"companyBox"
key=
{
index
}
>
<
div
style=
{
styles
.
titleBox
}
>
<
div
class=
"title"
>
{
company
.
warehouseName
}
</
div
>
{
!
props
.
isRadio
&&
(
<
ElCheckbox
modelValue=
{
getCompanySelectedStatus
.
value
(
company
as
ICompanyList
,
)
}
onChange=
{
(
v
)
=>
setCheckAll
(
company
as
ICompanyList
,
v
as
boolean
)
}
class=
"selectAll"
>
全选
</
ElCheckbox
>
)
}
</
div
>
<
ElCheckboxGroup
modelValue=
{
selectedList
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
(
selectedList
.
value
=
value
)
}
style=
{
styles
.
checkboxGroup
}
>
{
company
.
wayList
.
map
((
item
)
=>
(
{
props
.
isRadio
?
(
<
ElRadioGroup
modelValue=
{
selectedRadioList
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
{
console
.
log
(
'company'
,
value
)
selectedRadioList
.
value
=
value
as
string
|
number
}
}
style=
{
styles
.
checkboxGroup
}
>
{
company
.
wayList
?.
map
((
item
)
=>
(
<
div
title=
{
item
.
name
}
style=
{
styles
.
checkbox
}
>
<
ElRadio
label=
{
item
.
name
}
value=
{
item
.
id
}
key=
{
`item-${item.id}`
}
>
{
item
.
name
}
</
ElRadio
>
</
div
>
))
}
</
ElRadioGroup
>
)
:
(
<
ElCheckboxGroup
modelValue=
{
selectedList
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
(
selectedList
.
value
=
value
)
}
style=
{
styles
.
checkboxGroup
}
>
{
(
company
as
ICompanyList
).
wayList
.
map
((
item
)
=>
(
<
div
title=
{
item
.
name
}
style=
{
styles
.
checkbox
}
>
<
ElCheckbox
label=
{
item
.
name
}
value=
{
item
.
id
}
key=
{
`item-${item.id}`
}
class=
"checkboxItem"
/>
</
div
>
))
}
</
ElCheckboxGroup
>
)
}
</
div
>
))
)
:
props
.
isRadio
?
(
<
ElRadioGroup
modelValue=
{
selectedRadioList
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
{
console
.
log
(
'company'
,
value
)
selectedRadioList
.
value
=
value
as
string
|
number
}
}
style=
{
styles
.
checkboxGroup
}
>
{
(
templeCompanyList
.
value
as
IwayList
[]).
map
((
item
)
=>
(
<
div
title=
{
item
.
name
}
style=
{
styles
.
checkbox
}
>
<
ElRadio
label=
{
item
.
name
}
value=
{
item
.
id
}
key=
{
`item-${item.id}`
}
>
{
item
.
name
}
</
ElRadio
>
</
div
>
))
}
</
ElRadioGroup
>
)
:
(
<
ElCheckboxGroup
modelValue=
{
selectedList
.
value
}
onUpdate
:
modelValue=
{
(
value
)
=>
(
selectedList
.
value
=
value
)
}
style=
{
styles
.
checkboxGroup
}
>
{
(
templeCompanyList
.
value
as
IwayList
[]).
map
((
item
)
=>
(
<
div
title=
{
item
.
name
}
style=
{
styles
.
checkbox
}
>
<
ElCheckbox
label=
{
item
.
name
}
value=
{
item
.
id
}
key=
{
`item-${item.id}`
}
class=
"checkboxItem"
/>
))
}
</
ElCheckboxGroup
>
</
div
>
)
)
}
</
div
>
))
}
</
ElCheckboxGroup
>
)
}
</
ElScrollbar
>
</
ElPopover
>
)
...
...
src/views/logistics/logisticsMethod.vue
View file @
99f0e989
...
...
@@ -42,7 +42,7 @@
v-model=
"editForm"
:config=
"formConfig"
form-item-width=
"100%"
label
W
idth=
"110"
label
-w
idth=
"110"
>
</CustomizeForm>
...
...
@@ -70,6 +70,7 @@
defineOptions
({
name
:
'LogisticsMethod'
,
})
import
LogisticsWaySelect
from
'./components/LogisticsWaySelect.tsx'
import
{
getLogisticsWayList
,
addLogisticsWay
,
...
...
@@ -83,7 +84,7 @@ import {
getUniuniList
,
getTiktokCarrier
,
}
from
'@/api/logistics'
import
type
{
FormItemRule
}
from
'element-plus'
import
{
WarehouseListData
}
from
'@/types/api/podUsOrder'
import
{
ISeachFormConfig
}
from
'@/types/searchType'
import
{
TableColumn
}
from
'@/components/VxeTable'
...
...
@@ -103,6 +104,7 @@ import { showConfirm } from '@/utils/ui'
import
{
Edit
,
Delete
,
List
,
WarningFilled
}
from
'@element-plus/icons-vue'
import
{
debounce
}
from
'lodash-es'
import
UPARCELImage
from
'@/assets/images/UPARCEL物流编码.png'
const
[
searchForm
]
=
useValue
({})
const
[
editForm
,
resetEditForm
]
=
useValue
<
LogisticsMethod
>
({
platformList
:
[
...
...
@@ -140,6 +142,7 @@ const warehouseList = ref<WarehouseListData[]>([])
interface
ImageList
{
[
key
:
string
]:
string
}
const
imgeList
=
ref
<
ImageList
>
({
UPARCEL
:
UPARCELImage
,
})
...
...
@@ -182,6 +185,45 @@ const platformList = ref([])
const
ruleNameList
=
ref
([])
const
uniuniList
=
ref
([])
const
logisticsCompanyList
=
ref
([])
watch
(
()
=>
JSON
.
parse
(
JSON
.
stringify
(
editForm
.
value
.
platformList
)),
(
newValue
,
oldValue
)
=>
{
if
(
oldValue
.
length
&&
newValue
.
length
)
{
// 遍历旧值数组
oldValue
.
forEach
(
(
oldItem
:
{
logisticsName
:
string
;
showPlatform
:
string
[]
},
index
:
number
,
)
=>
{
// 检查旧值项是否符合条件
if
(
Array
.
isArray
(
oldItem
.
showPlatform
)
&&
oldItem
.
showPlatform
.
length
===
1
&&
oldItem
.
showPlatform
[
0
]
===
'TIKTOK'
&&
oldItem
.
logisticsName
)
{
// 获取对应的新值项
const
newItem
=
newValue
[
index
]
// 检查新值项是否不再满足条件
if
(
newItem
&&
(
!
Array
.
isArray
(
newItem
.
showPlatform
)
||
newItem
.
showPlatform
.
length
===
0
||
!
newItem
.
showPlatform
.
includes
(
'TIKTOK'
)
||
newItem
.
showPlatform
.
length
>
1
)
)
{
// 清除 logisticsName
editForm
.
value
.
platformList
[
index
].
logisticsName
=
''
}
}
},
)
}
},
{
deep
:
true
},
)
const
formConfig
=
computed
<
IFormConfig
[]
>
(()
=>
[
{
title
:
'物流基础信息'
},
{
...
...
@@ -370,9 +412,7 @@ const formConfig = computed<IFormConfig[]>(() => [
{
title
:
'平台物流名称'
,
fixed
:
'last'
,
render
:
(
item
,
formData
)
=>
{
console
.
log
(
283
,
item
,
formData
)
render
:
(
_
,
formData
)
=>
{
return
(
formData
?.
platformList
as
platformObj
[])?.
map
(
(
item
:
platformObj
,
index
:
number
)
=>
(
<
div
style
=
"display: flex; width:100%"
>
...
...
@@ -415,21 +455,21 @@ const formConfig = computed<IFormConfig[]>(() => [
required
:
true
,
message
:
'请输入物流名称'
,
trigger
:
'blur'
,
validator
:
(
_
:
FormItemRule
,
value
:
string
,
callback
:
(
error
?:
string
)
=>
void
,
)
=>
{
if
(
value
)
callback
()
},
},
]}
>
<
el
-
select
v
-
model
=
{
item
.
logisticsName
}
placeholder
=
"请选择物流名称"
>
{
tiktokCarriers
.
value
?.
map
((
el
)
=>
(
<
el
-
option
label
=
{
el
.
name
}
value
=
{
el
.
name
}
key
=
{
el
.
id
}
><
/el-option
>
))}{
' '
}
<
/el-select
>
<
LogisticsWaySelect
v
-
model
=
{
item
.
logisticsName
as
string
|
number
}
isRadio
=
{
true
}
companyList
=
{
tiktokCarriers
.
value
as
ICompanyList
[]}
><
/LogisticsWaySelect
>
<
/el-form-item
>
)
:
(
<
el
-
form
-
item
...
...
@@ -466,7 +506,7 @@ const formConfig = computed<IFormConfig[]>(() => [
{
index
>=
1
&&
(
<
el
-
button
style
=
"margin-left: 10px"
type
=
"
primary
"
type
=
"
danger
"
onClick
=
{()
=>
deleteCol
(
index
)}
>
删除
...
...
@@ -534,7 +574,16 @@ const tableConfig = ref<TableColumn[]>([
<
/span
>
<
span
>
<
span
>
{
'物流名称:'
}
<
/span
>
<
span
class
=
"logistics-name"
>
{
el
.
logisticsName
}
<
/span
>
{
el
.
platform
===
'TIKTOK'
?
(
<
span
class
=
"logistics-name"
>
{
tiktokCarriers
.
value
?.
flatMap
((
company
)
=>
company
.
wayList
)
?.
find
((
item
)
=>
el
.
logisticsName
===
item
.
id
)?.
name
||
el
.
logisticsName
}
<
/span
>
)
:
(
<
span
class
=
"logistics-name"
>
{
el
.
logisticsName
}
<
/span
>
)}
<
/span
>
<
/div
>
)),
...
...
@@ -868,13 +917,33 @@ async function getAllList() {
}
}
const
tiktokCarriers
=
ref
<
{
name
:
string
;
id
:
number
}[]
>
([])
interface
ICompanyList
{
warehouseName
:
string
wayList
:
IwayList
[]
}
interface
IwayList
{
name
:
string
id
:
string
}
const
tiktokCarriers
=
ref
<
ICompanyList
[]
>
([])
/**
* @description: 获取tictok物流承运商
*/
async
function
getTiktokCarriers
()
{
const
{
data
}
=
await
getTiktokCarrier
()
tiktokCarriers
.
value
=
data
const
labelTypeList
=
Array
.
from
(
new
Set
(
data
.
map
((
e
)
=>
e
.
label
)))
const
result
:
ICompanyList
[]
=
[]
labelTypeList
.
forEach
((
label
)
=>
{
result
.
push
({
warehouseName
:
label
,
wayList
:
data
.
filter
((
e
)
=>
e
.
label
===
label
),
})
})
tiktokCarriers
.
value
=
result
console
.
log
(
893
,
tiktokCarriers
.
value
)
}
/**
...
...
@@ -885,7 +954,9 @@ interface LogList {
createTime
?:
string
description
?:
string
}
const
logList
=
ref
<
LogList
[]
>
([])
async
function
showLog
(
row
:
LogisticsMethod
)
{
logDialogVisible
.
value
=
true
try
{
...
...
@@ -909,9 +980,11 @@ async function showLog(row: LogisticsMethod) {
margin-bottom
:
10px
;
}
}
.user-operate-btn
{
margin-bottom
:
10px
;
}
.dialog-footer
{
text-align
:
center
;
}
...
...
src/views/order/index.vue
View file @
99f0e989
...
...
@@ -4,7 +4,13 @@
<template
#
top
>
<div
class=
"header-filter"
>
<div
class=
"header-filter-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
label-position=
"right"
label-width=
"70px"
>
<ElFormItem>
<el-select
v-model=
"searchForm.timeType"
...
...
@@ -139,7 +145,7 @@
<el-select
v-model=
"searchForm.order"
clearable
style=
"width: 1
00px; margin-right:
5px"
style=
"width: 1
2
5px"
placeholder=
"排序类型"
>
<el-option
value=
"asc"
label=
"正序"
></el-option>
...
...
src/views/order/orderTracking/index.vue
View file @
99f0e989
...
...
@@ -426,7 +426,13 @@ const submitExportForm = async () => {
try
{
await
exportPodUSInfo
({
...
params
,
...(
resourceType
===
2
?
searchForm
.
value
:
{}),
...(
resourceType
===
2
?
{
...
searchForm
.
value
,
startTime
:
timeRange
.
value
?.[
0
]
||
null
,
endTime
:
timeRange
.
value
?.[
1
]
||
null
,
}
:
{}),
})
ElMessage
.
success
(
'请求成功,请稍后到右上角[我的下载]中查看'
)
exportVisible
.
value
=
false
...
...
@@ -695,7 +701,14 @@ onMounted(() => {
<split-div
otherSize=
"35"
>
<template
#
top
>
<el-card>
<ElForm
:model=
"searchForm"
size=
"default"
inline
class=
"search-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
class=
"search-form"
label-position=
"right"
label-width=
"90px"
>
<ElFormItem
label=
"仓库"
>
<ElSelect
v-model=
"searchForm.warehouseId"
...
...
@@ -1197,4 +1210,12 @@ onMounted(() => {
}
}
}
.search-form
{
::v-deep
.el-radio-button
{
width
:
75px
;
.el-radio-button__inner
{
width
:
100%
;
}
}
}
</
style
>
src/views/order/orderTracking/indexcn.vue
View file @
99f0e989
...
...
@@ -424,7 +424,13 @@ const submitExportForm = async () => {
try
{
await
exportPodCnInfo
({
...
params
,
...(
resourceType
===
2
?
searchForm
.
value
:
{}),
...(
resourceType
===
2
?
{
...
searchForm
.
value
,
startTime
:
timeRange
.
value
?.[
0
]
||
null
,
endTime
:
timeRange
.
value
?.[
1
]
||
null
,
}
:
{}),
})
ElMessage
.
success
(
'请求成功,请稍后到右上角[我的下载]中查看'
)
exportVisible
.
value
=
false
...
...
@@ -680,7 +686,14 @@ onMounted(() => {
<split-div
otherSize=
"35"
>
<template
#
top
>
<el-card>
<ElForm
:model=
"searchForm"
size=
"default"
inline
class=
"search-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
class=
"search-form"
label-position=
"right"
label-width=
"90px"
>
<ElFormItem
label=
"仓库"
>
<ElSelect
v-model=
"searchForm.warehouseId"
...
...
@@ -1166,4 +1179,12 @@ onMounted(() => {
}
}
}
.search-form
{
::v-deep
.el-radio-button
{
width
:
75px
;
.el-radio-button__inner
{
width
:
100%
;
}
}
}
</
style
>
src/views/order/pod/index.vue
View file @
99f0e989
<
template
>
<div
class=
"card flex-column h-100 overflow-hidden"
>
<div
class=
"header-filter-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
>
<ElFormItem>
<el-select
v-model=
"searchForm.timeType"
style=
"width: 100px; margin-right: 5px"
clearable
placeholder=
"时间类型"
>
<el-option
:value=
"1"
label=
"创建时间"
></el-option>
<el-option
:value=
"2"
label=
"确认时间"
></el-option>
<el-option
:value=
"3"
label=
"完成时间"
></el-option>
<!--
<el-option
:value=
"4"
label=
"发货时间"
></el-option>
-->
</el-select>
<el-date-picker
v-model=
"timeRange"
:default-time=
"[
new Date(0, 0, 0, 0, 0, 0),
new Date(0, 0, 0, 23, 59, 59),
]"
placeholder=
"收货人"
value-format=
"YYYY-MM-DD HH:mm:ss"
type=
"datetimerange"
style=
"width: 280px"
:shortcuts=
"pickerOptions.shortcuts"
start-placeholder=
"开始时间"
end-placeholder=
"结束时间"
clearable
>
</el-date-picker>
</ElFormItem>
<ElForm
:model=
"searchForm"
size=
"default"
inline
label-position=
"right"
label-width=
"70px"
>
<ElFormItem
label=
"客户"
>
<el-select
v-model=
"searchForm.userMark"
clearable
filterable
style=
"width: 1
0
0px"
style=
"width: 1
5
0px"
placeholder=
"客户"
>
<el-option
...
...
@@ -77,7 +54,7 @@
v-model
.
trim=
"searchForm.sku"
placeholder=
" SKU"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
></ElInput>
</ElFormItem>
<!--
<ElFormItem
label=
"发货单号"
>
...
...
@@ -85,7 +62,7 @@
v-model=
"searchForm.shipmentNumber"
placeholder=
"发货单号"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
/>
</ElFormItem>
-->
<ElFormItem
label=
"生产单号"
>
...
...
@@ -93,7 +70,7 @@
v-model=
"searchForm.factorySubOrderNumber"
placeholder=
"定制生产单号"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
/>
</ElFormItem>
<ElFormItem
label=
"订单号"
>
...
...
@@ -101,7 +78,7 @@
v-model=
"searchForm.factoryOrderNumber"
placeholder=
"定制订单号"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
/>
</ElFormItem>
<ElFormItem
label=
"店铺单号"
>
...
...
@@ -109,7 +86,7 @@
v-model=
"searchForm.shopNumber"
placeholder=
"店铺单号"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
/>
</ElFormItem>
<ElFormItem
label=
"素材ID"
>
...
...
@@ -117,7 +94,7 @@
v-model
.
trim=
"searchForm.productionFileId"
placeholder=
"素材ID"
clearable
style=
"width: 1
3
0px"
style=
"width: 1
5
0px"
></ElInput>
</ElFormItem>
<ElFormItem
label=
"内部标签"
>
...
...
@@ -125,14 +102,14 @@
v-model
.
trim=
"searchForm.internalMemo"
placeholder=
"内部标签"
clearable
style=
"width: 1
0
0px"
style=
"width: 1
5
0px"
></ElInput>
</ElFormItem>
<ElFormItem
label=
"排序"
>
<el-select
v-model=
"searchForm.order"
clearable
style=
"width:
8
0px"
style=
"width:
15
0px"
placeholder=
"排序类型"
>
<el-option
value=
"asc"
label=
"正序"
></el-option>
...
...
@@ -143,7 +120,7 @@
<el-select
v-model=
"searchForm.customizedQuantity"
clearable
style=
"width: 1
0
0px"
style=
"width: 1
5
0px"
placeholder=
"定制类型"
>
<el-option
value=
"single"
label=
"单面"
></el-option>
...
...
@@ -156,7 +133,7 @@
clearable
filterable
placeholder=
"尺码类型"
style=
"width: 1
0
0px"
style=
"width: 1
5
0px"
>
<el-option
v-for=
"item in sizeList"
...
...
@@ -167,6 +144,35 @@
</ElSelect>
</ElFormItem>
<ElFormItem>
<el-select
v-model=
"searchForm.timeType"
style=
"width: 100px; margin-right: 5px"
clearable
placeholder=
"时间类型"
>
<el-option
:value=
"1"
label=
"创建时间"
></el-option>
<el-option
:value=
"2"
label=
"确认时间"
></el-option>
<el-option
:value=
"3"
label=
"完成时间"
></el-option>
<!--
<el-option
:value=
"4"
label=
"发货时间"
></el-option>
-->
</el-select>
<el-date-picker
v-model=
"timeRange"
:default-time=
"[
new Date(0, 0, 0, 0, 0, 0),
new Date(0, 0, 0, 23, 59, 59),
]"
placeholder=
"收货人"
value-format=
"YYYY-MM-DD HH:mm:ss"
type=
"datetimerange"
style=
"width: 280px"
:shortcuts=
"pickerOptions.shortcuts"
start-placeholder=
"开始时间"
end-placeholder=
"结束时间"
clearable
>
</el-date-picker>
</ElFormItem>
<ElFormItem>
<ElButton
type=
"primary"
@
click=
"loadDiffList"
>
查询
</ElButton>
</ElFormItem>
<ElFormItem
v-if=
"status === 'TO_BE_CONFIRMED'"
>
...
...
src/views/order/podCN/SuperPodMakeOrder.vue
View file @
99f0e989
...
...
@@ -99,10 +99,9 @@
<
template
#
image=
"{ row }"
>
<div
style=
"display: flex; flex-wrap: nowrap"
v-if=
"row.previewImgs?.length"
>
<div
v-for=
"img in row.pr
eviewImgs
"
v-for=
"img in row.pr
oductMark!=='normal'?row.previewImgs:[
{url:row.variantImage}]
"
:key="img"
@click.stop="handleCurrentChange(img.url)"
style="cursor: pointer; margin-right: 5px; flex: 1"
...
...
@@ -157,6 +156,12 @@
@
click=
"podOrderDetailsData && print(podOrderDetailsData, true)"
>
手动打印
</ElButton
>
<ElButton
type=
"primary"
@
click=
"printNormal"
>
普货拣货
</ElButton
>
<ElButton
type=
"success"
@
click=
"handlePrintFinish"
>
打单完成
</ElButton
>
...
...
@@ -220,11 +225,13 @@ import {
clearSuperAllBoxApi
,
getSuperPodBoxListApi
,
submitSuperInspectionApi
,
printNormalPdf
,
}
from
'@/api/podCnOrder'
import
useUserStore
from
'@/store/user'
import
{
Check
}
from
'@element-plus/icons-vue'
import
socket
from
'@/utils/cnSuperWebsocket'
import
{
ElMessage
}
from
'element-plus'
import
{
filePath
}
from
'@/api/axios.ts'
const
{
getCLodop
}
=
useLodop
()
const
userStore
=
useUserStore
()
...
...
@@ -268,31 +275,41 @@ const podOrderDetailsColumns = computed(() => [
// align: 'center',
// },
{
label
:
'库存SKU'
,
prop
:
'thirdSkuCode'
,
width
:
180
,
align
:
'center'
,
},
{
label
:
'variant SKU'
,
prop
:
'variantSku'
,
width
:
1
4
0
,
width
:
1
5
0
,
align
:
'center'
,
},
{
label
:
'商品名称'
,
width
:
200
,
prop
:
'productName'
,
},
{
label
:
'购买数量'
,
prop
:
'purchaseNumber'
,
width
:
90
,
fixed
:
'right'
,
prop
:
'purchaseNumber'
,
align
:
'center'
,
},
{
label
:
'拣货数量'
,
prop
:
'count'
,
width
:
90
,
fixed
:
'right'
,
align
:
'center'
,
},
{
label
:
'验证结果'
,
slot
:
'verifyResult'
,
fixed
:
'right'
,
width
:
90
,
align
:
'center'
,
},
...
...
@@ -374,7 +391,7 @@ watch(
(
val
)
=>
{
if
(
val
&&
val
.
productList
?.
length
)
val
.
productList
.
forEach
((
el
)
=>
{
if
(
!
el
.
previewImgs
)
el
.
previewImgs
=
JSON
.
parse
(
el
.
imageAry
)
if
(
!
el
.
previewImgs
)
el
.
previewImgs
=
JSON
.
parse
(
el
.
imageAry
||
'[]'
)
})
},
{
deep
:
true
},
...
...
@@ -398,7 +415,7 @@ const renderItemBox = (bool: boolean) => {
if
(
!
boxItem
)
boxItem
=
{
data
:
{
productList
:
[]
}
}
const
{
data
}
=
boxItem
data
?.
productList
?.
forEach
((
el
)
=>
{
if
(
!
el
.
previewImgs
)
el
.
previewImgs
=
JSON
.
parse
(
el
.
imageAry
)
if
(
!
el
.
previewImgs
)
el
.
previewImgs
=
JSON
.
parse
(
el
.
imageAry
||
'[]'
)
})
if
(
!
data
)
{
renderLock
=
false
...
...
@@ -467,6 +484,30 @@ const messageChange = (data: WebSocketMessage) => {
setPodBoxList
(
more
)
}
}
const
printNormal
=
async
()
=>
{
const
arr
:
(
number
|
undefined
)[]
=
[];
(
podBoxList
.
value
||
[]).
forEach
((
item
:
PodMakeOrderData
)
=>
{
if
(
item
.
data
)
{
if
(
item
.
data
.
productList
&&
item
.
data
.
productList
.
length
>
0
)
{
const
flag
=
item
.
data
.
productList
.
some
((
item1
)
=>
{
return
item1
.
productMark
==
'normal'
})
if
(
flag
)
{
arr
?.
push
(
item
.
data
?.
id
)
}
}
}
})
if
(
!
arr
.
length
)
{
ElMessage
.
warning
(
'暂无可打印的普货拣货单'
)
return
}
const
res
=
await
printNormalPdf
(
arr
.
join
())
ElMessage
.
success
(
'操作成功'
)
window
.
open
(
filePath
+
res
.
message
)
}
const
setPodBoxList
=
(
data
:
WebSocketMessage
)
=>
{
const
obj
=
data
.
txt
if
(
obj
&&
typeof
obj
===
'string'
)
{
...
...
@@ -618,6 +659,16 @@ const initOrderDetailBox = async () => {
ElMessage
.
warning
(
res
.
message
)
return
}
res
.
data
.
forEach
(
r
=>
{
r
.
data
?.
productList
?.
forEach
(
d
=>
{
if
(
d
.
productMark
===
'normal'
)
{
d
.
previewImgs
=
[{
url
:
d
.
variantImage
||
''
}]
}
else
{
if
(
!
d
.
previewImgs
)
d
.
previewImgs
=
JSON
.
parse
(
d
.
imageAry
||
'[]'
)
}
})
})
orderStore
.
setPodBoxList
({
boxList
:
res
.
data
,
factoryNo
,
...
...
@@ -869,7 +920,8 @@ const clearAllBox = async () => {
}
const
handleRowClick
=
(
row
:
ProductList
)
=>
{
console
.
log
(
907
,
row
)
coverImage
.
value
=
row
.
previewImgs
?.[
0
]?.
url
||
''
const
previewImages
=
row
.
productMark
!==
'normal'
?
row
.
previewImgs
:[{
url
:
row
.
variantImage
}]
coverImage
.
value
=
previewImages
?.[
0
]?.
url
||
''
productionOrderRef
.
value
.
focus
()
}
const
handleCurrentChange
=
(
url
:
string
)
=>
{
...
...
src/views/order/podCN/index.vue
View file @
99f0e989
<
template
>
<div
class=
"card flex-column h-100 overflow-hidden"
>
<div
class=
"header-filter-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
>
<ElForm
class=
"search-form"
:model=
"searchForm"
size=
"default"
inline
label-position=
"right"
label-width=
"70px"
>
<ElFormItem
label=
"仓库"
>
<ElSelect
v-model=
"searchForm.warehouseId"
...
...
@@ -120,7 +127,7 @@
<el-select
v-model=
"searchForm.order"
clearable
style=
"width: 1
0
0px"
style=
"width: 1
5
0px"
placeholder=
"排序类型"
>
<el-option
value=
"asc"
label=
"正序"
></el-option>
...
...
@@ -346,6 +353,22 @@
></ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem
label=
"订单来源"
>
<ElSelect
v-model=
"searchForm.source"
placeholder=
"请选择"
clearable
:teleported=
"false"
style=
"width: 150px"
>
<ElOption
v-for=
"(item, index) in sourceList"
:key=
"index"
:value=
"item.id"
:label=
"item.name"
></ElOption>
</ElSelect>
</ElFormItem>
</ElForm>
<template
#
reference
>
<el-button
type=
"warning"
@
click=
"searchVisible = !searchVisible"
>
...
...
@@ -1320,6 +1343,19 @@
</el-icon>
</div>
<div
class=
"order-detail-item"
>
<span
class=
"order-detail-item-label"
>
订单来源:
</span>
<span
class=
"order-detail-item-value"
>
{{
row
.
source
?
{
'jomall-erp'
:
'erp推送'
,
'third-party'
:
'第三方推送'
,
}
[
row
.
source
as
'jomall-erp'
|
'third-party'
]
:
''
}}
<
/span
>
<
/div
>
<
div
class
=
"order-detail-item"
>
<
span
class
=
"order-detail-item-label"
>
总克重
:
<
/span
>
<
span
v
-
if
=
"row.weight"
class
=
"order-detail-item-value"
>
{{
row
.
weight
}}
g
...
...
@@ -2613,6 +2649,17 @@ const exportForm = ref({
resource
:
''
,
}
)
const
sourceList
=
[
{
name
:
'erp推送'
,
id
:
'jomall-erp'
,
}
,
{
name
:
'第三方推送'
,
id
:
'third-party'
,
}
,
]
const
exportData
=
()
=>
{
exportVisible
.
value
=
true
}
...
...
@@ -2644,11 +2691,20 @@ const submitExportForm = async () => {
console
.
error
(
'未知的资源类型:'
,
resourceType
)
}
try
{
const
res
=
await
exportPodCnInfo
({
await
exportPodCnInfo
({
...
params
,
...(
resourceType
===
2
?
searchForm
.
value
:
{
}
),
...(
resourceType
===
2
?
{
...
searchForm
.
value
,
startTime
:
timeRange
.
value
?.[
0
]
||
null
,
endTime
:
timeRange
.
value
?.[
1
]
||
null
,
}
:
{
}
),
status
:
'COMPLETE'
,
}
)
window
.
open
(
filePath
+
res
.
message
,
'_blank'
)
ElMessage
.
success
(
'请求成功,请稍后到右上角[我的下载]中查看'
)
// window.open(filePath + res.message, '_blank')
exportVisible
.
value
=
false
exportLoading
.
value
=
false
}
catch
(
e
)
{
...
...
@@ -5578,6 +5634,14 @@ useRouter().beforeEach((to, from, next) => {
color
:
white
;
font
-
weight
:
bold
;
}
.
search
-
form
{
::
v
-
deep
.
el
-
radio
-
button
{
width
:
75
px
;
.
el
-
radio
-
button__inner
{
width
:
100
%
;
}
}
}
<
/style
>
<
style
lang
=
"scss"
>
.
customize
-
select
-
style
{
...
...
src/views/order/podUs/index.vue
View file @
99f0e989
<
template
>
<div
class=
"card flex-column h-100 overflow-hidden"
>
<div
class=
"header-filter-form"
>
<ElForm
:model=
"searchForm"
size=
"default"
inline
>
<ElForm
class=
"search-form"
label-position=
"right"
label-width=
"70px"
:model=
"searchForm"
size=
"default"
inline
>
<!--
<div>
-->
<ElFormItem
label=
"仓库"
>
<ElSelect
...
...
@@ -54,7 +61,7 @@
collapse-tags
collapse-tags-tooltip
placeholder=
"请输入工艺"
style=
"width:
23
0px"
style=
"width:
15
0px"
>
<el-option
v-for=
"item in craftList"
...
...
@@ -314,6 +321,38 @@
>
</ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem
label=
"物流方式"
>
<ElSelect
v-model=
"searchForm.logisticsWayId"
placeholder=
"请选择"
clearable
:teleported=
"false"
style=
"width: 150px"
>
<ElOption
v-for=
"(item, index) in logisticsWayList"
:key=
"index"
:value=
"item.id"
:label=
"item.name"
></ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem
label=
"订单来源"
>
<ElSelect
v-model=
"searchForm.source"
placeholder=
"请选择"
clearable
:teleported=
"false"
style=
"width: 150px"
>
<ElOption
v-for=
"(item, index) in sourceList"
:key=
"index"
:value=
"item.id"
:label=
"item.name"
></ElOption>
</ElSelect>
</ElFormItem>
</ElForm>
<template
#
reference
>
<el-button
type=
"warning"
@
click=
"searchVisible = !searchVisible"
>
...
...
@@ -1498,9 +1537,10 @@
<span
class=
"order-detail-item-value"
>
{{
row
.
source
?
{
'jomall-erp'
:
'erp'
,
'third-party'
:
'第三方推送'
}
[
row
.
source
as
'jomall-erp'
|
'third-party'
]
?
{
'jomall-erp'
:
'erp推送'
,
'third-party'
:
'第三方推送'
,
}
[
row
.
source
as
'jomall-erp'
|
'third-party'
]
:
''
}}
<
/span
>
...
...
@@ -2890,6 +2930,7 @@ import {
updateTrackingNumberAndRegister
,
countTrackRegisterApi
,
getCustomTagListApi
,
getLogisticsWayApi
,
}
from
'@/api/podUsOrder'
import
{
BaseRespData
}
from
'@/types/api'
...
...
@@ -2959,9 +3000,20 @@ declare global {
responseBody
?:
unknown
}
}
const
sourceList
=
[
{
name
:
'erp推送'
,
id
:
'jomall-erp'
,
}
,
{
name
:
'第三方推送'
,
id
:
'third-party'
,
}
,
]
const
tabsNav
=
ref
<
Tab
[]
>
()
const
isAuto
=
ref
(
true
)
const
countryList
=
ref
([])
const
logisticsWayList
=
ref
<
{
name
:
string
;
id
:
number
}
[]
>
([])
const
currentRow
=
ref
<
AddressInfo
>
({
receiverName
:
''
,
receiverPhone
:
''
,
...
...
@@ -3042,7 +3094,13 @@ const submitExportForm = async () => {
try
{
await
exportPodUSInfo
({
...
params
,
...(
resourceType
===
2
?
searchForm
.
value
:
{
}
),
...(
resourceType
===
2
?
{
...
searchForm
.
value
,
startTime
:
timeRange
.
value
?.[
0
]
||
null
,
endTime
:
timeRange
.
value
?.[
1
]
||
null
,
}
:
{
}
),
}
)
ElMessage
.
success
(
'请求成功,请稍后到右上角[我的下载]中查看'
)
exportVisible
.
value
=
false
...
...
@@ -3109,6 +3167,8 @@ const detailData = ref({})
const
[
searchForm
,
resetSearchForm
]
=
useValue
<
SearchForm
>
({
timeType
:
1
,
shopNumber
:
''
,
source
:
''
,
logisticsWayId
:
null
,
shipmentType
:
''
,
userMark
:
''
,
processNumber
:
''
,
...
...
@@ -6191,7 +6251,14 @@ const getTagName = (row: ProductList) => {
:
''
}
const
getLogisticsWay
=
async
()
=>
{
const
{
data
}
=
await
getLogisticsWayApi
()
logisticsWayList
.
value
=
data
}
getPermission
()
getLogisticsWay
()
const
globalProperties
=
getCurrentInstance
()?.
appContext
.
config
.
globalProperties
// 获取全局挂载
const
isPermissionBtn
=
globalProperties
?.
$isPermissionBtn
...
...
@@ -6561,6 +6628,14 @@ useRouter().beforeEach((to, from, next) => {
font
-
size
:
12
px
;
}
}
.
search
-
form
{
::
v
-
deep
.
el
-
radio
-
button
{
width
:
75
px
;
.
el
-
radio
-
button__inner
{
width
:
100
%
;
}
}
}
<
/style
>
<
style
lang
=
"scss"
>
.
customize
-
select
-
style
{
...
...
tsconfig.json
View file @
99f0e989
...
...
@@ -6,7 +6,7 @@
"module"
:
"ESNext"
,
"lib"
:
[
"ES2020"
,
"DOM"
,
"DOM.Iterable"
],
"skipLibCheck"
:
true
,
"types"
:[],
/*
Bundler
mode
*/
"moduleResolution"
:
"bundler"
,
"allowImportingTsExtensions"
:
true
,
...
...
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