feat(bid): 新增甲方履约订单管理模块

1.  新增甲方履约菜单分类,包含待发、在途、签收三个子菜单并配置权限
2.  重构发货单号生成逻辑,支持区分供应商和甲方履约订单前缀
3.  新增甲方发货单生成功能,可从确认的甲方报价单一键创建
4.  新增京东红主题样式并支持快速切换
5.  优化物料发货记录查询,兼容两种履约订单的客户信息关联
6.  修复订单详情弹窗的空值判断和异常捕获逻辑
7.  新增配套SQL脚本用于菜单初始化和数据修复
This commit is contained in:
2026-06-15 11:09:56 +08:00
parent 8393e4940d
commit 24ab178ec1
14 changed files with 470 additions and 34 deletions

View File

@@ -77,21 +77,26 @@
</el-select>
<el-table v-loading="recordLoading" :data="recordList" border stripe size="small" style="width:100%;margin-top:12px">
<el-table-column label="发货单号" prop="doNo" width="160" />
<el-table-column label="供应商" prop="supplierName" width="150" show-overflow-tooltip />
<el-table-column label="甲方客户" prop="clientName" width="150" show-overflow-tooltip />
<el-table-column label="数量" prop="quantity" width="80" align="right" />
<el-table-column label="单价" width="100" align="right">
<template slot-scope="s">¥{{ s.row.unitPrice }}</template>
<el-table-column label="发货单号" width="150">
<template slot-scope="s">{{ s.row.do_no || '-' }}</template>
</el-table-column>
<el-table-column label="小计" width="100" align="right">
<template slot-scope="s">¥{{ s.row.totalPrice }}</template>
<el-table-column label="类型" width="60" align="center">
<template slot-scope="s"><el-tag :type="s.row.type==='client'?'primary':'warning'" size="mini" effect="plain">{{ s.row.type==='client'?'甲方':'供应商' }}</el-tag></template>
</el-table-column>
<el-table-column label="交货期" prop="deliveryDate" width="95" align="center" />
<el-table-column label="结单日期" prop="actualCloseDate" width="95" align="center" />
<el-table-column label="状态" width="85" align="center">
<el-table-column label="供应商" width="140" show-overflow-tooltip>
<template slot-scope="s">{{ s.row.type==='client' ? '——' : (s.row.supplier_name || '-') }}</template>
</el-table-column>
<el-table-column label="甲方客户" width="140" show-overflow-tooltip>
<template slot-scope="s">{{ s.row.client_name || '-' }}</template>
</el-table-column>
<el-table-column label="数量" prop="quantity" width="75" align="right" />
<el-table-column label="单价" width="95" align="right"><template slot-scope="s">¥{{ s.row.unit_price || 0 }}</template></el-table-column>
<el-table-column label="小计" width="95" align="right"><template slot-scope="s">¥{{ s.row.total_price || 0 }}</template></el-table-column>
<el-table-column label="交货期" prop="delivery_date" width="90" align="center" />
<el-table-column label="结单" prop="actual_close_date" width="90" align="center" />
<el-table-column label="状态" width="80" align="center">
<template slot-scope="s">
<el-tag :type="recordStatusType(s.row.deliveryStatus)" size="small" effect="dark">{{ recordStatusLabel(s.row.deliveryStatus) }}</el-tag>
<el-tag :type="recordStatusType(s.row.delivery_status)" size="small" effect="dark">{{ recordStatusLabel(s.row.delivery_status) }}</el-tag>
</template>
</el-table-column>
</el-table>
@@ -339,16 +344,19 @@ export default {
.catch(() => { this.recordLoading = false })
},
recordStatusType(s) { return { pending: "warning", transit: "primary", history: "success" }[s] || "" },
recordStatusLabel(s) { return { pending: "待发", transit: "在途", history: "已收货" }[s] || s || "-" }
recordStatusLabel(s) { return { pending: "待发", transit: "在途", history: "已收货" }[s] || s || "-" },
// 兼容 snake_case 和 camelCase
fmtRow(r) { return r }
}
};
</script>
<style scoped>
/* ═══ 京东主题 — 页面级变量覆盖 ═══ */
.app-container {
background: #fff;
background: var(--bg-page);
padding: 16px 20px;
border-radius: 4px;
border-radius: var(--radius-base);
}
/* 紧凑表格行 */
@@ -356,11 +364,11 @@ export default {
.el-table th { padding: 6px 4px !important; }
/* 圆角按钮 */
.el-button--mini { border-radius: 4px !important; }
.el-button--mini { border-radius: var(--radius-base) !important; }
/* 搜索按钮浅蓝 */
.search-btn { background: #409EFF; color: #fff; border: none; border-radius: 4px; }
.search-btn:hover { background: #66b1ff; }
/* 搜索按钮(适配京东红) */
.search-btn { background: var(--brand-primary); color: #fff; border: none; border-radius: var(--radius-base); }
.search-btn:hover { background: var(--brand-primary-hover); }
/* 搜索表单样式 */
.el-form--inline .el-form-item {