44 lines
3.4 KiB
Vue
44 lines
3.4 KiB
Vue
<script setup lang="ts">
|
|
import { ref, watch } from 'vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import AppDialog from '@/shared/components/AppDialog.vue'
|
|
import LoadErrorState from '@/shared/components/LoadErrorState.vue'
|
|
import ApiErrorMeta from '@/shared/components/ApiErrorMeta.vue'
|
|
import { getApiErrorDetails, type ApiErrorDetails } from '@/shared/api/http'
|
|
import { getLocalLooseboardOrder, reviewLocalLooseboardOrder } from '../api/platformOverseasBusiness'
|
|
import type { LocalLooseboardDetail, LocalLooseboardOrder } from '../types'
|
|
const open = defineModel<boolean>({default: false})
|
|
const props = defineProps<{order: LocalLooseboardOrder | null}>()
|
|
const emit = defineEmits<{saved: []}>()
|
|
const detail = ref<LocalLooseboardDetail | null>(null), busy = ref(false), loading = ref(false), error = ref<ApiErrorDetails | null>(null)
|
|
const decision = ref<'APPROVE' | 'REJECT'>('APPROVE'), remark = ref('')
|
|
let generation = 0
|
|
async function load() {
|
|
if (!props.order) return
|
|
const current=++generation; loading.value=true; detail.value=null; error.value=null
|
|
try { const value=await getLocalLooseboardOrder(props.order.orderNo,props.order.customerId); if(current===generation)detail.value=value }
|
|
catch(cause) { if(current===generation)error.value=getApiErrorDetails(cause,'散板订单读取失败') }
|
|
finally { if(current===generation)loading.value=false }
|
|
}
|
|
async function submit() {
|
|
if (!detail.value || busy.value) return
|
|
if (decision.value==='REJECT' && !remark.value.trim()) { ElMessage.warning('请填写驳回原因'); return }
|
|
busy.value=true; error.value=null
|
|
try {
|
|
await reviewLocalLooseboardOrder(detail.value.orderNo,detail.value.customerId,{version:detail.value.version,decision:decision.value,remark:remark.value.trim() || undefined,idempotencyKey:crypto.randomUUID()})
|
|
ElMessage.success(decision.value==='APPROVE'?'审核通过,已生成关联收货任务':'订单已驳回'); open.value=false; emit('saved')
|
|
} catch(cause) { error.value=getApiErrorDetails(cause,'散板审核失败'); await load().catch(()=>undefined); error.value=getApiErrorDetails(cause,'散板审核失败') }
|
|
finally { busy.value=false }
|
|
}
|
|
watch(open,value=>{if(value){decision.value='APPROVE';remark.value='';void load()}else generation++})
|
|
</script>
|
|
<template><AppDialog v-model="open" title="审核本土散板订单" width="680px" class="admin-density-dialog admin-workbench" :confirm-loading="busy" :confirm-disabled="loading || !detail || detail.status !== 'PENDING_ACCEPTANCE'" lock-while-submitting @confirm="submit">
|
|
<LoadErrorState v-if="error" title="审核暂未完成" :message="error.message" @retry="load"><template #details><ApiErrorMeta :details="error" /></template></LoadErrorState>
|
|
<el-form v-if="detail" label-position="top" :disabled="busy" class="density-form">
|
|
<el-form-item label="订单号">{{detail.orderNo}}</el-form-item>
|
|
<el-form-item label="入仓方式">{{detail.deliveryMode==='WAREHOUSE_PICKUP'?'仓库上门取货':detail.deliveryMode==='DELIVERY_TO_WAREHOUSE'?'送货到仓':'未填写,需先编辑补齐'}}</el-form-item>
|
|
<el-form-item label="审核结果"><el-radio-group v-model="decision"><el-radio value="APPROVE">通过</el-radio><el-radio value="REJECT">驳回</el-radio></el-radio-group></el-form-item>
|
|
<el-form-item label="审核意见" :required="decision==='REJECT'"><el-input v-model="remark" type="textarea" maxlength="1000" :rows="3" /></el-form-item>
|
|
</el-form>
|
|
</AppDialog></template>
|