Files
shanxia2.0/miniprogram/pages/db/weighing/detail.vue
T
2026-07-17 21:59:47 +08:00

158 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup>
import { ref, computed } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { getWeighing, updateWeighing, voidWeighing } from '@/api/db'
import { weighingPhase, dash, formatWeight, nowYmdHms, todayYmd } from '@/utils/dbLabels'
import { PAGE_PATHS } from '@/config/api'
const id = ref('')
const detail = ref(null)
const showSecond = ref(false)
const tareWeight = ref('')
const acting = ref(false)
const phase = computed(() => weighingPhase(detail.value))
const canSecond = computed(() => phase.value.text === '一次过磅')
const canVoid = computed(() => {
if (!detail.value || Number(detail.value.isVoided) === 1) return false
const t = String(detail.value.grossWeightTime || detail.value.createdAt || '')
return t.startsWith(todayYmd())
})
const goBack = () => {
uni.navigateBack({
fail: () => uni.navigateTo({ url: PAGE_PATHS.dbWeighingList })
})
}
const load = async () => {
if (!id.value) return
try {
detail.value = await getWeighing(id.value)
} catch (e) {
uni.showToast({ title: e.message || '加载失败', icon: 'none' })
}
}
const openSecond = () => {
tareWeight.value = ''
showSecond.value = true
}
const submitSecond = async () => {
const tare = Number(tareWeight.value)
if (!tare || tare <= 0) {
uni.showToast({ title: '请填写皮重', icon: 'none' })
return
}
const gross = Number(detail.value?.grossWeight) || 0
const deduction = Number(detail.value?.deduction) || 0
const net = Math.max(gross - tare - deduction, 0)
acting.value = true
try {
await updateWeighing(id.value, {
tareWeight: tare,
tareWeightTime: nowYmdHms(),
netWeight: net
})
uni.showToast({ title: '二次过磅已保存', icon: 'success' })
showSecond.value = false
load()
} catch (e) {
uni.showToast({ title: e.message || '保存失败', icon: 'none' })
} finally {
acting.value = false
}
}
const onVoid = () => {
uni.showModal({
title: '作废地磅单',
content: '仅支持作废当天单据,确认作废?',
success: async (r) => {
if (!r.confirm) return
acting.value = true
try {
await voidWeighing(id.value)
uni.showToast({ title: '已作废', icon: 'success' })
load()
} catch (e) {
uni.showToast({ title: e.message || '作废失败', icon: 'none' })
} finally {
acting.value = false
}
}
})
}
onLoad((q) => {
id.value = q?.id || ''
})
onShow(() => load())
</script>
<template>
<view class="mp-page mp-page--sub mp-page--with-bottom">
<view class="mp-header mp-header--db">
<text class="mp-subpage-back" @click="goBack">← 返回</text>
<text class="mp-header__title" style="margin-top: 16rpx">地磅单详情</text>
</view>
<view v-if="detail" class="mp-detail-hero">
<view class="mp-detail-hero__top">
<view>
<text class="mp-detail-hero__title">{{ dash(detail.vehicleNo) }}</text>
<text class="mp-detail-hero__sub">{{ dash(detail.cargoName) }} · {{ dash(detail.businessType) }}</text>
</view>
<text class="mp-tag" :class="'mp-tag--' + phase.tag">{{ phase.text }}</text>
</view>
<view class="mp-detail-hero__meta">
<text class="mp-detail-hero__chip">净重 {{ formatWeight(detail.netWeight) }}</text>
<text class="mp-detail-hero__chip">{{ dash(detail.batchNo) }}</text>
</view>
</view>
<view class="mp-block">
<text class="mp-block__title">过磅数据</text>
<view class="mp-block__panel">
<view class="mp-kv"><text class="mp-kv__label">毛重</text><text class="mp-kv__value">{{ formatWeight(detail?.grossWeight) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">毛重时间</text><text class="mp-kv__value">{{ dash(detail?.grossWeightTime) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">皮重</text><text class="mp-kv__value">{{ formatWeight(detail?.tareWeight) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">皮重时间</text><text class="mp-kv__value">{{ dash(detail?.tareWeightTime) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">扣重</text><text class="mp-kv__value">{{ formatWeight(detail?.deduction) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">净重</text><text class="mp-kv__value">{{ formatWeight(detail?.netWeight) }}</text></view>
</view>
</view>
<view class="mp-block">
<text class="mp-block__title">业务信息</text>
<view class="mp-block__panel">
<view class="mp-kv"><text class="mp-kv__label">计划号</text><text class="mp-kv__value">{{ dash(detail?.planNo) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">规格</text><text class="mp-kv__value">{{ dash(detail?.specification) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">供货单位</text><text class="mp-kv__value">{{ dash(detail?.supplier) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">收货单位</text><text class="mp-kv__value">{{ dash(detail?.consignee) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">过磅点</text><text class="mp-kv__value">{{ dash(detail?.weighingPoint) }}</text></view>
<view class="mp-kv"><text class="mp-kv__label">备注</text><text class="mp-kv__value">{{ dash(detail?.remarks) }}</text></view>
</view>
</view>
<view v-if="showSecond" class="mp-form-panel">
<view class="mp-form-row">
<text class="mp-form-label mp-form-label--req">皮重(kg)</text>
<input v-model="tareWeight" class="mp-form-input" type="digit" placeholder="二次过磅皮重" />
</view>
<view class="mp-form-row" style="display: flex; gap: 16rpx">
<view class="mp-btn mp-btn--ghost" style="flex: 1" @click="showSecond = false">取消</view>
<view class="mp-btn mp-btn--primary" style="flex: 1" @click="submitSecond">
{{ acting ? '…' : '确认保存' }}
</view>
</view>
</view>
<view class="mp-bottom-bar">
<view v-if="canSecond" class="mp-btn mp-btn--primary" @click="openSecond">二次过磅</view>
<view v-if="canVoid" class="mp-btn mp-btn--danger" @click="onVoid">作废</view>
</view>
</view>
</template>