Commit ad05ba1e by wuqian

Merge branch 'dev' of 47.122.114.111:qinjianhui/factory_front into wqtwo

parents dcca9a6e d3ba6445
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
export {} export {}
declare global { declare global {
const EffectScope: typeof import('vue')['EffectScope'] const EffectScope: typeof import('vue')['EffectScope']
const ElInput: typeof import('element-plus/es')['ElInput']
const ElLoading: typeof import('element-plus/es')['ElLoading'] const ElLoading: typeof import('element-plus/es')['ElLoading']
const ElMessage: typeof import('element-plus/es')['ElMessage'] const ElMessage: typeof import('element-plus/es')['ElMessage']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
......
...@@ -37,6 +37,12 @@ export function getOrderList( ...@@ -37,6 +37,12 @@ export function getOrderList(
}, },
) )
} }
export function handleExceptionOrderApi(orderIds: number[]) {
return axios.post<never, BaseRespData<never>>(
'factory/podJomallOrderUs/processExceptionOrders',
orderIds,
)
}
export function getCardOrderList( export function getCardOrderList(
params: SearchForm, params: SearchForm,
currentPage: number, currentPage: number,
...@@ -80,14 +86,17 @@ export function updateExceptionOrderApi(data: number[]) { ...@@ -80,14 +86,17 @@ export function updateExceptionOrderApi(data: number[]) {
}, },
) )
} }
export function changeExceptionOrderApi(ids: number[], value: string) { export function changeExceptionOrderApi(
return axios.post<never, BaseRespData<never>>( url: string,
'factory/podJomallOrderUs/exceptionOrders', ids: number[],
{ type: string,
orderIds: ids, value: string,
exceptionReason: value, ) {
}, return axios.post<never, BaseRespData<never>>(url, {
) orderIds: ids,
exceptionType: type,
exceptionReason: value,
})
} }
export function cancelOrderApi(ids: number[], value: string) { export function cancelOrderApi(ids: number[], value: string) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -297,3 +306,19 @@ export function createLogisticsOrderApi(params: { ...@@ -297,3 +306,19 @@ export function createLogisticsOrderApi(params: {
params, params,
) )
} }
// 转至待拣胚
export function updateLogisticsToPickingApi(params: { ids: string }) {
return axios.get<never, BaseRespData<never>>(
`factory/podJomallOrderUs/updateLogisticsToPicking`,
{
params,
},
)
}
//创建物流订单
export function createLogisticsOrdersApi(orderIds: (string | number)[]) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/createLogisticsOrders`,
orderIds,
)
}
...@@ -16,6 +16,7 @@ export interface SearchForm { ...@@ -16,6 +16,7 @@ export interface SearchForm {
customizedQuantity: string customizedQuantity: string
startTime: string | null startTime: string | null
endTime: string | null endTime: string | null
exceptionHandling: number | undefined
} }
export interface PodUsOrderListData { export interface PodUsOrderListData {
id: number id: number
......
...@@ -297,7 +297,7 @@ getLogisticsList() ...@@ -297,7 +297,7 @@ getLogisticsList()
<el-form-item class="el-col-12" label="物流公司编码" prop="code"> <el-form-item class="el-col-12" label="物流公司编码" prop="code">
<el-select v-model="form.code" clearable filterable @change="codeChange"> <el-select v-model="form.code" clearable filterable @change="codeChange">
<el-option <el-option
v-for="it in logisticsList" :key="it.code" :label="it.basicsName" v-for="it in logisticsList" :key="it.code" :label="it.code"
:value="it.code"> :value="it.code">
{{ it.code }} {{ it.code }}
<span style="font-size: 14px; color: #999; line-height: 24px"> <span style="font-size: 14px; color: #999; line-height: 24px">
......
...@@ -250,6 +250,7 @@ const formConfig = computed<IFormConfig[]>(() => [ ...@@ -250,6 +250,7 @@ const formConfig = computed<IFormConfig[]>(() => [
options: countryList.value, options: countryList.value,
label: 'countryCode', label: 'countryCode',
value: 'countryCode', value: 'countryCode',
filterable: true,
placeholder: '请选择国家代码', placeholder: '请选择国家代码',
onChange: (val: ICountryObj) => { onChange: (val: ICountryObj) => {
editForm.value.countryName = val.nameCn editForm.value.countryName = val.nameCn
...@@ -265,6 +266,7 @@ const formConfig = computed<IFormConfig[]>(() => [ ...@@ -265,6 +266,7 @@ const formConfig = computed<IFormConfig[]>(() => [
options: countryList.value, options: countryList.value,
label: 'nameCn', label: 'nameCn',
value: 'nameCn', value: 'nameCn',
filterable: true,
placeholder: '请选择国家名称', placeholder: '请选择国家名称',
onChange: (val: ICountryObj) => { onChange: (val: ICountryObj) => {
editForm.value.countryCode = val.countryCode editForm.value.countryCode = val.countryCode
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
@opened="handleOpened" @opened="handleOpened"
@close="onClose" @close="onClose"
> >
<template #title> <template #header>
<div class="title"> <div class="title">
<span>POD打单</span> <span>POD打单</span>
<span v-if="socketConnect === 'online'" class="online">[在线]</span> <span v-if="socketConnect === 'online'" class="online">[在线]</span>
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<div style="margin: 15px 0"></div> <div style="margin: 15px 0"></div>
<el-checkbox-group v-model="selectedList" @change="checkChange"> <el-checkbox-group v-model="selectedList" @change="checkChange">
<div style="display: block" v-for="(item, index) in list" :key="index"> <div style="display: block" v-for="(item, index) in list" :key="index">
<el-checkbox :label="item.id"> <el-checkbox :value="item.id">
{{ '店铺编号:' + item.shopNumber + ' ' + item.message }} {{ '店铺编号:' + item.shopNumber + ' ' + item.message }}
</el-checkbox> </el-checkbox>
</div> </div>
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
v-model="searchForm.userMark" v-model="searchForm.userMark"
clearable clearable
filterable filterable
style="width: 180px" style="width: 100px"
placeholder="客户" placeholder="客户"
> >
<el-option <el-option
...@@ -46,12 +46,23 @@ ...@@ -46,12 +46,23 @@
></el-option> ></el-option>
</el-select> </el-select>
</ElFormItem> </ElFormItem>
<ElFormItem label="定制类型">
<ElSelect
v-model="searchForm.customizedQuantity"
placeholder="定制类型"
clearable
style="width: 100px"
>
<ElOption label="单面" value="single" />
<ElOption label="多面" value="multiple" />
</ElSelect>
</ElFormItem>
<ElFormItem label="SKU"> <ElFormItem label="SKU">
<ElInput <ElInput
v-model.trim="searchForm.sku" v-model.trim="searchForm.sku"
placeholder=" SKU" placeholder=" SKU"
clearable clearable
style="width: 180px" style="width: 150px"
></ElInput> ></ElInput>
</ElFormItem> </ElFormItem>
<ElFormItem label="Base SKU"> <ElFormItem label="Base SKU">
...@@ -59,7 +70,7 @@ ...@@ -59,7 +70,7 @@
v-model.trim="searchForm.baseSku" v-model.trim="searchForm.baseSku"
placeholder=" Base SKU" placeholder=" Base SKU"
clearable clearable
style="width: 180px" style="width: 150px"
></ElInput> ></ElInput>
</ElFormItem> </ElFormItem>
<ElFormItem label="物流跟踪号"> <ElFormItem label="物流跟踪号">
...@@ -67,7 +78,7 @@ ...@@ -67,7 +78,7 @@
v-model.trim="searchForm.logisticsTracking" v-model.trim="searchForm.logisticsTracking"
placeholder="物流跟踪号" placeholder="物流跟踪号"
clearable clearable
style="width: 180px" style="width: 150px"
></ElInput> ></ElInput>
</ElFormItem> </ElFormItem>
<ElFormItem label="生产单号"> <ElFormItem label="生产单号">
...@@ -75,7 +86,7 @@ ...@@ -75,7 +86,7 @@
v-model="searchForm.factorySubOrderNumber" v-model="searchForm.factorySubOrderNumber"
placeholder="生产单号" placeholder="生产单号"
clearable clearable
style="width: 180px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="订单号"> <ElFormItem label="订单号">
...@@ -83,7 +94,7 @@ ...@@ -83,7 +94,7 @@
v-model="searchForm.factoryOrderNumber" v-model="searchForm.factoryOrderNumber"
placeholder="订单号" placeholder="订单号"
clearable clearable
style="width: 180px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="店铺单号"> <ElFormItem label="店铺单号">
...@@ -91,20 +102,10 @@ ...@@ -91,20 +102,10 @@
v-model="searchForm.shopNumber" v-model="searchForm.shopNumber"
placeholder="店铺单号" placeholder="店铺单号"
clearable clearable
style="width: 180px" style="width: 150px"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="定制类型">
<ElSelect
v-model="searchForm.customizedQuantity"
placeholder="定制类型"
clearable
style="width: 180px"
>
<ElOption label="单面" value="single" />
<ElOption label="多面" value="multiple" />
</ElSelect>
</ElFormItem>
<ElFormItem> <ElFormItem>
<ElButton type="primary" @click="search">查询</ElButton> <ElButton type="primary" @click="search">查询</ElButton>
</ElFormItem> </ElFormItem>
...@@ -120,11 +121,74 @@ ...@@ -120,11 +121,74 @@
@click="changeTab(item)" @click="changeTab(item)"
> >
<span class="tabs-node_label">{{ item.statusName }}</span> <span class="tabs-node_label">{{ item.statusName }}</span>
<span class="tabs-node_count">{{ `(${item.quantity})` }}</span> <span
class="tabs-node_count"
:class="{
blue: item.quantity && item.quantity > 0,
red: item.status === 'EXCEPTION_ORDER',
}"
>{{ item.quantity }}</span
>
</div> </div>
<!-- <div
v-if="item.status === 'EXCEPTION_ORDER'"
:key="item.status"
class="tabs-node"
>
<el-dropdown @command="handleExceptionCommand">
<div>
<span
class="tabs-node_label"
style="color: #000; font-weight: 500"
>
异常单
</span>
<span
class="tabs-node_count"
:class="{
blue: item.quantity && item.quantity > 0,
red: item.status === 'EXCEPTION_ORDER',
}"
>{{ item.quantity }}</span
>
<el-icon class="el-icon--right"><arrow-down /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="1">待分派</el-dropdown-item>
<el-dropdown-item command="2">待处理</el-dropdown-item>
<el-dropdown-item command="3">已处理</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div> -->
</div> </div>
</div> </div>
<div class="order-content flex-1 flex-column overflow-hidden mt-10"> <div class="order-content flex-1 flex-column overflow-hidden mt-10">
<div v-if="status === 'EXCEPTION_ORDER'" class="sub-status mb-10">
<div
class="sub-status-item"
:class="exceptionStatus === 1 ? 'sub-active' : ''"
@click="handleExceptionCommand(1)"
>
<span class="sub-status-item-label">待分派</span>
</div>
<div
class="sub-status-item"
:class="exceptionStatus === 2 ? 'sub-active' : ''"
@click="handleExceptionCommand(2)"
>
<span class="sub-status-item-label">待处理</span>
</div>
<div
class="sub-status-item"
:class="exceptionStatus === 3 ? 'sub-active' : ''"
@click="handleExceptionCommand(3)"
>
<span class="sub-status-item-label">已处理</span>
</div>
</div>
<div class="operation-box mb-10"> <div class="operation-box mb-10">
<span v-if="status === 'TO_BE_CONFIRMED'" class="item"> <span v-if="status === 'TO_BE_CONFIRMED'" class="item">
<ElButton type="success" @click="confirmOrder"> 确认 </ElButton> <ElButton type="success" @click="confirmOrder"> 确认 </ElButton>
...@@ -132,6 +196,20 @@ ...@@ -132,6 +196,20 @@
<span v-if="status === 'EXCEPTION_ORDER'" class="item"> <span v-if="status === 'EXCEPTION_ORDER'" class="item">
<ElButton type="success" @click="updateOrder"> 转至待确认 </ElButton> <ElButton type="success" @click="updateOrder"> 转至待确认 </ElButton>
</span> </span>
<span
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 1"
class="item"
>
<ElButton type="warning" @click="assignOrder"> 分派 </ElButton>
</span>
<span
v-if="status === 'EXCEPTION_ORDER' && exceptionStatus === 2"
class="item"
>
<ElButton type="warning" @click="handleExceptionOrder">
处理异常
</ElButton>
</span>
<span v-if="status === 'PICKING'" class="item"> <span v-if="status === 'PICKING'" class="item">
<ElButton type="primary" @click="printProductionOrder"> <ElButton type="primary" @click="printProductionOrder">
打印生产单 打印生产单
...@@ -171,7 +249,15 @@ ...@@ -171,7 +249,15 @@
<span v-if="status === 'WAIT_SHIPMENT'" class="item"> <span v-if="status === 'WAIT_SHIPMENT'" class="item">
<ElButton type="warning" @click="printPodOrder"> POD打单 </ElButton> <ElButton type="warning" @click="printPodOrder"> POD打单 </ElButton>
</span> </span>
<span v-if="status === 'WAIT_SHIPMENT'" class="item"> <span v-if="status === 'CREATE_LOGISTICS'" class="item">
<ElButton type="warning" @click="logisticsToPicking">
转至待拣胚
</ElButton>
</span>
<span
v-if="status === 'WAIT_SHIPMENT' || status === 'CREATE_LOGISTICS'"
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>
...@@ -179,7 +265,7 @@ ...@@ -179,7 +265,7 @@
<template #dropdown> <template #dropdown>
<ElDropdownMenu> <ElDropdownMenu>
<ElDropdownItem @click="getOrderByIdApi('createLogisticsOrder')" <ElDropdownItem @click="getOrderByIdApi('createLogisticsOrder')"
>创建物流</ElDropdownItem >创建物流订单</ElDropdownItem
> >
<ElDropdownItem @click="getOrderByIdApi('getTrackingNumber')" <ElDropdownItem @click="getOrderByIdApi('getTrackingNumber')"
>获取跟踪号</ElDropdownItem >获取跟踪号</ElDropdownItem
...@@ -201,7 +287,9 @@ ...@@ -201,7 +287,9 @@
<ElButton type="warning" @click="stockOutCheck"> 补货校验 </ElButton> <ElButton type="warning" @click="stockOutCheck"> 补货校验 </ElButton>
</span> </span>
<span v-if="status === 'STOCK_OUT'" class="item"> <span v-if="status === 'STOCK_OUT'" class="item">
<ElButton type="success" @click="toBePicking"> 转至待拣胚 </ElButton> <ElButton type="success" @click="toBePicking">
转至待创建物流
</ElButton>
</span> </span>
<span class="item"> <span class="item">
...@@ -445,6 +533,27 @@ ...@@ -445,6 +533,27 @@
</el-icon> </el-icon>
</div> </div>
<div class="order-detail-item"> <div class="order-detail-item">
<span class="order-detail-item-label">物流跟踪号:</span>
<!-- <span
class="order-detail-item-value"
:title="row.trackingNumber"
>
{{ row.trackingNumber }}
</span> -->
<el-button
type="primary"
:title="row.trackingNumber"
link
:disabled="!row.expressSheet"
@click="downloadFacebook(row.expressSheet)"
>
{{ row.trackingNumber }}</el-button
>
<el-icon class="icon" @click="copy(row.trackingNumber || '')">
<DocumentCopy />
</el-icon>
</div>
<div class="order-detail-item">
<span class="order-detail-item-label">总克重:</span> <span class="order-detail-item-label">总克重:</span>
<span v-if="row.weight" class="order-detail-item-value"> <span v-if="row.weight" class="order-detail-item-value">
{{ row.weight }}g {{ row.weight }}g
...@@ -882,7 +991,7 @@ ...@@ -882,7 +991,7 @@
<ElOption <ElOption
v-for="(item, index) in productionClient" v-for="(item, index) in productionClient"
:key="index" :key="index"
:value="item.code" :value="item.code || ''"
:label="`${item.remark}(${item.code})`" :label="`${item.remark}(${item.code})`"
></ElOption> ></ElOption>
</ElSelect> </ElSelect>
...@@ -964,6 +1073,53 @@ ...@@ -964,6 +1073,53 @@
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
<ElDialog
v-model="exceptionDialogVisible"
title="转为异常单"
width="500px"
:close-on-click-modal="false"
@open="handleExceptionDialogOpen"
>
<ElForm ref="exceptionFormRef" :model="exceptionForm" label-width="100px">
<ElFormItem
label="异常类型"
prop="exceptionType"
:rules="{ required: true, message: '请选择异常类型' }"
>
<ElSelect
v-model="exceptionForm.exceptionType"
style="width: 100%"
placeholder="请选择异常类型"
clearable
>
<ElOption
v-for="type in exceptionTypes"
:key="type.value"
:label="type.label"
:value="type.value"
/>
</ElSelect>
</ElFormItem>
<ElFormItem label="异常原因" prop="exceptionReason">
<ElInput
v-model="exceptionForm.exceptionReason"
style="width: 100%"
type="textarea"
:rows="3"
placeholder="请输入异常原因"
/>
</ElFormItem>
</ElForm>
<template #footer>
<span class="dialog-footer">
<ElButton @click="exceptionDialogVisible = false">取消</ElButton>
<ElButton type="primary" @click="handleExceptionConfirm">
确定
</ElButton>
</span>
</template>
</ElDialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getUserMarkList } from '@/api/common' import { getUserMarkList } from '@/api/common'
...@@ -996,6 +1152,9 @@ import { ...@@ -996,6 +1152,9 @@ import {
cancelLogisticsOrderApi, cancelLogisticsOrderApi,
changeLogisticsApi, changeLogisticsApi,
createLogisticsOrderApi, createLogisticsOrderApi,
updateLogisticsToPickingApi,
createLogisticsOrdersApi,
handleExceptionOrderApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
...@@ -1062,7 +1221,9 @@ const [searchForm] = useValue<SearchForm>({ ...@@ -1062,7 +1221,9 @@ const [searchForm] = useValue<SearchForm>({
customizedQuantity: '', customizedQuantity: '',
startTime: null, startTime: null,
endTime: null, endTime: null,
exceptionHandling: undefined,
}) })
const exceptionStatus = ref(1)
const userMarkList = ref<string[]>([]) const userMarkList = ref<string[]>([])
const selection = ref<PodUsOrderListData[]>([]) const selection = ref<PodUsOrderListData[]>([])
const pickerOptions = { const pickerOptions = {
...@@ -1252,6 +1413,10 @@ const { ...@@ -1252,6 +1413,10 @@ const {
? timeRange.value[1] ? timeRange.value[1]
: null, : null,
status: status.value, status: status.value,
exceptionHandling:
status.value === 'EXCEPTION_ORDER'
? exceptionStatus.value || undefined
: undefined,
}, },
page, page,
pageSize, pageSize,
...@@ -1290,6 +1455,9 @@ const handleProductionClientChange = async (v: string) => { ...@@ -1290,6 +1455,9 @@ const handleProductionClientChange = async (v: string) => {
} }
} }
} }
const downloadFacebook = async (row: string) => {
window.open(filePath + row, '_blank')
}
const confirm = async (row: ProductList) => { const confirm = async (row: ProductList) => {
confirmDialogShow.value = true confirmDialogShow.value = true
productionClientValue.value = '' productionClientValue.value = ''
...@@ -1425,6 +1593,44 @@ const updateOrder = async () => { ...@@ -1425,6 +1593,44 @@ const updateOrder = async () => {
loading.close() loading.close()
} }
} }
const assignOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
currentOrderIds.value = selection.value.map((item) => item.id)
exceptionDialogVisible.value = true
}
const handleExceptionOrder = async () => {
if (selection.value.length === 0) {
return ElMessage.warning('请选择数据')
}
try {
await showConfirm('确定处理异常吗?', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
})
} catch {
return
}
const orderIds = selection.value.map((item) => item.id)
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
const res = await handleExceptionOrderApi(orderIds)
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
loadTabData()
} catch (e) {
console.error(e)
} finally {
loading.close()
}
}
const printProductionOrder = async () => { const printProductionOrder = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
return ElMessage.warning('请选择数据') return ElMessage.warning('请选择数据')
...@@ -1498,35 +1704,61 @@ const pickingComplete = async () => { ...@@ -1498,35 +1704,61 @@ const pickingComplete = async () => {
loading.close() loading.close()
} }
} }
const exceptionTypes = [
{ value: '1', label: '客户' },
{ value: '2', label: '工厂' },
]
const exceptionDialogVisible = ref(false)
const currentOrderIds = ref<number[]>([])
const exceptionForm = ref({
exceptionType: '',
exceptionReason: '',
})
const exceptionFormRef = ref()
const changeExceptionOrder = async () => { const changeExceptionOrder = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
return ElMessage.warning('请选择数据') return ElMessage.warning('请选择数据')
} }
const orderIds = selection.value.map((item) => item.id) currentOrderIds.value = selection.value.map((item) => item.id)
ElMessageBox.prompt('请填写异常原因', '提示', { exceptionDialogVisible.value = true
confirmButtonText: '确认', }
cancelButtonText: '取消',
inputPattern: /^.{1,2000}$/, const handleExceptionConfirm = async () => {
inputErrorMessage: '请输入异常原因', try {
}).then(async ({ value }) => { await exceptionFormRef.value.validate()
const loading = ElLoading.service({ } catch {
fullscreen: true, return
text: '操作中...', }
background: 'rgba(0, 0, 0, 0.3)',
}) const loading = ElLoading.service({
try { fullscreen: true,
const res = await changeExceptionOrderApi(orderIds, value) text: '操作中...',
if (res.code !== 200) return background: 'rgba(0, 0, 0, 0.3)',
ElMessage.success('操作成功')
search()
loadTabData()
} catch (e) {
console.error(e)
} finally {
loading.close()
}
}) })
const url =
status.value === 'EXCEPTION_ORDER'
? 'factory/podJomallOrderUs/distributionExceptionOrders'
: 'factory/podJomallOrderUs/exceptionOrders'
try {
const res = await changeExceptionOrderApi(
url,
currentOrderIds.value,
exceptionForm.value.exceptionType,
exceptionForm.value.exceptionReason,
)
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
loadTabData()
exceptionDialogVisible.value = false
} catch (e) {
console.error(e)
} finally {
loading.close()
}
}
const handleExceptionDialogOpen = () => {
exceptionFormRef.value.resetFields()
} }
const cancelOrder = async () => { const cancelOrder = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
...@@ -1683,6 +1915,10 @@ const getOrderByIdApi = async (type: string) => { ...@@ -1683,6 +1915,10 @@ const getOrderByIdApi = async (type: string) => {
Fn: (orderIds: (string | number)[]) => Promise<BaseRespData<never>> Fn: (orderIds: (string | number)[]) => Promise<BaseRespData<never>>
} }
} = { } = {
createLogisticsOrder: {
message: '创建物流订单',
Fn: createLogisticsOrdersApi,
},
getTrackingNumber: { message: '获取跟踪号', Fn: getTrackingNumberApi }, getTrackingNumber: { message: '获取跟踪号', Fn: getTrackingNumberApi },
getPrintOrder: { message: '获取打印面单', Fn: getfaceSimplexFileApi }, getPrintOrder: { message: '获取打印面单', Fn: getfaceSimplexFileApi },
cancelLogisticsOrder: { cancelLogisticsOrder: {
...@@ -1691,14 +1927,12 @@ const getOrderByIdApi = async (type: string) => { ...@@ -1691,14 +1927,12 @@ const getOrderByIdApi = async (type: string) => {
}, },
} }
if (['batchChangeLogistics', 'createLogisticsOrder'].includes(type)) { if (['batchChangeLogistics'].includes(type)) {
if (selection.value.length !== 1) { if (selection.value.length !== 1) {
return ElMessage.warning('请选择单条数据') return ElMessage.warning('请选择单条数据')
} }
wayDialogTitle.value = wayDialogTitle.value = `切换物流(当前物流方式:${selection.value[0]?.logisticsWayName})`
type === 'batchChangeLogistics'
? `切换物流(当前物流方式:${selection.value[0]?.logisticsWayName})`
: '创建物流'
isChangeWay.value = true isChangeWay.value = true
const { data } = await getLogisticsCalculation(selection.value[0]?.id) const { data } = await getLogisticsCalculation(selection.value[0]?.id)
...@@ -1757,20 +1991,22 @@ const isChangeWayLoading = ref(false) ...@@ -1757,20 +1991,22 @@ const isChangeWayLoading = ref(false)
const changeWayRef = ref() const changeWayRef = ref()
const wayDialogTitle = ref('') const wayDialogTitle = ref('')
const rowClick = (row: LogisticsData, title: string) => { const rowClick = (row: LogisticsData, title?: string) => {
console.log(title, 'title')
try { try {
if (title == '创建物流') { // if (title == '创建物流订单') {
changeWayRow.value = row // changeWayRow.value = row
} else { // } else {
if (row.logisticsWayId === selection.value[0]?.logisticsWayId) { if (row.logisticsWayId === selection.value[0]?.logisticsWayId) {
changeWayRow.value = {} as LogisticsData ElMessage.warning('不能选择相同的物流方式')
// nextTick(() => { changeWayRow.value = {} as LogisticsData
changeWayRef.value?.setCurrentRow()
// }) changeWayRef.value?.setCurrentRow()
return
} return
changeWayRow.value = row
} }
changeWayRow.value = row
// }
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
...@@ -1790,7 +2026,7 @@ const changeWaySubmit = async (title: string) => { ...@@ -1790,7 +2026,7 @@ const changeWaySubmit = async (title: string) => {
return ElMessage.warning('请选择状态为成功的物流方式') return ElMessage.warning('请选择状态为成功的物流方式')
} }
let Fn let Fn
if (title !== '创建物流') { if (title !== '创建物流订单') {
if ( if (
changeWayRow.value.logisticsWayId === selection.value[0]?.logisticsWayId changeWayRow.value.logisticsWayId === selection.value[0]?.logisticsWayId
) { ) {
...@@ -1882,12 +2118,13 @@ const stockOutCheck = async () => { ...@@ -1882,12 +2118,13 @@ const stockOutCheck = async () => {
loading.close() loading.close()
} }
} }
//转至待创建物流
const toBePicking = async () => { const toBePicking = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
return ElMessage.warning('请选择数据') return ElMessage.warning('请选择数据')
} }
try { try {
await ElMessageBox.confirm('确定转至待拣胚吗?', '提示', { await ElMessageBox.confirm('确定转至待创建物流吗?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
...@@ -1912,6 +2149,39 @@ const toBePicking = async () => { ...@@ -1912,6 +2149,39 @@ const toBePicking = async () => {
loading.close() loading.close()
} }
} }
//转至待拣胚
const logisticsToPicking = 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 updateLogisticsToPickingApi({
ids: selection.value.map((item) => item.id).join(','),
})
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
loadTabData()
} catch (e) {
console.error(e)
} finally {
loading.close()
}
}
const sheetPrinter = ref('') const sheetPrinter = ref('')
const handlePrinterChange = (value: string) => { const handlePrinterChange = (value: string) => {
sheetPrinter.value = value sheetPrinter.value = value
...@@ -2153,6 +2423,11 @@ onMounted(() => { ...@@ -2153,6 +2423,11 @@ onMounted(() => {
loadProductionClient() loadProductionClient()
loadWarehouseList() loadWarehouseList()
}) })
const handleExceptionCommand = (command: number) => {
exceptionStatus.value = command
search()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.header-filter-form { .header-filter-form {
...@@ -2175,6 +2450,7 @@ onMounted(() => { ...@@ -2175,6 +2450,7 @@ onMounted(() => {
color: #000; color: #000;
cursor: pointer; cursor: pointer;
height: 40px; height: 40px;
font-weight: 500;
} }
.tabs-node:hover { .tabs-node:hover {
...@@ -2243,6 +2519,29 @@ onMounted(() => { ...@@ -2243,6 +2519,29 @@ onMounted(() => {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
} }
.tabs-node_count {
display: inline-block;
min-width: 20px;
height: 20px;
line-height: 20px;
border-radius: 50%;
font-size: 14px;
text-align: center;
margin-left: 4px;
background: #f2f3f5; // 默认灰色
color: #666;
font-weight: 500;
}
.tabs-node_count.blue {
background: rgb(219, 234, 254);
color: rgb(30, 64, 175);
}
.tabs-node_count.red {
background: rgb(254 226 226);
color: rgb(153 27 27);
}
.empty { .empty {
height: 100%; height: 100%;
...@@ -2311,4 +2610,31 @@ onMounted(() => { ...@@ -2311,4 +2610,31 @@ onMounted(() => {
} }
} }
} }
.sub-status {
display: flex;
align-items: center;
border-bottom: 1px solid #e5e6eb;
background: #fff;
.sub-status-item {
position: relative;
font-size: 16px;
cursor: pointer;
padding: 6px 24px 6px 24px;
border: 1px solid #e5e6eb;
background: #f7f8fa;
color: #606266;
margin-bottom: -1px;
transition: background 0.2s, color 0.2s;
&:not(:last-child) {
border-right: none;
}
&.sub-active {
background: #fff;
color: #1d2129;
font-weight: 600;
border-bottom: 1px solid transparent;
z-index: 2;
}
}
}
</style> </style>
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