20261008-ide1.0发布 #1

Merged
zzh merged 24 commits from test into master 2026-10-08 09:19:21 +08:00
5 changed files with 148 additions and 0 deletions
Showing only changes of commit f849e5d124 - Show all commits

View File

@ -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),
}
}

View File

@ -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: '下游预报结果' },
]),

View File

@ -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',

View File

@ -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': '待发货',

View File

@ -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>