## 2026-06-27 过程异常管控修改执行日志

1. 读取 `work/修改过程异常管控.docx`，解析到需求要点：
   - 页面位置：`ProductionManagement/AbnormalControl/index`。
   - 原页面添加多个审批人后表现为多级审批，需要改为多选后多人同时看到任务。
   - 当前任务只要其中一个审批人同意，即完成当前任务。
   - 上传附件功能不正常，需要修改。
   - 加工中心 `ProductionManagement/MachiningCenter/index` 与装配中心 `ProductionManagement/AssemblyCenter/index` 也需要统一嵌套该业务页面。
   - 测试页面功能时不要产生业务数据。

2. 检查代码结构：
   - 确认独立异常管控页面位于 `src/views/ProductionManagement/AbnormalControl/index.vue`。
   - 确认加工中心内复制了一份异常管控模板和方法。
   - 确认装配中心入口原本被注释，且没有完整异常管控弹窗模板。
   - 对比其他图纸上传页面，确认文件上传接口需要使用 `DataPDF.params = JSON.stringify(...)` 形式传参，当前异常管控直接传对象是上传异常的重要原因。

3. 前端修改：
   - 新增复用组件 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`，承载统一异常管控页面。
   - 将 `src/views/ProductionManagement/AbnormalControl/index.vue` 改为组件包装页，避免独立页面与中心页面逻辑分叉。
   - 在复用组件中将审批人从“添加审批人列表”改为 `el-select multiple` 多选。
   - 提交流程时将多个审批人的 ID 和姓名使用英文逗号拼接，继续通过 `审批人ID`、`审批人姓名` 参数提交，兼容原前端调用方式。
   - 修复附件上传：
     - 上传前校验是否已选择附件。
     - 按项目已有接口约定传 `params` JSON。
     - 传入 `num`、`tableName=流程表`、`worker`、`uploadTime`。
     - 增加上传失败回调提示。
   - 加工中心新增统一异常管控弹窗，按钮改为打开复用组件。
   - 装配中心恢复“异常管控”按钮，并新增统一异常管控弹窗。
   - 修复加工中心旧异常管控复制代码中 `handleRowClick` 与主表行点击方法重名的问题，将旧异常管控内部行点击改名，避免覆盖主页面任务选择逻辑。

4. 数据库脚本：
   - 新增 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`。
   - 脚本包含 `sp_创建流程_简化版` 和 `sp_处理审批` 的 `CREATE OR ALTER PROCEDURE`。
   - `sp_创建流程_简化版` 支持逗号分隔的多个审批人，并拆分为同一步骤序号的多个 `processing` 节点，使多人同时看到待处理任务。
   - `sp_处理审批` 在任意审批人同意时，将同一步骤其他待处理节点同步关闭，并将流程置为 `completed`。
   - 脚本只定义存储过程，没有插入或修改业务测试数据；本次未执行该 SQL。

5. 文档归档：
   - 新建目录 `work/ProductionManagement/WorkHoursCheck`。
   - 已将 `work/修改过程异常管控.docx` 移动到 `work/ProductionManagement/WorkHoursCheck/修改过程异常管控.docx`。

6. 验证：
   - 执行 `npm run build`。
   - 构建成功。
   - 构建仅出现原项目资源体积较大、Browserslist 数据过期等警告。
   - 未调用流程新增、审批、上传等业务接口，因此未产生业务数据。

## 2026-06-27 过程异常管控复测问题处理日志

1. 根据用户复测反馈重新排查：
   - 用户发起测试流程时选择了曹元和闫一龙两个审批人，但登录曹元账号后没有看到待处理任务。
   - 附件上传仍然不可用。

2. 待办不可见问题定位：
   - 当前前端提交多个审批人时，会把审批人ID和审批人姓名用英文逗号拼接后传给 `sp_创建流程_简化版`。
   - 如果目标数据库仍是旧版存储过程，测试流程可能只生成一条节点记录，节点中的 `审批人ID` 是类似 `曹元ID,闫一龙ID` 的字符串。
   - 旧版 `sp_获取待处理任务` 如果按 `审批人ID = 当前登录人ID` 精确匹配，曹元登录时就匹配不到这条节点，所以待办为空。

3. 数据库脚本补充：
   - 修改 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`。
   - 在原有 `sp_创建流程_简化版`、`sp_处理审批` 基础上新增 `sp_获取待处理任务` 的 `CREATE OR ALTER PROCEDURE`。
   - 新版 `sp_获取待处理任务` 同时支持：
     - 新逻辑生成的同一步骤多条待办节点。
     - 旧逻辑已生成的逗号分隔审批人ID节点。
   - 这样已发起的曹元、闫一龙测试流程，只要目标库执行该脚本，曹元账号也可以按逗号包含关系查询到待办。

4. 附件上传问题修改：
   - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。
   - 上传按钮改为只选择附件并记录待上传数量，不再在流程创建前直接上传。
   - 流程创建成功并拿到 `新流程ID` 后，再自动调用上传接口。
   - 上传参数改为使用真实流程ID：`num = 新流程ID`、`tableName = 流程表`、`worker = 当前用户`、`uploadTime = 当前时间`。
   - 使用 `this.$set(this.DataPDF, 'params', JSON.stringify(...))` 设置上传参数，保持与项目已有上传页面的参数传递方式一致。
   - 多附件上传按成功回调计数，全部上传完成后清空文件列表和待上传数量。
   - 取消附件弹窗时清空已选择附件，避免误带入下次流程。
   - 提交流程成功后刷新“我发起的”和“待我处理”列表。

5. 验证：
   - 修改后执行 `npm run build`。
   - 构建成功。
   - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。
   - 本次没有调用流程新增、审批、附件上传等业务接口，没有执行数据库脚本，因此未产生业务数据。

6. 仍需执行的外部动作：
   - 当前仓库没有可直接、安全执行数据库 DDL 的连接串或发布脚本入口。
   - 前端修改已经完成，但曹元待办不可见的问题依赖目标数据库存储过程更新。
   - 需要在目标 SQL Server 数据库执行 `db_backups/update_abnormal_control_parallel_approval_20260627.sql`，否则服务器仍会按旧存储过程逻辑查询，已发起的测试流程仍可能查不到。

## 2026-06-27 过程异常管控附件功能临时移除日志

1. 根据用户反馈重新调整：
   - 用户确认附件功能仍然不好用，要求暂时去掉附件功能。
   - 本次目标改为移除过程异常管控页面中的附件入口和上传调用，避免影响流程发起。

2. 修改复用组件：
   - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。
   - 删除发起流程表单中的“上传附件”表单项和“点击上传”按钮。
   - 删除上传附件弹窗。
   - 删除 `MESUploadFile` 引入。
   - 删除 `DataPDF`、`uploadPDF`、`pendingUploadCount`、`uploadFileTotal`、`uploadFileSuccess`、`uploadingAttachment` 等附件状态。
   - 删除 `uploadSuccessPDF`、`uploadErrorPDF`、`uploadShowPDF`、`submitPicturePDF`、`cancelAttachmentUpload`、`clearPendingAttachments`、`uploadPendingAttachments` 等附件相关方法。
   - 删除流程创建成功后的附件上传调用，成功提示恢复为只提示流程创建成功。
   - 删除无用的 `.attachment-tip` 样式。

3. 清理加工中心旧残留：
   - 修改 `src/views/ProductionManagement/MachiningCenter/index.vue`。
   - 删除旧异常管控模板里残留的“上传附件”按钮。
   - 删除旧代码中已经注释的上传弹窗块。
   - 删除旧异常管控方法里的 `uploadShowPDF` 和 `submitPicturePDF`。
   - 删除旧数据中的 `imgDialogFormVisible`。

4. 搜索确认：
   - 对 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`、`AbnormalControl/index.vue`、`MachiningCenter/index.vue`、`AssemblyCenter/index.vue` 执行搜索。
   - 未再发现 `上传附件`、`MESUploadFile`、`uploadPDF`、`DataPDF`、`submitPicturePDF`、`uploadShowPDF`、`attachment-tip`、`附件开始上传` 等附件入口或上传调用残留。

5. 验证：
   - 执行 `npm run build`。
   - 构建成功。
   - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。
   - 本次未调用流程新增、审批、附件上传等业务接口，未产生业务数据。

## 2026-06-27 过程异常管控页签刷新处理日志

1. 根据用户反馈重新调整：
   - 用户要求异常管控里面三个页签点击时需要刷新数据。
   - 涉及页签包括：`待我处理`、`我发起的`、`已完成`。

2. 检查当前实现：
   - 当前 `el-tabs` 只通过 `v-model="activeTab"` 切换页签，没有绑定页签点击事件。
   - 顶部三个统计卡片点击时也只是修改 `activeTab`，没有重新请求数据。
   - `searchTable` 和 `searchTable1` 在接口返回空数组时不会覆盖原列表，可能导致刷新后仍显示上一次的数据。
   - 绑定任务查询 `searchTable3` 也存在接口返回空数组时保留旧列表的问题。

3. 前端修改：
   - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。
   - 给 `el-tabs` 增加 `@tab-click="handleTabClick"`。
   - 新增 `handleTabClick(tab)` 方法，根据当前页签名称刷新对应数据。
   - 新增 `switchTab(tabName)` 方法，统计卡片点击时先切换页签，再刷新对应数据。
   - 新增 `refreshActiveTab(tabName)` 方法，统一调度三个页签的数据刷新：
     - `pending` 调用 `searchTable1()` 刷新待我处理。
     - `initiated` 调用 `searchTable()` 刷新我发起的。
     - `processed` 调用 `getProcessedTasks()` 刷新已完成。

4. 数据覆盖修正：
   - `getProcessedTasks()` 改为始终用 `response.data || []` 覆盖 `processedTasks`，并同步更新统计数量。
   - `searchTable()` 改为始终用 `response.data || []` 覆盖 `initiatedProcesses`，并同步更新统计数量。
   - `searchTable1()` 改为始终用 `response.data || []` 覆盖 `pendingTasks`，并同步更新统计数量。
   - `searchTable3()` 改为始终用 `response.data || []` 覆盖 `tableData5`，避免绑定任务查询为空时残留旧数据。

5. 验证：
   - 执行 `npm run build`。
   - 构建成功。
   - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。
   - 本次未调用流程新增、审批等业务接口，未产生业务数据。

## 2026-06-27 加工中心和装配中心异常管控集成问题处理日志

1. 根据用户反馈重新排查：
   - 加工中心和装配中心打开异常管控后，新建流程时原本应自动带入的生产任务信息没有了。
   - 在异常管控中新建流程或处理任务时，弹出的二级弹框被黑色遮罩挡住，无法操作。

2. 自动带入问题定位：
   - 加工中心、装配中心当前主表选中行保存在各自页面的 `selectedRow`。
   - 异常管控已经改成复用组件后，父页面没有把主表 `selectedRow` 传给复用组件。
   - 复用组件内部只知道自己弹窗里的绑定任务列表点击结果，因此从中心页进入时不会自动显示当前生产订单、物料、工序等信息。

3. 自动带入修复：
   - 修改 `src/views/ProductionManagement/components/AbnormalControlPanel.vue`。
   - 新增 `initialSelectedRow` 入参。
   - 在组件创建和 `initialSelectedRow` 变化时调用 `applyInitialSelectedRow()`。
   - `applyInitialSelectedRow()` 会把外部传入的主表选中行交给 `handleRowClick()` 统一映射。
   - `handleRowClick()` 兼容多种字段名：
     - 生产订单：`订单号`、`计划号`、`生产订单`。
     - 物料编码：`产品编码`、`零件编码`、`物料编码`。
     - 物料名称：`产品名称`、`零件名称`、`物料名称`。
     - 工序名称：`工序名称`。
   - 同步把外部带入的信息写入异常管控的查询条件，方便打开后看到当前任务上下文。
   - 新建流程校验从 `selectedRow == ""` 调整为 `!selectedRow`，兼容对象/null 两类状态。

4. 父页面传值修复：
   - 修改 `src/views/ProductionManagement/MachiningCenter/index.vue`。
   - 修改 `src/views/ProductionManagement/AssemblyCenter/index.vue`。
   - 两个中心页的异常管控弹窗中，将组件调用改为 `<abnormal-control-panel :initial-selected-row="selectedRow" />`。

5. 遮罩问题修复：
   - 复用组件内部所有二级弹窗增加 `:append-to-body="true"`：
     - 发起新流程弹窗。
     - 处理任务弹窗。
     - 流程进度详情弹窗。
     - 转办流程弹窗。
     - 完结流程弹窗。
   - 加工中心和装配中心的外层异常管控弹窗增加 `append-to-body`，降低与页面其他弹窗层级冲突的风险。

6. 验证：
   - 执行 `npm run build`。
   - 构建成功。
   - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。
   - 本次未调用流程新增、审批等业务接口，未产生业务数据。

## 2026-06-27 修改工时报表执行日志

1. 查找并读取需求文档：
   - 用户提到 `worke`，实际仓库中没有 `worke` 目录。
   - 在 `work` 目录下找到 `work/修改工时报表.docx`。
   - 读取 docx 内容，确认需求：
     - 页面位置：`ProductionManagement/Timesheet`。
     - 页面中四个分页：`项目工时`、`作业者工时`、`任务工时`、`设备工时`。
     - 四个分页里面的明细信息都要按照开始时间排序。

2. 定位代码：
   - 页面文件为 `src/views/ProductionManagement/Timesheet/index.vue`。
   - 四个分页对应数据：
     - `项目工时` 使用 `projectTableData`，由 `loadProjectData()` 调用 `工时统计_项目工时_查询` 后通过 `buildProjectTree()` 组装。
     - `作业者工时` 使用 `operatorTableData`，由 `loadOperatorData()` 调用 `工时统计_作业者工时_查询` 后通过 `buildOperatorTree()` 组装。
     - `任务工时` 使用 `taskTableData`，由 `loadTaskData()` 调用 `工时统计_任务工时_查询` 后通过 `buildTaskTree()` 组装。
     - `设备工时` 使用 `DeviceTableData`，由 `loadDeviceData()` 调用 `工时统计_设备工时_查询` 后复用 `buildOperatorTree()` 组装。

3. 代码修改：
   - 修改 `src/views/ProductionManagement/Timesheet/index.vue`。
   - 新增 `getStartTimeValue(row)`：
     - 兼容 `startTime`、`planStart`、`开始时间`、`dateLabel` 字段。
     - 将时间字符串转换为可比较的时间戳。
     - 空值或无效时间排到最后。
   - 新增 `getEarliestStartTime(row)`：
     - 对树形节点递归取子级最早开始时间。
     - 用于父级分组排序，保证父级分组顺序跟其明细开始时间一致。
   - 新增 `sortRowsByStartTime(rows)`：
     - 递归排序每一层 `children`。
     - 每个分组下的明细按照开始时间升序排列。
     - 父级分组按照子级最早开始时间升序排列。
   - 在 `buildProjectTree()` 返回前调用 `sortRowsByStartTime()`，覆盖项目工时分页。
   - 在 `buildOperatorTree()` 返回前调用 `sortRowsByStartTime()`，覆盖作业者工时和设备工时分页。
   - 在 `buildTaskTree()` 返回前调用 `sortRowsByStartTime()`，覆盖任务工时分页。

4. 文档归档：
   - 新建目录 `work/ProductionManagement/Timesheet`。
   - 已将 `work/修改工时报表.docx` 移动到 `work/ProductionManagement/Timesheet/修改工时报表.docx`。

5. 验证：
   - 执行 `npm run build`。
   - 构建成功。
   - 构建仅有项目原有资源体积过大、Browserslist/baseline-browser-mapping 数据过期警告。
   - 本次只修改前端排序和移动文档，未调用业务接口，未产生业务数据。

## 2026-06-27 13:42:30 作业者工时报工数量按 TaskAID+开始时间取最大值

### 用户需求
- 修改工时报表中“作业者工时”的“报工数量”取值口径。
- 新口径：同一个 TaskAID 且开始时间相同的记录，报工数量取最大值；不再叠加其他分组条件。
- 用户提供目标数据库连接信息，本次执行中使用目标库 192.168.2.92 / YL_MESDB，日志中不记录数据库密码。

### 执行过程
1. 检查工作目录 C:\WorkYuanLy\MES_Manage_View_V20，确认工时报表文档已在 work/ProductionManagement/Timesheet/修改工时报表.docx。
2. 检查前端文件 src/views/ProductionManagement/Timesheet/index.vue，确认“作业者工时”和“设备工时”共用 uildOperatorTree，因此修改时增加开关参数，只让作业者工时启用新口径，避免影响设备工时。
3. 连接数据库 192.168.2.92 的 YL_MESDB，确认：
   - dbo.View_生产工时视图 包含 TaskAID、开始时间、操作数值、操作人、阶段标识 字段。
   - dbo.View_生产工时视图全部 包含 TaskAID、开始时间、操作数值、操作人、阶段标识 字段。
   - dbo.工时统计_作业者工时_查询 存储过程存在。
4. 在修改数据库过程前，备份目标库当前过程定义：
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_20260627_133625.sql
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_20260627_133625.sql
5. 修改前端 src/views/ProductionManagement/Timesheet/index.vue：
   - 增加 parseReportQty、ormatReportQty、getTaskAID、getReportQtyGroupKey、uildTaskStartReportQtyMap、getTaskStartReportQty、
ecalculateOperatorReportQty。
   - loadOperatorData 调用 uildOperatorTree(res.data || [], true)，启用作业者工时的新报工数量口径。
   - uildOperatorTree 增加 useTaskStartMaxReportQty 参数；明细行保留 TaskAID 和内部用的 
eportQtyGroupKey。
   - 作业者工时的日期汇总和操作人汇总按唯一 TaskAID + startTime 取最大值后再求和，避免同一任务同一开始时间的重复行重复累加。
   - 设备工时继续调用 uildOperatorTree(res.data || [])，不启用新口径。
6. 新增数据库脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql：
   - 更新 dbo.工时统计_作业者工时_查询。
   - 更新 dbo.工时统计_作业者工时_查询_导出。
   - 两个过程均通过 TaskStart报工数量 按 TaskAID + CONVERT(VARCHAR(19), 开始时间, 120) 分组取最大报工数量。
   - 查询过程结果集中增加 TaskAID 字段供前端兜底计算使用。
   - 导出过程同步使用新口径，但不新增导出显示列，避免改变导出表头结构。
7. 执行数据库脚本到目标库；本次数据库操作只执行 ALTER PROCEDURE，未写入或修改业务表数据。
8. 使用 sys.sp_describe_first_result_set 验证 dbo.工时统计_作业者工时_查询 的结果集，确认包含 TaskAID 字段，位于结果列第 20 列。
9. 验证数据库过程定义中查询和导出都包含 GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120)，确认已按新口径分组。
10. 执行 
pm run build，构建成功。构建输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修改未引入编译错误。

### 修改结果
- 作业者工时页面“报工数量”现在按照同一 TaskAID、同一开始时间取最大值。
- 作业者工时的操作人汇总、日期汇总、明细显示和导出过程均同步使用该口径。
- 设备工时未被新口径影响。
- 已保留数据库更新前备份和本次更新脚本。

### 验证结果
- 数据库连接和字段确认：通过。
- 存储过程更新：通过。
- 查询结果集 TaskAID 字段确认：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 14:13:28 修正作业者工时报工数量为全量视图取最大值

### 用户反馈
- 上一次实现不符合要求。
- 正确口径：直接查询 [View_生产工时视图全部]，同一个 TaskAID、同一个开始时间取最大报工数量，不经过任何过滤条件。

### 执行过程
1. 明确修正范围：报表显示行仍由原查询条件决定，但“报工数量最大值”的来源必须改为全量 [dbo].[View_生产工时视图全部]，不能从筛选后的数据集计算。
2. 修改脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql：
   - dbo.工时统计_作业者工时_查询 中的 TaskStart报工数量 CTE 从 FROM 筛选明细 改为 FROM [dbo].[View_生产工时视图全部]。
   - dbo.工时统计_作业者工时_查询_导出 中的 TaskStart报工数量 CTE 同步改为 FROM [dbo].[View_生产工时视图全部]。
   - 两处最大值计算均只按 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组，不增加日期、操作人、合同号、产品、工序、订单、阶段标识等过滤条件。
3. 在重新应用数据库脚本前，再次备份目标库当前过程定义：
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_unfiltered_taskstart_reportqty_20260627_141106.sql
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_unfiltered_taskstart_reportqty_20260627_141106.sql
4. 重新连接目标库 192.168.2.92 / YL_MESDB，执行修正后的 SQL 脚本，只更新两个存储过程定义，未修改业务表数据。
5. 第一次使用 LIKE 验证时因匹配范围过大产生误判，随后改为提取 TaskStart报工数量 CTE 片段进行验证。
6. 验证结果：
   - dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 来源为 FROM [dbo].[View_生产工时视图全部]，不包含 筛选明细。
   - dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 来源为 FROM [dbo].[View_生产工时视图全部]，不包含 筛选明细。
   - 两个过程均按 GROUP BY TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组取最大值。
7. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修正未引入编译错误。

### 修改结果
- 作业者工时查询和导出过程的报工数量最大值来源已改为全量 [dbo].[View_生产工时视图全部]。
- 最大值计算不再经过报表查询条件过滤。
- 本地脚本和目标库过程已同步。

### 验证结果
- 目标库脚本应用：通过。
- CTE 来源验证：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 14:48:37 修正作业者工时报工数量最大值增加操作类别编号过滤

### 用户反馈
- 报工数量最大值仍需直接查 [View_生产工时视图全部]。
- 同一个 TaskAID、同一个开始时间取最大值。
- 需要增加过滤条件：操作类别编号 = 6。

### 执行过程
1. 连接目标库 192.168.2.92 / YL_MESDB，确认 [dbo].[View_生产工时视图全部] 存在以下字段：
   - TaskAID
   - 开始时间
   - 操作数值
   - 操作类别编号
2. 修改本地数据库脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql：
   - 在 dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 中增加 WHERE 操作类别编号 = 6。
   - 在 dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 中同步增加 WHERE 操作类别编号 = 6。
   - 最大值来源仍为 FROM [dbo].[View_生产工时视图全部]，不是筛选后的报表数据。
   - 分组仍只使用 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120)。
3. 在重新应用数据库脚本前，备份目标库当前过程定义：
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_taskstart_reportqty_type6_20260627_144642.sql
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_taskstart_reportqty_type6_20260627_144642.sql
4. 重新执行 SQL 脚本到目标库，只执行 ALTER PROCEDURE，未修改业务表数据。
5. 提取两个过程的 TaskStart报工数量 CTE 进行验证，结果如下：
   - dbo.工时统计_作业者工时_查询：来源为 [dbo].[View_生产工时视图全部]，包含 WHERE 操作类别编号 = 6，不包含 筛选明细。
   - dbo.工时统计_作业者工时_查询_导出：来源为 [dbo].[View_生产工时视图全部]，包含 WHERE 操作类别编号 = 6，不包含 筛选明细。
6. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次调整未引入编译错误。

### 修改结果
- 作业者工时查询和导出的报工数量最大值口径已更新为：
  - 直接从 [dbo].[View_生产工时视图全部] 取数；
  - 只取 操作类别编号 = 6 的记录；
  - 同一 TaskAID、同一开始时间取最大 操作数值 口径后的报工数量；
  - 不使用报表查询条件过滤最大值来源。

### 验证结果
- 字段确认：通过。
- 目标库过程更新：通过。
- CTE 来源和条件验证：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 15:02:19 修正作业者工时报工数量撤销操作类别过滤并增加装配置零

### 用户反馈
- 之前增加 操作类别编号 = 6 不符合要求。
- 正确口径：直接查 [View_生产工时视图全部]，同一个 TaskAID、同一个开始时间取最大值，最大值来源没有任何过滤条件。
- 另增判断：指派对象包含“装配”时，报工数量为 0。

### 执行过程
1. 重新确认需求后，修正本地 SQL 脚本 db_backups/update_timesheet_operator_report_qty_task_start_20260627.sql。
2. 从 dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 中移除 WHERE 操作类别编号 = 6。
3. 从 dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 中移除 WHERE 操作类别编号 = 6。
4. 保留最大值来源为全量 [dbo].[View_生产工时视图全部]，并只按 TaskAID, CONVERT(VARCHAR(19), 开始时间, 120) 分组。
5. 在查询过程 报工明细 中增加判断：WHEN ISNULL(b.工位名称, '') LIKE '%装配%' THEN 0，否则使用全量视图按 TaskAID+开始时间取到的最大报工数量。
6. 在导出过程的明细查询中同步增加同样的装配置零判断，保持页面和导出口径一致。
7. 检查本地脚本，确认没有残留 操作类别编号 = 6，并确认查询和导出两处均包含装配置零判断。
8. 在重新应用数据库脚本前，备份目标库当前过程定义：
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_before_assembly_zero_reportqty_20260627_145839.sql
   - db_backups/timesheet_operator_reportqty_backups/工时统计_作业者工时_查询_导出_before_assembly_zero_reportqty_20260627_145839.sql
9. 重新执行 SQL 脚本到目标库 192.168.2.92 / YL_MESDB，只执行 ALTER PROCEDURE，未修改业务表数据。
10. 数据库验证：
    - dbo.工时统计_作业者工时_查询 的 TaskStart报工数量 CTE 来源为 [dbo].[View_生产工时视图全部]，无 WHERE，不包含 操作类别编号，包含装配置零判断。
    - dbo.工时统计_作业者工时_查询_导出 的 TaskStart报工数量 CTE 来源为 [dbo].[View_生产工时视图全部]，无 WHERE，不包含 操作类别编号，包含装配置零判断。
11. 同步修改前端兜底逻辑 src/views/ProductionManagement/Timesheet/index.vue：
    - 增加 isAssemblyAssignee 方法，识别 指派对象/工位名称/assignee 是否包含“装配”。
    - 在 getTaskStartReportQty 中，如果为装配指派对象，直接返回 ，避免前端按同一 TaskAID+开始时间重算时把非装配最大值覆盖到装配行。
12. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修正未引入编译错误。

### 修改结果
- 作业者工时查询和导出的最大值来源恢复为全量 [dbo].[View_生产工时视图全部]，没有任何过滤条件。
- 最大值分组键仍为 TaskAID + 开始时间。
- 指派对象包含“装配”时，页面、汇总和导出报工数量均置为 0。
- 前端兜底逻辑已同步，避免页面端重算覆盖数据库装配置零规则。

### 验证结果
- SQL 脚本检查：通过。
- 目标库过程更新：通过。
- CTE 无过滤和装配置零判断验证：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 15:26:30 根据工时查询界面文档修改工时查询页面

### 用户需求
- 根据 work 下的 工时查询界面.docx 修改工时查询页面。
- 修改后创建对应路径并把文档移入。
- 按要求追加中文执行日志，不记录数据库密码。

### 文档内容提取
- 文档名称：work/工时查询界面.docx。
- 文档要求：
  - 修改三级数据，由原三级汇总改成三级明细数据。
  - 页面字段按截图展示：任务描述、日期、班次、生产订单号、报工类型、报工数量、工位、工时、程序时间、单件工时、工艺工时等。
  - 报工类型字段：辅助 改成 调机，报工 改成 正常。
  - 报工数量：相同 TaskAID、相同开始时间取最大值。
  - 指派对象包含“装配”时，报工数量为 0。
  - 程序时间没有，暂时为空。
  - 单件工时按 工时（分钟）/报工数量 计算；报工数量为 0 时取工艺工时。
  - 工艺工时维持原样。
  - 增加字段“操作人”，取相同 TaskAID、相同开始时间的操作人拼接，且去掉加工工时大于 0 的数据。
  - 白班/夜班根据操作描述包含“白班”或“夜班”判断。

### 执行过程
1. 查找并读取文档，确认文档路径为 work/工时查询界面.docx，并提取文档正文和截图。
2. 定位工时查询页面为 src/views/ProductionManagement/Workhours/index.vue，当前调用存储过程 生产管理_工时查询_工序工时_查询。
3. 连接目标库 192.168.2.92 / YL_MESDB，读取当前 dbo.生产管理_工时查询_工序工时_查询 定义，确认旧过程的三级数据为按 TaskAID、日期、班次汇总。
4. 查询数据库字段，确认 [dbo].[View_生产工时视图] 和 [dbo].[View_生产工时视图全部] 存在 TaskAID、开始时间、结束时间、操作内容、操作类别、操作描述、操作人、加工工时、操作数值、订单号、订单行号、订单合同号、产品编码、产品名称、工序名称、工位名称 等字段。
5. 新增数据库脚本 db_backups/update_workhours_query_detail_20260627.sql：
   - 更新 dbo.生产管理_工时查询_工序工时_查询。
   - 基础数据仍按页面查询条件取报工/辅助结束且加工工时大于 0 的记录。
   - TaskStart报工数量 从 [dbo].[View_生产工时视图全部] 按 TaskAID + 开始时间 全量取最大值。
   - 指派对象/工位名称包含“装配”时，报工数量置 0。
   - 三级返回明细数据，不再返回班次汇总。
   - 操作人使用相同 TaskAID + 开始时间 且 加工工时 <= 0 的记录去重拼接。
   - 班次根据相同 TaskAID + 开始时间 的操作描述是否包含“白班”或“夜班”判断。
   - 程序时间返回空。
   - 单件工时按加工工时分钟/报工数量计算；报工数量为 0 时取工艺工时。
6. 备份目标库旧过程到 db_backups/workhours_query_backups/生产管理_工时查询_工序工时_查询_before_detail_query_20260627_152142.sql。
7. 第一次应用后用样本执行发现 XML 拼接操作人受 QUOTED_IDENTIFIER 设置影响，因此将脚本改为 SET QUOTED_IDENTIFIER ON，并把操作人拼接改成 SQL Server 2019 支持的 STRING_AGG。
8. 重新执行脚本到目标库，只更新存储过程定义，未修改业务表数据。
9. 执行 EXEC dbo.[生产管理_工时查询_工序工时_查询] @数据条数 = 5 验证，返回 15 行，三级明细包含 operatorNames、productionOrderNo、
eportType、
eportQty、station、workHours、pieceWorkHours、processWorkHours 等字段。
10. 修改前端 src/views/ProductionManagement/Workhours/index.vue：
    - 表格列调整为文档要求的工时记录结构。
    - 增加操作人、生产订单号、报工类型、工位、工时、程序时间、单件工时等列。
    - 报工类型前端兜底映射：包含“辅助”显示“调机”，包含“报工”显示“正常”。
    - 第三级树节点改为明细行展示，不再按班次汇总展示。
    - 底部汇总改为总工时。
11. 创建目录 work/ProductionManagement/Workhours，并将 work/工时查询界面.docx 移动到 work/ProductionManagement/Workhours/工时查询界面.docx。
12. 清理文档截图临时解压目录 work/.docx_extract_工时查询界面。
13. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修改未引入编译错误。

### 修改结果
- 工时查询页面已按文档改成工时记录形式。
- 三级数据已由班次汇总改为明细数据。
- 数据库过程和前端页面字段已同步。
- 文档已移动到 work/ProductionManagement/Workhours/工时查询界面.docx。

### 验证结果
- 存储过程脚本应用：通过。
- 存储过程样本执行：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 16:34:11 根据新增结算工时页面文档新增结算工时页面

### 用户需求
- 根据 work 下的 新增结算工时页面.docx 新增结算工时页面。
- 修改后创建对应路径并把文档移入。
- 按要求追加中文执行日志，不记录数据库密码。

### 文档内容提取
- 文档名称：work/新增结算工时页面.docx。
- 文档要求：
  - 新增结算工时页面，任务描述参考工时查询页面。
  - 根据订单编号（生产订单号）和工位（指派对象）分组。
  - 统计设备工时，条件为加工工时 > 0。
  - 报工工时：上述设备工时中操作类别等于报工的工时。
  - 主辅工时：上述设备工时中操作类别等于辅助结束的工时。
  - 完成数分为报工完成数和辅助完成数，对应上述工时记录的操作数值求和。
  - 增加操作人字段：相同 TaskAID、相同开始时间的操作人拼接，且去掉加工工时大于 0 的数据。

### 执行过程
1. 查找并读取文档，确认路径为 work/新增结算工时页面.docx。
2. 检查现有生产管理页面和路由机制，确认前端使用动态菜单路径加载 src/views 下组件；新增页面放置在 src/views/ProductionManagement/SettlementWorkhours/index.vue。
3. 新增数据库脚本 db_backups/create_settlement_workhours_query_20260627.sql：
   - 创建/更新 dbo.生产管理_结算工时_查询。
   - 基础数据来源为 [dbo].[View_生产工时视图]。
   - 查询条件包含合同号、产品编码、订单号、工位、开始日期、结束日期、数据条数。
   - 只统计 加工工时 > 0 且操作内容/操作类别为 报工 或 辅助结束 的设备工时。
   - 汇总层按 订单号 + 工位名称 分组。
   - 报工工时 为报工记录加工工时小时汇总。
   - 主辅工时 为辅助结束记录加工工时小时汇总。
   - 报工完成数、辅助完成数 分别按对应操作类型的 操作数值 汇总。
   - 明细层返回操作人、日期、工序、操作类别、完成数、工时、开始/结束时间、TaskAID。
   - 操作人使用 [dbo].[View_生产工时视图全部] 中相同 TaskAID + 开始时间 且 加工工时 <= 0 的记录去重后用 STRING_AGG 拼接。
4. 执行数据库脚本到目标库 192.168.2.92 / YL_MESDB，只创建/更新存储过程，未修改业务表数据。
5. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 10，返回 18 行，包含汇总层和明细层数据。
6. 新增前端页面 src/views/ProductionManagement/SettlementWorkhours/index.vue：
   - 提供合同号、产品编码、生产订单号、工位、数据条数、开始/结束日期查询条件。
   - 调用 生产管理_结算工时_查询。
   - 使用树形表格展示订单+工位汇总，展开查看明细。
   - 汇总列包含报工工时、主辅工时、报工完成数、辅助完成数、合计工时。
   - 明细列包含操作人、日期、工序名称、操作类别、完成数、工时、开始时间、结束时间。
   - 底部显示报工工时、主辅工时、合计工时汇总。
7. 创建目录 work/ProductionManagement/SettlementWorkhours，并将 work/新增结算工时页面.docx 移动到 work/ProductionManagement/SettlementWorkhours/新增结算工时页面.docx。
8. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次新增未引入编译错误。

### 修改结果
- 新增结算工时页面：src/views/ProductionManagement/SettlementWorkhours/index.vue。
- 新增数据库脚本并已应用：db_backups/create_settlement_workhours_query_20260627.sql。
- 文档已移动到 work/ProductionManagement/SettlementWorkhours/新增结算工时页面.docx。

### 验证结果
- 存储过程脚本应用：通过。
- 存储过程样本执行：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 16:42:14 补新增结算工时页面菜单记录

### 用户反馈
- 新增结算工时页面后，页面上看不到菜单。
- 用户怀疑 [dbo].[登录基础数据_二级菜单] 没有增加记录。

### 执行过程
1. 检查目标库 192.168.2.92 / YL_MESDB 的 [dbo].[登录基础数据_二级菜单] 表结构。
2. 确认字段包括 IDD、id、pid、path、componet、
edirect、
ame、	itle、icon、账号代码、模块代码、是否启用、AddData、DeleteData、EditData、SearchData。
3. 注意到字段名是 componet，不是 component。
4. 查询现有工时相关菜单，确认：
   - 工时查询 菜单存在，id = 166，pid = 3，路径为 Workhours/index，组件为 /ProductionManagement/Workhours/index。
   - 工时查询 当前只配置给账号代码 1 和 2010。
   - 结算工时 菜单此前不存在。
5. 查询 IDD 属性，确认 IDD 是自增列；当前最大菜单 id 为 230。
6. 新增菜单脚本 db_backups/add_settlement_workhours_menu_20260627.sql：
   - 新菜单 id 使用 231。
   - pid = 3，挂在生产管理下。
   - path = 'SettlementWorkhours/index'。
   - componet = '/ProductionManagement/SettlementWorkhours/index'。
   - 
ame = 'SettlementWorkhours'。
   - 	itle = '结算工时'。
   - icon 复用工时查询图标，兜底为 DimensionsSummaryReport。
   - 权限按现有 工时查询 复制，插入账号代码 1 和 2010。
   - 脚本带 NOT EXISTS 判断，避免重复插入同账号菜单。
7. 执行菜单脚本到目标库。
8. 查询验证结果：
   - IDD = 2754，账号代码 1，菜单 结算工时 已存在。
   - IDD = 2755，账号代码 2010，菜单 结算工时 已存在。
   - 两条记录均指向 /ProductionManagement/SettlementWorkhours/index。

### 修改结果
- 已向 [dbo].[登录基础数据_二级菜单] 补录 结算工时 菜单。
- 菜单权限与现有 工时查询 保持一致，仅账号代码 1 和 2010 可见。
- 本次仅修改数据库菜单记录和新增脚本，不涉及前端代码变更。

### 验证结果
- 菜单表结构确认：通过。
- 菜单脚本执行：通过。
- 结算工时 菜单记录查询：通过。

## 2026-06-27 17:05:00 修正结算工时页面层级和已结算口径

### 用户反馈
- 结算工时页面缺少任务描述、装夹时间、程序时间。
- 页面存在多余字段，需要去掉。
- 数据层级应为 物料汇总 -> 生产订单号+工位汇总，不需要明细层。
- 只要已经结算的数据，即 [YL_MESDB].[dbo].[MES_接口_生产计划] 中 单据状态 IS NULL 的数据。

### 执行过程
1. 重新确认需求后，调整结算工时页面和存储过程为两级汇总，不再返回明细层。
2. 查询字段确认：
   - [dbo].[MES_接口_生产计划] 包含 AID、订单编号、物料编号、物料描述、单据状态。
   - [dbo].[View_生产工时视图] 和 [dbo].[View_生产工时视图全部] 包含 TaskAID、订单号、产品编码、产品名称、工位名称、加工工时、操作内容、操作类别、操作数值、开始时间、操作人。
   - [dbo].[车间生产管理工艺_零件生产工艺_工艺库] 包含 准备工时、标准工时，本次用 准备工时 作为装夹时间，用 标准工时 作为程序时间。
3. 重写 db_backups/create_settlement_workhours_query_20260627.sql：
   - dbo.生产管理_结算工时_查询 先从 [dbo].[MES_接口_生产计划] 取 单据状态 IS NULL 的结算任务。
   - 工时数据通过 p.AID = v.TaskAID 关联到结算任务。
   - 只统计 加工工时 > 0，且操作内容/操作类别为 报工 或 辅助结束 的设备工时。
   - 汇总层级改为两级：一级按 物料编号 + 物料描述 汇总，二级按 生产订单号 + 工位名称 汇总。
   - 输出字段包含任务描述、生产订单号、工位、报工工时、主辅工时、报工完成数、辅助完成数、合计工时、装夹时间、程序时间、操作人。
   - 去掉明细字段：日期、工序名称、操作类别、完成数、单条工时、开始时间、结束时间等。
4. 执行脚本到目标库 192.168.2.92 / YL_MESDB，只更新存储过程定义，未修改业务表数据。
5. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 20，返回 6 行，层级为 Level=1 物料汇总和 Level=2 订单+工位汇总。
6. 使用 sp_describe_first_result_set 验证结果集字段，确认包含 materialCode、materialDesc、	askDescription、productionOrderNo、station、
eportWorkHours、uxiliaryWorkHours、
eportFinishQty、uxiliaryFinishQty、	otalWorkHours、clampingTime、programTime、operatorNames、
ecordCount。
7. 重写前端 src/views/ProductionManagement/SettlementWorkhours/index.vue：
   - 查询条件精简为生产订单号、物料编码、工位、数据条数、开始日期、结束日期。
   - 表格改为两级树：一级物料汇总，二级生产订单号+工位汇总。
   - 补回任务描述、装夹时间、程序时间列。
   - 删除多余明细列：合同号、产品编码、产品名称、日期、工序、操作类别、完成数、单条工时、开始时间、结束时间。
   - 底部汇总保留报工工时、主辅工时、合计工时。
8. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修正未引入编译错误。

### 修改结果
- 结算工时页面已改为 物料汇总 -> 生产订单号+工位汇总 两级结构。
- 页面已补回任务描述、装夹时间、程序时间。
- 页面多余明细字段已去掉。
- 数据只取 [dbo].[MES_接口_生产计划] 中 单据状态 IS NULL 的结算任务。

### 验证结果
- 目标库存储过程更新：通过。
- 存储过程样本执行：通过。
- 结果集字段验证：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。

## 2026-06-27 17:28:58 修正结算工时程序时间装夹时间和单件工时口径

### 用户反馈
- 程序时间目前没有，默认 0。
- 装夹时间 = 【报工工时（汇总） - 程序时间 * 完工数】 / 完工数。
- 结算报工单件工时 = 报工工时 / 报工完成数。
- 结算辅助单件工时 = 主辅工时 / 辅助完成数。
- 任务描述没了，需要加上。

### 执行过程
1. 修改 db_backups/create_settlement_workhours_query_20260627.sql。
2. 从结算工时存储过程里移除工艺库 准备工时/标准工时 作为装夹时间、程序时间的取值。
3. 将程序时间固定输出为 。
4. 将装夹时间改为公式：CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END。
5. 新增输出字段：
   - settlementReportPieceHours：CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END。
   - settlementAuxiliaryPieceHours：CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END。
6. 保留并输出 	askDescription，由 物料描述 + ' ' + 物料编号 组成，一级和二级都返回该字段。
7. 修改前端 src/views/ProductionManagement/SettlementWorkhours/index.vue：
   - 二级行也显示任务描述。
   - 新增“结算报工单件工时”列。
   - 新增“结算辅助单件工时”列。
   - 绑定新字段 settlementReportPieceHours、settlementAuxiliaryPieceHours。
8. 执行 SQL 脚本到目标库 192.168.2.92 / YL_MESDB，只更新存储过程定义，未修改业务表数据。
9. 执行样本验证 EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 20：
   - 返回任务描述。
   - 程序时间为 0。
   - 装夹时间按公式返回。
   - 返回结算报工单件工时和结算辅助单件工时。
10. 执行 
pm run build，前端构建通过。输出仍有既有资源体积过大和 Browserslist 数据过期警告，本次修正未引入编译错误。

### 修改结果
- 程序时间默认 0。
- 装夹时间改为按汇总公式计算。
- 新增结算报工单件工时、结算辅助单件工时。
- 任务描述在物料汇总层和生产订单号+工位汇总层均显示。

### 验证结果
- 目标库存储过程更新：通过。
- 存储过程样本执行：通过。
- 前端生产构建 
pm run build：通过，仅有既有警告。
## 2026-06-27 17:39:00 修正结算工时二级任务描述和查询性能

### 用户反馈
- 结算工时页面红框位置的二级任务描述需要拼接工序名称和工序顺序。
- 页面打开和查询太慢，需要优化。

### 执行过程
1. 查看当前结算工时页面 `src/views/ProductionManagement/SettlementWorkhours/index.vue`，确认页面只展示接口返回的 `taskDescription`，红框位置对应二级“生产订单号+工位”汇总行。
2. 查看当前 SQL 备份脚本 `db_backups/create_settlement_workhours_query_20260627.sql`，确认任务描述由 `物料描述 + 物料编号` 组成，未带工序名称和订单行号。
3. 修改 `db_backups/create_settlement_workhours_query_20260627.sql`：
   - 在结算明细中保留 `工序名称` 和 `订单行号`。
   - 在二级汇总中增加 `MAX(工序名称) AS 工序名称`、`MAX(订单行号) AS 工序顺序`。
   - 二级 `taskDescription` 改为：`物料描述 + 物料编号 + 工序名称 + ' 序' + 工序顺序`。
   - 一级物料汇总任务描述保持 `物料描述 + 物料编号`。
4. 优化 SQL 查询性能：
   - 将原来按每个明细键反复查询 `[dbo].[View_生产工时视图全部]` 的操作人相关子查询，改为 `明细键 -> 操作人明细 -> 操作人拼接` 的统一聚合。
   - 将订单工位汇总里的操作人相关子查询，改为先按订单工位聚合操作人，再回连到二级汇总，避免汇总行逐行重复扫描。
   - 连接开始时间时使用秒级时间范围匹配，避免对大视图每行做字符串转换匹配。
5. 修改前端页面 `src/views/ProductionManagement/SettlementWorkhours/index.vue`：
   - 将“任务描述”列最小宽度从 280 调整为 380，避免追加工序名称和序号后显示过窄。
6. 第一次执行 SQL 脚本时发现 `sqlcmd -i` 未按 UTF-8 解释中文脚本，数据库误建了一个乱码过程，正式中文过程仍是旧定义。
7. 使用 `sqlcmd -f 65001` 重新执行 UTF-8 脚本到 `192.168.2.92 / YL_MESDB`，正式过程 `dbo.生产管理_结算工时_查询` 更新成功。
8. 确认正式过程定义中已包含 `工序顺序`。
9. 删除本次因编码误建的乱码过程，避免后续排查混淆。
10. 执行抽样验证：
    - `软管总成 214-20411-30-12x1SN-12x4000 电火花 序5`
    - `软管总成 214-20411-30-12x1SN-12x4000 打压检测 序4`
    - 同类二级行已能显示工序名称和工序顺序。
11. 对同样 `@数据条数 = 30` 的抽查计时：
    - 优化前约 17161 ms。
    - 优化后约 1986 ms。
12. 执行 `npm run build`，前端构建通过。输出仍有项目既有的资源体积过大和 Browserslist 数据过期警告，本次修改未引入编译错误。

### 修改结果
- 结算工时页面二级任务描述已拼接工序名称和工序顺序。
- SQL 操作人拼接和订单工位操作人汇总已优化，减少重复扫描。
- 任务描述列宽已加宽。
- 数据库存储过程已同步更新到目标库。

