Commit eac2d845 by linjinhong

Merge remote-tracking branch 'origin/master' into lin-task

parents 15fd2ba6 f08a0ccd
...@@ -60,6 +60,12 @@ export function getFilePath() { ...@@ -60,6 +60,12 @@ export function getFilePath() {
import.meta.env.VITE_API_BASE_URL + import.meta.env.VITE_API_BASE_UPLOAD_URL import.meta.env.VITE_API_BASE_URL + import.meta.env.VITE_API_BASE_UPLOAD_URL
) )
} }
export function getFileCnPath() {
if (!/(http|https):\/\/([^/]+)/i.test(import.meta.env.BASE_URL)) {
return location.origin
}
return import.meta.env.VITE_API_BASE_URL
}
export function getWsUrl() { export function getWsUrl() {
if (location.protocol === 'https:') { if (location.protocol === 'https:') {
return 'wss://' + location.host return 'wss://' + location.host
...@@ -68,5 +74,6 @@ export function getWsUrl() { ...@@ -68,5 +74,6 @@ export function getWsUrl() {
} }
} }
export const filePath = getFilePath() export const filePath = getFilePath()
export const FileCnPath = getFileCnPath()
export default axios export default axios
...@@ -34,14 +34,14 @@ export function uploadFileApi(data: FormData) { ...@@ -34,14 +34,14 @@ export function uploadFileApi(data: FormData) {
) )
} }
// 获取物流面单 US // 打印物流面单 US
export function getLogisticUSApi(content: string) { export function getLogisticUSApi(content: string) {
return axios.get<never, BaseRespData<{ documentUrl: string }>>( return axios.get<never, BaseRespData<{ documentUrl: string }>>(
`factory/podJomallOrderUs/getDocument?content=${content}`, `factory/podJomallOrderUs/getDocument?content=${content}`,
) )
} }
// 获取物流面单 CN // 打印物流面单 CN
export function getLogisticCNApi(content: string) { export function getLogisticCNApi(content: string) {
return axios.get<never, BaseRespData<{ documentUrl: string }>>( return axios.get<never, BaseRespData<{ documentUrl: string }>>(
`factory/podJomallOrder/getDocument?content=${content}`, `factory/podJomallOrder/getDocument?content=${content}`,
......
...@@ -481,7 +481,7 @@ export function batchDownloadDownloadApi(params: { id: number; type: string }) { ...@@ -481,7 +481,7 @@ export function batchDownloadDownloadApi(params: { id: number; type: string }) {
} }
// 批量下载 删除 // 批量下载 删除
export function batchDownloadDeleteApi(params: { id: number }) { export function batchDownloadDeleteApi(params: { ids?: string }) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
`factory/podUsBatchDownload/delete`, `factory/podUsBatchDownload/delete`,
{ {
...@@ -543,3 +543,13 @@ export function statusPushApi(params: (string | number)[]) { ...@@ -543,3 +543,13 @@ export function statusPushApi(params: (string | number)[]) {
params, params,
) )
} }
// 完成发货
export function completeDeliveryApi(params: {
orderIdList: (string | number)[]
}) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/completeDelivery`,
params,
)
}
...@@ -117,11 +117,11 @@ ...@@ -117,11 +117,11 @@
<img src="../assets/images/brush-no.png" width="24" height="24" /> <img src="../assets/images/brush-no.png" width="24" height="24" />
</div> </div>
<div <div
title="获取物流面单" title="打印物流面单"
class="tool-item" class="tool-item"
@click="getLogisticDrawer = true" @click="getLogisticDrawer = true"
> >
<img src="../assets/images/package.png" width="24" height="24" /> <img src="../assets/images/printer.png" width="24" height="24" />
</div> </div>
</div> </div>
</div> </div>
...@@ -206,17 +206,31 @@ ...@@ -206,17 +206,31 @@
</el-drawer> </el-drawer>
<el-drawer <el-drawer
v-model="getLogisticDrawer" v-model="getLogisticDrawer"
direction="btt"
class="get-logistic-drawer" class="get-logistic-drawer"
title="获取物流面单" title="打印物流面单"
@close="content = ''" @close="content = ''"
> >
<el-input v-model="content" placeholder="请输入单号" clearable /> <ElSelect
<template #footer> v-model="sheetPrinter"
<span style="display: flex; justify-content: center"> placeholder="请选择打印机"
<el-button @click="getLogisticDrawer = false"> 取 消 </el-button> @change="handlePrinterChange"
<el-button type="primary" @click="getLogistic">查 询</el-button> style="width: 200px; margin-right: 10px"
</span> >
</template> <ElOption
v-for="item in printDeviceList"
:key="item"
:label="item"
:value="item"
/>
</ElSelect>
<el-input
v-model="content"
placeholder="请输入单号"
style="width: 300px; margin-right: 10px"
clearable
/>
<el-button type="primary" @click="getLogistic">查 询</el-button>
</el-drawer> </el-drawer>
</span> </span>
</template> </template>
...@@ -240,11 +254,14 @@ import { ...@@ -240,11 +254,14 @@ import {
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import Menu from '@/router/menu' import Menu from '@/router/menu'
import userUserStore from '@/store/user' import userUserStore from '@/store/user'
import type { FormRules } from 'element-plus' import type { FormRules } from 'element-plus'
import { useValue } from '@/utils/hooks/useValue' import { useValue } from '@/utils/hooks/useValue'
import useLodop from '@/utils/hooks/useLodop'
import { changePasswordApi } from '@/api/auth' import { changePasswordApi } from '@/api/auth'
import { getLogisticUSApi, getLogisticCNApi } from '@/api/common' import { getLogisticUSApi, getLogisticCNApi } from '@/api/common'
import { filePath } from '@/api/axios' import { filePath, FileCnPath } from '@/api/axios'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
interface MenuItem { interface MenuItem {
index: string index: string
...@@ -272,6 +289,9 @@ const userInfo = userStore.user ...@@ -272,6 +289,9 @@ const userInfo = userStore.user
const dialogVisible = ref(false) const dialogVisible = ref(false)
const formatDrawer = ref(false) const formatDrawer = ref(false)
const getLogisticDrawer = ref(false) const getLogisticDrawer = ref(false)
const printDeviceList = ref<string[]>([])
const sheetPrinter = ref('')
const textareaT = ref('') const textareaT = ref('')
const newTextareaT = ref('') const newTextareaT = ref('')
const content = ref('') const content = ref('')
...@@ -504,7 +524,31 @@ const copy = () => { ...@@ -504,7 +524,31 @@ const copy = () => {
}) })
} }
// 获取物流面单 const { getCLodop } = useLodop()
const initPrintDevice = () => {
const lodop = getCLodop(null, null)
if (!lodop) return
const arr = []
// 获取打印机数量
const length = lodop.GET_PRINTER_COUNT()
for (let i = 0; i < length; i++) {
// 根据设备序号获取设备名
const name = lodop.GET_PRINTER_NAME(i)
arr.push(name)
}
// 获取默认打印机
sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
printDeviceList.value = arr
}
// 处理打印机选择变化,保存到 localStorage
const handlePrinterChange = (value: string) => {
sheetPrinter.value = value
localStorage.setItem('sheetPrinter', JSON.stringify(value))
}
// 打印物流面单
const getLogistic = () => { const getLogistic = () => {
if (!content.value) { if (!content.value) {
ElMessage.warning('请输入单号') ElMessage.warning('请输入单号')
...@@ -530,7 +574,7 @@ const getLogistic = () => { ...@@ -530,7 +574,7 @@ const getLogistic = () => {
// 中国物流 // 中国物流
getLogisticCNApi(content.value).then((res) => { getLogisticCNApi(content.value).then((res) => {
if (res.code === 200) { if (res.code === 200) {
window.open(filePath + res.data.documentUrl, '_blank') window.open(FileCnPath + res.data.documentUrl, '_blank')
} }
}) })
} else { } else {
...@@ -547,6 +591,24 @@ watch( ...@@ -547,6 +591,24 @@ watch(
{ immediate: true }, { immediate: true },
) )
watch(getLogisticDrawer, async (value: boolean) => {
if (value) {
initPrintDevice()
const locaclPrinter = localStorage.getItem('sheetPrinter')
if (locaclPrinter) {
const savedPrinter = JSON.parse(locaclPrinter)
// 检查保存的打印机是否在当前打印机列表中
if (printDeviceList.value.includes(savedPrinter)) {
sheetPrinter.value = savedPrinter
} else {
// 如果保存的打印机不在当前列表中,清空 localStorage 并设置为空
localStorage.removeItem('sheetPrinter')
sheetPrinter.value = ''
}
}
}
})
// 点击标签时切换路由 // 点击标签时切换路由
watch(activeTab, (newTab) => { watch(activeTab, (newTab) => {
if (newTab) { if (newTab) {
...@@ -700,9 +762,11 @@ onUnmounted(() => { ...@@ -700,9 +762,11 @@ onUnmounted(() => {
top: calc(50% - 325px) !important; top: calc(50% - 325px) !important;
} }
::v-deep(.get-logistic-drawer.el-drawer.rtl) { ::v-deep(.get-logistic-drawer.el-drawer.btt) {
height: 200px !important; height: 120px !important;
top: calc(50% - 100px) !important; width: 700px !important;
top: calc(50% - 60px) !important;
left: calc(50% - 350px) !important;
} }
.tool-item { .tool-item {
......
...@@ -29,7 +29,7 @@ let timer: number | undefined ...@@ -29,7 +29,7 @@ let timer: number | undefined
const second = ref(5) const second = ref(5)
const router = useRouter() const router = useRouter()
props.showBtn && props.showBtn &&
(timer = setInterval(() => { (timer = window.setInterval(() => {
if (second.value === 0) { if (second.value === 0) {
clearInterval(timer) clearInterval(timer)
router.go(-1) router.go(-1)
......
...@@ -90,12 +90,26 @@ ...@@ -90,12 +90,26 @@
<p> <p>
{{ detail?.factorySubOrderNumber }} {{ detail?.factorySubOrderNumber }}
</p> </p>
<el-icon
v-if="detail?.factorySubOrderNumber"
class="icon"
@click="copy(detail?.factorySubOrderNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="detail?.thirdSubOrderNumber || ''" class="div-item"> <div :title="detail?.thirdSubOrderNumber || ''" class="div-item">
<span>第三方生产单号</span> <span>第三方生产单号</span>
<p> <p>
{{ detail?.thirdSubOrderNumber }} {{ detail?.thirdSubOrderNumber }}
</p> </p>
<el-icon
v-if="detail?.thirdSubOrderNumber"
class="icon"
@click="copy(detail?.thirdSubOrderNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="String(detail?.craftName)" class="div-item"> <div :title="String(detail?.craftName)" class="div-item">
<span>生产工艺</span> <span>生产工艺</span>
...@@ -125,6 +139,13 @@ ...@@ -125,6 +139,13 @@
<div :title="detail?.shopNumber ?? ''" class="div-item"> <div :title="detail?.shopNumber ?? ''" class="div-item">
<span>店铺单号</span> <span>店铺单号</span>
<p>{{ detail?.shopNumber ?? '' }}</p> <p>{{ detail?.shopNumber ?? '' }}</p>
<el-icon
v-if="detail?.shopNumber"
class="icon"
@click="copy(detail?.shopNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div :title="detail?.createTime" class="div-item"> <div :title="detail?.createTime" class="div-item">
...@@ -203,6 +224,8 @@ import { ...@@ -203,6 +224,8 @@ import {
getSubOrderBySubOrderNumber, getSubOrderBySubOrderNumber,
downloadMaterialApi, downloadMaterialApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { DocumentCopy } from '@element-plus/icons-vue'
import { cardImages, PodOrderRes } from '@/types/api/podUsOrder' import { cardImages, PodOrderRes } from '@/types/api/podUsOrder'
import { showConfirm } from '@/utils/ui' import { showConfirm } from '@/utils/ui'
import { filePath } from '@/api/axios' import { filePath } from '@/api/axios'
...@@ -529,6 +552,28 @@ const trackCodeInput = async () => { ...@@ -529,6 +552,28 @@ const trackCodeInput = async () => {
removeFromHistory() removeFromHistory()
return ElMessage.error('生产单不存在') return ElMessage.error('生产单不存在')
} }
if (res.data.interceptStatus == 0 || res.data.interceptStatus == 2) {
try {
await ElMessageBox.confirm(
'该生产单已提交至拦截申请,请确认是否继续生产',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
},
)
} catch (error) {
TrackingNumber.value = ''
detail.value = {
id: -1,
podJomallOrderUsId: -1,
imgList: [],
}
trackingNumberRef.value && trackingNumberRef.value.focus()
return
}
}
const d = JSON.parse(JSON.stringify(res.data)) const d = JSON.parse(JSON.stringify(res.data))
if (d.note) { if (d.note) {
...@@ -559,6 +604,15 @@ const trackCodeInput = async () => { ...@@ -559,6 +604,15 @@ const trackCodeInput = async () => {
const onOpened = () => { const onOpened = () => {
trackingNumberRef.value && trackingNumberRef.value.focus() trackingNumberRef.value && trackingNumberRef.value.focus()
} }
const copy = (text: string) => {
try {
navigator.clipboard.writeText(text)
ElMessage.success('复制成功')
} catch (err) {
console.error('复制失败:', err)
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.sure-btn { .sure-btn {
......
...@@ -2,106 +2,106 @@ ...@@ -2,106 +2,106 @@
<div class="card flex-column h-100 overflow-hidden"> <div class="card flex-column h-100 overflow-hidden">
<div class="header-filter-form"> <div class="header-filter-form">
<ElForm :model="searchForm" size="default" inline> <ElForm :model="searchForm" size="default" inline>
<div> <!-- <div> -->
<ElFormItem label="仓库"> <ElFormItem label="仓库">
<ElSelect <ElSelect
v-model="searchForm.warehouseId" v-model="searchForm.warehouseId"
clearable clearable
filterable filterable
placeholder="请输入" placeholder="请输入"
style="width: 150px" style="width: 150px"
> >
<el-option <el-option
v-for="item in warehouseList" v-for="item in warehouseList"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
></el-option> ></el-option>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="平台"> <ElFormItem label="平台">
<ElSelect <ElSelect
v-model="searchForm.platform" v-model="searchForm.platform"
value-key="" value-key=""
placeholder="请选择" placeholder="请选择"
clearable clearable
filterable filterable
popper-class="customize-select-style" popper-class="customize-select-style"
style="width: 150px" style="width: 150px"
> >
<ElOption <ElOption
v-for="(item, index) in platformJson" v-for="(item, index) in platformJson"
:key="index" :key="index"
:label="item.type" :label="item.type"
:value="item.type" :value="item.type"
style="width: 160px" style="width: 160px"
>
<img
:src="`/images/icon/${item.icon.split('/').pop()}`"
style="height: 20px; margin: 5px 10px 0 0"
/>
<span :title="item.type">{{ item.type }}</span>
</ElOption>
</ElSelect>
</ElFormItem>
<ElFormItem label="工艺">
<ElSelect
v-model="searchForm.craftCode"
clearable
filterable
placeholder="请输入工艺"
style="width: 150px"
> >
<el-option <img
v-for="item in craftList" :src="`/images/icon/${item.icon.split('/').pop()}`"
:key="item.craftCode" style="height: 20px; margin: 5px 10px 0 0"
:label="item.craftName" />
:value="item.craftCode" <span :title="item.type">{{ item.type }}</span>
></el-option> </ElOption>
</ElSelect> </ElSelect>
</ElFormItem> </ElFormItem>
<ElFormItem label="库存SKU">
<ElInput <ElFormItem label="工艺">
v-model.trim="searchForm.thirdSkuCode" <ElSelect
placeholder="库存SKU" v-model="searchForm.craftCode"
clearable clearable
style="width: 150px" filterable
></ElInput> placeholder="请输入工艺"
</ElFormItem> style="width: 150px"
<ElFormItem label="款号"> >
<ElInput <el-option
v-model="searchForm.supplierProductNo" v-for="item in craftList"
placeholder="款号" :key="item.craftCode"
clearable :label="item.craftName"
style="width: 150px" :value="item.craftCode"
/> ></el-option>
</ElFormItem> </ElSelect>
<ElFormItem label="批次号"> </ElFormItem>
<ElInput <ElFormItem label="库存SKU">
v-model="searchForm.batchArrangeNumber" <ElInput
placeholder="批次号" v-model.trim="searchForm.thirdSkuCode"
clearable placeholder="库存SKU"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> ></ElInput>
<ElFormItem label="生产单号"> </ElFormItem>
<ElInput <ElFormItem label="款号">
v-model="searchForm.factorySubOrderNumber" <ElInput
placeholder="生产单号" v-model="searchForm.supplierProductNo"
clearable placeholder="款号"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> />
<ElFormItem label="店铺单号"> </ElFormItem>
<ElInput <ElFormItem label="批次号">
v-model="searchForm.shopNumber" <ElInput
placeholder="店铺单号" v-model="searchForm.batchArrangeNumber"
clearable placeholder="批次号"
style="width: 150px" clearable
/> style="width: 150px"
</ElFormItem> />
</div> </ElFormItem>
<ElFormItem label="生产单号">
<ElInput
v-model="searchForm.factorySubOrderNumber"
placeholder="生产单号"
clearable
style="width: 150px"
/>
</ElFormItem>
<ElFormItem label="店铺单号">
<ElInput
v-model="searchForm.shopNumber"
placeholder="店铺单号"
clearable
style="width: 150px"
/>
</ElFormItem>
<!-- </div> -->
<ElFormItem label="类型"> <ElFormItem label="类型">
<el-radio-group v-model="searchForm.customizedQuantity"> <el-radio-group v-model="searchForm.customizedQuantity">
<el-radio-button label="single">单面</el-radio-button> <el-radio-button label="single">单面</el-radio-button>
...@@ -263,15 +263,14 @@ ...@@ -263,15 +263,14 @@
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem> <ElFormItem
<span v-if="
v-if=" status === 'PICKING' ||
status === 'PICKING' || status === 'TO_BE_REPLENISHMENT' ||
status === 'TO_BE_REPLENISHMENT' || status === 'IN_PRODUCTION'
status === 'IN_PRODUCTION' "
" >
class="item" <span class="item">
>
<ElButton <ElButton
:loading="tifDownloadLoading" :loading="tifDownloadLoading"
type="warning" type="warning"
...@@ -280,14 +279,15 @@ ...@@ -280,14 +279,15 @@
TIF排版 TIF排版
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'PICKING' || v-if="
status === 'TO_BE_REPLENISHMENT' || status === 'PICKING' ||
status === 'IN_PRODUCTION' status === 'TO_BE_REPLENISHMENT' ||
" status === 'IN_PRODUCTION'
class="item" "
> >
<span class="item">
<ElButton <ElButton
:loading="pngDownloadLoading" :loading="pngDownloadLoading"
type="warning" type="warning"
...@@ -296,30 +296,44 @@ ...@@ -296,30 +296,44 @@
PNG排版 PNG排版
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="success" @click="confirmProduct"> <ElButton type="success" @click="confirmProduct">
确认生产 确认生产
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'EXCEPTION_ORDER'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'EXCEPTION_ORDER'">
<span class="item">
<ElButton type="success" @click="updateOrder"> <ElButton type="success" @click="updateOrder">
转至待确认 转至待确认
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 3" <ElFormItem
class="item" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 3"
> >
<span class="item">
<ElButton type="warning" @click="asyncOrderAddress"> <ElButton type="warning" @click="asyncOrderAddress">
同步收货地址 同步收货地址
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 1" <ElFormItem
class="item" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 1"
> >
<span class="item">
<ElButton type="warning" @click="assignOrder"> 分派 </ElButton> <ElButton type="warning" @click="assignOrder"> 分派 </ElButton>
</span> </span>
</ElFormItem>
<ElFormItem
v-if="
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
status === 'IN_PRODUCTION'
"
>
<!-- <span <!-- <span
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 2" v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 2"
class="item" class="item"
...@@ -328,91 +342,115 @@ ...@@ -328,91 +342,115 @@
处理异常 处理异常
</ElButton> </ElButton>
</span> --> </span> -->
<span <span class="item">
v-if="
status === 'PICKING' ||
status === 'TO_BE_REPLENISHMENT' ||
status === 'IN_PRODUCTION'
"
class="item"
>
<ElButton type="primary" @click="printProductionOrder"> <ElButton type="primary" @click="printProductionOrder">
打印生产单 打印生产单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_REPLENISHMENT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_REPLENISHMENT'">
<span class="item">
<ElButton type="success" @click="replenishmentSuccess"> <ElButton type="success" @click="replenishmentSuccess">
补胚完成 补胚完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span class="item">
<ElButton type="success" @click="printPickingOrder"> <ElButton type="success" @click="printPickingOrder">
打印拣货单 打印拣货单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span class="item">
<ElButton type="warning" @click="pickingComplete"> <ElButton type="warning" @click="pickingComplete">
拣胚完成 拣胚完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'PICKING'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'PICKING'">
<span 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"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="warning" @click="changeExceptionOrder"> <ElButton type="warning" @click="changeExceptionOrder">
转为异常单 转为异常单
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_CONFIRMED'">
<span class="item">
<ElButton type="success" @click="confirmProductToRiin"> <ElButton type="success" @click="confirmProductToRiin">
转至锐印生产 转至锐印生产
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'TO_BE_CONFIRMED' || status === 'EXCEPTION_ORDER'" <ElFormItem
class="item" v-if="status === 'TO_BE_CONFIRMED' || status === 'EXCEPTION_ORDER'"
> >
<span class="item">
<ElButton type="danger" @click="cancelOrder">取消</ElButton> <ElButton type="danger" @click="cancelOrder">取消</ElButton>
</span> </span>
</ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<!-- <span v-if="status !== 'IN_PRODUCTION'" class="item"> <!-- <span v-if="status !== 'IN_PRODUCTION'" class="item">
<ElButton type="success" @click="handleUpdateRemark"> <ElButton type="success" @click="handleUpdateRemark">
添加内部标签 添加内部标签
</ElButton> </ElButton>
</span> --> </span> -->
<span v-if="status === 'IN_PRODUCTION'" class="item"> <span class="item">
<ElButton type="warning" @click="onFastProduction"> <ElButton type="warning" @click="onFastProduction">
快捷生产 快捷生产
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'IN_PRODUCTION'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<span class="item">
<ElButton type="success" @click="applyForReplenishment(undefined)"> <ElButton type="success" @click="applyForReplenishment(undefined)">
申请补胚 申请补胚
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'IN_PRODUCTION'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'IN_PRODUCTION'">
<span class="item">
<ElButton type="success" @click="productioncompleted"> <ElButton type="success" @click="productioncompleted">
生产完成 生产完成
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'WAIT_SHIPMENT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'WAIT_SHIPMENT'">
<span class="item">
<ElButton type="warning" @click="printPodOrder"> <ElButton type="warning" @click="printPodOrder">
播种墙配货 播种墙配货
</ElButton> </ElButton>
</span> </span>
</ElFormItem>
<ElFormItem v-if="status === 'CREATE_LOGISTICS'">
<!-- <span v-if="status === 'WAIT_SHIPMENT'" class="item"> <!-- <span v-if="status === 'WAIT_SHIPMENT'" class="item">
<ElButton type="warning" @click="inspPackagOrder"> <ElButton type="warning" @click="inspPackagOrder">
质检包装 质检包装
</ElButton> </ElButton>
</span> --> </span> -->
<span v-if="status === 'CREATE_LOGISTICS'" class="item"> <span class="item">
<ElButton type="warning" @click="logisticsToPicking"> <ElButton type="warning" @click="logisticsToPicking">
转至待排单 转至待排单
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if="status === 'WAIT_SHIPMENT' || status === 'CREATE_LOGISTICS'" <ElFormItem v-if="status === 'WAIT_SHIPMENT'">
class="item" <span class="item">
> <ElButton type="primary" @click="completeDelivery()"
>完成发货</ElButton
>
</span>
</ElFormItem>
<ElFormItem
v-if="status === 'WAIT_SHIPMENT' || status === 'CREATE_LOGISTICS'"
>
<span class="item">
<ElDropdown> <ElDropdown>
<el-button type="success"> <el-button type="success">
物流接口<el-icon class="el-icon--right"><ArrowDown /></el-icon> 物流接口<el-icon class="el-icon--right"><ArrowDown /></el-icon>
...@@ -463,74 +501,89 @@ ...@@ -463,74 +501,89 @@
</template> </template>
</ElDropdown> </ElDropdown>
</span> </span>
<span v-if="status === 'STOCK_OUT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'STOCK_OUT'">
<span class="item">
<ElButton type="warning" @click="stockOutCheck"> <ElButton type="warning" @click="stockOutCheck">
补货校验 补货校验
</ElButton> </ElButton>
</span> </span>
<span v-if="status === 'STOCK_OUT'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'STOCK_OUT'">
<span class="item">
<ElButton type="success" @click="toBePicking"> 转至生产 </ElButton> <ElButton type="success" @click="toBePicking"> 转至生产 </ElButton>
</span> </span>
<span v-if="status === 'TO_BE_ARRANGE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'TO_BE_ARRANGE'">
<span class="item">
<ElButton type="warning" @click="arrangeFinish">排单完成</ElButton> <ElButton type="warning" @click="arrangeFinish">排单完成</ElButton>
</span> </span>
<span </ElFormItem>
v-if="status !== 'BATCH_DOWNLOAD' && status !== 'WAIT_SHIPMENT'" <ElFormItem
class="item" v-if="status !== 'BATCH_DOWNLOAD' && status !== 'WAIT_SHIPMENT'"
> >
<span class="item">
<ElButton type="primary" @click="downloadMaterial" <ElButton type="primary" @click="downloadMaterial"
>下载素材</ElButton >下载素材</ElButton
> >
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'INTERCEPTED' && v-if="
(interceptCurrent === 1 || interceptCurrent === 4) status === 'INTERCEPTED' &&
" (interceptCurrent === 1 || interceptCurrent === 4)
class="item" "
> >
<span class="item">
<ElButton type="success" @click="interceptChange(true)"> <ElButton type="success" @click="interceptChange(true)">
拦截成功 拦截成功
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'INTERCEPTED' && v-if="
(interceptCurrent === 1 || interceptCurrent === 4) status === 'INTERCEPTED' &&
" (interceptCurrent === 1 || interceptCurrent === 4)
class="item" "
> >
<span class="item">
<ElButton type="danger" @click="interceptChange(false)"> <ElButton type="danger" @click="interceptChange(false)">
拦截失败 拦截失败
</ElButton> </ElButton>
</span> </span>
</ElFormItem>
<span <ElFormItem
v-if=" v-if="
status === 'TO_BE_CONFIRMED' || [
status === 'PICKING' || 'TO_BE_CONFIRMED',
status === 'STOCK_OUT' || 'PICKING',
status === 'EXCEPTION_ORDER' || 'STOCK_OUT',
status === 'TO_BE_REPLENISHMENT' || 'EXCEPTION_ORDER',
status === 'IN_PRODUCTION' || 'TO_BE_REPLENISHMENT',
status === 'TO_BE_ARRANGE' 'IN_PRODUCTION',
" 'TO_BE_ARRANGE',
class="item" 'WAIT_SHIPMENT',
> ].includes(status)
"
>
<span class="item">
<ElButton type="success" @click="refreshMaterial"> <ElButton type="success" @click="refreshMaterial">
刷新商品信息 刷新商品信息
</ElButton> </ElButton>
</span> </span>
<span </ElFormItem>
v-if=" <ElFormItem
status === 'STOCK_OUT' || v-if="
status === 'CREATE_LOGISTICS' || [
status === 'TO_BE_ARRANGE' || 'STOCK_OUT',
status === 'PICKING' || 'CREATE_LOGISTICS',
status === 'IN_PRODUCTION' 'TO_BE_ARRANGE',
" 'PICKING',
class="item" 'IN_PRODUCTION',
> ].includes(status)
"
>
<span class="item">
<ElDropdown> <ElDropdown>
<el-button type="warning"> <el-button type="warning">
驳回至<el-icon class="el-icon--right"><ArrowDown /></el-icon> 驳回至<el-icon class="el-icon--right"><ArrowDown /></el-icon>
...@@ -576,13 +629,24 @@ ...@@ -576,13 +629,24 @@
</template> </template>
</ElDropdown> </ElDropdown>
</span> </span>
<span v-if="status === 'COMPLETE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'COMPLETE'">
<span class="item">
<ElButton type="warning" @click="statusPush">状态推送</ElButton> <ElButton type="warning" @click="statusPush">状态推送</ElButton>
</span> </span>
<span v-if="status === 'COMPLETE'" class="item"> </ElFormItem>
<ElFormItem v-if="status === 'COMPLETE'">
<span class="item">
<ElButton type="success" @click="exportData">导出</ElButton> <ElButton type="success" @click="exportData">导出</ElButton>
</span> </span>
</ElFormItem> </ElFormItem>
<ElFormItem v-if="status === 'BATCH_DOWNLOAD'">
<span class="item">
<ElButton type="danger" @click="handleBatchDelete('batch')"
>批量删除</ElButton
>
</span>
</ElFormItem>
</ElForm> </ElForm>
</div> </div>
<div class="header-filter-tab"> <div class="header-filter-tab">
...@@ -1389,7 +1453,11 @@ ...@@ -1389,7 +1453,11 @@
</ElButton> </ElButton>
</span> </span>
<span class="operate-item"> <span class="operate-item">
<ElButton link type="danger" @click="handleBatchDelete(row)"> <ElButton
link
type="danger"
@click="handleBatchDelete('single', row.id)"
>
删除 删除
</ElButton> </ElButton>
</span> </span>
...@@ -1623,9 +1691,9 @@ ...@@ -1623,9 +1691,9 @@
<div class="grid-item"> <div class="grid-item">
<div <div
:title="`variant SKU: ${cardItem?.variantSku || ''}`" :title="`variant SKU: ${cardItem?.variantSku || ''}`"
class="grid-item-value orderNumber" class="grid-item-value"
> >
{{ cardItem?.variantSku }} <div class="orderNumber">{{ cardItem?.variantSku }}</div>
<el-icon <el-icon
class="icon" class="icon"
style="margin-left: 3px" style="margin-left: 3px"
...@@ -1660,9 +1728,12 @@ ...@@ -1660,9 +1728,12 @@
<div class="grid-item"> <div class="grid-item">
<div <div
:title="`库存SKU:${cardItem?.thirdSkuCode || ''}`" :title="`库存SKU:${cardItem?.thirdSkuCode || ''}`"
class="grid-item-value orderNumber" class="grid-item-value"
> >
{{ cardItem?.thirdSkuCode }} <div class="orderNumber">
{{ cardItem?.thirdSkuCode }}
</div>
<el-icon <el-icon
class="icon" class="icon"
style="margin-left: 3px" style="margin-left: 3px"
...@@ -1696,11 +1767,13 @@ ...@@ -1696,11 +1767,13 @@
class="grid-item" class="grid-item"
:title="`店铺单号:${cardItem?.shopNumber || ''}`" :title="`店铺单号:${cardItem?.shopNumber || ''}`"
> >
<div class="grid-item-value orderNumber"> <div class="grid-item-value">
{{ cardItem?.shopNumber }} <div class="orderNumber">
{{ cardItem?.shopNumber }}
</div>
<el-icon <el-icon
class="icon" class="icon"
style="margin-left: 3px" style="margin-left: 3px; flex-shrink: 0"
size="14" size="14"
@click="copy(cardItem?.shopNumber || '')" @click="copy(cardItem?.shopNumber || '')"
> >
...@@ -1740,17 +1813,19 @@ ...@@ -1740,17 +1813,19 @@
class="grid-item" class="grid-item"
:title="`批次号:${cardItem?.batchArrangeNumber || ''}`" :title="`批次号:${cardItem?.batchArrangeNumber || ''}`"
> >
<div class="grid-item-value orderNumber"> <div class="grid-item-value">
{{ cardItem?.batchArrangeNumber }} <div class="orderNumber">
<el-icon {{ cardItem?.batchArrangeNumber }}
class="icon" </div>
style="margin-left: 3px"
size="14"
@click="copy(cardItem?.batchArrangeNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<el-icon
class="icon"
style="margin-left: 3px"
size="14"
@click="copy(cardItem?.batchArrangeNumber || '')"
>
<DocumentCopy />
</el-icon>
</div> </div>
<div v-if="cardItem.isReplenishment" class="grid-item"> <div v-if="cardItem.isReplenishment" class="grid-item">
<el-tag size="small" type="danger" effect="dark" <el-tag size="small" type="danger" effect="dark"
...@@ -2269,6 +2344,7 @@ import { ...@@ -2269,6 +2344,7 @@ import {
interceptUpdateApi, interceptUpdateApi,
rejectToApi, rejectToApi,
statusPushApi, statusPushApi,
completeDeliveryApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
...@@ -2623,7 +2699,11 @@ const handleDownload = async (row: PodUsOrderListData, type: string) => { ...@@ -2623,7 +2699,11 @@ const handleDownload = async (row: PodUsOrderListData, type: string) => {
} }
} }
// 批量下载 删除 // 批量下载 删除
const handleBatchDelete = async (row: PodUsOrderListData) => { const handleBatchDelete = async (type: string, id?: string) => {
if (type === 'batch' && selection.value.length === 0) {
ElMessage.error('请选择要删除的数据')
return
}
try { try {
await showConfirm('确定删除吗?', { await showConfirm('确定删除吗?', {
confirmButtonText: '确认', confirmButtonText: '确认',
...@@ -2639,7 +2719,12 @@ const handleBatchDelete = async (row: PodUsOrderListData) => { ...@@ -2639,7 +2719,12 @@ const handleBatchDelete = async (row: PodUsOrderListData) => {
background: 'rgba(0, 0, 0, 0.3)', background: 'rgba(0, 0, 0, 0.3)',
}) })
try { try {
const res = await batchDownloadDeleteApi({ id: row.id }) const res = await batchDownloadDeleteApi({
ids:
type === 'batch'
? selection.value.map((item) => item.id).join(',')
: id,
})
if (res.code !== 200) return if (res.code !== 200) return
ElMessage.success(res.message) ElMessage.success(res.message)
search() search()
...@@ -3806,13 +3891,13 @@ const printPodOrder = async () => { ...@@ -3806,13 +3891,13 @@ const printPodOrder = async () => {
const InspPackagOrderRef = ref() const InspPackagOrderRef = ref()
const inspPackagOrder = async () => { // const inspPackagOrder = async () => {
const lodop = getCLodop(null, null) // const lodop = getCLodop(null, null)
if (!lodop) return // if (!lodop) return
sheetPrinter.value = lodop.GET_PRINTER_NAME(0) // sheetPrinter.value = lodop.GET_PRINTER_NAME(0)
InspPackagOrderRef?.value.open() // InspPackagOrderRef?.value.open()
} // }
/** /**
* @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单 * @description: 创建物流、获取跟踪号、获取打印面单、更改物流、取消物流订单
...@@ -4822,6 +4907,58 @@ const statusPush = async () => { ...@@ -4822,6 +4907,58 @@ const statusPush = async () => {
} }
} }
// 完成发货
const completeDelivery = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择订单')
}
try {
await ElMessageBox.confirm('确定完成发货吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
} catch (e) {
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
const res = await completeDeliveryApi({
orderIdList: selection.value.map((item) => item.id),
})
if (res.code !== 200) return
resultInfo.value =
(res.data as {
id: string | number
status: boolean
factoryOrderNumber?: string
message: string
}[]) || []
if (
Array.isArray(res.data) &&
(res.data as { status: boolean }[]).some((item) => !item.status)
) {
resultRefs.value?.showDialog()
} else {
search()
loadTabData()
}
ElMessage.success('操作成功')
// search()
// loadTabData()
} catch (e) {
resultInfo.value = []
console.error(e)
} finally {
loading.close()
}
}
const tempChinaLogs = ref<LogListData[]>([]) const tempChinaLogs = ref<LogListData[]>([])
function changeChinaTime(zone: string) { function changeChinaTime(zone: string) {
logList.value = tempChinaLogs.value.map((el) => { logList.value = tempChinaLogs.value.map((el) => {
...@@ -4845,9 +4982,9 @@ useRouter().beforeEach((to, from, next) => { ...@@ -4845,9 +4982,9 @@ useRouter().beforeEach((to, from, next) => {
} }
} }
.item { // .item {
margin-right: 15px; // margin-right: 15px;
} // }
.tabs { .tabs {
display: flex; display: flex;
...@@ -4996,8 +5133,9 @@ useRouter().beforeEach((to, from, next) => { ...@@ -4996,8 +5133,9 @@ useRouter().beforeEach((to, from, next) => {
.grid-item { .grid-item {
display: flex; display: flex;
overflow: hidden; overflow: hidden;
width: 100%;
.grid-item-value { .grid-item-value {
display: flex;
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
...@@ -5124,9 +5262,11 @@ useRouter().beforeEach((to, from, next) => { ...@@ -5124,9 +5262,11 @@ useRouter().beforeEach((to, from, next) => {
} }
} }
.orderNumber { .orderNumber {
display: flex; white-space: nowrap;
align-items: center; overflow: hidden;
justify-content: flex-start; text-overflow: ellipsis;
flex: 1;
min-width: 0; /* 关键属性 */
} }
.customizedQuantity { .customizedQuantity {
height: 28px; height: 28px;
......
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