新增生产-前缫看台记录,并导入车头工/挡车工看台记录历史数据

功能:
- 后端新增 KtjlCtgs / KtjlDcgs 两张表、KtjlService 与 api/prod/ktjl 接口
  (按日期+车间+班次查询、整组先删后建保存、整组删除、按看台排班带出默认记录、工种下拉)
- 挡车数按 F9 口径自动重算(与他人接壤的边界车位各扣 0.5),机组由车位反查机组车台
- 前端新增 /prod/qianxian/ktjl 看台记录页:挡车工/车头工双页签、删除、录入(新增)、录入(指定日期)
- 录入弹窗校验对齐 F9:个人时长不超标准、挡车数/看台时长匹配、车头工每机组≥2 人且时长为标准时长整数倍
- 生产-前缫菜单新增「看台记录」,权限 prod:ktjl:list

数据导入:
- 新增内嵌资源 biz_prod_qs_ktjl_ctg.csv / biz_prod_qs_ktjl_dcg.csv(约 5 万行,采用紧凑 CSV)
- 剔除软删除行、日期异常行、部门无法映射与职工不存在的行;日期由 Excel 序列号转换
- 车头工 12693 行、挡车工 38048 行入库,日期范围 2025-12-16 ~ 2026-09-11
- 表内已有数据则整体跳过,分批 1000 行插入

其他:同步工作进度-13 文档与开发数据库快照
This commit is contained in:
yanpeng200212
2026-10-22 11:16:29 +08:00
parent 2e4c045818
commit 69c4052a64
15 changed files with 52228 additions and 2 deletions
@@ -0,0 +1,43 @@
using FreeSql.DataAnnotations;
using F9WebAiTest.Domain.Common;
using F9WebAiTest.Domain.Enums.SYS.Employees;
namespace F9WebAiTest.Domain.Entities.Prod;
// 看台记录(对应 F9 生产-前缫 的 KTJL 两张表:车头工 / 挡车工)
// 记录 = 某日某车间某班次的实际看台情况(由看台排班带出后再调整:车位、时长、代班、不计产量)。
/// <summary>车头工看台记录(biz_prod_qs_ktjl_ctg)</summary>
[Table(Name = "KtjlCtgs")]
public class KtjlCtg : BaseEntity
{
public DateTime Date { get; set; } // 日期
public long DeptId { get; set; } // 车间
public Prod_Banci_Enum Banci { get; set; } // 班次(甲/乙)
public int Jizu { get; set; } // 机组
public decimal Hours { get; set; } // 时长(小时)
public long EmployeeId { get; set; } // 车头工
public long EmployeeDepId { get; set; } // 职工所属部门
public long WorktypeId { get; set; } // 工种
public string WorktypeName { get; set; } = ""; // 工种名称(历史快照)
public bool NoChanliang { get; set; } // 不计产量
}
/// <summary>挡车工看台记录(biz_prod_qs_ktjl_dcg)</summary>
[Table(Name = "KtjlDcgs")]
public class KtjlDcg : BaseEntity
{
public DateTime Date { get; set; } // 日期
public long DeptId { get; set; } // 车间
public Prod_Banci_Enum Banci { get; set; } // 班次
public int Jizu { get; set; } // 机组
public int ChetaiStart { get; set; } // 开始车位
public int ChetaiEnd { get; set; } // 结束车位
public decimal DangcheNum { get; set; } // 挡车数(边界车位与他人共用时各计 0.5)
public decimal Hours { get; set; } // 时长(小时)
public long EmployeeId { get; set; } // 挡车工
public long EmployeeDepId { get; set; } // 职工所属部门
public long WorktypeId { get; set; } // 工种
public string WorktypeName { get; set; } = ""; // 工种名称(历史快照)
public bool NoChanliang { get; set; } // 不计产量
}