Compare commits
2 Commits
345f39386d
...
9e5819355d
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e5819355d | |||
| 078474631f |
@@ -25,7 +25,7 @@ BEGIN
|
||||
(
|
||||
SELECT
|
||||
src.[账号代码],
|
||||
COALESCE(prodParent.[id], src.[pid]) AS [pid],
|
||||
qualityParent.[id] AS [pid],
|
||||
src.[icon],
|
||||
src.[AddData],
|
||||
src.[DeleteData],
|
||||
@@ -37,13 +37,15 @@ BEGIN
|
||||
SELECT TOP (1) rp.[id]
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS rp
|
||||
WHERE rp.[账号代码] = src.[账号代码]
|
||||
AND rp.[pid] = 0
|
||||
AND rp.[是否启用] = 1
|
||||
AND rp.[title] = N'生产管理'
|
||||
AND (rp.[title] = N'质量管理' OR rp.[path] = '/QualityManagement' OR rp.[name] = 'QualityManagement')
|
||||
ORDER BY rp.[id]
|
||||
) AS prodParent
|
||||
) AS qualityParent
|
||||
WHERE src.[是否启用] = 1
|
||||
AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
|
||||
AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'生产计划跟踪')
|
||||
AND qualityParent.[id] IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
@@ -77,7 +79,7 @@ BEGIN
|
||||
SELECT
|
||||
ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn,
|
||||
src.[账号代码],
|
||||
COALESCE(prodParent.[id], src.[pid]) AS [pid],
|
||||
qualityParent.[id] AS [pid],
|
||||
src.[icon],
|
||||
src.[AddData],
|
||||
src.[DeleteData],
|
||||
@@ -89,13 +91,15 @@ BEGIN
|
||||
SELECT TOP (1) rp.[id]
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS rp
|
||||
WHERE rp.[账号代码] = src.[账号代码]
|
||||
AND rp.[pid] = 0
|
||||
AND rp.[是否启用] = 1
|
||||
AND rp.[title] = N'生产管理'
|
||||
AND (rp.[title] = N'质量管理' OR rp.[path] = '/QualityManagement' OR rp.[name] = 'QualityManagement')
|
||||
ORDER BY rp.[id]
|
||||
) AS prodParent
|
||||
) AS qualityParent
|
||||
WHERE src.[是否启用] = 1
|
||||
AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
|
||||
AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'生产计划跟踪')
|
||||
AND qualityParent.[id] IS NOT NULL
|
||||
AND NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
@@ -132,6 +136,24 @@ END;
|
||||
|
||||
UPDATE [dbo].[登录基础数据_二级菜单]
|
||||
SET
|
||||
[pid] = COALESCE
|
||||
(
|
||||
(
|
||||
SELECT TOP (1) qualityParent.[id]
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS qualityParent
|
||||
WHERE qualityParent.[账号代码] = [dbo].[登录基础数据_二级菜单].[账号代码]
|
||||
AND qualityParent.[pid] = 0
|
||||
AND qualityParent.[是否启用] = 1
|
||||
AND
|
||||
(
|
||||
qualityParent.[title] = N'质量管理'
|
||||
OR qualityParent.[path] = '/QualityManagement'
|
||||
OR qualityParent.[name] = 'QualityManagement'
|
||||
)
|
||||
ORDER BY qualityParent.[id]
|
||||
),
|
||||
[pid]
|
||||
),
|
||||
[path] = @Path,
|
||||
[componet] = @Component,
|
||||
[name] = @Name,
|
||||
@@ -144,4 +166,3 @@ SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码],
|
||||
FROM [dbo].[登录基础数据_二级菜单]
|
||||
WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title
|
||||
ORDER BY [账号代码], [id];
|
||||
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
USE [YL_MESDB];
|
||||
GO
|
||||
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE @QualityMenuId int = 4;
|
||||
|
||||
DECLARE @TargetAccounts TABLE
|
||||
(
|
||||
[账号代码] int PRIMARY KEY
|
||||
);
|
||||
|
||||
INSERT INTO @TargetAccounts ([账号代码])
|
||||
SELECT DISTINCT [账号代码]
|
||||
FROM [dbo].[登录基础数据_二级菜单]
|
||||
WHERE [path] = 'ProductPassRateWorkstation/index'
|
||||
OR [componet] = '/ProductionManagement/ProductPassRateWorkstation/index'
|
||||
OR [name] = 'ProductPassRateWorkstation'
|
||||
OR [title] IN (N'产品合格率工位', N'产品合格率(工位)');
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM @TargetAccounts)
|
||||
BEGIN
|
||||
THROW 50001, N'未找到产品合格率工位菜单,未执行迁移。', 1;
|
||||
END;
|
||||
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
IF EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM @TargetAccounts AS target
|
||||
INNER JOIN [dbo].[登录基础数据_二级菜单] AS menu WITH (UPDLOCK, HOLDLOCK)
|
||||
ON menu.[账号代码] = target.[账号代码]
|
||||
AND menu.[id] = @QualityMenuId
|
||||
WHERE menu.[pid] <> 0
|
||||
OR menu.[path] <> '/QualityManagement'
|
||||
OR menu.[name] <> 'QualityManagement'
|
||||
OR menu.[title] <> N'质量管理'
|
||||
)
|
||||
BEGIN
|
||||
THROW 50002, N'目标账号的菜单 ID 4 已被其他菜单占用,未执行迁移。', 1;
|
||||
END;
|
||||
|
||||
INSERT INTO [dbo].[登录基础数据_二级菜单]
|
||||
([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [模块代码], [操作时间], [是否启用])
|
||||
SELECT
|
||||
@QualityMenuId,
|
||||
0,
|
||||
'/QualityManagement',
|
||||
'/layout/Layout',
|
||||
NULL,
|
||||
'QualityManagement',
|
||||
N'质量管理',
|
||||
'KKIMaintenance',
|
||||
target.[账号代码],
|
||||
@QualityMenuId,
|
||||
GETDATE(),
|
||||
1
|
||||
FROM @TargetAccounts AS target
|
||||
WHERE NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS existing WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE existing.[账号代码] = target.[账号代码]
|
||||
AND existing.[id] = @QualityMenuId
|
||||
);
|
||||
|
||||
UPDATE qualityMenu
|
||||
SET
|
||||
qualityMenu.[pid] = 0,
|
||||
qualityMenu.[path] = '/QualityManagement',
|
||||
qualityMenu.[componet] = '/layout/Layout',
|
||||
qualityMenu.[redirect] = NULL,
|
||||
qualityMenu.[name] = 'QualityManagement',
|
||||
qualityMenu.[title] = N'质量管理',
|
||||
qualityMenu.[icon] = 'KKIMaintenance',
|
||||
qualityMenu.[模块代码] = @QualityMenuId,
|
||||
qualityMenu.[是否启用] = 1,
|
||||
qualityMenu.[操作时间] = GETDATE()
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS qualityMenu
|
||||
INNER JOIN @TargetAccounts AS target
|
||||
ON target.[账号代码] = qualityMenu.[账号代码]
|
||||
WHERE qualityMenu.[id] = @QualityMenuId;
|
||||
|
||||
UPDATE targetMenu
|
||||
SET
|
||||
targetMenu.[pid] = @QualityMenuId,
|
||||
targetMenu.[path] = 'ProductPassRateWorkstation/index',
|
||||
targetMenu.[componet] = '/ProductionManagement/ProductPassRateWorkstation/index',
|
||||
targetMenu.[redirect] = NULL,
|
||||
targetMenu.[name] = 'ProductPassRateWorkstation',
|
||||
targetMenu.[title] = N'产品合格率(工位)',
|
||||
targetMenu.[模块代码] = targetMenu.[id],
|
||||
targetMenu.[是否启用] = 1,
|
||||
targetMenu.[操作时间] = GETDATE()
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS targetMenu
|
||||
INNER JOIN @TargetAccounts AS target
|
||||
ON target.[账号代码] = targetMenu.[账号代码]
|
||||
WHERE targetMenu.[path] = 'ProductPassRateWorkstation/index'
|
||||
OR targetMenu.[componet] = '/ProductionManagement/ProductPassRateWorkstation/index'
|
||||
OR targetMenu.[name] = 'ProductPassRateWorkstation'
|
||||
OR targetMenu.[title] IN (N'产品合格率工位', N'产品合格率(工位)');
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
|
||||
SELECT
|
||||
menu.[id],
|
||||
menu.[pid],
|
||||
menu.[path],
|
||||
menu.[componet],
|
||||
menu.[name],
|
||||
menu.[title],
|
||||
menu.[账号代码],
|
||||
menu.[模块代码],
|
||||
menu.[是否启用]
|
||||
FROM [dbo].[登录基础数据_二级菜单] AS menu
|
||||
INNER JOIN @TargetAccounts AS target
|
||||
ON target.[账号代码] = menu.[账号代码]
|
||||
WHERE menu.[id] = @QualityMenuId
|
||||
OR menu.[path] = 'ProductPassRateWorkstation/index'
|
||||
OR menu.[componet] = '/ProductionManagement/ProductPassRateWorkstation/index'
|
||||
ORDER BY menu.[账号代码], menu.[pid], menu.[id];
|
||||
GO
|
||||
@@ -3034,3 +3034,155 @@ pm run build:通过,仅有既有警告。
|
||||
7. 执行 `git diff --cached --check`,未发现空白错误。
|
||||
8. 创建提交:
|
||||
- 提交号:`e89cef4`
|
||||
- 提交信息:`feat: 完善设计报工研发管理流程`
|
||||
9. 执行 `git push`,将提交推送到远端 `origin/snapshot/local-save-20260625-154806`。
|
||||
10. 为满足项目日志要求,追加本条中文执行记录,并继续将该日志补充同步到远端。
|
||||
|
||||
### 结论
|
||||
- 设计报工相关功能和数据库脚本改动已提交并推送到远端。
|
||||
- 功能提交号为 `e89cef4`。
|
||||
- 本条日志补充将继续提交并推送到同一远端分支。
|
||||
|
||||
## 2026-07-11 设计工时报表增加数据导出功能
|
||||
|
||||
### 用户提问
|
||||
- 用户要求修改 `ResearchManagement/DesignReportTask/HoursReport/index` 页面,增加数据导出功能。
|
||||
|
||||
### 执行过程
|
||||
1. 读取仓库根目录 `AGENTS.md`,确认每次执行结束后必须将提问、结论和完整执行过程以中文追加到 `gptlog-process/gpdlog.md`。
|
||||
2. 搜索菜单、工作文档和前端源码,确认菜单虽然位于 `ResearchManagement`,但真实组件路径仍为 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`。
|
||||
3. 检查目标页面现有实现,确认:
|
||||
- 页面通过 `设计报工_工时报表_作业者工时_查询` 一次查询全部结果,没有分页。
|
||||
- 查询结果在前端组装为“操作人、日期、任务”三级树形结构。
|
||||
- 页面已有开始日期、结束日期、操作人、项目号、物料编码、类别和任务 ID 筛选条件。
|
||||
4. 搜索项目内已有 Excel 导出实现,确认项目已安装并普遍使用 `xlsx`,导出按钮采用 Element UI 的 `el-icon-download` 和成功、失败、无数据消息提示。
|
||||
5. 确定采用前端导出当前查询结果的方案,不新增后端接口,也不重复请求数据库;导出顺序保持页面树形显示顺序。
|
||||
6. 修改 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`:
|
||||
- 在查询按钮旁增加“导出”按钮。
|
||||
- 查询加载中或当前无数据时禁用导出按钮。
|
||||
- 增加独立的 `exporting` 状态,导出过程中显示加载状态。
|
||||
- 引入 `xlsx`。
|
||||
- 新增树形数据递归扁平化方法,按操作人、日期、任务的顺序生成 Excel 数据。
|
||||
- 导出操作人汇总、日期汇总和任务明细,并增加“层级”列便于识别数据类型。
|
||||
- 导出页面现有字段:操作人/日期/任务、工作日期、RID、DID、项目号、物料编码、物料名称、图号、类别、报工次数、工时、开始时间、结束时间、校验状态、进度说明和备注。
|
||||
- 为各列设置适合中文内容的列宽。
|
||||
- 导出文件名使用 `设计工时报表_yyyyMMdd_HHmmss.xlsx` 格式。
|
||||
- 增加无数据、导出成功和导出失败提示及异常日志。
|
||||
7. 执行 `npx eslint src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`,单文件 ESLint 检查通过;仅出现项目依赖的 Browserslist 和 Baseline 数据过期提示。
|
||||
8. 首次执行生产构建时调用超时并被终止,没有形成有效验证结果。
|
||||
9. 使用充足超时时间重新执行 `npm run build`,Webpack 生产构建成功;仅有项目原有的大资源体积警告和浏览器兼容数据库过期提示。
|
||||
10. 检查 Git 工作区和差异:构建未留下 `dist` 版本控制变更,`git diff --check` 未发现空白错误。
|
||||
11. 启动本地开发服务器进行预览验证。首次开发编译耗时较长,在 HTTP 轮询截止后随即完成,日志显示 `webpack compiled successfully`。
|
||||
12. 确认开发服务器使用 HTTPS,使用忽略本地证书校验的请求访问 `https://localhost:1997/`,返回 HTTP `200`。随后将开发服务器重启为日志输出到系统临时目录,清理工作区临时日志,并保持预览服务运行。
|
||||
|
||||
### 修改文件
|
||||
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
|
||||
- `gptlog-process/gpdlog.md`
|
||||
|
||||
### 结论
|
||||
- 设计工时报表页面已增加 Excel 数据导出功能。
|
||||
- 导出内容使用当前筛选后的完整树形报表数据,并保留操作人汇总、日期汇总和任务明细层级。
|
||||
- 不需要新增或修改后端接口。
|
||||
|
||||
### 验证结果
|
||||
- 单文件 ESLint 检查通过。
|
||||
- `npm run build` 生产构建通过。
|
||||
- `git diff --check` 通过。
|
||||
- 本地开发服务器编译成功,`https://localhost:1997/` 返回 HTTP `200`。
|
||||
|
||||
## 2026-07-11 产品合格率工位菜单迁移到质量管理
|
||||
|
||||
### 用户提问
|
||||
- 用户要求将 `ProductionManagement/ProductPassRateWorkstation/index` 页面放到“质量管理”菜单下,并提供了目标数据库 `192.168.2.92` 的授权凭据。
|
||||
- 按安全要求,本日志不记录数据库明文密码。
|
||||
|
||||
### 执行过程
|
||||
1. 搜索前端页面、菜单脚本和项目工作文档,确认:
|
||||
- 页面组件为 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`。
|
||||
- 菜单路由为 `ProductPassRateWorkstation/index`。
|
||||
- 组件配置为 `/ProductionManagement/ProductPassRateWorkstation/index`。
|
||||
- 原菜单脚本 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql` 按生产管理中的“生产计划跟踪”菜单复制权限和父级。
|
||||
2. 检查本机数据库工具,确认可使用 `sqlcmd` 连接 SQL Server。
|
||||
3. 使用用户提供的凭据只读查询 `192.168.2.92 / YL_MESDB`,查询结果显示:
|
||||
- 产品合格率工位菜单共有 11 条,分别属于账号代码 `1、1004、1006、1007、2008、2010、2014、2015、2018、2026、2027`。
|
||||
- 11 条目标菜单原来均位于生产管理下,`pid=3`。
|
||||
- 账号 `1、1004、1007、2010、2026、2027` 已有质量管理根菜单。
|
||||
- 账号 `1006、2008、2014、2015、2018` 缺少质量管理根菜单。
|
||||
4. 查询菜单表结构,确认:
|
||||
- 菜单表为 `dbo.登录基础数据_二级菜单`。
|
||||
- `IDD` 是标识列和主键,业务菜单 `id` 可在不同账号间复用。
|
||||
- 现有质量管理根菜单统一使用 `id=4、pid=0、path=/QualityManagement、componet=/layout/Layout`。
|
||||
5. 查询账号代码 `1` 的质量管理子菜单,确认菜单归属由 `pid=4` 决定,组件源码不必搬到 `QualityManagement` 目录。因此保留原组件路径,避免修改动态路由和源码目录。
|
||||
6. 新增幂等增量脚本 `db_backups/move_product_pass_rate_workstation_to_quality_menu_20260711.sql`:
|
||||
- 动态收集所有已有产品合格率工位菜单的账号。
|
||||
- 对缺少质量管理根菜单的目标账号补齐标准质量管理根菜单。
|
||||
- 在菜单 ID 4 被其他菜单占用时主动终止事务,避免错误覆盖。
|
||||
- 将全部产品合格率工位菜单的 `pid` 更新为 `4`。
|
||||
- 保留路由和组件配置,并统一启用状态、模块代码和操作时间。
|
||||
- 使用事务和 `XACT_ABORT` 保证迁移原子性。
|
||||
7. 使用 `sqlcmd` 将增量脚本发布到 `192.168.2.92 / YL_MESDB`,执行成功:
|
||||
- 11 条目标菜单全部更新为 `pid=4`。
|
||||
- 5 个缺失质量管理根菜单的账号已补齐父菜单。
|
||||
8. 检查旧初始化脚本,发现已有记录重复执行时不会修改 `pid`,但以后为新账号创建菜单时仍可能放回生产管理。
|
||||
9. 修改 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`:
|
||||
- 父菜单解析由生产管理改为质量管理。
|
||||
- 仅在账号存在质量管理根菜单时创建目标菜单。
|
||||
- 更新已有目标菜单时同步将 `pid` 调整为对应质量管理根菜单 ID。
|
||||
10. 在目标数据库重复执行修改后的旧初始化脚本,脚本执行成功,11 条目标菜单仍全部保持 `pid=4`,验证不会回退到生产管理。
|
||||
11. 首次执行最终一致性查询时,第一项统计已返回 11 条全部迁移成功,但后续语句因误将 CTE 跨多条 SQL 语句复用而报“对象名 Targets 无效”;该错误只发生在只读校验查询中,不影响此前已提交的迁移事务。
|
||||
12. 将校验查询改为表变量后重新执行,完整验证通过:
|
||||
- 目标菜单总数:11。
|
||||
- 质量管理下数量:11。
|
||||
- 生产管理残留数量:0。
|
||||
- 启用数量:11。
|
||||
- 缺失质量管理父菜单数量:0。
|
||||
- 单账号重复目标菜单数量:0。
|
||||
13. 执行 `git diff --check` 检查脚本差异,未发现空白错误。
|
||||
|
||||
### 修改文件
|
||||
- `db_backups/move_product_pass_rate_workstation_to_quality_menu_20260711.sql`
|
||||
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
|
||||
- `gptlog-process/gpdlog.md`
|
||||
|
||||
### 结论
|
||||
- 产品合格率工位页面已经从生产管理菜单迁移到质量管理菜单。
|
||||
- 页面组件仍保留在 `ProductionManagement/ProductPassRateWorkstation/index`,只调整数据库菜单层级。
|
||||
- 当前已有该页面权限的 11 个账号均可通过质量管理菜单访问,原来缺少质量管理根菜单的账号已补齐父菜单。
|
||||
- 旧初始化脚本已同步修正,后续重复部署不会将该页面重新放回生产管理。
|
||||
|
||||
### 验证结果
|
||||
- 数据库增量脚本发布成功。
|
||||
- 修改后的旧初始化脚本重复执行成功。
|
||||
- 11 条目标菜单全部为 `pid=4`,生产管理残留为 0。
|
||||
- 缺失父菜单和重复菜单均为 0。
|
||||
- `git diff --check` 通过。
|
||||
|
||||
## 2026-07-11 上传全部修改到远程
|
||||
|
||||
### 用户提问
|
||||
- 用户要求把当前所有修改上传到远程仓库。
|
||||
|
||||
### 执行过程
|
||||
1. 检查 Git 工作区,确认待上传修改包括:
|
||||
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`:设计工时报表 Excel 导出功能。
|
||||
- `db_backups/move_product_pass_rate_workstation_to_quality_menu_20260711.sql`:产品合格率工位菜单迁移增量脚本。
|
||||
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`:旧菜单初始化脚本改为使用质量管理父菜单。
|
||||
- `gptlog-process/gpdlog.md`:对应任务的中文执行日志。
|
||||
2. 确认当前分支为 `snapshot/local-save-20260625-154806`,跟踪远端分支 `origin/snapshot/local-save-20260625-154806`。
|
||||
3. 检查待提交内容,确认没有构建产物或其他临时文件。
|
||||
4. 执行 `git diff --check`,未发现空白错误。
|
||||
5. 执行 `git fetch origin` 刷新远端状态。
|
||||
6. 首次统计本地与远端分叉时,PowerShell 将未加引号的 `@{u}` 解析为自身语法,导致 Git 收到错误参数;给修订参数加引号后重新执行成功。
|
||||
7. 正确的分叉统计结果为 `0 0`,本地提交和远端提交在上传前完全同步,没有分叉。
|
||||
8. 对已跟踪差异和未跟踪文件执行数据库密码及常见凭据特征扫描,匹配数量均为 0,确认用户提供的数据库明文密码未写入待上传文件。
|
||||
9. 暂存三个功能文件并执行 `git diff --cached --check`,检查通过。
|
||||
10. 创建功能提交:
|
||||
- 提交号:`0784746`
|
||||
- 提交信息:`feat: 增加工时报表导出并调整质量菜单`
|
||||
- 变更统计:3 个文件,新增 244 行,删除 7 行。
|
||||
11. 将本次上传过程追加到 `gptlog-process/gpdlog.md`,创建独立日志提交。
|
||||
12. 执行 `git push`,将功能提交和日志提交一起推送到 `origin/snapshot/local-save-20260625-154806`。
|
||||
13. 推送后重新检查本地与远端提交差异及工作区状态,确认远端已包含全部修改。
|
||||
|
||||
### 结论
|
||||
- 当前工作区内的设计工时报表导出、产品合格率工位菜单迁移、旧菜单脚本修正和对应中文日志已全部提交并上传到远程。
|
||||
|
||||
@@ -63,6 +63,15 @@
|
||||
<span class="show-text">任务ID:</span>
|
||||
<el-input v-model="searchForm.did" clearable size="small" style="width: 90px; margin-right: 8px" />
|
||||
<el-button :loading="loading" icon="el-icon-search" plain size="small" type="primary" @click="searchTable">查询</el-button>
|
||||
<el-button
|
||||
:disabled="loading || tableData.length === 0"
|
||||
:loading="exporting"
|
||||
icon="el-icon-download"
|
||||
plain
|
||||
size="small"
|
||||
type="success"
|
||||
@click="exportToExcel"
|
||||
>导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
@@ -110,11 +119,14 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as XLSX from 'xlsx'
|
||||
|
||||
export default {
|
||||
name: 'DesignReportHoursReport',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
exporting: false,
|
||||
tableData: [],
|
||||
projectOptions: [],
|
||||
materialOptions: [],
|
||||
@@ -176,6 +188,86 @@ export default {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
exportToExcel() {
|
||||
if (this.tableData.length === 0) {
|
||||
this.$message.warning('没有数据可导出')
|
||||
return
|
||||
}
|
||||
|
||||
this.exporting = true
|
||||
try {
|
||||
const rows = this.flattenTree(this.tableData)
|
||||
const exportData = rows.map(row => ({
|
||||
层级: row.Level === 1 ? '操作人汇总' : (row.Level === 2 ? '日期汇总' : '任务明细'),
|
||||
'操作人 / 日期 / 任务': `${' '.repeat(Math.max((row.Level || 1) - 1, 0))}${this.getTreeTitle(row)}`,
|
||||
工作日期: this.getExportValue(row.工作日期),
|
||||
RID: this.getExportValue(row.RID),
|
||||
DID: this.getExportValue(row.DID),
|
||||
项目号: this.getExportValue(row.项目号),
|
||||
物料编码: this.getExportValue(row.物料编码),
|
||||
物料名称: this.getExportValue(row.物料名称),
|
||||
图号: this.getExportValue(row.图号),
|
||||
类别: this.getExportValue(row.类别),
|
||||
报工次数: this.getExportValue(row.报工次数),
|
||||
'工时(h)': this.formatHours(row.工时小时),
|
||||
开始时间: this.getExportValue(row.开始时间),
|
||||
结束时间: this.getExportValue(row.结束时间),
|
||||
校验状态: this.getExportValue(row.校验状态),
|
||||
进度说明: this.getExportValue(row.进度说明),
|
||||
备注: this.getExportValue(row.备注)
|
||||
}))
|
||||
const workbook = XLSX.utils.book_new()
|
||||
const worksheet = XLSX.utils.json_to_sheet(exportData)
|
||||
worksheet['!cols'] = [
|
||||
{ wch: 12 },
|
||||
{ wch: 32 },
|
||||
{ wch: 14 },
|
||||
{ wch: 10 },
|
||||
{ wch: 10 },
|
||||
{ wch: 16 },
|
||||
{ wch: 22 },
|
||||
{ wch: 24 },
|
||||
{ wch: 16 },
|
||||
{ wch: 16 },
|
||||
{ wch: 12 },
|
||||
{ wch: 12 },
|
||||
{ wch: 20 },
|
||||
{ wch: 20 },
|
||||
{ wch: 14 },
|
||||
{ wch: 30 },
|
||||
{ wch: 30 }
|
||||
]
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, '设计工时报表')
|
||||
XLSX.writeFile(workbook, `设计工时报表_${this.formatDateForFileName(new Date())}.xlsx`)
|
||||
this.$message.success('导出成功')
|
||||
} catch (error) {
|
||||
console.error('设计工时报表导出失败:', error)
|
||||
this.$message.error('导出失败')
|
||||
} finally {
|
||||
this.exporting = false
|
||||
}
|
||||
},
|
||||
flattenTree(rows) {
|
||||
return rows.reduce((result, row) => {
|
||||
result.push(row)
|
||||
if (row.children && row.children.length > 0) {
|
||||
result.push(...this.flattenTree(row.children))
|
||||
}
|
||||
return result
|
||||
}, [])
|
||||
},
|
||||
getExportValue(value) {
|
||||
return value === null || value === undefined ? '' : value
|
||||
},
|
||||
formatDateForFileName(date) {
|
||||
const year = date.getFullYear()
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0')
|
||||
const day = String(date.getDate()).padStart(2, '0')
|
||||
const hours = String(date.getHours()).padStart(2, '0')
|
||||
const minutes = String(date.getMinutes()).padStart(2, '0')
|
||||
const seconds = String(date.getSeconds()).padStart(2, '0')
|
||||
return `${year}${month}${day}_${hours}${minutes}${seconds}`
|
||||
},
|
||||
async queryProjects(query) {
|
||||
const data = this.CreateData('11', '设计报工_项目查询', [['过滤', query || '']])
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user