lion 3 months ago
commit 6826cc18b0

@ -388,19 +388,20 @@
return
}
//
const currentUrl = window.location.href
// URLhashURL
const baseUrl = currentUrl.split('#')[0]
//
const shareConfig = {
title: '胥口枢纽闸站公众号',
desc: '主要功能为胥口闸站船只过闸预约、支付等功能',
link: baseUrl,
imgUrl: window.location.origin + '/static/icon_logo.png',
type: 'link'
}
//
const currentUrl = window.location.href
// URLhashURL
const baseUrl = currentUrl.split('#')[0]
const shareImageUrl = `${window.location.origin}/h5/static/icon_logo.png`
//
const shareConfig = {
title: '胥口枢纽闸站公众号',
desc: '主要功能为胥口闸站船只过闸预约、支付等功能',
link: baseUrl,
imgUrl: shareImageUrl,
type: 'link'
}
//
let safeShareUrl = shareConfig.link;
@ -506,4 +507,4 @@
<style lang="scss">
/*每个页面公共css */
@import "uview-ui/index.scss";
</style>
</style>

@ -43,4 +43,4 @@ export const API = {
GET_UNIT_PRICE: `${BASE_URL}/api/customer/setting/get-price`,
GET_SHIP_INSPECTION_EXAMPLES: `${BASE_URL}/api/customer/setting/get-ship-inspection-examples`,
PROFILE_SEND_PHONE_CODE: `${BASE_URL}/api/customer/profile/send-phone-code`,
}
}

