# 工作进度-26:参考老系统完成整个考勤模块(CQDJ 补齐 + CQTJ 新建 + 依赖配置) > **协作规则(长期生效)**:**每次对话结尾都要生成工作进度**。 > 即在每轮对话结束前,把本轮完成的内容追加为 `工作进度/工作进度-N.md`,并在文档中保留本条规则,方便下一轮接续。 ## 一、需求 用户要求:**完善整个考勤模块,不要删减**,并给出老系统参考目录 `D:\AntaiProject - 副本\trunk\WinClient\F9.Business.Prod\KQ`(CQDJ 考勤登记 + CQTJ 考勤统计)。 ## 二、老系统源码研读结论(KQ 目录) | 文件 | 大小 | 结论 | | --- | --- | --- | | `CQDJ\Page_Cqdj.cs` | 19KB | 查询口径:日期 + 部门 + 工种 + 班次;录入/删除整组、初始化为正常出勤;「从指定日期复制」 | | `CQDJ\Page_Cqdj_Edit.cs` | 77KB | 工具栏 8 个按钮(标准/出勤/加班/流动/事假/公假/代班/夜班)+ 添加/删除职工 + 刷新;保存整组覆盖、倒挤「正常」 | | `CQDJ\Page_Cqdj_addOtherChejian_select.cs` | — | 确认**无引用**,遗留功能,不移植 | | `CQTJ\Page_Cqtj.cs` | 84KB | 统计是**月快照**;录入时库中有快照取库,否则 `CqtjViews` 实时汇总;含 `quanqin` 全勤奖、`jiaqiBuzhuJisuan` 假期补助、`jisuanJiabanMkHours` 加班免扣、`jisuanJianbanJine` 加班费、`liudongJineJisuan` 流动、`daibanJineJisuan` 代班、`jisuanCqTianci` 出勤天次、`Yijianshengcheng` 一键生成 | | `CQTJ\Page_Cqtj_Edit.cs` | 7.5KB | 可编辑列:年假/公假/调休/法定假/全勤免扣/全勤计算/全勤奖/加班费/流动工资/代班工资/假期补助分项与合计/夜班补助/旷工考核 | CQTJ 强依赖(老系统在 PayRoll 侧): - **CONFZQ 薪资配置-账期**:`QsQuanqinDays` 前缫出勤天数(为 0 时直接抛错不让录入) - **CONFEMPLOYEE 薪资配置-职工**:`Hours_FadingBz` / `Hours_FadingGz` / `IsXuegong` - **岗位胜任考核**:考核结果决定加班费单价档位(无记录时回落 `JiabanJineBz`) ## 三、本轮新增 / 修改 ### 后端(新增) | 文件 | 说明 | | --- | --- | | `Domain/Entities/Prod/Cqtj.cs` | **考勤统计实体**(`biz_prod_kq_cqtj`),含天数/时长/请假分项/学工/法定假/全勤相关时长/全部金额字段 | | `Domain/Entities/PayRoll/ConfEmployee.cs` | `ConfZq`(`ConfZqs`)、`ConfEmployee`(`ConfEmployees`)、`Gwsrkh`(`Gwsrkhs`) | | `Dtos/Prod/KaoqinDtos.cs` | 追加 `CqtjRowDto / CqtjSaveDto / CqtjGenerateDto / CqtjViewDto` | | `Dtos/PayRoll/ConfEmployeeDtos.cs` | `ConfZqDto / ConfEmployeeDto / GwsrkhDto` | | `Services/Prod/KaoqinService.cs` | 追加 CQTJ:分页、录入(取库 or 实时汇总)、保存(整组覆盖)、删除、一键生成、全部删除;并新增 8 个口径函数 | | `Services/PayRoll/ConfEmployeeService.cs` | `IConfZqService / IConfEmployeeService / IGwsrkhService` 接口 + 实现 | | `Api/Controllers/Prod/KaoqinController.cs` | 追加 `GET/POST/DELETE /cqtj`、`GET /cqtj/edit`、`POST /cqtj/generate` | | `Api/Controllers/PayRoll/ConfEmployeeController.cs` | `api/payroll/confzq`、`api/payroll/confemployee`、`api/payroll/gwsrkh` | | `Application/DependencyInjection.cs` | 注册 `IConfZqService / IConfEmployeeService / IGwsrkhService` | | `Infrastructure/Data/DbSeeder.cs` | 菜单:生产-考勤 增「考勤统计」;薪资 增「账期薪资配置 / 职工薪资配置 / 岗位胜任考核」 | ### 后端口径(严格对齐老系统) - **正常倒挤**:`正常 = 标准 - 请假 - 旷工 - 流动 - 外派 - 代班 - 工伤`;`出勤 = 正常 + 流动 + 代班 + 外派 + 工伤`(不含加班) - **出勤天数**:`标准 = 工种配置 QqDaysStandard`;`实际 = 本部门出勤时长 / HoursPerday`;`天次 = (出勤+加班)>0 的天数` - **全勤奖** `quanqin()`(完整移植,含多部门 / 多工种分支): 1. 总旷工 ≥ 半天 → 0;2. 总出勤 ≤ 3 天 → 0; 3. 多部门:`∑出勤+带薪 ≥ 15 天` 按实际出勤折算,否则按标准出勤折算;离职 / 新入职分别处理; 4. 单部门:`∑出勤+带薪请假 ≥ 15 天` 取全额,否则 `全勤奖/标准出勤时长×总出勤`; 5. 设备办全职:出勤含加班达前缫天数且不低于标准 → 请假不扣; 6. 其余:`全勤奖 - (全勤奖 / QqHoursMaxQj) × 请假时长` - **假期补助**:按明细「请假类型 × 出勤工种」分组,病假/轮休/婚假/丧假/法定假/年假/调休分别乘工种单价;`法定假 = 补助小时×JiaqiJineFadingBz + 工资小时×JiaqiJineFadingGz` - **加班免扣请假**:`出勤+加班 ≥ 前缫出勤天数×HoursPerday 且 加班 ≥ QqHoursDkMinjiaban` → 免扣 `QqHoursDkQingjia` - **加班费**:按加班明细工种取单价;有岗位胜任考核时按 欠合格/期望/合格/胜任/超胜任 取 `Jiaban_GwsrkhJine*`,无记录取 `JiabanJineBz`;学工加班 = `XgJineGangwei /(QqDaysStandard×HoursPerday) × 时长` - **流动** = `LiudongJineGuding × 时长`;**代班** = `JineGangwei /(QqDaysStandard×HoursPerday) × 时长`;**夜班** = `JineYeban × 夜班次数`;**旷工考核** = `JiaqiJineKuangongKk × 旷工时长` - **扎帐校验**:账期 `IsZhaZhang` 时禁止保存 / 删除 / 生成 ### 前端 | 文件 | 说明 | | --- | --- | | `views/prod/kaoqin/index.vue`(改) | 补齐工具栏:刷新 / 复制指定日期 / 设标准时长 / 设出勤时长 / **加班 / 流动 / 事假 / 公假 / 代班 / 夜班** / 添加职工 / 删除职工 / 删除整组 / 保存;职工表加多选列;明细表加「出勤部门 / 出勤工种」(代班、流动跨车间);保存前「出勤超标准」二次确认;新增复制日期弹窗(可勾选初始化为正常出勤) | | `views/prod/kaoqin/cqtj/index.vue`(新) | 考勤统计:年月 + 部门 + 工种 + 关键字;分组表头(出勤天数 / 时长 / 学工 / 请假分项 / 全勤与金额);录入(弹窗内可编辑带「*」字段)、删除、**一键生成**、全部删除;分页 | | `views/payroll/confzq/index.vue`(新) | 账期薪资配置:年度/月份/前缫出勤天数 | | `views/payroll/confemployee/index.vue`(新) | 职工薪资配置:职工/工种/法定补助h/法定工资h/学工 | | `views/payroll/gwsrkh/index.vue`(新) | 岗位胜任考核:年度/月份/部门/职工/考核结果 | | `router/index.js`(改) | 新增 5 条 componentMap | ## 四、验证 | 项 | 结果 | | --- | --- | | 解决方案编译 | **0 个错误** | | `GET /auth/menus` | ✅ 生产-考勤 → 考勤登记 / 考勤统计;薪资 → …/账期薪资配置 / 职工薪资配置 / 岗位胜任考核 | | 账期薪资配置 | ✅ POST 2026/10 QsQuanqinDays=26 成功 | | 考勤登记 | ✅ 46 人保存成功(含 1 人加班 2h + 病假 1h + 夜班 1) | | 实时汇总 | ✅ `曾红君 出勤=8 加班=2 请假=1 实际天=0.89 天次=1 加班费=30 病假补助=5 补助合计=5 夜班补助=20`(与手算一致:正常 9-1=8,加班费 2×15,病假 1×5,夜班 1×20) | | 统计保存 / 列表 / 取库 | ✅ 保存 46 → 列表 total=46 → 再录入 `exists=True` | | 删除 / 一键生成 | ✅ 删除 46;一键生成 1 个车间 | | 前端 5 个页面 | ✅ vite 全部 200,无 lint | 测试数据(2026-10-26 的 46 条登记、统计快照、测试用工种薪资配置 3 条、账期配置 1 条)**已全部清理**。 ## 五、待办 / 已知差异 1. **跨部门重复考勤提示**:老系统在加载时提示「X 职工已在 Y 部门录入」,本轮未移植(需额外接口),后续补 2. **岗位胜任考核**放在【薪资】下(老系统属 `CalXzMain` 薪资模块),仅按年月维护考核结果,未做考核流程 3. 统计页的**列宽 / 分组表头**在窄屏下需横向滚动,后续可加列配置 4. 报表设计器脚本 `F9ReportDesignerHandler.ps1` **改完必须确认 UTF-8 BOM 仍在** 5. `views/notification/type/index.vue` 里仍有 `/attendance/approve?leaveId=` 示例文本 ## 六、下次接续提示 - 改后端先按端口 `Stop-Process` 再编译,否则 DLL 锁定;vite 卡死时同样按端口杀掉重启 (当前:后端 3000 PID 17000,前端 5173 PID 26328) - 登录 admin / 123456 - 考勤相关文件: - 后端 `Domain/Entities/Prod/Cqdj.cs`、`Cqtj.cs`、`Domain/Entities/PayRoll/ConfEmployee.cs` - `Dtos/Prod/KaoqinDtos.cs`、`Dtos/PayRoll/ConfEmployeeDtos.cs` - `Services/Prod/KaoqinService.cs`(CQDJ + CQTJ 全部口径)、`Services/PayRoll/ConfEmployeeService.cs` - `Controllers/Prod/KaoqinController.cs`、`Controllers/PayRoll/ConfEmployeeController.cs` - 前端 `views/prod/kaoqin/index.vue`、`views/prod/kaoqin/cqtj/index.vue`、 `views/payroll/confzq|confemployee|gwsrkh/index.vue` - 老系统参考:`D:\AntaiProject - 副本\trunk\WinClient\F9.Business.Prod\KQ\` - **每轮对话结尾记得生成本工作进度文档**