### 验证结果
- 目标库存储过程更新：通过。
- 乱码误建过程清理：通过。
- 样本查询内容验证：通过。
- 样本查询耗时验证：从约 17.1 秒降到约 2.0 秒。
- 前端生产构建 `npm run build`：通过，仅有既有警告。
## 2026-06-27 17:46:00 修正结算工时操作人重复拼接

### 用户反馈
- 结算工时页面的操作人拼接存在重复姓名，需要去重。

### 执行过程
1. 查看 `db_backups/create_settlement_workhours_query_20260627.sql` 中当前操作人拼接逻辑。
2. 确认原逻辑已经对整段 `操作人` 字符串做了 `DISTINCT`，但在订单工位汇总时，如果明细中已有 `张三,李四` 这类拼接字符串，再和其他明细拼接，会出现单个人名重复。
3. 修改 `操作人明细`：
   - 对源字段 `v2.操作人` 先替换中文逗号、顿号为英文逗号。
   - 使用 `STRING_SPLIT` 拆成单个姓名。
   - 去掉姓名前后空格。
   - 过滤空姓名。
   - 再按 `TaskAID + 开始时间 + 操作人` 去重后重新 `STRING_AGG`。
4. 修改 `订单工位操作人`：
   - 对 `结算明细.操作人` 再次按逗号拆分成单个姓名。
   - 按 `物料编号 + 订单号 + 工位名称 + 操作人` 去重。
   - 再重新拼接为最终 `operatorNames`。
5. 使用 `sqlcmd -f 65001` 将脚本同步到目标库 `192.168.2.92 / YL_MESDB`，只更新存储过程定义。
6. 执行抽样验证 `EXEC dbo.[生产管理_结算工时_查询] @数据条数 = 100`：
   - 将返回的 `operatorNames` 再拆分统计重复姓名。
   - 未查出重复姓名行。
   - 样例结果如 `李盛发,王宝昌,魏文海,普1,孙广义`，同一行内姓名不重复。
7. 执行 `npm run build`，前端构建通过。输出仍有项目既有的资源体积过大和 Browserslist 数据过期警告，本次修改未引入编译错误。

### 修改结果
- 操作人拼接已改为按单个姓名去重。
- 支持处理中文逗号、顿号和英文逗号分隔的姓名。
- 数据库存储过程已同步更新到目标库。

### 验证结果
- 目标库存储过程更新：通过。
- 重复姓名抽样检查：通过。
- 前端生产构建 `npm run build`：通过，仅有既有警告。

## 2026-06-29 设备信息维护页面修改

### 用户需求

- 根据 `doc/修改设备信息维护.docx` 修改设备信息维护页面。
- 修改后在 `work` 下创建对应路径，并复制原始文档。
- 在对应路径下新增或修改 `01-项目功能内容`、`02-项目程序开发详细步骤`、`03-推进台账`、`04-任务矩阵`、`05-验收证据`、`06-决策记录`，并增加 README 索引。
- 将完整执行过程追加到 `gptlog-process/gpdlog.md`，日志使用中文。

### 执行过程

1. 查看 `doc` 目录，确认存在 `doc/修改设备信息维护.docx`。
2. 使用 PowerShell 解析 docx 中的 `word/document.xml`，提取需求文本：新增公司编码（财务）、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至；生产用名复用设备名称，规格/型号复用设备型号；公司编码必填且不可修改；工位绑定为工位管理数据多选；证书有效期过期红色置顶，30 天内黄色靠前。
3. 定位目标页面为 `src/views/DeviceManagement/DeviceInformation/index.vue`。
4. 确认工位管理页面 `src/views/SystemMaintenance/WorkstationManagement/index.vue` 使用 `MES_登录_工位与名称_查询` 获取工位数据。
5. 初次用 Windows 集成认证连接 SQL Server 失败，随后根据用户提供的数据库地址、账号和密码，用数据库账号连接 `192.168.2.92 / YL_MESDB` 成功。日志和文档中不记录明文密码。
6. 查询 `dbo.基础数据_设备工位点检表`，确认原表只有旧字段：设备流水号、设备名称、设备型号、制造厂家、工位号、点检表类型、操作日期、保养人员代码、监督人员代码、设备类型。
7. 查询旧存储过程定义，确认 `设备管理_设备信息_查询/增加/编辑` 只处理设备名称、设备型号、设备类型。
8. 重写 `src/views/DeviceManagement/DeviceInformation/index.vue`：表格增加需求字段列；新增/编辑弹窗增加需求字段；公司编码新增必填、编辑禁用；工位绑定使用多选下拉，来源为 `MES_登录_工位与名称_查询`；主要设备、特种设备使用“是/否”下拉；证书有效期至使用日期选择；增加当前页证书有效期排序和行背景色；固定操作列，适配横向多列表格。
9. 新增 `db_backups/update_device_information_maintenance_20260629.sql`：使用 `COL_LENGTH` 可重复执行地增加 14 个新字段；更新 `设备管理_设备信息_查询`，返回新字段并按证书有效期预警排序；更新 `设备管理_设备信息_增加`，写入新字段并校验公司编码不能为空；更新 `设备管理_设备信息_编辑`，更新新字段但不更新公司编码。
10. 使用 `sqlcmd -f 65001` 执行增量脚本到目标库，执行成功。
11. 验证数据库字段：`dbo.基础数据_设备工位点检表` 已存在公司编码、设备信息、使用部门、入账日期、单位、数量、状态、维修记录、维保记录、工位绑定、主要设备、设备标准开机工时、特种设备、证书有效期至。
12. 验证存储过程参数：`设备管理_设备信息_增加` 已包含新增字段参数；`设备管理_设备信息_编辑` 已包含新增字段参数和设备流水号；`设备管理_设备信息_查询` 保持旧查询参数兼容。
13. 执行 `EXEC dbo.[设备管理_设备信息_查询]`，过程执行无错误。
14. 第一次执行 `npm run build` 因 124 秒超时未得到结果；随后使用更长超时时间重跑。
15. 第二次执行 `npm run build` 成功，webpack 编译通过，仅有项目既有资源体积过大和 Browserslist 数据过期警告。
16. 创建 `work/DeviceManagement/DeviceInformation`。
17. 复制 `doc/修改设备信息维护.docx` 到 `work/DeviceManagement/DeviceInformation/修改设备信息维护.docx`。
18. 在工作目录新增 `README.md`、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `db_backups/update_device_information_maintenance_20260629.sql`
- `work/DeviceManagement/DeviceInformation/修改设备信息维护.docx`
- `work/DeviceManagement/DeviceInformation/README.md`
- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md`
- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
- `work/DeviceManagement/DeviceInformation/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 数据库连接：通过。
- 表字段新增：通过。
- 存储过程参数更新：通过。
- 查询过程执行：通过。
- 前端生产构建 `npm run build`：通过，仅有既有警告。

### 下一步

- 登录真实系统页面做人工验收：新增设备、编辑设备、工位多选、公司编码只读、证书有效期颜色和排序。
- 如现场要求历史设备补齐公司编码，需要补充历史数据治理脚本和验收规则。

## 2026-06-29 设备信息维护取消设备类型必填

### 用户需求

- 去掉设备类型必填修改。

### 执行过程

1. 打开 `src/views/DeviceManagement/DeviceInformation/index.vue`。
2. 在表单校验 `rules` 中移除 `设备类型` 必填规则。
3. 保留公司编码新增必填和生产用名必填。
4. 更新 `work/DeviceManagement/DeviceInformation/03-推进台账.md`，追加第 2 轮记录。
5. 更新 `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`，新增 `DI-008A` 任务记录。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 代码层确认设备类型不再配置必填校验。

## 2026-06-29 修复设备信息维护日期编辑报错

### 用户反馈

- 证书有效期和入账日期编辑时报错，无法编辑修改。

### 执行过程

1. 查询目标库 `dbo.基础数据_设备工位点检表`，确认测试数据中 `入账日期` 和 `证书有效期至` 已有日期值。
2. 查看当前前端 `src/views/DeviceManagement/DeviceInformation/index.vue`，确认两个日期字段由 `el-date-picker` 以 `yyyy-MM-dd` 字符串提交。
3. 查看当前 `设备管理_设备信息_编辑` 存储过程，确认 `@入账日期`、`@证书有效期至` 定义为 `date` 类型。
4. 判断问题原因：通用前端网关提交日期和空值时容易与 SQL Server `date` 参数转换冲突，尤其编辑清空日期时会报错。
5. 修改前端页面：新增 `dateParam` 方法，两个日期字段提交时传 `yyyy-MM-dd` 字符串或空字符串，不再传 `null`。
6. 新增数据库修复脚本 `db_backups/fix_device_information_date_edit_20260629.sql`。
7. 修复脚本调整 `设备管理_设备信息_增加/编辑`：
   - `@入账日期` 改为 `nvarchar(50)`。
   - `@证书有效期至` 改为 `nvarchar(50)`。
   - 写入表时使用 `TRY_CONVERT(date, NULLIF(@入账日期, N''))`。
   - 写入表时使用 `TRY_CONVERT(date, NULLIF(@证书有效期至, N''))`。
8. 使用 `sqlcmd -f 65001` 执行修复脚本到 `192.168.2.92 / YL_MESDB`，执行成功。
9. 查询 `sys.parameters`，确认 `设备管理_设备信息_增加/编辑` 的两个日期参数已变更为 `nvarchar`。
10. 直接执行 `设备管理_设备信息_编辑` 测试正常日期：传入 `2026-07-01` 和 `2026-07-31`，返回 `result=1`，数据库日期更新成功。
11. 直接执行 `设备管理_设备信息_编辑` 测试清空日期：传入空字符串，返回 `result=1`，数据库日期字段保存为 `NULL`。
12. 更新工作目录文档：推进台账、任务矩阵、验收证据。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `db_backups/fix_device_information_date_edit_20260629.sql`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 修复 SQL 执行：通过。
- 日期参数类型验证：通过，已为 `nvarchar`。
- 正常日期编辑验证：通过。
- 清空日期编辑验证：通过，日期保存为 `NULL`。

### 补充验证

- 执行 `npm run build`，前端生产构建通过。
- webpack compiled with 2 warnings，仍为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期警告。

## 2026-06-29 修复设备信息维护日期控件点击报错

### 用户反馈

- 点击修改入账日期或证书有效期时报错：`TypeError: date.getHours is not a function`。
- 报错来自 Element UI 日期组件 `DateTable`，说明日期控件内部拿到的不是 `Date` 对象。

### 执行过程

1. 查看 `src/views/DeviceManagement/DeviceInformation/index.vue`，确认两个 `el-date-picker` 使用了 `value-format="yyyy-MM-dd"`，并且编辑回填时给表单日期字段赋值为字符串。
2. 判断原因：Element UI 的日期面板点击逻辑需要 `Date` 对象参与内部时间修改，当前字符串值导致 `date.getHours is not a function`。
3. 修改两个日期控件：去掉 `value-format="yyyy-MM-dd"`，让 `v-model` 保持 `Date` 对象。
4. 修改编辑回填：`入账日期` 和 `证书有效期至` 改为调用 `parseDateValue`，将数据库日期转换为本地 `Date` 对象。
5. 保留提交兼容：`dateParam` 在提交前将 `Date` 对象格式化成 `yyyy-MM-dd` 字符串，继续兼容已修复的数据库过程。
6. 执行 `npm run build`，前端构建通过。
7. 更新工作目录中的推进台账、任务矩阵和验收证据。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 两个日期控件已移除 `value-format`。
- 编辑回填日期已转换为 `Date` 对象。
- 提交前仍格式化为 `yyyy-MM-dd` 字符串。
- `npm run build` 通过，仅有项目既有资源体积和 Browserslist 过期警告。

## 2026-06-29 修复设备信息维护编辑弹窗日期不回填

### 用户反馈

- 数据库有值，列表也有值，只是点击编辑时 `入账日期` 和 `证书有效期至` 读不到，显示为空。

### 执行过程

1. 查询数据库 `dbo.基础数据_设备工位点检表`，发现上一轮为了验证清空日期，测试记录 `设备流水号=1` 的两个日期被置为 `NULL`。
2. 根据用户说明数据库和列表实际有值，判断问题仍集中在前端 `handleEdit` 日期回填。
3. 恢复测试记录日期：`入账日期=2026-07-01`，`证书有效期至=2026-07-31`。
4. 增强 `formatDate`，兼容 `yyyy-MM-dd`、`yyyy-MM-dd HH:mm:ss`、`yyyy/MM/dd`、`/Date(...)` 等后端可能返回格式。
5. 增强 `parseDateValue`，支持直接传入 `Date` 对象，也支持通过 `formatDate` 解析字符串后生成本地 `Date` 对象。
6. 将表单默认日期从空字符串调整为 `null`，符合 Element UI 日期控件空值约定。
7. 修改编辑回填逻辑：不再整体替换 `this.form`，改为逐字段 `$set`，避免 Element Form 字段状态缓存导致日期控件未刷新。
8. 在 `dialogFormVisible = true` 后通过 `$nextTick` 再次设置 `入账日期` 和 `证书有效期至`，防止被 `resetFields` 或弹窗初始化覆盖。
9. 使用 Node 脚本验证多种日期格式均能解析为有效 `Date`。
10. 执行 `npm run build`，前端构建通过，仅有既有资源体积和 Browserslist 过期警告。
11. 确认本地 dev server 已运行在 `https://127.0.0.1:1997/`。命令行访问被自签名证书拦截，浏览器打开时需要允许证书后测试。
12. 更新工作目录中的推进台账、任务矩阵和验收证据。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 数据库测试记录日期恢复：通过。
- 本地日期解析函数测试：通过。
- 前端生产构建 `npm run build`：通过，仅有既有警告。
- 本地页面地址：`https://127.0.0.1:1997/`。

## 2026-06-29 新增设备名称字段并导入设备信息 Excel

### 用户反馈

- 用户要求新增字段“设备名称”。
- 用户要求将 `doc` 下的设备信息数据插入数据库。
- 用户补充说明数据文件为 `设备信息.xlsx`。
- 用户要求继续执行。

### 执行过程

1. 检查 `doc/设备信息.xlsx`，确认 Sheet1 表头为：`名称`、`公司编码`、`生产用名`、`型号/规格`、`设备信息`、`使用部门`、`入账日期`、`单位`、`数量`、`状态`。
2. 读取 Excel 数据，确认有效数据共 89 行。
3. 查询目标数据库 `192.168.2.92 / YL_MESDB`，确认 `dbo.基础数据_设备工位点检表` 当时为空。
4. 明确字段映射：Excel `名称` 保存到新增数据库字段 `名称`，页面显示为“设备名称”；Excel `生产用名` 保存到原字段 `设备名称`，页面显示为“生产用名”。
5. 修改 `src/views/DeviceManagement/DeviceInformation/index.vue`：
   - 列表新增“设备名称”列，绑定 `名称`。
   - 新增/编辑弹窗新增“设备名称”输入框，绑定 `form.名称`。
   - `emptyForm` 增加 `名称`。
   - 编辑回填增加 `名称`。
   - 新增/编辑提交参数增加 `名称`。
6. 生成 `db_backups/add_device_name_and_import_excel_20260629.sql`：
   - 表 `dbo.基础数据_设备工位点检表` 不存在 `名称` 字段时新增该字段。
   - 调整 `设备管理_设备信息_增加` 和 `设备管理_设备信息_编辑`，增加 `@名称` 参数。
   - 使用 `MERGE` 按 `公司编码` 导入或更新 Excel 数据，避免重复导入生成重复记录。
7. 执行导入脚本，数据库导入后设备信息总数为 89。
8. 抽样检查发现 Excel 日期对象导入后部分 `入账日期` 早一天，例如 `1/1/07` 被保存为 `2006-12-31`。
9. 根据 Excel 单元格显示值重新生成 `db_backups/fix_device_excel_import_dates_20260629.sql`，并执行日期修正。
10. 修正后抽样验证：
    - `REALLY-11` 入账日期为 `2007-01-01`。
    - `REALLY-6` 入账日期为 `2008-12-24`。
    - `REALLY-1` 入账日期为 `2011-01-01`。
11. 检查新增过程文本，发现“公司编码不能为空”提示在首次脚本生成时变成问号文本。
12. 使用 `apply_patch` 修正导入脚本里的提示文本，并新增 `db_backups/fix_device_add_company_code_message_20260629.sql`，只重新发布新增过程，不重新执行整份导入脚本，避免覆盖已修正日期。
13. 执行提示文本修正脚本，确认新增过程可返回中文提示。
14. 复制 `doc/设备信息.xlsx` 到 `work/DeviceManagement/DeviceInformation/设备信息.xlsx` 作为工作副本。
15. 更新 `work/DeviceManagement/DeviceInformation` 下的 README、01-项目功能内容、02-项目程序开发详细步骤、03-推进台账、04-任务矩阵、05-验收证据、06-决策记录。
16. 执行 `npm run build`，前端构建通过，仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。

### 修改文件

- `src/views/DeviceManagement/DeviceInformation/index.vue`
- `db_backups/add_device_name_and_import_excel_20260629.sql`
- `db_backups/fix_device_excel_import_dates_20260629.sql`
- `db_backups/fix_device_add_company_code_message_20260629.sql`
- `work/DeviceManagement/DeviceInformation/设备信息.xlsx`
- `work/DeviceManagement/DeviceInformation/README.md`
- `work/DeviceManagement/DeviceInformation/01-项目功能内容.md`
- `work/DeviceManagement/DeviceInformation/02-项目程序开发详细步骤.md`
- `work/DeviceManagement/DeviceInformation/03-推进台账.md`
- `work/DeviceManagement/DeviceInformation/04-任务矩阵.md`
- `work/DeviceManagement/DeviceInformation/05-验收证据.md`
- `work/DeviceManagement/DeviceInformation/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- Excel 有效数据行数：89。
- 数据库设备信息总数：89。
- `名称` 字段已存在并用于页面“设备名称”。
- Excel `生产用名` 继续保存到原 `设备名称` 字段。
- 日期修正后样例数据正确。
- 新增过程提示文本已修正为“公司编码不能为空”。
- `npm run build` 通过，仅有既有警告。

## 2026-06-29 新增及时齐套跟踪结果页面

### 用户需求

- 根据 `doc/新增及时齐套跟踪结果.docx` 新增页面“及时齐套跟踪结果”。
- 修改后在 `work` 下创建对应路径并复制原始文档。
- 在对应路径新增或修改 `01-项目功能内容`、`02-项目程序开发详细步骤`、`03-推进台账`、`04-任务矩阵`、`05-验收证据`、`06-决策记录` 和 README 索引。
- 将完整执行过程使用中文追加到 `/gptlog-process/gpdlog.md`。

### 执行过程

1. 在 `doc` 目录查找需求文档，确认真实文件为 `doc/新增及时齐套跟踪结果.docx`。
2. 将 docx 临时复制为 zip 并解包读取 `word/document.xml`，提取需求正文。
3. 从需求中确认：
   - 一级数据字段按计划用表页面一致。
   - 过滤条件和计划用表页面一致。
   - 二级绿色数据来自 `SAP.SBO_YL.dbo.VIEW_Jijiankukc`。
   - 二级字段包括物料编码、物料名称、缺件数量、属性、生产订单号、进度、工艺路线、预计完成时间。
4. 查找现有页面，确认“计划用表”为 `src/views/PlanManagement/PlanShell/index.vue`，使用过程 `计划排产_查询计划信息`。
5. 查找“生产计划跟踪”为 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`，复用其当前序和工艺路线展示思路。
6. 查询数据库菜单表，确认“计划用表”挂在 `PlanManagement` 下，因此新页面也放在 `PlanManagement` 模块。
7. 查询 SAP linked server，确认可通过 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 访问 SAP 缺件视图。
8. 查询 SAP 视图字段，确认存在 `ItemCode`、`U_Name`、`属性`、`未发货数量`、`在制采购`、`采购员`、`采购预计交货日期`、`采购未清数量`、`到货草稿`。
9. 查询 MES 视图字段，确认 `View_生产订单_MES` 可提供计划号、合同号、订单编号、物料编号、物料描述、计划数量、计划完成、计划开始时间、计划完成时间、齐套、发料状态、拣配状态、自制件属性、任务状态、加工状态、进度等字段。
10. 新增 `db_backups/create_timely_kit_tracking_result_20260629.sql`，创建或更新 `dbo.生产管理_及时齐套跟踪结果_查询`。
11. 新过程按计划用表参数接收筛选条件，并将 SAP 缺件数据与 MES 生产计划匹配：
    - 机加件：`SAP.ItemCode = MES.物料编号`。
    - 装配件：`SAP.ItemCode + SAP.Project = MES.物料编号 + MES.合同号`。
    - 外购件：属性为空，生产订单号取 SAP `在制采购`，工艺路线列拼接采购信息和质检状态。
12. 首次执行查询过程取样时，SQL Server 报 `QUOTED_IDENTIFIER` SET 选项错误。
13. 修改 SQL 脚本，增加 `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON`，重新发布过程。
14. 再次执行取样查询，确认过程可返回 SAP 缺件和 MES 计划组合数据。
15. 新增 `db_backups/add_timely_kit_tracking_result_menu_20260629.sql`。
16. 执行菜单脚本，按“计划用表”的角色授权复制新增菜单，生成 4 条“及时齐套跟踪结果”菜单记录。
17. 新增前端页面 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`：
    - 过滤区参考计划用表。
    - 主表展示一级计划字段。
    - 展开行展示二级缺件跟踪数据。
    - 二级明细行使用浅绿色背景。
    - 状态字段使用绿色/橙色标签样式。
18. 执行 `npm run build`，构建通过，仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。
19. 创建 `work/PlanManagement/TimelyKitTrackingResult`。
20. 复制 `doc/新增及时齐套跟踪结果.docx` 到工作目录。
21. 新增 README、01-项目功能内容、02-项目程序开发详细步骤、03-推进台账、04-任务矩阵、05-验收证据、06-决策记录。

### 修改文件

- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `db_backups/create_timely_kit_tracking_result_20260629.sql`
- `db_backups/add_timely_kit_tracking_result_menu_20260629.sql`
- `work/PlanManagement/TimelyKitTrackingResult/新增及时齐套跟踪结果.docx`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md`
- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- SAP linked server 取样查询：通过。
- `dbo.生产管理_及时齐套跟踪结果_查询` 执行：通过。
- 菜单脚本执行：通过，新增 4 条菜单记录。
- 前端构建 `npm run build`：通过，仅有既有警告。

## 2026-06-29 修正及时齐套跟踪结果页面反馈问题

### 用户反馈

1. 工艺路线缺少日期行和合格行，且没有颜色。
2. 二级数据里面存在重复数据，不应该出现生产订单号一样的数据。
3. 属性为空时代表外购，一级数据不对，应该取 SAP 视图 `DocEntry` 作为订单编号，再按照计划用表查询。

### 执行过程

