新增路线产品
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function listLineProduct(query) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
export function getLineProduct(id) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function addLineProduct(data) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateLineProduct(data) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function changeLineProductStatus(id, blOpen) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct/changeStatus',
|
||||
method: 'put',
|
||||
data: { id, blOpen }
|
||||
})
|
||||
}
|
||||
|
||||
export function delLineProduct(ids) {
|
||||
return request({
|
||||
url: '/masterdata/lineproduct/' + ids,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -19,18 +19,30 @@ export function getPay(productId) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 按字典匹配工作表,返回预览,不写数据库 */
|
||||
export function previewPay(file, dictValue) {
|
||||
/** 按字典匹配工作表,返回预览,不写数据库。progressId 用来轮询解析进度。 */
|
||||
export function previewPay(file, dictValue, progressId, onUploadProgress) {
|
||||
const data = new FormData()
|
||||
data.append('file', file)
|
||||
if (dictValue) data.append('dictValue', dictValue)
|
||||
if (progressId) data.append('progressId', progressId)
|
||||
return request({
|
||||
url: '/price/pay/preview',
|
||||
method: 'post',
|
||||
data,
|
||||
// 必须声明 multipart,否则全局 application/json 会把文件流改写成空 JSON
|
||||
headers: { 'Content-Type': 'multipart/form-data', repeatSubmit: false },
|
||||
timeout: 10 * 60 * 1000
|
||||
timeout: 10 * 60 * 1000,
|
||||
onUploadProgress
|
||||
})
|
||||
}
|
||||
|
||||
/** 查询一次价卡解析进度 */
|
||||
export function payParseProgress(progressId) {
|
||||
return request({
|
||||
url: '/price/pay/preview/progress',
|
||||
method: 'get',
|
||||
params: { progressId },
|
||||
headers: { repeatSubmit: false }
|
||||
})
|
||||
}
|
||||
|
||||
@@ -140,24 +152,6 @@ export function generatePayBill(billId) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 勾选产品的附加费开关。productIds 用逗号分隔 */
|
||||
export function listFeeRule(productIds) {
|
||||
return request({
|
||||
url: '/price/pay/feeRule/list',
|
||||
method: 'get',
|
||||
params: { productIds: productIds.join(',') }
|
||||
})
|
||||
}
|
||||
|
||||
/** 按产品保存附加费开关。每个产品一份 */
|
||||
export function saveFeeRule(data) {
|
||||
return request({
|
||||
url: '/price/pay/feeRule',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
/** 删除产品及其重量段、附加费、其他配置 */
|
||||
export function delPay(productIds) {
|
||||
return request({
|
||||
|
||||
@@ -0,0 +1,373 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<basic-table
|
||||
ref="tableRef"
|
||||
:columns="columns"
|
||||
:search-columns="searchColumns"
|
||||
:query="queryList"
|
||||
row-key="id"
|
||||
>
|
||||
<template #toolbar>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['data:lineProduct:add']">新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['data:lineProduct:export']">导出</el-button>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
<template #col-blOpen="{ row }">{{ row.blOpen === '1' ? '启用' : row.blOpen === '0' ? '停用' : '-' }}</template>
|
||||
<template #col-blCargo="{ row }">{{ yesNoText(row.blCargo) }}</template>
|
||||
<template #col-blSection="{ row }">{{ yesNoText(row.blSection) }}</template>
|
||||
<template #col-action="{ row }">
|
||||
<el-button link type="primary" icon="View" @click="handleDetail(row)" v-hasPermi="['data:lineProduct:query']">详情</el-button>
|
||||
</template>
|
||||
</basic-table>
|
||||
|
||||
<el-dialog :title="title" v-model="open" width="980px" append-to-body>
|
||||
<el-form ref="formRef" :model="form" :rules="rules" :disabled="viewing" label-width="120px" class="line-form">
|
||||
<el-row :gutter="16">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品编码" prop="lineCode">
|
||||
<el-input v-model="form.lineCode" maxlength="64" placeholder="请输入产品编码" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品名称" prop="lineName">
|
||||
<el-input v-model="form.lineName" maxlength="200" placeholder="请输入产品名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品类型" prop="productType">
|
||||
<el-input v-model="form.productType" maxlength="20" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="线路类型" prop="lineType">
|
||||
<el-input v-model="form.lineType" maxlength="50" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品分类" prop="productCategory">
|
||||
<el-input v-model="form.productCategory" maxlength="100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="货物类型" prop="cargoType">
|
||||
<el-input v-model="form.cargoType" maxlength="64" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="货物名称" prop="cargoName">
|
||||
<el-input v-model="form.cargoName" maxlength="100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="费用类别" prop="feeClass">
|
||||
<el-input v-model="form.feeClass" maxlength="100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="启用状态" prop="blOpen">
|
||||
<el-radio-group v-model="form.blOpen">
|
||||
<el-radio value="1">启用</el-radio>
|
||||
<el-radio value="0">停用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="是否可收货" prop="blCargo">
|
||||
<el-radio-group v-model="form.blCargo">
|
||||
<el-radio value="1">是</el-radio>
|
||||
<el-radio value="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="是否分段" prop="blSection">
|
||||
<el-radio-group v-model="form.blSection">
|
||||
<el-radio value="1">是</el-radio>
|
||||
<el-radio value="0">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="派送商编码" prop="dispCode">
|
||||
<el-input v-model="form.dispCode" maxlength="60" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="派送商名称" prop="dispName">
|
||||
<el-input v-model="form.dispName" maxlength="100" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发货人ID" prop="shipperId">
|
||||
<el-input v-model="form.shipperId" maxlength="64" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发货规则" prop="shipmentRule">
|
||||
<el-input v-model="form.shipmentRule" maxlength="1" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发货类型" prop="shipmentType">
|
||||
<el-input v-model="form.shipmentType" maxlength="32" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="服务类型" prop="serviceType">
|
||||
<el-input v-model="form.serviceType" maxlength="1" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="重量类型" prop="weightType">
|
||||
<el-input v-model="form.weightType" maxlength="1" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="限重(kg)" prop="weight">
|
||||
<el-input-number v-model="form.weight" :min="0" :precision="2" :value-on-clear="null" controls-position="right" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="体积基数" prop="volumeBasis">
|
||||
<el-input-number v-model="form.volumeBasis" :min="0" :precision="2" :value-on-clear="null" controls-position="right" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="税费金额" prop="taxAmount">
|
||||
<el-input-number v-model="form.taxAmount" :min="0" :precision="3" :value-on-clear="null" controls-position="right" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="税费币种" prop="taxCurrency">
|
||||
<el-input v-model="form.taxCurrency" maxlength="16" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="电池类型" prop="batteryType">
|
||||
<el-input v-model="form.batteryType" maxlength="64" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="仓储服务名称" prop="productStorage">
|
||||
<el-input v-model="form.productStorage" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="仓储服务编码" prop="productStorageCode">
|
||||
<el-input v-model="form.productStorageCode" type="textarea" :rows="2" maxlength="1000" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="头程服务名称" prop="productFirst">
|
||||
<el-input v-model="form.productFirst" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="头程服务编码" prop="productFirstCode">
|
||||
<el-input v-model="form.productFirstCode" type="textarea" :rows="2" maxlength="1000" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="清关服务名称" prop="productClearance">
|
||||
<el-input v-model="form.productClearance" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="清关服务编码" prop="productClearanceCode">
|
||||
<el-input v-model="form.productClearanceCode" type="textarea" :rows="2" maxlength="1000" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" :rows="2" maxlength="500" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button v-if="!viewing" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="open = false">{{ viewing ? '关 闭' : '取 消' }}</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup name="LineProduct">
|
||||
import { nextTick } from 'vue'
|
||||
import {
|
||||
listLineProduct, getLineProduct, addLineProduct
|
||||
} from '@/api/masterdata/lineProduct'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const tableRef = ref()
|
||||
const formRef = ref()
|
||||
const open = ref(false)
|
||||
const viewing = ref(false)
|
||||
const title = ref('')
|
||||
|
||||
const openOptions = [
|
||||
{ label: '启用', value: '1' },
|
||||
{ label: '停用', value: '0' }
|
||||
]
|
||||
const yesNoOptions = [
|
||||
{ label: '是', value: '1' },
|
||||
{ label: '否', value: '0' }
|
||||
]
|
||||
|
||||
const searchColumns = [
|
||||
{ label: '产品编码', prop: 'lineCode', component: 'input', placeholder: '产品编码', width: '160px' },
|
||||
{ label: '产品名称', prop: 'lineName', component: 'input', placeholder: '模糊查询', width: '180px' },
|
||||
{ label: '产品类型', prop: 'productType', component: 'input', placeholder: '模糊查询', width: '150px' },
|
||||
{ label: '线路类型', prop: 'lineType', component: 'input', placeholder: '模糊查询', width: '150px' },
|
||||
{ label: '派送商', prop: 'dispName', component: 'input', placeholder: '模糊查询', width: '160px' },
|
||||
{ label: '货物类型', prop: 'cargoType', component: 'input', placeholder: '模糊查询', width: '150px' },
|
||||
{ label: '产品分类', prop: 'productCategory', component: 'input', placeholder: '模糊查询', width: '150px' },
|
||||
{ label: '启用', prop: 'blOpen', component: 'select', options: openOptions, placeholder: '启用状态', width: '130px', props: { clearable: true } },
|
||||
{ label: '可收货', prop: 'blCargo', component: 'select', options: yesNoOptions, placeholder: '是否可收货', width: '130px', props: { clearable: true } }
|
||||
]
|
||||
|
||||
const columns = [
|
||||
{ label: '产品编码', prop: 'lineCode', minWidth: 140, showOverflowTooltip: true },
|
||||
{ label: '产品名称', prop: 'lineName', minWidth: 180, showOverflowTooltip: true },
|
||||
{ label: '产品类型', prop: 'productType', minWidth: 110, showOverflowTooltip: true },
|
||||
{ label: '线路类型', prop: 'lineType', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '可收货', prop: 'blCargo', width: 80, slot: 'blCargo' },
|
||||
{ label: '货物名称', prop: 'cargoName', minWidth: 140, showOverflowTooltip: true },
|
||||
{ label: '仓储服务名称', prop: 'productStorage', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '头程服务名称', prop: 'productFirst', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '清关服务名称', prop: 'productClearance', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '仓储服务编码', prop: 'productStorageCode', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '头程服务编码', prop: 'productFirstCode', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '清关服务编码', prop: 'productClearanceCode', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '启用', prop: 'blOpen', width: 80, slot: 'blOpen' },
|
||||
{ label: '分段', prop: 'blSection', width: 70, slot: 'blSection' },
|
||||
{ label: '派送商编码', prop: 'dispCode', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '派送商名称', prop: 'dispName', minWidth: 140, showOverflowTooltip: true },
|
||||
{ label: '费用类别', prop: 'feeClass', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '发货人ID', prop: 'shipperId', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '发货规则', prop: 'shipmentRule', width: 90 },
|
||||
{ label: '限重(kg)', prop: 'weight', width: 100 },
|
||||
{ label: '货物类型', prop: 'cargoType', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '产品分类', prop: 'productCategory', minWidth: 120, showOverflowTooltip: true },
|
||||
{ label: '体积基数', prop: 'volumeBasis', width: 100 },
|
||||
{ label: '重量类型', prop: 'weightType', width: 90 },
|
||||
{ label: '服务类型', prop: 'serviceType', width: 90 },
|
||||
{ label: '发货类型', prop: 'shipmentType', minWidth: 110, showOverflowTooltip: true },
|
||||
{ label: '税费金额', prop: 'taxAmount', width: 100 },
|
||||
{ label: '税费币种', prop: 'taxCurrency', width: 90 },
|
||||
{ label: '电池类型', prop: 'batteryType', minWidth: 110, showOverflowTooltip: true },
|
||||
{ label: '备注', prop: 'remark', minWidth: 160, showOverflowTooltip: true },
|
||||
{ label: '创建时间', prop: 'createDate', width: 170, parseTime: true },
|
||||
{ label: '修改人', prop: 'modifier', minWidth: 100, showOverflowTooltip: true },
|
||||
{ label: '修改人工号', prop: 'modifierCode', minWidth: 110, showOverflowTooltip: true },
|
||||
{ label: '修改时间', prop: 'modifyDate', width: 170, parseTime: true },
|
||||
{ label: 'GMT创建时间', prop: 'gmtCreate', width: 170, parseTime: true },
|
||||
{ label: 'GMT修改时间', prop: 'gmtModified', width: 170, parseTime: true },
|
||||
{ label: '同步时间', prop: 'syncTime', width: 170, parseTime: true },
|
||||
{ label: '操作', prop: 'action', width: 90, fixed: 'right', slot: 'action', showInToolbar: false }
|
||||
]
|
||||
|
||||
const data = reactive({
|
||||
form: {},
|
||||
rules: {
|
||||
lineCode: [{ required: true, message: '产品编码不能为空', trigger: 'blur' }],
|
||||
lineName: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
|
||||
blOpen: [{ required: true, message: '请选择启用状态', trigger: 'change' }]
|
||||
}
|
||||
})
|
||||
const { form, rules } = toRefs(data)
|
||||
|
||||
function queryList(params) {
|
||||
return listLineProduct(params)
|
||||
}
|
||||
|
||||
function yesNoText(value) {
|
||||
if (value === '1') return '是'
|
||||
if (value === '0') return '否'
|
||||
return '-'
|
||||
}
|
||||
|
||||
function emptyForm() {
|
||||
return {
|
||||
id: undefined,
|
||||
lineCode: '',
|
||||
lineName: '',
|
||||
productType: '',
|
||||
lineType: '',
|
||||
blCargo: '1',
|
||||
cargoName: '',
|
||||
productStorage: '',
|
||||
productFirst: '',
|
||||
productClearance: '',
|
||||
productStorageCode: '',
|
||||
productFirstCode: '',
|
||||
productClearanceCode: '',
|
||||
blOpen: '1',
|
||||
blSection: '0',
|
||||
dispCode: '',
|
||||
dispName: '',
|
||||
feeClass: '',
|
||||
shipperId: '',
|
||||
shipmentRule: '',
|
||||
weight: undefined,
|
||||
cargoType: '',
|
||||
productCategory: '',
|
||||
volumeBasis: undefined,
|
||||
weightType: '',
|
||||
serviceType: '',
|
||||
shipmentType: '',
|
||||
taxAmount: undefined,
|
||||
taxCurrency: '',
|
||||
batteryType: '',
|
||||
remark: ''
|
||||
}
|
||||
}
|
||||
|
||||
function handleAdd() {
|
||||
viewing.value = false
|
||||
form.value = emptyForm()
|
||||
title.value = '新增路线产品'
|
||||
open.value = true
|
||||
nextTick(() => formRef.value && formRef.value.clearValidate())
|
||||
}
|
||||
|
||||
function handleDetail(row) {
|
||||
getLineProduct(row.id).then(res => {
|
||||
viewing.value = true
|
||||
form.value = Object.assign(emptyForm(), res.data || {})
|
||||
title.value = '路线产品详情'
|
||||
open.value = true
|
||||
nextTick(() => formRef.value && formRef.value.clearValidate())
|
||||
})
|
||||
}
|
||||
|
||||
function submitForm() {
|
||||
if (viewing.value) return
|
||||
formRef.value.validate(valid => {
|
||||
if (!valid) return
|
||||
addLineProduct(form.value).then(() => {
|
||||
proxy.$modal.msgSuccess('保存成功')
|
||||
open.value = false
|
||||
tableRef.value?.refresh()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
proxy.download('masterdata/lineproduct/export', {
|
||||
...tableRef.value.getQueryParams()
|
||||
}, `line_product_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.line-form {
|
||||
max-height: 68vh;
|
||||
overflow: auto;
|
||||
padding-right: 8px;
|
||||
}
|
||||
</style>
|
||||
@@ -36,13 +36,14 @@
|
||||
<span>{{ row.blMultiple === '1' ? '是' : row.blMultiple === '0' ? '否' : '-' }}</span>
|
||||
</template>
|
||||
<template #col-action="{ row }">
|
||||
<el-button link type="primary" icon="View" @click="handleDetail(row)" v-hasPermi="['data:serviceChannel:query']">详情</el-button>
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(row)" v-hasPermi="['data:serviceChannel:edit']">修改</el-button>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete([row.id])" v-hasPermi="['data:serviceChannel:remove']">删除</el-button>
|
||||
</template>
|
||||
</basic-table>
|
||||
|
||||
<el-dialog :title="title" v-model="open" width="760px" append-to-body>
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-form ref="formRef" :model="form" :rules="viewing ? {} : rules" :disabled="viewing" label-width="120px">
|
||||
<el-row :gutter="16">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="渠道编码" prop="channelCode">
|
||||
@@ -142,7 +143,7 @@
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="应付产品">
|
||||
<el-select v-model="payOriginId" filterable clearable placeholder="选择已导入的应付产品" style="width: 280px" :disabled="!form.id" @change="onPayOrigin">
|
||||
<el-select v-model="payOriginId" filterable clearable placeholder="选择已导入的应付产品" style="width: 280px" :disabled="viewing || !form.id" @change="onPayOrigin">
|
||||
<el-option v-for="item in payOptions" :key="item.productId" :label="payOptionLabel(item)" :value="item.productId" />
|
||||
</el-select>
|
||||
<div class="pay-tip">{{ payTip }}</div>
|
||||
@@ -151,8 +152,8 @@
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="open = false">取 消</el-button>
|
||||
<el-button v-if="!viewing" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="open = false">{{ viewing ? '关 闭' : '取 消' }}</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
@@ -171,12 +172,17 @@ const { proxy } = getCurrentInstance()
|
||||
const tableRef = ref()
|
||||
const formRef = ref()
|
||||
const open = ref(false)
|
||||
const viewing = ref(false)
|
||||
const title = ref('')
|
||||
const payOptions = ref([])
|
||||
const payOriginId = ref()
|
||||
const payProduct = ref(null)
|
||||
const syncingPay = ref(false)
|
||||
const payTip = computed(() => {
|
||||
if (viewing.value) {
|
||||
if (payProduct.value?.versionNo) return `已绑定第 ${payProduct.value.versionNo} 版。`
|
||||
return payOriginId.value ? '已绑定应付产品。' : '未绑定应付产品。'
|
||||
}
|
||||
if (!form.value?.id) return '先保存渠道,再选择应付产品。渠道绑定的是产品编号,更新价格不会换编号。'
|
||||
if (payProduct.value?.versionNo) return `当前按有效期使用第 ${payProduct.value.versionNo} 版。历史订单按下单或计费时间取当时的版本。`
|
||||
return '选择产品后即绑定,按应付 AP 保存。'
|
||||
@@ -210,7 +216,7 @@ const columns = [
|
||||
{ label: '末端服务商', prop: 'finalServiceName', minWidth: 140, showOverflowTooltip: true },
|
||||
{ label: '抛货系数', prop: 'dimDivisor', width: 90 },
|
||||
{ label: '同步时间', prop: 'syncTime', width: 170, parseTime: true },
|
||||
{ label: '操作', prop: 'action', width: 150, fixed: 'right', slot: 'action', showInToolbar: false }
|
||||
{ label: '操作', prop: 'action', width: 200, fixed: 'right', slot: 'action', showInToolbar: false }
|
||||
]
|
||||
|
||||
const data = reactive({
|
||||
@@ -285,6 +291,7 @@ function loadChannelPay(channelId) {
|
||||
}
|
||||
|
||||
function handleAdd() {
|
||||
viewing.value = false
|
||||
form.value = emptyForm()
|
||||
resetPay()
|
||||
loadPayOptions()
|
||||
@@ -295,6 +302,7 @@ function handleAdd() {
|
||||
|
||||
function handleUpdate(row) {
|
||||
getServiceChannel(row.id).then(res => {
|
||||
viewing.value = false
|
||||
form.value = Object.assign(emptyForm(), res.data || {})
|
||||
resetPay()
|
||||
loadPayOptions()
|
||||
@@ -305,8 +313,21 @@ function handleUpdate(row) {
|
||||
})
|
||||
}
|
||||
|
||||
function handleDetail(row) {
|
||||
getServiceChannel(row.id).then(res => {
|
||||
viewing.value = true
|
||||
form.value = Object.assign(emptyForm(), res.data || {})
|
||||
resetPay()
|
||||
loadPayOptions()
|
||||
loadChannelPay(row.id)
|
||||
title.value = '渠道详情'
|
||||
open.value = true
|
||||
nextTick(() => formRef.value && formRef.value.clearValidate())
|
||||
})
|
||||
}
|
||||
|
||||
function onPayOrigin(id) {
|
||||
if (!form.value.id || syncingPay.value) return
|
||||
if (viewing.value || !form.value.id || syncingPay.value) return
|
||||
if (!id) {
|
||||
payProduct.value = null
|
||||
bindChannelPay(form.value.id, null, 'AP')
|
||||
@@ -319,6 +340,7 @@ function onPayOrigin(id) {
|
||||
}
|
||||
|
||||
function submitForm() {
|
||||
if (viewing.value) return
|
||||
formRef.value.validate(valid => {
|
||||
if (!valid) return
|
||||
const req = form.value.id ? updateServiceChannel(form.value) : addServiceChannel(form.value)
|
||||
|
||||
@@ -1,291 +0,0 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
title="附加费配置"
|
||||
width="1280px"
|
||||
top="6vh"
|
||||
append-to-body
|
||||
destroy-on-close
|
||||
@closed="reset"
|
||||
>
|
||||
<div v-loading="loading">
|
||||
<p class="fee-tip">还没配置的产品共用一页,保存后按产品各写一份。已经配置过的产品单独一页,互不影响。</p>
|
||||
<el-tabs v-if="tabs.length > 1" v-model="active">
|
||||
<el-tab-pane v-for="tab in tabs" :key="tab.key" :label="tab.label" :name="tab.key" />
|
||||
</el-tabs>
|
||||
<div v-if="current" class="fee-bar">
|
||||
<span>{{ currentHint }}</span>
|
||||
<el-button type="primary" plain icon="Plus" @click="addRow">添加一行</el-button>
|
||||
</div>
|
||||
<el-table v-if="current" :data="current.rules" border size="small" max-height="460" empty-text="还没有附加费">
|
||||
<el-table-column label="附加费名称" min-width="180">
|
||||
<template #default="{ row }">
|
||||
<el-select v-model="row.feeName" filterable clearable placeholder="选择附加费">
|
||||
<el-option v-for="item in feeOptions(row)" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="启用" width="72" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-switch v-model="row.enabled" active-value="1" inactive-value="0" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="触发类型" width="120">
|
||||
<template #default="{ row }">
|
||||
<el-select v-model="row.triggerType">
|
||||
<el-option v-for="item in triggerOptions" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="最长边cm" width="108">
|
||||
<template #default="{ row }"><el-input-number v-model="row.sideMaxCm" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="长+宽+高cm" width="116">
|
||||
<template #default="{ row }"><el-input-number v-model="row.sumMaxCm" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="体积cm³" width="116">
|
||||
<template #default="{ row }"><el-input-number v-model="row.volumeMaxCm3" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="最小长" width="96">
|
||||
<template #default="{ row }"><el-input-number v-model="row.minLengthCm" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="最小宽" width="96">
|
||||
<template #default="{ row }"><el-input-number v-model="row.minWidthCm" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="最小高" width="96">
|
||||
<template #default="{ row }"><el-input-number v-model="row.minHeightCm" :min="0" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="重量上限kg" width="112">
|
||||
<template #default="{ row }"><el-input-number v-model="row.weightMaxKg" :min="0" :precision="3" :controls="false" :value-on-clear="null" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="命中方式" width="128">
|
||||
<template #default="{ row }">
|
||||
<el-select v-model="row.joinMode">
|
||||
<el-option label="任一超出" value="ANY" />
|
||||
<el-option label="全部超出" value="ALL" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="说明" min-width="150">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.remark" maxlength="500" placeholder="不参与判断" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="70" align="center" fixed="right">
|
||||
<template #default="{ $index }">
|
||||
<el-button link type="danger" @click="removeRow($index)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<template #footer>
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" :loading="saving" @click="save">保存</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { listFeeRule, saveFeeRule } from '@/api/price/pay'
|
||||
import { useDict } from '@/utils/dict'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const { bms_surcharge_type } = useDict('bms_surcharge_type')
|
||||
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
const saving = ref(false)
|
||||
const tabs = ref([])
|
||||
const active = ref('')
|
||||
|
||||
const triggerOptions = [
|
||||
{ label: '尺寸', value: 'SIZE' },
|
||||
{ label: '体积', value: 'VOLUME' },
|
||||
{ label: '重量', value: 'WEIGHT' },
|
||||
{ label: '邮编', value: 'POSTCODE' },
|
||||
{ label: '每票', value: 'ALWAYS' },
|
||||
{ label: '退件', value: 'RETURN' }
|
||||
]
|
||||
|
||||
const current = computed(() => tabs.value.find(tab => tab.key === active.value) || null)
|
||||
const currentHint = computed(() => {
|
||||
if (!current.value) return ''
|
||||
if (current.value.productIds.length > 1) return `同时写入:${current.value.productName}`
|
||||
return tabs.value.length === 1 ? current.value.productName : ''
|
||||
})
|
||||
|
||||
function blankRule() {
|
||||
return {
|
||||
feeName: '',
|
||||
enabled: '0',
|
||||
triggerType: 'ALWAYS',
|
||||
sideMaxCm: null,
|
||||
sumMaxCm: null,
|
||||
volumeMaxCm3: null,
|
||||
minLengthCm: null,
|
||||
minWidthCm: null,
|
||||
minHeightCm: null,
|
||||
weightMaxKg: null,
|
||||
joinMode: 'ANY',
|
||||
remark: ''
|
||||
}
|
||||
}
|
||||
|
||||
function copyRule(row) {
|
||||
const next = blankRule()
|
||||
next.feeName = row.feeName || ''
|
||||
next.enabled = row.enabled === '1' ? '1' : '0'
|
||||
next.triggerType = row.triggerType || 'ALWAYS'
|
||||
next.sideMaxCm = toNumber(row.sideMaxCm)
|
||||
next.sumMaxCm = toNumber(row.sumMaxCm)
|
||||
next.volumeMaxCm3 = toNumber(row.volumeMaxCm3)
|
||||
next.minLengthCm = toNumber(row.minLengthCm)
|
||||
next.minWidthCm = toNumber(row.minWidthCm)
|
||||
next.minHeightCm = toNumber(row.minHeightCm)
|
||||
next.weightMaxKg = toNumber(row.weightMaxKg)
|
||||
next.joinMode = row.joinMode || 'ANY'
|
||||
next.remark = row.remark || ''
|
||||
return next
|
||||
}
|
||||
|
||||
function toNumber(value) {
|
||||
if (value === null || value === undefined || value === '') return null
|
||||
const number = Number(value)
|
||||
return Number.isFinite(number) ? number : null
|
||||
}
|
||||
|
||||
function feeOptions(row) {
|
||||
const list = bms_surcharge_type.value || []
|
||||
if (row.feeName && !list.some(item => item.value === row.feeName)) {
|
||||
return [{ label: row.feeName, value: row.feeName }, ...list]
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
function addRow() {
|
||||
current.value?.rules.push(blankRule())
|
||||
}
|
||||
|
||||
function removeRow(index) {
|
||||
if (!current.value) return
|
||||
current.value.rules.splice(index, 1)
|
||||
if (!current.value.rules.length) current.value.rules.push(blankRule())
|
||||
}
|
||||
|
||||
function rowTouched(row) {
|
||||
return !!(row.feeName || row.remark || row.enabled === '1'
|
||||
|| (row.triggerType && row.triggerType !== 'ALWAYS')
|
||||
|| (row.joinMode && row.joinMode !== 'ANY')
|
||||
|| [row.sideMaxCm, row.sumMaxCm, row.volumeMaxCm3, row.minLengthCm, row.minWidthCm, row.minHeightCm, row.weightMaxKg]
|
||||
.some(value => value !== null && value !== undefined && value !== ''))
|
||||
}
|
||||
|
||||
function keptRules(tab) {
|
||||
const kept = []
|
||||
const names = new Set()
|
||||
for (const row of tab.rules) {
|
||||
if (!rowTouched(row)) continue
|
||||
const feeName = (row.feeName || '').trim()
|
||||
if (!feeName) {
|
||||
proxy.$modal.msgError(`${tab.productName || '产品'}有未选择名称的附加费`)
|
||||
return null
|
||||
}
|
||||
if (names.has(feeName)) {
|
||||
proxy.$modal.msgError(`${tab.productName || '产品'}的附加费「${feeName}」重复了`)
|
||||
return null
|
||||
}
|
||||
names.add(feeName)
|
||||
kept.push({ ...row, feeName, remark: (row.remark || '').trim() })
|
||||
}
|
||||
return kept
|
||||
}
|
||||
|
||||
function save() {
|
||||
const products = []
|
||||
for (const tab of tabs.value) {
|
||||
const rules = keptRules(tab)
|
||||
if (!rules) return
|
||||
for (const productId of tab.productIds) {
|
||||
products.push({ productId, rules: rules.map(row => ({ ...row })) })
|
||||
}
|
||||
}
|
||||
if (!products.length) return
|
||||
saving.value = true
|
||||
saveFeeRule(products).then(() => {
|
||||
proxy.$modal.msgSuccess('附加费配置已保存')
|
||||
visible.value = false
|
||||
}).finally(() => {
|
||||
saving.value = false
|
||||
})
|
||||
}
|
||||
|
||||
function reset() {
|
||||
tabs.value = []
|
||||
active.value = ''
|
||||
loading.value = false
|
||||
saving.value = false
|
||||
}
|
||||
|
||||
function open(rows) {
|
||||
const picked = (rows || []).filter(row => row && row.productId != null)
|
||||
if (!picked.length) return
|
||||
reset()
|
||||
visible.value = true
|
||||
loading.value = true
|
||||
listFeeRule(picked.map(row => row.productId)).then(res => {
|
||||
const groups = res.data || []
|
||||
const unbound = groups.filter(group => !group.rules?.length)
|
||||
const bound = groups.filter(group => group.rules?.length)
|
||||
const next = []
|
||||
if (unbound.length) {
|
||||
const names = unbound.map(group => group.productName || `产品${group.productId}`)
|
||||
next.push({
|
||||
key: 'unbound',
|
||||
label: '未配置',
|
||||
productIds: unbound.map(group => group.productId),
|
||||
productName: names.join('、'),
|
||||
rules: [blankRule()]
|
||||
})
|
||||
}
|
||||
const nameCount = bound.reduce((map, group) => {
|
||||
const name = group.productName || ''
|
||||
map.set(name, (map.get(name) || 0) + 1)
|
||||
return map
|
||||
}, new Map())
|
||||
bound.forEach(group => {
|
||||
const name = group.productName || `产品${group.productId}`
|
||||
next.push({
|
||||
key: `bound-${group.productId}`,
|
||||
label: nameCount.get(group.productName || '') > 1 ? `${name}(${group.productId})` : name,
|
||||
productIds: [group.productId],
|
||||
productName: name,
|
||||
rules: group.rules.map(copyRule)
|
||||
})
|
||||
})
|
||||
tabs.value = next
|
||||
active.value = next.length ? next[0].key : ''
|
||||
}).catch(() => {
|
||||
visible.value = false
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.fee-tip {
|
||||
margin: 0 0 12px;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
.fee-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
:deep(.el-input-number) {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
@@ -28,6 +28,18 @@
|
||||
</template>
|
||||
</el-upload>
|
||||
|
||||
<div v-if="recognizing" class="parse-progress">
|
||||
<el-progress
|
||||
:percentage="parsePercent"
|
||||
:stroke-width="16"
|
||||
:status="parseStatus"
|
||||
striped
|
||||
striped-flow
|
||||
:duration="12"
|
||||
/>
|
||||
<div class="parse-progress-msg">{{ parseMessage }}</div>
|
||||
</div>
|
||||
|
||||
<div v-if="preview" v-loading="recognizing" class="preview-box">
|
||||
<el-alert
|
||||
:title="`${preview.sourceFile || ''} 归属 ${preview.supplierName || '-'} 生效 ${preview.effectiveDate || '-'} 共 ${products.length} 个产品`"
|
||||
@@ -97,7 +109,7 @@
|
||||
<script setup>
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
import { UploadFilled } from '@element-plus/icons-vue'
|
||||
import { previewPay, savePay } from '@/api/price/pay'
|
||||
import { previewPay, payParseProgress, savePay } from '@/api/price/pay'
|
||||
import { useDict } from '@/utils/dict'
|
||||
import PayConfigDetail from './PayConfigDetail.vue'
|
||||
|
||||
@@ -116,17 +128,24 @@ const selected = ref([])
|
||||
const tableRef = ref()
|
||||
const activeKey = ref('')
|
||||
const uploadKey = ref(0)
|
||||
const parsePercent = ref(0)
|
||||
const parseMessage = ref('')
|
||||
const parseStatus = ref(undefined)
|
||||
|
||||
const products = computed(() => preview.value?.products || [])
|
||||
const activeProduct = computed(() => products.value.find(item => item.rowKey === activeKey.value) || products.value[0])
|
||||
const skippedText = computed(() => (preview.value?.skippedSheets || []).filter(Boolean).join('、'))
|
||||
|
||||
let parseSeq = 0
|
||||
let progressTimer = null
|
||||
|
||||
function open() {
|
||||
reset()
|
||||
visible.value = true
|
||||
}
|
||||
|
||||
function reset() {
|
||||
parseSeq += 1
|
||||
preview.value = null
|
||||
selected.value = []
|
||||
overwrite.value = false
|
||||
@@ -135,6 +154,10 @@ function reset() {
|
||||
activeKey.value = ''
|
||||
recognizing.value = false
|
||||
saving.value = false
|
||||
parsePercent.value = 0
|
||||
parseMessage.value = ''
|
||||
parseStatus.value = undefined
|
||||
stopProgress()
|
||||
uploadKey.value += 1
|
||||
}
|
||||
|
||||
@@ -145,9 +168,26 @@ async function onFile(uploadFile) {
|
||||
proxy.$modal.msgError('请上传xlsx价卡')
|
||||
return
|
||||
}
|
||||
const seq = ++parseSeq
|
||||
const progressId = createProgressId()
|
||||
recognizing.value = true
|
||||
parsePercent.value = 0
|
||||
parseMessage.value = '正在上传价卡…'
|
||||
parseStatus.value = undefined
|
||||
startProgress(seq, progressId)
|
||||
try {
|
||||
const res = await previewPay(raw, dictValue.value)
|
||||
const res = await previewPay(raw, dictValue.value, progressId, event => {
|
||||
if (seq !== parseSeq || !event?.total) return
|
||||
const uploaded = Math.min(8, Math.round(event.loaded * 8 / event.total))
|
||||
if (uploaded > parsePercent.value) {
|
||||
parsePercent.value = uploaded
|
||||
parseMessage.value = '正在上传价卡…'
|
||||
}
|
||||
})
|
||||
if (seq !== parseSeq) return
|
||||
parsePercent.value = 100
|
||||
parseMessage.value = '解析完成'
|
||||
parseStatus.value = 'success'
|
||||
const data = res.data || {}
|
||||
data.products = (data.products || []).map((item, index) => ({
|
||||
...item,
|
||||
@@ -160,8 +200,48 @@ async function onFile(uploadFile) {
|
||||
await nextTick()
|
||||
tableRef.value?.clearSelection()
|
||||
picked.forEach(row => tableRef.value?.toggleRowSelection(row, true))
|
||||
} catch (error) {
|
||||
if (seq !== parseSeq) return
|
||||
parseStatus.value = 'exception'
|
||||
parseMessage.value = error?.message || '价卡解析失败'
|
||||
} finally {
|
||||
recognizing.value = false
|
||||
if (seq === parseSeq) {
|
||||
stopProgress()
|
||||
recognizing.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createProgressId() {
|
||||
if (window.crypto?.randomUUID) return window.crypto.randomUUID()
|
||||
return `pay${Date.now().toString(16)}${Math.random().toString(16).slice(2, 10)}`
|
||||
}
|
||||
|
||||
function startProgress(seq, progressId) {
|
||||
stopProgress()
|
||||
progressTimer = window.setInterval(async () => {
|
||||
if (seq !== parseSeq) return
|
||||
try {
|
||||
const res = await payParseProgress(progressId)
|
||||
if (seq !== parseSeq) return
|
||||
const data = res.data || {}
|
||||
if (!data.status || data.status === 'PENDING') return
|
||||
const server = Math.min(99, Number(data.percent) || 0)
|
||||
if (server >= parsePercent.value) {
|
||||
parsePercent.value = server
|
||||
if (data.message) parseMessage.value = data.message
|
||||
}
|
||||
if (data.status === 'FAIL') parseStatus.value = 'exception'
|
||||
} catch {
|
||||
// 进度查询失败时继续等预览结果
|
||||
}
|
||||
}, 400)
|
||||
}
|
||||
|
||||
function stopProgress() {
|
||||
if (progressTimer) {
|
||||
window.clearInterval(progressTimer)
|
||||
progressTimer = null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,6 +342,14 @@ defineExpose({ open })
|
||||
.import-form {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.parse-progress {
|
||||
margin-top: 14px;
|
||||
}
|
||||
.parse-progress-msg {
|
||||
margin-top: 8px;
|
||||
color: var(--el-text-color-regular);
|
||||
font-size: 13px;
|
||||
}
|
||||
.sheet-scroll {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Upload" @click="importRef.open()" v-hasPermi="['price:pay:import']">导入价卡</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Setting" :disabled="!selection.length" @click="feeRuleRef.open(selection)" v-hasPermi="['price:pay:edit']">附加费配置</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="!selection.length" @click="handleDelete(ids)" v-hasPermi="['price:pay:remove']">删除</el-button>
|
||||
</el-col>
|
||||
@@ -63,7 +60,6 @@
|
||||
</basic-table>
|
||||
|
||||
<pay-import-dialog ref="importRef" @saved="tableRef.refresh()" />
|
||||
<pay-fee-rule-dialog ref="feeRuleRef" />
|
||||
|
||||
<el-drawer v-model="historyVisible" :title="historyTitle" size="980px" destroy-on-close>
|
||||
<div class="history-bar">
|
||||
@@ -154,12 +150,10 @@
|
||||
import { listPay, getPay, delPay, updatePay, listPayTerm, updatePayTerm, changePayTermStatus, comparePay } from '@/api/price/pay'
|
||||
import PayImportDialog from './components/PayImportDialog.vue'
|
||||
import PayConfigDetail from './components/PayConfigDetail.vue'
|
||||
import PayFeeRuleDialog from './components/PayFeeRuleDialog.vue'
|
||||
|
||||
const { proxy } = getCurrentInstance()
|
||||
const tableRef = ref()
|
||||
const importRef = ref()
|
||||
const feeRuleRef = ref()
|
||||
const detailVisible = ref(false)
|
||||
const detailLoading = ref(false)
|
||||
const editing = ref(false)
|
||||
|
||||
Reference in New Issue
Block a user