feat(bid): 完成甲方报价模块全量功能开发

1.  新增甲方报价业务实体,继承基础实体类
2.  新增供应商报价明细查询接口,支持按供应商ID展开物料明细
3.  重构甲方报价关联逻辑,通过material_id精确关联物料表
4.  新增甲方报价历史统计、月度趋势、快速新建等服务功能
5.  完善菜单配置,修正甲方报价菜单结构,添加完整权限控制
6.  新增物料搜索自动补全功能,优化报价单详情页面
7.  在供应商详情页新增报价历史Tab页签,展示该供应商的所有报价物料明细
8.  在物料详情页新增甲方报价记录Tab页签,展示该物料的所有甲方报价历史
9.  新增数据库优化脚本,添加索引并修复历史数据关联
This commit is contained in:
2026-06-01 19:05:04 +08:00
parent 18a71526dc
commit a75589018f
23 changed files with 1758 additions and 144 deletions

View File

@@ -0,0 +1,58 @@
-- ============================================================================
-- 甲方报价系统优化 - 数据库迁移脚本
-- 日期: 2026-06-01
-- 说明:
-- 1. biz_client_quote_item 表添加 material_id 字段,建立与物料表的正式关联
-- 2. 添加必要的索引优化查询性能
-- 3. 添加统计数据辅助字段
-- 4. 修复历史数据中的 material_id 关联
-- ============================================================================
-- ============================================================================
-- PART 1: 甲方报价明细表 - 添加 material_id 字段
-- ============================================================================
ALTER TABLE biz_client_quote_item
ADD COLUMN material_id BIGINT DEFAULT NULL COMMENT '关联物料IDbiz_material.material_id' AFTER quote_id;
-- 创建索引以加速按物料查询
CREATE INDEX idx_cqi_quote_id ON biz_client_quote_item (quote_id);
CREATE INDEX idx_cqi_material_id ON biz_client_quote_item (material_id);
-- ============================================================================
-- PART 2: 甲方报价主表 - 添加统计优化索引
-- ============================================================================
CREATE INDEX idx_cq_create_time ON biz_client_quote (create_time);
CREATE INDEX idx_cq_client_name ON biz_client_quote (client_name);
CREATE INDEX idx_cq_status ON biz_client_quote (status);
-- ============================================================================
-- PART 3: 修复历史数据 - 通过物料名称匹配回填 material_id
-- ============================================================================
-- 注意: 此操作为一次性数据修复,基于 material_name 精确匹配。
-- 如果存在同名的多个物料只会关联第一个匹配到的物料ID。
-- 请在执行前确认数据准确性。
UPDATE biz_client_quote_item cqi
JOIN biz_material m ON cqi.material_name = m.material_name
SET cqi.material_id = m.material_id
WHERE cqi.material_id IS NULL
AND cqi.material_name IS NOT NULL
AND cqi.material_name != '';
-- ============================================================================
-- PART 4: 验证数据修复结果
-- ============================================================================
-- 检查仍有未关联的记录数(如果 > 0说明有些物料名称在 biz_material 表中不存在)
-- SELECT COUNT(*) AS unlinked_count
-- FROM biz_client_quote_item
-- WHERE material_id IS NULL AND material_name IS NOT NULL AND material_name != '';
-- 查看关联情况统计
-- SELECT
-- CASE WHEN cqi.material_id IS NOT NULL THEN '已关联' ELSE '未关联' END AS status,
-- COUNT(*) AS count
-- FROM biz_client_quote_item cqi
-- GROUP BY CASE WHEN cqi.material_id IS NOT NULL THEN '已关联' ELSE '未关联' END;
-- ============================================================================
-- 完成
-- ============================================================================

View File

@@ -0,0 +1,3 @@
SELECT menu_id, menu_name, parent_id, `path`, component, perms
FROM sys_menu
ORDER BY menu_id;

View File

