Commit 54fb19a8 by linjinhong

feat:【工厂端】生产中发现缺货的订单支持打缺货标签,便于工厂人员快速识别优先补库存#1002026

parent efb77b93
...@@ -779,3 +779,14 @@ export function updateCustomDeclarationInfoApi({ ...@@ -779,3 +779,14 @@ export function updateCustomDeclarationInfoApi({
}, },
) )
} }
// 标记缺货/移除缺货共用
export function updateProductOutOfStockApi(params: {
productIds: (number | string)[]
orderFrom: string
outOfStock: boolean
}) {
return axios.post<never, BaseRespData<never>>(
`/factory/podJomallOrderProductCnUs/updateProductOutOfStock`,
params,
)
}
...@@ -286,7 +286,10 @@ export function clearBoxApi( ...@@ -286,7 +286,10 @@ export function clearBoxApi(
}, },
) )
} }
export function clearAllBoxApi(warehouseId: string | number, factoryNo: string | number | undefined) { export function clearAllBoxApi(
warehouseId: string | number,
factoryNo: string | number | undefined,
) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/delPodBoxOrderDetails', 'factory/podJomallOrderUs/delPodBoxOrderDetails',
{ {
...@@ -685,3 +688,14 @@ export function printNormalPickPdfApi(ids: string) { ...@@ -685,3 +688,14 @@ export function printNormalPickPdfApi(ids: string) {
{ params: { ids } }, { params: { ids } },
) )
} }
// 标记缺货/移除缺货共用
export function updateProductOutOfStockApi(params: {
productIds: (number | string)[]
orderFrom: string
outOfStock: boolean
}) {
return axios.post<never, BaseRespData<never>>(
`/factory/podJomallOrderProductCnUs/updateProductOutOfStock`,
params,
)
}
...@@ -54,6 +54,7 @@ export interface SearchForm { ...@@ -54,6 +54,7 @@ export interface SearchForm {
automaticComposing?: number automaticComposing?: number
employeeId?: number employeeId?: number
blocking?: boolean blocking?: boolean
outOfStock?: boolean
} }
export interface PodCnOrderListData { export interface PodCnOrderListData {
id: number id: number
...@@ -158,6 +159,7 @@ export interface ProductList { ...@@ -158,6 +159,7 @@ export interface ProductList {
batchArrangeNumber?: string | null batchArrangeNumber?: string | null
sizeType?: number | null sizeType?: number | null
customTagList?: { name: string }[] customTagList?: { name: string }[]
outOfStock?: boolean
} }
export interface cardImages { export interface cardImages {
title: string title: string
......
...@@ -50,6 +50,7 @@ export interface SearchForm { ...@@ -50,6 +50,7 @@ export interface SearchForm {
automaticComposing?: number automaticComposing?: number
employeeId?: number employeeId?: number
blocking?: boolean blocking?: boolean
outOfStock?: boolean
} }
export interface PodUsOrderListData { export interface PodUsOrderListData {
id: number id: number
...@@ -157,6 +158,7 @@ export interface ProductList { ...@@ -157,6 +158,7 @@ export interface ProductList {
sizeType?: number | null sizeType?: number | null
productMark?: string | null productMark?: string | null
customTagList?: { name: string }[] customTagList?: { name: string }[]
outOfStock?: boolean
} }
export interface cardImages { export interface cardImages {
title: string title: string
......
...@@ -252,6 +252,25 @@ ...@@ -252,6 +252,25 @@
> >
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem
label="标签"
v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
>
<ElSelect
v-model="searchForm.outOfStock"
clearable
filterable
placeholder="请输入标签"
style="width: 150px"
>
<el-option
v-for="item in labelList"
:key="item.value"
:label="item.name"
:value="item.value"
></el-option>
</ElSelect>
</ElFormItem>
<ElFormItem v-if="status !== 'BATCH_DOWNLOAD'"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'">
<ElPopover placement="bottom" width="600" trigger="click"> <ElPopover placement="bottom" width="600" trigger="click">
<ElForm <ElForm
...@@ -416,10 +435,10 @@ ...@@ -416,10 +435,10 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="标签"> <ElFormItem label="ERP标签">
<ElSelect <ElSelect
v-model="searchForm.tagsIdArr" v-model="searchForm.tagsIdArr"
placeholder="请选择标签" placeholder="请选择ERP标签"
clearable clearable
filterable filterable
multiple multiple
...@@ -676,9 +695,9 @@ ...@@ -676,9 +695,9 @@
拣胚完成 拣胚完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> <!-- <span v-if="status === 'PICKING'" class="item">
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton> <ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
</span> </span> -->
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> <span v-if="status === 'TO_BE_CONFIRMED'" class="item">
<ElButton type="warning" @click="changeExceptionOrder"> <ElButton type="warning" @click="changeExceptionOrder">
转为异常单 转为异常单
...@@ -916,6 +935,35 @@ ...@@ -916,6 +935,35 @@
</ElDropdown> </ElDropdown>
</span> </span>
<span <span
v-if="status === 'PICKING' || status === 'TO_BE_REPLENISHMENT'"
class="item"
>
<ElDropdown>
<el-button type="warning">
标签管理<el-icon class="el-icon--right"><ArrowDown /></el-icon>
</el-button>
<template #dropdown>
<ElDropdownMenu>
<ElDropdownItem
:disabled="
selection.length === 0 && cardSelection.length === 0
"
@click="labelFn(true)"
>添加缺货标签</ElDropdownItem
>
<ElDropdownItem
:disabled="
selection.length === 0 && cardSelection.length === 0
"
@click="labelFn(false)"
>移除缺货标签</ElDropdownItem
>
</ElDropdownMenu>
</template>
</ElDropdown>
</span>
<span
v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)" v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
class="item" class="item"
> >
...@@ -1939,6 +1987,14 @@ ...@@ -1939,6 +1987,14 @@
> >
<template #top_left> <template #top_left>
<el-tooltip <el-tooltip
v-if="cardItem.outOfStock"
effect="light"
content="生产中缺货"
placement="bottom"
>
<el-icon color="#bd3124"> </el-icon>
</el-tooltip>
<el-tooltip
v-if=" v-if="
cardItem.interceptStatus == 0 || cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 2 cardItem.interceptStatus == 2
...@@ -2786,7 +2842,7 @@ import { ...@@ -2786,7 +2842,7 @@ import {
confirmProductApi, confirmProductApi,
applyForReplenishmentApi, applyForReplenishmentApi,
replenishmentSuccessApi, replenishmentSuccessApi,
toOutOfStockApi, // toOutOfStockApi,
arrangeFinishApi, arrangeFinishApi,
getListCraftApi, getListCraftApi,
batchDownloadApi, batchDownloadApi,
...@@ -2815,6 +2871,7 @@ import { ...@@ -2815,6 +2871,7 @@ import {
changeLogisticsApi, changeLogisticsApi,
getEmployeeListApi, getEmployeeListApi,
allErpCodeListApi, allErpCodeListApi,
updateProductOutOfStockApi,
} from '@/api/podCnOrder' } from '@/api/podCnOrder'
// import { logisticsCompanyAllCodelist } from '@/api/logistics.ts' // import { logisticsCompanyAllCodelist } from '@/api/logistics.ts'
...@@ -3140,6 +3197,11 @@ const sizeList = ref<{ name: string; value: number }[]>([ ...@@ -3140,6 +3197,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
{ name: '正常码', value: 1 }, { name: '正常码', value: 1 },
{ name: '大码', value: 2 }, { name: '大码', value: 2 },
]) ])
// 标签类型表
const labelList = ref<{ name: string; value: boolean }[]>([
{ name: '生产中缺货', value: true },
{ name: '无标签', value: false },
])
const handleRefreshAddress = async (row: PodCnOrderListData) => { const handleRefreshAddress = async (row: PodCnOrderListData) => {
try { try {
...@@ -4495,37 +4557,37 @@ const pickingComplete = async () => { ...@@ -4495,37 +4557,37 @@ const pickingComplete = async () => {
loading.close() loading.close()
} }
} }
const toOutOfStock = async () => { // const toOutOfStock = async () => {
if (cardSelection.value.length === 0) { // if (cardSelection.value.length === 0) {
return ElMessage.warning('请选择数据') // return ElMessage.warning('请选择数据')
} // }
const orderIds = cardSelection.value.map((item) => item.podJomallOrderCnId) // const orderIds = cardSelection.value.map((item) => item.podJomallOrderCnId)
try { // try {
await ElMessageBox.confirm('确定转至缺货吗?', '提示', { // await ElMessageBox.confirm('确定转至缺货吗?', '提示', {
cancelButtonText: '取消', // cancelButtonText: '取消',
confirmButtonText: '确认', // confirmButtonText: '确认',
type: 'warning', // type: 'warning',
}) // })
} catch { // } catch {
return // return
} // }
const loading = ElLoading.service({ // const loading = ElLoading.service({
fullscreen: true, // fullscreen: true,
text: '操作中...', // text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)', // background: 'rgba(0, 0, 0, 0.3)',
}) // })
try { // try {
const res = await toOutOfStockApi(orderIds) // const res = await toOutOfStockApi(orderIds)
if (res.code !== 200) return // if (res.code !== 200) return
search() // search()
loadTabData() // loadTabData()
cardSelection.value = [] // cardSelection.value = []
} catch (e) { // } catch (e) {
console.error(e) // console.error(e)
} finally { // } finally {
loading.close() // loading.close()
} // }
} // }
const inputBlur = () => { const inputBlur = () => {
if (!pageSize.value || Number(pageSize.value) <= 0) { if (!pageSize.value || Number(pageSize.value) <= 0) {
pageSize.value = initPageSize.value pageSize.value = initPageSize.value
...@@ -5844,6 +5906,39 @@ const getNewImageFn = (img: string) => { ...@@ -5844,6 +5906,39 @@ const getNewImageFn = (img: string) => {
} }
} }
const labelFn = async (type: boolean) => {
try {
await ElMessageBox.confirm('确定添加“生产中缺货”标签?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
} catch {
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
const params = {
productIds: selection.value.map((item) => item.id),
orderFrom: 'CN',
outOfStock: type,
}
await updateProductOutOfStockApi(params)
ElMessage.success('操作成功')
search()
loadTabData()
} catch (error) {
console.log(error)
} finally {
loading.close()
}
}
useRouter().beforeEach((to, from, next) => { useRouter().beforeEach((to, from, next) => {
handleBeforeRouteLeave(to, from, next) handleBeforeRouteLeave(to, from, next)
}) })
......
...@@ -242,6 +242,25 @@ ...@@ -242,6 +242,25 @@
> >
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem
label="标签"
v-if="status == 'TO_BE_REPLENISHMENT' || status == 'PICKING'"
>
<ElSelect
v-model="searchForm.outOfStock"
clearable
filterable
placeholder="请输入标签"
style="width: 150px"
>
<el-option
v-for="item in labelList"
:key="item.value"
:label="item.name"
:value="item.value"
></el-option>
</ElSelect>
</ElFormItem>
<ElFormItem> <ElFormItem>
<ElPopover <ElPopover
placement="bottom" placement="bottom"
...@@ -372,10 +391,10 @@ ...@@ -372,10 +391,10 @@
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="标签"> <ElFormItem label="ERP标签">
<ElSelect <ElSelect
v-model="searchForm.tagsIdArr" v-model="searchForm.tagsIdArr"
placeholder="请选择标签" placeholder="请选择ERP标签"
clearable clearable
filterable filterable
multiple multiple
...@@ -664,11 +683,11 @@ ...@@ -664,11 +683,11 @@
</ElButton> </ElButton>
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'"> <!-- <ElFormItem v-if="status === 'PICKING'">
<span class="item"> <span class="item">
<ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton> <ElButton type="success" @click="toOutOfStock"> 转至缺货 </ElButton>
</span> </span>
</ElFormItem> </ElFormItem> -->
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'"> <ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item"> <span class="item">
<ElButton type="warning" @click="changeExceptionOrder"> <ElButton type="warning" @click="changeExceptionOrder">
...@@ -942,6 +961,34 @@ ...@@ -942,6 +961,34 @@
</ElDropdown> </ElDropdown>
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem v-if="['PICKING', 'TO_BE_REPLENISHMENT'].includes(status)">
<span class="item">
<ElDropdown>
<el-button type="warning">
标签管理<el-icon class="el-icon--right"><ArrowDown /></el-icon>
</el-button>
<template #dropdown>
<ElDropdownMenu>
<ElDropdownItem
:disabled="
selection.length === 0 && cardSelection.length === 0
"
@click="labelFn(true)"
>添加缺货标签</ElDropdownItem
>
<ElDropdownItem
:disabled="
selection.length === 0 && cardSelection.length === 0
"
@click="labelFn(false)"
>移除缺货标签</ElDropdownItem
>
</ElDropdownMenu>
</template>
</ElDropdown>
</span>
</ElFormItem>
<ElFormItem <ElFormItem
v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)" v-if="['WAIT_TRACK', 'COMPLETE', 'IN_TRANSIT'].includes(status)"
> >
...@@ -1810,7 +1857,16 @@ ...@@ -1810,7 +1857,16 @@
</span> </span>
</div> --> </div> -->
<div <div
v-if="['TO_BE_CONFIRMED','EXCEPTION_ORDER', 'STOCK_OUT', 'CREATE_LOGISTICS', 'TO_BE_ARRANGE', 'WAIT_SHIPMENT'].includes(status)" v-if="
[
'TO_BE_CONFIRMED',
'EXCEPTION_ORDER',
'STOCK_OUT',
'CREATE_LOGISTICS',
'TO_BE_ARRANGE',
'WAIT_SHIPMENT',
].includes(status)
"
class="order-detail-item" class="order-detail-item"
> >
<span class="order-detail-item-label">订单延期时间:</span> <span class="order-detail-item-label">订单延期时间:</span>
...@@ -2195,6 +2251,14 @@ ...@@ -2195,6 +2251,14 @@
> >
<template #top_left> <template #top_left>
<el-tooltip <el-tooltip
v-if="cardItem.outOfStock"
effect="light"
content="生产中缺货"
placement="bottom"
>
<el-icon color="#bd3124"> </el-icon>
</el-tooltip>
<el-tooltip
v-if=" v-if="
cardItem.interceptStatus == 0 || cardItem.interceptStatus == 0 ||
cardItem.interceptStatus == 2 cardItem.interceptStatus == 2
...@@ -2391,7 +2455,17 @@ ...@@ -2391,7 +2455,17 @@
<span class="grid-item-label">补胚数量:</span> <span class="grid-item-label">补胚数量:</span>
<span class="grid-item-value"> <span class="grid-item-value">
{{ cardItem?.replenishmentNum || 0 }} {{ cardItem?.replenishmentNum || 0 }}
<span v-if="!['IN_PRODUCTION','PICKING','TO_BE_ARRANGE'].includes(status)" title="订单延期时间" class="delayTime red-time"> <span
v-if="
![
'IN_PRODUCTION',
'PICKING',
'TO_BE_ARRANGE',
].includes(status)
"
title="订单延期时间"
class="delayTime red-time"
>
{{ calculateDelayTime(cardItem) }} {{ calculateDelayTime(cardItem) }}
</span> </span>
</span> </span>
...@@ -3149,7 +3223,7 @@ import { ...@@ -3149,7 +3223,7 @@ import {
// handleExceptionOrderApi, // handleExceptionOrderApi,
applyForReplenishmentApi, applyForReplenishmentApi,
replenishmentSuccessApi, replenishmentSuccessApi,
toOutOfStockApi, // toOutOfStockApi,
arrangeFinishApi, arrangeFinishApi,
getListCraftApi, getListCraftApi,
batchDownloadApi, batchDownloadApi,
...@@ -3175,6 +3249,7 @@ import { ...@@ -3175,6 +3249,7 @@ import {
printNormalPickPdfApi, printNormalPickPdfApi,
updatePRNDownloadStatus, updatePRNDownloadStatus,
getEmployeeListApi, getEmployeeListApi,
updateProductOutOfStockApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
...@@ -3431,6 +3506,11 @@ const sizeList = ref<{ name: string; value: number }[]>([ ...@@ -3431,6 +3506,11 @@ const sizeList = ref<{ name: string; value: number }[]>([
{ name: '正常码', value: 1 }, { name: '正常码', value: 1 },
{ name: '大码', value: 2 }, { name: '大码', value: 2 },
]) ])
// 标签类型表
const labelList = ref<{ name: string; value: boolean }[]>([
{ name: '生产中缺货', value: true },
{ name: '无标签', value: false },
])
const detailData = ref({}) const detailData = ref({})
const [searchForm, resetSearchForm] = useValue<SearchForm>({ const [searchForm, resetSearchForm] = useValue<SearchForm>({
...@@ -5036,37 +5116,37 @@ const pickingComplete = async () => { ...@@ -5036,37 +5116,37 @@ const pickingComplete = async () => {
loading.close() loading.close()
} }
} }
const toOutOfStock = async () => { // const toOutOfStock = async () => {
if (cardSelection.value.length === 0) { // if (cardSelection.value.length === 0) {
return ElMessage.warning('请选择数据') // return ElMessage.warning('请选择数据')
} // }
const orderIds = cardSelection.value.map((item) => item.podJomallOrderUsId) // const orderIds = cardSelection.value.map((item) => item.podJomallOrderUsId)
try { // try {
await ElMessageBox.confirm('确定转至缺货吗?', '提示', { // await ElMessageBox.confirm('确定转至缺货吗?', '提示', {
cancelButtonText: '取消', // cancelButtonText: '取消',
confirmButtonText: '确认', // confirmButtonText: '确认',
type: 'warning', // type: 'warning',
}) // })
} catch { // } catch {
return // return
} // }
const loading = ElLoading.service({ // const loading = ElLoading.service({
fullscreen: true, // fullscreen: true,
text: '操作中...', // text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)', // background: 'rgba(0, 0, 0, 0.3)',
}) // })
try { // try {
const res = await toOutOfStockApi(orderIds) // const res = await toOutOfStockApi(orderIds)
if (res.code !== 200) return // if (res.code !== 200) return
search() // search()
loadTabData() // loadTabData()
cardSelection.value = [] // cardSelection.value = []
} catch (e) { // } catch (e) {
console.error(e) // console.error(e)
} finally { // } finally {
loading.close() // loading.close()
} // }
} // }
const exceptionTypes = [ const exceptionTypes = [
{ value: '1', label: '客户' }, { value: '1', label: '客户' },
{ value: '2', label: '工厂' }, { value: '2', label: '工厂' },
...@@ -6813,28 +6893,38 @@ const getEmployeeList = async () => { ...@@ -6813,28 +6893,38 @@ const getEmployeeList = async () => {
employeeList.value = data employeeList.value = data
} }
getPermission() const labelFn = async (type: boolean) => {
getLogisticsWay() try {
getEmployeeList() await ElMessageBox.confirm('确定添加“生产中缺货”标签?', '提示', {
confirmButtonText: '确定',
const globalProperties = cancelButtonText: '取消',
getCurrentInstance()?.appContext.config.globalProperties // 获取全局挂载 type: 'warning',
const isPermissionBtn = globalProperties?.$isPermissionBtn })
} catch {
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
const getNewImageFn = (img: string) => {
try { try {
if (img.startsWith('http')) return img const params = {
if (img.startsWith('/')) return `https://img.jomalls.com/upload/erp${img}` productIds: selection.value.map((item) => item.id),
return `https://image.jomalls.com/${img}` orderFrom: 'US',
outOfStock: type,
}
await updateProductOutOfStockApi(params)
ElMessage.success('操作成功')
search()
loadTabData()
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} finally {
loading.close()
} }
} }
useRouter().beforeEach((to, from, next) => {
handleBeforeRouteLeave(to, from, next)
})
const printNormal = async () => { const printNormal = async () => {
await showConfirm('确定普货拣货吗?', { await showConfirm('确定普货拣货吗?', {
confirmButtonText: '确认', confirmButtonText: '确认',
...@@ -6865,6 +6955,28 @@ const printNormal = async () => { ...@@ -6865,6 +6955,28 @@ const printNormal = async () => {
ElMessage.success('操作成功') ElMessage.success('操作成功')
window.open(filePath + res.message) window.open(filePath + res.message)
} }
getPermission()
getLogisticsWay()
getEmployeeList()
const globalProperties =
getCurrentInstance()?.appContext.config.globalProperties // 获取全局挂载
const isPermissionBtn = globalProperties?.$isPermissionBtn
const getNewImageFn = (img: string) => {
try {
if (img.startsWith('http')) return img
if (img.startsWith('/')) return `https://img.jomalls.com/upload/erp${img}`
return `https://image.jomalls.com/${img}`
} catch (error) {
console.log(error)
}
}
useRouter().beforeEach((to, from, next) => {
handleBeforeRouteLeave(to, from, next)
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.header-filter-form { .header-filter-form {
...@@ -6955,12 +7067,11 @@ const printNormal = async () => { ...@@ -6955,12 +7067,11 @@ const printNormal = async () => {
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
} }
.grid-item-value{ .grid-item-value {
position: relative; position: relative;
} }
.delayTime{ .delayTime {
position: absolute; position: absolute;
right: 0; right: 0;
font-size: 14px; font-size: 14px;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment