订单管理

This commit is contained in:
dev 2025-03-25 18:04:58 +08:00
parent 19933d2315
commit 086fc44c7e
9 changed files with 749 additions and 215 deletions

View File

@ -20,12 +20,11 @@
"url": "https://gitee.com/" "url": "https://gitee.com/"
}, },
"dependencies": { "dependencies": {
"@ag-grid-community/client-side-row-model": "^32.3.4",
"@element-plus/icons-vue": "2.3.1", "@element-plus/icons-vue": "2.3.1",
"@handsontable/vue3": "^15.2.0",
"@highlightjs/vue-plugin": "2.1.0", "@highlightjs/vue-plugin": "2.1.0",
"@vueup/vue-quill": "1.2.0", "@vueup/vue-quill": "1.2.0",
"@vueuse/core": "11.3.0", "@vueuse/core": "11.3.0",
"ag-grid-vue3": "^32.3.4",
"animate.css": "4.1.1", "animate.css": "4.1.1",
"await-to-js": "3.0.0", "await-to-js": "3.0.0",
"axios": "1.7.8", "axios": "1.7.8",
@ -36,6 +35,7 @@
"element-plus": "2.8.8", "element-plus": "2.8.8",
"file-saver": "2.0.5", "file-saver": "2.0.5",
"fuse.js": "7.0.0", "fuse.js": "7.0.0",
"handsontable": "^15.2.0",
"highlight.js": "11.9.0", "highlight.js": "11.9.0",
"image-conversion": "2.1.1", "image-conversion": "2.1.1",
"js-cookie": "3.0.5", "js-cookie": "3.0.5",

View File

@ -42,6 +42,17 @@ export const getLogisticsQuote = (id: string | number): AxiosPromise<LogisticsQu
}); });
}; };
/**
*
* @param id
*/
export const getTodayQuoteStatus = () => {
return request({
url: '/amz/logisticsQuote/today-quote-status',
method: 'get'
});
};
/** /**
* *
* @param data * @param data

View File

@ -1,51 +1,56 @@
import useUserStore from '@/store/modules/user'; // src/utils/permission.ts
import { useUserStore } from '@/store/modules/user';
/** // 权限校验方法(替代指令的核心逻辑)
* export const checkPermi = (perms: string[]): boolean => {
* @param {Array} value const { permissions } = useUserStore();
* @returns {Boolean}
*/
export const checkPermi = (value: any) => {
if (value && value instanceof Array && value.length > 0) {
const permissions = useUserStore().permissions;
const permissionDatas = value;
const all_permission = '*:*:*';
const hasPermission = permissions.some((permission) => { if (!Array.isArray(perms) || perms.length === 0) {
return all_permission === permission || permissionDatas.includes(permission); throw new Error("权限参数格式错误,示例: checkPermi(['sys:user:edit'])");
});
if (!hasPermission) {
return false;
}
return true;
} else {
console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`);
return false;
} }
return permissions.some((p) => p === '*:*:*' || perms.includes(p));
}; };
/** // 角色校验方法
* export const checkRoles = (roles: string[]): boolean => {
* @param {Array} value const { roles: userRoles } = useUserStore();
* @returns {Boolean}
*/
export const checkRole = (value: any): boolean => {
if (value && value instanceof Array && value.length > 0) {
const roles = useUserStore().roles;
const permissionRoles = value;
const super_admin = 'admin';
const hasRole = roles.some((role) => { if (!Array.isArray(roles) || roles.length === 0) {
return super_admin === role || permissionRoles.includes(role); throw new Error("角色参数格式错误,示例: checkRoles(['admin'])");
});
if (!hasRole) {
return false;
}
return true;
} else {
console.error(`need roles! Like checkRole="['admin','editor']"`);
return false;
} }
return userRoles.some((r) => r === 'superadmin' || r === 'admin' || roles.includes(r));
};
// 操作列权限渲染器
export const actionRenderer: Handsontable.renderers.Base = (instance, td, row, col, prop, value, cellProperties) => {
const rowData = instance.getDataAtRow(row);
const canEdit = checkPermi(['amz:logisticsOrderDetail:edit']);
const canDelete = checkPermi(['amz:logisticsOrderDetail:remove']);
td.innerHTML = `
<div class="htCenter">
${
canEdit
? `
<button class="btn-edit" data-row="${row}">
<i class="el-icon-edit"></i>
</button>
`
: ''
}
${
canDelete
? `
<button class="btn-delete" data-row="${row}">
<i class="el-icon-delete"></i>
</button>
`
: ''
}
</div>
`;
return td;
}; };

View File

@ -109,7 +109,7 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="询价单号" align="center" prop="inquiryNo" /> <el-table-column label="询价单号" align="center" prop="inquiryNo" />
<el-table-column label="发起人id" align="center" prop="requesterId" /> <el-table-column label="发起人id" align="center" prop="requesterId" />
<el-table-column label="目标物流商ID列表" align="center" prop="targetProviders" /> <!-- <el-table-column label="目标物流商ID列表" align="center" prop="targetProviders" />-->
<el-table-column label="目的地" align="center" prop="destination" /> <el-table-column label="目的地" align="center" prop="destination" />
<el-table-column label="运输方式" align="center" prop="transportChannel" /> <el-table-column label="运输方式" align="center" prop="transportChannel" />
<el-table-column label="询价状态" align="center" prop="inquiryStatus" /> <el-table-column label="询价状态" align="center" prop="inquiryStatus" />
@ -320,6 +320,7 @@ const initFormData: InquiryRequestForm = {
effectiveEndTime: undefined effectiveEndTime: undefined
}; };
const initQuoteForm: LogisticsMostQuoteForm = { const initQuoteForm: LogisticsMostQuoteForm = {
id: undefined,
userId: undefined, userId: undefined,
destination: undefined, destination: undefined,
transportChannel: undefined, transportChannel: undefined,
@ -468,6 +469,10 @@ const submitQuoteForm = async () => {
console.log('submitQuoteForm', data.quoteForm); console.log('submitQuoteForm', data.quoteForm);
const res = await addMostLogisticsQuote(data.quoteForm); const res = await addMostLogisticsQuote(data.quoteForm);
console.log('submitQuoteForm', res); console.log('submitQuoteForm', res);
if (res.code === 200) {
ElMessage.success('提交成功');
quoteDialog.visible = false;
}
}; };
const saveQuoteForm = () => { const saveQuoteForm = () => {
@ -492,6 +497,7 @@ const handleDelete = async (row?: InquiryRequestVO) => {
const handleSubmit = async (row?: InquiryRequestVO) => { const handleSubmit = async (row?: InquiryRequestVO) => {
console.log('handleSubmit'); console.log('handleSubmit');
console.log(row.channelId); console.log(row.channelId);
data.quoteForm.id = row.id;
data.quoteForm.destination = row.destination; data.quoteForm.destination = row.destination;
data.quoteForm.transportChannel = row.transportChannel; data.quoteForm.transportChannel = row.transportChannel;
data.quoteForm.channelId = row.channelId; data.quoteForm.channelId = row.channelId;

View File

@ -75,9 +75,21 @@
<el-table-column label="物流商用户ID" align="center" prop="userId" /> <el-table-column label="物流商用户ID" align="center" prop="userId" />
<el-table-column label="渠道名称" align="center" prop="channelName" /> <el-table-column label="渠道名称" align="center" prop="channelName" />
<el-table-column label="渠道描述" align="center" prop="description" /> <el-table-column label="渠道描述" align="center" prop="description" />
<el-table-column label="渠道类型" align="center" prop="channelType" /> <el-table-column label="渠道类型" align="center" prop="channelType">
<el-table-column label="国家" align="center" prop="country" /> <template #default="scope">
<el-table-column label="运输方式" align="center" prop="shippingMethod" /> <dict-tag :options="biz_channel_type" :value="scope.row.channelType" />
</template>
</el-table-column>
<el-table-column label="国家" align="center" prop="country">
<template #default="scope">
<dict-tag :options="biz_country" :value="scope.row.country" />
</template>
</el-table-column>
<el-table-column label="运输方式" align="center" prop="shippingMethod">
<template #default="scope">
<dict-tag :options="biz_shipping_method" :value="scope.row.shippingMethod" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
@ -108,7 +120,7 @@
</el-form-item> </el-form-item>
<el-form-item label="运输方式" prop="shippingMethod"> <el-form-item label="运输方式" prop="shippingMethod">
<el-select v-model="form.shippingMethod" clearable placeholder="运输方式"> <el-select v-model="form.shippingMethod" clearable placeholder="运输方式">
<el-option v-for="dict in biz_channel_type" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in biz_shipping_method" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -138,6 +150,8 @@ const { biz_country } = toRefs<any>(proxy?.useDict('biz_country'));
const { biz_channel_type } = toRefs<any>(proxy?.useDict('biz_channel_type')); const { biz_channel_type } = toRefs<any>(proxy?.useDict('biz_channel_type'));
const { biz_shipping_method } = toRefs<any>(proxy?.useDict('biz_shipping_method'));
const logisticsChannelList = ref<LogisticsChannelVO[]>([]); const logisticsChannelList = ref<LogisticsChannelVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);

View File

@ -74,7 +74,6 @@
<el-table v-loading="loading" :data="logisticsOrderList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="logisticsOrderList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="FBA货件编号" align="center" prop="fbaShipmentId" /> <el-table-column label="FBA货件编号" align="center" prop="fbaShipmentId" />
<el-table-column label="订单编号" align="center" prop="orderId" /> <el-table-column label="订单编号" align="center" prop="orderId" />
<el-table-column label="物流商ID" align="center" prop="logisticsProviderId" /> <el-table-column label="物流商ID" align="center" prop="logisticsProviderId" />
@ -92,23 +91,36 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:logisticsOrder:edit']"></el-button> <el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasRoles="['superadmin']"
v-hasPermi="['amz:logisticsOrder:edit']"
></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:logisticsOrder:remove']"></el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['amz:logisticsOrder:remove']"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="查看订单明细" placement="top">
<el-button type="primary" @click="openDetail(scope.row)" v-hasRoles="['wuliu']"> 编辑订单明细</el-button>
</el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination
v-show="total > 0"
:total="detailTotal"
v-model:page="queryDetailParams.pageNum"
v-model:limit="queryDetailParams.pageSize"
@pagination="getList"
/>
</el-card> </el-card>
<!-- 添加或修改物流订单对话框 --> <!-- 添加或修改物流订单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="logisticsOrderFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="logisticsOrderFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主键" prop="id">
<el-input v-model="form.id" placeholder="请输入主键" />
</el-form-item>
<el-form-item label="FBA货件编号" prop="fbaShipmentId"> <el-form-item label="FBA货件编号" prop="fbaShipmentId">
<el-input v-model="form.fbaShipmentId" placeholder="请输入FBA货件编号" /> <el-input v-model="form.fbaShipmentId" placeholder="请输入FBA货件编号" />
</el-form-item> </el-form-item>
@ -154,30 +166,280 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-drawer size="80%" v-model="hotTableDrawer" :direction="'ttb'">
<template #header>
<h4>订单明细</h4>
</template>
<template #default>
<HotTable class="hot-container" ref="hotTable" :settings="hotSettings" :data="processedData" :key="tableKey"></HotTable>
<pagination
v-show="detailTotal > 0"
:total="detailTotal"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getDetailList"
/>
</template>
<template #footer>
<div style="flex: auto">
<el-button @click="cancelDataClick">cancel</el-button>
<el-button type="primary" @click="submitDataClick">confirm</el-button>
</div>
</template>
</el-drawer>
</div> </div>
</template> </template>
<script setup name="LogisticsOrder" lang="ts"> <script setup name="LogisticsOrder" lang="ts">
import { import { listLogisticsOrder, getLogisticsOrder, delLogisticsOrder, addLogisticsOrder, updateLogisticsOrder } from '@/api/amz/logisticsOrder';
listLogisticsOrder,
getLogisticsOrder,
delLogisticsOrder,
addLogisticsOrder,
updateLogisticsOrder,
createOrder
} from '@/api/amz/logisticsOrder';
import { LogisticsOrderVO, LogisticsOrderQuery, LogisticsOrderForm } from '@/api/amz/logisticsOrder/types'; import { LogisticsOrderVO, LogisticsOrderQuery, LogisticsOrderForm } from '@/api/amz/logisticsOrder/types';
import { registerAllModules } from 'handsontable/registry';
import { computed, ref, watch } from 'vue';
import { HotTable } from '@handsontable/vue3';
import { checkPermi } from '@/utils/permission';
import { LogisticsOrderDetailVO } from '@/api/amz/logisticsOrderDetail/types';
import { listLogisticsOrderDetail } from '@/api/amz/logisticsOrderDetail';
import 'handsontable/dist/handsontable.full.min.css';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
//
registerAllModules();
//
const hotTable = ref<InstanceType<typeof HotTable>>();
const tableKey = ref(0);
const logisticsOrderDetailList = ref<LogisticsOrderDetailVO[]>([]);
const logisticsOrderDetailFormRef = ref<ElFormInstance>();
//
const processedData = computed(() => {
return logisticsOrderDetailList.value.map((item) => ({
...item,
weightDiff: item.logisticsWeight - item.supplierWeight,
estimatedDeliveryDateFormatted: proxy.parseTime(item.estimatedDeliveryDate, '{y}-{m}-{d}'),
actualDeliveryDateFormatted: proxy.parseTime(item.actualDeliveryDate, '{y}-{m}-{d}')
}));
});
const hotTableDrawer = ref(false);
// -------
const hotSettings = ref({
licenseKey: 'non-commercial-and-evaluation',
manualColumnResize: true, // false
rowHeaders: false, //
filters: true, //
// dropdownMenu: true, //
// contextMenu: true, //
height: 'auto', //
manualRowResize: true, //
autoWrapRow: true, //
multiSelect: true, //
stretchH: 'all', //
afterGetColHeader: (col: number, th: HTMLElement) => {
const columnDef = hotSettings.value.columns[col];
const isEditable = !columnDef?.readOnly; //
//
if (isEditable) {
th.style.backgroundColor = '#f0f9eb'; // Element Plus
th.style.borderLeft = '3px solid #67c23a';
th.innerHTML = `
${th.innerText}
`;
}
},
afterChange: (changes) => {
if (!changes) return;
console.log('changes:', changes);
// changes.forEach(([row, prop, oldVal, newVal]) => {
// console.log(':', row);
// console.log(':', prop);
// console.log(':', oldVal);
// console.log(':', newVal);
// });
},
colHeaders: [
'选择',
'订单号',
'FBA货件编号',
'FBA箱号',
'物流商ID',
'物流商名称',
'物流渠道',
'目的地仓库',
'计划数量',
'实际货件数量',
'物流追踪号',
'供应商称重',
'物流商计重',
'称重差异',
'物流单价',
'物流计价重量',
'其他物流费用',
'费用合计',
'物流状态',
'预计签收日期',
'实际签收日期',
'运输时效',
'操作'
],
columns: [
{
//
type: 'checkbox',
className: 'htCenter',
width: 55
},
{ data: 'orderId', className: 'htCenter', readOnly: true },
{ data: 'fbaShipmentId', className: 'htCenter', readOnly: true },
// ...
{ data: 'fbaBoxNumber', className: 'htCenter', readOnly: true }, // FBA
{ data: 'logisticsProviderId', className: 'htCenter', readOnly: true }, // ID
{ data: 'logisticsProviderName', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
{ data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
{ data: 'plannedQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'actualShipmentQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'trackingNumber', className: 'htCenter', readOnly: false }, //
{ data: 'supplierWeight', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsWeight', className: 'htCenter', readOnly: true }, //
{
data: 'weightDiff', //
className: 'htCenter',
renderer: (instance, td) => {
//
const value = instance.getDataAtCell(td.row, td.col);
td.style.color = value > 0 ? '#67C23A' : '#F56C6C';
td.innerText = value;
return td;
}
},
{ data: 'pricePerKg', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsBillingWeight', className: 'htCenter', readOnly: true }, //
{ data: 'otherLogisticsFee', className: 'htCenter', readOnly: true }, //
{ data: 'totalFee', className: 'htCenter', readOnly: true }, //
{
data: 'logisticsStatus',
className: 'htCenter',
readOnly: false,
type: 'dropdown',
source: ['水果', '蔬菜', '肉类']
}, //
{
//
data: 'estimatedDeliveryDateFormatted',
className: 'htCenter',
width: 180
},
{
//
data: 'actualDeliveryDateFormatted',
className: 'htCenter',
width: 180
},
{
//
// renderer: (instance, td, row, col, prop, value, cellProperties) => {
// const canEdit = checkPermi(['amz:logisticsOrderDetail:edit']);
// const canDelete = checkPermi(['amz:logisticsOrderDetail:remove']);
//
// td.innerHTML = `
// <div class="action-buttons">
// ${
// canEdit
// ? `
// <button
// class="edit-btn"
// data-row="${row}"
// :disabled="buttonLoading"
// >
// <i class="icon-edit"></i>
// </button>
// `
// : ''
// }
// ${
// canDelete
// ? `
// <button
// class="delete-btn"
// data-row="${row}"
// :disabled="buttonLoading"
// >
// <i class="icon-delete"></i>
// </button>
// `
// : ''
// }
// </div>
// `;
// td.className = 'htCenter';
// return td;
// },
readOnly: true,
width: 150
}
],
afterOnCellMouseDown: (event, coords) => {
if (buttonLoading.value) return;
if (coords.col === 21) {
const rowData = logisticsOrderDetailList.value[coords.row];
const target = event.target.closest('button');
if (target?.classList.contains('edit-btn')) {
buttonLoading.value = true;
handleUpdate(rowData).finally(() => {
buttonLoading.value = false;
});
} else if (target?.classList.contains('delete-btn')) {
buttonLoading.value = true;
handleDelete(rowData).finally(() => {
buttonLoading.value = false;
});
}
}
},
contextMenu: {
items: {
editRow: {
name: '修改',
disabled: () => !checkPermi(['amz:logisticsOrderDetail:edit']) || buttonLoading.value,
callback: (_, selection) => {
const rowData = logisticsOrderDetailList.value[selection[0].start.row];
buttonLoading.value = true;
handleUpdate(rowData).finally(() => {
buttonLoading.value = false;
});
}
}
}
}
});
//
watch(
logisticsOrderDetailList,
() => {
tableKey.value++;
},
{ deep: true }
);
const logisticsOrderList = ref<LogisticsOrderVO[]>([]); const logisticsOrderList = ref<LogisticsOrderVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
const detailLoading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref<Array<string | number>>([]); const ids = ref<Array<string | number>>([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const detailTotal = ref(0);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const logisticsOrderFormRef = ref<ElFormInstance>(); const logisticsOrderFormRef = ref<ElFormInstance>();
@ -217,6 +479,11 @@ const data = reactive<PageData<LogisticsOrderForm, LogisticsOrderQuery>>({
shelfTimeliness: undefined, shelfTimeliness: undefined,
params: {} params: {}
}, },
queryDetailParams: {
pageNum: 1,
pageSize: 10,
orderId: undefined
},
rules: { rules: {
id: [{ required: true, message: '主键不能为空', trigger: 'blur' }], id: [{ required: true, message: '主键不能为空', trigger: 'blur' }],
fbaShipmentId: [{ required: true, message: 'FBA货件编号不能为空', trigger: 'blur' }], fbaShipmentId: [{ required: true, message: 'FBA货件编号不能为空', trigger: 'blur' }],
@ -232,9 +499,7 @@ const data = reactive<PageData<LogisticsOrderForm, LogisticsOrderQuery>>({
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, queryDetailParams, form, rules } = toRefs(data);
/** 查询物流订单列表 */ /** 查询物流订单列表 */
const getList = async () => { const getList = async () => {
@ -245,6 +510,14 @@ const getList = async () => {
loading.value = false; loading.value = false;
}; };
const getDetailList = async () => {
detailLoading.value = true;
const res = await listLogisticsOrderDetail(queryParams.value);
logisticsOrderDetailList.value = res.rows;
detailTotal.value = res.total;
detailLoading.value = false;
};
/** 取消按钮 */ /** 取消按钮 */
const cancel = () => { const cancel = () => {
reset(); reset();
@ -319,6 +592,19 @@ const handleDelete = async (row?: LogisticsOrderVO) => {
await getList(); await getList();
}; };
/** 查看详情按钮操作 */
const openDetail = async (row?: LogisticsOrderVO) => {
hotTableDrawer.value = true;
const _ids = row?.id || ids.value;
console.log(_ids);
detailLoading.value = true;
queryDetailParams.value.orderId = row.orderId;
const res = await listLogisticsOrderDetail(queryDetailParams.value);
logisticsOrderDetailList.value = res.rows;
detailTotal.value = res.total;
detailLoading.value = false;
};
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = () => { const handleExport = () => {
proxy?.download( proxy?.download(

View File

@ -104,71 +104,82 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:logisticsOrderDetail:export']">导出 </el-button> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['amz:logisticsOrderDetail:export']">导出 </el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="openEdit" v-hasPermi="['amz:logisticsOrderDetail:export']"
>打开编辑模式
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
<!-- <el-table v-loading="loading" :data="logisticsOrderDetailList" @selection-change="handleSelectionChange">--> <el-table v-loading="loading" :data="logisticsOrderDetailList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />--> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="订单号" align="center" prop="orderId" />--> <el-table-column label="订单号" align="center" prop="orderId" />
<!-- <el-table-column label="FBA货件编号" align="center" prop="fbaShipmentId" />--> <el-table-column label="FBA货件编号" align="center" prop="fbaShipmentId" />
<!-- <el-table-column label="FBA箱号" align="center" prop="fbaBoxNumber" />--> <el-table-column label="FBA箱号" align="center" prop="fbaBoxNumber" />
<!-- <el-table-column label="物流商ID" align="center" prop="logisticsProviderId" />--> <el-table-column label="物流商ID" align="center" prop="logisticsProviderId" />
<!-- <el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />--> <el-table-column label="物流商名称" align="center" prop="logisticsProviderName" />
<!-- <el-table-column label="物流渠道" align="center" prop="logisticsChannel" />--> <el-table-column label="物流渠道" align="center" prop="logisticsChannel" />
<!-- <el-table-column label="目的地仓库" align="center" prop="destination" />--> <el-table-column label="目的地仓库" align="center" prop="destination" />
<!-- <el-table-column label="计划数量" align="center" prop="plannedQuantity" />--> <el-table-column label="计划数量" align="center" prop="plannedQuantity" />
<!-- <el-table-column label="实际货件数量" align="center" prop="shipmentQuantity" />--> <el-table-column label="实际货件数量" align="center" prop="shipmentQuantity" />
<!-- <el-table-column label="物流追踪号" align="center" prop="trackingNumber" />--> <el-table-column label="物流追踪号" align="center" prop="trackingNumber" />
<!-- <el-table-column label="供应商称重" align="center" prop="supplierWeight" />--> <el-table-column label="供应商称重" align="center" prop="supplierWeight" />
<!-- <el-table-column label="物流商计重" align="center" prop="logisticsWeight" />--> <el-table-column label="物流商计重" align="center" prop="logisticsWeight" />
<!-- <el-table-column label="称重差异" align="center" prop="weightDiff" />--> <el-table-column label="称重差异" align="center" prop="weightDiff" />
<!-- <el-table-column label="物流单价" align="center" prop="pricePerKg" />--> <el-table-column label="物流单价" align="center" prop="pricePerKg" />
<!-- <el-table-column label="物流计价重量" align="center" prop="logisticsCalculationPrice" />--> <el-table-column label="物流计价重量" align="center" prop="logisticsCalculationPrice" />
<!-- <el-table-column label="其他物流费用" align="center" prop="otherFee" />--> <el-table-column label="其他物流费用" align="center" prop="otherFee" />
<!-- <el-table-column label="费用合计" align="center" prop="totalFee" />--> <el-table-column label="费用合计" align="center" prop="totalFee" />
<!-- <el-table-column label="物流状态" align="center" prop="logisticsStatus" />--> <el-table-column label="物流状态" align="center" prop="logisticsStatus" />
<!-- <el-table-column label="预计签收日期" align="center" prop="estimatedDeliveryDate" width="180">--> <el-table-column label="预计签收日期" align="center" prop="estimatedDeliveryDate" width="180">
<!-- <template #default="scope">--> <template #default="scope">
<!-- <span>{{ parseTime(scope.row.estimatedDeliveryDate, '{y}-{m}-{d}') }}</span>--> <span>{{ parseTime(scope.row.estimatedDeliveryDate, '{y}-{m}-{d}') }}</span>
<!-- </template>--> </template>
<!-- </el-table-column>--> </el-table-column>
<!-- <el-table-column label="实际签收日期" align="center" prop="actualDeliveryDate" width="180">--> <el-table-column label="实际签收日期" align="center" prop="actualDeliveryDate" width="180">
<!-- <template #default="scope">--> <template #default="scope">
<!-- <span>{{ parseTime(scope.row.actualDeliveryDate, '{y}-{m}-{d}') }}</span>--> <span>{{ parseTime(scope.row.actualDeliveryDate, '{y}-{m}-{d}') }}</span>
<!-- </template>--> </template>
<!-- </el-table-column>--> </el-table-column>
<!-- <el-table-column label="运输时效" align="center" prop="timeliness" />--> <el-table-column label="运输时效" align="center" prop="timeliness" />
<!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">--> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<!-- <template #default="scope">--> <template #default="scope">
<!-- <el-tooltip content="修改" placement="top">--> <el-tooltip content="修改" placement="top">
<!-- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:logisticsOrderDetail:edit']"></el-button>--> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['amz:logisticsOrderDetail:edit']"></el-button>
<!-- </el-tooltip>--> </el-tooltip>
<!-- <el-tooltip content="删除" placement="top">--> <el-tooltip content="删除" placement="top">
<!-- <el-button--> <el-button
<!-- link--> link
<!-- type="primary"--> type="primary"
<!-- icon="Delete"--> icon="Delete"
<!-- @click="handleDelete(scope.row)"--> @click="handleDelete(scope.row)"
<!-- v-hasPermi="['amz:logisticsOrderDetail:remove']"--> v-hasPermi="['amz:logisticsOrderDetail:remove']"
<!-- ></el-button>--> ></el-button>
<!-- </el-tooltip>--> </el-tooltip>
<!-- </template>--> </template>
<!-- </el-table-column>--> </el-table-column>
<!-- </el-table>--> </el-table>
<ag-grid-vue
class="ag-theme-alpine"
style="height: 700px"
:columnDefs="columnDefs"
:rowData="logisticsOrderDetailList"
:rowSelection="'multiple'"
@selection-changed="handleSelectionChange"
:overlayLoadingTemplate="loadingTemplate"
/>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<el-drawer size="70%" v-model="hotTableDrawer" :direction="'ttb'">
<template #header>
<h4>set title by slot</h4>
</template>
<template #default>
<HotTable class="hot-container" ref="hotTable" :settings="hotSettings" :data="processedData" :key="tableKey"></HotTable>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</template>
<template #footer>
<div style="flex: auto">
<el-button @click="cancelDataClick">cancel</el-button>
<el-button type="primary" @click="submitDataClick">confirm</el-button>
</div>
</template>
</el-drawer>
<!-- 添加或修改物流订单明细按箱子维度存储对话框 --> <!-- 添加或修改物流订单明细按箱子维度存储对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="logisticsOrderDetailFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="logisticsOrderDetailFormRef" :model="form" :rules="rules" label-width="80px">
@ -266,92 +277,14 @@ import {
updateLogisticsOrderDetail updateLogisticsOrderDetail
} from '@/api/amz/logisticsOrderDetail'; } from '@/api/amz/logisticsOrderDetail';
import { LogisticsOrderDetailVO, LogisticsOrderDetailQuery, LogisticsOrderDetailForm } from '@/api/amz/logisticsOrderDetail/types'; import { LogisticsOrderDetailVO, LogisticsOrderDetailQuery, LogisticsOrderDetailForm } from '@/api/amz/logisticsOrderDetail/types';
import { checkPermi } from '@/utils/permission';
import { AgGridVue } from 'ag-grid-vue3'; import { ref, computed, watch, onMounted, onUnmounted } from 'vue';
import 'ag-grid-community/styles/ag-grid.css'; import { HotTable } from '@handsontable/vue3';
import 'ag-grid-community/styles/ag-theme-alpine.css'; import { registerAllModules } from 'handsontable/registry';
import 'handsontable/dist/handsontable.full.min.css';
import { ClientSideRowModelModule } from '@ag-grid-community/client-side-row-model';
import { ModuleRegistry } from '@ag-grid-community/core';
//
ModuleRegistry.registerModules([ClientSideRowModelModule]);
// 使
// import { RowGroupingModule } from '@ag-grid-enterprise/row-grouping';
// import { ClipboardModule } from '@ag-grid-enterprise/clipboard';
// ModuleRegistry.registerModules([RowGroupingModule, ClipboardModule]);
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { checkPermi } from '@/utils/permission';
const parseTimeGlobal = (value, format) => {
return proxy.$parseTime(value, format);
};
const loadingTemplate = '<span class="ag-overlay-loading-center">加载中...</span>';
const columnDefs = ref([
{
headerName: '',
field: 'selected',
checkboxSelection: true,
headerCheckboxSelection: true,
width: 55,
cellStyle: { 'text-align': 'center' }
},
{ headerName: '订单号', field: 'orderId', cellStyle: { 'text-align': 'center' } },
{ headerName: 'FBA货件编号', field: 'fbaShipmentId', cellStyle: { 'text-align': 'center' } },
{ headerName: 'FBA箱号', field: 'fbaBoxNumber', cellStyle: { 'text-align': 'center' } },
// ...
{
headerName: '预计签收日期',
field: 'estimatedDeliveryDate',
width: 180,
valueFormatter: (params) => (params.value ? parseTimeGlobal(params.value, '{y}-{m}-{d}') : ''),
cellStyle: { 'text-align': 'center' }
},
// ...
{
headerName: '操作',
cellStyle: { 'text-align': 'center' },
cellRenderer: (params) => {
//
const canEdit = checkPermi(['amz:logisticsOrderDetail:edit']);
const canDelete = checkPermi(['amz:logisticsOrderDetail:remove']);
// HTML
let buttons = '';
if (canEdit) {
buttons += `
<el-tooltip content="修改">
<el-button
link
type="primary"
icon="Edit"
@click="ctx.handleUpdate(${JSON.stringify(params.data)})"
></el-button>
</el-tooltip>
`;
}
if (canDelete) {
buttons += `
<el-tooltip content="删除">
<el-button
link
type="primary"
icon="Delete"
@click="ctx.handleDelete(${JSON.stringify(params.data)})"
></el-button>
</el-tooltip>
`;
}
return `<div class="cell-action">${buttons}</div>`;
}
}
]);
const logisticsOrderDetailList = ref<LogisticsOrderDetailVO[]>([]); const logisticsOrderDetailList = ref<LogisticsOrderDetailVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -359,11 +292,249 @@ const showSearch = ref(true);
const ids = ref<Array<string | number>>([]); const ids = ref<Array<string | number>>([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const hotTableDrawer = ref(false);
const total = ref(0); const total = ref(0);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const logisticsOrderDetailFormRef = ref<ElFormInstance>(); const logisticsOrderDetailFormRef = ref<ElFormInstance>();
//
registerAllModules();
//
const hotTable = ref<InstanceType<typeof HotTable>>();
const tableKey = ref(0);
//
const processedData = computed(() => {
return logisticsOrderDetailList.value.map((item) => ({
...item,
weightDiff: item.logisticsWeight - item.supplierWeight,
estimatedDeliveryDateFormatted: proxy.parseTime(item.estimatedDeliveryDate, '{y}-{m}-{d}'),
actualDeliveryDateFormatted: proxy.parseTime(item.actualDeliveryDate, '{y}-{m}-{d}')
}));
});
// -------
const hotSettings = ref({
licenseKey: 'non-commercial-and-evaluation',
manualColumnResize: true, // false
rowHeaders: false, //
filters: true, //
// dropdownMenu: true, //
// contextMenu: true, //
height: 'auto', //
manualRowResize: true, //
autoWrapRow: true, //
multiSelect: true, //
stretchH: 'all', //
afterGetColHeader: (col: number, th: HTMLElement) => {
const columnDef = hotSettings.value.columns[col];
const isEditable = !columnDef?.readOnly; //
//
if (isEditable) {
th.style.backgroundColor = '#f0f9eb'; // Element Plus
th.style.borderLeft = '3px solid #67c23a';
th.innerHTML = `
${th.innerText}
`;
}
},
afterChange: (changes) => {
if (!changes) return;
console.log('changes:', changes);
// changes.forEach(([row, prop, oldVal, newVal]) => {
// console.log(':', row);
// console.log(':', prop);
// console.log(':', oldVal);
// console.log(':', newVal);
// });
},
colHeaders: [
'选择',
'订单号',
'FBA货件编号',
'FBA箱号',
'物流商ID',
'物流商名称',
'物流渠道',
'目的地仓库',
'计划数量',
'实际货件数量',
'物流追踪号',
'供应商称重',
'物流商计重',
'称重差异',
'物流单价',
'物流计价重量',
'其他物流费用',
'费用合计',
'物流状态',
'预计签收日期',
'实际签收日期',
'运输时效',
'操作'
],
columns: [
{
//
type: 'checkbox',
className: 'htCenter',
width: 55
},
{ data: 'orderId', className: 'htCenter', readOnly: true },
{ data: 'fbaShipmentId', className: 'htCenter', readOnly: true },
// ...
{ data: 'fbaBoxNumber', className: 'htCenter', readOnly: true }, // FBA
{ data: 'logisticsProviderId', className: 'htCenter', readOnly: true }, // ID
{ data: 'logisticsProviderName', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsChannel', className: 'htCenter', readOnly: true }, //
{ data: 'destinationWarehouse', className: 'htCenter', readOnly: true }, //
{ data: 'plannedQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'actualShipmentQuantity', className: 'htCenter', readOnly: true }, //
{ data: 'trackingNumber', className: 'htCenter', readOnly: false }, //
{ data: 'supplierWeight', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsWeight', className: 'htCenter', readOnly: true }, //
{
data: 'weightDiff', //
className: 'htCenter',
renderer: (instance, td) => {
//
const value = instance.getDataAtCell(td.row, td.col);
td.style.color = value > 0 ? '#67C23A' : '#F56C6C';
td.innerText = value;
return td;
}
},
{ data: 'pricePerKg', className: 'htCenter', readOnly: true }, //
{ data: 'logisticsBillingWeight', className: 'htCenter', readOnly: true }, //
{ data: 'otherLogisticsFee', className: 'htCenter', readOnly: true }, //
{ data: 'totalFee', className: 'htCenter', readOnly: true }, //
{
data: 'logisticsStatus',
className: 'htCenter',
readOnly: false,
type: 'dropdown',
source: ['水果', '蔬菜', '肉类']
}, //
{
//
data: 'estimatedDeliveryDateFormatted',
className: 'htCenter',
width: 180
},
{
//
data: 'actualDeliveryDateFormatted',
className: 'htCenter',
width: 180
},
{
//
// renderer: (instance, td, row, col, prop, value, cellProperties) => {
// const canEdit = checkPermi(['amz:logisticsOrderDetail:edit']);
// const canDelete = checkPermi(['amz:logisticsOrderDetail:remove']);
//
// td.innerHTML = `
// <div class="action-buttons">
// ${
// canEdit
// ? `
// <button
// class="edit-btn"
// data-row="${row}"
// :disabled="buttonLoading"
// >
// <i class="icon-edit"></i>
// </button>
// `
// : ''
// }
// ${
// canDelete
// ? `
// <button
// class="delete-btn"
// data-row="${row}"
// :disabled="buttonLoading"
// >
// <i class="icon-delete"></i>
// </button>
// `
// : ''
// }
// </div>
// `;
// td.className = 'htCenter';
// return td;
// },
readOnly: true,
width: 150
}
],
afterOnCellMouseDown: (event, coords) => {
if (buttonLoading.value) return;
if (coords.col === 21) {
const rowData = logisticsOrderDetailList.value[coords.row];
const target = event.target.closest('button');
if (target?.classList.contains('edit-btn')) {
buttonLoading.value = true;
handleUpdate(rowData).finally(() => {
buttonLoading.value = false;
});
} else if (target?.classList.contains('delete-btn')) {
buttonLoading.value = true;
handleDelete(rowData).finally(() => {
buttonLoading.value = false;
});
}
}
},
contextMenu: {
items: {
editRow: {
name: '修改',
disabled: () => !checkPermi(['amz:logisticsOrderDetail:edit']) || buttonLoading.value,
callback: (_, selection) => {
const rowData = logisticsOrderDetailList.value[selection[0].start.row];
buttonLoading.value = true;
handleUpdate(rowData).finally(() => {
buttonLoading.value = false;
});
}
}
}
}
});
//
watch(
logisticsOrderDetailList,
() => {
tableKey.value++;
},
{ deep: true }
);
//-----
const submitDataClick = () => {
//
console.log('提交数据');
};
const cancelDataClick = () => {
//
console.log('取消数据');
};
const openEdit = () => {
hotTableDrawer.value = true;
};
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: ''
@ -544,6 +715,16 @@ const handleExport = () => {
}; };
onMounted(() => { onMounted(() => {
console.log('组件已挂载hotInstance:', hotTable.value?.hotInstance);
getList(); getList();
}); });
</script> </script>
<style scoped>
.hot-container {
height: 70vh; /* 可视区域高度的70% */
min-height: 400px; /* 最小高度保证 */
max-height: 1000px; /* 防止数据过多时过高 */
overflow: auto; /* 容器内滚动 */
}
</style>

View File

@ -32,7 +32,7 @@
<el-input v-model="queryParams.unit" placeholder="请输入单位" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.unit" placeholder="请输入单位" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="checkStatus">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -89,7 +89,6 @@
<el-table v-loading="loading" :data="logisticsQuoteList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="logisticsQuoteList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="物流商用户ID" align="center" prop="userId" /> <el-table-column label="物流商用户ID" align="center" prop="userId" />
<el-table-column label="目的地" align="center" prop="destination" /> <el-table-column label="目的地" align="center" prop="destination" />
<el-table-column label="渠道名称" align="center" prop="channelName" /> <el-table-column label="渠道名称" align="center" prop="channelName" />
@ -101,19 +100,36 @@
<span>{{ parseTime(scope.row.quoteDate, '{y}-{m}-{d}') }}</span> <span>{{ parseTime(scope.row.quoteDate, '{y}-{m}-{d}') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="提交状态" align="center" prop="isSubmitted" /> <el-table-column label="提交状态" align="center" prop="isSubmitted">
<template #default="scope">
<dict-tag :options="sys_yes_no" :value="scope.row.isSubmitted" />
</template>
</el-table-column>
<el-table-column label="报价备注" align="center" prop="remark" /> <el-table-column label="报价备注" align="center" prop="remark" />
<el-table-column label="渠道类型" align="center" prop="channelType" /> <el-table-column label="渠道类型" align="center" prop="channelType" />
<el-table-column label="渠道ID" align="center" prop="channelId" />
<el-table-column label="是否双清包税" align="center" prop="isDdp" /> <el-table-column label="是否双清包税" align="center" prop="isDdp" />
<el-table-column label="单位" align="center" prop="unit" /> <el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasRoles="['wuliu']" v-hasPermi="['amz:logisticsQuote:edit']"></el-button> <el-button
link
type="primary"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasRoles="['wuliu']"
v-hasPermi="['amz:logisticsQuote:edit']"
></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasRoles="['superadmin']" v-hasPermi="['amz:logisticsQuote:remove']"></el-button> <el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasRoles="['superadmin']"
v-hasPermi="['amz:logisticsQuote:remove']"
></el-button>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@ -170,11 +186,20 @@
</template> </template>
<script setup name="LogisticsQuote" lang="ts"> <script setup name="LogisticsQuote" lang="ts">
import { listLogisticsQuote, getLogisticsQuote, delLogisticsQuote, addLogisticsQuote, updateLogisticsQuote } from '@/api/amz/logisticsQuote'; import {
listLogisticsQuote,
getLogisticsQuote,
delLogisticsQuote,
addLogisticsQuote,
updateLogisticsQuote,
getTodayQuoteStatus
} from '@/api/amz/logisticsQuote';
import { LogisticsQuoteVO, LogisticsQuoteQuery, LogisticsQuoteForm } from '@/api/amz/logisticsQuote/types'; import { LogisticsQuoteVO, LogisticsQuoteQuery, LogisticsQuoteForm } from '@/api/amz/logisticsQuote/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
const logisticsQuoteList = ref<LogisticsQuoteVO[]>([]); const logisticsQuoteList = ref<LogisticsQuoteVO[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
@ -256,6 +281,11 @@ const getList = async () => {
loading.value = false; loading.value = false;
}; };
const checkStatus = async () => {
const res2 = await getTodayQuoteStatus();
console.log(res2);
};
/** 取消按钮 */ /** 取消按钮 */
const cancel = () => { const cancel = () => {
reset(); reset();

View File

@ -725,6 +725,7 @@ const checkPrice = async () => {
console.log('查询询价单', requestQuote); console.log('查询询价单', requestQuote);
if (requestQuote.total == 0) { if (requestQuote.total == 0) {
console.log('询价单也没数据'); console.log('询价单也没数据');
channelDialogVisible.value = false;
ElMessageBox.confirm('未查询到价格信息,是否要向物流商发布询价?', 'Warning', { ElMessageBox.confirm('未查询到价格信息,是否要向物流商发布询价?', 'Warning', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',