1. 复查 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`，确认二级明细原先只把工艺路线作为文本展示，不能展示日期行、工序行、合格行和状态颜色。
2. 复查 `db_backups/create_timely_kit_tracking_result_20260629.sql`，确认 SAP 缺件数据与 MES 计划数据匹配时，属性为空的外购数据仍可能使用在制采购号，导致一级计划数据取值不符合反馈要求。
3. 查询样例订单 `7134`，确认同一个缺件生产订单号在二级明细中会重复出现。
4. 查询样例订单 `7335`，确认该外购场景需要使用 SAP 视图 `DocEntry=7335` 作为订单编号匹配计划用表数据。
5. 修改 SQL 查询过程脚本：
   - 新增 SAP 缺件源数据去重，按 `DocEntry + Project + ItemCode + 属性` 保留一条。
   - 外购属性为空时，一级订单编号改为优先使用 `SAP.DocEntry`。
   - 外购属性为空时，MES 计划用表匹配条件增加 `MES.订单编号 = SAP.DocEntry`。
   - 新增 `工艺路线明细` JSON 字段，返回工序名称、计划开始时间、计划完成时间、进度、完成数量、收检合格数、收检不合格数、加工状态等页面渲染所需数据。
   - 最终结果增加按 `订单号 + 缺件生产订单号` 的去重层，避免同一生产订单号在二级明细重复出现。
6. 重新执行 `db_backups/create_timely_kit_tracking_result_20260629.sql`，发布查询过程成功。
7. 修改前端页面：
   - 二级列“工艺路线/采购状态”增加自制件工艺路线 HTML 渲染。
   - 工艺路线渲染为三行结构：日期行、工序行、合格行。
   - 根据工序进度和加工状态增加绿色、蓝色、橙色、红色样式。
   - 外购件仍展示采购状态文本。
   - 前端合并数据时增加二级明细去重，避免接口数据异常时重复展示同一生产订单号。
8. 更新工作目录文档：
   - `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
   - `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
   - `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
   - `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`

### 修改文件

- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `db_backups/create_timely_kit_tracking_result_20260629.sql`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 重新发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
- 查询 `@订单号=7134` 时，同一缺件生产订单号 `7134` 的二级明细只返回 1 条，不再重复。
- 查询 `@订单号=7335` 时，外购一级数据已按 `SAP.DocEntry=7335` 匹配到计划用表数据。
- 执行 `npm run build` 通过，仅保留项目已有的资源体积过大和 Browserslist/caniuse-lite 过期警告。

### 下一步

- 登录页面人工查看展开行效果，重点确认工艺路线日期行、工序行、合格行和颜色是否与业务预期一致。

## 2026-06-29 继续修正及时齐套跟踪结果外购和主数据问题

### 用户反馈

1. 属性为空的外购数据应取 SAP 视图的采购员、采购未清数量、到货草稿，并根据到货草稿匹配采购入库检页面的生产订单读取检验状态。
2. 第 32 行主数据生产订单号 `2007` 的一级数据是正确参照；前 1-10 行不正确，主数据缺件不应是主数据自身，且主数据产品编码后面的字段不应为空。

### 执行过程

1. 复查 `db_backups/create_timely_kit_tracking_result_20260629.sql`，确认上一版把一级主数据和二级缺件匹配混在同一个 `v` 里。
2. 定位到问题来源：SQL 使用 `COALESCE(v.订单编号, sap.DocEntry)`、`COALESCE(v.物料编号, sap.ItemCode)`、`COALESCE(v.物料描述, sap.U_Name)` 作为主数据兜底，导致 SAP 缺件在没有匹配到计划用表时也会生成主表行。
3. 查询 `@订单号=2007`，确认一级主数据完整，但外购缺件生产订单号显示成主订单号 `2007`，业务含义错误。
4. 查看采购入库检页面 `src/views/QualityManagement/CheckTask/purchaseIncoming.vue`，确认查询过程为 `质量管理_质量检验_入库质检任务_查询`，页面生产订单字段来自 `质量检验_质检任务_SAP.订单编号`。
5. 查看 `doc_old/fix_质量管理_入库质检任务_查询.sql`，确认采购入库检状态按 `质量检验_质检任务_SAP.入库数量` 和 `YL_质量检验_质检记录.检验数量` 判断。
6. 修改查询过程：
   - 一级主数据只按 `SAP.DocEntry = View_生产订单_MES.订单编号` 匹配。
   - 删除主数据字段对 SAP 缺件字段的兜底。
   - 新增 `detail_order`，仅用于自制缺件匹配二级生产订单、工艺路线和进度。
   - 外购缺件生产订单号改为 `SAP.到货草稿`；到货草稿为 0 时留空。
   - 外购质检状态改为 `SAP.到货草稿 -> 质量检验_质检任务_SAP.订单编号 -> YL_质量检验_质检记录` 口径。
   - 非外购质检状态保持为空。
7. 重新发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
8. 验证 `@订单号=2007`：一级主数据完整，外购缺件生产订单号不再等于 `2007`。
9. 验证 `@订单号=7321`：外购缺件到货草稿 `11209` 显示为缺件生产订单号，质检状态为未完成。
10. 默认查询统计：总行数 198，产品编码/产品名称为空行数 0，缺件生产订单号等于主订单号行数 0，非外购质检状态非空行数 0。
11. 执行 `npm run build`，构建通过，仅保留项目既有 warning。
12. 删除临时验证脚本 `db_backups/verify_timely_kit_tracking_result_temp_20260629.sql`。
13. 更新 `work/PlanManagement/TimelyKitTrackingResult` 下推进台账、任务矩阵、验收证据、决策记录，并追加本日志。

### 修改文件

- `db_backups/create_timely_kit_tracking_result_20260629.sql`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 查询过程发布成功。
- `@订单号=2007`：一级主数据完整，外购缺件生产订单号不再等于 `2007`。
- `@订单号=7321`：外购缺件按到货草稿 `11209` 显示缺件生产订单号，质检状态来自采购入库检口径。
- 默认查询统计：总行数 198，产品编码/产品名称为空行数 0，缺件生产订单号等于主订单号行数 0，非外购质检状态非空行数 0。
- `npm run build` 通过，仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。

## 2026-06-30 修正及时齐套跟踪结果库存数量、采购员和工艺路线样式

### 用户反馈

1. `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 页面二级数据需要在缺件数量后增加库存数量字段，库存数量在 SAP 里有。
2. 去掉拼接的采购员字段。
3. 工艺路线需要左对齐，当前间隔偏大。
4. 工艺路线颜色参考生产计划跟踪页面，使用红、蓝、绿，不使用橙色。
5. 所有改动按昨日方式维护 01-06 文档、README 索引、推进台账、任务矩阵、验收证据、决策记录，并追加总日志。

### 执行过程

1. 读取目标页面 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`，确认二级明细已有缺件数量、采购员列，以及本页自定义工艺路线样式。
2. 读取参考页面 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`，确认生产计划跟踪的工艺路线为左对齐、紧凑间距、红/蓝/绿文字配色。
3. 修改前端页面：
   - 在二级明细“缺件数量”后新增“库存数量”列。
   - 在 `mergeRows` 中新增 `库存数量: this.formatQuantity(row.库存数量)`。
   - 删除二级明细“采购员”列和 `采购员` 映射。
   - 工艺路线名称只显示工序名称，不再拼接指派对象。
   - 删除橙色状态判断和橙色样式。
   - 调整 `.process-route` 相关样式为左对齐、缩小箭头和单元格间距、红/蓝/绿三色。
4. 连接数据库 `192.168.2.92 / YL_MESDB`，读取 SAP 视图字段列表，确认 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 包含 `库存量` 字段。
5. 新增数据库增量脚本 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`，不覆盖 20260629 历史脚本。
6. 修改增量脚本：
   - 在 `SAP缺件源` 中增加 `ISNULL(s.[库存量], 0) AS 库存数量`。
   - 在查询结果中输出 `sap.[库存数量] AS [库存数量]`。
   - 最终 SELECT 输出 `[库存数量]`。
   - 删除 `sap.[采购员]` 输出。
   - 外购采购状态文本从 `采购员 + 未清数量 + 到货草稿 + 质检状态` 改为 `未清数量 + 到货草稿 + 质检状态`。
7. 执行 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` 发布过程，发布成功。
8. 验证 `@订单号=2007`，返回缺件 `24112-011-HY-WF50L`，缺件数量 `78`，库存数量 `27`，结果列不再包含采购员。
9. 验证 `@订单号=7321`，返回缺件 `XX-YG01013990`，缺件数量 `6`，库存数量 `2`，外购采购状态不再包含采购员。
10. 执行过程定义检查，结果为“有库存数量 / 未拼接采购员”。
11. 曾尝试用 `OPENQUERY([LOCALSERVER], ...)` 做辅助落表验证，但数据库未配置 `LOCALSERVER` linked server，该无效命令不作为验收证据，已用过程样例和定义检查替代。
12. 执行 `npm run build`，构建通过，仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。
13. 更新 README、01-06 文档、推进台账、任务矩阵、验收证据、决策记录，并追加本日志。

### 修改文件

- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md`
- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- SAP 视图字段确认：`VIEW_Jijiankukc` 包含 `库存量`。
- SAP 视图取样：`DocEntry=2007`、`ItemCode=24112-011-HY-WF50L`、`未发货数量=78`、`库存量=27`。
- 查询过程发布成功。
- `@订单号=2007` 返回 `库存数量=27`。
- `@订单号=7321` 返回 `库存数量=2`。
- 过程定义检查：有 `库存数量`，未拼接 `采购员:`。
- `npm run build` 通过，仅有项目既有 warning。

### 下一步

- 登录系统人工验收“及时齐套跟踪结果”展开行，确认库存数量位置、外购采购状态文本、工艺路线左对齐和红/蓝/绿颜色符合现场预期。

## 2026-06-30 修正及时齐套跟踪结果 7134 工艺路线判色

### 用户反馈

- 当前页二级数据 `7134` 的工艺路线颜色仍有问题：当前页显示一个蓝色两个红色，生产计划跟踪显示两个蓝色一个红色。

### 执行过程

1. 对比当前页 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 和生产计划跟踪 `src/views/ProductionManagement/ProductionPlanTrack/index.vue` 的工艺路线判色函数。
2. 查询数据库确认 `7134` 工艺数据：
   - 打磨：加工状态 `6`，收检合格数 `6`。
   - 打压检测：加工状态为空，收检合格数 `6`。
   - 喷塑：外协，收检合格数 `0`。
3. 确认差异原因：当前页旧逻辑按进度、计划数量、完成数量或收检数量达到计划数量判蓝；生产计划跟踪按加工状态 `6/3` 或 `收检合格数 > 0` 判蓝。
4. 修改当前页判色逻辑：
   - 新增 `isBlueProcess`，与生产计划跟踪一致。
   - 新增 `isGreenProcess`，与生产计划跟踪外协绿色口径一致。
   - 新增 `getProcessBaseClass` 和 `getOutsourceGroupClassState`，复用生产计划跟踪的外协连续分组判色口径。
   - `formatProcessRoute` 改为基于 `outsourceGroupClasses` 获取颜色。
5. 本地模拟 `7134` 判色结果：`step1:process-route-blue,step2:process-route-blue,step3:process-route-red`。
6. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
7. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。

### 修改文件

- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- SQL 验证 `7134` 的第二道工序“打压检测”有 `收检合格数=6`。
- 本地判色模拟结果为两个蓝色、一个红色。
- 当前页无 `process-route-orange`。
- `npm run build` 通过，仅有项目既有 warning。

### 下一步

- 登录页面展开 `7134`，确认当前页工艺路线颜色与生产计划跟踪一致。

## 2026-06-30 恢复外购采购状态采购员拼接

### 用户反馈

- 还原字段拼接采购员部分。
- 不要单独的采购员列。

### 执行过程

1. 确认前端 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 当前没有单独采购员列。
2. 修改最新过程脚本 `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`：
   - 在 `SAP缺件源` 中重新读取 `s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员`。
   - 外购 `工艺路线/采购状态` 文本改为 `采购员:xxx / 未清数量:xxx / 到货草稿:xxx / 质检状态:xxx`。
   - 不在最终 SELECT 中输出单独 `采购员` 字段。
3. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
4. 查询 `@订单号=7321` 验证：
   - 缺件生产订单号为 `4111`，来自 SAP `在制采购`。
   - 工艺路线/采购状态为 `采购员:张丹 / 未清数量:50 / 到货草稿:11209 / 质检状态:未完成`。
   - 预计完成时间为 `2026-06-25`，来自 SAP `采购预计交货日期`。
5. 使用 `sys.dm_exec_describe_first_result_set_for_object` 检查结果集列，确认没有单独 `采购员` 列。
6. 使用 `Select-String` 检查前端页面，确认没有 `label="采购员"` 或 `prop="采购员"`。
7. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
8. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。

### 修改文件

- `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 查询过程发布成功。
- `@订单号=7321` 外购采购状态已包含 `采购员:张丹`。
- 结果集无单独 `采购员` 列。
- 前端无单独采购员列。
- `npm run build` 通过，仅有项目既有 warning。

### 下一步

- 登录页面确认外购采购状态文本显示采购员，且二级表没有单独采购员列。

## 2026-06-30 自制缺件显示所有匹配生产订单

### 用户反馈

- 同一个生产订单号不要出现重复。
- 同一缺件物料所有匹配生产订单都显示。

### 执行过程

1. 排查 `@订单号=4222` 当前结果，确认旧过程只返回二级生产订单 `5960` 或 `7142` 中的一条。
2. 查询 SAP 缺件视图，确认 `4222` 的缺件物料为 `22-103-060-YDZF-20V1.0-4.1`，`DocNum=5960`。
3. 查询 MES 生产订单，确认同一缺件物料同时存在 `5960` 和 `7142` 两个生产订单。
4. 定位旧逻辑问题：`detail_order` 使用 `SELECT TOP (1)`，天然只能显示一个匹配生产订单。
5. 新增脚本 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`。
6. 修改 `detail_order`：
   - 去掉自制件匹配的 `TOP (1)` 单行限制。
   - 使用 `ROW_NUMBER() OVER (PARTITION BY m.[订单编号] ORDER BY m.[订单行号])`，确保同一生产订单号只保留一条代表行。
   - 同一缺件物料匹配到的多个不同生产订单全部返回。
7. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
8. 验证 `@订单号=4222` 返回两条二级数据：`5960` 和 `7142`，且同一生产订单号不重复。
9. 更新 README、推进台账、任务矩阵、验收证据、决策记录和总日志。

### 修改文件

- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果

- 查询过程发布成功。
- `@订单号=4222` 二级数据返回 `5960` 和 `7142`。
- 同一生产订单号没有重复。
- `5960` 显示 13 道工艺路线，`7142` 显示 4 道工艺路线。

### 下一步

- 登录页面展开 `4222`，确认二级数据同时显示所有匹配生产订单且不重复。

## 2026-06-30 11:47:54 复核同缺件物料多生产订单显示

### 复核内容
- 按用户最新口径确认：同一个生产订单号不要出现重复，同一缺件物料所有匹配生产订单都显示。

### 验证结果
- 执行 `EXEC dbo.[生产管理_及时齐套跟踪结果_查询] @订单号 = 4222`。
- 二级数据中缺件物料 `22-103-060-YDZF-20V1.0-4.1` 当前同时返回生产订单 `5960` 和 `7142`。
- 同一生产订单号未重复出现。

## 2026-06-30 生产订单关闭无工时可关闭处理

### 用户反馈
- `dbo.计划排产_生产订单关闭_查询全部订单` 的“可关闭”查询以工时为基准。
- 当前只能查出全部校验的工时再筛选。
- 特殊情况：没有工时记录，但满足其他条件的订单也需要进入可关闭处理。

### 执行过程
1. 读取线上过程定义，确认“可关闭”分支以 `dbo.View_生产工时视图` 为主表。
2. 核对页面 `src/views/PlanManagement/PlannOrderClose/index.vue`，确认默认查询为“可关闭 + 机加”。
3. 核对 `MES_接口_生产计划`、`View_生产工时视图` 字段，确认可从生产计划补充无工时订单。
4. 查询样例，确认 `7410` 无工时，但计划数量、入库数量、终检合格数均为 `1`，单据状态为空，属性为机加件。
5. 新增脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`。
6. 将“可关闭”分支调整为有工时订单和无工时满足条件订单合并：
   - 有工时订单继续要求全部工时校验。
   - 无工时订单免工时校验，但保留原可关闭条件。
7. 初版全量查询超时后，改为先写入 `#工时订单` 临时表，再判断无工时，避免重复展开复杂视图。
8. 发布存储过程成功。
9. 验证 `@订单号=7410, @单据状态=可关闭, @属性=机加` 可返回。
10. 验证默认“可关闭 + 机加”查询约 `0.56` 秒返回，并命中 `7280`、`7409`、`7410`。

### 修改文件
- `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
- `work/PlanManagement/PlannOrderClose/README.md`
- `work/PlanManagement/PlannOrderClose/01-项目功能内容.md`
- `work/PlanManagement/PlannOrderClose/02-项目程序开发详细步骤.md`
- `work/PlanManagement/PlannOrderClose/03-推进台账.md`
- `work/PlanManagement/PlannOrderClose/04-任务矩阵.md`
- `work/PlanManagement/PlannOrderClose/05-验收证据.md`
- `work/PlanManagement/PlannOrderClose/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 数据库过程发布成功。
- 无工时订单 `7410` 可进入可关闭结果。
- 默认“可关闭 + 机加”查询未超时，约 `0.56` 秒返回。

## 2026-06-30 新增产品合格率(工位)页面

### 用户反馈
- 查看 `doc/新增产品合格率.docx`。
- 根据文档新增页面 `产品合格率(工位)`。

### 执行过程
1. 解包并读取 `doc/新增产品合格率.docx`，确认页面放在生产管理下。
2. 读取文档截图和文字，确认一级字段为关闭日期、生产订单号、物料名称、物料编码、计划数量、完成数量、不良数量、合格率。
3. 确认二级字段为工序、工序号、工位、完工数量、不良数量、合格率、检验说明。
4. 查询 `dbo.YL_质量检验_质检记录` 字段，确认生产订单号为 `计划号`，订单行号为 `行号`，工位字段为 `工位名称`。
5. 查询 SAP 视图 `SBO_YL.dbo.UBT_OWOR`，确认关闭日期字段为 `实际结算日期`，已关闭口径为 `单据状态 IS NOT NULL`。
6. 新增查询脚本 `db_backups/create_product_pass_rate_workstation_20260630.sql`。
7. 初版四段名跨库查询较慢，改为 `OPENQUERY([SAP], ...)` 将 SAP 已关闭订单先取到本地临时表。
8. 新增菜单脚本 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`，写入生产管理下 `产品合格率(工位)` 菜单。
9. 新增前端页面 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`，实现查询区、主表、展开二级明细和合格率颜色。
10. 发布查询过程和菜单脚本。
11. 验证样例 `@生产订单号=7649` 返回一级汇总和二级明细。
12. 执行 `npm run build`，构建通过。

### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 查询过程 `dbo.生产管理_产品合格率工位_查询` 发布成功，修改时间 `2026-06-30 14:31:00.690`。
- 菜单写入 `12` 条角色记录，ID 范围 `236-247`。
- 近 7 天查询返回 `175` 行，耗时约 `0.37` 秒。
- 空条件查询自动限定近 30 天，返回 `1420` 行，耗时约 `1.17` 秒。
- `npm run build` 通过，仅有项目既有 warning。

## 2026-06-30 产品合格率(工位)默认不查询和合格状态筛选

### 用户反馈
- 默认进来不查询数据。
- 增加合格和不合格筛选。
- 主数据合格率小于 `100` 的为不合格。
- 默认不合格。

### 执行过程
1. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`，新增 `@合格状态` 参数。
2. 查询结果按主数据合格率过滤：`合格` 为大于等于 `100`，`不合格` 为小于 `100`，`全部` 不过滤。
3. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`，删除页面创建时自动查询。
4. 查询区新增“合格状态”下拉，默认值为 `不合格`。
5. 查询时向过程传入 `合格状态`。
6. 发布查询过程成功。
7. 验证近 30 天筛选结果：不合格 `50` 行，合格 `1370` 行，全部 `1420` 行。
8. 执行 `npm run build`，构建通过。

### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 页面进入不再自动查询。
- 合格状态默认 `不合格`。
- 不合格筛选最高合格率为 `99.99`，符合小于 `100` 的判定。
- `npm run build` 通过，仅有项目既有 warning。

## 2026-06-30 产品合格率(工位)关闭日期拆分

### 用户反馈
- 关闭日期筛选拆成两个筛选。
- 客户不习惯一次选两个日期。

### 执行过程
1. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`。
2. 将原 `daterange` 日期范围选择器拆成两个独立 `date` 日期选择器。
3. 前端字段改为 `searchForm.closeDateStart` 和 `searchForm.closeDateEnd`。
4. 查询参数仍然使用 `关闭日期_Start` 和 `关闭日期_End`，数据库过程无需修改。
5. 执行 `npm run build`，构建通过。
6. 更新产品合格率 README/01-05 文档和总日志。

### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- `npm run build` 通过，仅有项目既有 warning。
- 数据库过程无需重新发布。

## 2026-06-30 产品合格率(工位)修正工序号来源

### 用户反馈
- 工序号为什么都是空。
- 工序号应取 `dbo.MES_接口_生产计划_生产任务.订单行号`。
- 该表中订单行号肯定不会为空。

### 执行过程
1. 查询 `dbo.MES_接口_生产计划_生产任务` 字段，确认存在 `AID`、`订单编号`、`订单行号`、`工序名称`、`指派对象`。
2. 查询样例数据，确认 `订单行号` 在生产任务表中有值。
3. 定位原脚本中工序号来源为 `COALESCE(View_生产订单_MES.订单行号, 质检记录.行号)`。
4. 确认质检记录的 `TaskAID` 对应生产任务表的 `AID`。
5. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`：
   - 明细关联表改为 `dbo.MES_接口_生产计划_生产任务`。
   - 关联条件改为 `q.TaskAID = t.AID`。
   - 工序号改为 `COALESCE(t.订单行号, q.行号)`。
   - 工序和工位补值也改为优先使用生产任务表的 `工序名称`、`指派对象`。
6. 发布 `dbo.生产管理_产品合格率工位_查询` 成功。
7. 验证 `7649` 二级明细工序号为 `1`、`2`、`3`。
8. 验证近 30 天 `3281` 条二级明细中空工序号为 `0`。

### 修改文件
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 查询过程修改时间：`2026-06-30 15:12:24.840`。
- `7649` 返回：领料 1、数车 2、打磨 3。
- 近 30 天明细行数 `3281`，空工序号行数 `0`。

## 2026-06-30 AGV执行中任务改为已完成

### 用户反馈
- 处理页面 `ProductionManagement/AGVtask/index` 里面任务状态为执行中的数据。
- 所有执行中任务都改为已完成。

