Files
yanpeng200212 1f1b184411 新增工资/仓储/生产日报等模块,移除旧考勤模块
- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块
- 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面
- 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代
- 调整路由、仪表盘、Lsjl 流丝记录实体与服务
- 更新业务种子数据与 DbSeeder
- 补充工作进度文档 14-27
2026-10-27 09:09:57 +08:00

128 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工作进度-25:修复「报表设计打不开」+ 补上「生产-考勤 · 考勤登记」
> **协作规则(长期生效)**:**每次对话结尾都要生成工作进度**。
> 即在每轮对话结束前,把本轮完成的内容追加为 `工作进度/工作进度-N.md`,并在文档中保留本条规则,方便下一轮接续。
## 一、用户反馈
1. 报表设计页面打不开(之前可以用,今天突然不行)
2. 生产-考勤也没有
## 二、报表问题:两个根因,都已修复 ✅
### 根因 A:vite 开发服务器挂死(最直接的"打不开")
| 检查 | 结果 |
| --- | --- |
| 后端 3000 | ✅ 正常(`/sys/report` 列表、模板下载、预览全部 200) |
| 前端 5173 早期请求 | ✅ 200(`report/manage`、`ReportEditor`、`ReportDesign`、`grlib/grhtml5-7-min.js`) |
| 稍后 `/`、`/src/views/prod/lsjl/index.vue` | ❌ **全部超时**(进程 25640 仍在 LISTENING,CPU 近乎 0 → 卡死不服务) |
→ 页面请求全部挂住,表现为"点了没反应 / 打不开"。
**修复**:按端口定位 PID → `Stop-Process -Id 25640 -Force` → 用完整路径 node 重启 vite(npm 不在 PATH):
```powershell
Start-Process -FilePath 'C:\Users\32453\.workbuddy\binaries\node\versions\22.22.2-6\node.exe' `
-ArgumentList 'node_modules/vite/bin/vite.js' -WorkingDirectory 'd:/f9webaitest/f9-web-ai-test/web' -WindowStyle Minimized
```
重启后 PID **26328**:`/` 200、`prod/kaoqin/index.vue` 200、`report/manage/index.vue` 200。
### 根因 B:f9designer:// 宿主脚本解析 URL 失败(点「设计器编辑」无反应)
日志 `tools/report-designer/logs/designer_20261026.log` 里今天 6 次唤起全部报错:
```
错误: 缺少 base / rid 参数(Url=f9designer://open/?base=...)
```
原因:**Windows Shell 会在协议主机后补一个 `/`**,实际收到的是 `f9designer://open/?base=...`,
而脚本按固定前缀 `^f9designer://open\?` 剥离失败 → `base` 解析为空 → 直接 throw。
注册表里是 `-WindowStyle Hidden`,失败无提示 → 用户看到"点了没反应"。
**修复** `tools/report-designer/F9ReportDesignerHandler.ps1`:
1. 解析改为「取第一个 `?` 之后的全部内容」,兼容 `open?` 与 `open/?`
2. `base` 缺失时回退 `http://localhost:5173`(并记日志)
3. 新增 `Show-Error`:失败时弹 Windows MessageBox(含日志路径),不再静默
4. ⚠️ **踩坑**:编辑工具把文件存成了 **UTF-8 无 BOM**,Windows PowerShell 5.1 按 ANSI 读取导致中文注释/字符串乱码、脚本解析失败。
已用 `UTF8Encoding($true)` 重写为 **UTF-8 with BOM**,`ParseFile` 复检通过。
**下次改这个脚本后务必确认 BOM 仍在**(`[System.IO.File]::ReadAllBytes($p)[0..2]` 应为 239,187,191)。
**端到端实测**(用 `F9_GR7_DESIGNER` 指向一个立刻退出的程序代替设计器):
```
base=http://localhost:5173 rid=141374578868883456 code=PROD_QS_1
已下载 8300 字节 → 启动设计器(等待关闭)→ 设计器已关闭 → 上传结果: OK → 完成
```
模板回传后长度仍为 7639 字节、报表 `hasTemplate=True`,未损坏。
## 三、生产-考勤:本轮补上「考勤登记(CQDJ)」✅
> 「没有」的原因:23 轮按计划**删除了旧考勤**(`/attendance`),而「生产-职工考勤」移植尚未开始。
### 后端(新增)
| 文件 | 说明 |
| --- | --- |
| `Domain/Entities/Prod/Cqdj.cs` | `Cqdj`(表 `biz_prod_kq_cqdj`)+ `CqdjItem`(表 `biz_prod_kq_cqdj_item`),继承 `BaseEntity`,**自动建表**(`DbSeeder.SyncStructure` 反射扫描) |
| `Application/Dtos/Prod/KaoqinDtos.cs` | `CqdjItemDto / CqdjRowDto / CqdjViewDto / CqdjSaveDto / CqdjEmpOptionDto` |
| `Application/Services/Prod/KaoqinService.cs` | 接口+实现同文件:整组查询 / 整组覆盖保存 / 整组删除 / 可选职工 |
| `Api/Controllers/Prod/KaoqinController.cs` | `[Route("api/prod/kaoqin")]` `[Authorize]`:`GET|POST|DELETE /cqdj`、`GET /cqdj/employees` |
| `Application/DependencyInjection.cs` | `services.AddScoped<IKaoqinService, KaoqinService>();` |
规则按 23 轮调研落地:
- 查询口径:日期 + 部门(必选)+ 工种(0=全部)+ 班次(甲1/乙2)+ 关键字
- 职工来源:本部门、工种≠0、非离职;未登记者生成默认值 9 小时 + 一条「正常」明细
- **正常明细倒挤**:`正常 = 标准 - 请假 - 旷工 - 流动 - 外派 - 代班 - 工伤`;`出勤 = 正常+流动+代班+外派+工伤`
- 保存 = **先软删该(日期+部门+工种+班次)旧登记与明细,再整批新增**(非增量 diff)
- 校验:每人必须有且仅有一条「正常」;请假必须选请假类型、非请假必须为「无」;出勤不能为负
### 前端(新增)
- `web/src/views/prod/kaoqin/index.vue`:上表(职工行 + 标准时长/夜班/备注 + 各时长实时汇总)下表(选中职工的明细:出勤类型/请假类型/时长/机组/车台/挡车数/备注),
工具栏含 查询 / 设标准时长 / 添加职工 / 删除整组 / 保存
- `web/src/router/index.js`:`'prod/kaoqin/index': () => import('../views/prod/kaoqin/index.vue')`
### 菜单(`DbSeeder.SeedProdMenus`)
```csharp
EnsureTopMenuWithChildren(fsql, snowflake, "/prod/kaoqin", "生产-考勤", "Clock", 8,
new[] { ("考勤登记", "/prod/kaoqin/cqdj", "prod/kaoqin/index", "prod:kaoqin:cqdj:list", "EditPen", 1) });
```
同时**清理了遗留旧考勤菜单**(页面组件已删,留着会点开空白页):
删除 `sys_rbac_menus` 中 `path LIKE '/attendance%'` 的记录及其 `role_permissions`,
并删除 `code LIKE 'attendance:%'` 的权限单元。
### 验证
| 项 | 结果 |
| --- | --- |
| 解决方案编译 | **0 个错误** |
| `GET /auth/menus` | ✅ 出现 `生产-考勤 → 考勤登记`,旧「考勤管理」已消失 |
| `GET /prod/kaoqin/cqdj?date=2026-10-26&depId=34&banci=1` | ✅ 46 人,每人默认 9 小时 + 1 条正常明细 |
| `POST /prod/kaoqin/cqdj` | ✅ `count=46`;复查 `saved=46` |
| `DELETE /prod/kaoqin/cqdj` | ✅ `count=46`;复查 `saved=0`(测试数据已清理) |
| 前端模块编译 | ✅ vite 200 |
## 四、待办
1. **考勤统计(CQTJ)**:月快照,强依赖工种薪资配置 `ConfGz`(已有)+ 职工薪资配置 CONFEMPLOYEE / 账期薪资配置 CONFZQ(**后端还没有,需先建**)
2. 老系统「添加其他车间」功能无页面引用,不移植
3. 报表设计:可视化画布与锐浪设计器二选一(用设计器保存后产物为 `_WR7_`,画布将不可解析)
4. `views/notification/type/index.vue` 里的 `/attendance/approve?leaveId=` 仍是示例文本,建议改成中性示例
## 五、下次接续提示
- 改后端代码后**必须重启后端**(先按端口 Stop-Process,否则 DLL/obj 锁定导致编译失败);改前端 vite 热更新,但 **vite 卡死时要按端口杀掉重启**
- 登录 admin / 123456;后端 3000(PID 23968),前端 5173(PID 26328)
- 考勤相关文件:`Domain/Entities/Prod/Cqdj.cs`、`Dtos/Prod/KaoqinDtos.cs`、
`Services/Prod/KaoqinService.cs`、`Controllers/Prod/KaoqinController.cs`、`views/prod/kaoqin/index.vue`
- 报表相关:`views/report/manage/index.vue`、`components/report/ReportEditor.vue`、`ReportDesign.vue`、
`tools/report-designer/F9ReportDesignerHandler.ps1`(**务必保持 UTF-8 BOM**)
- **每轮对话结尾记得生成本工作进度文档**