feat(订单模块): 添加批量发出功能及进度对话框
- 新增筛选单本书的复选框选项 - 添加批量发出按钮,支持多选订单发出 - 实现批量发出进度对话框,显示处理状态和失败明细 - 优化订单数据处理逻辑,提升用户体验
This commit is contained in:
@@ -86,19 +86,44 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<div class="block">
|
||||||
|
<el-checkbox size="mini"
|
||||||
|
align="right" v-model="dataForm.showOne"> 筛选单本书
|
||||||
|
</el-checkbox>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="pageIndex = 1;getDataList()">查询</el-button>
|
<el-button @click="pageIndex = 1;getDataList()">查询</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div class="buttonGroup">
|
<div class="buttonGroup">
|
||||||
<span v-if="tabChange.tabActiveName == 1" style="display: inline-block;margin-bottom: 20px;">
|
<div v-if="tabChange.tabActiveName == 1" style="display: inline-block; margin-bottom: 20px;">
|
||||||
<el-badge :value="mergeList.length" class="item">
|
<el-badge :value="mergeList.length" class="item">
|
||||||
<router-link :to="{ path: 'buyorder-mergeorder', query: {} }">
|
<router-link :to="{ path: 'buyorder-mergeorder', query: {} }">
|
||||||
<el-button style="" size="mini" v-if="isAuth('book:buyorder')" type="primary"
|
<el-button style="" size="mini" v-if="isAuth('book:buyorder')" type="primary"
|
||||||
:disabled="mergeList.length > 0 ? false : true">合并发出</el-button>
|
:disabled="mergeList.length > 0 ? false : true">合并发出</el-button>
|
||||||
</router-link>
|
</router-link>
|
||||||
</el-badge>
|
</el-badge>
|
||||||
</span>
|
<el-button
|
||||||
|
style="margin-left: 10px;"
|
||||||
|
size="mini"
|
||||||
|
v-if="isAuth('book:buyorder')"
|
||||||
|
type="primary"
|
||||||
|
:disabled="checkedOrders.length <= 0"
|
||||||
|
:loading="batchDeliverLoading"
|
||||||
|
@click="batchDeliver">批量发出</el-button>
|
||||||
|
<div style="margin-top: 8px;">
|
||||||
|
<el-checkbox
|
||||||
|
:disabled="multipleDisabled"
|
||||||
|
:indeterminate="checkboxGroup.isIndeterminate"
|
||||||
|
v-model="checkboxGroup.checkAll"
|
||||||
|
class="checkAll showLabel"
|
||||||
|
size="mini"
|
||||||
|
@change="handleCheckAllChange">全选</el-checkbox>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<span style="" v-if="tabChange.tabActiveName == 2 && tabChange.isPrint == 1">
|
<span style="" v-if="tabChange.tabActiveName == 2 && tabChange.isPrint == 1">
|
||||||
<el-button style="margin-left: 10px;" size="mini" v-if="isAuth('book:buyorder')" type="warning"
|
<el-button style="margin-left: 10px;" size="mini" v-if="isAuth('book:buyorder')" type="warning"
|
||||||
:disabled="SheetSelectionList.length <= 0" @click="printHandle(null,null,'piliang')">批量打印</el-button>
|
:disabled="SheetSelectionList.length <= 0" @click="printHandle(null,null,'piliang')">批量打印</el-button>
|
||||||
@@ -589,6 +614,111 @@
|
|||||||
<el-button type="primary" @click="refundDetailVisible = false">关 闭</el-button>
|
<el-button type="primary" @click="refundDetailVisible = false">关 闭</el-button>
|
||||||
</span>
|
</span>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<el-dialog
|
||||||
|
title=""
|
||||||
|
:visible.sync="batchDeliverProgressVisible"
|
||||||
|
width="560px"
|
||||||
|
custom-class="batch-deliver-progress-dialog"
|
||||||
|
append-to-body
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
:close-on-press-escape="false"
|
||||||
|
:show-close="batchDeliverProgress.finished"
|
||||||
|
@close="handleBatchDeliverProgressClose">
|
||||||
|
<div class="batch-deliver-progress-panel">
|
||||||
|
<div class="batch-deliver-hero" :class="'is-' + batchDeliverStatusType">
|
||||||
|
<div class="batch-deliver-hero-bg"></div>
|
||||||
|
<div class="batch-deliver-hero-content">
|
||||||
|
<div class="batch-deliver-status-icon">
|
||||||
|
<i v-if="!batchDeliverProgress.finished" class="el-icon-loading"></i>
|
||||||
|
<i v-else-if="batchDeliverProgress.failCount > 0" class="el-icon-warning-outline"></i>
|
||||||
|
<i v-else class="el-icon-circle-check"></i>
|
||||||
|
</div>
|
||||||
|
<div class="batch-deliver-status-copy">
|
||||||
|
<div class="batch-deliver-status-title">{{ batchDeliverStatusTitle }}</div>
|
||||||
|
<div class="batch-deliver-status-desc">{{ batchDeliverStatusDesc }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-deliver-progress-main">
|
||||||
|
<div class="batch-deliver-progress-ring">
|
||||||
|
<el-progress
|
||||||
|
type="circle"
|
||||||
|
:percentage="batchDeliverPercent"
|
||||||
|
:width="128"
|
||||||
|
:stroke-width="10"
|
||||||
|
:color="batchDeliverProgressColor">
|
||||||
|
</el-progress>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-deliver-stats-grid">
|
||||||
|
<div class="batch-deliver-stat-card is-total">
|
||||||
|
<div class="stat-icon"><i class="el-icon-s-order"></i></div>
|
||||||
|
<div class="stat-meta">
|
||||||
|
<div class="stat-value">{{ batchDeliverProgress.totalCount }}</div>
|
||||||
|
<div class="stat-label">订单总数</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="batch-deliver-stat-card is-processed">
|
||||||
|
<div class="stat-icon"><i class="el-icon-refresh-right"></i></div>
|
||||||
|
<div class="stat-meta">
|
||||||
|
<div class="stat-value">{{ batchDeliverProgress.processedCount }}</div>
|
||||||
|
<div class="stat-label">已处理</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="batch-deliver-stat-card is-success">
|
||||||
|
<div class="stat-icon"><i class="el-icon-circle-check"></i></div>
|
||||||
|
<div class="stat-meta">
|
||||||
|
<div class="stat-value">{{ batchDeliverProgress.successCount }}</div>
|
||||||
|
<div class="stat-label">成功</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="batch-deliver-stat-card is-fail">
|
||||||
|
<div class="stat-icon"><i class="el-icon-circle-close"></i></div>
|
||||||
|
<div class="stat-meta">
|
||||||
|
<div class="stat-value">{{ batchDeliverProgress.failCount }}</div>
|
||||||
|
<div class="stat-label">失败</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="batchDeliverProgress.failMessage" class="batch-deliver-alert is-error">
|
||||||
|
<i class="el-icon-warning"></i>
|
||||||
|
<span>{{ batchDeliverProgress.failMessage }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="!batchDeliverProgress.finished" class="batch-deliver-alert is-info">
|
||||||
|
<i class="el-icon-time"></i>
|
||||||
|
<span>后台正在处理发货任务,请勿关闭页面</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="batchDeliverProgress.failedItems.length" class="batch-deliver-failed-section">
|
||||||
|
<div class="batch-deliver-failed-header">
|
||||||
|
<span class="batch-deliver-failed-title">失败明细</span>
|
||||||
|
<span class="batch-deliver-failed-count">共 {{ batchDeliverProgress.failedItems.length }} 条</span>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
:data="batchDeliverProgress.failedItems"
|
||||||
|
size="mini"
|
||||||
|
class="batch-deliver-failed-table"
|
||||||
|
max-height="220">
|
||||||
|
<el-table-column prop="orderSn" label="订单编号" min-width="150"></el-table-column>
|
||||||
|
<el-table-column prop="failMessage" label="失败原因" min-width="200" show-overflow-tooltip></el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span slot="footer" class="batch-deliver-progress-footer">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
round
|
||||||
|
:disabled="!batchDeliverProgress.finished"
|
||||||
|
@click="closeBatchDeliverProgressDialog">
|
||||||
|
{{ batchDeliverProgress.finished ? '完成' : '处理中...' }}
|
||||||
|
</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
<el-pagination v-if="tabChange.isPrint != 1" @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
|
<el-pagination v-if="tabChange.isPrint != 1" @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
|
||||||
:current-page="pageIndex" :page-sizes="[20, 40, 60, 100, 150]" :page-size="pageSize" :total="totalPage"
|
:current-page="pageIndex" :page-sizes="[20, 40, 60, 100, 150]" :page-size="pageSize" :total="totalPage"
|
||||||
layout="total, sizes, prev, pager, next, jumper">
|
layout="total, sizes, prev, pager, next, jumper">
|
||||||
@@ -646,20 +776,35 @@
|
|||||||
dataForm: {
|
dataForm: {
|
||||||
key: '',
|
key: '',
|
||||||
time: '',
|
time: '',
|
||||||
productName: ''
|
productName: '',
|
||||||
|
filterPresale: false,
|
||||||
|
showOne: false
|
||||||
},
|
},
|
||||||
PrintSheetList: [], //打印列表
|
PrintSheetList: [], //打印列表
|
||||||
sheetListLoading: false,
|
sheetListLoading: false,
|
||||||
selectedPrintList: [], // 选中的面单列表
|
selectedPrintList: [], // 选中的面单列表
|
||||||
mergeList: [], // 检查订单可合并项数组
|
mergeList: [], // 检查订单可合并项数组
|
||||||
checkboxGroup: {
|
checkboxGroup: {
|
||||||
isIndeterminate: true,
|
isIndeterminate: false,
|
||||||
checkAll: false
|
checkAll: false
|
||||||
},
|
},
|
||||||
multipleDisabled: false, // 待发出多选是否可用
|
multipleDisabled: false, // 待发出多选是否可用
|
||||||
//childrenChecked:[],
|
//childrenChecked:[],
|
||||||
checkedOrders: [], // 新的筛选
|
checkedOrders: [], // 新的筛选
|
||||||
fullscreenLoading: false,
|
fullscreenLoading: false,
|
||||||
|
batchDeliverLoading: false,
|
||||||
|
batchDeliverProgressVisible: false,
|
||||||
|
batchDeliverPollTimer: null,
|
||||||
|
batchDeliverProgress: {
|
||||||
|
taskId: null,
|
||||||
|
totalCount: 0,
|
||||||
|
successCount: 0,
|
||||||
|
failCount: 0,
|
||||||
|
processedCount: 0,
|
||||||
|
finished: false,
|
||||||
|
failMessage: null,
|
||||||
|
failedItems: []
|
||||||
|
},
|
||||||
deliverDetailVisible: false,
|
deliverDetailVisible: false,
|
||||||
splitDeliverVisible: false,
|
splitDeliverVisible: false,
|
||||||
mergeDliverVisible: false,
|
mergeDliverVisible: false,
|
||||||
@@ -824,8 +969,37 @@
|
|||||||
return n > 0 ? n : 0
|
return n > 0 ? n : 0
|
||||||
}
|
}
|
||||||
return paidNum
|
return paidNum
|
||||||
|
},
|
||||||
|
batchDeliverPercent() {
|
||||||
|
const { processedCount, totalCount } = this.batchDeliverProgress
|
||||||
|
if (!totalCount) return 0
|
||||||
|
return Math.min(100, Math.round((processedCount / totalCount) * 100))
|
||||||
|
},
|
||||||
|
batchDeliverStatusType() {
|
||||||
|
if (!this.batchDeliverProgress.finished) return 'processing'
|
||||||
|
if (this.batchDeliverProgress.failCount > 0) return 'warning'
|
||||||
|
return 'success'
|
||||||
|
},
|
||||||
|
batchDeliverStatusTitle() {
|
||||||
|
if (!this.batchDeliverProgress.finished) return '正在批量发出'
|
||||||
|
if (this.batchDeliverProgress.failCount > 0) return '发出完成(部分失败)'
|
||||||
|
return '全部发出成功'
|
||||||
|
},
|
||||||
|
batchDeliverStatusDesc() {
|
||||||
|
if (!this.batchDeliverProgress.finished) {
|
||||||
|
return `已完成 ${this.batchDeliverProgress.processedCount} / ${this.batchDeliverProgress.totalCount} 单`
|
||||||
|
}
|
||||||
|
return `成功 ${this.batchDeliverProgress.successCount} 单,失败 ${this.batchDeliverProgress.failCount} 单`
|
||||||
|
},
|
||||||
|
batchDeliverProgressColor() {
|
||||||
|
if (!this.batchDeliverProgress.finished) return '#409EFF'
|
||||||
|
if (this.batchDeliverProgress.failCount > 0) return '#E6A23C'
|
||||||
|
return '#67C23A'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
this.stopBatchDeliverPolling()
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
computedVipType(userVips) {
|
computedVipType(userVips) {
|
||||||
if (!userVips || userVips.length === 0) return '';
|
if (!userVips || userVips.length === 0) return '';
|
||||||
@@ -1073,15 +1247,27 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
},
|
},
|
||||||
// 全选/全不选
|
// 获取可勾选的待发出订单 id
|
||||||
|
getSelectableOrderIds() {
|
||||||
|
return this.dataList
|
||||||
|
.filter(item => item.isSend != 1)
|
||||||
|
.map(item => item.orderId)
|
||||||
|
},
|
||||||
|
// 同步全选复选框状态
|
||||||
|
syncCheckAllState() {
|
||||||
|
const selectableIds = this.getSelectableOrderIds()
|
||||||
|
const checkedCount = this.checkedOrders.length
|
||||||
|
this.checkboxGroup.checkAll = checkedCount > 0 && checkedCount === selectableIds.length
|
||||||
|
this.checkboxGroup.isIndeterminate = checkedCount > 0 && checkedCount < selectableIds.length
|
||||||
|
},
|
||||||
|
// 全选/取消全选
|
||||||
handleCheckAllChange(val) {
|
handleCheckAllChange(val) {
|
||||||
// console.log(this.selectOptions)------------
|
if (val) {
|
||||||
let newidList = this.dataList.map(item => item.orderId);
|
this.checkedOrders = this.getSelectableOrderIds()
|
||||||
this.checkedOrders = newidList
|
} else {
|
||||||
this.checkboxGroup.isIndeterminate = !this.checkboxGroup.isIndeterminate;
|
|
||||||
if (this.checkboxGroup.isIndeterminate) {
|
|
||||||
this.checkedOrders = []
|
this.checkedOrders = []
|
||||||
}
|
}
|
||||||
|
this.checkboxGroup.isIndeterminate = false
|
||||||
},
|
},
|
||||||
// 添加-更新-订单备注
|
// 添加-更新-订单备注
|
||||||
editBeizhu(val) {
|
editBeizhu(val) {
|
||||||
@@ -1121,6 +1307,7 @@
|
|||||||
"pageIndex": this.pageIndex,
|
"pageIndex": this.pageIndex,
|
||||||
"pageSize": this.pageSize,
|
"pageSize": this.pageSize,
|
||||||
"filterPresale": this.dataForm.filterPresale?1:0,
|
"filterPresale": this.dataForm.filterPresale?1:0,
|
||||||
|
"showOne": this.dataForm.showOne ? 1 : 0,
|
||||||
"orderType": this.orderType
|
"orderType": this.orderType
|
||||||
})
|
})
|
||||||
}).then(({data}) => {
|
}).then(({data}) => {
|
||||||
@@ -1130,6 +1317,9 @@
|
|||||||
this.totalPage = data.result.total
|
this.totalPage = data.result.total
|
||||||
if (this.tabChange.tabActiveName === '1') { // 判断可选按钮是否可用
|
if (this.tabChange.tabActiveName === '1') { // 判断可选按钮是否可用
|
||||||
this.isMultipleDisabled()
|
this.isMultipleDisabled()
|
||||||
|
this.checkedOrders = []
|
||||||
|
this.checkboxGroup.checkAll = false
|
||||||
|
this.checkboxGroup.isIndeterminate = false
|
||||||
}
|
}
|
||||||
//如果是名医精彩 出现导出按钮
|
//如果是名医精彩 出现导出按钮
|
||||||
if(this.orderType=='mingyijingcai'){
|
if(this.orderType=='mingyijingcai'){
|
||||||
@@ -1507,13 +1697,120 @@
|
|||||||
this.setDeliverVisible = false
|
this.setDeliverVisible = false
|
||||||
this.getDataList()
|
this.getDataList()
|
||||||
this.checkedOrders = []
|
this.checkedOrders = []
|
||||||
this.isIndeterminate = true
|
this.checkboxGroup.checkAll = false
|
||||||
|
this.checkboxGroup.isIndeterminate = false
|
||||||
},
|
},
|
||||||
// 关闭面单预览
|
// 关闭面单预览
|
||||||
closeSheetDliverDialog(val) {
|
closeSheetDliverDialog(val) {
|
||||||
this.sheetVisible = val
|
this.sheetVisible = val
|
||||||
},
|
},
|
||||||
// 批量发出
|
// 批量发出
|
||||||
|
batchDeliver() {
|
||||||
|
if (!this.checkedOrders.length) {
|
||||||
|
this.$message.warning('请先勾选要发出的订单')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$confirm(`共选中了${this.checkedOrders.length}条订单,是否批量发出?`, '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
this.batchDeliverLoading = true
|
||||||
|
this.$http({
|
||||||
|
url: this.$http.adornUrl('/book/buyOrder/batchDelivery'),
|
||||||
|
method: 'post',
|
||||||
|
data: this.checkedOrders,
|
||||||
|
timeout: 0
|
||||||
|
}).then(({ data }) => {
|
||||||
|
if (data && data.code === 0) {
|
||||||
|
if (data.taskId) {
|
||||||
|
this.checkedOrders = []
|
||||||
|
this.checkboxGroup.checkAll = false
|
||||||
|
this.checkboxGroup.isIndeterminate = false
|
||||||
|
this.openBatchDeliverProgress(data)
|
||||||
|
} else {
|
||||||
|
this.$message.success('批量发出成功')
|
||||||
|
this.checkedOrders = []
|
||||||
|
this.checkboxGroup.checkAll = false
|
||||||
|
this.checkboxGroup.isIndeterminate = false
|
||||||
|
this.getDataList()
|
||||||
|
}
|
||||||
|
} else if (data) {
|
||||||
|
if (data.msg === '订单列表不能为空') {
|
||||||
|
this.$message.error('订单列表不能为空')
|
||||||
|
} else {
|
||||||
|
this.$message.error(`以下订单不符合发出条件:${data.msg}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.$message.error('批量发出失败,请稍后重试')
|
||||||
|
}).finally(() => {
|
||||||
|
this.batchDeliverLoading = false
|
||||||
|
})
|
||||||
|
}).catch(() => {})
|
||||||
|
},
|
||||||
|
openBatchDeliverProgress(submitData) {
|
||||||
|
this.batchDeliverProgress = {
|
||||||
|
taskId: submitData.taskId,
|
||||||
|
totalCount: submitData.totalCount || 0,
|
||||||
|
successCount: 0,
|
||||||
|
failCount: 0,
|
||||||
|
processedCount: 0,
|
||||||
|
finished: false,
|
||||||
|
failMessage: null,
|
||||||
|
failedItems: []
|
||||||
|
}
|
||||||
|
this.batchDeliverProgressVisible = true
|
||||||
|
this.pollBatchDeliveryProgress()
|
||||||
|
this.batchDeliverPollTimer = setInterval(() => {
|
||||||
|
this.pollBatchDeliveryProgress()
|
||||||
|
}, 1000)
|
||||||
|
},
|
||||||
|
pollBatchDeliveryProgress() {
|
||||||
|
if (!this.batchDeliverProgress.taskId) return
|
||||||
|
this.$http({
|
||||||
|
url: this.$http.adornUrl('/book/buyOrder/getBatchDeliveryProgress'),
|
||||||
|
method: 'get',
|
||||||
|
params: this.$http.adornParams({
|
||||||
|
taskId: this.batchDeliverProgress.taskId
|
||||||
|
})
|
||||||
|
}).then(({ data }) => {
|
||||||
|
if (data && data.code === 0) {
|
||||||
|
this.batchDeliverProgress = {
|
||||||
|
...this.batchDeliverProgress,
|
||||||
|
totalCount: data.totalCount,
|
||||||
|
successCount: data.successCount,
|
||||||
|
failCount: data.failCount,
|
||||||
|
processedCount: data.processedCount,
|
||||||
|
finished: data.finished,
|
||||||
|
failMessage: data.failMessage,
|
||||||
|
failedItems: data.failedItems || []
|
||||||
|
}
|
||||||
|
if (data.finished) {
|
||||||
|
this.stopBatchDeliverPolling()
|
||||||
|
this.getDataList()
|
||||||
|
if (data.failCount > 0) {
|
||||||
|
this.$message.warning(`批量发出完成,成功 ${data.successCount} 条,失败 ${data.failCount} 条`)
|
||||||
|
} else {
|
||||||
|
this.$message.success('批量发出完成')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).catch(() => {})
|
||||||
|
},
|
||||||
|
stopBatchDeliverPolling() {
|
||||||
|
if (this.batchDeliverPollTimer) {
|
||||||
|
clearInterval(this.batchDeliverPollTimer)
|
||||||
|
this.batchDeliverPollTimer = null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
closeBatchDeliverProgressDialog() {
|
||||||
|
this.batchDeliverProgressVisible = false
|
||||||
|
this.stopBatchDeliverPolling()
|
||||||
|
},
|
||||||
|
handleBatchDeliverProgressClose() {
|
||||||
|
this.stopBatchDeliverPolling()
|
||||||
|
},
|
||||||
setDeliver() {
|
setDeliver() {
|
||||||
this.setDeliverVisible = true
|
this.setDeliverVisible = true
|
||||||
},
|
},
|
||||||
@@ -1590,8 +1887,8 @@
|
|||||||
this.setDeliverVisible = true
|
this.setDeliverVisible = true
|
||||||
},
|
},
|
||||||
handleCheckedChange(val) {
|
handleCheckedChange(val) {
|
||||||
console.log(val)
|
|
||||||
this.checkedOrders = val
|
this.checkedOrders = val
|
||||||
|
this.syncCheckAllState()
|
||||||
},
|
},
|
||||||
//名医精彩-导出
|
//名医精彩-导出
|
||||||
handleExport(){
|
handleExport(){
|
||||||
@@ -1646,7 +1943,8 @@
|
|||||||
watch: {
|
watch: {
|
||||||
tabChange: {
|
tabChange: {
|
||||||
handler(val, oldVal) {
|
handler(val, oldVal) {
|
||||||
this.dataForm.filterPresale=false
|
this.dataForm.filterPresale = false
|
||||||
|
this.dataForm.showOne = false
|
||||||
//console.log(val)
|
//console.log(val)
|
||||||
this.getDataList()
|
this.getDataList()
|
||||||
if (this.tabChange.tabActiveName === '' || this.tabChange.tabActiveName === '0' || this.tabChange
|
if (this.tabChange.tabActiveName === '' || this.tabChange.tabActiveName === '0' || this.tabChange
|
||||||
@@ -1679,6 +1977,28 @@
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
border-bottom: 1px solid #f1f1f1;
|
border-bottom: 1px solid #f1f1f1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-dialog {
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-dialog .el-dialog__header {
|
||||||
|
display: none;
|
||||||
|
padding: 0;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-dialog .el-dialog__body {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-dialog .el-dialog__footer {
|
||||||
|
padding: 16px 24px 24px;
|
||||||
|
border-top: 1px solid #f0f2f5;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
.booksUl {
|
.booksUl {
|
||||||
@@ -2114,4 +2434,277 @@
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/deep/ .batch-deliver-progress-dialog {
|
||||||
|
.el-dialog__header,
|
||||||
|
.el-dialog__body,
|
||||||
|
.el-dialog__footer {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-panel {
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-hero {
|
||||||
|
position: relative;
|
||||||
|
padding: 24px 24px 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&.is-processing {
|
||||||
|
.batch-deliver-hero-bg {
|
||||||
|
background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-icon {
|
||||||
|
background: rgba(255, 255, 255, 0.18);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-success {
|
||||||
|
.batch-deliver-hero-bg {
|
||||||
|
background: linear-gradient(135deg, #67c23a 0%, #95d475 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-icon {
|
||||||
|
background: rgba(255, 255, 255, 0.18);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-warning {
|
||||||
|
.batch-deliver-hero-bg {
|
||||||
|
background: linear-gradient(135deg, #e6a23c 0%, #f3c06b 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-icon {
|
||||||
|
background: rgba(255, 255, 255, 0.18);
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-hero-bg {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-hero-content {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-icon {
|
||||||
|
width: 52px;
|
||||||
|
height: 52px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 26px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-copy {
|
||||||
|
min-width: 0;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-title {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.4;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-status-desc {
|
||||||
|
font-size: 13px;
|
||||||
|
opacity: 0.92;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-main {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
padding: 24px;
|
||||||
|
background: linear-gradient(180deg, #fafbfc 0%, #fff 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-ring {
|
||||||
|
flex-shrink: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-ring-label {
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #909399;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-stats-grid {
|
||||||
|
flex: 1;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-stat-card {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 12px 14px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #ebeef5;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03);
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-icon {
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
border-radius: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-value {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.2;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-label {
|
||||||
|
margin-top: 2px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #909399;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-total .stat-icon {
|
||||||
|
background: #ecf5ff;
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-processed .stat-icon {
|
||||||
|
background: #f4f4f5;
|
||||||
|
color: #909399;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-success .stat-icon {
|
||||||
|
background: #f0f9eb;
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-fail .stat-icon {
|
||||||
|
background: #fef0f0;
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-alert {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 0 24px 16px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
i {
|
||||||
|
margin-top: 2px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-info {
|
||||||
|
background: #f4f8ff;
|
||||||
|
color: #409eff;
|
||||||
|
border: 1px solid #d9ecff;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.is-error {
|
||||||
|
background: #fef0f0;
|
||||||
|
color: #f56c6c;
|
||||||
|
border: 1px solid #fde2e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-failed-section {
|
||||||
|
margin: 0 24px 24px;
|
||||||
|
padding: 14px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #fafafa;
|
||||||
|
border: 1px solid #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-failed-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-failed-title {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-failed-count {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #909399;
|
||||||
|
background: #fff;
|
||||||
|
padding: 2px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
border: 1px solid #ebeef5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-failed-table {
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
/deep/ .el-table {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/deep/ .el-table th {
|
||||||
|
background: #f5f7fa;
|
||||||
|
color: #606266;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/deep/ .el-table td,
|
||||||
|
/deep/ .el-table th {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-deliver-progress-footer {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.el-button {
|
||||||
|
min-width: 120px;
|
||||||
|
padding: 10px 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -387,7 +387,7 @@ this.$emit('delete',[row])
|
|||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
},
|
},
|
||||||
getRowKeys(row) {
|
getRowKeys(row) {
|
||||||
return row.productId;
|
return row.id;
|
||||||
},
|
},
|
||||||
handleSelectionChange(val) {
|
handleSelectionChange(val) {
|
||||||
console.log("🚀 ~ handleSelectionChange ~ val:", val);
|
console.log("🚀 ~ handleSelectionChange ~ val:", val);
|
||||||
@@ -447,9 +447,6 @@ this.$emit('delete',[row])
|
|||||||
},
|
},
|
||||||
// 获取关联数据列表
|
// 获取关联数据列表
|
||||||
async getAssociatedGoodsList() {
|
async getAssociatedGoodsList() {
|
||||||
console.log("🚀 ~ getAssociatedGoodsList ~ form:", form);
|
|
||||||
// :currentId="addForm.id"
|
|
||||||
// currentType="bookLabelId"
|
|
||||||
var form = { ...this.dataForm };
|
var form = { ...this.dataForm };
|
||||||
|
|
||||||
if (this.currentType == "bookLabelId") {
|
if (this.currentType == "bookLabelId") {
|
||||||
@@ -476,10 +473,10 @@ this.$emit('delete',[row])
|
|||||||
}),
|
}),
|
||||||
}).then(async ({ data }) => {
|
}).then(async ({ data }) => {
|
||||||
if (data && data.code === 0) {
|
if (data && data.code === 0) {
|
||||||
|
this.dataListLoading = false;
|
||||||
var list = [...data.result.records];
|
var list = [...data.result.records];
|
||||||
// this.associatedGoodsList = [...data.result.records];
|
// this.associatedGoodsList = [...data.result.records];
|
||||||
|
|
||||||
this.dataListLoading = false;
|
|
||||||
list.forEach((item) => {
|
list.forEach((item) => {
|
||||||
item.isEdit = false
|
item.isEdit = false
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user