### 执行过程
1. 读取页面 `src/views/ProductionManagement/AGVtask/index.vue`，确认页面中 `RUNNING` 显示为执行中，`FINISHED` 显示为已完成。
2. 查询数据库对象，确认实时数据来自 `dbo.AGV_实时数据`，历史完成数据写入 `dbo.AGV_历史数据`。
3. 处理前统计实时表状态：`PENDING 1`、`RUNNING 35`。
4. 按完成任务口径处理 `RUNNING` 数据：插入历史表时 `TaskStatus` 写为 `FINISHED`，并设置 `EndTime`、`Duration`，随后从实时表删除这些执行中任务。
5. 处理完成后，调用页面实时查询过程验证 `RUNNING` 无数据。
6. 验证实时表仅剩 `PENDING 1`，最近 5 分钟历史表新增 `FINISHED 35`。
7. 新增 AGVtask README 和 01-06 文档，记录功能内容、执行步骤、推进台账、任务矩阵、验收证据和决策记录。

### 修改文件
- `work/ProductionManagement/AGVtask/README.md`
- `work/ProductionManagement/AGVtask/01-项目功能内容.md`
- `work/ProductionManagement/AGVtask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/AGVtask/03-推进台账.md`
- `work/ProductionManagement/AGVtask/04-任务矩阵.md`
- `work/ProductionManagement/AGVtask/05-验收证据.md`
- `work/ProductionManagement/AGVtask/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 已转历史数量：`35`。
- 页面实时查询过程按 `RUNNING` 查询返回空结果。
- 实时表剩余状态：`PENDING 1`。
- 历史表最近 5 分钟状态：`FINISHED 35`。

## 2026-06-30 设计报工任务模块方案文档修订

### 用户反馈
- 读取 `doc/设计报工任务模块.docx`，梳理方案。
- 项目号具体取哪个 SAP 视图字段后续提供。
- 完成要求已有结束时间，未结束不能完成。
- 删除任务时，如果已经有报工记录，不能删除。
- 不参与之前任何生产/SAP/工时报表流程，整体独立。
- 修改文档。

### 执行过程
1. 解析 `doc/设计报工任务模块.docx` 正文，确认原始需求包含设计任务、设计报工、设计工时校验、设计工时报表四个页面。
2. 对照参考页面：
   - `ProcessManagement/PartDrawlook/index.vue`
   - `PlanManagement/SelfMakePlando/index.vue`
   - `ProductionManagement/WorkHoursCheck/index.vue`
   - `ProductionManagement/Workhours/index.vue`
3. 新增 `work/ProductionManagement/DesignReportTask/` 文档目录。
4. 写入 README 和 01-06 文档，记录功能内容、开发步骤、推进台账、任务矩阵、验收证据和决策记录。
5. 将 Word 文档正文整理为确认版方案。
6. 解析更新后的 Word 文档，验证关键口径已写入。

### 修改文件
- `doc/设计报工任务模块.docx`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- Word 文档已包含 `项目号：具体 SAP 视图和字段后续提供`。
- Word 文档已包含 `未结束不能完成`。
- Word 文档已包含 `已有设计报工记录不能删除`。
- Word 文档已包含 `不上传 SAP` 和 `不参与现有生产工时报表`。
- 任务矩阵中 `DRT-009 项目号来源` 状态为待确认，`DRT-010 数据库和页面开发` 状态为待开始。

## 2026-06-30 设计报工任务模块文档归档与菜单权限口径补充

### 用户反馈
- 根据修改后的文档，将文档复制到对应路径。
- 在对应路径下新增或修改 README、01-06 文档。
- 将完整执行过程追加到 `/gptlog-process/gpdlog.md`。
- 不分配菜单权限。

### 执行过程
1. 确认修改后的源文档为 `doc/设计报工任务模块.docx`。
2. 确认对应路径为 `work/ProductionManagement/DesignReportTask/`。
3. 将源 Word 文档复制到 `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx`。
4. 更新 README 索引，增加复制后的 Word 文档说明，并写入“不分配菜单权限”。
5. 更新 `01-项目功能内容.md`，补充独立性要求和文档归档路径。
6. 更新 `02-项目程序开发详细步骤.md`，删除菜单权限分配动作，明确不写菜单表和角色权限表。
7. 更新 `03-推进台账.md`，记录本轮做了什么、改了哪些文件、验证了什么、下一步是什么。
8. 更新 `04-任务矩阵.md`，新增文档复制和菜单权限口径任务，并将开发验收标准调整为“不分配菜单权限”。
9. 更新 `05-验收证据.md`，记录工作目录归档路径和菜单权限口径。
10. 更新 `06-决策记录.md`，新增 DDR-006：本阶段不分配菜单权限。
11. 追加仓库内总日志和绝对路径总日志。

### 修改文件
- `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx` 已存在。
- README 已列出复制后的 Word 文档。
- `02-项目程序开发详细步骤.md` 已明确本阶段不分配菜单权限。
- `04-任务矩阵.md` 已新增 `DRT-011` 和 `DRT-012`。
- `06-决策记录.md` 已新增 `DDR-006 本阶段不分配菜单权限`。

## 2026-06-30 新建设计报工模块页面、数据表和功能

### 用户反馈
- 新建文档里面的页面、数据表、功能。
- 继续遵守“不分配菜单权限”的要求。

### 执行过程
1. 读取 `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`，确认需要落地 4 个页面、3 张独立表和独立设计报工功能。
2. 读取现有页面和通用数据库调用方式，确认页面使用 `CreateData` / `ExecDatabase` 调用存储过程。
3. 查询数据库中现有物料查询和人员查询返回字段：
   - 物料字段包含 `物料编码`、`物料名称`、`物料描述`。
   - 人员字段包含 `人员编号`、`人员姓名`、`账号`、`角色`。
4. 新增数据库脚本 `db_backups/create_design_report_task_module_20260630.sql`。
5. 第一次发布脚本时，SAP 物料字段存在 `ntext` 与 `nvarchar` 比较问题，修正为显式 `CAST` 后重新发布。
6. 成功发布 3 张独立表：
   - `dbo.MES_设计报工_任务`
   - `dbo.MES_设计报工_记录`
   - `dbo.MES_设计报工_校验记录`
7. 成功发布 15 个独立过程：
   - `设计报工_物料查询`
   - `设计报工_人员查询`
   - `设计报工_项目查询`
   - `设计报工_任务_查询`
   - `设计报工_任务_新增`
   - `设计报工_任务_编辑`
   - `设计报工_任务_删除`
   - `设计报工_任务_开始`
   - `设计报工_任务_结束`
   - `设计报工_任务_完成`
   - `设计报工_记录_查询`
   - `设计报工_工时校验_查询`
   - `设计报工_工时校验_保存`
   - `设计报工_工时校验_批量保存`
   - `设计报工_工时报表_作业者工时_查询`
8. 事务内验证业务规则：
   - 新增测试任务成功。
   - 未开始直接完成返回“任务未产生已结束报工，不能完成”。
   - 开始任务成功。
   - 开始后未结束直接完成返回“任务存在未结束报工，不能完成”。
   - 结束任务成功。
   - 结束后完成成功。
   - 事务回滚，测试数据未保留。
9. 新增 4 个前端页面：
   - `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
10. 执行 `npm run build`，构建通过，仅有项目既有 asset size、entrypoint size、browserslist warning。
11. 更新 `work/ProductionManagement/DesignReportTask/` 下 README 和 01-06 文档。
12. 本轮未新增菜单权限脚本，未写入菜单表和角色权限表。

### 修改文件
- `db_backups/create_design_report_task_module_20260630.sql`
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 验证结果
- 数据库脚本发布成功。
- 表和过程对象存在，过程修改时间为 `2026-06-30 18:01:39` 至 `2026-06-30 18:01:40`。
- 下拉验证：`设计报工_物料查询 @过滤=N'5960'` 可返回物料，`设计报工_人员查询 @过滤=N'孙'` 可返回人员。
- 业务规则事务验证通过，测试数据已回滚。
- `npm run build` 通过，仅有项目既有 warning。
- 未分配菜单权限。

## 2026-07-09 DesignReportTask 菜单权限、物料下拉和表单规则调整

### 用户反馈
1. 给 `DesignReportTask` 下的四个页面增加权限，账号代码为 `1`；数据库为 `192.168.2.92 / YL_MESDB`，目标表为 `[dbo].[登录基础数据_二级菜单]`。
2. 修改 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`：新建设计任务弹框中，物料编码和父件物料编码没有默认选项，必须输入后触发才有选项。
3. 检查 `DesignReportTask` 下四个页面是否都有物料编码、父件物料编码默认选项问题，并统一修改。
4. 新建设计任务去掉指派对象必填项；物料名称和父件物料名称由选择编码后带出，禁止手工修改；检查四个页面是否都有此问题并处理。
5. 后续每次 GPT/Codex 执行完毕后，必须把中文执行日志追加到 `gptlog-process/gpdlog.md`，日志包含提问、结论和完整执行过程。

### 执行过程
1. 使用 `rg` 搜索 `DesignReportTask`、菜单表和相关路由配置，确认四个页面路径：
   - `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
2. 读取 `src/router/getRouter.js` 和 `src/router/menuComponentModule.js`，确认系统从菜单表动态生成路由，菜单行里的 `path`、`componet`、`name` 必须和页面组件对应。
3. 读取既有菜单脚本，包括：
   - `db_backups/add_formality_confirm_report_menu_20260626.sql`
   - `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
   - `db_backups/add_timely_kit_tracking_result_menu_20260629.sql`
4. 使用用户提供的数据库连接信息连接 `192.168.2.92 / YL_MESDB`。为避免凭据落盘，日志不记录数据库密码明文。
5. 查询 `[dbo].[登录基础数据_二级菜单]` 表结构，确认：
   - `IDD` 是自增主键。
   - `id` 是前端菜单树使用的手工编号。
   - `pid` 是父菜单编号。
   - `componet` 为现有字段名，系统按该字段加载组件。
6. 查询账号代码 `1` 的菜单记录，确认“生产管理”父菜单为 `id=3`。
7. 查询账号代码 `1` 下是否已存在 `DesignReportTask` 相关菜单，确认执行前不存在 `设计任务`、`设计报工`、`设计工时校验`、`设计工时报表` 四条菜单。
8. 新增可重复执行脚本：
   - `db_backups/add_design_report_task_menu_account1_20260709.sql`
9. 菜单脚本逻辑：
   - 固定只处理账号代码 `1`。
   - 查找账号 `1` 的“生产管理”父菜单。
   - 不存在时插入四条菜单。
   - 已存在时修正 `pid`、`path`、`componet`、`name`、`title`、`icon`、`模块代码` 和 `是否启用`。
10. 执行菜单脚本，成功新增四条菜单：
    - `id=248`，`pid=3`，`设计任务`，`DesignReportTask/Task/index`，`/ProductionManagement/DesignReportTask/Task/index`
    - `id=249`，`pid=3`，`设计报工`，`DesignReportTask/Report/index`，`/ProductionManagement/DesignReportTask/Report/index`
    - `id=250`，`pid=3`，`设计工时校验`，`DesignReportTask/Check/index`，`/ProductionManagement/DesignReportTask/Check/index`
    - `id=251`，`pid=3`，`设计工时报表`，`DesignReportTask/HoursReport/index`，`/ProductionManagement/DesignReportTask/HoursReport/index`
11. 回读菜单表，确认四条菜单各只有一条记录，`pid` 都为 `3`，`是否启用` 都为 `1`，`模块代码` 等于各自 `id`。
12. 使用 `Test-Path` 校验四个前端组件文件均存在。
13. 读取 `Task/index.vue`，确认新建设计任务弹框中：
    - `物料编码` 使用 `queryMaterialOptions` 远程查询。
    - `父件物料编码` 使用 `queryParentMaterialOptions` 远程查询。
    - 原逻辑只在输入关键字触发 `remote-method` 后才请求物料数据。
14. 在 `Task/index.vue` 中新增 `loadDefaultMaterialOptions()` 方法，内部调用：
    - `queryMaterialOptions('')`
    - `queryParentMaterialOptions('')`
15. 在 `Task/index.vue` 的 `created()`、`openAdd()`、`openEdit()` 中调用 `loadDefaultMaterialOptions()`，保证页面查询区、新建弹框和编辑弹框打开时都有默认物料列表。
16. 执行 `npm run build` 验证，构建通过，仅有项目既有 asset size、entrypoint size、browserslist warning。
17. 继续检查 `DesignReportTask` 下四个页面：
    - `Task` 页面存在物料编码和父件物料编码远程下拉。
    - `Report` 页面原本查询区的物料编码和父件编码是普通输入框。
    - `Check` 页面原本查询区的物料编码是普通输入框。
    - `HoursReport` 页面原本查询区的物料编码是普通输入框。
18. 修改 `Report/index.vue`：
    - 将查询区“物料编码”从输入框改为远程下拉。
    - 将查询区“父件编码”从输入框改为远程下拉。
    - 增加 `materialOptions`、`parentMaterialOptions`。
    - 增加 `loadDefaultMaterialOptions()`、`queryMaterialOptions()`、`queryParentMaterialOptions()` 和 `formatMaterialLabel()`。
    - 在 `created()` 中预加载默认物料和父件物料列表。
19. 修改 `Check/index.vue`：
    - 将查询区“物料编码”从输入框改为远程下拉。
    - 增加 `materialOptions`。
    - 增加 `loadDefaultMaterialOptions()`、`queryMaterialOptions()` 和 `formatMaterialLabel()`。
    - 在 `created()` 中预加载默认物料列表。
20. 修改 `HoursReport/index.vue`：
    - 将查询区“物料编码”从输入框改为远程下拉。
    - 增加 `materialOptions`。
    - 增加 `loadDefaultMaterialOptions()`、`queryMaterialOptions()` 和 `formatMaterialLabel()`。
    - 在 `created()` 中预加载默认物料列表。
21. 执行 `npm run build` 验证四个页面物料下拉改动，构建通过，仅有项目既有 warning。
22. 检查四个页面是否存在“指派对象必填”和“物料名称、父件物料名称可编辑”的问题：
    - `Task/index.vue` 有新建/编辑设计任务弹框，存在 `指派对象` 的 `assigneeIds` 必填校验，也存在可编辑的 `物料名称` 和 `父件物料名称` 输入框。
    - `Report/index.vue`、`Check/index.vue`、`HoursReport/index.vue` 没有新建设计任务弹框，也没有可编辑的 `物料名称` 或 `父件物料名称` 表单项，只有查询条件和表格展示。
23. 检查数据库脚本 `db_backups/create_design_report_task_module_20260630.sql`，确认 `设计报工_任务_新增` 和 `设计报工_任务_编辑` 的 `@指派对象ID`、`@指派对象` 参数允许为空，后端无需修改。
24. 修改 `Task/index.vue`：
    - 删除 `rules.assigneeIds` 必填校验。
    - 保留 `formData.assigneeIds` 数组字段和 `handleAssigneeChange()`，支持用户选择指派对象但不强制要求。
    - 给 `formData.物料名称` 输入框增加 `disabled`。
    - 给 `formData.关联父件物料名称` 输入框增加 `disabled`。
25. 使用固定字符串搜索确认：
    - `请选择指派对象` 必填提示已不存在。
    - `assigneeIds` 只剩表单数据字段和选择逻辑，不再作为必填规则。
    - `Task/index.vue` 中 `物料名称` 和 `父件物料名称` 表单输入框均已禁用。
    - 其它三个页面仅有表格展示的 `物料名称`，没有对应可编辑输入框。
26. 执行 `npm run build` 验证表单规则和禁用输入框改动，构建通过，仅有项目既有 warning。
27. 查看 `git status --short`，确认当前工作区还存在用户或既有修改：
    - `doc/设计报工任务模块.docx`
    - `src/views/PlanManagement/SelfMakePlando/index.vue`
    - `doc/~$报工任务模块.docx`
    - 本轮相关的 `DesignReportTask` 页面改动和菜单脚本。
28. 按用户要求补录本次会话日志到 `gptlog-process/gpdlog.md`，并确认后续执行完毕后继续追加中文日志。

### 修改文件
- `db_backups/add_design_report_task_menu_account1_20260709.sql`
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `gptlog-process/gpdlog.md`

### 结论
- 账号代码 `1` 已获得 `DesignReportTask` 下四个页面菜单权限，四条菜单均挂到“生产管理”下并启用。
- `Task` 页面新建/编辑设计任务弹框打开时，物料编码和父件物料编码已有默认选项。
- `Task`、`Report`、`Check`、`HoursReport` 四个页面涉及物料查询的下拉均已支持默认选项。
- 新建设计任务的“指派对象”不再必填。
- 新建设计任务的“物料名称”和“父件物料名称”只能由选择编码后带出，前端禁止手工修改。
- `Report`、`Check`、`HoursReport` 页面不存在新建设计任务弹框，也不存在可编辑的物料名称或父件物料名称输入框，无需做同类表单禁用修改。
- 多次执行 `npm run build` 均通过，仅有项目既有资源体积和 browserslist 过期 warning。
- 已建立后续日志规则：每次 GPT/Codex 执行完毕后，将中文执行日志追加到 `gptlog-process/gpdlog.md`。

### 验证结果
- 菜单表回读结果确认 `设计任务`、`设计报工`、`设计工时校验`、`设计工时报表` 各 1 条，账号代码均为 `1`，`pid=3`，`是否启用=1`。
- 四个前端组件文件均存在。
- 搜索确认 `请选择指派对象` 必填提示已删除。
- 搜索确认 `物料名称` 和 `父件物料名称` 的可编辑表单问题只存在于 `Task/index.vue`，且已加 `disabled`。
- `npm run build` 通过。

## 2026-07-09 补录 2026-07-01 至 2026-07-08 项目修改日志

### 用户反馈
- 用户要求把 7 月 1、2、3 日的修改，以及 7 月 6、7、8 日本项目的修改追加到 `gptlog-process/gpdlog.md`。
- 要求遵守既定日志规则：每次 GPT/Codex 执行完毕后，将中文执行过程日志追加到 `gptlog-process/gpdlog.md`，内容包含提问、结论和完整执行过程。

### 执行过程
1. 读取 `gptlog-process/gpdlog.md` 末尾，确认当前日志已包含 2026-06-30 设计报工模块日志和 2026-07-09 DesignReportTask 权限、下拉、表单规则调整日志。
2. 使用 `rg` 搜索 `2026-07`、`七月`、`7月`、`07-0` 等关键词，确认现有总日志中没有按 2026-07-01 至 2026-07-08 单独补录的完整章节。
3. 使用 `git log --since "2026-07-01" --until "2026-07-09"` 查询 Git 历史，确认可追溯提交主要为：
   - `c4a2f6e`，2026-07-07 17:30:12，`feat: update production reporting workflows`。
   - `6d93e40`，2026-07-08 10:38:56，`feat: 增加结算工时和历史工时选择`。
   - `bd9ca09`，2026-07-08 16:52:29，`feat: 增加设备数据导出`。
4. 使用 PowerShell 按 `LastWriteTime` 查询 2026-07-01 至 2026-07-08 的项目文件修改时间，排除 `.git`、`node_modules`、`dist` 等目录。
5. 文件时间显示的关键记录：
   - 2026-07-02：`src/views/PlanManagement/TimelyKitTrackingResult/index.vue`。
   - 2026-07-03：`AGENTS.md`。
   - 2026-07-06：`src/views/ProductionManagement/OutsourceMange/index.vue`。
   - 2026-07-07：`src/views/QualityManagement/CheckTask/processReceive.vue`、`src/views/ProductionManagement/SettlementWorkhours/index.vue`、多个 20260707 SQL 脚本、`src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`。
   - 2026-07-08：`src/views/PlanManagement/SelfMakePlandone/index.vue`、`src/views/PlanManagement/WorkstationPlan/index.vue`、`src/views/DeviceManagement/Devicedata/index.vue`、`src/views/DeviceManagement/DeviceDataHistory/index.vue`、`doc/设计报工任务模块.docx`、`dist.zip`。
6. 查询 2026-07-01 至 2026-07-04 的 Git 提交记录，未发现该日期范围内的 Git 提交。
7. 读取 `AGENTS.md`，确认其内容为日志记录规则：每次 GPT/Codex 执行完毕后，将中文完整执行过程日志追加到 `gptlog-process/gpdlog.md`。
8. 读取 2026-07-07 提交 `c4a2f6e` 的文件清单和关键 diff，确认该提交覆盖 24 个文件，包含设计报工模块、结算工时、产品合格率、及时齐套跟踪结果、外协管理、质检收检和数据库脚本。
9. 读取 2026-07-08 提交 `6d93e40` 的 diff，确认其重点是排产相关页面增加结算工时和历史工时选择。
10. 读取 2026-07-08 提交 `bd9ca09` 的 diff，确认其重点是设备实时数据和设备历史数据增加导出 Excel 功能。
11. 对无 Git 提交但有文件修改时间的 7 月 1、2、3、6 日，按“可追溯证据”记录，不把无法确认的内容写成确定提交。
12. 将本次补录内容追加到 `gptlog-process/gpdlog.md`。

### 2026-07-01 修改补录
- 通过 Git 历史和文件修改时间检查，未发现 2026-07-01 当天有可追溯的项目代码或文档修改记录。
- 现有日志中出现的 `2026-07-01` 主要是设备信息维护日期字段的测试数据，例如入账日期测试值，不代表 2026-07-01 当天发生了项目文件修改。

### 2026-07-02 修改补录
- 文件修改时间显示 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 在 2026-07-02 11:50:48 修改。
- 后续该变更随 2026-07-07 提交 `c4a2f6e` 入库。
- 主要修改内容：
  1. 调整 `getRouteProcessName(process)`。
  2. 从 `process.工序名称` 和 `process.指派对象` 组合显示工序路线名称。
  3. 如果工序名称中已经包含半角或全角括号形式的指派对象，则不重复追加。
  4. 如果存在指派对象且工序名称未包含该指派对象，则显示为 `工序名称(指派对象)`。
- 结论：及时齐套跟踪结果页面的路线工序显示更明确，能在工序名称旁体现指派对象。

### 2026-07-03 修改补录
- 文件修改时间显示仓库根目录新增或修改 `AGENTS.md`，时间为 2026-07-03 09:52:09。
- 当前 `AGENTS.md` 内容为本项目日志记录规则：
  1. 每次 GPT/Codex 执行完毕后，须将完整执行过程日志追加到 `gptlog-process/gpdlog.md`。
  2. 日志包含提问、结论和完整执行过程。
  3. 写入日志必须使用中文。
- 当前 `git status` 显示 `AGENTS.md` 仍为未跟踪文件。
- 结论：7 月 3 日主要是建立项目级日志记录约束文件。

### 2026-07-06 修改补录
- 文件修改时间显示 `src/views/ProductionManagement/OutsourceMange/index.vue` 在 2026-07-06 13:36:58 修改。
- 后续该变更随 2026-07-07 提交 `c4a2f6e` 入库。
- 主要修改内容：
  1. 外协管理操作列中，“发料”按钮增加 `v-if="scope.row.单据状态 != '已取消'"`。
  2. 外协管理操作列中，“收料”按钮增加 `v-if="scope.row.单据状态 != '已取消'"`。
- 结论：已取消单据不再展示发料、收料操作，避免对取消状态单据继续执行业务操作。

### 2026-07-07 修改补录
- Git 提交：`c4a2f6e`。
- 提交时间：2026-07-07 17:30:12。
- 提交说明：`feat: update production reporting workflows`。
- 提交规模：24 个文件，约 3713 行新增、35 行删除。

#### 数据库脚本
1. `db_backups/create_design_report_task_module_20260630.sql`
   - 新增独立设计报工模块数据库脚本。
   - 创建 `MES_设计报工_任务`、`MES_设计报工_记录`、`MES_设计报工_校验记录`。
   - 创建设计报工物料、人员、项目、任务、开始、结束、完成、删除、工时校验、工时报表等过程。
   - 脚本说明中明确：不写入现有生产报工表、不上传 SAP、不新增菜单权限。
2. `db_backups/exclude_unfinished_assembly_orders_from_close_query_20260707.sql`
   - 修改 `计划排产_生产订单关闭_查询全部订单`。
   - 在“可关闭”逻辑中识别未结束装配订单。
   - 对存在装配开始但未结束记录的订单进行排除，避免未结束装配订单被误判为可关闭。
3. `db_backups/optimize_settlement_workhours_query_20260707.sql`
   - 优化 `生产管理_结算工时_查询`。
   - 增加合同号、产品编码、订单号、工位、开始日期、结束日期、数据条数等筛选参数。
   - 使用临时表组织任务、基础工时数据和汇总结果，提高查询结构清晰度。
4. `db_backups/fix_settlement_workhours_query_restore_workhour_rows_20260707.sql`
   - 修复结算工时查询，恢复从 `View_生产工时视图` 关联回来的工时报工行。
   - 使用 `TaskAID`、开始时间等关键字段组织报工明细和操作人拼接。
   - 继续保留结算工时汇总需要的报工工时、辅助工时、完成数、单件工时等字段。

#### 前端页面
1. `src/views/PlanManagement/SelfMakePlando/index.vue`
   - 增加“历史工时”入口。
   - 新增历史工时弹框。
   - 通过 `生产管理_结算工时_查询` 按产品编码查询历史工时。
   - 展示任务描述、生产订单号、工位、报工工时、辅助工时、完成数、结算报工单件工时、结算辅助单件工时、操作人等字段。
2. `src/views/PlanManagement/SelfMakePlandone/index.vue`
   - 增加与 `SelfMakePlando` 类似的“历史工时”入口和弹框。
   - 通过产品编码查询历史结算工时数据并展示。
3. `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
   - 路线工序名称增加指派对象显示，避免只看工序名无法区分指派对象。