@ -1,6 +1,6 @@
{
"name" : "胥口闸站购票",
"appid" : "__UNI__421D47B",
"appid" : "__UNI__480B41E",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",

@ -483,6 +483,12 @@ export default {
return ok;
},
openEditPopup() {
this.canSendCode = true;
this.countdown = 0;
if (this.countdownTimer) {
clearInterval(this.countdownTimer);
this.countdownTimer = null;
}
this.showEditPopup = true;
},
closeEditPopup() {
@ -493,6 +499,7 @@ export default {
this.countdownTimer = null;
}
this.countdown = 0;
this.canSendCode = true;
},
//
async sendSmsCode() {
@ -1138,4 +1145,4 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
</style>

@ -1,158 +1,226 @@
<template>
<view class="reservation-page">
<view class="fixed-nav">
<NavBar title="发票管理">
</NavBar>
</view>
<view class="content-area">
<!-- 基本信息分组 -->
<view class="invoice-section">
<view class="invoice-title">基本信息</view>
<view class="invoice-row">
<text class="invoice-label">抬头类型</text>
<picker :range="titleTypeOptions" v-model="form.titleTypeIndex">
<view class="invoice-value">{{ titleTypeOptions[form.titleTypeIndex] }}</view>
</picker>
</view>
<view class="invoice-row">
<text class="invoice-label">发票抬头</text>
<input class="invoice-value" v-model="form.title" placeholder="请输入发票抬头" />
</view>
<view class="invoice-row">
<text class="invoice-label">税号</text>
<input class="invoice-value" v-model="form.taxNo" placeholder="请输入税号" />
</view>
</view>
<!-- 预约信息分组 -->
<view class="invoice-section">
<view class="invoice-title">预约信息</view>
<view class="invoice-row"><text class="invoice-label">预约日期</text><text class="invoice-value">2024-01-14</text></view>
<view class="invoice-row"><text class="invoice-label">预约批次</text><text class="invoice-value">下午批次</text></view>
<view class="invoice-row"><text class="invoice-label">航行方向</text><text class="invoice-value">南向北</text></view>
<view class="invoice-row">
<text class="invoice-label">预约状态</text>
<text class="pay-status">已确认</text>
</view>
</view>
<!-- 船舶信息分组 -->
<view class="invoice-section">
<view class="invoice-title">船舶信息</view>
<view class="invoice-row"><text class="invoice-label">船舶</text><text class="invoice-value">苏航666</text></view>
<view class="invoice-row"><text class="invoice-label">编号</text><text class="invoice-value">ZJ12345</text></view>
<view class="invoice-row"><text class="invoice-label">载重吨位</text><text class="invoice-value">500</text></view>
<view class="invoice-row"><text class="invoice-label">类型</text><text class="invoice-value">货船</text></view>
<view class="invoice-row"><text class="invoice-label">总长度</text><text class="invoice-value">45</text></view>
<view class="invoice-row"><text class="invoice-label">型宽</text><text class="invoice-value">8</text></view>
<view class="invoice-row"><text class="invoice-label">型深</text><text class="invoice-value">3.5</text></view>
</view>
<!-- 票价信息分组 -->
<view class="invoice-section">
<view class="invoice-title">票价信息</view>
<view class="invoice-row"><text class="invoice-label">过闸费用</text><text class="invoice-value">300.00</text></view>
<view class="invoice-row"><text class="invoice-label">按吨位计费</text><text class="invoice-value">500</text></view>
<view class="invoice-row pay-total">
<text class="invoice-label">总计</text>
<text class="invoice-value pay-total-num">300.00</text>
</view>
</view>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
export default {
name: 'InvoiceManagePage',
components: { NavBar },
data() {
return {
form: {
titleTypeIndex: 0,
title: '',
taxNo: ''
},
titleTypeOptions: ['企业单位', '个人/非企业单位']
}
},
methods: {
//
}
}
</script>
<style scoped>
.reservation-page {
background: linear-gradient(180deg, #eaf3ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 40rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.content-area {
padding: 220rpx 24rpx 20rpx 24rpx;
}
.invoice-card, .invoice-header, .status-tag, .invoice-date, .invoice-amount, .invoice-batch, .invoice-actions, .invoice-detail-btn, .invoice-detail-btn.issue, .invoice-btn {
display: none !important;
}
.invoice-section {
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
padding: 32rpx 28rpx 8rpx 28rpx;
margin-bottom: 32rpx;
}
.invoice-title {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 24rpx;
}
.invoice-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
color: #222;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.invoice-row:last-child {
border-bottom: none;
}
.invoice-label {
color: #3b4a6b;
min-width: 180rpx;
font-size: 28rpx;
}
.invoice-value {
flex: 1;
text-align: right;
color: #222;
font-size: 28rpx;
background: transparent;
border: none;
outline: none;
}
.pay-status {
background: #217aff;
color: #fff;
border-radius: 24rpx;
padding: 4rpx 24rpx;
font-size: 24rpx;
margin-left: 12rpx;
}
.pay-total-num {
color: #217aff;
font-size: 32rpx;
font-weight: bold;
}
.pay-total {
font-weight: bold;
}
</style>
<template>
<view class="reservation-page">
<view class="fixed-nav">
<NavBar title="发票详情" />
</view>
<view class="content-area">
<view class="invoice-section">
<view class="invoice-title">预约信息</view>
<view class="invoice-row"><text class="invoice-label">预约日期</text><text class="invoice-value">{{ formatChinaDate(item.passage_date || item.created_at) }}</text></view>
<view class="invoice-row"><text class="invoice-label">预约批次</text><text class="invoice-value">{{ item.batch && item.batch.name ? item.batch.name : '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">航行方向</text><text class="invoice-value">{{ item.direction_name || '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">订单编号</text><text class="invoice-value">{{ item.id || '-' }}</text></view>
</view>
<view class="invoice-section">
<view class="invoice-title">船舶信息</view>
<view class="invoice-row"><text class="invoice-label">船名</text><text class="invoice-value">{{ item.ship && item.ship.ship_number ? item.ship.ship_number : '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">载重吨位</text><text class="invoice-value">{{ item.ship && item.ship.total_tonnage ? item.ship.total_tonnage + '吨' : '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">类型</text><text class="invoice-value">{{ shipTypeName }}</text></view>
</view>
<view class="invoice-section">
<view class="invoice-title">票据信息</view>
<view class="invoice-row"><text class="invoice-label">支付金额</text><text class="invoice-value">{{ formatPrice(item.price) }}</text></view>
<view class="invoice-row"><text class="invoice-label">开票状态</text><text class="invoice-value">{{ billStatusText }}</text></view>
<view v-if="billReason" class="invoice-row"><text class="invoice-label">失败原因</text><text class="invoice-value">{{ billReason }}</text></view>
</view>
<view v-if="billLink" class="invoice-bottom-bar">
<button class="invoice-issue-btn" @click="openExternalLink(billLink)"></button>
</view>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { base } from '@/common/util.js'
import { API } from '@/config/index.js'
export default {
name: 'InvoiceDetailPage',
components: { NavBar },
data() {
return {
reservationId: '',
item: {
ship: {},
batch: {},
},
shipTypeEnum: [],
}
},
computed: {
billStatusText() {
const map = {
1: '不可开票',
2: '开票中',
3: '已开票',
4: '开票失败',
5: '已拒绝',
}
return map[this.item.bill_status] || '-'
},
billLink() {
const bill = this.item.bill || {}
const billInfoList = Array.isArray(bill.billInfoList) ? bill.billInfoList : []
const firstInfo = billInfoList[0] || bill
return firstInfo.pictureUrl || firstInfo.url || ''
},
billReason() {
const bill = this.item.bill || {}
const billInfoList = Array.isArray(bill.billInfoList) ? bill.billInfoList : []
const firstInfo = billInfoList[0] || bill
return firstInfo.reason || firstInfo.message || firstInfo.msg || firstInfo.remark || ''
},
shipTypeName() {
const type = this.item.ship && this.item.ship.ship_type
const found = this.shipTypeEnum.find(entry => entry.value === type || entry.value == type)
return found ? found.label : (type || '-')
}
},
onLoad(options) {
this.reservationId = options.id || ''
},
async onShow() {
await this.fetchShipTypeEnum()
await this.fetchReservationDetail()
},
methods: {
formatChinaDate: base.formatChinaDate,
formatPrice(price) {
const numericPrice = Number(price)
return Number.isNaN(numericPrice) ? '0.00' : numericPrice.toFixed(2)
},
async fetchReservationDetail() {
const token = uni.getStorageSync('token')
if (!token || !this.reservationId) return
uni.showLoading({ title: '加载中...' })
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_DETAIL}/${this.reservationId}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
})
})
if (res.data && res.data.errcode === 0 && res.data.data) {
this.item = res.data.data
} else {
uni.showToast({ title: (res.data && res.data.errmsg) || '获取发票详情失败', icon: 'none' })
}
} catch (e) {
uni.showToast({ title: '网络错误', icon: 'none' })
} finally {
uni.hideLoading()
}
},
async fetchShipTypeEnum() {
const token = uni.getStorageSync('token')
if (!token) return
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_PROPERTY_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
})
})
if (res.data && res.data.errcode === 0) {
const shipTypeRaw = res.data.data.ship_type || {}
this.shipTypeEnum = Object.keys(shipTypeRaw).map(label => ({
label,
value: shipTypeRaw[label]
}))
}
} catch (e) {}
},
openExternalLink(url) {
if (!url) return
window.open(url, '_blank')
}
}
}
</script>
<style scoped>
.reservation-page {
background: linear-gradient(180deg, #eaf3ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 40rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.content-area {
padding: 220rpx 24rpx 120rpx 24rpx;
}
.invoice-section {
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
padding: 32rpx 28rpx 8rpx 28rpx;
margin-bottom: 32rpx;
}
.invoice-title {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 24rpx;
}
.invoice-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
color: #222;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.invoice-row:last-child {
border-bottom: none;
}
.invoice-label {
color: #3b4a6b;
min-width: 180rpx;
font-size: 28rpx;
}
.invoice-value {
flex: 1;
text-align: right;
color: #222;
font-size: 28rpx;
}
.invoice-bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
justify-content: center;
}
.invoice-issue-btn {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
}
</style>

