20261008-ide1.0发布 #1
@ -94,3 +94,53 @@ export async function postPickupOrderDownstreamForward(id: number | string) {
|
||||
trackNo: d.trackNo ?? d.TrackNo,
|
||||
}
|
||||
}
|
||||
|
||||
export type PickupBigBagTrackStepResult = {
|
||||
skipped?: boolean
|
||||
skipReason?: string
|
||||
success?: boolean
|
||||
url?: string
|
||||
requestJson?: string
|
||||
statusCode?: number
|
||||
responseBody?: string
|
||||
}
|
||||
|
||||
export type PickupBigBagTrackSyncResult = {
|
||||
pickupNo?: string
|
||||
success?: boolean
|
||||
failStep?: string
|
||||
message?: string
|
||||
upsertBigBag?: PickupBigBagTrackStepResult
|
||||
link?: PickupBigBagTrackStepResult
|
||||
trackUpsert?: PickupBigBagTrackStepResult
|
||||
}
|
||||
|
||||
function mapTrackStep(raw: any | undefined): PickupBigBagTrackStepResult | undefined {
|
||||
if (!raw) return undefined
|
||||
return {
|
||||
skipped: raw.skipped ?? raw.Skipped,
|
||||
skipReason: raw.skipReason ?? raw.SkipReason,
|
||||
success: raw.success ?? raw.Success,
|
||||
url: raw.url ?? raw.Url,
|
||||
requestJson: raw.requestJson ?? raw.RequestJson,
|
||||
statusCode: raw.statusCode ?? raw.StatusCode,
|
||||
responseBody: raw.responseBody ?? raw.ResponseBody,
|
||||
}
|
||||
}
|
||||
|
||||
/** POST /order/pickup-order/track-upsert-big-bag → UpsertBigBag + Link + Track A0201 */
|
||||
export async function postPickupOrderTrackUpsertBigBag(
|
||||
id: number | string,
|
||||
): Promise<PickupBigBagTrackSyncResult> {
|
||||
const data = await postOk('/order/pickup-order/track-upsert-big-bag', { id })
|
||||
const d = (data ?? {}) as Record<string, any>
|
||||
return {
|
||||
pickupNo: d.pickupNo ?? d.PickupNo,
|
||||
success: d.success ?? d.Success,
|
||||
failStep: d.failStep ?? d.FailStep,
|
||||
message: d.message ?? d.Message,
|
||||
upsertBigBag: mapTrackStep(d.upsertBigBag ?? d.UpsertBigBag),
|
||||
link: mapTrackStep(d.link ?? d.Link),
|
||||
trackUpsert: mapTrackStep(d.trackUpsert ?? d.TrackUpsert),
|
||||
}
|
||||
}
|
||||
|
||||
@ -597,6 +597,7 @@ const CORE_GROUPS: PageButtonGroup[] = [
|
||||
{ code: 'Query', name: '查询' },
|
||||
{ code: 'Search', name: '搜索' },
|
||||
{ code: 'Create', name: '创建揽收订单' },
|
||||
{ code: 'CreateTrack', name: '创建轨迹订单' },
|
||||
{ code: 'ForwardDownstream', name: '预报下游订单' },
|
||||
{ code: 'DownstreamForecastResult', name: '下游预报结果' },
|
||||
]),
|
||||
|
||||
@ -891,6 +891,8 @@ export default {
|
||||
'order.pickupOrder.message.downstreamNeedSelect': 'Select pickup sheets to forward downstream',
|
||||
'order.pickupOrder.message.downstreamNoBoundOrders': 'Selected pickup sheets cannot be forwarded',
|
||||
'order.pickupOrder.message.downstreamPartialEmpty': 'Skipped pickup sheets: {pickups}',
|
||||
'order.pickupOrder.message.trackNeedSelect': 'Select pickup sheets to create track orders',
|
||||
'order.pickupOrder.modal.trackUpsertTitle': 'Create track order result',
|
||||
'order.platformStoreOrder.status.all': 'All',
|
||||
'order.platformStoreOrder.status.pending': 'Pending',
|
||||
'order.platformStoreOrder.status.toShip': 'To Ship',
|
||||
|
||||
@ -882,6 +882,8 @@ export default {
|
||||
'order.pickupOrder.message.downstreamNeedSelect': '请先选中要预报下游的揽收单',
|
||||
'order.pickupOrder.message.downstreamNoBoundOrders': '所选揽收单无法预报下游',
|
||||
'order.pickupOrder.message.downstreamPartialEmpty': '以下揽收单预报已跳过:{pickups}',
|
||||
'order.pickupOrder.message.trackNeedSelect': '请先选中要创建轨迹订单的揽收单',
|
||||
'order.pickupOrder.modal.trackUpsertTitle': '创建轨迹订单结果',
|
||||
'order.platformStoreOrder.status.all': '全部',
|
||||
'order.platformStoreOrder.status.pending': '待处理',
|
||||
'order.platformStoreOrder.status.toShip': '待发货',
|
||||
|
||||
@ -24,9 +24,12 @@ import {
|
||||
payPickupOrder,
|
||||
payPickupOrderBatch,
|
||||
postPickupOrderDownstreamForward,
|
||||
postPickupOrderTrackUpsertBigBag,
|
||||
removePickupOrderOrders,
|
||||
reschedulePickupOrder,
|
||||
schedulePickupOrder,
|
||||
type PickupBigBagTrackSyncResult,
|
||||
type PickupBigBagTrackStepResult,
|
||||
} from '@/api/order/pickupOrder'
|
||||
import { type OrderDownstreamForwardResult } from '@/api/order'
|
||||
import { CustomerService } from '@/api/customer'
|
||||
@ -123,6 +126,9 @@ const batchScheduling = ref(false)
|
||||
const batchDownstreamForwarding = ref(false)
|
||||
const downstreamForwardModalVisible = ref(false)
|
||||
const downstreamForwardResultText = ref('')
|
||||
const batchTrackUpserting = ref(false)
|
||||
const trackUpsertModalVisible = ref(false)
|
||||
const trackUpsertResultText = ref('')
|
||||
/** batch schedule uses same schedule modal with multiple ids */
|
||||
const batchScheduleIds = ref<number[]>([])
|
||||
|
||||
@ -130,6 +136,10 @@ const canForwardDownstream = computed(
|
||||
() =>
|
||||
hasPermission('Order.Pickup.ForwardDownstream') || hasPermission('Order.Pickup.Create'),
|
||||
)
|
||||
const canCreateTrack = computed(
|
||||
() =>
|
||||
hasPermission('Order.Pickup.CreateTrack') || hasPermission('Order.Pickup.Create'),
|
||||
)
|
||||
|
||||
const selectedRowCount = computed(() => selectedRows.value.length)
|
||||
const hasSelectedRows = computed(() => selectedRowCount.value > 0)
|
||||
@ -646,6 +656,71 @@ async function handleForwardDownstreamCreate() {
|
||||
}
|
||||
}
|
||||
|
||||
function formatTrackStep(stepName: string, step?: PickupBigBagTrackStepResult): string[] {
|
||||
if (!step) return [`【${stepName}】未执行`]
|
||||
const lines = [`【${stepName}】`]
|
||||
if (step.skipped) {
|
||||
lines.push(`跳过:${step.skipReason || '未知原因'}`)
|
||||
return lines
|
||||
}
|
||||
lines.push(`成功:${step.success ? '是' : '否'}`)
|
||||
lines.push(`请求:${step.url || '-'}`)
|
||||
if (step.requestJson) lines.push(`请求体:\n${step.requestJson}`)
|
||||
lines.push(`HTTP:${step.statusCode ?? '-'}`)
|
||||
if (step.responseBody) lines.push(`响应:\n${step.responseBody}`)
|
||||
return lines
|
||||
}
|
||||
|
||||
function formatTrackUpsertResult(pickupNo: string, result: PickupBigBagTrackSyncResult): string {
|
||||
const lines = [
|
||||
`【${pickupNo || result.pickupNo || '-'}】`,
|
||||
`整体:${result.success ? '成功' : '失败'}`,
|
||||
]
|
||||
if (result.failStep) lines.push(`失败步骤:${result.failStep}`)
|
||||
if (result.message) lines.push(`说明:${result.message}`)
|
||||
lines.push('')
|
||||
lines.push(...formatTrackStep('1. UpsertBigBag', result.upsertBigBag))
|
||||
lines.push('')
|
||||
lines.push(...formatTrackStep('2. Link', result.link))
|
||||
lines.push('')
|
||||
lines.push(...formatTrackStep('3. Track A0201', result.trackUpsert))
|
||||
return lines.join('\n')
|
||||
}
|
||||
|
||||
async function handleCreateTrackOrder() {
|
||||
if (!canCreateTrack.value) {
|
||||
$baseMessage(t('order.pickupOrder.message.noPermission'), 'warning')
|
||||
return
|
||||
}
|
||||
if (batchTrackUpserting.value) return
|
||||
|
||||
const pickupRows = selectedRows.value.filter((row) => row?.id != null)
|
||||
if (!pickupRows.length) {
|
||||
$baseMessage(t('order.pickupOrder.message.trackNeedSelect'), 'warning')
|
||||
return
|
||||
}
|
||||
|
||||
batchTrackUpserting.value = true
|
||||
try {
|
||||
const resultBlocks: string[] = []
|
||||
for (const pickup of pickupRows) {
|
||||
const pickupNo = String(pickup.pickupNo || pickup.id)
|
||||
try {
|
||||
const result = await postPickupOrderTrackUpsertBigBag(pickup.id)
|
||||
resultBlocks.push(formatTrackUpsertResult(pickupNo, result))
|
||||
} catch (err: any) {
|
||||
resultBlocks.push(`【${pickupNo}】失败:${err?.message || '请求异常'}`)
|
||||
}
|
||||
}
|
||||
trackUpsertResultText.value = resultBlocks.join('\n\n')
|
||||
trackUpsertModalVisible.value = true
|
||||
} catch (e: any) {
|
||||
$baseMessage(e?.message || t('order.pickupOrder.message.actionFailed'), 'error')
|
||||
} finally {
|
||||
batchTrackUpserting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
async function doBatchPay() {
|
||||
const ids = batchPayCandidates.value.map((row) => row.id).filter((id) => id != null)
|
||||
if (!ids.length) return
|
||||
@ -1401,6 +1476,15 @@ onMounted(async () => {
|
||||
>
|
||||
{{ t('order.pickupOrder.actions.batchSchedule') }}
|
||||
</a-button>
|
||||
<a-button
|
||||
v-if="canCreateTrack"
|
||||
class="app-btn-toolbar"
|
||||
:loading="batchTrackUpserting"
|
||||
:disabled="!hasSelectedRows || batchTrackUpserting"
|
||||
@click="handleCreateTrackOrder"
|
||||
>
|
||||
{{ t('order.myOrders.actions.createTrackOrder') }}
|
||||
</a-button>
|
||||
<a-button
|
||||
v-if="canForwardDownstream"
|
||||
class="app-btn-toolbar"
|
||||
@ -1801,6 +1885,15 @@ onMounted(async () => {
|
||||
>
|
||||
<pre class="downstream-forward-result">{{ downstreamForwardResultText }}</pre>
|
||||
</a-modal>
|
||||
|
||||
<a-modal
|
||||
v-model:visible="trackUpsertModalVisible"
|
||||
:title="t('order.pickupOrder.modal.trackUpsertTitle')"
|
||||
:width="800"
|
||||
:footer="false"
|
||||
>
|
||||
<pre class="downstream-forward-result">{{ trackUpsertResultText }}</pre>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user