4. `src/views/ProductionManagement/OutsourceMange/index.vue`
   - 已取消单据隐藏“发料”和“收料”按钮。
5. `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
   - 新增导出按钮。
   - 引入 `xlsx`。
   - 支持把主表和明细导出为 Excel。
   - 导出字段包含关闭日期、生产订单号、物料、计划数量、完成数量、不良数量、合格率、工序、工位、检验说明等。
6. `src/views/ProductionManagement/SettlementWorkhours/index.vue`
   - 新增导出按钮。
   - 引入 `xlsx`。
   - 导出结算工时树表数据，并在末尾写入报工工时、主辅工时和合计工时汇总。
   - 将“主辅工时”列名调整为“辅助工时”。
   - 增加展开/收起状态记录，导出时只导出当前展开明细。
7. `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
   - 新增设计任务页面。
   - 支持设计任务查询、新建、编辑、删除。
   - 支持项目号、物料编码、图号、父件编码、预计时间、状态等查询条件。
8. `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
   - 新增设计报工页面。
   - 支持任务开始、结束、完成。
   - 遵守未结束不能完成、已有报工记录不能删除等独立设计报工规则。
9. `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
   - 新增设计工时校验页面。
   - 支持单条校验和批量校验。
10. `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
   - 新增设计工时报表页面。
   - 支持按操作人、日期、任务形成树形工时报表。
11. `src/views/QualityManagement/CheckTask/processReceive.vue`
   - 质检收检流程中对部分调试输出做调整。
   - 对采购订单行匹配条件保留工序名称和未关闭行状态判断。
12. `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`、`src/views/ProductionManagement/SettlementWorkhours/index.vue`
   - 两个报表类页面均增加 Excel 导出能力，统一使用 `xlsx`。

#### 工作文档和日志
- 更新 `work/ProductionManagement/DesignReportTask/README.md`。
- 更新 `work/ProductionManagement/DesignReportTask/01-项目功能内容.md` 至 `06-决策记录.md`。
- 复制或更新 `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx`。
- 追加 `gptlog-process/gpdlog.md`。

#### 结论
- 7 月 7 日主要是生产报工、结算工时、设计报工、订单关闭判断、产品合格率导出等生产业务流程集中更新。
- 设计报工模块的表、过程、四个页面和工作文档在该提交中完成入库。
- 结算工时查询和展示能力得到增强，后续 7 月 8 日继续在排产页面使用这些结算工时数据。

### 2026-07-08 修改补录

#### 提交一：增加结算工时和历史工时选择
- Git 提交：`6d93e40`。
- 提交时间：2026-07-08 10:38:56。
- 提交说明：`feat: 增加结算工时和历史工时选择`。
- 涉及文件：
  - `src/views/PlanManagement/SelfMakePlando/index.vue`
  - `src/views/PlanManagement/SelfMakePlandone/index.vue`
  - `src/views/PlanManagement/WorkstationPlan/index.vue`

##### 主要修改内容
1. `SelfMakePlando/index.vue`
   - 调整历史工时弹框列顺序。
   - 将结算报工单件工时、结算辅助单件工时前置展示。
   - 单件工时展示时乘以 60，便于按分钟口径查看。
   - 保留生产订单号、工位、操作人、报工工时、辅助工时、完成数等字段。
2. `SelfMakePlandone/index.vue`
   - 将原“历史工时”按钮列注释掉。
   - 保留页面其他业务列。
3. `WorkstationPlan/index.vue`
   - 工位排产表增加“结算工时”和“结算单件工时”列。
   - 工位汇总和日期汇总增加结算工时合计。
   - 单任务行增加结算单件工时选择按钮。
   - 新增历史工时弹框，按产品编码调用 `生产管理_结算工时_查询`。
   - 历史工时弹框中支持选择“报工”或“辅助”的单件工时。
   - 选择后调用 `MES_OrderPlanned_EditTaskPlanned` 保存到任务的 `结算单件工时`。
   - 增加 `calcStandardHours`、`calcSettlementHours`、`formatHistoryPieceHours`、`canSelectHistoryHour` 等辅助方法。
   - 扩展表格最小宽度和列样式，适配新增结算工时列。

##### 结论
- 7 月 8 日上午主要增强排产侧的结算工时使用能力，支持从历史结算工时中选择单件工时并回写排产任务。

#### 提交二：增加设备数据导出
- Git 提交：`bd9ca09`。
- 提交时间：2026-07-08 16:52:29。
- 提交说明：`feat: 增加设备数据导出`。
- 涉及文件：
  - `src/views/DeviceManagement/Devicedata/index.vue`
  - `src/views/DeviceManagement/DeviceDataHistory/index.vue`

##### 主要修改内容
1. `Devicedata/index.vue`
   - 设备实时数据页面增加“导出”按钮。
   - 引入 `xlsx`。
   - 增加 `exporting` 状态，导出时按钮 loading。
   - 将当前表格数据导出为 Excel。
   - 导出字段包含序号、设备名称、参数名称、数值、单位、更新时间。
   - 导出文件名格式为 `设备实时数据_yyyyMMdd_HHmmss.xlsx`。
2. `DeviceDataHistory/index.vue`
   - 设备历史数据页面增加“导出”按钮。
   - 抽出 `buildQueryParams(pageSize, pageCurrent)` 复用查询参数构建。
   - 普通查询继续按分页查询。
   - 导出时使用总条数作为页大小，一次性查询全部历史数据后导出。
   - 导出字段包含序号、设备名称、参数名称、数值、采集时间。
   - 导出文件名格式为 `设备历史数据_yyyyMMdd_HHmmss.xlsx`。

##### 结论
- 7 月 8 日下午主要补齐设备实时数据和历史数据的 Excel 导出能力。

#### 其它 2026-07-08 文件时间记录
- `doc/设计报工任务模块.docx` 文件时间显示为 2026-07-08 18:27:31，当前 `git status` 显示该文件仍处于修改状态。
- `dist.zip` 文件时间显示为 2026-07-08 09:10:41，属于构建或发布压缩产物，本次补录仅记录文件时间，不作为源码变更结论。

### 本次补录修改文件
- `gptlog-process/gpdlog.md`

### 本次补录结论
- 已将 2026-07-01、2026-07-02、2026-07-03、2026-07-06、2026-07-07、2026-07-08 的可追溯项目修改追加到总日志。
- 2026-07-01 未发现可追溯项目文件修改，已在日志中明确说明。
- 2026-07-02、2026-07-03、2026-07-06 根据文件修改时间和后续提交 diff 补录。
- 2026-07-07、2026-07-08 根据 Git 提交记录和文件 diff 补录。
- 本次操作只修改日志文件，没有修改业务代码和数据库。

### 本次补录验证结果
- `git log` 已确认 2026-07-07 和 2026-07-08 的三个提交。
- `Get-ChildItem` 文件时间检查已确认 2026-07-02、2026-07-03、2026-07-06、2026-07-08 的相关文件。
- `AGENTS.md` 已读取并确认内容为中文日志记录规则。
- `gptlog-process/gpdlog.md` 已追加本节补录内容。

## 2026-07-09 DesignReportTask 项目号来源修正

### 用户反馈
- 用户指出项目号来源错了。
- 正确来源应为 `SAP.SBO_YL.dbo.VIEW_OPRJ.项目代码`。
- 要求检查 `DesignReportTask` 下四个页面是否都有这个问题，并全部修改。

### 执行过程
1. 使用 `rg` 搜索 `DesignReportTask` 下四个页面和数据库脚本中的 `项目号`、`projectNo`、`projectOptions`、`queryProjects`、`设计报工_项目查询`。
2. 确认原始实现问题：
   - `db_backups/create_design_report_task_module_20260630.sql` 中 `设计报工_项目查询` 原来从 `dbo.MES_设计报工_任务` 的已有项目号取值。
   - `Task/index.vue` 已有项目号远程下拉，但来源依赖错误过程，并且新建弹框中允许 `allow-create` 手工创建项目号。
   - `Report/index.vue`、`Check/index.vue`、`HoursReport/index.vue` 的项目号查询条件是普通输入框，没有统一使用项目号来源下拉。
3. 连接目标数据库 `192.168.2.92 / YL_MESDB`，检查 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]`。
4. 查询确认 SAP 项目视图字段：
   - `项目代码`
   - `项目名称`
5. 抽样查询 SAP 项目视图，确认存在 `CW-260001`、`CW260002`、`HT230075-1` 等项目代码。
6. 新增数据库增量脚本：
   - `db_backups/update_design_report_project_source_20260709.sql`
7. 增量脚本重建 `dbo.设计报工_项目查询`：
   - 来源改为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]`。
   - 返回 `项目号 = 项目代码`。
   - 同时返回 `项目名称`。
   - 支持按 `项目代码` 或 `项目名称` 模糊过滤。
8. 同步修改 `db_backups/create_design_report_task_module_20260630.sql` 中的 `设计报工_项目查询`，避免以后重跑完整脚本时又恢复为错误来源。
9. 执行 `db_backups/update_design_report_project_source_20260709.sql` 到目标库，执行成功。日志中不记录数据库密码明文。
10. 验证存储过程：
    - `设计报工_项目查询 @过滤=N''` 可返回 SAP 项目代码和项目名称。
    - `设计报工_项目查询 @过滤=N'CW-260001'` 返回 `CW-260001`。
11. 修改 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`：
    - 查询区项目号下拉显示从 `项目号` 改为 `项目号 | 项目名称`。
    - 新建/编辑弹框项目号下拉显示从 `项目号` 改为 `项目号 | 项目名称`。
    - 去掉新建/编辑弹框项目号下拉的 `allow-create`，避免手工录入非 SAP 项目代码。
    - 打开新建/编辑弹框时重新调用 `queryProjects('')`，保证默认项目列表可用。
    - 增加 `formatProjectLabel()`。
12. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
    - 将查询区项目号从普通输入框改为远程下拉。
    - 新增 `projectOptions`、`queryProjects()`、`formatProjectLabel()`。
    - 页面创建时预加载 SAP 项目代码列表。
13. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`：
    - 将查询区项目号从普通输入框改为远程下拉。
    - 新增 `projectOptions`、`queryProjects()`、`formatProjectLabel()`。
    - 页面创建时预加载 SAP 项目代码列表。
14. 修改 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`：
    - 将查询区项目号从普通输入框改为远程下拉。
    - 新增 `projectOptions`、`queryProjects()`、`formatProjectLabel()`。
    - 页面创建时预加载 SAP 项目代码列表。
15. 使用 `rg` 检查四个页面：
    - 四个页面均有 `queryProjects()`。
    - 四个页面项目号均使用 `设计报工_项目查询`。
    - `Task/index.vue` 中不再存在 `allow-create`。
16. 更新工作文档：
    - `work/ProductionManagement/DesignReportTask/README.md`
    - `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
    - `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
    - `work/ProductionManagement/DesignReportTask/03-推进台账.md`
    - `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
    - `work/ProductionManagement/DesignReportTask/05-验收证据.md`
    - `work/ProductionManagement/DesignReportTask/06-决策记录.md`
17. 文档更新内容：
    - 项目号来源从“待确认”改为 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ].[项目代码]`。
    - 记录 `设计报工_项目查询` 使用 SAP 项目代码。
    - 记录四个页面项目号查询条件统一为远程下拉。
    - 将任务矩阵 `DRT-009` 改为已完成，并新增 `DRT-020`。
    - 将决策记录中“项目号临时实现”标记为已废弃。
18. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 browserslist 过期 warning。
19. 查看 `git status --short`，确认本轮涉及的新增和修改文件，同时发现工作区还有不属于本轮操作的一批 `work/DeviceManagement/DeviceInformation` 删除状态，未做回退。

### 修改文件
- `db_backups/update_design_report_project_source_20260709.sql`
- `db_backups/create_design_report_task_module_20260630.sql`
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
- `gptlog-process/gpdlog.md`

### 结论
- 项目号来源已从错误的 `MES_设计报工_任务` 历史数据改为 SAP 项目视图 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ]` 的 `项目代码`。
- `设计报工_项目查询` 已发布到目标库，并返回 `项目号` 和 `项目名称`。
- `DesignReportTask` 四个页面的项目号查询条件已统一使用 SAP 项目代码远程下拉。
- `Task` 页面新建/编辑项目号不再允许手工创建非 SAP 项目号。
- 工作文档中的项目号“待确认”和“临时实现”口径已更新。

### 验证结果
- SAP 视图字段验证：存在 `项目代码`、`项目名称`。
- 存储过程验证：`设计报工_项目查询 @过滤=N'CW-260001'` 返回 `CW-260001`。
- 前端代码检查：四个页面均存在 `queryProjects()` 和 `formatProjectLabel()`。
- 前端构建：`npm run build` 通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask 项目号远程搜索补强

### 用户反馈
- 用户反馈：项目号也要像物料编码一样，需要远程搜索。

### 执行过程
1. 复查 `DesignReportTask` 四个页面中项目号控件配置。
2. 初次使用 `rg` 检查时，PowerShell 对引号和管道符解析导致命令报错，随后改用 `Get-Content` 和 `Select-String` 读取页面内容。
3. 确认当前四个页面已使用 `remote-method="queryProjects"`，但项目号下拉需要进一步补强为和物料编码一致的使用体验：
   - 页面打开时加载默认项目。
   - 用户输入关键字时通过 `queryProjects` 远程查询。
   - 清空选择后恢复默认项目列表。
   - 打开下拉且本地列表为空时自动加载默认项目列表。
4. 修改 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`：
   - 设计任务查询区项目号下拉增加 `@clear="loadDefaultProjectOptions"`。
   - 新建/编辑弹框项目号下拉增加 `@clear="loadDefaultProjectOptions"`。
   - 两个项目号下拉均增加 `@visible-change="handleProjectVisibleChange"`。
   - 新增 `loadDefaultProjectOptions()`，内部调用 `queryProjects('')`。
   - 新增 `handleProjectVisibleChange(visible)`，下拉打开且 `projectOptions` 为空时加载默认项目列表。
   - `created()`、`openAdd()`、`openEdit()` 改为调用 `loadDefaultProjectOptions()`。
5. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
   - 查询区项目号下拉增加清空后加载默认项目和打开时自动补加载逻辑。
   - 新增 `loadDefaultProjectOptions()` 和 `handleProjectVisibleChange()`。
   - `created()` 改为调用 `loadDefaultProjectOptions()`。
6. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`：
   - 查询区项目号下拉增加清空后加载默认项目和打开时自动补加载逻辑。
   - 新增 `loadDefaultProjectOptions()` 和 `handleProjectVisibleChange()`。
   - `created()` 改为调用 `loadDefaultProjectOptions()`。
7. 修改 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`：
   - 查询区项目号下拉增加清空后加载默认项目和打开时自动补加载逻辑。
   - 新增 `loadDefaultProjectOptions()` 和 `handleProjectVisibleChange()`。
   - `created()` 改为调用 `loadDefaultProjectOptions()`。
8. 使用 `Select-String` 检查四个页面，确认均存在：
   - `remote-method="queryProjects"`
   - `@clear="loadDefaultProjectOptions"`
   - `@visible-change="handleProjectVisibleChange"`
   - `loadDefaultProjectOptions`
   - `handleProjectVisibleChange`
9. 第一次执行 `npm run build`，124 秒超时，未返回编译结果。
10. 使用 240 秒超时时间重新执行 `npm run build`，构建通过，仅有项目既有资源体积和 browserslist 过期 warning。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `gptlog-process/gpdlog.md`

### 结论
- `DesignReportTask` 四个页面的项目号均已按物料编码的远程搜索口径补强。
- 项目号现在支持默认列表、输入远程搜索、清空恢复默认列表、打开空列表时自动加载。
- 项目号数据仍来自已修正的 `设计报工_项目查询`，即 SAP 项目视图 `[SAP].[SBO_YL].[dbo].[VIEW_OPRJ].[项目代码]`。

### 验证结果
- 四个页面均检查到项目号远程搜索相关配置。
- 第二次 `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask 操作列按钮横向显示

### 用户反馈
- 用户反馈：操作列下的功能按钮不要纵向显示，容易误触，改成横向；检查 `DesignReportTask` 下四个页面是不是都有这个问题，并全部修改。

### 执行过程
1. 检查 `DesignReportTask` 下四个页面：
   - `Task/index.vue` 存在操作列，按钮为“编辑 / 删除”。
   - `Report/index.vue` 存在操作列，按钮为“开始 / 结束 / 完成”。
   - `Check/index.vue` 存在操作列，按钮为“校验 / 已校验”。
   - `HoursReport/index.vue` 未发现操作列，因此没有纵向按钮问题。
2. 第一次按精确标签搜索操作列未命中，随后改用 `rg` 关键字和 UTF-8 读取方式定位具体模板位置。
3. 修改 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`：
   - 操作列宽度从 `130` 调整为 `150`。
   - 将“编辑 / 删除”按钮包裹到 `design-action-buttons` 容器内。
   - 新增横向 `inline-flex` 样式，设置不换行、居中、固定按钮间距。
   - 覆盖 Element UI 相邻按钮默认左边距，避免按钮被默认样式挤到纵向排列。
4. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
   - 操作列宽度从 `180` 调整为 `210`。
   - 将“开始 / 结束 / 完成”按钮包裹到 `design-action-buttons` 容器内。
   - 新增与 `Task` 页面一致的横向按钮样式。
5. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`：
   - 操作列宽度从 `90` 调整为 `100`。
   - 将“校验 / 已校验”按钮包裹到 `design-action-buttons` 容器内。
   - 新增与其他页面一致的横向按钮样式。
6. 对 `HoursReport/index.vue` 进行检查，确认页面只有报表树形表格和查询条件，没有操作列，未做代码修改。
7. 使用 `rg` 检查三个已修改页面，确认都已存在 `design-action-buttons` 模板和样式。
8. 执行 `npm run build`，构建通过；输出仅包含项目既有资源体积过大、Browserslist / baseline 数据过期 warning。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `gptlog-process/gpdlog.md`

### 结论
- `Task`、`Report`、`Check` 三个有操作列的页面已统一改为横向按钮排列，避免按钮纵向堆叠导致误触。
- `HoursReport` 页面没有操作列，本次无需修改。

### 验证结果
- 已检查到三个页面均存在 `design-action-buttons` 横向按钮容器。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask 设计报工多人开始结束逻辑

### 用户反馈
- 用户要求修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`。
- 业务规则：
  - 一个任务允许多个人员分别点击开始和结束。
  - A 点击开始后，B 也可以点击开始。
  - A 点击结束时，只记录 A 自己的开始时间和结束时间。
  - B 点击结束时，只记录 B 自己的开始时间和结束时间。
  - 点击完成时必须判断所有已点击开始的人员都已点击结束。
  - 如果有人开始后未结束，需要提示具体是谁未结束，且不更新任务状态。
  - 只有所有开始记录都已结束后，才允许完成任务。

### 执行过程
1. 读取 `Report/index.vue`，确认当前前端逻辑使用 `未结束报工数` 控制按钮：
   - `canStart` 要求 `未结束报工数 === 0`，导致 A 开始后 B 不能开始。
   - `canEnd` 只判断任务是否存在未结束记录，不能保证只结束当前操作人的记录。
   - `canComplete` 在存在未结束记录时直接禁用按钮，无法按用户要求点击后提示未结束人员。
2. 检查 `db_backups/create_design_report_task_module_20260630.sql`，确认数据库过程也存在同样限制：
   - `设计报工_任务_开始` 原来只要任务存在任意未结束记录就禁止开始。
   - `设计报工_任务_结束` 原来取任务最新一条未结束记录，不区分当前操作人。
   - `设计报工_任务_完成` 原来只提示任务存在未结束报工，未返回具体人员。
3. 查询目标库 `YL_MESDB` 中 `MES_设计报工_记录` 表字段，确认已有 `操作人ID`、`操作人`、`开始时间`、`结束时间`、`工时秒数`、`报工状态` 等字段，支持按人员拆分报工记录，无需改表结构。
4. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
   - 查询参数增加 `当前操作人ID` 和 `当前操作人`。
   - 表格增加“未结束人员”列。
   - `canStart` 改为只判断当前用户是否存在未结束报工。
   - `canEnd` 改为只在当前用户存在未结束报工时可点击。
   - `canComplete` 改为任务未完成且已有报工记录即可点击。
   - `completeTask` 增加前端判断：如果 `未结束报工数 > 0`，提示 `未结束报工人员`，不调用完成过程。