@ -1,186 +1,206 @@
<template>
<view class="reservation-page">
<view class="fixed-nav">
<NavBar title="发票管理">
</NavBar>
</view>
<view class="content-area">
<!-- 基本信息分组 -->
<view class="invoice-section">
<view class="invoice-title">基本信息</view>
<view class="invoice-row">
<text class="invoice-label">抬头类型</text>
<picker :range="titleTypeOptions" v-model="form.titleTypeIndex">
<view class="invoice-value">{{ titleTypeOptions[form.titleTypeIndex] }}</view>
</picker>
</view>
<view class="invoice-row">
<text class="invoice-label">发票抬头</text>
<input class="invoice-value" v-model="form.title" placeholder="请输入发票抬头" />
</view>
<view class="invoice-row">
<text class="invoice-label">税号</text>
<input class="invoice-value" v-model="form.taxNo" placeholder="请输入税号" />
</view>
</view>
<!-- 预约信息分组 -->
<view class="invoice-section">
<view class="invoice-title">预约信息</view>
<view class="invoice-row"><text class="invoice-label">预约日期</text><text class="invoice-value">2024-01-14</text></view>
<view class="invoice-row"><text class="invoice-label">预约批次</text><text class="invoice-value">下午批次</text></view>
<view class="invoice-row"><text class="invoice-label">航行方向</text><text class="invoice-value">南向北</text></view>
<view class="invoice-row">
<text class="invoice-label">预约状态</text>
<text class="pay-status">已确认</text>
</view>
</view>
<!-- 船舶信息分组 -->
<view class="invoice-section">
<view class="invoice-title">船舶信息</view>
<view class="invoice-row"><text class="invoice-label">船舶</text><text class="invoice-value">苏航666</text></view>
<view class="invoice-row"><text class="invoice-label">编号</text><text class="invoice-value">ZJ12345</text></view>
<view class="invoice-row"><text class="invoice-label">载重吨位</text><text class="invoice-value">500</text></view>
<view class="invoice-row"><text class="invoice-label">类型</text><text class="invoice-value">货船</text></view>
<view class="invoice-row"><text class="invoice-label">总长度</text><text class="invoice-value">45</text></view>
<view class="invoice-row"><text class="invoice-label">型宽</text><text class="invoice-value">8</text></view>
<view class="invoice-row"><text class="invoice-label">型深</text><text class="invoice-value">3.5</text></view>
</view>
<!-- 票价信息分组 -->
<view class="invoice-section">
<view class="invoice-title">票价信息</view>
<view class="invoice-row"><text class="invoice-label">过闸费用</text><text class="invoice-value">300.00</text></view>
<view class="invoice-row"><text class="invoice-label">按吨位计费</text><text class="invoice-value">500</text></view>
<view class="invoice-row pay-total">
<text class="invoice-label">总计</text>
<text class="invoice-value pay-total-num">300.00</text>
</view>
</view>
</view>
<!-- 底部开发票按钮 -->
<view class="invoice-bottom-bar">
<button class="invoice-issue-btn">开发票</button>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
export default {
name: 'InvoiceManagePage',
components: { NavBar },
data() {
return {
form: {
titleTypeIndex: 0,
title: '',
taxNo: ''
},
titleTypeOptions: ['企业单位', '个人/非企业单位']
}
},
methods: {
//
}
}
</script>
<style scoped>
.reservation-page {
background: linear-gradient(180deg, #eaf3ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 40rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.content-area {
padding: 220rpx 24rpx 120rpx 24rpx;
}
.invoice-card, .invoice-header, .status-tag, .invoice-date, .invoice-amount, .invoice-batch, .invoice-actions, .invoice-detail-btn, .invoice-detail-btn.issue, .invoice-btn {
display: none !important;
}
.invoice-section {
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
padding: 32rpx 28rpx 8rpx 28rpx;
margin-bottom: 32rpx;
}
.invoice-title {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 24rpx;
}
.invoice-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
color: #222;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.invoice-row:last-child {
border-bottom: none;
}
.invoice-label {
color: #3b4a6b;
min-width: 180rpx;
font-size: 28rpx;
}
.invoice-value {
flex: 1;
text-align: right;
color: #222;
font-size: 28rpx;
background: transparent;
border: none;
outline: none;
}
.pay-status {
background: #217aff;
color: #fff;
border-radius: 24rpx;
padding: 4rpx 24rpx;
font-size: 24rpx;
margin-left: 12rpx;
}
.pay-total-num {
color: #217aff;
font-size: 32rpx;
font-weight: bold;
}
.pay-total {
font-weight: bold;
}
.invoice-bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
justify-content: center;
}
.invoice-issue-btn {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(33,122,255,0.08);
}
</style>
<template>
<view class="reservation-page">
<view class="fixed-nav">
<NavBar title="申请开票" />
</view>
<view class="content-area">
<view class="invoice-section">
<view class="invoice-title">预约信息</view>
<view class="invoice-row"><text class="invoice-label">订单编号</text><text class="invoice-value">{{ item.id || '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">预约日期</text><text class="invoice-value">{{ formatChinaDate(item.passage_date || item.created_at) }}</text></view>
<view class="invoice-row"><text class="invoice-label">航行方向</text><text class="invoice-value">{{ item.direction_name || '-' }}</text></view>
<view class="invoice-row"><text class="invoice-label">船名</text><text class="invoice-value">{{ item.ship && item.ship.ship_number ? item.ship.ship_number : '-' }}</text></view>
</view>
<view class="invoice-section">
<view class="invoice-title">开票信息</view>
<view class="invoice-row"><text class="invoice-label">支付金额</text><text class="invoice-value">{{ formatPrice(item.price) }}</text></view>
<view class="invoice-row"><text class="invoice-label">开票状态</text><text class="invoice-value">{{ billStatusText }}</text></view>
</view>
</view>
<view class="invoice-bottom-bar">
<button class="invoice-issue-btn" @click="submitInvoice"></button>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { base } from '@/common/util.js'
import { API } from '@/config/index.js'
export default {
name: 'InvoiceIssuePage',
components: { NavBar },
data() {
return {
reservationId: '',
item: {
ship: {},
batch: {},
},
}
},
computed: {
billStatusText() {
const map = {
1: '不可开票',
2: '开票中',
3: '已开票',
4: '开票失败',
5: '已拒绝',
}
return map[this.item.bill_status] || '-'
},
},
onLoad(options) {
this.reservationId = options.id || ''
},
async onShow() {
await this.fetchReservationDetail()
},
methods: {
formatChinaDate: base.formatChinaDate,
formatPrice(price) {
const numericPrice = Number(price)
return Number.isNaN(numericPrice) ? '0.00' : numericPrice.toFixed(2)
},
async fetchReservationDetail() {
const token = uni.getStorageSync('token')
if (!token || !this.reservationId) return
uni.showLoading({ title: '加载中...' })
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_DETAIL}/${this.reservationId}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
})
})
if (res.data && res.data.errcode === 0 && res.data.data) {
this.item = res.data.data
} else {
uni.showToast({ title: (res.data && res.data.errmsg) || '获取订单详情失败', icon: 'none' })
}
} catch (e) {
uni.showToast({ title: '网络错误', icon: 'none' })
} finally {
uni.hideLoading()
}
},
submitInvoice() {
const token = uni.getStorageSync('token')
if (!token || !this.item.id) {
uni.showToast({ title: '订单信息缺失', icon: 'none' })
return
}
uni.showLoading({ title: '提交中...' })
uni.request({
url: `${API.GET_INVOICE}`,
method: 'GET',
data: {
reservation_id: this.item.id,
token
},
success: (res) => {
uni.hideLoading()
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '开票申请已提交', icon: 'success' })
setTimeout(() => {
uni.redirectTo({ url: `/pages/index/invoice_detail?id=${this.item.id}` })
}, 800)
} else {
uni.showToast({ title: (res.data && res.data.errmsg) || '提交失败', icon: 'none' })
}
},
fail: () => {
uni.hideLoading()
uni.showToast({ title: '提交失败', icon: 'none' })
}
})
}
}
}
</script>
<style scoped>
.reservation-page {
background: linear-gradient(180deg, #eaf3ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 40rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.content-area {
padding: 220rpx 24rpx 120rpx 24rpx;
}
.invoice-section {
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
padding: 32rpx 28rpx 8rpx 28rpx;
margin-bottom: 32rpx;
}
.invoice-title {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 24rpx;
}
.invoice-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
color: #222;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.invoice-row:last-child {
border-bottom: none;
}
.invoice-label {
color: #3b4a6b;
min-width: 180rpx;
font-size: 28rpx;
}
.invoice-value {
flex: 1;
text-align: right;
color: #222;
font-size: 28rpx;
}
.invoice-bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
justify-content: center;
}
.invoice-issue-btn {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
}
</style>

