feat: 订单状态筛选+编辑功能
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Agent
2026-03-25 15:59:51 +00:00
parent 34054065ed
commit 1cb5f6b646
3 changed files with 147 additions and 10 deletions

View File

@@ -53,6 +53,20 @@ export default {
return api.request(`/orders/${id}/refund`, 'PUT')
},
/**
* 更新订单状态
*/
updateOrderStatus(id, status) {
return api.request(`/orders/${id}/status`, 'PUT', { status })
},
/**
* 更新订单(编辑)
*/
updateOrder(id, data) {
return api.request(`/orders/${id}`, 'PUT', data)
},
/**
* 订单统计
*/

View File

@@ -164,12 +164,48 @@ export default {
// 其他
paymentMethod: 'cash',
remark: ''
remark: '',
// 编辑模式
editingOrderId: null
}
},
onLoad() {
onLoad(options) {
this.loadCustomers()
this.loadProducts()
if (options.orderId) {
this.editingOrderId = options.orderId
this.loadOrder(options.orderId)
}
},
methods: {
async loadOrder(orderId) {
try {
const detail = await orderApi.getOrderDetail(orderId)
const order = detail.order
// 设置订单信息
if (order.customerId) {
this.selectedCustomer = this.customers.find(c => c.customerId === order.customerId)
}
this.orderItems = (detail.items || []).map(item => ({
productId: item.productId,
productName: item.productName,
spec: item.productSpec,
unit: item.unit,
price: item.price,
quantity: item.quantity
}))
this.discountRate = order.discountRate
this.remark = order.remark || ''
this.paymentMethod = order.paymentMethod || 'cash'
this.calcAmount()
} catch (e) {
console.error(e)
}
},
methods: {
async loadCustomers() {
@@ -248,14 +284,19 @@ export default {
}
try {
const order = await orderApi.createOrder(data)
let order
if (this.editingOrderId) {
order = await orderApi.updateOrder(this.editingOrderId, data)
uni.showToast({ title: '订单更新成功', icon: 'success' })
} else {
order = await orderApi.createOrder(data)
uni.showToast({ title: '订单创建成功', icon: 'success' })
}
// 跳转到订单详情或列表
// 跳转到订单列表(未完成)
setTimeout(() => {
uni.navigateTo({
url: `/pages/order/list`
uni.switchTab({
url: '/pages/order/list?status=0'
})
}, 1500)
} catch (e) {
@@ -264,6 +305,7 @@ export default {
}
}
}
}
</script>
<style>

View File

@@ -9,6 +9,13 @@
>
全部
</view>
<view
class="filter-item"
:class="{ active: status === 0 }"
@click="filterStatus(0)"
>
未完成
</view>
<view
class="filter-item"
:class="{ active: status === 1 }"
@@ -67,7 +74,12 @@
<view class="order-footer">
<text class="order-time">{{ formatTime(order.createdAt) }}</text>
<text class="operator">{{ order.operatorName }}</text>
<view class="order-actions" v-if="order.status === 0">
<text class="action-btn confirm" @click.stop="confirmOrder(order)">确认</text>
<text class="action-btn cancel" @click.stop="cancelOrder(order)">取消</text>
<text class="action-btn edit" @click.stop="editOrder(order)">编辑</text>
</view>
<text class="operator" v-else>{{ order.operatorName }}</text>
</view>
</view>
@@ -99,7 +111,10 @@ export default {
loading: false
}
},
onLoad() {
onLoad(options) {
if (options.status) {
this.status = parseInt(options.status)
}
this.loadOrders()
},
onReachBottom() {
@@ -178,6 +193,7 @@ export default {
},
getStatusText(status) {
const map = {
0: '未完成',
1: '已完成',
2: '已取消',
3: '退款中',
@@ -188,6 +204,45 @@ export default {
formatTime(time) {
if (!time) return '-'
return time.substring(0, 16).replace('T', ' ')
},
async confirmOrder(order) {
uni.showModal({
title: '确认订单',
content: '确认完成后订单将变为已完成状态',
success: async (res) => {
if (res.confirm) {
try {
await orderApi.updateOrderStatus(order.orderId, 1)
uni.showToast({ title: '已确认', icon: 'success' })
this.loadOrders()
} catch (e) {
uni.showToast({ title: '操作失败', icon: 'none' })
}
}
}
})
},
async cancelOrder(order) {
uni.showModal({
title: '取消订单',
content: '确定要取消该订单吗?',
success: async (res) => {
if (res.confirm) {
try {
await orderApi.cancelOrder(order.orderId)
uni.showToast({ title: '已取消', icon: 'success' })
this.loadOrders()
} catch (e) {
uni.showToast({ title: '操作失败', icon: 'none' })
}
}
}
})
},
editOrder(order) {
uni.navigateTo({
url: `/pages/order/create?orderId=${order.orderId}`
})
}
}
}
@@ -357,6 +412,32 @@ export default {
color: #999;
}
.order-actions {
display: flex;
gap: 16rpx;
}
.action-btn {
font-size: 24rpx;
padding: 8rpx 16rpx;
border-radius: 4rpx;
}
.action-btn.confirm {
background: #3cc51f;
color: #fff;
}
.action-btn.cancel {
background: #fff1f0;
color: #ff4d4f;
}
.action-btn.edit {
background: #e6f7ff;
color: #1890ff;
}
.empty {
padding: 100rpx;
text-align: center;