5. 新增增量脚本 `db_backups/update_design_report_multi_person_work_20260709.sql`：
   - 更新 `设计报工_任务_查询`，返回 `当前用户未结束报工数` 和 `未结束报工人员`。
   - 更新 `设计报工_任务_开始`，只禁止当前人员重复开始，允许其他人员同时开始。
   - 更新 `设计报工_任务_结束`，只结束当前人员自己的未结束记录；若其他人员仍未结束，任务状态保持 `执行中`。
   - 更新 `设计报工_任务_完成`，如果存在未结束记录，返回“以下人员还未点击结束：人员名单”，不更新任务状态。
6. 同步更新完整建库脚本 `db_backups/create_design_report_task_module_20260630.sql`，确保后续重建模块时不会丢失多人报工逻辑。
7. 使用 `sqlcmd -f 65001` 将增量脚本发布到 `192.168.2.92 / YL_MESDB`，未在日志中记录数据库密码。
8. 第一次事务验证时发现人员名单拼接使用 XML 方法会受到当前 SQL 执行环境 `QUOTED_IDENTIFIER` 设置影响，过程执行报错。
9. 将人员名单拼接从 XML 方法改为 SQL Server 2019 支持的 `STRING_AGG`，重新更新增量脚本和完整建库脚本。
10. 重新发布增量脚本到目标库。
11. 使用事务创建临时测试任务并回滚，验证流程：
    - 测试 A 点击开始成功。
    - 测试 B 点击开始成功。
    - 查询结果显示 `报工次数=2`、`未结束报工数=2`、`当前用户未结束报工数=1`、`未结束报工人员=测试A、测试B`。
    - 测试 A 点击结束成功。
    - A 结束后点击完成失败，返回“以下人员还未点击结束：测试B”。
    - 测试 B 点击结束成功。
    - A/B 都结束后点击完成成功。
    - 事务最终回滚，测试数据未保留。
12. 执行 `npm run build`，前端构建通过，仅有项目既有资源体积和 Browserslist / baseline 数据过期 warning。
13. 查询数据库确认 `GPT-TEST` 临时测试任务残留数为 0，并确认 `设计报工_任务_完成` 已发布为包含 `STRING_AGG` 的新定义。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `db_backups/update_design_report_multi_person_work_20260709.sql`
- `db_backups/create_design_report_task_module_20260630.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 设计报工页面已支持同一任务多人分别开始、分别结束。
- 当前人员只能结束自己的未结束报工记录，不会误结束其他人员记录。
- 完成任务时会检查所有开始记录是否都已结束；如仍有人未结束，会提示具体人员并阻止任务完成。
- 数据库过程已同步发布到目标库，完整建库脚本也已同步更新。

### 验证结果
- 数据库事务验证通过，测试数据已回滚且无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask DID 3 完成误判复查与防护

### 用户反馈
- 用户反馈：刚测试 DID=3 任务，点击完成时另一个人没有点结束也提示完成了；完成后另一个人点不了结束。

### 执行过程
1. 查询目标库 `192.168.2.92 / YL_MESDB` 中 DID=3 的真实数据：
   - `MES_设计报工_任务` 中 DID=3 状态为 `已完成`。
   - `MES_设计报工_记录` 中 DID=3 只有 1 条记录，操作人为“超级管理员”，且该记录已有结束时间。
   - DID=3 未查询到第二个人的未结束报工记录。
2. 复查数据库过程定义：
   - `设计报工_任务_完成` 已包含“以下人员还未点击结束”的拦截逻辑。
   - `设计报工_任务_结束` 已按当前人员查找未结束记录。
3. 结论判断：
   - DID=3 完成成功的直接原因是数据库中没有“另一个人”的开始记录。
   - 另一个人点不了结束，是因为 DID=3 没有该人员可结束的未结束记录，且任务已完成。
4. 为避免页面旧数据或并发操作再次造成误判，修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
   - `completeTask` 改为异步方法。
   - 点击完成时新增 `getLatestTask(DID)`，先实时调用 `设计报工_任务_查询` 获取最新任务状态。
   - 完成前使用实时返回的 `未结束报工数` 和 `未结束报工人员` 判断，不再只依赖表格旧行数据。
   - 如果实时查询发现有人未结束，提示具体人员并停止调用完成过程。
   - 如果实时查询发现任务已完成，提示“任务已完成”并刷新表格。
   - 如果任务没有已结束报工，提示不能完成。
   - `canEnd` 改为只要当前用户存在未结束报工就允许点击结束，不再因为任务状态是 `已完成` 就禁用，用于修复历史异常状态下“已完成但仍有未结束记录”的结束入口。
5. 新增数据库防护脚本 `db_backups/fix_design_report_complete_guard_20260709.sql`：
   - 重新发布 `设计报工_任务_开始`、`设计报工_任务_结束`、`设计报工_任务_完成`。
   - 开始、结束、完成均对对应 DID 的任务行使用事务锁，避免完成与开始/结束并发造成状态误判。
   - 完成过程在事务内重新查询未结束人员，存在未结束记录时返回具体人员并不更新任务状态。
   - 结束过程允许历史异常状态下“任务已完成但当前人员仍有未结束记录”的人员继续结束自己的记录。
6. 第一次事务验证时发现过程内部直接 `ROLLBACK TRANSACTION` 会回滚外层测试事务。
7. 修改防护脚本事务写法：
   - 没有外层事务时由过程自己开启并提交事务。
   - 存在外层事务时使用 `SAVE TRANSACTION` 保存点。
   - 失败时只回滚过程自己的保存点，不破坏调用方外层事务。
8. 使用 `sqlcmd -f 65001` 发布防护脚本到目标库，日志中未记录数据库密码。
9. 使用事务验证多人未结束完成拦截：
   - 测试 A 开始成功。
   - 测试 B 开始成功。
   - 测试 A 结束成功。
   - 此时点击完成返回失败，提示“以下人员还未点击结束：测试B”。
   - 查询显示任务仍为 `执行中`，`未结束报工数=1`，`当前用户未结束报工数=1`，`未结束报工人员=测试B`。
10. 使用事务验证历史异常状态：
    - 临时创建一个状态为 `已完成` 但测试 B 仍未结束的任务。
    - 查询显示 `未结束报工数=1`、`当前用户未结束报工数=1`。
    - 测试 B 点击结束成功。
    - 结束后查询显示 `未结束报工数=0`，任务保持 `已完成`。
11. 两组事务验证均已回滚，查询确认 `GPT-GUARD`、`GPT-BAD` 测试数据残留为 0。
12. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 Browserslist / baseline 数据过期 warning。
13. 查询 DID=3 当前未结束记录数为 0，确认 DID=3 没有可让另一个人结束的未结束记录。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `db_backups/fix_design_report_complete_guard_20260709.sql`
- `gptlog-process/gpdlog.md`

### 结论
- DID=3 本次完成成功是因为数据库里并没有第二个人的未结束开始记录。
- 已补充前端完成前实时查库，避免表格旧数据导致误判。
- 已补充数据库事务锁防护，完成过程会在最终更新状态前重新检查未结束人员。
- 已允许历史异常状态下，当前人员仍有未结束记录时可以点击结束自己的记录。

### 验证结果
- DID=3 当前未结束记录数为 0。
- 多人未结束完成拦截验证通过。
- 历史异常已完成状态下结束验证通过。
- 测试数据无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 清空 DesignReportTask 设计报工业务数据

### 用户反馈
- 用户要求：清空设计相关的数据。

### 执行过程
1. 按 `DesignReportTask` 设计报工模块业务数据范围处理，未清理菜单权限、存储过程和表结构。
2. 确认需要清空的三张业务表：
   - `dbo.MES_设计报工_任务`
   - `dbo.MES_设计报工_记录`
   - `dbo.MES_设计报工_校验记录`
3. 清空前查询目标库 `YL_MESDB` 当前数据量：
   - `MES_设计报工_任务`：2 行。
   - `MES_设计报工_记录`：2 行。
   - `MES_设计报工_校验记录`：1 行。
4. 清空前先导出本地备份，备份目录：
   - `db_backups/design_report_data_backup_20260709_110417/`
5. 备份文件包括：
   - `MES_设计报工_任务.json`
   - `MES_设计报工_记录.json`
   - `MES_设计报工_校验记录.json`
   - `_summary.json`
6. 使用事务按依赖顺序清空数据：
   - 先清空 `MES_设计报工_校验记录`。
   - 再清空 `MES_设计报工_记录`。
   - 最后清空 `MES_设计报工_任务`。
7. 清空后执行 `DBCC CHECKIDENT`，将三张表自增标识重置为 0。
8. 再次查询三张业务表行数，确认均为 0。
9. 查询三张表当前标识值，确认均为 0。

### 修改文件
- `db_backups/design_report_data_backup_20260709_110417/MES_设计报工_任务.json`
- `db_backups/design_report_data_backup_20260709_110417/MES_设计报工_记录.json`
- `db_backups/design_report_data_backup_20260709_110417/MES_设计报工_校验记录.json`
- `db_backups/design_report_data_backup_20260709_110417/_summary.json`
- `gptlog-process/gpdlog.md`

### 结论
- `DesignReportTask` 设计报工模块三张业务表已清空。
- 清空前数据已备份到本地 `db_backups/design_report_data_backup_20260709_110417/`。
- 表结构、存储过程、菜单权限未清理。
- 三张表自增编号已重置，后续新增数据将从 1 开始。

### 验证结果
- `MES_设计报工_任务` 当前 0 行。
- `MES_设计报工_记录` 当前 0 行。
- `MES_设计报工_校验记录` 当前 0 行。
- 三张表当前标识值均为 0。

## 2026-07-09 DesignReportTask 已完成任务禁止开始补充判断

### 用户反馈
- 用户反馈：当任务状态为完成时，点击开始应该提示失败；现在任务已经被另一个人点击完成后，还能点击开始。

### 执行过程
1. 检查 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`。
2. 确认页面原有 `canStart(row)` 会根据当前表格行的 `单据状态` 禁用开始按钮，但如果另一个人完成任务后当前页面未刷新，当前行仍可能是旧状态，导致用户仍能点击开始。
3. 查询数据库过程 `dbo.设计报工_任务_开始`，确认后端已包含“任务已完成，不能开始”的拦截逻辑。
4. 修改 `Report/index.vue` 的 `startTask(row)`：
   - 将 `startTask` 改为异步方法。
   - 点击开始时先调用已有 `getLatestTask(DID)` 实时查询数据库最新任务状态。
   - 使用实时返回结果覆盖当前表格行数据。
   - 如果实时状态为 `已完成`，提示“任务已完成，不能开始”，刷新表格，并停止调用开始过程。
   - 如果当前人员已经存在未结束报工，提示“当前人员已存在未结束的报工记录”，并停止调用开始过程。
   - 只有实时状态允许开始时才调用 `设计报工_任务_开始`。
5. 使用事务临时创建一个状态为 `已完成` 的测试任务，并调用 `设计报工_任务_开始` 验证后端返回：
   - `result=0`
   - `message=任务已完成，不能开始`
6. 验证事务回滚后测试数据残留数为 0。
7. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 Browserslist / baseline 数据过期 warning。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `gptlog-process/gpdlog.md`

### 结论
- 已完成任务点击“开始”时，前端会先实时查库。
- 如果任务已被其他人完成，会立即提示“任务已完成，不能开始”，不会再调用开始过程。
- 后端开始过程也已确认存在同样拦截，前后端均有保护。

### 验证结果
- 后端模拟已完成任务点击开始，返回“任务已完成，不能开始”。
- 测试数据无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask 设计任务删除失败逻辑修正

### 用户反馈
- 用户反馈：设计任务删除的结果逻辑不正确。任务 1 点击删除并确认时提示“删除成功”，实际应该提示“删除失败”。

### 执行过程
1. 检查 `src/views/ProductionManagement/DesignReportTask/Task/index.vue` 中 `deleteTask(row)`：
   - 原逻辑确认后直接调用 `设计报工_任务_删除`。
   - 前端只按返回 `result` 判断成功或失败。
2. 查询目标库中 DID=1 的真实数据：
   - DID=1 当前状态为 `已完成`。
   - DID=1 存在 3 条 `MES_设计报工_记录`。
   - DID=1 存在 3 条 `MES_设计报工_校验记录`。
3. 检查数据库删除过程 `dbo.设计报工_任务_删除`：
   - 原过程只判断是否存在报工记录。
   - 对任务不存在、已完成状态、删除 0 行、校验记录等场景保护不足。
4. 修改 `Task/index.vue`：
   - 删除确认后先调用新增的 `getLatestTask(DID)` 实时查询数据库最新任务。
   - 如果任务不存在，提示“删除失败：任务不存在或已被删除”。
   - 如果 `报工次数 > 0`，提示“删除失败：该任务已有设计报工记录，不能删除”。
   - 如果任务状态为 `已完成`，提示“删除失败：任务已完成，不能删除”。
   - 如果任务状态不是 `待开始`，提示对应状态不能删除。
   - 只有实时查询确认可删除时，才调用 `设计报工_任务_删除`。
   - 删除调用增加异常捕获，接口异常时提示“删除失败”。
5. 新增数据库脚本 `db_backups/fix_design_report_delete_guard_20260709.sql`：
   - 重新发布 `dbo.设计报工_任务_删除`。
   - 只允许 `待开始` 且无报工记录、无校验记录的任务删除。
   - 任务不存在、已有报工、已有校验、已完成、非待开始状态、删除 0 行均返回 `result=0`。
   - 删除成功时才返回 `result=1`。
6. 同步更新完整建库脚本 `db_backups/create_design_report_task_module_20260630.sql` 中的删除过程定义。
7. 发布删除防护脚本到目标库 `YL_MESDB`，日志中未记录数据库密码。
8. 验证 DID=1 删除：
   - 执行 `设计报工_任务_删除 @DID=1` 返回 `result=0`。
   - 返回消息为“删除失败：该任务已有设计报工记录，不能删除”。
   - DID=1 任务仍存在。
9. 使用事务临时创建一个 `待开始` 且无报工记录的测试任务，验证可删除场景：
   - 删除过程返回 `result=1`、`message=删除成功`。
   - 事务内删除后任务残留为 0。
   - 回滚后测试数据残留为 0。
10. 执行 `npm run build`，构建通过，仅有项目既有资源体积和 Browserslist / baseline 数据过期 warning。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `db_backups/fix_design_report_delete_guard_20260709.sql`
- `db_backups/create_design_report_task_module_20260630.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 任务 1 这类已有报工记录的设计任务，现在删除时会提示删除失败。
- 前端删除前会实时查库，不再只依赖表格旧数据。
- 后端删除过程已补充完整保护，只允许未开始且无关联业务记录的任务删除。

### 验证结果
- DID=1 删除返回失败，提示“该任务已有设计报工记录，不能删除”。
- 可删除的待开始测试任务仍能正常删除。
- 测试数据无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-09 DesignReportTask 增加类别字段

### 用户提问
- 用户要求：设计报工模块增加字段“类别”，类型为文本输入。

### 执行过程
1. 检查 `DesignReportTask` 下四个页面：
   - `Task/index.vue`
   - `Report/index.vue`
   - `Check/index.vue`
   - `HoursReport/index.vue`
2. 确认“类别”应作为设计任务主数据字段保存，并在各业务查询中展示和筛选。
3. 修改 `Task/index.vue`：
   - 查询区增加“类别”文本输入框。
   - 表格增加“类别”列。
   - 新建/编辑设计任务弹框增加“类别”文本输入框。
   - 表单初始数据增加 `类别`。
   - 任务查询参数增加 `类别`。
   - 新增、编辑保存参数增加 `类别`。
   - 删除前实时查询任务详情时补充 `类别` 参数，避免过程参数不一致。
4. 修改 `Report/index.vue`：
   - 查询区增加“类别”文本输入框。
   - 表格增加“类别”列。
   - 报工任务查询参数增加 `类别`。
   - 开始/结束/完成前实时查询任务详情时补充 `类别` 参数。
5. 修改 `Check/index.vue`：
   - 查询区增加“类别”文本输入框。
   - 表格增加“类别”列。
   - 工时校验查询参数增加 `类别`。
6. 修改 `HoursReport/index.vue`：
   - 查询区增加“类别”文本输入框。
   - 表格增加“类别”列。
   - 工时报表查询参数增加 `类别`。
   - 树形标题中优先显示“类别 | 任务描述”，方便按类别识别任务。
7. 修改完整建库脚本 `db_backups/create_design_report_task_module_20260630.sql`：
   - `MES_设计报工_任务` 表增加 `[类别] nvarchar(100) NULL`。
   - 增加 `COL_LENGTH` 兼容判断，旧库缺少字段时自动 `ALTER TABLE`。
   - 以下过程增加 `@类别` 参数、返回字段和筛选条件：
     - `设计报工_任务_查询`
     - `设计报工_任务_新增`
     - `设计报工_任务_编辑`
     - `设计报工_记录_查询`
     - `设计报工_工时校验_查询`
     - `设计报工_工时报表_作业者工时_查询`
8. 新增增量脚本 `db_backups/add_design_report_category_field_20260709.sql`：
   - 用于直接更新现有数据库，不重建已有业务对象。
   - 增加任务表“类别”字段。
   - 重建上述 6 个查询/新增/编辑相关过程。
9. 将增量脚本发布到目标数据库 `192.168.2.92 / YL_MESDB`，日志中不记录数据库密码。
10. 数据库验证：
    - 检查 `MES_设计报工_任务` 中 `类别` 字段存在，结果为 `1`。
    - 检查 6 个相关存储过程均包含 `@类别` 参数和 `[类别]` 字段，结果均为 `1`。
    - 第一次事务验证时误按旧理解传入了 `@任务状态`，数据库返回该参数不存在；随后查询真实过程签名并按真实参数重新验证。
    - 第二次事务验证中执行新增，返回 `result=1`、`message=新增成功`、验证 DID 为 `6`，新增类别为 `结构`。
    - 同一事务内执行编辑，返回 `result=1`、`message=编辑成功`，编辑后类别为 `电气`。
    - 事务回滚后验证数据残留数量为 `0`。
11. 前端静态检查：
    - 使用 `rg` 和 `Select-String` 确认四个页面均存在“类别”查询输入、表格列和查询参数。
12. 执行 `npm run build`：
    - 构建通过。
    - 仅有项目既有资源体积超限 warning，以及 Browserslist / baseline-browser-mapping 数据过期提示。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `db_backups/create_design_report_task_module_20260630.sql`
- `db_backups/add_design_report_category_field_20260709.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 设计报工模块已增加“类别”文本字段。
- 新建设计任务和编辑设计任务可以录入、保存、修改“类别”。
- 任务管理、设计报工、工时校验、工时报表四个页面均支持按“类别”筛选并展示“类别”列。
- 数据库表和相关存储过程已同步更新到目标库。

### 验证结果
- 数据库字段存在，相关存储过程均已包含“类别”。
- 新增/编辑事务验证通过，测试数据已回滚，无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-10 DesignReportTask Check 和 HoursReport 菜单权限补录

### 用户提问
- 用户要求给 `DesignReportTask` 下 `check` 和 `HoursReport` 添加账号代码 `1` 的二级菜单权限。
- 目标数据库为 `192.168.2.92 / YL_MESDB`，目标表为 `[dbo].[登录基础数据_二级菜单]`。
- 数据库账号信息由用户提供，本日志不记录数据库明文密码。

### 执行过程
1. 读取当前项目目录，确认存在 `gptlog-process/gpdlog.md`、`db_backups` 和 `DesignReportTask` 相关历史记录。
2. 使用 `rg` 搜索 `登录基础数据_二级菜单`、`DesignReportTask`、`HoursReport`、`check`，确认项目内已有设计报工模块和历史菜单处理记录。
3. 确认本机存在 `sqlcmd`，路径为 SQL Server ODBC 170 工具目录下的 `SQLCMD.EXE`。
4. 读取 `db_backups/add_design_report_task_menu_account1_20260709.sql`，确认历史脚本中四个页面的菜单定义：
   - `DesignReportTask/Task/index`：设计任务
   - `DesignReportTask/Report/index`：设计报工
   - `DesignReportTask/Check/index`：设计工时校验
   - `DesignReportTask/HoursReport/index`：设计工时报表
5. 第一次直接读取脚本和日志时发现 PowerShell 默认编码显示中文乱码，随后改用 `Get-Content -Encoding UTF8` 重新读取，确认脚本内容和日志中文正常。
6. 使用 `sqlcmd -f 65001` 连接目标库，查询账号代码 `1` 下 `DesignReportTask/Check/index`、`DesignReportTask/HoursReport/index`、`设计工时校验`、`设计工时报表`，执行前未查询到对应记录。
7. 同步查询账号代码 `1` 的一级父菜单，确认“生产管理”父菜单存在且启用，`id=3`。
8. 查询 `[dbo].[登录基础数据_二级菜单]` 表结构，确认：
   - `IDD` 为 identity 字段。
   - `id` 不是 identity，需要手工维护。
   - 菜单字段包含 `pid`、`path`、`componet`、`name`、`title`、`icon`、`账号代码`、`模块代码`、`是否启用`、`操作时间` 等。
9. 查询当前最大 `id` 为 `249`。
10. 查询账号代码 `1` 下已有 `DesignReportTask` 菜单，确认已有：
    - `id=248`，`设计任务`，`DesignReportTask/Task/index`，已启用。
    - `id=249`，`设计报工`，`DesignReportTask/Report/index`，已启用。
11. 在事务中补录并启用两条缺失菜单：
    - `id=250`，`pid=3`，`path=DesignReportTask/Check/index`，`componet=/ProductionManagement/DesignReportTask/Check/index`，`name=DesignReportCheck`，`title=设计工时校验`，`icon=PayStateSearch`，`账号代码=1`，`模块代码=250`，`是否启用=1`。
    - `id=251`，`pid=3`，`path=DesignReportTask/HoursReport/index`，`componet=/ProductionManagement/DesignReportTask/HoursReport/index`，`name=DesignReportHoursReport`，`title=设计工时报表`，`icon=DimensionsSummaryReport`，`账号代码=1`，`模块代码=251`，`是否启用=1`。
12. 事务提交后 SQL 返回汇总：插入 `2` 条，更新启用 `2` 条，父菜单 `parent_id=3`。
13. 再次查询账号代码 `1` 下所有 `DesignReportTask` 菜单，确认共有四条并全部启用：
    - `248`：设计任务
    - `249`：设计报工
    - `250`：设计工时校验
    - `251`：设计工时报表
14. 本次未修改前端代码和业务表结构，只修改了目标数据库中的二级菜单权限记录，并追加本日志。

### 结论
- 账号代码 `1` 已补齐 `DesignReportTask` 下 `Check` 和 `HoursReport` 两个页面的二级菜单权限。
- 两条菜单均挂在账号代码 `1` 的“生产管理”父菜单下，父菜单 `id=3`。
- 当前账号代码 `1` 下 `DesignReportTask` 四个菜单 `Task`、`Report`、`Check`、`HoursReport` 均存在且 `是否启用=1`。