@@ -0,0 +1,50 @@
-- ============================================================================
-- 添加"甲方报价"菜单到智慧报价模块
-- 说明:
-- 1. 在智慧报价模块下添加"甲方报价"菜单(目录)
-- 2. 添加"甲方报价历史"菜单(菜单)
-- 3. 添加"甲方报价单详情"隐藏路由
-- ============================================================================
-- 1. 添加甲方报价目录菜单parent_id = 2000 智慧报价)
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2060, '甲方报价', 2000, 5, 'clientquote', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'el-icon-document-copy', 'admin', NOW(), 'admin', NOW(), '甲方报价管理模块');
-- 2. 添加甲方报价历史页面菜单
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2061, '甲方报价历史', 2060, 1, 'history', 'bid/clientquote/history/index', NULL, 1, 0, 'C', '0', '0', 'bid:clientquote:history', 'el-icon-document-copy', 'admin', NOW(), 'admin', NOW(), '甲方报价历史记录');
-- 3. 添加甲方报价单详情隐藏路由(路径为 /quotemgr/clientquote/detail
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2062, '甲方报价单详情', 2060, 2, 'detail', 'bid/clientquote/detail', NULL, 1, 0, 'C', '1', '0', 'bid:clientquote:detail', NULL, 'admin', NOW(), 'admin', NOW(), '甲方报价单详情编辑页');
-- 4. 添加甲方报价列表页(给现有的 clientquote/index.vue
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2063, '甲方报价列表', 2060, 3, 'index', 'bid/clientquote/index', NULL, 1, 0, 'C', '0', '0', 'bid:clientquote:list', NULL, 'admin', NOW(), 'admin', NOW(), '甲方报价列表');
-- ============================================================================
-- 添加权限按钮
-- ============================================================================
-- 甲方报价历史:查询
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2064, '查询', 2061, 1, '#', NULL, NULL, 1, 0, 'F', '0', '0', 'bid:clientquote:query', '#', 'admin', NOW(), 'admin', NOW(), '');
-- 甲方报价历史:新增
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2065, '新增', 2061, 2, '#', NULL, NULL, 1, 0, 'F', '0', '0', 'bid:clientquote:add', '#', 'admin', NOW(), 'admin', NOW(), '');
-- 甲方报价历史:修改
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2066, '修改', 2061, 3, '#', NULL, NULL, 1, 0, 'F', '0', '0', 'bid:clientquote:edit', '#', 'admin', NOW(), 'admin', NOW(), '');
-- 甲方报价历史:删除
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
VALUES (2067, '删除', 2061, 4, '#', NULL, NULL, 1, 0, 'F', '0', '0', 'bid:clientquote:remove', '#', 'admin', NOW(), 'admin', NOW(), '');
-- ============================================================================
-- 分配菜单给管理员角色 (role_id = 1)
-- ============================================================================
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, menu_id FROM sys_menu WHERE menu_id BETWEEN 2060 AND 2067
AND NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = sys_menu.menu_id);

View File

@@ -0,0 +1,22 @@
-- ============================================================================
-- 修正甲方报价菜单结构
-- 目标:甲方报价作为一个单页管理页面,类似供应商报价
-- ============================================================================
-- 1. 将 甲方报价历史(2061) 改为指向 index 主页面
UPDATE sys_menu
SET menu_name = '甲方报价',
component = 'bid/clientquote/index',
perms = 'bid:clientquote:list',
path = 'index'
WHERE menu_id = 2061;
-- 2. 删除多余的 甲方报价列表(2063) 和 甲方报价单详情(2062)
DELETE FROM sys_role_menu WHERE menu_id IN (2062, 2063);
DELETE FROM sys_menu WHERE menu_id IN (2062, 2063);
-- 3. 将权限按钮从历史页面移到主菜单下
UPDATE sys_menu SET parent_id = 2061 WHERE menu_id = 2064; -- 查询
UPDATE sys_menu SET parent_id = 2061 WHERE menu_id = 2065; -- 新增
UPDATE sys_menu SET parent_id = 2061 WHERE menu_id = 2066; -- 修改
UPDATE sys_menu SET parent_id = 2061 WHERE menu_id = 2067; -- 删除