Commit f8b0a5da by zhuzhequan

Merge branch 'dev' into 'master'

feat:podus订单补发逻辑优化

See merge request !106
parents 9498e00e 1b517a57
...@@ -573,10 +573,15 @@ export function changeToFinished(ids: string) { ...@@ -573,10 +573,15 @@ export function changeToFinished(ids: string) {
) )
} }
export function reissueOrderApi(ids: string) { export function reissueOrderApi(data: {
return axios.get<never, BaseRespData<never>>( ids:string
reissueType:number
trackingNumber?:string
expressSheet:string
}) {
return axios.post<never, BaseRespData<never>>(
`factory/podJomallOrderUs/reissueOrder`, `factory/podJomallOrderUs/reissueOrder`,
{ params: { ids } }, data,
) )
} }
export function OrderCnReceiverAddress(idList: number[]) { export function OrderCnReceiverAddress(idList: number[]) {
......
<script setup lang="ts">
import { ref } from 'vue'
import { Plus, Close } from '@element-plus/icons-vue'
import { reissueOrderApi, uploadExpressSheet } from '@/api/podUsOrder.ts'
import { PodUsOrderListData } from '@/types/api/podUsOrder.ts'
const dialogShow = ref(false)
const formRef = ref()
const open = () => {
form.value = {
reissueType: 1,
trackingNumber: '',
expressSheet: '',
file: null,
}
dialogShow.value = true
}
const emit = defineEmits(['success'])
const props = defineProps({
selection: {
type: Array,
default: () => [],
},
})
const formRules = {
reissueType: {
required: true,
message: '请选择补发方式',
trigger: 'change',
},
trackingNumber: {
required: true,
message: '请输入跟踪号',
trigger: 'blur',
},
file: {
required: true,
message: '请上传物流面单',
trigger: 'change',
},
}
interface Iform {
reissueType: number
trackingNumber: string
expressSheet: string
file: File | null
}
const form = ref<Iform>({
reissueType: 1,
trackingNumber: '',
expressSheet: '',
file: null,
})
defineExpose({ open })
const submit = async () => {
await formRef.value.validate()
if((props.selection as PodUsOrderListData[])[0].shipmentType===0 && form.value.reissueType!==1){
if(!form.value.expressSheet){
return ElMessage.warning('请上传物流面单')
}
}
await reissueOrderApi({
ids: (props.selection as PodUsOrderListData[]).map(e => e.id).join(),
reissueType: form.value.reissueType,
trackingNumber: form.value.trackingNumber,
expressSheet: form.value.expressSheet,
})
ElMessage.success('操作成功')
dialogShow.value = false
emit('success')
}
const radioChange = () => {
form.value.trackingNumber = ''
form.value.expressSheet = ''
form.value.file = null
}
const clearFile = () => {
form.value.file = null
form.value.expressSheet = ''
}
const createFormToUpload = () => {
const input = document.createElement('input')
input.type = 'file'
input.style.display = 'none'
input.accept = '.pdf'
input.name = 'file'
document.body.appendChild(input)
input.click()
input.onchange = async function() {
console.log(input.files)
if (input.files?.length !== 1) {
return ElMessage.warning('请上传一个面单')
}
form.value.file = input.files[0]
const fm = new FormData()
fm.append('file', input.files[0])
fm.append('trackingNumber', form.value.trackingNumber)
const res = await uploadExpressSheet(fm as never)
form.value.expressSheet = res.message || ''
}
}
</script>
<template>
<el-dialog v-model="dialogShow" title="补发" :close-on-click-modal="false">
<el-form v-if="selection.length" ref="formRef" :rules="formRules" :model="form">
<el-form-item required label="补发方式" prop="reissueType">
<el-radio-group
v-model="form.reissueType"
style="display: flex;flex-direction: column;align-items: flex-start;"
@change="radioChange">
<el-radio :label="1">原单补发</el-radio>
<el-radio
:disabled="(selection as PodUsOrderListData[])[0].shipmentType===0 && selection.length>1"
:label="2">换单补发,取消原单物流
</el-radio>
<el-radio
:disabled="(selection as PodUsOrderListData[])[0].shipmentType===0 && selection.length>1"
:label="3">换单补发,不取消原单物流
</el-radio>
</el-radio-group>
</el-form-item>
<span v-if="(selection as PodUsOrderListData[])[0].shipmentType===0 && selection.length>1" class="tip">自有物流选择选项2和选项3请单个操作,不支持批量操作;</span>
<el-form-item
v-if="(selection as PodUsOrderListData[])[0].shipmentType===0 && form.reissueType!==1" required
label="物流信息" prop="trackingNumber">
<div class="form-content">
<div class="content-item">
<div class="label">跟踪号</div>
<el-input v-model="form.trackingNumber" style="height: 40px" placeholder="请输入跟踪号"></el-input>
</div>
<div v-if="form.trackingNumber" class="content-item">
<div class="label">物流面单</div>
<div class="upload" @click="createFormToUpload">
<el-icon>
<Plus></Plus>
</el-icon>
</div>
<div v-if="form.file" class="file">
<div class="name">{{ form.file.name }}</div>
<div class="close" @click="clearFile">
<el-icon>
<Close></Close>
</el-icon>
</div>
</div>
</div>
</div>
</el-form-item>
<el-form-item v-if="(selection as PodUsOrderListData[])[0].shipmentType===0 && form.reissueType!==1">
<div class="tip-2">自有物流请联系客户提供新跟踪号和面单</div>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogShow=false">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</template>
</el-dialog>
</template>
<style scoped lang="scss">
.tip {
color: red;
position: relative;
top: -14px;
left: 79px;
}
.form-content, .content-item {
display: flex;
margin-right: 25px;
.upload {
border: 1px darkgray solid;
width: 50px;
cursor: pointer;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
}
.file {
display: flex;
margin-left: 25px;
align-items: center;
gap: 6px;
.close {
cursor: pointer;
color: red;
}
}
.label {
width: 70px;
}
}
.tip-2{
color: red;
margin-left: 13px;
position: relative;
top: -9px;
}
</style>
...@@ -875,39 +875,6 @@ ...@@ -875,39 +875,6 @@
}}</span }}</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">
...@@ -1575,13 +1542,14 @@ ...@@ -1575,13 +1542,14 @@
</div> </div>
<div class="order-detail-item"> <div class="order-detail-item">
<span class="order-detail-item-label">订单来源:</span> <span class="order-detail-item-label">订单来源:</span>
<span class="order-detail-item-value"> <span :class="{'red-big':row.source==='factory-reissue'}" class="order-detail-item-value">
{{ {{
row.source row.source
? { ? {
'jomall-erp': 'erp推送', 'jomall-erp': 'erp推送',
'third-party': '第三方推送', 'third-party': '第三方推送',
}[row.source as 'jomall-erp' | 'third-party'] 'factory-reissue': '补发订单',
}[row.source as 'jomall-erp' | 'third-party' | 'factory-reissue']
: '' : ''
}} }}
</span> </span>
...@@ -2922,6 +2890,7 @@ ...@@ -2922,6 +2890,7 @@
<ElButton type="primary" @click="confirmReplenishment">确定</ElButton> <ElButton type="primary" @click="confirmReplenishment">确定</ElButton>
</template> </template>
</ElDialog> </ElDialog>
<ReissueOrderComponent ref="reissueOrderRef" :selection="selection" @success="handleSuccess"></ReissueOrderComponent>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import LogisticsWaySelect from '../../logistics/components/LogisticsWaySelect.tsx' import LogisticsWaySelect from '../../logistics/components/LogisticsWaySelect.tsx'
...@@ -3052,8 +3021,10 @@ import { isArray, isString } from '@/utils/validate' ...@@ -3052,8 +3021,10 @@ import { isArray, isString } from '@/utils/validate'
import platformJson from '../../../json/platform.json' import platformJson from '../../../json/platform.json'
import { getToken } from '@/api/axios' import { getToken } from '@/api/axios'
import usePermissionBtnStore from '@/store/permission' import usePermissionBtnStore from '@/store/permission'
import ReissueOrderComponent from './components/ReissueOrder.vue'
const permissionBtns = usePermissionBtnStore() const permissionBtns = usePermissionBtnStore()
import { import {
useRouter, useRouter,
type NavigationGuardNext, type NavigationGuardNext,
...@@ -3083,10 +3054,14 @@ const sourceList = [ ...@@ -3083,10 +3054,14 @@ const sourceList = [
{ {
name: '第三方推送', name: '第三方推送',
id: 'third-party', id: 'third-party',
},{
name: '补发订单',
id: 'factory-reissue',
}, },
] ]
const sizes = ['FS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL', '4XL', '5XL'] const sizes = ['FS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL', '4XL', '5XL']
const tabsNav = ref<Tab[]>() const tabsNav = ref<Tab[]>()
const reissueOrderRef = ref()
const isAuto = ref(true) const isAuto = ref(true)
const countryList = ref([]) const countryList = ref([])
const logisticsWayList = ref<{ name: string; id: number }[]>([]) const logisticsWayList = ref<{ name: string; id: number }[]>([])
...@@ -6351,29 +6326,11 @@ const reissueOrder = async () => { ...@@ -6351,29 +6326,11 @@ const reissueOrder = async () => {
if (selection.value.length === 0) { if (selection.value.length === 0) {
return ElMessage.warning('请选择数据') return ElMessage.warning('请选择数据')
} }
await ElMessageBox.confirm('是否补发?', '提示', { const isSameShipmentType = Array.from(new Set(selection.value.map(s=>s.shipmentType))).length===1
confirmButtonText: '确定', if(!isSameShipmentType){
cancelButtonText: '取消', return ElMessage.warning('请选择相同物流类型的数据')
type: 'warning',
})
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
const res = await reissueOrderApi(
selection.value.map((item) => item.id).join(','),
)
if (res.code !== 200) return
ElMessage.success('操作成功')
search()
await loadTabData()
} catch (e) {
console.error(e)
} finally {
loading.close()
} }
reissueOrderRef.value.open()
} }
// 完成发货 // 完成发货
...@@ -6964,4 +6921,8 @@ const printNormal = async () => { ...@@ -6964,4 +6921,8 @@ const printNormal = async () => {
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.red-big{
font-size: 15px;
color: red;
}
</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