@ -140,81 +140,18 @@ export default {
this.fetchInvoiceList(false)
}
},
handleInvoiceAction(item) {
if (!item) return
if (item.bill_status === 3) {
const bill = item.bill || {}
const billInfoList = Array.isArray(bill.billInfoList) ? bill.billInfoList : []
const firstInfo = billInfoList[0] || {}
const pictureUrl = firstInfo.pictureUrl || ''
if (pictureUrl) {
this.openExternalLink(pictureUrl)
} else {
uni.showToast({ title: '暂无发票链接', icon: 'none' })
}
return
}
this.goInvoice(item)
},
goInvoice(item) {
const token = uni.getStorageSync('token')
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' })
return
}
if (!item || !item.id) {
uni.showToast({ title: '订单信息缺失', icon: 'none' })
return
}
uni.showLoading({ title: '提交中...' })
uni.request({
url: `${API.GET_INVOICE}`,
method: 'GET',
data: {
reservation_id: item.id,
token
},
success: (res) => {
uni.hideLoading()
if (res.data && res.data.errcode === 0) {
const billData = res.data && res.data.data
const billInfo = billData && billData.bill
const billInfoList = billInfo && billInfo.billInfoList
const pictureUrl = Array.isArray(billInfoList) && billInfoList.length > 0
? billInfoList[0].pictureUrl
: ''
uni.showToast({
title: '开票申请已提交',
icon: 'success',
duration: 2000,
success: () => {
if (pictureUrl) {
this.openExternalLink(pictureUrl)
}
}
})
this.page = 1
this.hasMore = true
this.fetchInvoiceList(true)
} else {
uni.showToast({ title: (res.data && res.data.errmsg) || '提交失败', icon: 'none' })
}
},
fail: () => {
uni.hideLoading()
uni.showToast({ title: '提交失败', icon: 'none' })
}
})
},
openExternalLink(url) {
if (!url) return
window.open(url, '_blank')
}
}
}
handleInvoiceAction(item) {
if (!item) return
if (item.bill_status === 3) {
uni.navigateTo({ url: `/pages/index/invoice_detail?id=${item.id}` })
return
}
uni.navigateTo({ url: `/pages/index/invoice_issue?id=${item.id}` })
}
}
}
</script>
<style scoped>
@ -344,4 +281,4 @@ export default {
color: #999;
font-size: 26rpx;
}
</style>
</style>

