- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块 - 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面 - 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代 - 调整路由、仪表盘、Lsjl 流丝记录实体与服务 - 更新业务种子数据与 DbSeeder - 补充工作进度文档 14-27
14 KiB
工作进度-16:薪资-挡车车头产量计算(CALCLDCCT)及其全部依赖
时间:2026-10-24(承接工作进度-15) 需求:把
D:\AntaiProject - 副本\trunk\WinClient\F9.Business.PayRoll\PAYROLL\CALCLDCCT模块移植进本系统, 并补齐它依赖的全部功能(配置 + 数据源)。 参考实现:WinClient\F9.Business.PayRoll\PAYROLL\CALCLDCCT\Page_CalcLdcct.cs(3067 行)、Page_CalcLdcct_Edit.cs、Application\CQRS\Business\PayRoll\CALCLDCCT\(CalcLdcct_SaveCommand / CalcLdcct_DeleteByDateRangeDepCommand …)、Domain\Entities\Business\PayRoll\(CalcLdcct / CONFGYZK / CONFGZ / CONFDCG / DCXDJK / XinZiJiaGePeiZhi)。 落库表:F9biz_payroll_calcldcct→ 本系统CalcLdccts。
一、功能设计
薪资
├── 挡车车头产量计算 /payroll/calcldcct 本次新增(核心)
├── 工艺庄口薪资配置 /payroll/confgyzk 本次新增(依赖配置)
├── 工种薪资配置 /payroll/confgz 本次新增(依赖配置)
├── 挡车岗位薪资配置 /payroll/confdcg 本次新增(依赖配置)
├── 挡车纤度奖扣 /payroll/dcxdjk 本次新增(依赖配置)
└── 薪资价格配置 /payroll/xzjg 本次新增(依赖配置)
| F9 行为 | 本系统实现 |
|---|---|
| 查询:年月(→账期)+ 部门 + 工种 + 姓名/庄口 Like | GET /api/payroll/calcldcct/list |
| 一键计算(挡车工):部门穿梭框多选 → 逐部门计算 → 对账报告 | POST /api/payroll/calcldcct/calc-dcg(单部门;返回条数/丝量/金额/告警) |
| 一键计算(车头工):强依赖已存的挡车工产量 | POST /api/payroll/calcldcct/calc-ctg |
| 录入:单部门计算后弹窗人工微调(可改产量初始值 / 系数 / 金额-产量) | 表格内 3 列直接编辑 + 「保存微调」整账期覆盖(POST /save) |
| 删除:按 账期 × 部门 × 工种 整批删除 | DELETE /api/payroll/calcldcct?start=&end=&depId=&worktypeId= |
| 5 套薪资配置各自的增删改查 | 5 个 api/payroll/conf* /dcxdjk /xzjg 控制器 |
计算口径(全部对齐 F9,服务端兜底重算)
【丝量】
每桶丝量 = 每车丝量(kg) × 1000 / 标准落丝桶数
甲乙合计丝量 = Round(Σ今缫桶数 × 每桶丝量, 0) (煮茧日报不分班)
班次丝量 = 甲乙合计 × Σ(挡车数×工时)_班 / Σ(挡车数×工时)_机组日 (挡车)
= 甲乙合计 × Σ(20×工时)_班 / Σ(20×工时)_机组日 (车头,固定 20 台/组)
个人丝量 = 班次丝量 × 挡车数×工时 / Σ(挡车数×工时)_同机组同班 (挡车)
= 班次丝量 × 工时 / (最长工时 × 2) (车头,2 人分摊)
看台时长 = Round(个人工时 × 庄口今缫桶数占比, 1),单庄口时等于个人工时
【等级】
挡车工:木桶短板法 —— 均方差/总差/清洁分/洁净分/二度/三度各自在「生丝定级指标(标准=个人)」里定级,取最低分
车头工:按挡车工丝量加权平均等级分后回落取整档;无挡车工产量时取庄口配置的 QsDengji/QsDengjifen
未下丝时:等级/等级分/缫折全部回落到庄口配置
【单价】
挡车:绪数 = 挡车数 × 20;<60→50档基数,<70→60档,<100→70档,否则 100 档
基础单价 = 岗位基数金额 / 标准出勤天数 / 挡车数 / 标准上班时长 / 庄口工艺台产
车头:基础单价 = 车头岗位金额 / 标准出勤天数 / 9 / 20 / 庄口工艺台产 × 2
等级单价增减 = (等级分 − 工艺等级分) / 0.1 × 等级奖扣单价 / 10 / 1000
实际单价 = 基础单价 + 等级单价增减
【质量】
缫折 = Σ(车台茧量×看台比例) × 100 / Σ(车台丝量×看台比例)
车台茧量 = 落丝茧量 × 该车台丝量占落丝丝量的比例(茧量只记在落丝层,需按丝量摊到车台)
中心纤度数 = 纤度值 == 生丝规格.中心纤度 的计数 × 看台比例
野纤数 = 纤度 ≤ 野纤下限 或 ≥ 野纤上限 的计数 × 看台比例
清洁扣款片数 = (特大糙 + 大糙 + 长结) × 看台比例
洁净扣款片数 = (85 + 80 + 75 + 70 分档) × 看台比例
二度/三度 = 黑板检验匀二度/匀三度 × 看台比例
两班(甲乙)时:中心纤度/野纤/清洁/洁净/二度/三度及其扣款全部 × 0.5
【金额】
产量金额初始值 = 实际单价 × 丝量; 产量金额 = 实际单价 × 丝量 × 计件系数
缫折考核 = ±2kg 死区不奖不扣,超出扣掉死区后 clamp(挡车 ±10 / 车头 ±3),每 1kg 每 100kg 丝 5元(挡车)/1元(车头)
中心纤度奖 = 中心纤度数 × 1 元
野纤扣 = −挡车纤度奖扣表扣款(≥2 条取扣款最大的 2 条求和)
清洁扣 = −(特大糙×2 + 大糙×0.5 + 长结×2)
洁净扣 = −(85×0.2 + 80×1 + 75×2 + 70×5)
二度扣/三度扣 = −二度×2 / −三度×20
关键常量:
20(每台绪数、车头 20 台/组)、9/2(车头)、0.1(等级分步长)、0.5(两班折半)、1.0/0.4/0.1(清洁扣分基数)、2(缫折死区)、5/1(缫折单价)、225(F9 弹窗均值折算,本版未移植)。 全程MidpointRounding.AwayFromZero。
二、后端
2.1 实体(Domain/Entities/PayRoll/)
| 类 | 文件 | 表 | 说明 |
|---|---|---|---|
CalcLdcct |
CalcLdcct.cs |
CalcLdccts |
产量计算明细,唯一键 Date+DepId+Banci+Jizu+EmployeeId+WorktypeId+GyzkId+Guige+Chetai |
ConfGyzk |
Conf.cs |
ConfGyzks |
工艺庄口薪资配置,唯一键 Year+Month+GyzkId |
ConfGz |
Conf.cs |
ConfGzs |
工种薪资配置(40 项),唯一键 WorkTypeId |
ConfDcg |
Conf.cs |
ConfDcgs |
挡车/车头岗位薪资配置,唯一键 DepId |
DangCheXianDuJiangKou |
Conf.cs |
DangCheXianDuJiangKous |
挡车纤度奖扣,唯一键 GuiGe+XianDu |
XinZiJiaGePeiZhi |
Conf.cs |
XinZiJiaGePeiZhis |
薪资价格配置,唯一键 Group+Key |
均继承 BaseEntity,建表沿用 DbSeeder.SyncStructure。
2.2 服务
| 服务 | 文件 | 说明 |
|---|---|---|
ICalcLdcctService / CalcLdcctService |
Services/PayRoll/CalcLdcctService.cs |
列表 + 挡车/车头一键计算 + 保存 + 删除,内含全部计算口径 |
IConfGyzkService / ConfGyzkService |
Services/PayRoll/PayRollConfService.cs |
工艺庄口配置 CRUD |
IConfGzService / ConfGzService |
同上 | 工种配置 CRUD(含 40 项金额) |
IConfDcgService / ConfDcgService |
同上 | 挡车岗位配置 CRUD |
IDcxdjkService / DcxdjkService |
同上 | 挡车纤度奖扣 CRUD |
IXzjgService / XzjgService |
同上 | 薪资价格 CRUD + GetPriceAsync(group,key) |
数据源(全部为系统已有模块,本次只做读取):看台记录 KtjlDcg/KtjlCtg、煮茧日报 ZjrbRecord/ZjrbJizu、
落丝记录 LsjlRecord、秤大丝 CdsLsjl/CdsChetai、纤度检验 XdjyLsjl/XdjyRecord、黑板检验 HbjyRecord、
生丝规格 ShengsiGuige、生丝定级指标 ShengsiDingjizhibiao、工艺庄口 CraftZhuangKou。
2.3 接口
GET /api/payroll/calcldcct/list?start=&end=&depId=&worktypeId=&like=&pageIndex=&pageSize=
POST /api/payroll/calcldcct/calc-dcg 一键计算(挡车工)
POST /api/payroll/calcldcct/calc-ctg 一键计算(车头工)
POST /api/payroll/calcldcct/save 整账期×部门×工种全量覆盖(人工微调)
DELETE /api/payroll/calcldcct?start=&end=&depId=&worktypeId=
GET /api/payroll/confgyzk/list?year=&month= POST /save GET /{id} DELETE /{id}
GET /api/payroll/confgz/list POST /save GET /{id} DELETE /{id}
GET /api/payroll/confdcg/list POST /save GET /{id} DELETE /{id}
GET /api/payroll/dcxdjk/list?guige= POST /save GET /{id} DELETE /{id}
GET /api/payroll/xzjg/list?group= POST /save GET /{id} DELETE /{id}
要点:
- 计算与保存都是「整账期 + 部门 + 工种全量覆盖」:先物理删除旧数据再重建,避免唯一索引冲突(与煮茧日报同一策略);
- 车头工计算必须已有挡车工产量,否则等级回落到庄口配置并给出告警;
- 所有告警通过
CalcLdcctResultDto.Warnings返回,前端ElMessageBox.alert展示。
2.4 菜单
新增一级菜单「薪资」/payroll(排序 8,质量 7 与通知 9 之间),6 个子菜单:
| 顺序 | 菜单 | 路径 | 组件 | 权限标识 |
|---|---|---|---|---|
| 1 | 挡车车头产量计算 | /payroll/calcldcct | payroll/calcldcct/index | payroll:calcldcct:list |
| 2 | 工艺庄口薪资配置 | /payroll/confgyzk | payroll/confgyzk/index | payroll:confgyzk:list |
| 3 | 工种薪资配置 | /payroll/confgz | payroll/confgz/index | payroll:confgz:list |
| 4 | 挡车岗位薪资配置 | /payroll/confdcg | payroll/confdcg/index | payroll:confdcg:list |
| 5 | 挡车纤度奖扣 | /payroll/dcxdjk | payroll/dcxdjk/index | payroll:dcxdjk:list |
| 6 | 薪资价格配置 | /payroll/xzjg | payroll/xzjg/index | payroll:xzjg:list |
同时把一级菜单顺序归一为:/qc 7、/payroll 8、/notification 9、/sys 10、/report 11。
三、前端
| 文件 | 说明 |
|---|---|
views/payroll/calcldcct/index.vue |
年月(→账期) + 部门 + 工种查询;多级表头(产量 / 质量 / 金额 / 金额-质量);一键计算(挡车/车头)、保存微调(产量初始值/系数/金额-产量三列直接编辑)、删除;底部显示当前页产量金额合计 |
views/payroll/confgyzk/index.vue |
工艺庄口薪资配置 CRUD,庄口用 CraftZhuangKouSelect 选择 |
views/payroll/confgz/index.vue |
工种薪资配置 CRUD,40 项按「出勤与工时/岗位与奖金/假期与加班/学工/岗位胜任考核/加班工资」分组 |
views/payroll/confdcg/index.vue |
挡车岗位薪资配置 CRUD(50/60/70/100 绪基数金额 + 车头工金额) |
views/payroll/dcxdjk/index.vue |
挡车纤度奖扣 CRUD |
views/payroll/xzjg/index.vue |
薪资价格配置 CRUD,薪资.前缫 分组下预置「挡车工/车头工计件等级奖扣单价」 |
router/index.js |
componentMap 注册上述 6 个页面 |
四、验证记录(全部由助手自行执行,无需人工点击)
| 项 | 结果 |
|---|---|
dotnet build(Domain / Application / Infrastructure / Api) |
✅ 0 错误 |
npm run build(Node 在 C:\Users\32453\.workbuddy\binaries\node\versions\22.22.2-6) |
✅ ✓ built in 14.88s(仅既有 chunk 体积警告) |
| IDE 诊断(6 个 vue + router) | ✅ 0 |
| 菜单与权限 | ✅ /auth/menus 返回「薪资」+ 6 个子菜单 |
| 6 个接口连通性 | ✅ 全部 200(空表) |
| 挡车工一键计算 | ✅ 生成 1 条/庄口;丝量 = 桶数100 × (10kg×1000/4) = 250000 g |
| 挡车工单价 | ✅ 挡车数 20 → 绪数 400 → 100 档;基础单价 = 4000/28/20/9/100 = 0.0079365 |
| 挡车工等级 | ✅ 生丝定级指标 192 条参与木桶短板,定出 6A00 / 12;等级增减 = (12−5)/0.1×0.3/10/1000 = 0.0021 |
| 挡车工实际单价 / 产量金额 | ✅ 0.0100365;0.0100365 × 250000 × 1 = 2509.13 |
| 挡车工缫折 | ✅ 落丝茧量 60000 g、秤大丝丝量 25000 g → 缫折 240(修复前为 4800,见下方问题) |
| 挡车工缫折考核 | ✅ (300−240)−2 = 58 → 封顶 10 → 10 × (250000/1000/100) × 5 = +125 |
| 车头工一键计算 | ✅ 丝量 = 250000 × 9/(9×2) = 125000;基础单价 = 2000/28/9/20/100×2 = 0.0079365;缫折考核 = 3 × 1.25 × 1 = 3.75 |
| 车头工依赖挡车工 | ✅ 无挡车工产量时给出「工种薪资配置缺失」类告警并按配置回落 |
| 人工微调保存 | ✅ 产量初始值改 999.99 后保存,回读 999.99 / 系数1 / 金额999.99 |
| 整账期删除 | ✅ 删除后 total=0,且「删除后重建」不再撞唯一索引 |
| 班次显示 | ✅ 修正为 甲=1 / 乙=2(初版误按 0/1 映射,已修) |
| 测试数据清理 | ✅ 播种的煮茧日报、看台记录、落丝记录、秤大丝、5 套配置、计算结果全部删除;验证脚本 verify-payroll.ps1 已删除 |
过程中发现并修复的真实 bug
- 缫折被放大 20 倍:初版按「车台数 × 落丝茧量」累加分子,导致 20 台时缫折 = 4800(正确 240)。 修正为:茧量只记在落丝层,按「车台丝量 / 落丝丝量」摊到车台后再按看台比例摊到人。
- 班次名称错位:
Prod_Banci_Enum是甲=1 / 乙=2,初版按0/1映射,甲班被显示成乙班。
五、移植取舍与后续
- 未移植 F9 弹窗顶部的 4 个均值标签(挡60/挡70/挡100/车头平均,
Σ金额 / Σ看台时长 × 225):这是展示用的派生统计, 本版在列表底部给出「当前页产量金额合计」;如需可按同样公式补在弹窗/工具栏。 - 未移植 F9 的「部门穿梭框多选」一键计算:Web 端改为先选部门再点按钮,单部门计算(语义等价,逐个部门重复操作即可)。
- 野纤「奖励」分支未使用:与 F9 一致——挡车工路径下
JineZlYexian只取-扣款,奖励分支被丢弃。 - 未移植的 F9 薪资子模块(本次范围外,可按需继续):
CalXz(薪资核算主表)、Cmcl(产量)、QSXSCL、QTKH、SBRYKH等。 - 待接入:① Grid++ 打印(报表中心目前只有
lsjl.grf);② 历史biz_payroll_calcldcct数据可按工作进度-13 的 CSV 内嵌 + 幂等策略导入; ③ 本模块产出的「金额-产量 + 金额-质量」可直接作为计件工资与成本核算的数据源。
环境备注
- 本机
node/npm不在默认 PATH,需先set PATH=C:\Users\32453\.workbuddy\binaries\node\versions\22.22.2-6;%PATH%。 - Windows PowerShell 5.1 的
Invoke-RestMethod默认按 ASCII 提交请求体,写中文会变成?; 验证脚本改为[System.Text.Encoding]::UTF8.GetBytes()+application/json; charset=utf-8,并用 UTF-8 BOM 保存脚本。 - 煮茧日报的「已存在相同的煮茧日报」校验会命中已软删记录,删除后无法在同一「日期+车间+庄口+规格」重建(既有模块行为,本次未改动)。