### 验证结果
- `设计工时校验`：`id=250`，`pid=3`，`是否启用=1`。
- `设计工时报表`：`id=251`，`pid=3`，`是否启用=1`。
- 最终复查查询返回 `DesignReportTask` 四条菜单，编号为 `248` 至 `251`。

## 2026-07-10 上传所有修改到远程

### 用户提问
- 用户要求：上传所有修改到远程。

### 执行过程
1. 检查 Git 工作区状态，确认当前存在已修改、已删除和未跟踪文件。
2. 确认当前分支为 `snapshot/local-save-20260625-154806`。
3. 确认远程仓库为 `origin`，地址为 `http://154.8.160.151:3000/meswork/MES_Manage_View_V20.git`。
4. 查询最近一次提交，当前 HEAD 为 `bd9ca09 feat: 增加设备数据导出`。
5. 使用 `git status -sb` 确认当前分支跟踪 `origin/snapshot/local-save-20260625-154806`。
6. 使用 `git branch -vv` 确认本地分支已绑定同名远程分支。
7. 使用 `git diff --stat` 汇总已跟踪文件改动，确认包含设计报工模块前端、数据库脚本、文档、日志和设备资料目录删除等改动。
8. 使用 `git ls-files --others --exclude-standard` 汇总未跟踪文件，确认包含 `AGENTS.md`、设计报工相关增量 SQL 脚本和数据备份 JSON。
9. 执行 `git fetch origin` 刷新远程状态。
10. 第一次执行上游分支检查时，PowerShell 将 `@{u}` 解析为哈希字面量导致命令失败；随后改用引号包裹 `@{u}` 重新执行。
11. 重新确认上游分支为 `origin/snapshot/local-save-20260625-154806`。
12. 使用 `git rev-list --left-right --count HEAD...'@{u}'` 确认本地与远程提交差异为 `0 0`，提交前不存在分叉。
13. 使用 `git status --porcelain | Measure-Object -Line` 统计当前工作区有 `32` 条状态记录。
14. 按日志规则先追加本条中文执行记录，本条记录将随同本次提交一起推送到远程。
15. 后续将执行 `git add -A` 全量暂存当前可见改动，创建提交，并推送到当前跟踪远程分支。

### 结论
- 已确认当前分支和远程分支未分叉，可以直接提交并推送。
- 本次按用户“所有修改”的要求处理，不筛除当前工作区中的已修改、已删除和未跟踪文件。
- 本日志记录会随同本次提交一起上传到远程。

## 2026-07-10 上传所有修改到远程结果补充

### 执行过程
1. 执行 `git add -A`，将当前工作区全部已修改、已删除和未跟踪文件纳入暂存区。
2. `git add -A` 过程中出现若干 LF/CRLF 换行符提示，未阻止暂存。
3. 使用 `git status --short` 复核暂存区，确认新增、修改、删除均已暂存。
4. 使用 `git diff --cached --stat` 复核暂存统计，确认本次暂存共 `35` 个文件变更，包含 `3033` 行新增和 `780` 行删除。
5. 执行 `git commit -m "chore: 上传当前工作区修改"` 创建提交。
6. 提交创建成功，提交号为 `a6a92ff`，提交信息为 `chore: 上传当前工作区修改`。
7. 执行 `git push origin snapshot/local-save-20260625-154806` 推送到远程。
8. 推送成功，远程分支 `snapshot/local-save-20260625-154806` 从 `bd9ca09` 更新到 `a6a92ff`。
9. 推送后执行 `git status -sb`，确认本地分支仍跟踪 `origin/snapshot/local-save-20260625-154806`。
10. 执行 `git rev-list --left-right --count HEAD...'@{u}'`，确认本地与远程差异为 `0 0`。
11. 执行 `git log -1 --oneline`，确认当前最新提交为 `a6a92ff chore: 上传当前工作区修改`。
12. 为补充记录推送成功结果，追加本条日志；本条日志将作为单独的日志补充提交继续推送到同一远程分支。

### 结论
- 用户要求上传的当前工作区全部修改已提交并推送到远程分支。
- 首次推送成功的提交号为 `a6a92ff`。
- 推送后本地与远程分支一致，差异为 `0 0`。

## 2026-07-10 DesignReportTask 工时校验补结束后任务状态回写

### 用户提问
- 用户反馈：`ProductionManagement/DesignReportTask/Check/index` 中，已经点击开始但没有结束的任务，在校验页点击“校验”并输入结束时间后可以校验完成，但任务状态没有改变，仍然是“执行中”。

### 执行过程
1. 检查 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`，确认校验保存调用的是 `设计报工_工时校验_保存`。
2. 检查完整建库脚本 `db_backups/create_design_report_task_module_20260630.sql`，确认 `设计报工_工时校验_保存` 原逻辑只更新 `MES_设计报工_记录`：
   - 写入 `开始时间`、`结束时间`、`工时秒数`。
   - 将 `报工状态` 改为 `已结束`。
   - 将 `已校验` 改为 `1`。
   - 写入校验人、校验时间和备注。
3. 确认原过程没有同步更新 `MES_设计报工_任务.[单据状态]`，这是校验页手工补结束时间后任务仍为“执行中”的原因。
4. 检查 `Report/index.vue` 和需求文档，确认设计报工状态规则：
   - “结束”后任务状态应为 `已结束`。
   - “完成”是单独动作，完成后任务状态才变为 `已完成`。
5. 决定本次修复口径：
   - 校验页手工补结束时间后，如果该 DID 已无未结束报工记录，则任务状态回写为 `已结束`。
   - 如果该 DID 仍有其他未结束报工记录，则任务状态保持 `执行中`。
   - 如果任务已经是 `已完成`，校验保存不回退任务状态。
6. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`：
   - 在校验表格中增加“任务状态”列，直接显示 `单据状态`。
   - 增加 `getStatusType` 方法，按 `已完成`、`执行中`、`已结束` 显示不同标签类型。
   - 单条校验成功后改为 `await this.searchTable()`，确保校验后刷新完成再结束流程。
   - 批量校验成功后也改为 `await this.searchTable()`。
7. 修改 `db_backups/create_design_report_task_module_20260630.sql` 中 `设计报工_工时校验_保存`：
   - 保存校验记录并更新报工记录后，新增任务状态回写逻辑。
   - 状态回写规则为：已完成保持已完成；仍有未结束记录则为执行中；否则为已结束。
   - 返回结果中增加 `任务状态` 字段，便于调用方确认状态。
8. 修改 `db_backups/create_design_report_task_module_20260630.sql` 中 `设计报工_工时校验_批量保存`：
   - 增加受影响 DID 集合。
   - 批量校验后按相同规则回写任务状态。
   - 将记录更新条数保存到变量，避免后续任务更新覆盖返回的 `count`。
9. 新增增量脚本 `db_backups/fix_design_report_check_status_20260710.sql`：
   - 用于直接发布现有数据库。
   - 重建 `设计报工_工时校验_保存` 和 `设计报工_工时校验_批量保存`。
10. 将增量脚本发布到目标库 `192.168.2.92 / YL_MESDB`，日志中不记录数据库明文密码。
11. 使用事务构造临时数据验证单条校验：
    - 新建一个状态为 `执行中` 的临时任务和一条未结束报工记录。
    - 调用 `设计报工_工时校验_保存` 传入开始时间和结束时间。
    - 返回 `result=1`、`message=校验成功`、`任务状态=已结束`。
    - 查询确认任务状态为 `已结束`，报工记录状态为 `已结束`，`已校验=1`。
    - 回滚事务后确认测试任务残留数量为 `0`。
12. 使用事务构造多人未结束场景验证：
    - 新建一个状态为 `执行中` 的临时任务和两条未结束报工记录。
    - 只对其中一条记录调用 `设计报工_工时校验_保存` 补结束时间并校验。
    - 返回 `result=1`、`任务状态=执行中`。
    - 查询确认仍有 `1` 条未结束记录，任务状态保持 `执行中`。
    - 回滚事务后确认测试任务残留数量为 `0`。
13. 批量校验测试第一次执行时报错：
    - 错误为使用 XML 方法时 `QUOTED_IDENTIFIER` 设置不正确。
    - 原因是新增增量脚本未显式设置 `SET QUOTED_IDENTIFIER ON`。
14. 检查完整建库脚本，确认完整脚本已有 `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON`。
15. 修改 `db_backups/fix_design_report_check_status_20260710.sql`，在过程创建前补充：
    - `SET ANSI_NULLS ON`
    - `SET QUOTED_IDENTIFIER ON`
16. 重新发布增量脚本到目标库。
17. 重新使用事务验证批量校验：
    - 新建一个状态为 `执行中` 的临时任务和两条已有结束时间的报工记录。
    - 调用 `设计报工_工时校验_批量保存`。
    - 返回 `result=1`、`message=批量校验成功`、`count=2`。
    - 查询确认两条记录均已校验，任务状态变为 `已结束`。
    - 回滚事务后确认测试任务残留数量为 `0`。
18. 第一次执行 `npm run build` 时 124 秒超时，没有得到构建结论。
19. 使用更长超时时间重新执行 `npm run build`，构建通过。
20. 构建输出仅有项目既有的大资源体积 warning，以及 Browserslist / baseline-browser-mapping 数据过期提示。
21. 检查 Git 状态，确认构建未额外修改 `dist`，当前变更只包含本次源码、数据库脚本和本日志。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `db_backups/create_design_report_task_module_20260630.sql`
- `db_backups/fix_design_report_check_status_20260710.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 设计工时校验页手工补结束时间并保存校验后，任务状态会按报工记录自动回写。
- 单个任务所有报工记录都已有结束时间时，任务状态会从 `执行中` 改为 `已结束`。
- 同一任务仍有其他未结束报工记录时，任务状态保持 `执行中`。
- 已完成任务不会因为工时校验被回退状态。
- 校验页现在直接显示“任务状态”，便于校验后确认状态变化。

### 验证结果
- 单条补结束时间校验：通过，任务状态变为 `已结束`。
- 多人仍有未结束记录：通过，任务状态保持 `执行中`。
- 批量校验：通过，任务状态变为 `已结束`，返回 `count=2`。
- 所有数据库验证均在事务中回滚，测试数据无残留。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-10 DesignReportTask 新建设计任务取消物料编码必填

### 用户提问
- 用户要求修改 `ProductionManagement/DesignReportTask/Task/index`，新建设计任务时去掉“物料编码”必填规则。

### 执行过程
1. 检查当前 Git 工作区，确认已有上一轮未提交的 `DesignReportTask` 校验状态回写相关改动和日志改动。
2. 检查 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`。
3. 搜索 `物料编码`、`rules`、`新增`、`保存` 等关键字，定位到表单校验规则：
   - 原规则中 `物料编码` 存在 `{ required: true, message: '请选择物料编码', trigger: 'change' }`。
   - `任务描述` 仍为必填。
4. 检查 `db_backups/create_design_report_task_module_20260630.sql`，确认数据库表字段 `[物料编码]` 允许为空，新增过程 `设计报工_任务_新增` 也使用 `NULLIF(@物料编码, N'')`，后端没有强制物料编码必填。
5. 使用 `apply_patch` 修改 `Task/index.vue`：
   - 删除 `rules` 中的 `物料编码` 必填校验。
   - 保留 `任务描述` 必填校验。
6. 复核 `Task/index.vue` 中 `rules` 片段，确认当前只剩：
   - `任务描述: [{ required: true, message: '请输入任务描述', trigger: 'blur' }]`
7. 注意到 `Task/index.vue` 中还有本轮之前已经存在的未提交差异，例如“研发目的”布局和人员显示格式调整；本次未回退这些既有改动。
8. 执行 `npm run build` 验证前端构建。
9. 构建通过，仅有项目既有的大资源体积 warning，以及 Browserslist / baseline-browser-mapping 数据过期提示。
10. 检查 Git 状态，确认构建未额外修改 `dist` 输出文件。
11. 追加本条中文执行日志。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
- `gptlog-process/gpdlog.md`

### 结论
- 新建设计任务时，“物料编码”不再必填。
- 保存时仍会按原逻辑传递 `物料编码`，为空时后端按空值处理。
- “任务描述”必填规则保持不变。

### 验证结果
- `Task/index.vue` 表单规则已不包含 `物料编码` 必填校验。
- `npm run build` 构建通过，仅有项目既有 warning。

## 2026-07-10 DesignReportTask 移到研发管理主菜单

### 用户提问
- 用户要求增加主菜单“研发管理”，并将 `DesignReportTask` 下四个页面都放到“研发管理”下面。
- 用户说明：“研发管理”和“生产管理”平级，属于主菜单。

### 执行过程
1. 检查当前 Git 工作区，确认已有前几轮未提交改动：
   - `db_backups/create_design_report_task_module_20260630.sql`
   - `gptlog-process/gpdlog.md`
   - `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
   - `db_backups/fix_design_report_check_status_20260710.sql`
2. 查询目标库 `192.168.2.92 / YL_MESDB` 的 `[dbo].[登录基础数据_二级菜单]`，日志中不记录数据库明文密码。
3. 查询 `DesignReportTask` 当前菜单分布：
   - 账号代码 `1` 下存在四个页面，均挂在 `pid=3` 的“生产管理”下。
   - 账号代码 `2010` 下只存在 `Task` 和 `Report` 两个页面，均挂在 `pid=3`。
4. 查询主菜单，确认当前没有“研发管理”主菜单。
5. 查询账号代码 `1` 的主菜单，确认：
   - `id=3` 为“生产管理”。
   - 当前主菜单最大 id 为 `8`。
   - 账号代码 `1` 下 `id=9` 未被占用。
6. 考虑到用户本轮未指定其他账号，且账号 `2010` 下并不具备四个 `DesignReportTask` 页面，本次按前序操作口径处理账号代码 `1`，避免无意给其他账号新增页面权限。
7. 检查前端动态路由逻辑：
   - `src/router/getTreeData.js` 按 `pid` 构造菜单树。
   - 主菜单使用 `path` 和 `/layout/Layout` 作为布局路由。
   - 子菜单使用原有 `componet=/ProductionManagement/DesignReportTask/...` 加载真实页面组件。
8. 新增数据库增量脚本 `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql`：
   - 若账号 `1` 下不存在“研发管理”，则插入主菜单：
     - `id=9`
     - `pid=0`
     - `path=/ResearchManagement`
     - `componet=/layout/Layout`
     - `name=ResearchManagement`
     - `title=研发管理`
     - `icon=CreateProject`
     - `账号代码=1`
     - `模块代码=9`
     - `是否启用=1`
   - 若“研发管理”已存在，则更新为上述主菜单配置并启用。
   - 定义 `DesignReportTask` 四个子菜单：
     - `DesignReportTask/Task/index`：设计任务
     - `DesignReportTask/Report/index`：设计报工
     - `DesignReportTask/Check/index`：设计工时校验
     - `DesignReportTask/HoursReport/index`：设计工时报表
   - 如果四个子菜单缺失则补录；如果已存在则移动到“研发管理”下并启用。
   - 子菜单 `componet` 保持 `/ProductionManagement/DesignReportTask/...` 不变，避免影响页面组件加载路径。
9. 执行 `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql` 发布到目标库。
10. 发布结果返回：
    - `id=9`，`pid=0`，`title=研发管理`。
    - `id=248`，`pid=9`，`title=设计任务`。
    - `id=249`，`pid=9`，`title=设计报工`。
    - `id=250`，`pid=9`，`title=设计工时校验`。
    - `id=251`，`pid=9`，`title=设计工时报表`。
11. 再次查询账号代码 `1` 的主菜单，确认“研发管理”已与“生产管理”同级，均为 `pid=0`。
12. 再次查询账号代码 `1` 的 `DesignReportTask` 四个页面，确认四条均为 `pid=9`。
13. 查询账号代码 `1` 下 `pid=3` 的 `DesignReportTask` 数量，结果为 `0`，确认生产管理下已无设计报工页面残留。
14. 本次不修改前端页面代码；动态菜单通过数据库菜单表生效。

### 修改文件
- `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 账号代码 `1` 已新增“研发管理”主菜单。
- “研发管理”与“生产管理”平级，均为主菜单，`研发管理.id=9`，`pid=0`。
- 账号代码 `1` 的 `DesignReportTask` 四个页面已全部移动到“研发管理”下。
- 生产管理下不再包含账号代码 `1` 的 `DesignReportTask` 页面。

### 验证结果
- `研发管理`：`id=9`，`pid=0`，`path=/ResearchManagement`，`componet=/layout/Layout`，`是否启用=1`。
- `设计任务`：`id=248`，`pid=9`，`是否启用=1`。
- `设计报工`：`id=249`，`pid=9`，`是否启用=1`。
- `设计工时校验`：`id=250`，`pid=9`，`是否启用=1`。
- `设计工时报表`：`id=251`，`pid=9`，`是否启用=1`。
- 账号代码 `1` 下生产管理 `pid=3` 的 `DesignReportTask` 页面数量为 `0`。

## 2026-07-10 设计报工结束弹框增加进度说明

### 用户提问
- 用户要求修改 `ResearchManagement/DesignReportTask/Report/index`。
- 点击“结束”时先弹框，弹框显示：
  - id 号
  - 物料名称
  - 物料编码
  - 任务描述
  - 新增字段“进度说明”
- 点击弹框里的“确认”后，才执行结束报工。

### 执行过程
1. 根据当前菜单配置确认：虽然菜单已经挂到“研发管理”，真实前端组件仍使用原路径 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`，因此本次修改该组件。
2. 检查 `Report/index.vue` 现有逻辑：
   - “结束”按钮原来直接调用 `endTask(row)`。
   - `endTask(row)` 会先查询最新任务状态和当前操作人未结束报工记录。
   - 校验通过后直接调用存储过程 `设计报工_任务_结束`。
3. 查询目标库 `192.168.2.92 / YL_MESDB` 的表结构和存储过程定义，日志中不记录数据库明文密码。
4. 确认 `[dbo].[MES_设计报工_记录]` 原来没有 `[进度说明]` 字段，存储过程 `[dbo].[设计报工_任务_结束]` 原来没有 `@进度说明` 参数。
5. 采用持久化方案：结束报工弹框录入的“进度说明”写入报工记录表，并在查询和工时报表中返回该字段。
6. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`：
   - 新增“结束报工”弹框。
   - 弹框内展示 `DID`、`物料编码`、`物料名称`、`任务描述`。
   - 新增可编辑字段 `进度说明`，最大长度 500。
   - 点击列表“结束”时只打开弹框，不立即结束。
   - 点击弹框“确认”后才调用 `设计报工_任务_结束`。
   - 调用结束存储过程时传入 `进度说明`。
   - 调整 `runAction()`，使其成功返回 `true`、失败返回 `false`，便于确认后关闭弹框。
7. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`：
   - 在报工记录列表增加 `进度说明` 列，便于校验页面查看结束说明。
8. 修改 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`：
   - 在工时报表中增加 `进度说明` 列。
9. 修改初始化脚本 `db_backups/create_design_report_task_module_20260630.sql`：
   - `MES_设计报工_记录` 增加 `[进度说明] nvarchar(500) NULL`。
   - 增加字段补齐脚本，字段不存在时自动添加。
   - 重建 `设计报工_任务_结束`，增加 `@进度说明` 参数并写入记录表。
   - 重建 `设计报工_记录_查询`，返回 `进度说明`。
   - 重建 `设计报工_工时报表_作业者工时_查询`，返回 `进度说明`。
10. 新增数据库增量脚本 `db_backups/add_design_report_progress_note_20260710.sql`：
    - 补齐 `[进度说明]` 字段。
    - 重建 `设计报工_任务_结束`。
    - 重建 `设计报工_记录_查询`。
    - 重建 `设计报工_工时报表_作业者工时_查询`。
11. 执行增量脚本发布到目标库 `192.168.2.92 / YL_MESDB`，执行成功。
12. 使用数据库事务做验证，验证后回滚测试数据：
    - 临时插入一条设计任务。
    - 临时插入一条当前用户未结束报工记录。
    - 执行 `设计报工_任务_结束` 并传入 `进度说明`。
    - 返回 `1, 结束成功`。
    - 查询确认任务状态变为 `已结束`。
    - 查询确认报工记录状态变为 `已结束`，结束时间已写入，`进度说明` 已保存。
    - 查询确认 `设计报工_记录_查询` 可以返回 `进度说明`。
    - 查询确认 `设计报工_工时报表_作业者工时_查询` 可以返回 `进度说明`。
    - 回滚事务后确认测试任务无残留。
13. 执行 `npm run build`，构建通过。

### 修改文件
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
- `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
- `db_backups/create_design_report_task_module_20260630.sql`
- `db_backups/add_design_report_progress_note_20260710.sql`
- `gptlog-process/gpdlog.md`

### 结论
- 设计报工点击“结束”后会先弹出确认窗口。
- 弹框显示 id 号、物料编码、物料名称、任务描述，并支持填写“进度说明”。
- 只有点击弹框“确认”后才会真正执行结束报工。
- “进度说明”已落库到报工记录，并在校验页面和工时报表中展示。

### 验证结果
- 数据库增量脚本已发布到 `192.168.2.92 / YL_MESDB`。
- 数据库事务验证通过，测试数据已回滚。
- `npm run build` 构建通过，仅有项目既有体积和 Browserslist 数据过期 warning。

## 2026-07-10 上传设计报工相关修改到远程

### 用户提问
- 用户要求“上传所有修改到远程”。

### 执行过程
1. 在完成设计报工相关前端修改、数据库脚本发布、数据库事务验证和前端构建验证后，检查 Git 工作区。
2. 确认本地分支为 `snapshot/local-save-20260625-154806`，跟踪远端分支 `origin/snapshot/local-save-20260625-154806`。
3. 执行 `git fetch origin` 刷新远端状态。
4. 检查本地与远端提交数量差异，结果为 `0 0`，确认推送前本地和远端没有分叉。
5. 使用内容搜索检查待提交文件中未包含数据库明文密码。
6. 暂存本批设计报工相关改动文件：
   - `db_backups/add_design_report_progress_note_20260710.sql`
   - `db_backups/create_design_report_task_module_20260630.sql`
   - `db_backups/fix_design_report_check_status_20260710.sql`
   - `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql`
   - `gptlog-process/gpdlog.md`
   - `src/views/ProductionManagement/DesignReportTask/Check/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
   - `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
7. 执行 `git diff --cached --check`，未发现空白错误。
8. 创建提交：
   - 提交号：`e89cef4`
   - 提交信息：`feat: 完善设计报工研发管理流程`
9. 执行 `git push`，将提交推送到远端 `origin/snapshot/local-save-20260625-154806`。
10. 为满足项目日志要求，追加本条中文执行记录，并继续将该日志补充同步到远端。

### 结论
- 设计报工相关功能和数据库脚本改动已提交并推送到远端。
- 功能提交号为 `e89cef4`。
- 本条日志补充将继续提交并推送到同一远端分支。
