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
888af742
Commit
888af742
authored
Jun 11, 2026
by
qinjianhui
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' into 'master'
Dev See merge request
!212
parents
acdec884
3bbd5f32
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
640 additions
and
198 deletions
+640
-198
components.d.ts
+0
-1
src/api/cancelOrderProcess.ts
+12
-4
src/api/factoryOrderNew.ts
+15
-0
src/api/warehouse.ts
+1
-1
src/router/menu.ts
+5
-5
src/types/api/warehouse.ts
+2
-0
src/views/order/cancelOrderProcess/index.vue
+84
-34
src/views/order/components/FastProduction.vue
+161
-36
src/views/order/factoryOrderNew/index.vue
+326
-105
src/views/order/podUs/PodMakeOrder.vue
+34
-5
vite.config.ts
+0
-7
No files found.
components.d.ts
View file @
888af742
...
...
@@ -54,7 +54,6 @@ declare module 'vue' {
ElTag
:
typeof
import
(
'element-plus/es'
)[
'ElTag'
]
ElTimeline
:
typeof
import
(
'element-plus/es'
)[
'ElTimeline'
]
ElTimelineItem
:
typeof
import
(
'element-plus/es'
)[
'ElTimelineItem'
]
ElTimePicker
:
typeof
import
(
'element-plus/es'
)[
'ElTimePicker'
]
ElTooltip
:
typeof
import
(
'element-plus/es'
)[
'ElTooltip'
]
ElTree
:
typeof
import
(
'element-plus/es'
)[
'ElTree'
]
ElTreeSelect
:
typeof
import
(
'element-plus/es'
)[
'ElTreeSelect'
]
...
...
src/api/cancelOrderProcess.ts
View file @
888af742
...
...
@@ -2,6 +2,7 @@ import axios from './axios'
import
type
{
BasePaginationData
,
BaseRespData
}
from
'@/types/api'
import
type
{
CancelOrderProcessStateGroupMap
}
from
'@/types/api/cancelOrderProcess'
import
type
{
operateOrderListData
}
from
'@/types/api/factoryOrderNew'
import
{
InterskuList
}
from
'@/types/api/warehouse'
function
normalizePodOrderQueryPayload
(
data
:
Record
<
string
,
unknown
>
,
...
...
@@ -20,7 +21,7 @@ function normalizePodOrderQueryPayload(
export
function
getCancelOrderProcessStateGroupMapApi
()
{
return
axios
.
get
<
never
,
BaseRespData
<
CancelOrderProcessStateGroupMap
>>
(
'factory/podOrderOperation
ForReclaim/findStateGroupM
ap'
,
'factory/podOrderOperation
/find-state-group-m
ap'
,
)
}
...
...
@@ -32,13 +33,13 @@ export function getCancelOrderProcessListApi(
)
{
const
body
=
normalizePodOrderQueryPayload
({
...
data
})
return
axios
.
post
<
never
,
BasePaginationData
<
operateOrderListData
>>
(
'factory/podOrderOperation
ForReclaim/list_
page'
,
'factory/podOrderOperation
/list-
page'
,
{
...
body
,
currentPage
,
pageSize
,
alreadyInStock
},
)
}
export
function
getOperationInfoByNoApi
(
operationNo
:
string
)
{
return
axios
.
get
<
never
,
BaseRespData
<
operateOrderListData
>>
(
`factory/podOrderOperation
ForReclaim/getByOperationN
o?operationNo=
${
operationNo
}
`
,
`factory/podOrderOperation
/get-by-operation-n
o?operationNo=
${
operationNo
}
`
,
)
}
export
function
completeDeliveryByCancelOrderProcessApi
(
data
:
{
...
...
@@ -47,7 +48,14 @@ export function completeDeliveryByCancelOrderProcessApi(data: {
warehouseId
:
number
})
{
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
'factory/podOrderOperation
ForReclaim/storeAfterS
can'
,
'factory/podOrderOperation
/store-after-s
can'
,
data
,
)
}
export
function
getBySkuAndUserMarkAndInboundTypeApi
(
operationNo
:
string
[])
{
return
axios
.
post
<
never
,
BaseRespData
<
InterskuList
[]
>>
(
'factory/podOrderOperation/get-product-by-operation-no'
,
operationNo
,
)
}
src/api/factoryOrderNew.ts
View file @
888af742
...
...
@@ -535,6 +535,14 @@ export function completeDeliveryApi(ids: (number | string)[]) {
)
}
// 生产扫码
export
function
productionScanApi
(
id
:
number
|
string
,
status
:
string
)
{
return
axios
.
get
<
never
,
BaseRespData
<
never
>>
(
'factory/podOrderOperation/scan-produce'
,
{
params
:
{
id
,
status
}
},
)
}
export
function
applyForProductByIdApi
(
id
:
string
,
url
:
string
)
{
return
axios
.
get
<
never
,
BaseRespData
<
operateOrderListData
[]
>>
(
url
,
{
params
:
{
podProductId
:
id
},
...
...
@@ -550,6 +558,13 @@ export function getByOperationNoLogApi(operationNo: string) {
)
}
// 校验库存
export
function
checkInventoryApi
(
id
:
number
|
string
,
status
:
string
)
{
return
axios
.
get
<
never
,
BaseRespData
<
never
>>
(
'factory/podOrderOperation/check-inventory'
,
{
params
:
{
id
,
status
}
},
)
}
export
function
listByNoPodOrderApi
(
params
:
{
type
:
string
no
:
string
...
...
src/api/warehouse.ts
View file @
888af742
...
...
@@ -394,7 +394,7 @@ export function rejectInRecordApi({
)
}
export
function
addInRecordApi
(
form
:
InterWarehouseDetail
)
{
return
axios
.
post
<
never
,
BaseRespData
<
never
>>
(
return
axios
.
post
<
never
,
BaseRespData
<
unknown
>>
(
'factory/warehouseInRecord/add'
,
{
...
form
,
...
...
src/router/menu.ts
View file @
888af742
...
...
@@ -151,11 +151,11 @@ const menu: MenuItem[] = [
id
:
12
,
label
:
'工厂订单(NEW)'
,
},
//
{
//
index: '/order/cancel-order-process',
//
id: 13,
//
label: '取消后订单处理',
//
},
{
index
:
'/order/cancel-order-process'
,
id
:
13
,
label
:
'取消后订单处理'
,
},
],
},
{
...
...
src/types/api/warehouse.ts
View file @
888af742
...
...
@@ -123,6 +123,8 @@ export interface InterskuList {
remark
?:
string
|
null
currencyName
?:
string
|
null
currencyCode
?:
string
|
null
buyStored
?:
number
|
null
totalPrice
?:
number
|
null
}
export
interface
ILocation
{
id
?:
number
...
...
src/views/order/cancelOrderProcess/index.vue
View file @
888af742
...
...
@@ -327,6 +327,7 @@
</div>
<FastProduction
v-model:detail-visible=
"detailVisible"
:dialog-title=
"dialogTitle"
:is-new-order=
"true"
:detail-data=
"detailData"
:fast-key=
"fastKey"
...
...
@@ -385,6 +386,7 @@ import {
getCancelOrderProcessStateGroupMapApi
,
getOperationInfoByNoApi
,
completeDeliveryByCancelOrderProcessApi
,
getBySkuAndUserMarkAndInboundTypeApi
,
}
from
'@/api/cancelOrderProcess'
import
type
{
CardLayoutListFetcher
}
from
'@/types/api/factoryOrderNew'
import
LogisticsWaySelect
from
'@/views/logistics/components/LogisticsWaySelect'
...
...
@@ -393,7 +395,6 @@ import ProductTypeFilter from '../factoryOrderNew/component/ProductTypeFilter.vu
import
{
CaretBottom
,
CaretTop
}
from
'@element-plus/icons-vue'
import
{
normalizeProductMarkListForQuery
}
from
'../factoryOrderNew/utils/productMarkQuery'
import
FastProduction
from
'../components/FastProduction.vue'
import
{
ResultInfoDataItem
}
from
'@/types/api/order/common'
import
{
ElButton
}
from
'element-plus'
import
ReceiptProductDialog
from
'@/views/warehouse/components/ReceiptProductDialog.vue'
import
{
useValue
}
from
'@/utils/hooks/useValue'
...
...
@@ -412,6 +413,7 @@ import {
warehouseInfoGetAll
,
}
from
'@/api/warehouse'
import
type
{
CancelOrderProcessStateGroupMap
}
from
'@/types/api/cancelOrderProcess'
import
BigNumber
from
'bignumber.js'
const
cardLayoutRef
=
ref
()
...
...
@@ -545,23 +547,14 @@ const completeOperationById = (_: number[], detail: Record<string, unknown>) =>
warehouseId
:
detail
.
warehouseId
as
number
,
inboundType
:
fastInboundType
.
value
,
})
const
handleFastProductionSuccess
=
(
data
:
ResultInfoDataItem
[])
=>
{
const
result
=
data
[
0
]
if
(
!
result
.
status
)
{
ElMessageBox
.
alert
(
`操作单号
${
result
.
factoryOrderNumber
}
${
result
.
message
}
`
,
'提示'
,
{
type
:
'error'
,
},
)
return
}
const
handleFastProductionSuccess
=
()
=>
{
ElMessage
.
success
(
'入库成功'
)
}
const
fastClose
=
()
=>
{
detailVisible
.
value
=
false
if
(
fastKey
.
value
===
'detail'
)
return
search
()
loadOrderStatusCounts
()
}
const
{
userMarkList
,
...
...
@@ -614,7 +607,10 @@ const { skuData, setCostPrice, filterSkuData } = useReceiptProductDialog({
selectSku
:
receiptSelectSku
,
userMarkList
:
receiptUserMarkList
,
})
function
mapInterskuToProduct
(
val
:
InterskuList
):
InterProductList
{
function
mapInterskuToProduct
(
val
:
InterskuList
,
type
:
'completeProduction'
|
'embryoInStock'
,
):
InterProductList
{
const
warehouseSku
=
val
.
warehouseSku
||
val
.
sku
||
''
const
skuNameVal
=
val
.
skuName
||
val
.
productName
||
''
let
customerId
:
number
|
null
=
null
...
...
@@ -622,6 +618,16 @@ function mapInterskuToProduct(val: InterskuList): InterProductList {
const
n
=
Number
(
val
.
customerId
)
if
(
!
Number
.
isNaN
(
n
))
customerId
=
n
}
if
(
type
===
'embryoInStock'
)
{
const
operationList
=
cardSelectList
.
value
.
filter
(
(
r
)
=>
r
.
thirdSkuCode
===
val
.
warehouseSku
,
)
val
.
buyStored
=
operationList
?
operationList
.
length
:
0
}
const
amount
=
new
BigNumber
(
val
.
buyStored
??
0
)
.
multipliedBy
(
val
.
costPrice
??
0
)
.
toFixed
(
2
)
val
.
totalPrice
=
Number
(
amount
)
as
number
return
{
skuImage
:
val
.
skuImage
||
val
.
image
||
''
,
warehouseSku
,
...
...
@@ -630,8 +636,8 @@ function mapInterskuToProduct(val: InterskuList): InterProductList {
locationCode
:
val
.
locationCode
??
''
,
locationId
:
val
.
locationId
??
null
,
costPrice
:
val
.
costPrice
??
null
,
buyStored
:
null
,
totalPrice
:
null
,
buyStored
:
val
.
buyStored
??
null
,
totalPrice
:
val
.
totalPrice
??
null
,
currencyName
:
val
.
currencyName
??
null
,
currencyCode
:
val
.
currencyCode
??
null
,
customerId
,
...
...
@@ -641,20 +647,40 @@ function mapInterskuToProduct(val: InterskuList): InterProductList {
}
const
handleEmbryoInStock
=
async
()
=>
{
if
(
cardSelectList
.
value
.
length
!==
0
)
{
handleEmbryoInStockByCard
()
handleEmbryoInStockByCard
(
'embryoInStock'
)
}
else
{
handleEmbryoInFastStock
(
0
)
}
}
const
dialogTitle
=
computed
(()
=>
{
return
fastKey
.
value
===
'fastReceipt'
?
fastInboundType
.
value
===
1
?
'生产完成-快捷入库'
:
'胚衣-快捷入库'
:
'查看详情'
})
const
handleEmbryoInFastStock
=
(
inboundType
:
number
)
=>
{
fastInboundType
.
value
=
inboundType
fastKey
.
value
=
'fastReceipt'
detailVisible
.
value
=
true
detailData
.
value
=
{}
}
const
handleEmbryoInStockByCard
=
async
()
=>
{
const
firstWid
=
cardSelectList
.
value
[
0
].
warehouseId
if
(
cardSelectList
.
value
.
some
((
r
)
=>
r
.
warehouseId
!==
firstWid
))
{
const
handleEmbryoInStockByCard
=
async
(
type
:
'completeProduction'
|
'embryoInStock'
,
)
=>
{
let
operationList
if
(
type
===
'completeProduction'
)
{
operationList
=
cardSelectList
.
value
.
filter
((
r
)
=>
r
.
inboundType
!==
2
)
if
(
operationList
.
length
===
0
)
{
ElMessage
.
error
(
'客户定制商品,不能入库!'
)
return
}
}
else
{
operationList
=
cardSelectList
.
value
}
fastInboundType
.
value
=
type
===
'completeProduction'
?
1
:
0
const
firstWid
=
operationList
[
0
].
warehouseId
if
(
operationList
.
some
((
r
)
=>
r
.
warehouseId
!==
firstWid
))
{
return
ElMessage
.
error
(
'请选择相同仓库的库存SKU!'
)
}
resetReceiptEditForm
()
...
...
@@ -674,8 +700,7 @@ const handleEmbryoInStockByCard = async () => {
}
}
receiptEditForm
.
value
.
warehouseId
=
firstWid
receiptEditForm
.
value
.
warehouseName
=
cardSelectList
.
value
[
0
]
.
warehouseName
as
string
receiptEditForm
.
value
.
warehouseName
=
operationList
[
0
].
warehouseName
as
string
const
wh
=
warehouseList
.
value
.
find
((
w
)
=>
w
.
id
==
firstWid
)
if
(
wh
)
{
receiptEditForm
.
value
.
warehouseName
=
wh
.
name
...
...
@@ -685,11 +710,16 @@ const handleEmbryoInStockByCard = async () => {
background
:
'rgba(0, 0, 0, 0.3)'
,
})
try
{
const
skus
=
cardSelectList
.
value
.
map
((
r
)
=>
r
.
thirdSkuCode
as
string
)
const
res
=
await
getBySkuAndUserMarkApi
(
firstWid
,
skus
.
join
(
','
),
null
)
const
skus
=
operationList
.
map
((
r
)
=>
r
.
thirdSkuCode
as
string
)
const
res
=
type
===
'embryoInStock'
?
await
getBySkuAndUserMarkApi
(
firstWid
,
skus
.
join
(
','
),
null
)
:
await
getBySkuAndUserMarkAndInboundTypeApi
(
operationList
.
map
((
r
)
=>
r
.
operationNo
as
string
),
)
if
(
res
.
code
!==
200
)
return
otherPurchaseData
.
value
=
res
.
data
.
map
((
item
:
InterskuList
)
=>
mapInterskuToProduct
(
item
),
mapInterskuToProduct
(
item
,
type
),
)
await
fetchReceiptLocationList
(
''
)
const
listRes
=
await
warehouseInfoGetAll
()
...
...
@@ -758,7 +788,17 @@ const handleReceiptSave = async () => {
}
catch
{
return
}
const
arr
=
otherPurchaseData
.
value
const
arr
=
otherPurchaseData
.
value
.
map
((
item
)
=>
{
const
operationForReclaimList
=
cardSelectList
.
value
.
filter
((
r
)
=>
fastInboundType
.
value
===
1
?
`
${
r
.
userMark
}${
r
.
variantSku
}
`
===
item
.
warehouseSku
:
r
.
thirdSkuCode
===
item
.
warehouseSku
,
)
return
{
...
item
,
operationForReclaimList
:
operationForReclaimList
,
}
})
if
(
arr
.
length
===
0
)
{
ElMessage
.
error
(
'请至少选择一条数据'
)
return
...
...
@@ -780,17 +820,31 @@ const handleReceiptSave = async () => {
}
}
const
params
=
{
forNewProduct
:
fastInboundType
.
value
===
1
,
...
receiptEditForm
.
value
,
productList
:
otherPurchaseData
.
value
,
productList
:
arr
,
}
const
loading
=
ElLoading
.
service
({
text
:
'保存中...'
,
background
:
'rgba(0, 0, 0, 0.3)'
,
})
try
{
await
addInRecordApi
(
params
)
ElMessage
.
success
(
'保存成功'
)
const
res
=
await
addInRecordApi
(
params
)
if
(
res
.
code
!==
200
)
return
if
(
res
.
data
&&
Array
.
isArray
(
res
.
data
)
&&
res
.
data
.
length
>
0
)
{
ElMessageBox
.
alert
(
`操作单号:
${
res
.
data
.
map
((
e
:
number
)
=>
e
).
join
(
','
)}
入库失败`
,
'提示'
,
{
type
:
'error'
,
},
)
}
else
{
ElMessage
.
success
(
'保存成功'
)
}
receiptDialogVisible
.
value
=
false
search
()
loadOrderStatusCounts
()
}
catch
(
e
)
{
console
.
error
(
e
)
}
finally
{
...
...
@@ -800,11 +854,7 @@ const handleReceiptSave = async () => {
const
handleProductionCompleteInStock
=
()
=>
{
// 客户定制的单子不能操作生产完成入库,提示:客户定制商品,不能入库!
if
(
cardSelectList
.
value
.
length
!==
0
)
{
if
(
cardSelectList
.
value
.
some
((
r
)
=>
r
.
inboundType
===
2
))
{
ElMessage
.
error
(
'客户定制商品,不能入库!'
)
return
}
handleEmbryoInStockByCard
()
handleEmbryoInStockByCard
(
'completeProduction'
)
}
else
{
handleEmbryoInFastStock
(
1
)
}
...
...
src/views/order/components/FastProduction.vue
View file @
888af742
...
...
@@ -45,7 +45,11 @@
</div>
<div
class=
"right"
>
<div
v-if=
"['fastProduction', 'fastReceipt'].includes(fastKey)"
v-if=
"
['fastProduction', 'fastReceipt', 'productionScan'].includes(
fastKey,
)
"
class=
"input"
>
<el-input
...
...
@@ -70,10 +74,7 @@
{{
detail
?.
userMark
}}
</div>
</div>
<div
:title=
"String(detail?.factoryOrderNumber)"
class=
"div-item"
>
<div
:title=
"String(detail?.factoryOrderNumber)"
class=
"div-item"
>
<span
class=
"div-item-label"
style=
"font-size: 18px"
>
订单号:
</span
>
...
...
@@ -145,8 +146,9 @@
>
<span
class=
"div-item-label"
>
挂起前状态:
</span>
<div
class=
"div-item-value"
>
<ElTag
v-if=
"detail.statusName"
type=
"primary"
>
{{
detail
.
statusName
||
''
}}
</ElTag
>
<ElTag
v-if=
"detail.statusName"
type=
"primary"
>
{{
detail
.
statusName
||
''
}}
</ElTag>
</div>
</div>
<div
...
...
@@ -237,10 +239,13 @@
<div
class=
"btn"
>
<div
:style=
"
{
visibility:
fastKey === 'fastProduction' || fastKey === 'fastReceipt'
? 'visible'
: 'hidden',
visibility: [
'fastProduction',
'fastReceipt',
'productionScan',
].includes(fastKey)
? 'visible'
: 'hidden',
}"
class="btn-sure"
>
...
...
@@ -250,10 +255,19 @@
type=
"success"
@
click=
"changeStatus"
>
{{
fastKey
===
'fastProduction'
?
'生产完成'
:
'快捷入库'
}}
{{
[
'fastProduction'
,
'productionScan'
].
includes
(
fastKey
)
?
'生产完成'
:
'快捷入库'
}}
</el-button>
<div
class=
"check"
>
<el-checkbox
v-model=
"isAutoSure"
>
自动完成上一单
</el-checkbox>
<el-checkbox
v-if=
"fastKey !== 'productionScan'"
v-model=
"isAutoSure"
>
自动完成上一单
</el-checkbox>
</div>
</div>
<div
v-if=
"fastKey !== 'fastReceipt'"
class=
"btn-down"
>
...
...
@@ -311,6 +325,7 @@ import {
downloadMaterialApi
,
}
from
'@/api/podCnOrder'
import
{
cardImages
,
PodOrderRes
}
from
'@/types/api/podCnOrder'
import
{
checkInventoryApi
}
from
'@/api/factoryOrderNew'
import
{
showConfirm
}
from
'@/utils/ui'
import
{
filePath
}
from
'@/api/axios'
import
{
computed
,
ref
,
watch
}
from
'vue'
...
...
@@ -320,10 +335,10 @@ interface HistoryDataItem {
finished
:
boolean
}
const
title
=
computed
(()
=>
{
if
(
props
.
fastKey
===
'fastProduction'
)
{
if
(
[
'fastProduction'
,
'productionScan'
].
includes
(
props
.
fastKey
)
)
{
return
'快捷生产'
}
else
if
(
props
.
fastKey
===
'fastReceipt'
)
{
return
'快捷入库'
return
props
.
dialogTitle
}
else
{
return
'查看详情'
}
...
...
@@ -334,6 +349,7 @@ export type FastProductionDetail = PodOrderRes & {
podOrderNo
?:
string
|
null
podOrderProductId
?:
number
|
null
statusName
?:
string
|
null
productMark
?:
string
|
null
}
const
trackingNumberRef
=
ref
()
const
historyData
=
ref
<
HistoryDataItem
[]
>
([])
...
...
@@ -384,22 +400,22 @@ const props = withDefaults(
completeApi
?:
(
ids
:
number
[],
detail
:
Record
<
string
,
unknown
>
,
trigger
?:
'manual'
|
'auto'
,
)
=>
Promise
<
unknown
>
downloadApi
?:
(
ids
:
number
[],
)
=>
Promise
<
{
code
?:
number
;
message
?:
string
}
>
/** 打开弹框时「自动完成上一单」的初始勾选;默认 false,与原有 podCN 快捷生产一致 */
defaultAutoSure
?:
boolean
/** 为 true 时展示「操作单号」一行,数据字段为 `operationNo`(不影响 podCN 默认) */
showOperationNoRow
?:
boolean
/** 查询无数据时的提示 */
notFoundMessage
?:
string
/** 未生产完成提醒里对单号的称呼,如「生产单号」「操作单号」 */
pendingOrderLabel
?:
string
/** 未扫码时的提示 */
pleaseScanTip
?:
string
/** 扫码输入为空时音频/提示文案 */
searchInputAudioTip
?:
string
/** 是否限制扫码 */
isLimitScan
?:
boolean
/** 限制扫码的提示 */
limitScanMessage
?:
string
dialogTitle
?:
string
}
>
(),
{
type
:
0
,
...
...
@@ -415,11 +431,13 @@ const props = withDefaults(
notFoundMessage
:
'生产单不存在'
,
pendingOrderLabel
:
'生产单号'
,
pleaseScanTip
:
'请扫码生产单号'
,
searchInputAudioTip
:
'请录入生产单号'
,
searchInputAudioTip
:
'请录入生产单号???'
,
isLimitScan
:
false
,
queryApi
:
(
orderNumber
:
string
)
=>
getSubOrderBySubOrderNumber
(
orderNumber
),
completeApi
:
(
ids
:
number
[],
detailData
:
Record
<
string
,
unknown
>
)
=>
productionQueryApi
(
ids
[
0
],
Number
(
detailData
.
podJomallOrderCnId
||
-
1
)),
downloadApi
:
(
ids
:
number
[])
=>
downloadMaterialApi
(
ids
),
dialogTitle
:
''
,
},
)
const
emit
=
defineEmits
([
'update:detailVisible'
,
'close'
,
'onSuccess'
])
...
...
@@ -509,7 +527,9 @@ watch(
const
len
=
historyData
.
value
if
(
len
.
length
>
0
&&
(
props
.
fastKey
===
'fastProduction'
||
props
.
fastKey
===
'fastReceipt'
)
[
'fastProduction'
,
'fastReceipt'
,
'productionScan'
].
includes
(
props
.
fastKey
,
)
)
{
confirmQuery
(
len
,
0
)
}
...
...
@@ -541,7 +561,9 @@ const confirmQuery = (len: HistoryDataItem[], i: number) => {
const
el
=
len
[
i
]
showConfirm
(
`
${
props
.
pendingOrderLabel
}
${
el
.
orderNumber
}
${
props
.
fastKey
===
'fastProduction'
?
'未生产'
:
'未入库'
[
'fastProduction'
,
'productionScan'
].
includes
(
props
.
fastKey
)
?
'未生产'
:
'未入库'
}
完成,取消则不提醒?`
,
{
confirmButtonText
:
'确定'
,
...
...
@@ -553,7 +575,13 @@ const confirmQuery = (len: HistoryDataItem[], i: number) => {
TrackingNumber
.
value
=
el
.
orderNumber
await
trackCodeInput
()
await
setData
(
el
.
orderNumber
)
ElMessage
.
success
(
'生产完成'
)
ElMessage
.
success
(
`
${
[
'fastProduction'
,
'productionScan'
].
includes
(
props
.
fastKey
)
?
'生产完成'
:
'入库完成'
}
`
,
)
if
(
len
[
i
+
1
])
{
confirmQuery
(
len
,
i
+
1
)
}
...
...
@@ -580,21 +608,32 @@ const changeStatus = async () => {
if
(
!
detail
.
value
||
Object
.
keys
(
detail
.
value
).
length
<=
1
)
{
return
ElMessage
.
warning
(
props
.
pleaseScanTip
)
}
showConfirm
(
'确定生产完成?'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
}).
then
(()
=>
{
showConfirm
(
`确定
${
[
'fastProduction'
,
'productionScan'
].
includes
(
props
.
fastKey
)
?
'生产完成'
:
'入库完成'
}
?`
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
},
).
then
(()
=>
{
setData
(
historyKeyFromDetail
(
detail
.
value
))
})
}
const
setData
=
async
(
orderNumber
:
string
)
=>
{
const
setData
=
async
(
orderNumber
:
string
,
trigger
:
'manual'
|
'auto'
=
'manual'
,
)
=>
{
if
(
!
detail
.
value
||
detail
.
value
?.
id
===
-
1
)
return
try
{
const
id
=
detail
.
value
.
id
const
res
=
(
await
props
.
completeApi
(
[
id
],
detail
.
value
as
unknown
as
Record
<
string
,
unknown
>
,
trigger
,
))
as
unknown
as
BaseRespData
<
{
factoryOrderNumber
?:
number
...
...
@@ -618,16 +657,43 @@ const setData = async (orderNumber: string) => {
}
emit
(
'onSuccess'
,
res
.
data
)
playAudio
(
'weight_success'
)
detail
.
value
=
{
id
:
-
1
,
podJomallOrderCnId
:
-
1
,
imgList
:
[]
as
cardImages
[],
if
(
trigger
===
'auto'
)
{
// new 快捷生产:扫码后直接将订单流转至生产中
localStorage
.
setItem
(
props
.
historyStorageKey
,
JSON
.
stringify
([]))
}
else
{
detail
.
value
=
{
id
:
-
1
,
podJomallOrderCnId
:
-
1
,
imgList
:
[]
as
cardImages
[],
}
}
TrackingNumber
.
value
=
''
isDownloadImage
.
value
=
false
trackingNumberRef
.
value
&&
trackingNumberRef
.
value
.
focus
()
}
catch
(
e
)
{
console
.
error
(
e
)
const
err
=
e
as
BaseRespData
<
{
inventory
:
number
producingQuantity
:
number
availableInventory
:
number
thirdSkuCode
?:
string
}
>
if
(
err
?.
code
===
301
)
{
await
ElMessageBox
.
alert
(
`
${
err
.
data
?.
thirdSkuCode
}
库存不足,无法进入生产!请联系仓库管理人员核对库存。
<
br
/>
库存数量:
$
{
err
.
data
?.
inventory
}
,生产中的数量:
$
{
err
.
data
?.
producingQuantity
}
,
<
span
style
=
"color: red"
>
可调配库存:
$
{
err
.
data
?.
availableInventory
}
<
/span>`
,
'提示'
,
{
type
:
'warning'
,
dangerouslyUseHTMLString
:
true
,
},
).
then
(()
=>
{
localStorage
.
setItem
(
props
.
historyStorageKey
,
JSON
.
stringify
([]))
})
}
detail
.
value
=
{
id
:
-
1
,
podJomallOrderCnId
:
-
1
,
...
...
@@ -729,9 +795,10 @@ const trackCodeInput = async () => {
const
orderNumber
=
TrackingNumber
.
value
if
(
isAutoSure
.
value
)
{
if
(
!
[
'productionScan'
].
includes
(
props
.
fastKey
)
&&
isAutoSure
.
value
)
{
await
setData
(
historyData
.
value
[
historyData
.
value
.
length
-
1
].
orderNumber
||
''
,
'auto'
,
)
}
...
...
@@ -742,9 +809,67 @@ const trackCodeInput = async () => {
}
detail
.
value
=
normalizeDetail
(
res
.
data
)
// 扫码后限制
if
(
props
.
isLimitScan
)
{
if
(
detail
.
value
.
productMark
&&
[
'custom_normal'
,
'normal'
].
includes
(
detail
.
value
.
productMark
)
)
{
detail
.
value
=
{
id
:
-
1
,
podJomallOrderCnId
:
-
1
,
imgList
:
[]
}
localStorage
.
setItem
(
props
.
historyStorageKey
,
JSON
.
stringify
([]))
trackingNumberRef
.
value
&&
trackingNumberRef
.
value
.
focus
()
TrackingNumber
.
value
=
''
return
showConfirm
(
props
.
limitScanMessage
||
''
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
})
}
}
if
(
isDownloadImage
.
value
)
{
download
()
}
// 工厂订单new 校验库存 生产扫码
if
(
props
.
fastKey
===
'productionScan'
)
{
try
{
await
checkInventoryApi
(
detail
.
value
.
id
,
String
(
detail
.
value
.
status
??
''
),
)
}
catch
(
inventoryErr
)
{
const
err
=
inventoryErr
as
BaseRespData
<
{
inventory
:
number
producingQuantity
:
number
availableInventory
:
number
thirdSkuCode
?:
string
}
>
if
(
err
?.
code
===
301
)
{
historyData
.
value
=
[]
localStorage
.
setItem
(
props
.
historyStorageKey
,
JSON
.
stringify
([]))
detail
.
value
=
emptyDetail
()
playAudio
(
'weight_search_error'
,
props
.
searchInputAudioTip
)
trackingNumberRef
.
value
&&
trackingNumberRef
.
value
.
focus
()
TrackingNumber
.
value
=
''
await
ElMessageBox
.
alert
(
`
${
err
.
data
?.
thirdSkuCode
}
库存不足,无法进入生产!请联系仓库管理人员核对库存。
<
br
/>
库存数量:
$
{
err
.
data
?.
inventory
}
,生产中的数量:
$
{
err
.
data
?.
producingQuantity
}
,
<
span
style
=
"color: red"
>
可调配库存:
$
{
err
.
data
?.
availableInventory
}
<
/span>`
,
'提示'
,
{
type
:
'warning'
,
dangerouslyUseHTMLString
:
true
,
},
)
return
}
throw
inventoryErr
}
await
setData
(
detail
.
value
.
id
.
toString
(),
'auto'
)
}
playAudio
(
'weight_search_success'
)
trackingNumberRef
.
value
&&
trackingNumberRef
.
value
.
focus
()
...
...
src/views/order/factoryOrderNew/index.vue
View file @
888af742
<
template
>
<div
class=
"page card h-100 flex-gap-10 overflow-hidden flex"
>
<div
class=
"order-status"
>
<ElTree
ref=
"treeRef"
default-expand-all
:expand-on-click-node=
"false"
:default-expanded-keys=
"['ALL']"
:highlight-current=
"true"
node-key=
"status"
:data=
"statusTree"
:props=
"
{ children: 'children', label: 'statusName' }"
class="status-tree"
@node-click="handleStatusNodeClick"
>
<template
#
default=
"
{ node, data }">
<div
class=
"tree-node"
>
<div
class=
"tree-node-label-wrapper"
>
<span
class=
"tree-node-label"
>
{{
data
.
statusName
}}
</span>
<div
class=
"order-status-wrapper"
:class=
"
{ 'is-collapsed': statusSidebarCollapsed }"
>
<div
class=
"order-status"
>
<ElTree
ref=
"treeRef"
default-expand-all
:expand-on-click-node=
"false"
:default-expanded-keys=
"['ALL']"
:highlight-current=
"true"
node-key=
"status"
:data=
"statusTree"
:props=
"
{ children: 'children', label: 'statusName' }"
class="status-tree"
@node-click="handleStatusNodeClick"
>
<template
#
default=
"
{ node, data }">
<div
class=
"tree-node"
>
<div
class=
"tree-node-label-wrapper"
>
<span
class=
"tree-node-label"
>
{{
data
.
statusName
}}
</span>
<span
v-if=
"
data.status !== 'ALL' &&
(data.quantity || data.quantity === 0)
"
class=
"tree-node-count"
>
{{
`(${data.quantity
}
)`
}}
<
/span
>
<
/div
>
<
span
v-if=
"
data.status !== 'ALL' &&
(data.quantity || data.quantity === 0)
"
class=
"tree-node-count"
v
-
if
=
"data.children && data.children.length"
class
=
"tree-node-expand"
@
click
.
stop
=
"toggleExpand(node)"
>
{{
`(${data.quantity
}
)`
}}
<
el
-
icon
><
ArrowUp
v
-
if
=
"node.expanded"
/><
ArrowDown
v
-
else
/></
el
-
icon
>
<
/span
>
<
/div
>
<
span
v
-
if
=
"data.children && data.children.length"
class
=
"tree-node-expand"
@
click
.
stop
=
"toggleExpand(node)"
>
<
el
-
icon
><
ArrowUp
v
-
if
=
"node.expanded"
/><
ArrowDown
v
-
else
/></
el
-
icon
>
<
/span
>
<
/div
>
<
/template
>
<
/ElTree
>
<
/template
>
<
/ElTree
>
<
/div
>
<
div
class
=
"sidebar-toggle"
title
=
"收起/展开"
@
click
=
"toggleStatusSidebar"
>
<
span
class
=
"sidebar-toggle-icon"
:
class
=
"{ 'is-collapsed': statusSidebarCollapsed
}
"
/>
<
/div
>
<
/div
>
<
div
class
=
"order-content flex-1 flex-column overflow-hidden"
>
<
div
v
-
if
=
"!isSpecialLayout"
class
=
"header"
>
...
...
@@ -294,6 +309,26 @@
><
/ElOption
>
<
/ElSelect
>
<
/ElFormItem
>
<
ElFormItem
label
=
"尺码筛选"
>
<
ElSelect
v
-
model
=
"searchForm.size"
multiple
collapse
-
tags
collapse
-
tags
-
tooltip
placeholder
=
"请选择"
clearable
filterable
:
teleported
=
"false"
style
=
"width: 150px"
>
<
ElOption
v
-
for
=
"(item, index) in sizes"
:
key
=
"index"
:
value
=
"item"
:
label
=
"item"
><
/ElOption
>
<
/ElSelect
>
<
/ElFormItem
>
<
ElFormItem
label
=
"客户标签"
>
<
ElSelect
v
-
model
=
"searchForm.tagsIdArr"
...
...
@@ -531,6 +566,7 @@
>
拣胚完成
<
/ElButto
n
>
<
/span
>
<
span
v
-
if
=
"status === 'PENDING_PICK'"
class
=
"item"
>
<
ElButton
type
=
"danger"
@
click
=
"handlePickFail"
>
拣胚失败
<
/ElButton
>
<
/span
>
...
...
@@ -546,7 +582,7 @@
<
/span
>
<
span
v
-
if
=
"status === 'PENDING_PACKING'"
class
=
"item"
>
<
ElButton
type
=
"success"
@
click
=
"handleSeedingWall"
>
播种墙配货
<
/ElButto
n
>
配货打单
<
/ElButto
n
>
<
/span
>
<
span
v
-
if
=
"status === 'PENDING_PACKING'"
class
=
"item"
>
...
...
@@ -563,8 +599,8 @@
>
申请补胚
<
/ElButto
n
>
<
/span
>
<
span
v
-
if
=
"
status === 'IN_PRODUCTION'
"
class
=
"item"
>
<
ElButton
type
=
"success"
@
click
=
"handleQuickProduction"
<
span
v
-
if
=
"
['IN_PRODUCTION'].includes(status)
"
class
=
"item"
>
<
ElButton
type
=
"success"
@
click
=
"handleQuickProduction
()
"
>
快捷生产
<
/ElButto
n
>
<
/span
>
...
...
@@ -756,79 +792,100 @@
>
<
template
#
operation
=
"{ row
}
"
>
<
div
class
=
"main-table-operation"
>
<
ElButton
v
-
if
=
"status === 'PENDING_RECEIVE'"
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"handleSingleConfirmOrder(row)"
>
{{
pendingAcceptSubTab
===
'ACCEPT_FAIL_OUT_OF_STOCK'
?
'重新接单'
:
'接单'
}}
<
/ElButton
>
<
ElButton
<
span
v
-
if
=
"status === 'PENDING_RECEIVE'"
class
=
"item"
>
<
ElButton
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"handleSingleConfirmOrder(row)"
>
{{
pendingAcceptSubTab
===
'ACCEPT_FAIL_OUT_OF_STOCK'
?
'重新接单'
:
'接单'
}}
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"
showPendingLogisticsUpdateAddress() &&
row.shipmentType === 1
"
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"openUpdateReceiverAddress(row)"
class
=
"item"
>
修改地址
<
/ElButton
>
<
ElButton
v
-
if
=
"showChangeLogistics(row)"
type
=
"warning"
link
size
=
"small"
@
click
.
stop
=
"handleChangeLogistics(row)"
>
更换物流方式
<
/ElButton
>
<
ElButton
<
ElButton
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"openUpdateReceiverAddress(row)"
>
修改地址
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"showChangeLogistics(row)"
class
=
"item"
>
<
ElButton
type
=
"warning"
link
size
=
"small"
@
click
.
stop
=
"handleChangeLogistics(row)"
>
更换物流方式
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"showPendingLogisticsUpdateAddress()"
type
=
"success"
link
size
=
"small"
@
click
.
stop
=
"handleRefreshReceiverAddress(row)"
class
=
"item"
>
{{
row
.
shipmentType
===
0
?
'同步物流/地址'
:
'同步地址'
}}
<
/ElButton
>
<
ElButton
<
ElButton
type
=
"success"
link
size
=
"small"
@
click
.
stop
=
"handleRefreshReceiverAddress(row)"
>
{{
row
.
shipmentType
===
0
?
'同步物流/地址'
:
'同步地址'
}}
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"status === 'SUSPEND' && suspendedSubTab !== 1"
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"handleCancelSuspend(row)"
class
=
"item"
>
取消挂起
<
/ElButton
>
<
ElButton
<
ElButton
type
=
"warning"
link
size
=
"small"
@
click
.
stop
=
"handleCancelSuspend(row)"
>
取消挂起
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"status === 'SUSPEND' && suspendedSubTab === 1"
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"handleInterceptionSuccess(row)"
class
=
"item"
>
拦截成功
<
/ElButton
>
<
ElButton
<
ElButton
type
=
"success"
link
size
=
"small"
@
click
.
stop
=
"handleInterceptionSuccess(row)"
>
拦截成功
<
/ElButton
>
<
/span
>
<
span
v
-
if
=
"status === 'SUSPEND' && suspendedSubTab === 1"
type
=
"primary"
link
size
=
"small"
@
click
.
stop
=
"handleInterceptionFail(row)"
class
=
"item"
>
拦截失败
<
/ElButton
>
<
ElButton
type
=
"danger"
link
size
=
"small"
@
click
.
stop
=
"handleInterceptionFail(row)"
>
拦截失败
<
/ElButton
>
<
/span
>
<
/div
>
<
/template
>
<
/TableView
>
...
...
@@ -951,12 +1008,14 @@
:
fast
-
key
=
"fastKey"
:
default
-
auto
-
sure
=
"true"
:
show
-
operation
-
no
-
row
=
"true"
:
is
-
limit
-
scan
=
"isLimitScan"
limit
-
scan
-
message
=
"G和CB类的操作单无效操作"
not
-
found
-
message
=
"操作单不存在"
pending
-
order
-
label
=
"操作单号"
please
-
scan
-
tip
=
"请扫码操作单号"
search
-
input
-
audio
-
tip
=
"请录入操作单号"
history
-
storage
-
key
=
"historyFactoryOrderNewData"
tracking
-
placeholder
=
"扫描枪输入操作单号
,录入下一单本单自动生产完成,最后一单扫两次完成生产
"
tracking
-
placeholder
=
"扫描枪输入操作单号"
:
query
-
api
=
"getOperationByNo"
:
complete
-
api
=
"completeOperationById"
:
download
-
api
=
"downloadOperationById"
...
...
@@ -1136,6 +1195,7 @@ import {
updateReceiverAddressApi
,
updateRemarkApi
,
completeDeliveryApi
,
productionScanApi
,
getByOperationNoLogApi
,
listByNoPodOrderApi
,
orderWeighingPodOrderApi
,
...
...
@@ -1187,6 +1247,11 @@ import { ElTag } from 'element-plus'
const
resultInfo
=
ref
<
ResultInfoDataItem
[]
>
([])
const
resultRefs
=
ref
()
const
statusSidebarCollapsed
=
ref
(
false
)
const
toggleStatusSidebar
=
()
=>
{
statusSidebarCollapsed
.
value
=
!
statusSidebarCollapsed
.
value
}
const
batchManageRef
=
ref
<
InstanceType
<
typeof
BatchManageTable
>>
()
const
waitingRestockRef
=
ref
<
InstanceType
<
typeof
WaitingRestockTable
>>
()
const
cardLayoutRef
=
ref
<
InstanceType
<
typeof
CardLayout
>>
()
...
...
@@ -1205,7 +1270,7 @@ const interceptSuccessForm = ref<{ suspendSussessType: number | undefined }>({
suspendSussessType
:
undefined
,
}
)
const
interceptSuccessRows
=
ref
<
FactoryOrderNewListData
[]
>
([])
const
sizes
=
[
'FS'
,
'XS'
,
'S'
,
'M'
,
'L'
,
'XL'
,
'XXL'
,
'3XL'
,
'4XL'
,
'5XL'
]
const
{
userMarkList
,
receiverCountryList
,
...
...
@@ -1708,7 +1773,7 @@ const mainColumns = computed(() => [
{
prop
:
'operation'
,
label
:
'操作'
,
minWidth
:
3
00
,
minWidth
:
1
00
,
align
:
'center'
,
slot
:
'operation'
,
fixed
:
'right'
,
...
...
@@ -1755,13 +1820,13 @@ const operationOrderColumns = [
key
:
'imageAry'
,
prop
:
'imageAry'
,
label
:
'商品图片'
,
minWidth
:
1
0
0
,
minWidth
:
1
8
0
,
align
:
'center'
,
render
:
(
row
:
operateOrderListData
)
=>
{
const
list
=
parseOperationOrderImageAry
(
row
.
imageAry
)
if
(
!
list
.
length
)
{
return
(
<
div
>
<
div
style
=
"display:flex;gap:4px;"
>
<
el
-
image
src
=
{
row
.
variantImage
}
style
=
"width:50px;height:50px"
...
...
@@ -2816,10 +2881,25 @@ const handleReplenishFail = () => {
}
const
getOperationByNo
=
(
operationNo
:
string
)
=>
getByOperationNoLogApi
(
operationNo
)
as
Promise
<
{
data
?:
unknown
}
>
const
completeOperationById
=
(
ids
:
number
[])
=>
completeDeliveryApi
(
ids
)
const
completeOperationById
=
(
ids
:
number
[],
detailData
?:
Record
<
string
,
unknown
>
,
trigger
:
'manual'
|
'auto'
=
'manual'
,
)
=>
{
if
(
trigger
===
'auto'
)
{
const
detailStatus
=
String
(
detailData
?.
status
??
''
)
return
productionScanApi
(
ids
[
0
],
detailStatus
)
}
return
completeDeliveryApi
(
ids
)
}
const
downloadOperationById
=
(
ids
:
number
[])
=>
downloadOperationMaterialApi
(
ids
)
const
handleFastProductionSuccess
=
(
data
:
ResultInfoDataItem
[])
=>
{
if
(
fastKey
.
value
===
'productionScan'
)
{
ElMessage
.
success
(
'操作成功'
)
return
}
const
result
=
data
[
0
]
if
(
!
result
.
status
)
{
ElMessageBox
.
alert
(
...
...
@@ -2830,6 +2910,8 @@ const handleFastProductionSuccess = (data: ResultInfoDataItem[]) => {
}
,
)
return
}
else
{
ElMessage
.
success
(
'操作成功'
)
}
}
const
createLogisticsSuccess
=
(
data
:
ResultInfoDataItem
[])
=>
{
...
...
@@ -2848,6 +2930,7 @@ const fastClose = () => {
refreshCurrentView
({
isRefreshTree
:
true
}
)
}
const
handleViewDetail
=
async
(
item
:
operateOrderListData
)
=>
{
isLimitScan
.
value
=
false
const
loading
=
ElLoading
.
service
({
fullscreen
:
true
,
text
:
'加载中...'
,
...
...
@@ -2865,9 +2948,11 @@ const handleViewDetail = async (item: operateOrderListData) => {
loading
.
close
()
}
}
const
isLimitScan
=
ref
(
false
)
const
handleQuickProduction
=
()
=>
{
detailVisible
.
value
=
true
fastKey
.
value
=
'fastProduction'
fastKey
.
value
=
'productionScan'
isLimitScan
.
value
=
true
detailData
.
value
=
{
}
}
const
handleSinglePrint
=
()
=>
{
...
...
@@ -2987,9 +3072,145 @@ onMounted(() => {
.
page
{
display
:
flex
;
}
.
main
-
table
-
operation
{
display
:
flex
;
flex
-
direction
:
column
;
gap
:
2
px
;
}
.
order
-
status
-
wrapper
{
position
:
relative
;
flex
-
shrink
:
0
;
width
:
180
px
;
transition
:
width
0.3
s
ease
;
&
.
is
-
collapsed
{
width
:
0
;
.
order
-
status
{
opacity
:
0
;
visibility
:
hidden
;
}
}
}
.
sidebar
-
toggle
{
position
:
absolute
;
top
:
50
%
;
right
:
-
12
px
;
transform
:
translateY
(
-
50
%
);
z
-
index
:
10
;
width
:
12
px
;
height
:
48
px
;
display
:
flex
;
align
-
items
:
center
;
justify
-
content
:
center
;
background
:
#
fff
;
border
:
1
px
solid
#
dcdfe6
;
border
-
left
:
none
;
border
-
radius
:
0
4
px
4
px
0
;
cursor
:
pointer
;
box
-
shadow
:
1
px
0
4
px
rgba
(
0
,
0
,
0
,
0.06
);
user
-
select
:
none
;
&
:
hover
{
background
:
#
f5f7fa
;
.
sidebar
-
toggle
-
icon
{
border
-
right
-
color
:
#
409
eff
;
&
.
is
-
collapsed
{
border
-
right
-
color
:
transparent
;
border
-
left
-
color
:
#
409
eff
;
}
}
}
}
.
sidebar
-
toggle
-
icon
{
display
:
block
;
width
:
0
;
height
:
0
;
border
-
top
:
5
px
solid
transparent
;
border
-
bottom
:
5
px
solid
transparent
;
border
-
right
:
6
px
solid
#
909399
;
transition
:
border
-
color
0.2
s
;
&
.
is
-
collapsed
{
border
-
right
:
none
;
border
-
left
:
6
px
solid
#
909399
;
}
}
.
order
-
status
-
wrapper
{
position
:
relative
;
flex
-
shrink
:
0
;
width
:
180
px
;
transition
:
width
0.3
s
ease
;
&
.
is
-
collapsed
{
width
:
0
;
.
order
-
status
{
opacity
:
0
;
visibility
:
hidden
;
}
}
}
.
sidebar
-
toggle
{
position
:
absolute
;
top
:
50
%
;
right
:
-
12
px
;
transform
:
translateY
(
-
50
%
);
z
-
index
:
10
;
width
:
12
px
;
height
:
48
px
;
display
:
flex
;
align
-
items
:
center
;
justify
-
content
:
center
;
background
:
#
fff
;
border
:
1
px
solid
#
dcdfe6
;
border
-
left
:
none
;
border
-
radius
:
0
4
px
4
px
0
;
cursor
:
pointer
;
box
-
shadow
:
1
px
0
4
px
rgba
(
0
,
0
,
0
,
0.06
);
user
-
select
:
none
;
&
:
hover
{
background
:
#
f5f7fa
;
.
sidebar
-
toggle
-
icon
{
border
-
right
-
color
:
#
409
eff
;
&
.
is
-
collapsed
{
border
-
right
-
color
:
transparent
;
border
-
left
-
color
:
#
409
eff
;
}
}
}
}
.
sidebar
-
toggle
-
icon
{
display
:
block
;
width
:
0
;
height
:
0
;
border
-
top
:
5
px
solid
transparent
;
border
-
bottom
:
5
px
solid
transparent
;
border
-
right
:
6
px
solid
#
909399
;
transition
:
border
-
color
0.2
s
;
&
.
is
-
collapsed
{
border
-
right
:
none
;
border
-
left
:
6
px
solid
#
909399
;
}
}
.
order
-
status
{
width
:
180
px
;
height
:
100
%
;
overflow
:
auto
;
transition
:
opacity
0.3
s
ease
;
:
deep
(.
el
-
tree
-
node__content
)
{
height
:
30
px
;
...
...
src/views/order/podUs/PodMakeOrder.vue
View file @
888af742
...
...
@@ -13,7 +13,7 @@
>
<template
#
header
>
<div
class=
"title"
>
<span>
播种墙配货
</span>
<span>
{{
isNewOrder
?
'配货打单'
:
'播种墙配货'
}}
</span>
<span
v-if=
"socketConnect === 'online'"
class=
"online"
>
[在线]
</span>
<span
v-else
class=
"offline"
>
[离线]
</span>
<ElButton
...
...
@@ -169,7 +169,17 @@
>
{{ podOrderDetailsData?.pickingNumber }}
</div>
<span
style=
"font-size: 30px"
>
件商品
</span>
<span
v-if=
"
podOrderDetailsData?.pickingNumber != null &&
podOrderDetailsData?.purchaseNumber != null &&
podOrderDetailsData.pickingNumber ===
podOrderDetailsData.purchaseNumber
"
style=
"font-size: 30px"
>
件已配齐
</span
>
<span
v-else
style=
"font-size: 30px"
>
件商品
</span>
</div>
<div
v-else
class=
"box-top-item-box-index-text"
>
单件商品
<span
style=
"color: rgb(0, 255, 0)"
>
(配齐)
</span
...
...
@@ -288,6 +298,7 @@ import socket from '@/utils/websocket'
import
{
WarehouseListData
}
from
'@/types/index'
import
{
filePath
}
from
'@/api/axios.ts'
import
{
ElButton
,
ElIcon
,
ElTag
}
from
'element-plus'
import
{
BaseRespData
}
from
'@/types/api'
const
{
getCLodop
}
=
useLodop
()
...
...
@@ -793,6 +804,7 @@ const getPackingData = async (code: string) => {
}
}
const
res
=
await
getPackingDataApi
(
url
,
params
)
if
(
res
.
code
!==
200
)
{
ElMessage
.
warning
(
res
.
message
)
isLock
.
value
=
false
...
...
@@ -829,7 +841,24 @@ const getPackingData = async (code: string) => {
// }
}
catch
(
error
)
{
console
.
log
(
error
)
const
err
=
error
as
BaseRespData
<
{
inventory
:
number
producingQuantity
:
number
availableInventory
:
number
thirdSkuCode
?:
string
}
>
if
(
props
.
isNewOrder
&&
err
?.
code
===
301
)
{
loading
.
close
()
await
ElMessageBox
.
alert
(
`
${
err
.
data
?.
thirdSkuCode
}
库存不足,无法进入生产!请联系仓库管理人员核对库存。
<
br
/>
库存数量:
$
{
err
.
data
?.
inventory
}
,生产中的数量:
$
{
err
.
data
?.
producingQuantity
}
,
<
span
style
=
"color: red"
>
可调配库存:
$
{
err
.
data
?.
availableInventory
}
<
/span>`
,
'提示'
,
{
type
:
'warning'
,
dangerouslyUseHTMLString
:
true
,
},
)
}
}
finally
{
isLock
.
value
=
false
productionOrder
.
value
=
''
...
...
@@ -1394,7 +1423,7 @@ const reconnectWebSocket = async () => {
font-size
:
60px
;
color
:
red
;
text-align
:
center
;
width
:
12
0px
;
width
:
8
0px
;
font-weight
:
600
;
}
.box-top-item-box-index-text
{
...
...
@@ -1406,7 +1435,7 @@ const reconnectWebSocket = async () => {
color
:
red
;
display
:
inline-block
;
text-align
:
center
;
width
:
9
0px
;
width
:
8
0px
;
font-weight
:
600
;
}
.box-top-item-status
{
...
...
vite.config.ts
View file @
888af742
...
...
@@ -7,13 +7,6 @@ import vueJsx from '@vitejs/plugin-vue-jsx'
import
compression
from
'vite-plugin-compression'
export
default
defineConfig
({
base
:
'/'
,
server
:{
proxy
:
{
'/api/'
:
{
target
:
'http://172.16.17.244:8060'
,
},
},
},
plugins
:
[
vue
(),
...
...
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