@ -429,7 +429,7 @@
<script>
import NavBar from "@/components/NavBar.vue";
import { API } from "@/config/index.js";
import { API, BASE_URL } from "@/config/index.js";
export default {
name: "ShipManagerPage",
@ -718,10 +718,10 @@ export default {
return false;
}
},
getFileUrl(fileId) {
if (!fileId) return "";
return `${API.BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
getFileUrl(fileId) {
if (!fileId) return "";
return `${BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
async uploadFile(filePath) {
return new Promise((resolve, reject) => {
const token = uni.getStorageSync("token");
@ -755,17 +755,74 @@ export default {
});
});
},
//
isValidNumber(value) {
if (!value) return false;
//
return /^\d+(\.\d+)?$/.test(value);
},
async nextStep() {
if (this.currentStep === 1) {
//
if (!this.form.owner) {
uni.showToast({ title: "请填写船舶所有人", icon: "none" });
//
isValidNumber(value) {
if (!value) return false;
//
return /^\d+(\.\d+)?$/.test(value);
},
async checkShipNumberBeforeNextStep() {
const token = uni.getStorageSync("token");
if (!token) {
uni.showToast({ title: "请先登录", icon: "none" });
return false;
}
const shipNumber = (this.form.shipNo || "").trim();
this.form.shipNo = shipNumber;
try {
const requestData = {
token,
ship_number: shipNumber,
};
if (this.isEdit && this.form.id) {
requestData.exclude_id = this.form.id;
}
const res = await new Promise((resolve, reject) => {
uni.request({
url: API.SHIP_CHECK_NAME,
method: "GET",
data: requestData,
success: resolve,
fail: reject,
});
});
if (res.data && res.data.errcode === 0) {
return true;
}
const message =
(res.data && res.data.errmsg) || "船名校验失败,请稍后重试";
if (message === "船名已存在,不用重新录入,请上岸绑定") {
await new Promise((resolve) => {
uni.showModal({
title: "提示",
content: message,
showCancel: false,
success: resolve,
fail: resolve,
});
});
} else {
uni.showToast({ title: message, icon: "none" });
}
return false;
} catch (error) {
uni.showToast({ title: "船名校验失败,请稍后重试", icon: "none" });
return false;
}
},
async nextStep() {
if (this.currentStep === 1) {
//
if (!this.form.owner) {
uni.showToast({ title: "请填写船舶所有人", icon: "none" });
return;
}
if (!this.form.idCard) {
@ -780,11 +837,15 @@ export default {
uni.showToast({ title: "联系电话格式不正确", icon: "none" });
return;
}
if (!this.form.shipNo) {
uni.showToast({ title: "请填写船名", icon: "none" });
return;
}
}
if (!this.form.shipNo) {
uni.showToast({ title: "请填写船名", icon: "none" });
return;
}
const shipNumberAvailable = await this.checkShipNumberBeforeNextStep();
if (!shipNumberAvailable) {
return;
}
}
if (this.currentStep === 2) {
if (!this.form.ton) {
uni.showToast({ title: "请填写载重吨位", icon: "none" });
@ -1649,4 +1710,4 @@ export default {
flex: 1;
line-height: 1.6;
}
</style>
</style>

@ -65,7 +65,7 @@
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
import { API, BASE_URL } from '@/config/index.js'
export default {
name: 'ShipDetailPage',
components: { NavBar },
@ -197,11 +197,11 @@ export default {
uni.showToast({ title: error.message || '网络错误', icon: 'none' });
}
},
getFileUrl(fileId) {
if (!fileId) return '';
// /api/customer/upload-file/preview?id=xxx
return `${API.BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
getFileUrl(fileId) {
if (!fileId) return '';
// /api/customer/upload-file/preview?id=xxx
return `${BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
onEdit() {
if (!this.ship || !this.ship.id) return;
// id

@ -286,6 +286,12 @@ export default {
id_card: this.userInfo.id_card || ''
}
}
this.canSendCode = true
this.countdown = 0
if (this.countdownTimer) {
clearInterval(this.countdownTimer)
this.countdownTimer = null
}
this.isEditMode = false //
this.showEditPopup = true
},
@ -301,6 +307,7 @@ export default {
this.countdownTimer = null
}
this.countdown = 0
this.canSendCode = true
},
validateForm() {
if (!this.editForm.name) {
@ -772,4 +779,4 @@ export default {
color: #999;
margin-top: 12rpx;
}
</style>
</style>

@ -233,12 +233,10 @@ export default {
});
},
onShowDetail(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
uni.navigateTo({ url: `/pages/order/pay_order_detail?id=${item.id}` });
},
goPayOrder(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
uni.navigateTo({ url: `/pages/order/pay_order_detail?id=${item.id}` });
},
goReservation(item) {
uni.navigateTo({ url: '/pages/reservation/index' });
@ -661,4 +659,4 @@ button {
color: #999;
font-size: 26rpx;
}
</style>
</style>

@ -1,389 +1,50 @@
<template>
<view class="pay-page" :class="{ 'wechat-browser': isWeixinBrowser }">
<view class="fixed-nav" v-if="!isWeixinBrowser">
<NavBar title="在线付款" />
</view>
<view class="pay-scroll">
<!-- 预约信息 -->
<view class="pay-section">
<view class="pay-title">预约信息</view>
<view class="pay-row"><text>预约日期</text><text>{{ item.batch && item.batch.created_at ? formatChinaDate(item.batch.created_at) : '' }}</text></view>
<view class="pay-row"><text>预约批次</text><text>{{ item.batch.name }}</text></view>
<view class="pay-row"><text>航行方向</text><text>{{ item.direction_name }}</text></view>
<view class="pay-row">
<text>预约状态</text>
<text class="pay-status">已预约</text>
</view>
</view>
<!-- 船舶信息 -->
<view class="pay-section">
<view class="pay-title">船舶信息</view>
<view class="pay-row"><text>船名</text><text>{{ item.ship.ship_number }}</text></view>
<view class="pay-row"><text>总长度</text><text>{{ item.ship.total_length }}</text></view>
<view class="pay-row"><text>型宽</text><text>{{ item.ship.total_width }}</text></view>
<view class="pay-row"><text>型深</text><text>{{ item.ship.molded_depth }}</text></view>
<view class="pay-row"><text>载重吨位</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row"><text>类型</text><text>{{ item.ship && item.ship.ship_type ? getShipTypeName(item.ship.ship_type) : '' }}</text></view>
</view>
<!-- 票价信息 -->
<view class="pay-section">
<view class="pay-title">票价信息</view>
<view class="pay-row"><text>过闸费用</text><text>{{ item.price }}</text></view>
<view class="pay-row"><text>按吨位计费</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row pay-total">
<text>总计</text>
<text class="pay-total-num">{{ item.price }}</text>
</view>
</view>
<!-- 支付方式 -->
<view class="pay-section">
<view class="pay-title">扫码支付</view>
<view class="pay-qrcode-box">
<image :src="qrcodeUrl" class="pay-qrcode-img" mode="aspectFit" @longpress="handleLongPress" />
</view>
<view class="pay-qrcode-tip">请使用微信或支付宝扫码支付</view>
</view>
</view>
<view class="pay-bottom-bar">
<view class="pay-bottom-tip">
<text class="pay-bottom-clock">🕒</text>
<text class="pay-bottom-tip-text">
请在 <text class="pay-bottom-time">14:06</text> 内完成支付
</text>
</view>
<view class="pay-bottom-btns">
<button class="pay-cancel-btn">取消订单</button>
<button class="pay-pay-btn" @click="handlePay"> 300.00</button>
</view>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { base } from '@/common/util.js'
import { API } from '@/config/index.js'
export default {
name: 'PayOrderPage',
components: {
NavBar
},
data() {
return {
item: null,
qrcodeUrl: '',
shipTypeEnum: [],
isWeixinBrowser: false
}
},
onLoad(options) {
if (options.item) {
try {
this.item = JSON.parse(decodeURIComponent(options.item));
} catch (e) {
console.error('Failed to parse item:', e);
this.item = {};
}
}
console.log(this.item);
// #ifdef H5
this.isWeixinBrowser = /MicroMessenger/i.test(navigator.userAgent)
// #endif
},
onShow() {
if (this.item && this.item.id) {
this.fetchQrcode(this.item.id);
}
this.fetchShipTypeEnum();
},
methods: {
formatChinaDate: base.formatChinaDate,
async fetchQrcode(id) {
const token = uni.getStorageSync('token');
if (!token || !id) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.GET_PAYMENT_QRCODE}?id=${id}&token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.qrcodeUrl = res.data.data.qrcode;
}
} catch (e) {}
},
async fetchShipTypeEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_PROPERTY_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
const shipTypeRaw = res.data.data.ship_type || {};
if (Array.isArray(shipTypeRaw)) {
this.shipTypeEnum = shipTypeRaw;
} else {
this.shipTypeEnum = Object.keys(shipTypeRaw).map(label => ({
label,
value: shipTypeRaw[label]
}));
}
}
} catch (e) {
console.error('Failed to fetch ship type enum:', e);
}
},
getShipTypeName(type) {
const found = this.shipTypeEnum.find(item => item.value === type || item.value == type);
return found ? found.label : type;
},
handlePay() {
//POST
uni.request({
url: `${API.FAKE_PAY}`,
method: 'POST',
data: {
id: this.item.id,
token: uni.getStorageSync('token')
},
success: (res) => {
console.log('模拟支付结果:', res);
},
fail: (err) => {
console.error('模拟支付失败:', err);
}
});
},
handleLongPress() {
//
uni.getImageInfo({
src: this.qrcodeUrl,
success: (imageInfo) => {
// 使
uni.scanCode({
scanType: ['qrCode'],
onlyFromCamera: false,
path: imageInfo.path,
success: (res) => {
console.log('扫码结果:', res);
if (res.result) {
uni.showToast({
title: '扫码成功',
icon: 'success'
});
//
// uni.navigateTo({
// url: `/pages/payment/index?url=${encodeURIComponent(res.result)}`
// });
}
},
fail: (err) => {
console.error('扫码失败:', err);
uni.showToast({
title: '扫码失败',
icon: 'none'
});
}
});
},
fail: (err) => {
console.error('获取图片信息失败:', err);
uni.showToast({
title: '获取图片失败',
icon: 'none'
});
}
});
},
}
}
</script>
<style lang="scss" scoped>
.pay-page {
min-height: 100vh;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
padding-bottom: 32rpx;
}
.wechat-browser {
padding-top: 20rpx;
}
.wechat-browser .pay-scroll {
margin-top: 0;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
height: 90px;
}
.pay-scroll {
padding-top: 110px;
padding-bottom: 160rpx;
}
.pay-section {
background: #fff;
border-radius: 24rpx;
margin: 0 24rpx 32rpx 24rpx;
box-shadow: 0 4rpx 16rpx rgba(59,124,255,0.08);
padding: 32rpx 24rpx 8rpx 24rpx;
}
.pay-title {
font-size: 30rpx;
font-weight: bold;
color: #222;
margin-bottom: 24rpx;
}
.pay-row {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 28rpx;
color: #222;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.pay-row:last-child {
border-bottom: none;
}
.pay-status {
background: #217aff;
color: #fff;
border-radius: 24rpx;
padding: 4rpx 24rpx;
font-size: 24rpx;
}
.pay-total {
font-weight: bold;
}
.pay-total-num {
color: #217aff;
font-size: 32rpx;
}
.pay-paytype {
gap: 16rpx;
}
.pay-label {
display: flex;
align-items: center;
}
.pay-icon {
width: 36rpx;
height: 36rpx;
margin-right: 20rpx;
}
.pay-paytype text {
margin-left: 0; /* 确保文字紧跟图标 */
}
.pay-radio-group {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.pay-bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
}
.pay-bottom-tip {
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
margin-bottom: 18rpx;
}
.pay-bottom-clock-box {
width: 40rpx;
height: 40rpx;
border: 2rpx solid #217aff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 12rpx;
}
.pay-bottom-clock {
color: #217aff;
font-size: 28rpx;
}
.pay-bottom-tip-text {
color: #222;
}
.pay-bottom-time {
color: #217aff;
font-weight: bold;
}
.pay-bottom-btns {
display: flex;
gap: 24rpx;
justify-content: center;
}
.pay-cancel-btn {
min-width: 240rpx;
height: 72rpx;
border-radius: 36rpx;
background: #f5f7fa;
color: #222;
font-size: 28rpx;
border: none;
outline: none;
&::after {
border: none;
}
}
.pay-pay-btn {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 28rpx;
font-weight: 500;
border: none;
outline: none;
&::after {
border: none;
}
}
.pay-qrcode-box {
display: flex;
justify-content: center;
align-items: center;
margin: 32rpx 0;
}
.pay-qrcode-img {
width: 260rpx;
height: 260rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.06);
}
.pay-qrcode-tip {
text-align: center;
color: #888;
font-size: 26rpx;
margin-top: 12rpx;
}
</style>
<template>
<view class="pay-order-redirect">
<text class="redirect-text">正在跳转订单详情...</text>
</view>
</template>
<script>
export default {
name: "PayOrderRedirectPage",
onLoad(options) {
let reservationId = options.id || "";
if (!reservationId && options.item) {
try {
const item = JSON.parse(decodeURIComponent(options.item));
reservationId = item && item.id ? String(item.id) : "";
} catch (e) {
reservationId = "";
}
}
if (!reservationId) {
uni.showToast({ title: "订单信息缺失", icon: "none" });
setTimeout(() => {
uni.navigateBack();
}, 800);
return;
}
uni.redirectTo({
url: `/pages/order/pay_order_detail?id=${reservationId}`,
});
},
};
</script>
<style scoped>
.pay-order-redirect {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
}
.redirect-text {
color: #3b4a6b;
font-size: 28rpx;
}
</style>

@ -170,7 +170,11 @@ export default {
isWeixinBrowser: false,
qrcodeUrl: "",
payType: "wechat",
item: {},
reservationId: "",
item: {
ship: {},
batch: {},
},
shipTypeEnum: [],
reservationStatusEnum: [],
qrContent: "",
@ -179,41 +183,63 @@ export default {
};
},
onLoad(options) {
if (options.item) {
try {
this.item = JSON.parse(decodeURIComponent(options.item));
console.log("this.item", this.item);
} catch (e) {
console.error("Failed to parse item:", e);
this.item = {};
}
}
console.log(this.item);
this.reservationId = options.id || "";
// #ifdef H5
this.isWeixinBrowser = /MicroMessenger/i.test(navigator.userAgent);
// #endif
},
onShow() {
//
this.fetchUnitPrice();
this.fetchShipTypeEnum().then(() => {
if (this.item.id && this.item.status === "unpaid") {
this.fetchQrcode(this.item.id);
}
});
async onShow() {
await this.fetchReservationDetail();
await this.fetchUnitPrice();
await this.fetchShipTypeEnum();
if (this.item.id && this.item.status === "unpaid") {
this.fetchQrcode(this.item.id);
}
this.fetchReservationStatusEnum();
},
methods: {
formatChinaDate: base.formatChinaDate,
async fetchReservationDetail() {
const token = uni.getStorageSync("token");
if (!token || !this.reservationId) {
return;
}
uni.showLoading({ title: "加载中..." });
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_DETAIL}/${this.reservationId}?token=${token}`,
method: "GET",
success: resolve,
fail: reject,
});
});
if (res.data && res.data.errcode === 0 && res.data.data) {
this.item = res.data.data;
} else {
uni.showToast({
title: (res.data && res.data.errmsg) || "获取订单详情失败",
icon: "none",
});
}
} catch (e) {
uni.showToast({ title: "网络错误", icon: "none" });
} finally {
uni.hideLoading();
}
},
//
async fetchUnitPrice() {
const token = uni.getStorageSync("token");
if (!token) {
const shipId = this.item && this.item.ship_id;
if (!token || !shipId) {
return;
}
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.GET_UNIT_PRICE}?token=${token}`,
url: `${API.GET_UNIT_PRICE}?token=${token}&ship_id=${shipId}`,
method: "get",
success: resolve,
fail: reject,

@ -346,12 +346,10 @@ export default {
});
},
onShowDetail(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
uni.navigateTo({ url: `/pages/order/pay_order_detail?id=${item.id}` });
},
goPayOrder(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
uni.navigateTo({ url: `/pages/order/pay_order_detail?id=${item.id}` });
},
goReservation(item) {
uni.navigateTo({ url: '/pages/reservation/index' });
@ -677,4 +675,4 @@ button {
color: #999;
font-size: 26rpx;
}
</style>
</style>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,2 @@
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>胥口闸站购票</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/h5/static/index.cc298949.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/h5/static/js/chunk-vendors.84c26d58.js></script><script src=/h5/static/js/index.b1d5013e.js></script></body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["pages-order-pay_order"],{"37f1":function(e,t,n){"use strict";n.r(t);var r=n("98ef"),i=n("8004");for(var a in i)["default"].indexOf(a)<0&&function(e){n.d(t,e,(function(){return i[e]}))}(a);n("53d9");var o=n("828b"),c=Object(o["a"])(i["default"],r["b"],r["c"],!1,null,"43143494",null,!1,r["a"],void 0);t["default"]=c.exports},"53d9":function(e,t,n){"use strict";var r=n("6166"),i=n.n(r);i.a},6166:function(e,t,n){var r=n("94af");r.__esModule&&(r=r.default),"string"===typeof r&&(r=[[e.i,r,""]]),r.locals&&(e.exports=r.locals);var i=n("967d").default;i("01e81bc3",r,!0,{sourceMap:!1,shadowMode:!1})},"6a91":function(e,t,n){"use strict";n("6a54"),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r={name:"PayOrderRedirectPage",onLoad:function(e){var t=e.id||"";if(!t&&e.item)try{var n=JSON.parse(decodeURIComponent(e.item));t=n&&n.id?String(n.id):""}catch(r){t=""}if(!t)return uni.showToast({title:"订单信息缺失",icon:"none"}),void setTimeout((function(){uni.navigateBack()}),800);uni.redirectTo({url:"/pages/order/pay_order_detail?id=".concat(t)})}};t.default=r},8004:function(e,t,n){"use strict";n.r(t);var r=n("6a91"),i=n.n(r);for(var a in r)["default"].indexOf(a)<0&&function(e){n.d(t,e,(function(){return r[e]}))}(a);t["default"]=i.a},"94af":function(e,t,n){var r=n("c86c");t=r(!1),t.push([e.i,".pay-order-redirect[data-v-43143494]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(180deg,#cbe6ff,#f6faff)}.redirect-text[data-v-43143494]{color:#3b4a6b;font-size:%?28?%}",""]),e.exports=t},"98ef":function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){}));var r=function(){var e=this.$createElement,t=this._self._c||e;return t("v-uni-view",{staticClass:"pay-order-redirect"},[t("v-uni-text",{staticClass:"redirect-text"},[this._v("正在跳转订单详情...")])],1)},i=[]}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Loading…
Cancel
Save